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), }, }) ``` diff --git a/src/glossary.ts b/src/glossary.ts index 63326ab..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[] +export type ModelValueType = + | PrimitiveValueType + | PrimitiveValueType[] + | AnyObject export type ModelValueTypeGetter = () => ModelValueType export type ModelDefinition = Record 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' + ) } diff --git a/test/model/create.test.ts b/test/model/create.test.ts index 3e16527..b49331f 100644 --- a/test/model/create.test.ts +++ b/test/model/create.test.ts @@ -97,6 +97,70 @@ 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 + } + type Bike = Car + + const db = factory({ + user: { + id: primaryKey(datatype.uuid), + name: name.findName, + vehicule: { + car: nullable(() => null), + bike: nullable(() => null), + }, + }, + }) + + const DIDDY = { + id: '🐵', + name: 'Diddy', + vehicule: { + car: { + brand: 'Diddy Kong', + model: 'Super Racing Model with extra 🍌 carriage', + }, + }, + } + + const diddyUser = db.user.create({ + id: DIDDY.id, + name: DIDDY.name, + vehicule: { car: DIDDY.vehicule.car }, + }) + + expect(diddyUser.id).toEqual(DIDDY.id) + expect(diddyUser.name).toEqual(DIDDY.name) + expect(diddyUser.vehicule.car).toEqual(DIDDY.vehicule.car) + expect(diddyUser.vehicule.bike).toEqual(null) + + const DONKEY = { + id: '🦍', + name: 'Donkey', + vehicule: { + car: null, + bike: { + brand: 'Donkey Kong Choppers', + model: 'Chuck Norris, the fastest', + }, + }, + } + + const donkeyUser = db.user.create({ + id: DONKEY.id, + name: DONKEY.name, + vehicule: DONKEY.vehicule, + }) + + expect(donkeyUser.id).toEqual(DONKEY.id) + expect(donkeyUser.name).toEqual(DONKEY.name) + expect(donkeyUser.vehicule.bike).toEqual(DONKEY.vehicule.bike) + expect(donkeyUser.vehicule.car).toEqual(null) +}) + test('supports nested objects in the model definition', () => { const db = factory({ user: {