From a4fbd264fc39d2415f852aa7dd6fb3c26deb02de Mon Sep 17 00:00:00 2001 From: JG Date: Tue, 13 Jun 2023 21:58:56 +0100 Subject: [PATCH 1/2] fix:Inherited fields from abstract model should be on the top --- packages/schema/src/utils/ast-utils.ts | 37 +++++++++---------- .../tests/generator/prisma-generator.test.ts | 8 +++- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/packages/schema/src/utils/ast-utils.ts b/packages/schema/src/utils/ast-utils.ts index ab26509eb..6be749eb6 100644 --- a/packages/schema/src/utils/ast-utils.ts +++ b/packages/schema/src/utils/ast-utils.ts @@ -58,32 +58,29 @@ export function mergeBaseModel(model: Model) { .forEach((decl) => { const dataModel = decl as DataModel; - dataModel.superTypes.forEach((superType) => { - const superTypeDecl = superType.ref; - if (superTypeDecl) { - superTypeDecl.fields.forEach((field) => { - const cloneField = Object.assign({}, field); - const mutable = cloneField as Mutable; - // update container - mutable.$container = dataModel; - dataModel.fields.push(mutable as DataModelField); - }); - - superTypeDecl.attributes.forEach((attr) => { - const cloneAttr = Object.assign({}, attr); - const mutable = cloneAttr as Mutable; - // update container - mutable.$container = dataModel; - dataModel.attributes.push(mutable as DataModelAttribute); - }); - } - }); + dataModel.fields = dataModel.superTypes + .flatMap((superType) => updateContainer(superType.ref!.fields, dataModel)) + .concat(dataModel.fields); + + dataModel.attributes = dataModel.superTypes + .flatMap((superType) => updateContainer(superType.ref!.attributes, dataModel)) + .concat(dataModel.attributes); }); // remove abstract models model.declarations = model.declarations.filter((x) => !(x.$type == 'DataModel' && x.isAbstract)); } +function updateContainer(nodes: T[], container: AstNode): Mutable[] { + return nodes.map((node) => { + const cloneField = Object.assign({}, node); + const mutable = cloneField as Mutable; + // update container + mutable.$container = container; + return mutable; + }); +} + function toStaticPolicy( operation: PolicyOperationKind, allows: DataModelAttribute[], diff --git a/packages/schema/tests/generator/prisma-generator.test.ts b/packages/schema/tests/generator/prisma-generator.test.ts index 72b9df35c..455228296 100644 --- a/packages/schema/tests/generator/prisma-generator.test.ts +++ b/packages/schema/tests/generator/prisma-generator.test.ts @@ -280,8 +280,11 @@ describe('Prisma generator test', () => { updatedAt DateTime @updatedAt } - model Post extends Base { + abstract model Content { title String + } + + model Post extends Base, Content { published Boolean @default(false) } `); @@ -301,6 +304,9 @@ describe('Prisma generator test', () => { const post = dmmf.datamodel.models[0]; expect(post.name).toBe('Post'); expect(post.fields.length).toBe(5); + expect(post.fields[0].name).toBe('id'); + expect(post.fields[3].name).toBe('title'); + expect(post.fields[4].name).toBe('published'); }); it('custom aux field names', async () => { From 5808a0d1c5caf3789ea45db23c0f9a879db0a570 Mon Sep 17 00:00:00 2001 From: JG Date: Tue, 13 Jun 2023 22:53:24 +0100 Subject: [PATCH 2/2] fix: fix UT --- packages/schema/tests/generator/prisma-generator.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/schema/tests/generator/prisma-generator.test.ts b/packages/schema/tests/generator/prisma-generator.test.ts index 455228296..9ed524fa7 100644 --- a/packages/schema/tests/generator/prisma-generator.test.ts +++ b/packages/schema/tests/generator/prisma-generator.test.ts @@ -366,7 +366,7 @@ describe('Prisma generator test', () => { const post = dmmf.datamodel.models.find((m) => m.name === 'Post'); expect(post?.documentation?.replace(/\s/g, '')).toBe( - `@@allow('delete', ownerId == auth()) @@allow('read', owner == auth())`.replace(/\s/g, '') + `@@allow('read', owner == auth()) @@allow('delete', ownerId == auth())`.replace(/\s/g, '') ); const todo = dmmf.datamodel.models.find((m) => m.name === 'Todo');