From 7971a1da772d967564540b2e06b875304c21cb6a Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Wed, 13 Nov 2024 19:07:03 -0800 Subject: [PATCH 1/2] fix: avoid reference unused enums in generated policy code --- tests/regression/tests/issue-1835.test.ts | 28 +++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 tests/regression/tests/issue-1835.test.ts diff --git a/tests/regression/tests/issue-1835.test.ts b/tests/regression/tests/issue-1835.test.ts new file mode 100644 index 000000000..f29efcbbb --- /dev/null +++ b/tests/regression/tests/issue-1835.test.ts @@ -0,0 +1,28 @@ +import { loadSchema } from '@zenstackhq/testtools'; + +describe('issue 1835', () => { + it('regression', async () => { + await loadSchema( + ` + enum Enum { + SOME_VALUE + ANOTHER_VALUE + } + + model Model { + id String @id @default(cuid()) + value Enum + @@ignore + } + + model AnotherModel { + id String @id @default(cuid()) + } + `, + { + provider: 'postgresql', + pushDb: false, + } + ); + }); +}); From 34af96f64b914f00ac074516b039bb48b0e87ed0 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Wed, 13 Nov 2024 19:07:09 -0800 Subject: [PATCH 2/2] update --- .../src/plugins/enhancer/policy/utils.ts | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/packages/schema/src/plugins/enhancer/policy/utils.ts b/packages/schema/src/plugins/enhancer/policy/utils.ts index 93212e386..fee0cc15a 100644 --- a/packages/schema/src/plugins/enhancer/policy/utils.ts +++ b/packages/schema/src/plugins/enhancer/policy/utils.ts @@ -8,6 +8,7 @@ import { getAttributeArg, getAuthDecl, getDataModelAndTypeDefs, + getDataModels, getEntityCheckerFunctionName, getIdFields, getLiteral, @@ -537,16 +538,19 @@ export function generateNormalizedAuthRef( * Check if the given enum is referenced in the model */ export function isEnumReferenced(model: Model, decl: Enum): unknown { - return streamAllContents(model).some((node) => { - if (isDataModelField(node) && node.type.reference?.ref === decl) { - // referenced as field type - return true; - } - if (isEnumFieldReference(node) && node.target.ref?.$container === decl) { - // enum field is referenced - return true; - } - return false; + const dataModels = getDataModels(model); + return dataModels.some((dm) => { + return streamAllContents(dm).some((node) => { + if (isDataModelField(node) && node.type.reference?.ref === decl) { + // referenced as field type + return true; + } + if (isEnumFieldReference(node) && node.target.ref?.$container === decl) { + // enum field is referenced + return true; + } + return false; + }); }); }