Skip to content

Commit

Permalink
Add date support
Browse files Browse the repository at this point in the history
  • Loading branch information
tgandrews committed Mar 2, 2023
1 parent 5e8709c commit 9317607
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 2 deletions.
3 changes: 1 addition & 2 deletions README.md
Expand Up @@ -6,7 +6,7 @@ A simple and experimental dynamodb data mapper.

## Features

- Simplified data modeling and mapping to DynamoDB types
- Data modeling and mapping to DynamoDB types
- Data validation using [Joi](https://joi.dev/)
- [Autogenerating IDs](#Creating)
- Complete typescript typings
Expand All @@ -21,7 +21,6 @@ A simple and experimental dynamodb data mapper.
- Paging
- Complex querying
- Number and binary sets
- Date types
- Local indexes

## Installation
Expand Down
64 changes: 64 additions & 0 deletions src/index.test.ts
Expand Up @@ -261,6 +261,70 @@ describe("omanyd", () => {
const savedThing = await ThingStore.create({ list: [] });
expect(savedThing.list).toEqual([]);
});

it("should save and return date objects", async () => {
interface Thing {
id: string;
date: Date;
}
const ThingStore = Omanyd.define<Thing>({
name: "basicDate",
hashKey: "id",
schema: Joi.object({
id: Omanyd.types.id(),
date: Joi.date(),
}),
});

await Omanyd.createTables();

const savedThing = await ThingStore.create({
date: new Date("2023-03-02T11:49:00.000Z"),
});
const readThing = await ThingStore.getByHashKey(savedThing.id);
expect(savedThing.date).toBeInstanceOf(Date);
expect(savedThing.date).toEqual(new Date("2023-03-02T11:49:00.000Z"));
expect(readThing?.date).toBeInstanceOf(Date);
expect(readThing?.date).toEqual(new Date("2023-03-02T11:49:00.000Z"));
});

it("should save and return dates nested within objects", async () => {
interface Thing {
id: string;
a: {
b: {
date: Date;
};
};
}
const ThingStore = Omanyd.define<Thing>({
name: "nestedDate",
hashKey: "id",
schema: Joi.object({
id: Omanyd.types.id(),
a: Joi.object({
b: Joi.object({
date: Joi.date().required(),
}).required(),
}).required(),
}),
});

await Omanyd.createTables();

const savedThing = await ThingStore.create({
a: {
b: {
date: new Date("2023-03-02T11:49:00.000Z"),
},
},
});
const readThing = await ThingStore.getByHashKey(savedThing.id);
expect(savedThing.a.b.date).toBeInstanceOf(Date);
expect(savedThing.a.b.date).toEqual(new Date("2023-03-02T11:49:00.000Z"));
expect(readThing?.a.b.date).toBeInstanceOf(Date);
expect(readThing?.a.b.date).toEqual(new Date("2023-03-02T11:49:00.000Z"));
});
});

describe("range key", () => {
Expand Down
6 changes: 6 additions & 0 deletions src/serializer.ts
Expand Up @@ -18,6 +18,10 @@ class Serializer {
return { BOOL: value };
}

private date(value: Date): AWSDDB.AttributeValue {
return this.string(value.toISOString());
}

private object(
o: PlainObject,
schema: Joi.ObjectSchema
Expand Down Expand Up @@ -119,6 +123,8 @@ class Serializer {
return this.boolean(userValue);
} else if (schema.type === "any") {
return this.any(userValue);
} else if (schema.type === "date") {
return this.date(userValue);
} else {
throw new Error(`Unable to handle Joi schema type: "${schema.type}"`);
}
Expand Down

0 comments on commit 9317607

Please sign in to comment.