zenstack 1.0.0-beta.2 → 1.0.0-beta.3

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 (52) hide show
  1. package/README.md +5 -3
  2. package/cli/plugin-runner.d.ts +2 -1
  3. package/cli/plugin-runner.js +88 -47
  4. package/cli/plugin-runner.js.map +1 -1
  5. package/language-server/constants.d.ts +0 -4
  6. package/language-server/constants.js +1 -14
  7. package/language-server/constants.js.map +1 -1
  8. package/language-server/validator/function-decl-validator.d.ts +9 -0
  9. package/language-server/validator/function-decl-validator.js +15 -0
  10. package/language-server/validator/function-decl-validator.js.map +1 -0
  11. package/language-server/validator/function-invocation-validator.js +31 -5
  12. package/language-server/validator/function-invocation-validator.js.map +1 -1
  13. package/language-server/validator/utils.d.ts +3 -3
  14. package/language-server/validator/utils.js.map +1 -1
  15. package/language-server/validator/zmodel-validator.d.ts +2 -1
  16. package/language-server/validator/zmodel-validator.js +8 -3
  17. package/language-server/validator/zmodel-validator.js.map +1 -1
  18. package/language-server/zmodel-linker.d.ts +1 -0
  19. package/language-server/zmodel-linker.js +36 -0
  20. package/language-server/zmodel-linker.js.map +1 -1
  21. package/package.json +8 -7
  22. package/plugins/access-policy/expression-writer.js +33 -12
  23. package/plugins/access-policy/expression-writer.js.map +1 -1
  24. package/plugins/access-policy/policy-guard-generator.js +33 -22
  25. package/plugins/access-policy/policy-guard-generator.js.map +1 -1
  26. package/plugins/plugin-utils.d.ts +4 -0
  27. package/plugins/plugin-utils.js +16 -1
  28. package/plugins/plugin-utils.js.map +1 -1
  29. package/plugins/prisma/schema-generator.js +8 -1
  30. package/plugins/prisma/schema-generator.js.map +1 -1
  31. package/plugins/zod/generator.js +115 -8
  32. package/plugins/zod/generator.js.map +1 -1
  33. package/plugins/zod/transformer.d.ts +2 -4
  34. package/plugins/zod/transformer.js +34 -60
  35. package/plugins/zod/transformer.js.map +1 -1
  36. package/plugins/zod/types.d.ts +2 -0
  37. package/plugins/zod/utils/schema-gen.d.ts +3 -0
  38. package/plugins/zod/utils/schema-gen.js +176 -0
  39. package/plugins/zod/utils/schema-gen.js.map +1 -0
  40. package/res/stdlib.zmodel +102 -29
  41. package/utils/ast-utils.d.ts +1 -14
  42. package/utils/ast-utils.js +1 -71
  43. package/utils/ast-utils.js.map +1 -1
  44. package/utils/typescript-expression-transformer.d.ts +53 -0
  45. package/utils/typescript-expression-transformer.js +295 -0
  46. package/utils/typescript-expression-transformer.js.map +1 -0
  47. package/plugins/access-policy/typescript-expression-transformer.d.ts +0 -28
  48. package/plugins/access-policy/typescript-expression-transformer.js +0 -180
  49. package/plugins/access-policy/typescript-expression-transformer.js.map +0 -1
  50. package/plugins/access-policy/zod-schema-generator.d.ts +0 -12
  51. package/plugins/access-policy/zod-schema-generator.js +0 -160
  52. package/plugins/access-policy/zod-schema-generator.js.map +0 -1
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeValidationRefinements = exports.makeFieldSchema = void 0;
4
+ const sdk_1 = require("@zenstackhq/sdk");
5
+ const ast_1 = require("@zenstackhq/sdk/ast");
6
+ const upper_case_first_1 = require("upper-case-first");
7
+ const __1 = require("..");
8
+ const typescript_expression_transformer_1 = require("../../../utils/typescript-expression-transformer");
9
+ function makeFieldSchema(field) {
10
+ var _a;
11
+ let schema = makeZodSchema(field);
12
+ for (const attr of field.attributes) {
13
+ const message = getAttrLiteralArg(attr, 'message');
14
+ const messageArg = message ? `, { message: ${JSON.stringify(message)} }` : '';
15
+ const messageArgFirst = message ? `{ message: ${JSON.stringify(message)} }` : '';
16
+ switch ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) {
17
+ case '@length': {
18
+ const min = getAttrLiteralArg(attr, 'min');
19
+ if (min) {
20
+ schema += `.min(${min}${messageArg})`;
21
+ }
22
+ const max = getAttrLiteralArg(attr, 'max');
23
+ if (max) {
24
+ schema += `.max(${max}${messageArg})`;
25
+ }
26
+ break;
27
+ }
28
+ case '@contains': {
29
+ const expr = getAttrLiteralArg(attr, 'text');
30
+ if (expr) {
31
+ schema += `.includes(${JSON.stringify(expr)}${messageArg})`;
32
+ }
33
+ break;
34
+ }
35
+ case '@regex': {
36
+ const expr = getAttrLiteralArg(attr, 'regex');
37
+ if (expr) {
38
+ schema += `.regex(new RegExp(${JSON.stringify(expr)})${messageArg})`;
39
+ }
40
+ break;
41
+ }
42
+ case '@startsWith': {
43
+ const text = getAttrLiteralArg(attr, 'text');
44
+ if (text) {
45
+ schema += `.startsWith(${JSON.stringify(text)}${messageArg})`;
46
+ }
47
+ break;
48
+ }
49
+ case '@endsWith': {
50
+ const text = getAttrLiteralArg(attr, 'text');
51
+ if (text) {
52
+ schema += `.endsWith(${JSON.stringify(text)}${messageArg})`;
53
+ }
54
+ break;
55
+ }
56
+ case '@email': {
57
+ schema += `.email(${messageArgFirst})`;
58
+ break;
59
+ }
60
+ case '@url': {
61
+ schema += `.url(${messageArgFirst})`;
62
+ break;
63
+ }
64
+ case '@datetime': {
65
+ schema += `.datetime({ offset: true${message ? ', message: ' + JSON.stringify(message) : ''} })`;
66
+ break;
67
+ }
68
+ case '@gt': {
69
+ const value = getAttrLiteralArg(attr, 'value');
70
+ if (value !== undefined) {
71
+ schema += `.gt(${value}${messageArg})`;
72
+ }
73
+ break;
74
+ }
75
+ case '@gte': {
76
+ const value = getAttrLiteralArg(attr, 'value');
77
+ if (value !== undefined) {
78
+ schema += `.gte(${value}${messageArg})`;
79
+ }
80
+ break;
81
+ }
82
+ case '@lt': {
83
+ const value = getAttrLiteralArg(attr, 'value');
84
+ if (value !== undefined) {
85
+ schema += `.lt(${value}${messageArg})`;
86
+ }
87
+ break;
88
+ }
89
+ case '@lte': {
90
+ const value = getAttrLiteralArg(attr, 'value');
91
+ if (value !== undefined) {
92
+ schema += `.lte(${value}${messageArg})`;
93
+ }
94
+ break;
95
+ }
96
+ }
97
+ }
98
+ if (field.type.optional) {
99
+ schema += '.nullish()';
100
+ }
101
+ return schema;
102
+ }
103
+ exports.makeFieldSchema = makeFieldSchema;
104
+ function makeZodSchema(field) {
105
+ var _a, _b;
106
+ let schema;
107
+ if (((_a = field.type.reference) === null || _a === void 0 ? void 0 : _a.ref) && (0, ast_1.isEnum)((_b = field.type.reference) === null || _b === void 0 ? void 0 : _b.ref)) {
108
+ schema = `${(0, upper_case_first_1.upperCaseFirst)(field.type.reference.ref.name)}Schema`;
109
+ }
110
+ else {
111
+ switch (field.type.type) {
112
+ case 'Int':
113
+ case 'Float':
114
+ case 'Decimal':
115
+ schema = 'z.number()';
116
+ break;
117
+ case 'BigInt':
118
+ schema = 'z.bigint()';
119
+ break;
120
+ case 'String':
121
+ schema = 'z.string()';
122
+ break;
123
+ case 'Boolean':
124
+ schema = 'z.boolean()';
125
+ break;
126
+ case 'DateTime':
127
+ schema = 'z.date()';
128
+ break;
129
+ case 'Bytes':
130
+ schema = 'z.number().array()';
131
+ break;
132
+ default:
133
+ schema = 'z.any()';
134
+ break;
135
+ }
136
+ }
137
+ if (field.type.array) {
138
+ schema = `z.array(${schema})`;
139
+ }
140
+ return schema;
141
+ }
142
+ function makeValidationRefinements(model) {
143
+ const attrs = model.attributes.filter((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@@validate'; });
144
+ const refinements = attrs
145
+ .map((attr) => {
146
+ const valueArg = (0, sdk_1.getAttributeArg)(attr, 'value');
147
+ if (!valueArg) {
148
+ return undefined;
149
+ }
150
+ const messageArg = (0, sdk_1.getAttributeArgLiteral)(attr, 'message');
151
+ const message = messageArg ? `, { message: ${JSON.stringify(messageArg)} }` : '';
152
+ try {
153
+ const expr = new typescript_expression_transformer_1.TypeScriptExpressionTransformer({
154
+ context: sdk_1.ExpressionContext.ValidationRule,
155
+ fieldReferenceContext: 'value',
156
+ }).transform(valueArg);
157
+ return `.refine((value: any) => ${expr}${message})`;
158
+ }
159
+ catch (err) {
160
+ if (err instanceof typescript_expression_transformer_1.TypeScriptExpressionTransformerError) {
161
+ throw new sdk_1.PluginError(__1.name, err.message);
162
+ }
163
+ else {
164
+ throw err;
165
+ }
166
+ }
167
+ })
168
+ .filter((r) => !!r);
169
+ return refinements;
170
+ }
171
+ exports.makeValidationRefinements = makeValidationRefinements;
172
+ function getAttrLiteralArg(attr, paramName) {
173
+ const arg = attr.args.find((arg) => { var _a; return ((_a = arg.$resolvedParam) === null || _a === void 0 ? void 0 : _a.name) === paramName; });
174
+ return arg && (0, sdk_1.getLiteral)(arg.value);
175
+ }
176
+ //# sourceMappingURL=schema-gen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-gen.js","sourceRoot":"","sources":["../../../../src/plugins/zod/utils/schema-gen.ts"],"names":[],"mappings":"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"}
package/res/stdlib.zmodel CHANGED
@@ -49,6 +49,20 @@ enum AttributeTargetField {
49
49
  ModelField
50
50
  }
51
51
 
52
+ /**
53
+ * Indicates the expression context a function can be used.
54
+ */
55
+ enum ExpressionContext {
56
+ // used in @default
57
+ DefaultValue
58
+
59
+ // used in @@allow and @@deny
60
+ AccessPolicy
61
+
62
+ // used in @@validate
63
+ ValidationRule
64
+ }
65
+
52
66
  /**
53
67
  * Reads value from an environment variable.
54
68
  */
@@ -59,99 +73,109 @@ function env(name: String): String {
59
73
  * Gets the current login user.
60
74
  */
61
75
  function auth(): Any {
62
- }
76
+ } @@@expressionContext([AccessPolicy])
63
77
 
64
78
  /**
65
79
  * Gets current date-time (as DateTime type).
66
80
  */
67
81
  function now(): DateTime {
68
- }
82
+ } @@@expressionContext([DefaultValue, AccessPolicy, ValidationRule])
69
83
 
70
84
  /**
71
85
  * Generates a globally unique identifier based on the UUID specs.
72
86
  */
73
87
  function uuid(): String {
74
- }
88
+ } @@@expressionContext([DefaultValue])
75
89
 
76
90
  /**
77
91
  * Generates a globally unique identifier based on the CUID spec.
78
92
  */
79
93
  function cuid(): String {
80
- }
94
+ } @@@expressionContext([DefaultValue])
81
95
 
82
96
  /**
83
97
  * Creates a sequence of integers in the underlying database and assign the incremented
84
98
  * values to the ID values of the created records based on the sequence.
85
99
  */
86
100
  function autoincrement(): Int {
87
- }
101
+ } @@@expressionContext([DefaultValue])
88
102
 
89
103
  /**
90
104
  * Represents default values that cannot be expressed in the Prisma schema (such as random()).
91
105
  */
92
106
  function dbgenerated(expr: String): Any {
93
- }
107
+ } @@@expressionContext([DefaultValue])
94
108
 
95
109
  /**
96
110
  * Gets entities value before an update. Only valid when used in a "update" policy rule.
97
111
  */
98
112
  function future(): Any {
99
- }
113
+ } @@@expressionContext([AccessPolicy])
100
114
 
101
115
  /**
102
116
  * If the field value contains the search string. By default, the search is case-sensitive,
103
117
  * but you can override the behavior with the "caseInSensitive" argument.
104
118
  */
105
119
  function contains(field: String, search: String, caseInSensitive: Boolean?): Boolean {
106
- }
120
+ } @@@expressionContext([AccessPolicy, ValidationRule])
107
121
 
108
122
  /**
109
123
  * If the field value matches the search condition with [full-text-search](https://www.prisma.io/docs/concepts/components/prisma-client/full-text-search). Need to enable "fullTextSearch" preview feature to use.
110
124
  */
111
125
  function search(field: String, search: String): Boolean {
112
- }
126
+ } @@@expressionContext([AccessPolicy])
113
127
 
114
128
  /**
115
129
  * If the field value starts with the search string
116
130
  */
117
131
  function startsWith(field: String, search: String): Boolean {
118
- }
132
+ } @@@expressionContext([AccessPolicy, ValidationRule])
119
133
 
120
134
  /**
121
135
  * If the field value ends with the search string
122
136
  */
123
137
  function endsWith(field: String, search: String): Boolean {
124
- }
138
+ } @@@expressionContext([AccessPolicy, ValidationRule])
125
139
 
126
140
  /**
127
141
  * If the field value (a list) has the given search value
128
142
  */
129
143
  function has(field: Any[], search: Any): Boolean {
130
- }
144
+ } @@@expressionContext([AccessPolicy, ValidationRule])
131
145
 
132
146
  /**
133
147
  * If the field value (a list) has every element of the search list
134
148
  */
135
149
  function hasEvery(field: Any[], search: Any[]): Boolean {
136
- }
150
+ } @@@expressionContext([AccessPolicy, ValidationRule])
137
151
 
138
152
  /**
139
153
  * If the field value (a list) has at least one element of the search list
140
154
  */
141
155
  function hasSome(field: Any[], search: Any[]): Boolean {
142
- }
156
+ } @@@expressionContext([AccessPolicy, ValidationRule])
143
157
 
144
158
  /**
145
159
  * If the field value (a list) is empty
146
160
  */
147
161
  function isEmpty(field: Any[]): Boolean {
148
- }
162
+ } @@@expressionContext([AccessPolicy, ValidationRule])
149
163
 
150
164
  /**
151
165
  * Marks an attribute to be only applicable to certain field types.
152
166
  */
153
167
  attribute @@@targetField(targetField: AttributeTargetField[])
154
168
 
169
+ /**
170
+ * Marks an attribute to be used for data validation.
171
+ */
172
+ attribute @@@validation()
173
+
174
+ /**
175
+ * Indicates the expression context a function can be used.
176
+ */
177
+ attribute @@@expressionContext(_ context: ExpressionContext[])
178
+
155
179
  /**
156
180
  * Indicates an attribute is directly supported by the Prisma schema.
157
181
  */
@@ -351,60 +375,109 @@ attribute @password(saltLength: Int?, salt: String?) @@@targetField([StringField
351
375
  */
352
376
  attribute @omit()
353
377
 
378
+ //////////////////////////////////////////////
379
+ // Begin validation attributes and functions
380
+ //////////////////////////////////////////////
381
+
354
382
  /**
355
383
  * Validates length of a string field.
356
384
  */
357
- attribute @length(_ min: Int?, _ max: Int?) @@@targetField([StringField])
385
+ attribute @length(_ min: Int?, _ max: Int?, _ message: String?) @@@targetField([StringField]) @@@validation
358
386
 
359
387
  /**
360
- * Validates a string field value matches a regex.
388
+ * Validates a string field value starts with the given text.
361
389
  */
362
- attribute @regex(_ regex: String) @@@targetField([StringField])
390
+ attribute @startsWith(_ text: String, _ message: String?) @@@targetField([StringField]) @@@validation
363
391
 
364
392
  /**
365
- * Validates a string field value starts with the given text.
393
+ * Validates a string field value ends with the given text.
366
394
  */
367
- attribute @startsWith(_ text: String) @@@targetField([StringField])
395
+ attribute @endsWith(_ text: String, _ message: String?) @@@targetField([StringField]) @@@validation
368
396
 
369
397
  /**
370
- * Validates a string field value ends with the given text.
398
+ * Validates a string field value contains the given text.
399
+ */
400
+ attribute @contains(_ text: String, _ message: String?) @@@targetField([StringField]) @@@validation
401
+
402
+ /**
403
+ * Validates a string field value matches a regex.
371
404
  */
372
- attribute @endsWith(_ text: String) @@@targetField([StringField])
405
+ attribute @regex(_ regex: String, _ message: String?) @@@targetField([StringField]) @@@validation
373
406
 
374
407
  /**
375
408
  * Validates a string field value is a valid email address.
376
409
  */
377
- attribute @email() @@@targetField([StringField])
410
+ attribute @email(_ message: String?) @@@targetField([StringField]) @@@validation
378
411
 
379
412
  /**
380
413
  * Validates a string field value is a valid ISO datetime.
381
414
  */
382
- attribute @datetime() @@@targetField([StringField])
415
+ attribute @datetime(_ message: String?) @@@targetField([StringField]) @@@validation
383
416
 
384
417
  /**
385
418
  * Validates a string field value is a valid url.
386
419
  */
387
- attribute @url() @@@targetField([StringField])
420
+ attribute @url(_ message: String?) @@@targetField([StringField]) @@@validation
388
421
 
389
422
  /**
390
423
  * Validates a number field is greater than the given value.
391
424
  */
392
- attribute @gt(_ value: Int) @@@targetField([IntField, FloatField, DecimalField])
425
+ attribute @gt(_ value: Int, _ message: String?) @@@targetField([IntField, FloatField, DecimalField]) @@@validation
393
426
 
394
427
  /**
395
428
  * Validates a number field is greater than or equal to the given value.
396
429
  */
397
- attribute @gte(_ value: Int) @@@targetField([IntField, FloatField, DecimalField])
430
+ attribute @gte(_ value: Int, _ message: String?) @@@targetField([IntField, FloatField, DecimalField]) @@@validation
398
431
 
399
432
  /**
400
433
  * Validates a number field is less than the given value.
401
434
  */
402
- attribute @lt(_ value: Int) @@@targetField([IntField, FloatField, DecimalField])
435
+ attribute @lt(_ value: Int, _ message: String?) @@@targetField([IntField, FloatField, DecimalField]) @@@validation
403
436
 
404
437
  /**
405
438
  * Validates a number field is less than or equal to the given value.
406
439
  */
407
- attribute @lte(_ value: Int) @@@targetField([IntField, FloatField, DecimalField])
440
+ attribute @lte(_ value: Int, _ message: String?) @@@targetField([IntField, FloatField, DecimalField]) @@@validation
441
+
442
+ /**
443
+ * Validates the entity with a complex condition.
444
+ */
445
+ attribute @@validate(_ value: Boolean, _ message: String?) @@@validation
446
+
447
+ /**
448
+ * Validates length of a string field.
449
+ */
450
+ function length(field: String, min: Int, max: Int?): Boolean {
451
+ } @@@expressionContext([ValidationRule])
452
+
453
+
454
+ /**
455
+ * Validates a string field value matches a regex.
456
+ */
457
+ function regex(field: String, regex: String): Boolean {
458
+ } @@@expressionContext([ValidationRule])
459
+
460
+ /**
461
+ * Validates a string field value is a valid email address.
462
+ */
463
+ function email(field: String): Boolean {
464
+ } @@@expressionContext([ValidationRule])
465
+
466
+ /**
467
+ * Validates a string field value is a valid ISO datetime.
468
+ */
469
+ function datetime(field: String): Boolean {
470
+ } @@@expressionContext([ValidationRule])
471
+
472
+ /**
473
+ * Validates a string field value is a valid url.
474
+ */
475
+ function url(field: String): Boolean {
476
+ } @@@expressionContext([ValidationRule])
477
+
478
+ //////////////////////////////////////////////
479
+ // End validation attributes and functions
480
+ //////////////////////////////////////////////
408
481
 
409
482
  /**
410
483
  * A utility attribute to allow passthrough of arbitrary attribute text to the generated Prisma schema.
@@ -1,23 +1,10 @@
1
- import { DataModel, DataModelAttribute, DataModelField, Expression, Model, ModelImport } from '@zenstackhq/language/ast';
1
+ import { DataModel, DataModelField, Expression, Model, ModelImport } from '@zenstackhq/language/ast';
2
2
  import { AstNode, LangiumDocuments } from 'langium';
3
3
  import { URI } from 'vscode-uri';
4
4
  export declare function extractDataModelsWithAllowRules(model: Model): DataModel[];
5
- export declare function analyzePolicies(dataModel: DataModel): {
6
- allows: DataModelAttribute[];
7
- denies: DataModelAttribute[];
8
- create: boolean | undefined;
9
- read: boolean | undefined;
10
- update: boolean | undefined;
11
- delete: boolean | undefined;
12
- allowAll: boolean;
13
- denyAll: boolean;
14
- hasFieldValidation: boolean;
15
- };
16
5
  export declare function mergeBaseModel(model: Model): void;
17
- export declare const VALIDATION_ATTRIBUTES: string[];
18
6
  export declare function getIdFields(dataModel: DataModel): DataModelField[];
19
7
  export declare function isAuthInvocation(node: AstNode): boolean;
20
- export declare function isEnumFieldReference(expr: Expression): boolean;
21
8
  export declare function getDataModelFieldReference(expr: Expression): DataModelField | undefined;
22
9
  export declare function resolveImportUri(imp: ModelImport): URI | undefined;
23
10
  export declare function resolveTransitiveImports(documents: LangiumDocuments, model: Model): Model[];
@@ -1,8 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getAllDeclarationsFromImports = exports.resolveImport = exports.resolveTransitiveImports = exports.resolveImportUri = exports.getDataModelFieldReference = exports.isEnumFieldReference = exports.isAuthInvocation = exports.getIdFields = exports.VALIDATION_ATTRIBUTES = exports.mergeBaseModel = exports.analyzePolicies = exports.extractDataModelsWithAllowRules = void 0;
3
+ exports.getAllDeclarationsFromImports = exports.resolveImport = exports.resolveTransitiveImports = exports.resolveImportUri = exports.getDataModelFieldReference = exports.isAuthInvocation = exports.getIdFields = exports.mergeBaseModel = exports.extractDataModelsWithAllowRules = void 0;
4
4
  const ast_1 = require("@zenstackhq/language/ast");
5
- const sdk_1 = require("@zenstackhq/sdk");
6
5
  const langium_1 = require("langium");
7
6
  const vscode_uri_1 = require("vscode-uri");
8
7
  const utils_1 = require("../language-server/utils");
@@ -10,27 +9,6 @@ function extractDataModelsWithAllowRules(model) {
10
9
  return model.declarations.filter((d) => (0, ast_1.isDataModel)(d) && d.attributes.some((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@@allow'; }));
11
10
  }
12
11
  exports.extractDataModelsWithAllowRules = extractDataModelsWithAllowRules;
13
- function analyzePolicies(dataModel) {
14
- const allows = dataModel.attributes.filter((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@@allow'; });
15
- const denies = dataModel.attributes.filter((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@@deny'; });
16
- const create = toStaticPolicy('create', allows, denies);
17
- const read = toStaticPolicy('read', allows, denies);
18
- const update = toStaticPolicy('update', allows, denies);
19
- const del = toStaticPolicy('delete', allows, denies);
20
- const hasFieldValidation = dataModel.$resolvedFields.some((field) => field.attributes.some((attr) => exports.VALIDATION_ATTRIBUTES.includes(attr.decl.$refText)));
21
- return {
22
- allows,
23
- denies,
24
- create,
25
- read,
26
- update,
27
- delete: del,
28
- allowAll: create === true && read === true && update === true && del === true,
29
- denyAll: create === false && read === false && update === false && del === false,
30
- hasFieldValidation,
31
- };
32
- }
33
- exports.analyzePolicies = analyzePolicies;
34
12
  function mergeBaseModel(model) {
35
13
  model.declarations
36
14
  .filter((x) => x.$type === 'DataModel')
@@ -58,50 +36,6 @@ function updateContainer(nodes, container) {
58
36
  return mutable;
59
37
  });
60
38
  }
61
- function toStaticPolicy(operation, allows, denies) {
62
- const filteredDenies = forOperation(operation, denies);
63
- if (filteredDenies.some((rule) => (0, sdk_1.getLiteral)(rule.args[1].value) === true)) {
64
- // any constant true deny rule
65
- return false;
66
- }
67
- const filteredAllows = forOperation(operation, allows);
68
- if (filteredAllows.length === 0) {
69
- // no allow rule
70
- return false;
71
- }
72
- if (filteredDenies.length === 0 &&
73
- filteredAllows.some((rule) => (0, sdk_1.getLiteral)(rule.args[1].value) === true)) {
74
- // any constant true allow rule
75
- return true;
76
- }
77
- return undefined;
78
- }
79
- function forOperation(operation, rules) {
80
- return rules.filter((rule) => {
81
- const ops = (0, sdk_1.getLiteral)(rule.args[0].value);
82
- if (!ops) {
83
- return false;
84
- }
85
- if (ops === 'all') {
86
- return true;
87
- }
88
- const splitOps = ops.split(',').map((p) => p.trim());
89
- return splitOps.includes(operation);
90
- });
91
- }
92
- exports.VALIDATION_ATTRIBUTES = [
93
- '@length',
94
- '@regex',
95
- '@startsWith',
96
- '@endsWith',
97
- '@email',
98
- '@url',
99
- '@datetime',
100
- '@gt',
101
- '@gte',
102
- '@lt',
103
- '@lte',
104
- ];
105
39
  function getIdFields(dataModel) {
106
40
  const fieldLevelId = dataModel.$resolvedFields.find((f) => f.attributes.some((attr) => attr.decl.$refText === '@id'));
107
41
  if (fieldLevelId) {
@@ -129,10 +63,6 @@ function isAuthInvocation(node) {
129
63
  return (0, ast_1.isInvocationExpr)(node) && ((_a = node.function.ref) === null || _a === void 0 ? void 0 : _a.name) === 'auth' && (0, utils_1.isFromStdlib)(node.function.ref);
130
64
  }
131
65
  exports.isAuthInvocation = isAuthInvocation;
132
- function isEnumFieldReference(expr) {
133
- return (0, ast_1.isReferenceExpr)(expr) && (0, ast_1.isEnumField)(expr.target.ref);
134
- }
135
- exports.isEnumFieldReference = isEnumFieldReference;
136
66
  function getDataModelFieldReference(expr) {
137
67
  if ((0, ast_1.isReferenceExpr)(expr) && (0, ast_1.isDataModelField)(expr.target.ref)) {
138
68
  return expr.target.ref;
@@ -1 +1 @@
1
- {"version":3,"file":"ast-utils.js","sourceRoot":"","sources":["../../src/utils/ast-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ast-utils.js","sourceRoot":"","sources":["../../src/utils/ast-utils.ts"],"names":[],"mappings":";;;AAAA,kDAckC;AAClC,qCAA0E;AAC1E,2CAAwC;AACxC,oDAAwD;AAExD,SAAgB,+BAA+B,CAAC,KAAY;IACxD,OAAO,KAAK,CAAC,YAAY,CAAC,MAAM,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,iBAAW,EAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,WAAC,OAAA,CAAA,MAAA,IAAI,CAAC,IAAI,CAAC,GAAG,0CAAE,IAAI,MAAK,SAAS,CAAA,EAAA,CAAC,CAC3E,CAAC;AACrB,CAAC;AAJD,0EAIC;AAED,SAAgB,cAAc,CAAC,KAAY;IACvC,KAAK,CAAC,YAAY;SACb,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC;SACtC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACd,MAAM,SAAS,GAAG,IAAiB,CAAC;QAEpC,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU;YACnC,oEAAoE;aACnE,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,GAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;aACzE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAE9B,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU;YACvC,oEAAoE;aACnE,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,GAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;aAC7E,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEP,yBAAyB;IACzB,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,WAAW,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AACrG,CAAC;AAnBD,wCAmBC;AAED,SAAS,eAAe,CAAoB,KAAU,EAAE,SAAkB;IACtE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACtB,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,UAAwB,CAAC;QACzC,mBAAmB;QACnB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;QAC/B,OAAO,OAAO,CAAC;IACnB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,WAAW,CAAC,SAAoB;IAC5C,MAAM,YAAY,GAAG,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACtD,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,CAC5D,CAAC;IACF,IAAI,YAAY,EAAE;QACd,OAAO,CAAC,YAAY,CAAC,CAAC;KACzB;SAAM;QACH,iCAAiC;QACjC,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,eAAC,OAAA,CAAA,MAAA,MAAA,IAAI,CAAC,IAAI,0CAAE,GAAG,0CAAE,IAAI,MAAK,MAAM,CAAA,EAAA,CAAC,CAAC;QACzF,IAAI,WAAW,EAAE;YACb,kEAAkE;YAClE,IAAI,CAAC,IAAA,iBAAW,EAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;gBACzC,OAAO,EAAE,CAAC;aACb;YACD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAC3C,OAAO,QAAQ,CAAC,KAAK;iBAChB,MAAM,CAAC,CAAC,IAAI,EAAyB,EAAE,CAAC,IAAA,qBAAe,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC;iBACpG,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAqB,CAAC,CAAC;SACzD;KACJ;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AArBD,kCAqBC;AAED,SAAgB,gBAAgB,CAAC,IAAa;;IAC1C,OAAO,IAAA,sBAAgB,EAAC,IAAI,CAAC,IAAI,CAAA,MAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,0CAAE,IAAI,MAAK,MAAM,IAAI,IAAA,oBAAY,EAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC3G,CAAC;AAFD,4CAEC;AAED,SAAgB,0BAA0B,CAAC,IAAgB;IACvD,IAAI,IAAA,qBAAe,EAAC,IAAI,CAAC,IAAI,IAAA,sBAAgB,EAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;QAC5D,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;KAC1B;SAAM,IAAI,IAAA,wBAAkB,EAAC,IAAI,CAAC,IAAI,IAAA,sBAAgB,EAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;QACtE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;KAC1B;SAAM;QACH,OAAO,SAAS,CAAC;KACpB;AACL,CAAC;AARD,gEAQC;AAED,SAAgB,gBAAgB,CAAC,GAAgB;IAC7C,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QACjD,OAAO,SAAS,CAAC;KACpB;IACD,MAAM,MAAM,GAAG,kBAAK,CAAC,OAAO,CAAC,IAAA,qBAAW,EAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC;IAC3B,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;QAClC,WAAW,IAAI,SAAS,CAAC;KAC5B;IACD,OAAO,kBAAK,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAClD,CAAC;AAVD,4CAUC;AAED,SAAgB,wBAAwB,CAAC,SAA2B,EAAE,KAAY;IAC9E,OAAO,gCAAgC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAC9D,CAAC;AAFD,4DAEC;AAED,SAAS,gCAAgC,CACrC,SAA2B,EAC3B,KAAY,EACZ,YAAY,GAAG,KAAK,EACpB,UAAoB,IAAI,GAAG,EAAE,EAC7B,SAAqB,IAAI,GAAG,EAAE;IAE9B,MAAM,GAAG,GAAG,IAAA,qBAAW,EAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,YAAY,KAAK,KAAK,EAAE;QACxB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KACrB;IACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrB,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE;YAC7B,MAAM,aAAa,GAAG,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YACpD,IAAI,aAAa,EAAE;gBACf,gCAAgC,CAAC,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;aAC7F;SACJ;KACJ;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED,SAAgB,aAAa,CAAC,SAA2B,EAAE,GAAgB;IACvE,MAAM,WAAW,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI;QACA,IAAI,WAAW,EAAE;YACb,MAAM,gBAAgB,GAAG,SAAS,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;YACpE,MAAM,IAAI,GAAG,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC;YAChD,IAAI,IAAA,aAAO,EAAC,IAAI,CAAC,EAAE;gBACf,OAAO,IAAI,CAAC;aACf;SACJ;KACJ;IAAC,WAAM;QACJ,OAAO;KACV;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAdD,sCAcC;AAED,SAAgB,6BAA6B,CAAC,SAA2B,EAAE,KAAY;IACnF,MAAM,OAAO,GAAG,wBAAwB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;AAChF,CAAC;AAHD,sEAGC"}
@@ -0,0 +1,53 @@
1
+ import { Expression } from '@zenstackhq/language/ast';
2
+ import { ExpressionContext } from '@zenstackhq/sdk';
3
+ export declare class TypeScriptExpressionTransformerError extends Error {
4
+ constructor(message: string);
5
+ }
6
+ declare type Options = {
7
+ isPostGuard?: boolean;
8
+ fieldReferenceContext?: string;
9
+ context: ExpressionContext;
10
+ };
11
+ /**
12
+ * Transforms ZModel expression to plain TypeScript expression.
13
+ */
14
+ export declare class TypeScriptExpressionTransformer {
15
+ private readonly options?;
16
+ /**
17
+ * Constructs a new TypeScriptExpressionTransformer.
18
+ *
19
+ * @param isPostGuard indicates if we're writing for post-update conditions
20
+ */
21
+ constructor(options?: Options | undefined);
22
+ /**
23
+ * Transforms the given expression to a TypeScript expression.
24
+ * @param normalizeUndefined if undefined values should be normalized to null
25
+ * @returns
26
+ */
27
+ transform(expr: Expression, normalizeUndefined?: boolean): string;
28
+ private this;
29
+ private memberAccess;
30
+ private invocation;
31
+ private _auth;
32
+ private _now;
33
+ private _length;
34
+ private _contains;
35
+ private _startsWith;
36
+ private _endsWith;
37
+ private _regex;
38
+ private _email;
39
+ private _datetime;
40
+ private _url;
41
+ private _has;
42
+ private _hasEvery;
43
+ private _hasSome;
44
+ private _isEmpty;
45
+ private ensureBoolean;
46
+ private reference;
47
+ private null;
48
+ private array;
49
+ private literal;
50
+ private unary;
51
+ private binary;
52
+ }
53
+ export {};