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.
- package/bin/post-install.js +1 -1
- package/cli/cli-util.d.ts +1 -1
- package/cli/cli-util.js +20 -2
- package/cli/cli-util.js.map +1 -1
- package/cli/index.js +0 -3
- package/cli/index.js.map +1 -1
- package/cli/plugin-runner.d.ts +4 -2
- package/cli/plugin-runner.js +88 -71
- package/cli/plugin-runner.js.map +1 -1
- package/constants.js +1 -1
- package/language-server/validator/datamodel-validator.js +31 -28
- package/language-server/validator/datamodel-validator.js.map +1 -1
- package/language-server/validator/datasource-validator.js +1 -1
- package/language-server/validator/datasource-validator.js.map +1 -1
- package/language-server/validator/enum-validator.js +1 -1
- package/language-server/validator/enum-validator.js.map +1 -1
- package/language-server/validator/expression-validator.js +12 -6
- package/language-server/validator/expression-validator.js.map +1 -1
- package/language-server/validator/function-invocation-validator.js +2 -2
- package/language-server/validator/function-invocation-validator.js.map +1 -1
- package/language-server/validator/schema-validator.js +1 -1
- package/language-server/validator/schema-validator.js.map +1 -1
- package/language-server/validator/utils.d.ts +1 -1
- package/language-server/validator/utils.js +3 -3
- package/language-server/validator/utils.js.map +1 -1
- package/language-server/zmodel-code-action.js +4 -3
- package/language-server/zmodel-code-action.js.map +1 -1
- package/language-server/zmodel-completion-provider.js +7 -7
- package/language-server/zmodel-completion-provider.js.map +1 -1
- package/language-server/zmodel-linker.d.ts +0 -1
- package/language-server/zmodel-linker.js +9 -59
- package/language-server/zmodel-linker.js.map +1 -1
- package/language-server/zmodel-module.js +4 -0
- package/language-server/zmodel-module.js.map +1 -1
- package/language-server/zmodel-scope.d.ts +5 -3
- package/language-server/zmodel-scope.js +117 -68
- package/language-server/zmodel-scope.js.map +1 -1
- package/package.json +7 -7
- package/plugins/enhancer/delegate/index.d.ts +4 -0
- package/plugins/enhancer/delegate/index.js +31 -0
- package/plugins/enhancer/delegate/index.js.map +1 -0
- package/plugins/enhancer/enhance/index.d.ts +4 -0
- package/plugins/enhancer/enhance/index.js +202 -0
- package/plugins/enhancer/enhance/index.js.map +1 -0
- package/plugins/enhancer/index.d.ts +5 -0
- package/plugins/{model-meta → enhancer}/index.js +19 -18
- package/plugins/enhancer/index.js.map +1 -0
- package/plugins/enhancer/model-meta/index.d.ts +4 -0
- package/plugins/{access-policy → enhancer/model-meta}/index.js +14 -7
- package/plugins/enhancer/model-meta/index.js.map +1 -0
- package/plugins/{access-policy → enhancer/policy}/expression-writer.d.ts +3 -0
- package/plugins/{access-policy → enhancer/policy}/expression-writer.js +97 -47
- package/plugins/enhancer/policy/expression-writer.js.map +1 -0
- package/plugins/enhancer/policy/index.d.ts +4 -0
- package/plugins/enhancer/policy/index.js +20 -0
- package/plugins/enhancer/policy/index.js.map +1 -0
- package/plugins/{access-policy → enhancer/policy}/policy-guard-generator.d.ts +4 -4
- package/plugins/{access-policy → enhancer/policy}/policy-guard-generator.js +21 -66
- package/plugins/enhancer/policy/policy-guard-generator.js.map +1 -0
- package/plugins/plugin-utils.d.ts +8 -0
- package/plugins/plugin-utils.js +14 -9
- package/plugins/plugin-utils.js.map +1 -1
- package/plugins/prisma/index.d.ts +1 -0
- package/plugins/prisma/index.js +4 -6
- package/plugins/prisma/index.js.map +1 -1
- package/plugins/prisma/prisma-builder.d.ts +5 -6
- package/plugins/prisma/prisma-builder.js +9 -5
- package/plugins/prisma/prisma-builder.js.map +1 -1
- package/plugins/prisma/schema-generator.d.ts +8 -1
- package/plugins/prisma/schema-generator.js +155 -11
- package/plugins/prisma/schema-generator.js.map +1 -1
- package/plugins/zod/generator.js +4 -1
- package/plugins/zod/generator.js.map +1 -1
- package/plugins/zod/index.d.ts +1 -0
- package/plugins/zod/index.js +2 -1
- package/plugins/zod/index.js.map +1 -1
- package/plugins/zod/utils/schema-gen.js +2 -3
- package/plugins/zod/utils/schema-gen.js.map +1 -1
- package/res/stdlib.zmodel +99 -7
- package/utils/ast-utils.d.ts +5 -2
- package/utils/ast-utils.js +63 -24
- package/utils/ast-utils.js.map +1 -1
- package/utils/exec-utils.d.ts +4 -2
- package/utils/exec-utils.js +16 -3
- package/utils/exec-utils.js.map +1 -1
- package/plugins/access-policy/expression-writer.js.map +0 -1
- package/plugins/access-policy/index.d.ts +0 -4
- package/plugins/access-policy/index.js.map +0 -1
- package/plugins/access-policy/policy-guard-generator.js.map +0 -1
- package/plugins/model-meta/index.d.ts +0 -4
- package/plugins/model-meta/index.js.map +0 -1
- package/utils/typescript-expression-transformer.d.ts +0 -56
- package/utils/typescript-expression-transformer.js +0 -338
- 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":"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"}
|
|
@@ -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
|
-
|
|
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
|
|
22
|
-
if (!
|
|
23
|
-
throw new sdk_1.PluginError(
|
|
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
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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"}
|
|
@@ -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.
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
return
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
8
|
-
const
|
|
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
|
|
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
|
-
|
|
67
|
-
|
|
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(
|
|
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
|
|
217
|
-
throw new sdk_1.PluginError(
|
|
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
|
|
279
|
-
throw new sdk_1.PluginError(
|
|
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,
|
|
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(
|
|
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,
|
|
385
|
+
const idFields = (0, sdk_1.getIdFields)(dataModel);
|
|
354
386
|
if (!idFields || idFields.length === 0) {
|
|
355
|
-
throw new sdk_1.PluginError(
|
|
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(
|
|
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,
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
485
|
+
throw new sdk_1.PluginError(__1.name, `Unsupported expression type: ${fieldAccess.$type}`);
|
|
438
486
|
}
|
|
439
|
-
if (!
|
|
440
|
-
throw new sdk_1.PluginError(
|
|
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
|
-
|
|
445
|
-
|
|
446
|
-
this.
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
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
|
-
|
|
457
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
653
|
+
throw new sdk_1.PluginError(__1.name, `Unsupported function ${funcDecl.name}`);
|
|
604
654
|
}
|
|
605
655
|
}
|
|
606
656
|
}
|