zenstack 1.8.2 → 2.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/bin/post-install.js +1 -1
  2. package/cli/cli-util.d.ts +1 -1
  3. package/cli/cli-util.js +20 -2
  4. package/cli/cli-util.js.map +1 -1
  5. package/cli/index.js +0 -3
  6. package/cli/index.js.map +1 -1
  7. package/cli/plugin-runner.d.ts +4 -2
  8. package/cli/plugin-runner.js +88 -71
  9. package/cli/plugin-runner.js.map +1 -1
  10. package/constants.js +1 -1
  11. package/language-server/validator/datamodel-validator.js +31 -28
  12. package/language-server/validator/datamodel-validator.js.map +1 -1
  13. package/language-server/validator/datasource-validator.js +1 -1
  14. package/language-server/validator/datasource-validator.js.map +1 -1
  15. package/language-server/validator/enum-validator.js +1 -1
  16. package/language-server/validator/enum-validator.js.map +1 -1
  17. package/language-server/validator/expression-validator.js +12 -6
  18. package/language-server/validator/expression-validator.js.map +1 -1
  19. package/language-server/validator/function-invocation-validator.js +2 -2
  20. package/language-server/validator/function-invocation-validator.js.map +1 -1
  21. package/language-server/validator/schema-validator.js +1 -1
  22. package/language-server/validator/schema-validator.js.map +1 -1
  23. package/language-server/validator/utils.d.ts +1 -1
  24. package/language-server/validator/utils.js +3 -3
  25. package/language-server/validator/utils.js.map +1 -1
  26. package/language-server/zmodel-code-action.js +4 -3
  27. package/language-server/zmodel-code-action.js.map +1 -1
  28. package/language-server/zmodel-completion-provider.js +7 -7
  29. package/language-server/zmodel-completion-provider.js.map +1 -1
  30. package/language-server/zmodel-linker.d.ts +0 -1
  31. package/language-server/zmodel-linker.js +9 -59
  32. package/language-server/zmodel-linker.js.map +1 -1
  33. package/language-server/zmodel-module.js +4 -0
  34. package/language-server/zmodel-module.js.map +1 -1
  35. package/language-server/zmodel-scope.d.ts +5 -3
  36. package/language-server/zmodel-scope.js +117 -68
  37. package/language-server/zmodel-scope.js.map +1 -1
  38. package/package.json +7 -7
  39. package/plugins/enhancer/delegate/index.d.ts +4 -0
  40. package/plugins/enhancer/delegate/index.js +31 -0
  41. package/plugins/enhancer/delegate/index.js.map +1 -0
  42. package/plugins/enhancer/enhance/index.d.ts +4 -0
  43. package/plugins/enhancer/enhance/index.js +202 -0
  44. package/plugins/enhancer/enhance/index.js.map +1 -0
  45. package/plugins/enhancer/index.d.ts +5 -0
  46. package/plugins/{model-meta → enhancer}/index.js +19 -18
  47. package/plugins/enhancer/index.js.map +1 -0
  48. package/plugins/enhancer/model-meta/index.d.ts +4 -0
  49. package/plugins/{access-policy → enhancer/model-meta}/index.js +14 -7
  50. package/plugins/enhancer/model-meta/index.js.map +1 -0
  51. package/plugins/{access-policy → enhancer/policy}/expression-writer.d.ts +3 -0
  52. package/plugins/{access-policy → enhancer/policy}/expression-writer.js +97 -47
  53. package/plugins/enhancer/policy/expression-writer.js.map +1 -0
  54. package/plugins/enhancer/policy/index.d.ts +4 -0
  55. package/plugins/enhancer/policy/index.js +20 -0
  56. package/plugins/enhancer/policy/index.js.map +1 -0
  57. package/plugins/{access-policy → enhancer/policy}/policy-guard-generator.d.ts +4 -4
  58. package/plugins/{access-policy → enhancer/policy}/policy-guard-generator.js +21 -66
  59. package/plugins/enhancer/policy/policy-guard-generator.js.map +1 -0
  60. package/plugins/plugin-utils.d.ts +8 -0
  61. package/plugins/plugin-utils.js +14 -9
  62. package/plugins/plugin-utils.js.map +1 -1
  63. package/plugins/prisma/index.d.ts +1 -0
  64. package/plugins/prisma/index.js +4 -6
  65. package/plugins/prisma/index.js.map +1 -1
  66. package/plugins/prisma/prisma-builder.d.ts +5 -6
  67. package/plugins/prisma/prisma-builder.js +9 -5
  68. package/plugins/prisma/prisma-builder.js.map +1 -1
  69. package/plugins/prisma/schema-generator.d.ts +8 -1
  70. package/plugins/prisma/schema-generator.js +155 -11
  71. package/plugins/prisma/schema-generator.js.map +1 -1
  72. package/plugins/zod/generator.js +4 -1
  73. package/plugins/zod/generator.js.map +1 -1
  74. package/plugins/zod/index.d.ts +1 -0
  75. package/plugins/zod/index.js +2 -1
  76. package/plugins/zod/index.js.map +1 -1
  77. package/plugins/zod/utils/schema-gen.js +2 -3
  78. package/plugins/zod/utils/schema-gen.js.map +1 -1
  79. package/res/stdlib.zmodel +99 -7
  80. package/utils/ast-utils.d.ts +5 -2
  81. package/utils/ast-utils.js +63 -24
  82. package/utils/ast-utils.js.map +1 -1
  83. package/utils/exec-utils.d.ts +4 -2
  84. package/utils/exec-utils.js +16 -3
  85. package/utils/exec-utils.js.map +1 -1
  86. package/plugins/access-policy/expression-writer.js.map +0 -1
  87. package/plugins/access-policy/index.d.ts +0 -4
  88. package/plugins/access-policy/index.js.map +0 -1
  89. package/plugins/access-policy/policy-guard-generator.js.map +0 -1
  90. package/plugins/model-meta/index.d.ts +0 -4
  91. package/plugins/model-meta/index.js.map +0 -1
  92. package/utils/typescript-expression-transformer.d.ts +0 -56
  93. package/utils/typescript-expression-transformer.js +0 -338
  94. package/utils/typescript-expression-transformer.js.map +0 -1
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.generate = void 0;
16
+ const runtime_1 = require("@zenstackhq/runtime");
17
+ const sdk_1 = require("@zenstackhq/sdk");
18
+ const ast_1 = require("@zenstackhq/sdk/ast");
19
+ const path_1 = __importDefault(require("path"));
20
+ const ts_morph_1 = require("ts-morph");
21
+ const schema_generator_1 = require("../../prisma/schema-generator");
22
+ function generate(model, options, project, outDir) {
23
+ return __awaiter(this, void 0, void 0, function* () {
24
+ const outFile = path_1.default.join(outDir, 'enhance.ts');
25
+ let logicalPrismaClientDir;
26
+ if (hasDelegateModel(model)) {
27
+ logicalPrismaClientDir = yield generateLogicalPrisma(model, options, outDir);
28
+ }
29
+ project.createSourceFile(outFile, `import { createEnhancement, type EnhancementContext, type EnhancementOptions, type ZodSchemas } from '@zenstackhq/runtime';
30
+ import modelMeta from './model-meta';
31
+ import policy from './policy';
32
+ ${options.withZodSchemas ? "import * as zodSchemas from './zod';" : 'const zodSchemas = undefined;'}
33
+ import { Prisma } from '${(0, sdk_1.getPrismaClientImportSpec)(model, outDir)}';
34
+ ${logicalPrismaClientDir ? `import { PrismaClient as EnhancedPrismaClient } from '${logicalPrismaClientDir}';` : ''}
35
+
36
+ export function enhance<DbClient extends object>(prisma: DbClient, context?: EnhancementContext, options?: EnhancementOptions) {
37
+ return createEnhancement(prisma, {
38
+ modelMeta,
39
+ policy,
40
+ zodSchemas: zodSchemas as unknown as (ZodSchemas | undefined),
41
+ prismaModule: Prisma,
42
+ ...options
43
+ }, context)${logicalPrismaClientDir ? ' as EnhancedPrismaClient' : ''};
44
+ }
45
+ `, { overwrite: true });
46
+ });
47
+ }
48
+ exports.generate = generate;
49
+ function hasDelegateModel(model) {
50
+ const dataModels = (0, sdk_1.getDataModels)(model);
51
+ return dataModels.some((dm) => (0, sdk_1.isDelegateModel)(dm) && dataModels.some((sub) => sub.superTypes.some((base) => base.ref === dm)));
52
+ }
53
+ function generateLogicalPrisma(model, options, outDir) {
54
+ return __awaiter(this, void 0, void 0, function* () {
55
+ const prismaGenerator = new schema_generator_1.PrismaSchemaGenerator();
56
+ const prismaClientOutDir = './.delegate';
57
+ yield prismaGenerator.generate(model, {
58
+ provider: '@internal',
59
+ schemaPath: options.schemaPath,
60
+ output: path_1.default.join(outDir, 'delegate.prisma'),
61
+ overrideClientGenerationPath: prismaClientOutDir,
62
+ mode: 'logical',
63
+ });
64
+ yield processClientTypes(model, path_1.default.join(outDir, prismaClientOutDir));
65
+ return prismaClientOutDir;
66
+ });
67
+ }
68
+ function processClientTypes(model, prismaClientDir) {
69
+ return __awaiter(this, void 0, void 0, function* () {
70
+ const project = new ts_morph_1.Project();
71
+ const sf = project.addSourceFileAtPath(path_1.default.join(prismaClientDir, 'index.d.ts'));
72
+ const delegateModels = [];
73
+ model.declarations
74
+ .filter((d) => (0, sdk_1.isDelegateModel)(d))
75
+ .forEach((dm) => {
76
+ delegateModels.push([
77
+ dm,
78
+ model.declarations.filter((d) => (0, ast_1.isDataModel)(d) && d.superTypes.some((s) => s.ref === dm)),
79
+ ]);
80
+ });
81
+ const toRemove = [];
82
+ const toReplaceText = [];
83
+ sf.forEachDescendant((desc, traversal) => {
84
+ removeAuxRelationFields(desc, toRemove, traversal);
85
+ fixDelegateUnionType(desc, delegateModels, toReplaceText, traversal);
86
+ removeCreateFromDelegateInputTypes(desc, delegateModels, toRemove, traversal);
87
+ removeDelegateToplevelCreates(desc, delegateModels, toRemove, traversal);
88
+ removeDiscriminatorFromConcreteInputTypes(desc, delegateModels, toRemove);
89
+ });
90
+ toRemove.forEach((n) => n.remove());
91
+ toReplaceText.forEach(([node, text]) => node.replaceWithText(text));
92
+ yield project.save();
93
+ });
94
+ }
95
+ function removeAuxRelationFields(desc, toRemove, traversal) {
96
+ if (desc.isKind(ts_morph_1.SyntaxKind.PropertySignature) || desc.isKind(ts_morph_1.SyntaxKind.MethodSignature)) {
97
+ // remove aux fields
98
+ const name = desc.getName();
99
+ if (name.startsWith(runtime_1.DELEGATE_AUX_RELATION_PREFIX)) {
100
+ toRemove.push(desc);
101
+ traversal.skip();
102
+ }
103
+ }
104
+ }
105
+ function fixDelegateUnionType(desc, delegateModels, toReplaceText, traversal) {
106
+ if (!desc.isKind(ts_morph_1.SyntaxKind.TypeAliasDeclaration)) {
107
+ return;
108
+ }
109
+ const name = desc.getName();
110
+ delegateModels.forEach(([delegate, concreteModels]) => {
111
+ if (name === `$${delegate.name}Payload`) {
112
+ const discriminator = getDiscriminatorField(delegate);
113
+ if (discriminator) {
114
+ toReplaceText.push([
115
+ desc,
116
+ `export type ${name}<ExtArgs extends $Extensions.InternalArgs = $Extensions.DefaultArgs> =
117
+ ${concreteModels
118
+ .map((m) => `($${m.name}Payload<ExtArgs> & { scalars: { ${discriminator.name}: '${m.name}' } })`)
119
+ .join(' | ')};`,
120
+ ]);
121
+ traversal.skip();
122
+ }
123
+ }
124
+ });
125
+ }
126
+ function removeCreateFromDelegateInputTypes(desc, delegateModels, toRemove, traversal) {
127
+ if (!desc.isKind(ts_morph_1.SyntaxKind.TypeAliasDeclaration)) {
128
+ return;
129
+ }
130
+ const name = desc.getName();
131
+ delegateModels.forEach(([delegate]) => {
132
+ // remove create related sub-payload from delegate's input types since they cannot be created directly
133
+ const regex = new RegExp(`\\${delegate.name}(Unchecked)?(Create|Update).*Input`);
134
+ if (regex.test(name)) {
135
+ desc.forEachDescendant((d, innerTraversal) => {
136
+ if (d.isKind(ts_morph_1.SyntaxKind.PropertySignature) &&
137
+ ['create', 'upsert', 'connectOrCreate'].includes(d.getName())) {
138
+ toRemove.push(d);
139
+ innerTraversal.skip();
140
+ }
141
+ });
142
+ traversal.skip();
143
+ }
144
+ });
145
+ }
146
+ function removeDiscriminatorFromConcreteInputTypes(desc, delegateModels, toRemove) {
147
+ if (!desc.isKind(ts_morph_1.SyntaxKind.TypeAliasDeclaration)) {
148
+ return;
149
+ }
150
+ const name = desc.getName();
151
+ delegateModels.forEach(([delegate, concretes]) => {
152
+ const discriminator = getDiscriminatorField(delegate);
153
+ if (!discriminator) {
154
+ return;
155
+ }
156
+ concretes.forEach((concrete) => {
157
+ // remove discriminator field from the create/update input of concrete models
158
+ const regex = new RegExp(`\\${concrete.name}(Unchecked)?(Create|Update).*Input`);
159
+ if (regex.test(name)) {
160
+ desc.forEachDescendant((d, innerTraversal) => {
161
+ if (d.isKind(ts_morph_1.SyntaxKind.PropertySignature)) {
162
+ if (d.getName() === discriminator.name) {
163
+ toRemove.push(d);
164
+ }
165
+ innerTraversal.skip();
166
+ }
167
+ });
168
+ }
169
+ });
170
+ });
171
+ }
172
+ function removeDelegateToplevelCreates(desc, delegateModels, toRemove, traversal) {
173
+ if (desc.isKind(ts_morph_1.SyntaxKind.InterfaceDeclaration)) {
174
+ // remove create and upsert methods from delegate interfaces since they cannot be created directly
175
+ const name = desc.getName();
176
+ if (delegateModels.map(([dm]) => `${dm.name}Delegate`).includes(name)) {
177
+ const createMethod = desc.getMethod('create');
178
+ if (createMethod) {
179
+ toRemove.push(createMethod);
180
+ }
181
+ const createManyMethod = desc.getMethod('createMany');
182
+ if (createManyMethod) {
183
+ toRemove.push(createManyMethod);
184
+ }
185
+ const upsertMethod = desc.getMethod('upsert');
186
+ if (upsertMethod) {
187
+ toRemove.push(upsertMethod);
188
+ }
189
+ traversal.skip();
190
+ }
191
+ }
192
+ }
193
+ function getDiscriminatorField(delegate) {
194
+ var _a;
195
+ const delegateAttr = (0, sdk_1.getAttribute)(delegate, '@@delegate');
196
+ if (!delegateAttr) {
197
+ return undefined;
198
+ }
199
+ const arg = (_a = delegateAttr.args[0]) === null || _a === void 0 ? void 0 : _a.value;
200
+ return (0, ast_1.isReferenceExpr)(arg) ? arg.target.ref : undefined;
201
+ }
202
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/enhancer/enhance/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,iDAAmE;AACnE,yCAMyB;AACzB,6CAA+G;AAC/G,gDAAwB;AACxB,uCAQkB;AAClB,oEAAsE;AAEtE,SAAsB,QAAQ,CAAC,KAAY,EAAE,OAAsB,EAAE,OAAgB,EAAE,MAAc;;QACjG,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAChD,IAAI,sBAA0C,CAAC;QAE/C,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,sBAAsB,GAAG,MAAM,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACjF,CAAC;QAED,OAAO,CAAC,gBAAgB,CACpB,OAAO,EACP;;;EAGN,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,+BAA+B;0BACzE,IAAA,+BAAyB,EAAC,KAAK,EAAE,MAAM,CAAC;EAChE,sBAAsB,CAAC,CAAC,CAAC,yDAAyD,sBAAsB,IAAI,CAAC,CAAC,CAAC,EAAE;;;;;;;;;iBASlG,sBAAsB,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE;;CAExE,EACO,EAAE,SAAS,EAAE,IAAI,EAAE,CACtB,CAAC;IACN,CAAC;CAAA;AA7BD,4BA6BC;AAED,SAAS,gBAAgB,CAAC,KAAY;IAClC,MAAM,UAAU,GAAG,IAAA,mBAAa,EAAC,KAAK,CAAC,CAAC;IACxC,OAAO,UAAU,CAAC,IAAI,CAClB,CAAC,EAAE,EAAE,EAAE,CAAC,IAAA,qBAAe,EAAC,EAAE,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAC1G,CAAC;AACN,CAAC;AAED,SAAe,qBAAqB,CAAC,KAAY,EAAE,OAAsB,EAAE,MAAc;;QACrF,MAAM,eAAe,GAAG,IAAI,wCAAqB,EAAE,CAAC;QACpD,MAAM,kBAAkB,GAAG,aAAa,CAAC;QACzC,MAAM,eAAe,CAAC,QAAQ,CAAC,KAAK,EAAE;YAClC,QAAQ,EAAE,WAAW;YACrB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC;YAC5C,4BAA4B,EAAE,kBAAkB;YAChD,IAAI,EAAE,SAAS;SAClB,CAAC,CAAC;QAEH,MAAM,kBAAkB,CAAC,KAAK,EAAE,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACvE,OAAO,kBAAkB,CAAC;IAC9B,CAAC;CAAA;AAED,SAAe,kBAAkB,CAAC,KAAY,EAAE,eAAuB;;QACnE,MAAM,OAAO,GAAG,IAAI,kBAAO,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,cAAI,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC,CAAC;QAEjF,MAAM,cAAc,GAA+B,EAAE,CAAC;QACtD,KAAK,CAAC,YAAY;aACb,MAAM,CAAC,CAAC,CAAC,EAAkB,EAAE,CAAC,IAAA,qBAAe,EAAC,CAAC,CAAC,CAAC;aACjD,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YACZ,cAAc,CAAC,IAAI,CAAC;gBAChB,EAAE;gBACF,KAAK,CAAC,YAAY,CAAC,MAAM,CACrB,CAAC,CAAC,EAAkB,EAAE,CAAC,IAAA,iBAAW,EAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,CAClF;aACJ,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEP,MAAM,QAAQ,GAA4C,EAAE,CAAC;QAC7D,MAAM,aAAa,GAAqC,EAAE,CAAC;QAE3D,EAAE,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE;YACrC,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YACnD,oBAAoB,CAAC,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;YACrE,kCAAkC,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC9E,6BAA6B,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YACzE,yCAAyC,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACpC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QAEpE,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;CAAA;AAED,SAAS,uBAAuB,CAC5B,IAAU,EACV,QAAiD,EACjD,SAA4C;IAE5C,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAU,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACvF,oBAAoB;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAE5B,IAAI,IAAI,CAAC,UAAU,CAAC,sCAA4B,CAAC,EAAE,CAAC;YAChD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,SAAS,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;IACL,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CACzB,IAAU,EACV,cAA0C,EAC1C,aAA+C,EAC/C,SAA4C;IAE5C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,qBAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAChD,OAAO;IACX,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC5B,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,EAAE;QAClD,IAAI,IAAI,KAAK,IAAI,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;YACtC,MAAM,aAAa,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YACtD,IAAI,aAAa,EAAE,CAAC;gBAChB,aAAa,CAAC,IAAI,CAAC;oBACf,IAAI;oBACJ,eAAe,IAAI;UAC7B,cAAc;yBACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,mCAAmC,aAAa,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,QAAQ,CAAC;yBAChG,IAAI,CAAC,KAAK,CAAC,GAAG;iBACV,CAAC,CAAC;gBACH,SAAS,CAAC,IAAI,EAAE,CAAC;YACrB,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,kCAAkC,CACvC,IAAU,EACV,cAA0C,EAC1C,QAAiD,EACjD,SAA4C;IAE5C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,qBAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAChD,OAAO;IACX,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC5B,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE;QAClC,sGAAsG;QACtG,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,KAAK,QAAQ,CAAC,IAAI,oCAAoC,CAAC,CAAC;QACjF,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE;gBACzC,IACI,CAAC,CAAC,MAAM,CAAC,qBAAU,CAAC,iBAAiB,CAAC;oBACtC,CAAC,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAC/D,CAAC;oBACC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACjB,cAAc,CAAC,IAAI,EAAE,CAAC;gBAC1B,CAAC;YACL,CAAC,CAAC,CAAC;YACH,SAAS,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,yCAAyC,CAC9C,IAAU,EACV,cAA0C,EAC1C,QAAiD;IAEjD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,qBAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAChD,OAAO;IACX,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC5B,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE;QAC7C,MAAM,aAAa,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,OAAO;QACX,CAAC;QAED,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC3B,6EAA6E;YAC7E,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,KAAK,QAAQ,CAAC,IAAI,oCAAoC,CAAC,CAAC;YACjF,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE;oBACzC,IAAI,CAAC,CAAC,MAAM,CAAC,qBAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;wBACzC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,aAAa,CAAC,IAAI,EAAE,CAAC;4BACrC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBACrB,CAAC;wBACD,cAAc,CAAC,IAAI,EAAE,CAAC;oBAC1B,CAAC;gBACL,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,6BAA6B,CAClC,IAAU,EACV,cAA0C,EAC1C,QAAiD,EACjD,SAA4C;IAE5C,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC/C,kGAAkG;QAClG,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,UAAU,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACpE,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,YAAY,EAAE,CAAC;gBACf,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChC,CAAC;YACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACtD,IAAI,gBAAgB,EAAE,CAAC;gBACnB,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACpC,CAAC;YACD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,YAAY,EAAE,CAAC;gBACf,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChC,CAAC;YACD,SAAS,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;IACL,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAmB;;IAC9C,MAAM,YAAY,GAAG,IAAA,kBAAY,EAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC1D,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,GAAG,GAAG,MAAA,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,0CAAE,KAAK,CAAC;IACxC,OAAO,IAAA,qBAAe,EAAC,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,MAAM,CAAC,GAAsB,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type PluginFunction } from '@zenstackhq/sdk';
2
+ export declare const name = "Prisma Enhancer";
3
+ export declare const description = "Generating PrismaClient enhancer";
4
+ declare const run: PluginFunction;
5
+ export default run;
@@ -8,24 +8,25 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
11
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.name = void 0;
12
+ exports.description = exports.name = void 0;
16
13
  const sdk_1 = require("@zenstackhq/sdk");
17
- const path_1 = __importDefault(require("path"));
18
14
  const plugin_utils_1 = require("../plugin-utils");
19
- exports.name = 'Model Metadata';
15
+ const enhance_1 = require("./enhance");
16
+ const model_meta_1 = require("./model-meta");
17
+ const policy_1 = require("./policy");
18
+ exports.name = 'Prisma Enhancer';
19
+ exports.description = 'Generating PrismaClient enhancer';
20
20
  const run = (model, options, _dmmf, globalOptions) => __awaiter(void 0, void 0, void 0, function* () {
21
- let output = options.output ? options.output : (0, plugin_utils_1.getDefaultOutputFolder)(globalOptions);
22
- if (!output) {
23
- throw new sdk_1.PluginError(options.name, `Unable to determine output path, not running plugin`);
21
+ let ourDir = options.output ? options.output : (0, plugin_utils_1.getDefaultOutputFolder)(globalOptions);
22
+ if (!ourDir) {
23
+ throw new sdk_1.PluginError(exports.name, `Unable to determine output path, not running plugin`);
24
24
  }
25
- output = (0, sdk_1.resolvePath)(output, options);
26
- const outFile = path_1.default.join(output, 'model-meta.ts');
27
- const dataModels = (0, sdk_1.getDataModels)(model);
25
+ ourDir = (0, sdk_1.resolvePath)(ourDir, options);
28
26
  const project = (0, sdk_1.createProject)();
27
+ yield (0, model_meta_1.generate)(model, options, project, ourDir);
28
+ yield (0, policy_1.generate)(model, options, project, ourDir);
29
+ yield (0, enhance_1.generate)(model, options, project, ourDir);
29
30
  let shouldCompile = true;
30
31
  if (typeof options.compile === 'boolean') {
31
32
  // explicit override
@@ -35,12 +36,12 @@ const run = (model, options, _dmmf, globalOptions) => __awaiter(void 0, void 0,
35
36
  // from CLI or config file
36
37
  shouldCompile = globalOptions.compile;
37
38
  }
38
- yield (0, sdk_1.generateModelMeta)(project, dataModels, {
39
- output: outFile,
40
- compile: shouldCompile,
41
- preserveTsFiles: options.preserveTsFiles === true,
42
- generateAttributes: true,
43
- });
39
+ if (!shouldCompile || options.preserveTsFiles === true) {
40
+ yield (0, sdk_1.saveProject)(project);
41
+ }
42
+ if (shouldCompile) {
43
+ yield (0, sdk_1.emitProject)(project);
44
+ }
44
45
  });
45
46
  exports.default = run;
46
47
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/enhancer/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yCAOyB;AACzB,kDAAyD;AACzD,uCAAyD;AACzD,6CAA6D;AAC7D,qCAAsD;AAEzC,QAAA,IAAI,GAAG,iBAAiB,CAAC;AACzB,QAAA,WAAW,GAAG,kCAAkC,CAAC;AAE9D,MAAM,GAAG,GAAmB,CAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE;IACvE,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,OAAO,CAAC,MAAiB,CAAC,CAAC,CAAC,IAAA,qCAAsB,EAAC,aAAa,CAAC,CAAC;IACjG,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,iBAAW,CAAC,YAAI,EAAE,qDAAqD,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,GAAG,IAAA,iBAAW,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG,IAAA,mBAAa,GAAE,CAAC;IAEhC,MAAM,IAAA,qBAAiB,EAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACzD,MAAM,IAAA,iBAAc,EAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,IAAA,kBAAgB,EAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAExD,IAAI,aAAa,GAAG,IAAI,CAAC;IACzB,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACvC,oBAAoB;QACpB,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IACpC,CAAC;SAAM,IAAI,aAAa,EAAE,CAAC;QACvB,0BAA0B;QAC1B,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;QACrD,MAAM,IAAA,iBAAW,EAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAChB,MAAM,IAAA,iBAAW,EAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;AACL,CAAC,CAAA,CAAC;AAEF,kBAAe,GAAG,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type PluginOptions } from '@zenstackhq/sdk';
2
+ import type { Model } from '@zenstackhq/sdk/ast';
3
+ import type { Project } from 'ts-morph';
4
+ export declare function generate(model: Model, options: PluginOptions, project: Project, outDir: string): Promise<void>;
@@ -12,11 +12,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.name = void 0;
16
- const policy_guard_generator_1 = __importDefault(require("./policy-guard-generator"));
17
- exports.name = 'Access Policy';
18
- const run = (model, options, _dmmf, globalOptions) => __awaiter(void 0, void 0, void 0, function* () {
19
- return new policy_guard_generator_1.default().generate(model, options, globalOptions);
20
- });
21
- exports.default = run;
15
+ exports.generate = void 0;
16
+ const sdk_1 = require("@zenstackhq/sdk");
17
+ const path_1 = __importDefault(require("path"));
18
+ function generate(model, options, project, outDir) {
19
+ return __awaiter(this, void 0, void 0, function* () {
20
+ const outFile = path_1.default.join(outDir, 'model-meta.ts');
21
+ const dataModels = (0, sdk_1.getDataModels)(model);
22
+ yield (0, sdk_1.generateModelMeta)(project, dataModels, {
23
+ output: outFile,
24
+ generateAttributes: true,
25
+ });
26
+ });
27
+ }
28
+ exports.generate = generate;
22
29
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/enhancer/model-meta/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,yCAAuF;AAEvF,gDAAwB;AAGxB,SAAsB,QAAQ,CAAC,KAAY,EAAE,OAAsB,EAAE,OAAgB,EAAE,MAAc;;QACjG,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,IAAA,mBAAa,EAAC,KAAK,CAAC,CAAC;QACxC,MAAM,IAAA,uBAAiB,EAAC,OAAO,EAAE,UAAU,EAAE;YACzC,MAAM,EAAE,OAAO;YACf,kBAAkB,EAAE,IAAI;SAC3B,CAAC,CAAC;IACP,CAAC;CAAA;AAPD,4BAOC"}
@@ -20,6 +20,9 @@ export declare class ExpressionWriter {
20
20
  */
21
21
  write(expr: Expression): void;
22
22
  private writeReference;
23
+ private writeBaseHierarchy;
24
+ private getDelegateBase;
25
+ private isFieldReferenceToDelegateModel;
23
26
  private writeMemberAccess;
24
27
  private writeExprList;
25
28
  private writeBinary;
@@ -1,12 +1,15 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.ExpressionWriter = exports.FALSE = exports.TRUE = void 0;
4
7
  const ast_1 = require("@zenstackhq/language/ast");
8
+ const runtime_1 = require("@zenstackhq/runtime");
5
9
  const sdk_1 = require("@zenstackhq/sdk");
6
10
  const lower_case_first_1 = require("lower-case-first");
7
- const _1 = require(".");
8
- const ast_utils_1 = require("../../utils/ast-utils");
9
- const typescript_expression_transformer_1 = require("../../utils/typescript-expression-transformer");
11
+ const tiny_invariant_1 = __importDefault(require("tiny-invariant"));
12
+ const __1 = require("..");
10
13
  // { OR: [] } filters to nothing, { AND: [] } includes everything
11
14
  // https://www.prisma.io/docs/concepts/components/prisma-client/null-and-undefined#the-effect-of-null-and-undefined-on-conditionals
12
15
  exports.TRUE = '{ AND: [] }';
@@ -23,7 +26,7 @@ class ExpressionWriter {
23
26
  constructor(writer, isPostGuard = false) {
24
27
  this.writer = writer;
25
28
  this.isPostGuard = isPostGuard;
26
- this.plainExprBuilder = new typescript_expression_transformer_1.TypeScriptExpressionTransformer({
29
+ this.plainExprBuilder = new sdk_1.TypeScriptExpressionTransformer({
27
30
  context: sdk_1.ExpressionContext.AccessPolicy,
28
31
  isPostGuard: this.isPostGuard,
29
32
  });
@@ -63,11 +66,40 @@ class ExpressionWriter {
63
66
  }
64
67
  else {
65
68
  this.block(() => {
66
- var _a;
67
- this.writer.write(`${(_a = expr.target.ref) === null || _a === void 0 ? void 0 : _a.name}: true`);
69
+ const ref = expr.target.ref;
70
+ (0, tiny_invariant_1.default)(ref);
71
+ if (this.isFieldReferenceToDelegateModel(ref)) {
72
+ const thisModel = ref.$container;
73
+ const targetBase = ref.$inheritedFrom;
74
+ this.writeBaseHierarchy(thisModel, targetBase, () => this.writer.write(`${ref.name}: true`));
75
+ }
76
+ else {
77
+ this.writer.write(`${ref.name}: true`);
78
+ }
68
79
  });
69
80
  }
70
81
  }
82
+ writeBaseHierarchy(thisModel, targetBase, conditionWriter) {
83
+ if (!targetBase || thisModel === targetBase) {
84
+ conditionWriter();
85
+ return;
86
+ }
87
+ const base = this.getDelegateBase(thisModel);
88
+ if (!base) {
89
+ throw new sdk_1.PluginError(__1.name, `Failed to resolve delegate base model for "${thisModel.name}"`);
90
+ }
91
+ this.writer.write(`${`${runtime_1.DELEGATE_AUX_RELATION_PREFIX}_${(0, lower_case_first_1.lowerCaseFirst)(base.name)}`}: `);
92
+ this.writer.block(() => {
93
+ this.writeBaseHierarchy(base, targetBase, conditionWriter);
94
+ });
95
+ }
96
+ getDelegateBase(model) {
97
+ var _a;
98
+ return (_a = model.superTypes.map((t) => t.ref).filter((t) => t && (0, sdk_1.isDelegateModel)(t))) === null || _a === void 0 ? void 0 : _a[0];
99
+ }
100
+ isFieldReferenceToDelegateModel(ref) {
101
+ return (0, ast_1.isDataModelField)(ref) && !!ref.$inheritedFrom && (0, sdk_1.isDelegateModel)(ref.$inheritedFrom);
102
+ }
71
103
  writeMemberAccess(expr) {
72
104
  if (this.isAuthOrAuthMemberAccess(expr)) {
73
105
  // member access of `auth()`, generate plain expression
@@ -151,7 +183,7 @@ class ExpressionWriter {
151
183
  }, 'in');
152
184
  }
153
185
  else {
154
- throw new sdk_1.PluginError(_1.name, '"in" operator cannot be used with field references on both sides');
186
+ throw new sdk_1.PluginError(__1.name, '"in" operator cannot be used with field references on both sides');
155
187
  }
156
188
  });
157
189
  }
@@ -213,8 +245,8 @@ class ExpressionWriter {
213
245
  this.writer.write(this.plainExprBuilder.transform(expr));
214
246
  }
215
247
  catch (err) {
216
- if (err instanceof typescript_expression_transformer_1.TypeScriptExpressionTransformerError) {
217
- throw new sdk_1.PluginError(_1.name, err.message);
248
+ if (err instanceof sdk_1.TypeScriptExpressionTransformerError) {
249
+ throw new sdk_1.PluginError(__1.name, err.message);
218
250
  }
219
251
  else {
220
252
  throw err;
@@ -275,8 +307,8 @@ class ExpressionWriter {
275
307
  operator === '!=' ? exports.TRUE : exports.FALSE} : `);
276
308
  }
277
309
  catch (err) {
278
- if (err instanceof typescript_expression_transformer_1.TypeScriptExpressionTransformerError) {
279
- throw new sdk_1.PluginError(_1.name, err.message);
310
+ if (err instanceof sdk_1.TypeScriptExpressionTransformerError) {
311
+ throw new sdk_1.PluginError(__1.name, err.message);
280
312
  }
281
313
  else {
282
314
  throw err;
@@ -288,11 +320,11 @@ class ExpressionWriter {
288
320
  this.block(() => {
289
321
  var _a;
290
322
  const dataModel = this.isModelTyped(fieldAccess);
291
- if (dataModel && (0, ast_utils_1.isAuthInvocation)(operand)) {
323
+ if (dataModel && (0, sdk_1.isAuthInvocation)(operand)) {
292
324
  // right now this branch only serves comparison with `auth`, like
293
325
  // @@allow('all', owner == auth())
294
326
  if (operator !== '==' && operator !== '!=') {
295
- throw new sdk_1.PluginError(_1.name, 'Only == and != operators are allowed');
327
+ throw new sdk_1.PluginError(__1.name, 'Only == and != operators are allowed');
296
328
  }
297
329
  if (!(0, ast_1.isThisExpr)(fieldAccess)) {
298
330
  this.writer.writeLine(operator === '==' ? 'is:' : 'isNot:');
@@ -350,9 +382,9 @@ class ExpressionWriter {
350
382
  return (0, ast_1.isMemberAccessExpr)(expr) && (0, sdk_1.isFutureExpr)(expr.operand);
351
383
  }
352
384
  requireIdFields(dataModel) {
353
- const idFields = (0, ast_utils_1.getIdFields)(dataModel);
385
+ const idFields = (0, sdk_1.getIdFields)(dataModel);
354
386
  if (!idFields || idFields.length === 0) {
355
- throw new sdk_1.PluginError(_1.name, `Data model ${dataModel.name} does not have an id field`);
387
+ throw new sdk_1.PluginError(__1.name, `Data model ${dataModel.name} does not have an id field`);
356
388
  }
357
389
  return idFields;
358
390
  }
@@ -373,14 +405,14 @@ class ExpressionWriter {
373
405
  // https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#compare-columns-in-the-same-table
374
406
  writeFieldReference(expr) {
375
407
  if (!expr.target.ref) {
376
- throw new sdk_1.PluginError(_1.name, `Unresolved reference "${expr.target.$refText}"`);
408
+ throw new sdk_1.PluginError(__1.name, `Unresolved reference "${expr.target.$refText}"`);
377
409
  }
378
410
  const containingModel = expr.target.ref.$container;
379
411
  this.writer.write(`db.${(0, lower_case_first_1.lowerCaseFirst)(containingModel.name)}.fields.${expr.target.ref.name}`);
380
412
  }
381
413
  isAuthOrAuthMemberAccess(expr) {
382
414
  // recursive check for auth().x.y.z
383
- return (0, ast_utils_1.isAuthInvocation)(expr) || ((0, ast_1.isMemberAccessExpr)(expr) && this.isAuthOrAuthMemberAccess(expr.operand));
415
+ return (0, sdk_1.isAuthInvocation)(expr) || ((0, ast_1.isMemberAccessExpr)(expr) && this.isAuthOrAuthMemberAccess(expr.operand));
384
416
  }
385
417
  writeOperator(operator, fieldAccess, writeOperand) {
386
418
  var _a;
@@ -392,7 +424,7 @@ class ExpressionWriter {
392
424
  this.writer.write('isNot: ');
393
425
  }
394
426
  else {
395
- throw new sdk_1.PluginError(_1.name, 'Only == and != operators are allowed for data model comparison');
427
+ throw new sdk_1.PluginError(__1.name, 'Only == and != operators are allowed for data model comparison');
396
428
  }
397
429
  writeOperand();
398
430
  }
@@ -412,50 +444,68 @@ class ExpressionWriter {
412
444
  }
413
445
  }
414
446
  writeFieldCondition(fieldAccess, writeCondition, filterOp, extraArgs) {
415
- var _a, _b, _c;
416
- let selector;
447
+ // let selector: string | undefined;
417
448
  let operand;
449
+ let fieldWriter;
418
450
  if ((0, ast_1.isThisExpr)(fieldAccess)) {
419
451
  // pass on
420
452
  writeCondition();
421
453
  return;
422
454
  }
423
455
  else if ((0, ast_1.isReferenceExpr)(fieldAccess)) {
424
- selector = (_a = fieldAccess.target.ref) === null || _a === void 0 ? void 0 : _a.name;
456
+ const ref = fieldAccess.target.ref;
457
+ (0, tiny_invariant_1.default)(ref);
458
+ if (this.isFieldReferenceToDelegateModel(ref)) {
459
+ const thisModel = ref.$container;
460
+ const targetBase = ref.$inheritedFrom;
461
+ fieldWriter = (conditionWriter) => this.writeBaseHierarchy(thisModel, targetBase, () => {
462
+ this.writer.write(`${ref.name}: `);
463
+ conditionWriter();
464
+ });
465
+ }
466
+ else {
467
+ fieldWriter = (conditionWriter) => {
468
+ this.writer.write(`${ref.name}: `);
469
+ conditionWriter();
470
+ };
471
+ }
425
472
  }
426
473
  else if ((0, ast_1.isMemberAccessExpr)(fieldAccess)) {
427
- if ((0, sdk_1.isFutureExpr)(fieldAccess.operand)) {
474
+ if (!(0, sdk_1.isFutureExpr)(fieldAccess.operand)) {
428
475
  // future().field should be treated as the "field"
429
- selector = (_b = fieldAccess.member.ref) === null || _b === void 0 ? void 0 : _b.name;
430
- }
431
- else {
432
- selector = (_c = fieldAccess.member.ref) === null || _c === void 0 ? void 0 : _c.name;
433
476
  operand = fieldAccess.operand;
434
477
  }
478
+ fieldWriter = (conditionWriter) => {
479
+ var _a;
480
+ this.writer.write(`${(_a = fieldAccess.member.ref) === null || _a === void 0 ? void 0 : _a.name}: `);
481
+ conditionWriter();
482
+ };
435
483
  }
436
484
  else {
437
- throw new sdk_1.PluginError(_1.name, `Unsupported expression type: ${fieldAccess.$type}`);
485
+ throw new sdk_1.PluginError(__1.name, `Unsupported expression type: ${fieldAccess.$type}`);
438
486
  }
439
- if (!selector) {
440
- throw new sdk_1.PluginError(_1.name, `Failed to write FieldAccess expression`);
487
+ if (!fieldWriter) {
488
+ throw new sdk_1.PluginError(__1.name, `Failed to write FieldAccess expression`);
441
489
  }
442
490
  const writerFilterOutput = () => {
443
- this.writer.write(selector + ': ');
444
- if (filterOp) {
445
- this.block(() => {
446
- this.writer.write(`${filterOp}: `);
447
- writeCondition();
448
- if (extraArgs) {
449
- for (const [k, v] of Object.entries(extraArgs)) {
450
- this.writer.write(`,\n${k}: `);
451
- this.plain(v);
491
+ // this.writer.write(selector + ': ');
492
+ fieldWriter(() => {
493
+ if (filterOp) {
494
+ this.block(() => {
495
+ this.writer.write(`${filterOp}: `);
496
+ writeCondition();
497
+ if (extraArgs) {
498
+ for (const [k, v] of Object.entries(extraArgs)) {
499
+ this.writer.write(`,\n${k}: `);
500
+ this.plain(v);
501
+ }
452
502
  }
453
- }
454
- });
455
- }
456
- else {
457
- writeCondition();
458
- }
503
+ });
504
+ }
505
+ else {
506
+ writeCondition();
507
+ }
508
+ });
459
509
  };
460
510
  if (operand) {
461
511
  // member access expression
@@ -547,7 +597,7 @@ class ExpressionWriter {
547
597
  }
548
598
  writeUnary(expr) {
549
599
  if (expr.operator !== '!') {
550
- throw new sdk_1.PluginError(_1.name, `Unary operator "${expr.operator}" is not supported`);
600
+ throw new sdk_1.PluginError(__1.name, `Unary operator "${expr.operator}" is not supported`);
551
601
  }
552
602
  this.block(() => {
553
603
  this.writer.write('NOT: ');
@@ -571,7 +621,7 @@ class ExpressionWriter {
571
621
  var _a, _b;
572
622
  const funcDecl = expr.function.ref;
573
623
  if (!funcDecl) {
574
- throw new sdk_1.PluginError(_1.name, `Failed to resolve function declaration`);
624
+ throw new sdk_1.PluginError(__1.name, `Failed to resolve function declaration`);
575
625
  }
576
626
  const functionAllowedContext = (0, sdk_1.getFunctionExpressionContext)(funcDecl);
577
627
  if (functionAllowedContext.includes(sdk_1.ExpressionContext.AccessPolicy) ||
@@ -600,7 +650,7 @@ class ExpressionWriter {
600
650
  });
601
651
  }
602
652
  else {
603
- throw new sdk_1.PluginError(_1.name, `Unsupported function ${funcDecl.name}`);
653
+ throw new sdk_1.PluginError(__1.name, `Unsupported function ${funcDecl.name}`);
604
654
  }
605
655
  }
606
656
  }