diff --git a/packages/mongoose/src/generateModel.ts b/packages/mongoose/src/generateModel.ts index c0034451..876bc023 100644 --- a/packages/mongoose/src/generateModel.ts +++ b/packages/mongoose/src/generateModel.ts @@ -114,12 +114,12 @@ export const generateSchema = ( const prop = { ...omit(options ?? {}, ['type']), - type + $type: type }; return { ...acc, - [reflection.name]: isArray ? [prop.type] : prop + [reflection.name]: isArray ? { ...prop, $type: [prop.$type] } : prop }; }, {}); @@ -128,7 +128,7 @@ export const generateSchema = ( const schemaOptions = schemaDecoration?.options; const schema: Schema = (forceCreateSchema || schemaDecoration) && - new Schema(definition, { ...(mergedOptions ?? schemaOptions) }); + new Schema(definition, { ...(mergedOptions ?? schemaOptions), typeKey: '$type' }); // register methods const methods = classReflection.methods.reduce((acc, methodReflection) => { diff --git a/packages/mongoose/test/unit/generateModel.test.ts b/packages/mongoose/test/unit/generateModel.test.ts index 79fad92b..41c3a56c 100644 --- a/packages/mongoose/test/unit/generateModel.test.ts +++ b/packages/mongoose/test/unit/generateModel.test.ts @@ -33,13 +33,13 @@ describe('generateModel', () => { expect(schema.obj).to.be.deep.equal({ firstname: { - type: String + $type: String }, age: { - type: Number + $type: Number }, isActive: { - type: Boolean + $type: Boolean } }); }); @@ -59,9 +59,9 @@ describe('generateModel', () => { expect(schema.obj).to.be.deep.equal({ birth: { - type: { + $type: { place: { - type: String + $type: String } } } @@ -84,14 +84,12 @@ describe('generateModel', () => { const schema = mgoose.generateSchema(Customer, {}); expect(schema.obj).to.be.deep.equal({ - birth: [ - { - place: { - type: String - } - } - ], - tags: [String] + birth: { + $type: [{ place: { $type: String } }] + }, + tags: { + $type: [String] + } }); const CustomerModel = model('Customer', schema); @@ -126,44 +124,49 @@ describe('generateModel', () => { expect(Object.keys(baseSchema.obj)).be.deep.equal(['createdAt', 'updatedAt']); }); - /* it('supports nested properties, with name "type"', () => { - class Phone { + class Phones { @mgoose.prop() type: string; @mgoose.prop() number: string; } + class Profile { + @mgoose.prop() + name: string; + + @mgoose.prop({ type: [Phones], required: true }) + phones: Phones[]; + } class Customer { - @mgoose.prop({ type: [Phone], required: true }) - phones: Phone[]; + @mgoose.prop({ type: [Profile], required: true }) + profiles: Profile[]; } const schema = mgoose.generateSchema(Customer, {}); expect(schema.obj).to.be.deep.equal({ - profiles: [ - { - required: true, - type: { - name: { type: String }, - phones: [ - { - required: true, - type: { - type: { type: String }, - number: { type: String } + profiles: { + required: true, + $type: [ + { + name: { $type: String }, + phones: { + required: true, + $type: [ + { + type: { $type: String }, + number: { $type: String } } - } - ] + ] + } } - } - ] + ] + } }); }); -*/ }); describe('#mgoose.generateSchema', () => {