From 72a0443eb28145c9033cf9949acc39880e6b1ab5 Mon Sep 17 00:00:00 2001 From: Aloys Berger Date: Sun, 22 May 2022 12:56:49 +1000 Subject: [PATCH 1/6] feat(modelvaluetype definition): extends ModelValueType definition to accept 'Object' type re #203 --- src/glossary.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/glossary.ts b/src/glossary.ts index 63326ab..58baa9d 100644 --- a/src/glossary.ts +++ b/src/glossary.ts @@ -19,7 +19,7 @@ export type KeyType = string | number | symbol export type AnyObject = Record export type PrimaryKeyType = string | number export type PrimitiveValueType = string | number | boolean | Date -export type ModelValueType = PrimitiveValueType | PrimitiveValueType[] +export type ModelValueType = PrimitiveValueType | PrimitiveValueType[] | Object export type ModelValueTypeGetter = () => ModelValueType export type ModelDefinition = Record From 2c9d39cb903606bdd328bc3a5dfd5cb2687263ff Mon Sep 17 00:00:00 2001 From: Aloys Berger Date: Sun, 22 May 2022 13:25:49 +1000 Subject: [PATCH 2/6] fix(modelvaluetype definition): review the ModelValueType definition using exisiting type AnyObject Change the definition of ModelValueType from 'Object' to 'AnyObject' (an existing type of the library) re 203 --- src/glossary.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/glossary.ts b/src/glossary.ts index 58baa9d..105992b 100644 --- a/src/glossary.ts +++ b/src/glossary.ts @@ -19,7 +19,10 @@ export type KeyType = string | number | symbol export type AnyObject = Record export type PrimaryKeyType = string | number export type PrimitiveValueType = string | number | boolean | Date -export type ModelValueType = PrimitiveValueType | PrimitiveValueType[] | Object +export type ModelValueType = + | PrimitiveValueType + | PrimitiveValueType[] + | AnyObject export type ModelValueTypeGetter = () => ModelValueType export type ModelDefinition = Record From 9f9c1a641d524dc4a5c7143e9e12818dc63bfc45 Mon Sep 17 00:00:00 2001 From: Aloys Berger Date: Sun, 22 May 2022 13:27:40 +1000 Subject: [PATCH 3/6] test(nullable object): recreate issue scenario in the test when using nullable( ... ), it is impossible to provide an object. It returns 'null' no matter whether an object has been provided or not. re 203 --- test/model/create.test.ts | 50 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/test/model/create.test.ts b/test/model/create.test.ts index 3e16527..ff2e4f0 100644 --- a/test/model/create.test.ts +++ b/test/model/create.test.ts @@ -97,6 +97,56 @@ test('creates a new entity with nullable properties', () => { expect(user.address.number).toEqual(null) }) +test('supports nested nullable object', () => { + type Car = { + brand: string + model: string + } + + const db = factory({ + user: { + id: primaryKey(datatype.uuid), + name: name.findName, + car: nullable(() => null), + }, + }) + + const DIDDY = { + id: '🐵', + name: 'Diddy', + car: { + brand: 'Diddy Kong', + model: 'Super Racing Model with extra 🍌 carriage', + }, + } + + const diddyUser = db.user.create({ + id: DIDDY.id, + name: DIDDY.name, + car: DIDDY.car, + }) + + expect(diddyUser.id).toEqual(DIDDY.id) + expect(diddyUser.name).toEqual(DIDDY.name) + expect(diddyUser.car).toEqual(DIDDY.car) + + const DONKEY = { + id: '🦍', + name: 'Donkey', + car: null, + } + + const donkeyUser = db.user.create({ + id: DONKEY.id, + name: DONKEY.name, + car: DONKEY.car, + }) + + expect(donkeyUser.id).toEqual(DONKEY.id) + expect(donkeyUser.name).toEqual(DONKEY.name) + expect(donkeyUser.car).toEqual(DONKEY.car) +}) + test('supports nested objects in the model definition', () => { const db = factory({ user: { From 6d19c2c43868ae5ab9b5a40ae3a94723b292e002 Mon Sep 17 00:00:00 2001 From: Aloys Berger Date: Sun, 22 May 2022 13:29:10 +1000 Subject: [PATCH 4/6] fix(isprimitivevaluetype): cd '/Users/aloysberger/FOSS/data' node 'node_modules/.bin/jest' '/Users/aloysberger/FOSS/data/test/model/create.test.ts' -c '/Users/aloysberger/FOSS/data/test/jest.config.ts' -t 'supports nested nullable object' --runInBand re #203 --- src/utils/isModelValueType.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/utils/isModelValueType.ts b/src/utils/isModelValueType.ts index 705ff03..1cb34f0 100644 --- a/src/utils/isModelValueType.ts +++ b/src/utils/isModelValueType.ts @@ -10,5 +10,9 @@ function isPrimitiveValueType(value: any): value is PrimitiveValueType { } export function isModelValueType(value: any): value is ModelValueType { - return isPrimitiveValueType(value) || Array.isArray(value) + return ( + isPrimitiveValueType(value) || + Array.isArray(value) || + typeof value === 'object' + ) } From d53d31ca3fbbe8030e204a25a040b4a22f5d4a62 Mon Sep 17 00:00:00 2001 From: Aloys Berger Date: Sun, 22 May 2022 13:36:54 +1000 Subject: [PATCH 5/6] test(update test nullable object): update tests for nested nullable objects Update tests to cover nested nullable objects re #203 --- test/model/create.test.ts | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/test/model/create.test.ts b/test/model/create.test.ts index ff2e4f0..b49331f 100644 --- a/test/model/create.test.ts +++ b/test/model/create.test.ts @@ -102,49 +102,63 @@ test('supports nested nullable object', () => { brand: string model: string } + type Bike = Car const db = factory({ user: { id: primaryKey(datatype.uuid), name: name.findName, - car: nullable(() => null), + vehicule: { + car: nullable(() => null), + bike: nullable(() => null), + }, }, }) const DIDDY = { id: '🐵', name: 'Diddy', - car: { - brand: 'Diddy Kong', - model: 'Super Racing Model with extra 🍌 carriage', + vehicule: { + car: { + brand: 'Diddy Kong', + model: 'Super Racing Model with extra 🍌 carriage', + }, }, } const diddyUser = db.user.create({ id: DIDDY.id, name: DIDDY.name, - car: DIDDY.car, + vehicule: { car: DIDDY.vehicule.car }, }) expect(diddyUser.id).toEqual(DIDDY.id) expect(diddyUser.name).toEqual(DIDDY.name) - expect(diddyUser.car).toEqual(DIDDY.car) + expect(diddyUser.vehicule.car).toEqual(DIDDY.vehicule.car) + expect(diddyUser.vehicule.bike).toEqual(null) const DONKEY = { id: '🦍', name: 'Donkey', - car: null, + vehicule: { + car: null, + bike: { + brand: 'Donkey Kong Choppers', + model: 'Chuck Norris, the fastest', + }, + }, } const donkeyUser = db.user.create({ id: DONKEY.id, name: DONKEY.name, - car: DONKEY.car, + vehicule: DONKEY.vehicule, }) expect(donkeyUser.id).toEqual(DONKEY.id) expect(donkeyUser.name).toEqual(DONKEY.name) - expect(donkeyUser.car).toEqual(DONKEY.car) + expect(donkeyUser.vehicule.bike).toEqual(DONKEY.vehicule.bike) + expect(donkeyUser.vehicule.car).toEqual(null) }) test('supports nested objects in the model definition', () => { From b72dace1ca070527155ac452133b3e3787c9ed08 Mon Sep 17 00:00:00 2001 From: Aloys Berger Date: Sun, 22 May 2022 13:36:54 +1000 Subject: [PATCH 6/6] docs: update doc. to show an example of nullable nested objects in TS re #203 --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index cd5e5f2..8879074 100644 --- a/README.md +++ b/README.md @@ -472,10 +472,16 @@ When using Typescript, you can manually set the type of the property when it can ```typescript import { factory, primaryKey, nullable } from '@mswjs/data' +type Car = { + brand: string + model: string +} + const db = factory({ user: { id: primaryKey(String), age: nullable(() => null), + car: nullable(() => null), }, }) ```