zenstack 0.6.0-pre.9 → 1.0.0-alpha.100

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 (161) hide show
  1. package/README.md +111 -10
  2. package/cli/cli-error.d.ts +5 -0
  3. package/cli/cli-error.js +10 -0
  4. package/cli/cli-error.js.map +1 -0
  5. package/cli/cli-util.d.ts +21 -0
  6. package/cli/cli-util.js +239 -0
  7. package/cli/cli-util.js.map +1 -0
  8. package/cli/config.d.ts +19 -0
  9. package/cli/config.js +41 -0
  10. package/cli/config.js.map +1 -0
  11. package/cli/index.d.ts +16 -0
  12. package/cli/index.js +143 -6524
  13. package/cli/index.js.map +1 -0
  14. package/cli/plugin-runner.d.ts +14 -0
  15. package/cli/plugin-runner.js +146 -0
  16. package/cli/plugin-runner.js.map +1 -0
  17. package/constants.d.ts +1 -0
  18. package/constants.js +6 -0
  19. package/constants.js.map +1 -0
  20. package/language-server/constants.d.ts +26 -0
  21. package/language-server/constants.js +40 -0
  22. package/language-server/constants.js.map +1 -0
  23. package/language-server/main.d.ts +1 -0
  24. package/language-server/main.js +13 -6436
  25. package/language-server/main.js.map +1 -0
  26. package/language-server/types.d.ts +10 -0
  27. package/language-server/types.js +3 -0
  28. package/language-server/types.js.map +1 -0
  29. package/language-server/utils.d.ts +18 -0
  30. package/language-server/utils.js +58 -0
  31. package/language-server/utils.js.map +1 -0
  32. package/language-server/validator/attribute-validator.d.ts +9 -0
  33. package/language-server/validator/attribute-validator.js +11 -0
  34. package/language-server/validator/attribute-validator.js.map +1 -0
  35. package/language-server/validator/datamodel-validator.d.ts +15 -0
  36. package/language-server/validator/datamodel-validator.js +280 -0
  37. package/language-server/validator/datamodel-validator.js.map +1 -0
  38. package/language-server/validator/datasource-validator.d.ts +12 -0
  39. package/language-server/validator/datasource-validator.js +66 -0
  40. package/language-server/validator/datasource-validator.js.map +1 -0
  41. package/language-server/validator/enum-validator.d.ts +11 -0
  42. package/language-server/validator/enum-validator.js +28 -0
  43. package/language-server/validator/enum-validator.js.map +1 -0
  44. package/language-server/validator/expression-validator.d.ts +11 -0
  45. package/language-server/validator/expression-validator.js +57 -0
  46. package/language-server/validator/expression-validator.js.map +1 -0
  47. package/language-server/validator/function-invocation-validator.d.ts +11 -0
  48. package/language-server/validator/function-invocation-validator.js +110 -0
  49. package/language-server/validator/function-invocation-validator.js.map +1 -0
  50. package/language-server/validator/schema-validator.d.ts +10 -0
  51. package/language-server/validator/schema-validator.js +29 -0
  52. package/language-server/validator/schema-validator.js.map +1 -0
  53. package/language-server/validator/utils.d.ts +25 -0
  54. package/language-server/validator/utils.js +261 -0
  55. package/language-server/validator/utils.js.map +1 -0
  56. package/language-server/validator/zmodel-validator.d.ts +22 -0
  57. package/language-server/validator/zmodel-validator.js +74 -0
  58. package/language-server/validator/zmodel-validator.js.map +1 -0
  59. package/language-server/zmodel-code-action.d.ts +14 -0
  60. package/language-server/zmodel-code-action.js +109 -0
  61. package/language-server/zmodel-code-action.js.map +1 -0
  62. package/language-server/zmodel-formatter.d.ts +9 -0
  63. package/language-server/zmodel-formatter.js +76 -0
  64. package/language-server/zmodel-formatter.js.map +1 -0
  65. package/language-server/zmodel-linker.d.ts +30 -0
  66. package/language-server/zmodel-linker.js +375 -0
  67. package/language-server/zmodel-linker.js.map +1 -0
  68. package/language-server/zmodel-module.d.ts +41 -0
  69. package/language-server/zmodel-module.js +80 -0
  70. package/language-server/zmodel-module.js.map +1 -0
  71. package/language-server/zmodel-scope.d.ts +10 -0
  72. package/language-server/zmodel-scope.js +44 -0
  73. package/language-server/zmodel-scope.js.map +1 -0
  74. package/language-server/zmodel-workspace-manager.d.ts +12 -0
  75. package/language-server/zmodel-workspace-manager.js +138 -0
  76. package/language-server/zmodel-workspace-manager.js.map +1 -0
  77. package/package.json +31 -23
  78. package/plugins/access-policy/expression-writer.d.ts +41 -0
  79. package/plugins/access-policy/expression-writer.js +475 -0
  80. package/plugins/access-policy/expression-writer.js.map +1 -0
  81. package/plugins/access-policy/index.d.ts +4 -0
  82. package/plugins/access-policy/index.js +24 -0
  83. package/plugins/access-policy/index.js.map +1 -0
  84. package/plugins/access-policy/policy-guard-generator.d.ts +15 -0
  85. package/plugins/access-policy/policy-guard-generator.js +350 -0
  86. package/plugins/access-policy/policy-guard-generator.js.map +1 -0
  87. package/plugins/access-policy/typescript-expression-transformer.d.ts +28 -0
  88. package/plugins/access-policy/typescript-expression-transformer.js +121 -0
  89. package/plugins/access-policy/typescript-expression-transformer.js.map +1 -0
  90. package/plugins/access-policy/utils.d.ts +5 -0
  91. package/plugins/access-policy/utils.js +14 -0
  92. package/plugins/access-policy/utils.js.map +1 -0
  93. package/plugins/access-policy/zod-schema-generator.d.ts +12 -0
  94. package/plugins/access-policy/zod-schema-generator.js +157 -0
  95. package/plugins/access-policy/zod-schema-generator.js.map +1 -0
  96. package/plugins/model-meta/index.d.ts +4 -0
  97. package/plugins/model-meta/index.js +172 -0
  98. package/plugins/model-meta/index.js.map +1 -0
  99. package/plugins/plugin-utils.d.ts +15 -0
  100. package/plugins/plugin-utils.js +53 -0
  101. package/plugins/plugin-utils.js.map +1 -0
  102. package/plugins/prisma/indent-string.d.ts +4 -0
  103. package/plugins/prisma/indent-string.js +12 -0
  104. package/plugins/prisma/indent-string.js.map +1 -0
  105. package/plugins/prisma/index.d.ts +5 -0
  106. package/plugins/prisma/index.js +24 -3740
  107. package/plugins/prisma/index.js.map +1 -0
  108. package/plugins/prisma/prisma-builder.d.ts +152 -0
  109. package/plugins/prisma/prisma-builder.js +363 -0
  110. package/plugins/prisma/prisma-builder.js.map +1 -0
  111. package/plugins/prisma/schema-generator.d.ts +25 -0
  112. package/plugins/prisma/schema-generator.js +306 -0
  113. package/plugins/prisma/schema-generator.js.map +1 -0
  114. package/plugins/prisma/zmodel-code-generator.d.ts +30 -0
  115. package/plugins/prisma/zmodel-code-generator.js +122 -0
  116. package/plugins/prisma/zmodel-code-generator.js.map +1 -0
  117. package/plugins/zod/generator.d.ts +4 -0
  118. package/plugins/zod/generator.js +102 -0
  119. package/plugins/zod/generator.js.map +1 -0
  120. package/plugins/zod/index.d.ts +5 -0
  121. package/plugins/zod/index.js +21 -4808
  122. package/plugins/zod/index.js.map +1 -0
  123. package/plugins/zod/transformer.d.ts +67 -0
  124. package/plugins/zod/transformer.js +452 -0
  125. package/plugins/zod/transformer.js.map +1 -0
  126. package/plugins/zod/types.d.ts +22 -0
  127. package/plugins/zod/types.js +3 -0
  128. package/plugins/zod/types.js.map +1 -0
  129. package/plugins/zod/utils/removeDir.d.ts +1 -0
  130. package/plugins/zod/utils/removeDir.js +30 -0
  131. package/plugins/zod/utils/removeDir.js.map +1 -0
  132. package/res/prism-zmodel.js +2 -4
  133. package/res/starter.zmodel +51 -0
  134. package/res/stdlib.zmodel +194 -8
  135. package/telemetry.d.ts +20 -0
  136. package/telemetry.js +127 -0
  137. package/telemetry.js.map +1 -0
  138. package/types.d.ts +12 -0
  139. package/types.js +3 -0
  140. package/types.js.map +1 -0
  141. package/utils/ast-utils.d.ts +5 -0
  142. package/utils/ast-utils.js +49 -0
  143. package/utils/ast-utils.js.map +1 -0
  144. package/utils/exec-utils.d.ts +6 -0
  145. package/utils/exec-utils.js +13 -0
  146. package/utils/exec-utils.js.map +1 -0
  147. package/utils/pkg-utils.d.ts +3 -0
  148. package/utils/pkg-utils.js +64 -0
  149. package/utils/pkg-utils.js.map +1 -0
  150. package/utils/version-utils.d.ts +1 -0
  151. package/utils/version-utils.js +14 -0
  152. package/utils/version-utils.js.map +1 -0
  153. package/asset/logo-256-bg.png +0 -0
  154. package/asset/logo-dark-256.png +0 -0
  155. package/asset/logo-light-256.png +0 -0
  156. package/extension.js +0 -39
  157. package/plugins/policy-guard/index.js +0 -4289
  158. package/plugins/react-hooks/index.js +0 -4318
  159. package/plugins/trpc/index.js +0 -5386
  160. package/res/package.template.json +0 -9
  161. package/res/tsconfig.template.json +0 -17
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const ast_1 = require("@zenstackhq/language/ast");
4
+ const ast_utils_1 = require("../../utils/ast-utils");
5
+ /**
6
+ * Validates expressions.
7
+ */
8
+ class ExpressionValidator {
9
+ validate(expr, accept) {
10
+ // deal with a few cases where reference resolution fail silently
11
+ if (!expr.$resolvedType) {
12
+ if ((0, ast_utils_1.isAuthInvocation)(expr)) {
13
+ // check was done at link time
14
+ accept('error', 'auth() cannot be resolved because no "User" model is defined', { node: expr });
15
+ }
16
+ else if (this.isCollectionPredicate(expr)) {
17
+ accept('error', 'collection predicate can only be used on an array of model type', { node: expr });
18
+ }
19
+ else {
20
+ accept('error', 'expression cannot be resolved', {
21
+ node: expr,
22
+ });
23
+ }
24
+ }
25
+ // extra validations by expression type
26
+ switch (expr.$type) {
27
+ case 'BinaryExpr':
28
+ this.validateBinaryExpr(expr, accept);
29
+ break;
30
+ }
31
+ }
32
+ validateBinaryExpr(expr, accept) {
33
+ var _a, _b;
34
+ switch (expr.operator) {
35
+ case 'in': {
36
+ if (!(0, ast_utils_1.getDataModelFieldReference)(expr.left)) {
37
+ accept('error', 'left operand of "in" must be a field reference', { node: expr.left });
38
+ }
39
+ if (typeof ((_a = expr.left.$resolvedType) === null || _a === void 0 ? void 0 : _a.decl) !== 'string' && !(0, ast_1.isEnum)((_b = expr.left.$resolvedType) === null || _b === void 0 ? void 0 : _b.decl)) {
40
+ accept('error', 'left operand of "in" must be of scalar type', { node: expr.left });
41
+ }
42
+ if (!((0, ast_1.isArrayExpr)(expr.right) &&
43
+ expr.right.items.every((item) => (0, ast_1.isLiteralExpr)(item) || (0, ast_utils_1.isEnumFieldReference)(item)))) {
44
+ accept('error', 'right operand of "in" must be an array of literals or enum values', {
45
+ node: expr.right,
46
+ });
47
+ }
48
+ break;
49
+ }
50
+ }
51
+ }
52
+ isCollectionPredicate(expr) {
53
+ return (0, ast_1.isBinaryExpr)(expr) && ['?', '!', '^'].includes(expr.operator);
54
+ }
55
+ }
56
+ exports.default = ExpressionValidator;
57
+ //# sourceMappingURL=expression-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-validator.js","sourceRoot":"","sources":["../../../src/language-server/validator/expression-validator.ts"],"names":[],"mappings":";;AAAA,kDAAoH;AAEpH,qDAA2G;AAG3G;;GAEG;AACH,MAAqB,mBAAmB;IACpC,QAAQ,CAAC,IAAgB,EAAE,MAA0B;QACjD,iEAAiE;QACjE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACrB,IAAI,IAAA,4BAAgB,EAAC,IAAI,CAAC,EAAE;gBACxB,8BAA8B;gBAC9B,MAAM,CAAC,OAAO,EAAE,8DAA8D,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;aACnG;iBAAM,IAAI,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE;gBACzC,MAAM,CAAC,OAAO,EAAE,iEAAiE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;aACtG;iBAAM;gBACH,MAAM,CAAC,OAAO,EAAE,+BAA+B,EAAE;oBAC7C,IAAI,EAAE,IAAI;iBACb,CAAC,CAAC;aACN;SACJ;QAED,uCAAuC;QACvC,QAAQ,IAAI,CAAC,KAAK,EAAE;YAChB,KAAK,YAAY;gBACb,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACtC,MAAM;SACb;IACL,CAAC;IAEO,kBAAkB,CAAC,IAAgB,EAAE,MAA0B;;QACnE,QAAQ,IAAI,CAAC,QAAQ,EAAE;YACnB,KAAK,IAAI,CAAC,CAAC;gBACP,IAAI,CAAC,IAAA,sCAA0B,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBACxC,MAAM,CAAC,OAAO,EAAE,gDAAgD,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;iBAC1F;gBAED,IAAI,OAAO,CAAA,MAAA,IAAI,CAAC,IAAI,CAAC,aAAa,0CAAE,IAAI,CAAA,KAAK,QAAQ,IAAI,CAAC,IAAA,YAAM,EAAC,MAAA,IAAI,CAAC,IAAI,CAAC,aAAa,0CAAE,IAAI,CAAC,EAAE;oBAC7F,MAAM,CAAC,OAAO,EAAE,6CAA6C,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;iBACvF;gBAED,IACI,CAAC,CACG,IAAA,iBAAW,EAAC,IAAI,CAAC,KAAK,CAAC;oBACvB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,mBAAa,EAAC,IAAI,CAAC,IAAI,IAAA,gCAAoB,EAAC,IAAI,CAAC,CAAC,CACtF,EACH;oBACE,MAAM,CAAC,OAAO,EAAE,mEAAmE,EAAE;wBACjF,IAAI,EAAE,IAAI,CAAC,KAAK;qBACnB,CAAC,CAAC;iBACN;gBACD,MAAM;aACT;SACJ;IACL,CAAC;IAEO,qBAAqB,CAAC,IAAgB;QAC1C,OAAO,IAAA,kBAAY,EAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzE,CAAC;CACJ;AArDD,sCAqDC"}
@@ -0,0 +1,11 @@
1
+ import { Expression, InvocationExpr } from '@zenstackhq/language/ast';
2
+ import { ValidationAcceptor } from 'langium';
3
+ import { AstValidator } from '../types';
4
+ /**
5
+ * InvocationExpr validation
6
+ */
7
+ export default class FunctionInvocationValidator implements AstValidator<Expression> {
8
+ validate(expr: InvocationExpr, accept: ValidationAcceptor): void;
9
+ private validateArgs;
10
+ private validateInvocationArg;
11
+ }
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const ast_1 = require("@zenstackhq/language/ast");
4
+ const ast_utils_1 = require("../../utils/ast-utils");
5
+ const constants_1 = require("../constants");
6
+ const utils_1 = require("../utils");
7
+ const utils_2 = require("./utils");
8
+ /**
9
+ * InvocationExpr validation
10
+ */
11
+ class FunctionInvocationValidator {
12
+ validate(expr, accept) {
13
+ var _a, _b, _c, _d;
14
+ const funcDecl = expr.function.ref;
15
+ if (!funcDecl) {
16
+ accept('error', 'function cannot be resolved', { node: expr });
17
+ return;
18
+ }
19
+ if (!this.validateArgs(funcDecl, expr.args, accept)) {
20
+ return;
21
+ }
22
+ if ((0, utils_1.isFromStdlib)(funcDecl)) {
23
+ // validate standard library functions
24
+ if (constants_1.FILTER_OPERATOR_FUNCTIONS.includes(funcDecl.name)) {
25
+ // filter operation functions
26
+ // first argument must refer to a model field
27
+ const firstArg = (_b = (_a = expr.args) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.value;
28
+ if (firstArg) {
29
+ if (!(0, ast_utils_1.getDataModelFieldReference)(firstArg)) {
30
+ accept('error', 'first argument must be a field reference', { node: firstArg });
31
+ }
32
+ }
33
+ // second argument must be a literal or array of literal
34
+ const secondArg = (_d = (_c = expr.args) === null || _c === void 0 ? void 0 : _c[1]) === null || _d === void 0 ? void 0 : _d.value;
35
+ if (secondArg &&
36
+ // literal
37
+ !(0, ast_1.isLiteralExpr)(secondArg) &&
38
+ // enum field
39
+ !(0, ast_utils_1.isEnumFieldReference)(secondArg) &&
40
+ // array of literal/enum
41
+ !((0, ast_1.isArrayExpr)(secondArg) &&
42
+ secondArg.items.every((item) => (0, ast_1.isLiteralExpr)(item) || (0, ast_utils_1.isEnumFieldReference)(item)))) {
43
+ accept('error', 'second argument must be a literal, an enum, or an array of them', {
44
+ node: secondArg,
45
+ });
46
+ }
47
+ }
48
+ }
49
+ }
50
+ validateArgs(funcDecl, args, accept) {
51
+ let success = true;
52
+ for (let i = 0; i < funcDecl.params.length; i++) {
53
+ const param = funcDecl.params[i];
54
+ const arg = args[i];
55
+ if (!arg) {
56
+ if (!param.optional) {
57
+ accept('error', `missing argument for parameter "${param.name}"`, { node: funcDecl });
58
+ success = false;
59
+ }
60
+ }
61
+ else {
62
+ if (!this.validateInvocationArg(arg, param, accept)) {
63
+ success = false;
64
+ }
65
+ }
66
+ }
67
+ // TODO: do we need to complain for extra arguments?
68
+ return success;
69
+ }
70
+ validateInvocationArg(arg, param, accept) {
71
+ var _a;
72
+ const argResolvedType = (_a = arg === null || arg === void 0 ? void 0 : arg.value) === null || _a === void 0 ? void 0 : _a.$resolvedType;
73
+ if (!argResolvedType) {
74
+ accept('error', 'argument type cannot be resolved', { node: arg });
75
+ return false;
76
+ }
77
+ const dstType = param.type.type;
78
+ if (!dstType) {
79
+ accept('error', 'parameter type cannot be resolved', { node: param });
80
+ return false;
81
+ }
82
+ const dstIsArray = param.type.array;
83
+ const dstRef = param.type.reference;
84
+ if (dstType === 'Any' && !dstIsArray) {
85
+ // scalar 'any' can be assigned with anything
86
+ return true;
87
+ }
88
+ if (typeof argResolvedType.decl === 'string') {
89
+ // scalar type
90
+ if (!(0, utils_2.typeAssignable)(dstType, argResolvedType.decl, arg.value) || dstIsArray !== argResolvedType.array) {
91
+ accept('error', `argument is not assignable to parameter`, {
92
+ node: arg,
93
+ });
94
+ return false;
95
+ }
96
+ }
97
+ else {
98
+ // enum or model type
99
+ if (((dstRef === null || dstRef === void 0 ? void 0 : dstRef.ref) !== argResolvedType.decl && dstType !== 'Any') || dstIsArray !== argResolvedType.array) {
100
+ accept('error', `argument is not assignable to parameter`, {
101
+ node: arg,
102
+ });
103
+ return false;
104
+ }
105
+ }
106
+ return true;
107
+ }
108
+ }
109
+ exports.default = FunctionInvocationValidator;
110
+ //# sourceMappingURL=function-invocation-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-invocation-validator.js","sourceRoot":"","sources":["../../../src/language-server/validator/function-invocation-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Model } from '@zenstackhq/language/ast';
2
+ import { AstValidator } from '../types';
3
+ import { ValidationAcceptor } from 'langium';
4
+ /**
5
+ * Validates toplevel schema.
6
+ */
7
+ export default class SchemaValidator implements AstValidator<Model> {
8
+ validate(model: Model, accept: ValidationAcceptor): void;
9
+ private validateDataSources;
10
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const constants_1 = require("../constants");
4
+ const ast_1 = require("@zenstackhq/language/ast");
5
+ const utils_1 = require("./utils");
6
+ /**
7
+ * Validates toplevel schema.
8
+ */
9
+ class SchemaValidator {
10
+ validate(model, accept) {
11
+ var _a, _b;
12
+ (0, utils_1.validateDuplicatedDeclarations)(model.declarations, accept);
13
+ if (!((_a = model.$document) === null || _a === void 0 ? void 0 : _a.uri.path.endsWith(constants_1.STD_LIB_MODULE_NAME)) &&
14
+ !((_b = model.$document) === null || _b === void 0 ? void 0 : _b.uri.path.endsWith(constants_1.PLUGIN_MODULE_NAME))) {
15
+ this.validateDataSources(model, accept);
16
+ }
17
+ }
18
+ validateDataSources(model, accept) {
19
+ const dataSources = model.declarations.filter((d) => (0, ast_1.isDataSource)(d));
20
+ if (dataSources.length === 0) {
21
+ accept('error', 'Model must define a datasource', { node: model });
22
+ }
23
+ else if (dataSources.length > 1) {
24
+ accept('error', 'Multiple datasource declarations are not allowed', { node: dataSources[1] });
25
+ }
26
+ }
27
+ }
28
+ exports.default = SchemaValidator;
29
+ //# sourceMappingURL=schema-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../../../src/language-server/validator/schema-validator.ts"],"names":[],"mappings":";;AAAA,4CAAuE;AACvE,kDAA+D;AAG/D,mCAAyD;AAEzD;;GAEG;AACH,MAAqB,eAAe;IAChC,QAAQ,CAAC,KAAY,EAAE,MAA0B;;QAC7C,IAAA,sCAA8B,EAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAE3D,IACI,CAAC,CAAA,MAAA,KAAK,CAAC,SAAS,0CAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,+BAAmB,CAAC,CAAA;YACxD,CAAC,CAAA,MAAA,KAAK,CAAC,SAAS,0CAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,8BAAkB,CAAC,CAAA,EACzD;YACE,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;SAC3C;IACL,CAAC;IAEO,mBAAmB,CAAC,KAAY,EAAE,MAA0B;QAChE,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,kBAAY,EAAC,CAAC,CAAC,CAAC,CAAC;QACtE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1B,MAAM,CAAC,OAAO,EAAE,gCAAgC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;SACtE;aAAM,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/B,MAAM,CAAC,OAAO,EAAE,kDAAkD,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACjG;IACL,CAAC;CACJ;AApBD,kCAoBC"}
@@ -0,0 +1,25 @@
1
+ import { AttributeArg, AttributeParam, BuiltinType, DataModelAttribute, DataModelFieldAttribute, Expression, ExpressionType } from '@zenstackhq/language/ast';
2
+ import { AstNode, ValidationAcceptor } from 'langium';
3
+ /**
4
+ * Checks if the given declarations have duplicated names
5
+ */
6
+ export declare function validateDuplicatedDeclarations(decls: Array<AstNode & {
7
+ name: string;
8
+ }>, accept: ValidationAcceptor): void;
9
+ /**
10
+ * Try getting string value from a potential string literal expression
11
+ */
12
+ export declare function getStringLiteral(node: AstNode | undefined): string | undefined;
13
+ /**
14
+ * Determines if the given sourceType is assignable to a destination of destType
15
+ */
16
+ export declare function typeAssignable(destType: ExpressionType, sourceType: ExpressionType, sourceExpr?: Expression): boolean;
17
+ /**
18
+ * Maps a ZModel builtin type to expression type
19
+ */
20
+ export declare function mapBuiltinTypeToExpressionType(type: BuiltinType | 'Any' | 'Object' | 'Null'): ExpressionType | 'Any';
21
+ /**
22
+ * Determines if the given attribute argument is assignable to the given attribute parameter
23
+ */
24
+ export declare function assignableToAttributeParam(arg: AttributeArg, param: AttributeParam, attr: DataModelAttribute | DataModelFieldAttribute): boolean;
25
+ export declare function validateAttributeApplication(attr: DataModelAttribute | DataModelFieldAttribute, accept: ValidationAcceptor): boolean | undefined;
@@ -0,0 +1,261 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.validateAttributeApplication = exports.assignableToAttributeParam = exports.mapBuiltinTypeToExpressionType = exports.typeAssignable = exports.getStringLiteral = exports.validateDuplicatedDeclarations = void 0;
7
+ const ast_1 = require("@zenstackhq/language/ast");
8
+ const sdk_1 = require("@zenstackhq/sdk");
9
+ const pluralize_1 = __importDefault(require("pluralize"));
10
+ /**
11
+ * Checks if the given declarations have duplicated names
12
+ */
13
+ function validateDuplicatedDeclarations(decls, accept) {
14
+ const groupByName = decls.reduce((group, decl) => {
15
+ var _a;
16
+ group[decl.name] = (_a = group[decl.name]) !== null && _a !== void 0 ? _a : [];
17
+ group[decl.name].push(decl);
18
+ return group;
19
+ }, {});
20
+ for (const [name, decls] of Object.entries(groupByName)) {
21
+ if (decls.length > 1) {
22
+ accept('error', `Duplicated declaration name "${name}"`, {
23
+ node: decls[1],
24
+ });
25
+ }
26
+ }
27
+ }
28
+ exports.validateDuplicatedDeclarations = validateDuplicatedDeclarations;
29
+ /**
30
+ * Try getting string value from a potential string literal expression
31
+ */
32
+ function getStringLiteral(node) {
33
+ if ((0, ast_1.isLiteralExpr)(node) && typeof node.value === 'string') {
34
+ return node.value;
35
+ }
36
+ else {
37
+ return undefined;
38
+ }
39
+ }
40
+ exports.getStringLiteral = getStringLiteral;
41
+ const isoDateTimeRegex = /^\d{4}(-\d\d(-\d\d(T\d\d:\d\d(:\d\d)?(\.\d+)?(([+-]\d\d:\d\d)|Z)?)?)?)?$/i;
42
+ /**
43
+ * Determines if the given sourceType is assignable to a destination of destType
44
+ */
45
+ function typeAssignable(destType, sourceType, sourceExpr) {
46
+ // implicit conversion from ISO datetime string to datetime
47
+ if (destType === 'DateTime' && sourceType === 'String' && sourceExpr && (0, ast_1.isLiteralExpr)(sourceExpr)) {
48
+ const literal = getStringLiteral(sourceExpr);
49
+ if (literal && isoDateTimeRegex.test(literal)) {
50
+ // implicitly convert to DateTime
51
+ sourceType = 'DateTime';
52
+ }
53
+ }
54
+ switch (destType) {
55
+ case 'Any':
56
+ return true;
57
+ case 'Float':
58
+ return sourceType === 'Any' || sourceType === 'Int' || sourceType === 'Float';
59
+ default:
60
+ return sourceType === 'Any' || sourceType === destType;
61
+ }
62
+ }
63
+ exports.typeAssignable = typeAssignable;
64
+ /**
65
+ * Maps a ZModel builtin type to expression type
66
+ */
67
+ function mapBuiltinTypeToExpressionType(type) {
68
+ switch (type) {
69
+ case 'Any':
70
+ case 'Boolean':
71
+ case 'String':
72
+ case 'DateTime':
73
+ case 'Int':
74
+ case 'Float':
75
+ case 'Null':
76
+ return type;
77
+ case 'BigInt':
78
+ return 'Int';
79
+ case 'Decimal':
80
+ return 'Float';
81
+ case 'Json':
82
+ case 'Bytes':
83
+ return 'Any';
84
+ case 'Object':
85
+ return 'Object';
86
+ }
87
+ }
88
+ exports.mapBuiltinTypeToExpressionType = mapBuiltinTypeToExpressionType;
89
+ /**
90
+ * Determines if the given attribute argument is assignable to the given attribute parameter
91
+ */
92
+ function assignableToAttributeParam(arg, param, attr) {
93
+ var _a, _b, _c, _d;
94
+ const argResolvedType = arg.$resolvedType;
95
+ if (!argResolvedType) {
96
+ return false;
97
+ }
98
+ let dstType = param.type.type;
99
+ let dstIsArray = param.type.array;
100
+ const dstRef = param.type.reference;
101
+ if (dstType === 'Any' && !dstIsArray) {
102
+ return true;
103
+ }
104
+ // destination is field reference or transitive field reference, check if
105
+ // argument is reference or array or reference
106
+ if (dstType === 'FieldReference' || dstType === 'TransitiveFieldReference') {
107
+ if (dstIsArray) {
108
+ return ((0, ast_1.isArrayExpr)(arg.value) &&
109
+ !arg.value.items.find((item) => !(0, ast_1.isReferenceExpr)(item) || !(0, ast_1.isDataModelField)(item.target.ref)));
110
+ }
111
+ else {
112
+ return (0, ast_1.isReferenceExpr)(arg.value) && (0, ast_1.isDataModelField)(arg.value.target.ref);
113
+ }
114
+ }
115
+ if ((0, ast_1.isEnum)(argResolvedType.decl)) {
116
+ // enum type
117
+ let attrArgDeclType = dstRef === null || dstRef === void 0 ? void 0 : dstRef.ref;
118
+ if (dstType === 'ContextType' && (0, ast_1.isDataModelField)(attr.$container) && ((_b = (_a = attr.$container) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.reference)) {
119
+ // attribute parameter type is ContextType, need to infer type from
120
+ // the attribute's container
121
+ attrArgDeclType = (0, sdk_1.resolved)(attr.$container.type.reference);
122
+ dstIsArray = attr.$container.type.array;
123
+ }
124
+ return attrArgDeclType === argResolvedType.decl && dstIsArray === argResolvedType.array;
125
+ }
126
+ else if (dstType) {
127
+ // scalar type
128
+ if (typeof (argResolvedType === null || argResolvedType === void 0 ? void 0 : argResolvedType.decl) !== 'string') {
129
+ // destination type is not a reference, so argument type must be a plain expression
130
+ return false;
131
+ }
132
+ if (dstType === 'ContextType') {
133
+ // attribute parameter type is ContextType, need to infer type from
134
+ // the attribute's container
135
+ if ((0, ast_1.isDataModelField)(attr.$container)) {
136
+ if (!((_d = (_c = attr.$container) === null || _c === void 0 ? void 0 : _c.type) === null || _d === void 0 ? void 0 : _d.type)) {
137
+ return false;
138
+ }
139
+ dstType = mapBuiltinTypeToExpressionType(attr.$container.type.type);
140
+ dstIsArray = attr.$container.type.array;
141
+ }
142
+ else {
143
+ dstType = 'Any';
144
+ }
145
+ }
146
+ return typeAssignable(dstType, argResolvedType.decl, arg.value) && dstIsArray === argResolvedType.array;
147
+ }
148
+ else {
149
+ // reference type
150
+ return ((dstRef === null || dstRef === void 0 ? void 0 : dstRef.ref) === argResolvedType.decl || dstType === 'Any') && dstIsArray === argResolvedType.array;
151
+ }
152
+ }
153
+ exports.assignableToAttributeParam = assignableToAttributeParam;
154
+ function validateAttributeApplication(attr, accept) {
155
+ const decl = attr.decl.ref;
156
+ if (!decl) {
157
+ return;
158
+ }
159
+ const targetDecl = attr.$container;
160
+ if (decl.name === '@@@targetField' && !(0, ast_1.isAttribute)(targetDecl)) {
161
+ accept('error', `attribute "${decl.name}" can only be used on attribute declarations`, { node: attr });
162
+ return;
163
+ }
164
+ if ((0, ast_1.isDataModelField)(targetDecl) && !isValidAttributeTarget(decl, targetDecl)) {
165
+ accept('error', `attribute "${decl.name}" cannot be used on this type of field`, { node: attr });
166
+ }
167
+ const filledParams = new Set();
168
+ for (const arg of attr.args) {
169
+ let paramDecl;
170
+ if (!arg.name) {
171
+ paramDecl = decl.params.find((p) => p.default && !filledParams.has(p));
172
+ if (!paramDecl) {
173
+ accept('error', `Unexpected unnamed argument`, {
174
+ node: arg,
175
+ });
176
+ return false;
177
+ }
178
+ }
179
+ else {
180
+ paramDecl = decl.params.find((p) => p.name === arg.name);
181
+ if (!paramDecl) {
182
+ accept('error', `Attribute "${decl.name}" doesn't have a parameter named "${arg.name}"`, {
183
+ node: arg,
184
+ });
185
+ return false;
186
+ }
187
+ }
188
+ if (!assignableToAttributeParam(arg, paramDecl, attr)) {
189
+ accept('error', `Value is not assignable to parameter`, {
190
+ node: arg,
191
+ });
192
+ return false;
193
+ }
194
+ if (filledParams.has(paramDecl)) {
195
+ accept('error', `Parameter "${paramDecl.name}" is already provided`, { node: arg });
196
+ return false;
197
+ }
198
+ filledParams.add(paramDecl);
199
+ arg.$resolvedParam = paramDecl;
200
+ }
201
+ const missingParams = decl.params.filter((p) => !p.type.optional && !filledParams.has(p));
202
+ if (missingParams.length > 0) {
203
+ accept('error', `Required ${(0, pluralize_1.default)('parameter', missingParams.length)} not provided: ${missingParams
204
+ .map((p) => p.name)
205
+ .join(', ')}`, { node: attr });
206
+ return false;
207
+ }
208
+ return true;
209
+ }
210
+ exports.validateAttributeApplication = validateAttributeApplication;
211
+ function isValidAttributeTarget(attrDecl, targetDecl) {
212
+ var _a;
213
+ const targetField = attrDecl.attributes.find((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@@@targetField'; });
214
+ if (!targetField) {
215
+ // no field type constraint
216
+ return true;
217
+ }
218
+ const fieldTypes = targetField.args[0].value.items.map((item) => { var _a; return (_a = item.target.ref) === null || _a === void 0 ? void 0 : _a.name; });
219
+ let allowed = false;
220
+ for (const allowedType of fieldTypes) {
221
+ switch (allowedType) {
222
+ case 'StringField':
223
+ allowed = allowed || targetDecl.type.type === 'String';
224
+ break;
225
+ case 'IntField':
226
+ allowed = allowed || targetDecl.type.type === 'Int';
227
+ break;
228
+ case 'BigIntField':
229
+ allowed = allowed || targetDecl.type.type === 'BigInt';
230
+ break;
231
+ case 'FloatField':
232
+ allowed = allowed || targetDecl.type.type === 'Float';
233
+ break;
234
+ case 'DecimalField':
235
+ allowed = allowed || targetDecl.type.type === 'Decimal';
236
+ break;
237
+ case 'BooleanField':
238
+ allowed = allowed || targetDecl.type.type === 'Boolean';
239
+ break;
240
+ case 'DateTimeField':
241
+ allowed = allowed || targetDecl.type.type === 'DateTime';
242
+ break;
243
+ case 'JsonField':
244
+ allowed = allowed || targetDecl.type.type === 'Json';
245
+ break;
246
+ case 'BytesField':
247
+ allowed = allowed || targetDecl.type.type === 'Bytes';
248
+ break;
249
+ case 'ModelField':
250
+ allowed = allowed || (0, ast_1.isDataModel)((_a = targetDecl.type.reference) === null || _a === void 0 ? void 0 : _a.ref);
251
+ break;
252
+ default:
253
+ break;
254
+ }
255
+ if (allowed) {
256
+ break;
257
+ }
258
+ }
259
+ return allowed;
260
+ }
261
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/language-server/validator/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { ValidationAcceptor, ValidationRegistry } from 'langium';
2
+ import { Attribute, DataModel, DataSource, Enum, Expression, InvocationExpr, Model } from '@zenstackhq/language/ast';
3
+ import type { ZModelServices } from '../zmodel-module';
4
+ /**
5
+ * Registry for validation checks.
6
+ */
7
+ export declare class ZModelValidationRegistry extends ValidationRegistry {
8
+ constructor(services: ZModelServices);
9
+ }
10
+ /**
11
+ * Implementation of custom validations.
12
+ */
13
+ export declare class ZModelValidator {
14
+ private shouldCheck;
15
+ checkModel(node: Model, accept: ValidationAcceptor): void;
16
+ checkDataSource(node: DataSource, accept: ValidationAcceptor): void;
17
+ checkDataModel(node: DataModel, accept: ValidationAcceptor): void;
18
+ checkEnum(node: Enum, accept: ValidationAcceptor): void;
19
+ checkAttribute(node: Attribute, accept: ValidationAcceptor): void;
20
+ checkExpression(node: Expression, accept: ValidationAcceptor): void;
21
+ checkFunctionInvocation(node: InvocationExpr, accept: ValidationAcceptor): void;
22
+ }
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ZModelValidator = exports.ZModelValidationRegistry = void 0;
7
+ const langium_1 = require("langium");
8
+ const schema_validator_1 = __importDefault(require("./schema-validator"));
9
+ const datasource_validator_1 = __importDefault(require("./datasource-validator"));
10
+ const datamodel_validator_1 = __importDefault(require("./datamodel-validator"));
11
+ const attribute_validator_1 = __importDefault(require("./attribute-validator"));
12
+ const enum_validator_1 = __importDefault(require("./enum-validator"));
13
+ const expression_validator_1 = __importDefault(require("./expression-validator"));
14
+ const function_invocation_validator_1 = __importDefault(require("./function-invocation-validator"));
15
+ /**
16
+ * Registry for validation checks.
17
+ */
18
+ class ZModelValidationRegistry extends langium_1.ValidationRegistry {
19
+ constructor(services) {
20
+ super(services);
21
+ const validator = services.validation.ZModelValidator;
22
+ const checks = {
23
+ Model: validator.checkModel,
24
+ DataSource: validator.checkDataSource,
25
+ DataModel: validator.checkDataModel,
26
+ Enum: validator.checkEnum,
27
+ Attribute: validator.checkAttribute,
28
+ Expression: validator.checkExpression,
29
+ InvocationExpr: validator.checkFunctionInvocation,
30
+ };
31
+ this.register(checks, validator);
32
+ }
33
+ }
34
+ exports.ZModelValidationRegistry = ZModelValidationRegistry;
35
+ /**
36
+ * Implementation of custom validations.
37
+ */
38
+ class ZModelValidator {
39
+ shouldCheck(node) {
40
+ let doc;
41
+ let currNode = node;
42
+ while (currNode) {
43
+ if (currNode.$document) {
44
+ doc = currNode.$document;
45
+ break;
46
+ }
47
+ currNode = currNode.$container;
48
+ }
49
+ return (doc === null || doc === void 0 ? void 0 : doc.parseResult.lexerErrors.length) === 0 && (doc === null || doc === void 0 ? void 0 : doc.parseResult.parserErrors.length) === 0;
50
+ }
51
+ checkModel(node, accept) {
52
+ this.shouldCheck(node) && new schema_validator_1.default().validate(node, accept);
53
+ }
54
+ checkDataSource(node, accept) {
55
+ this.shouldCheck(node) && new datasource_validator_1.default().validate(node, accept);
56
+ }
57
+ checkDataModel(node, accept) {
58
+ this.shouldCheck(node) && new datamodel_validator_1.default().validate(node, accept);
59
+ }
60
+ checkEnum(node, accept) {
61
+ this.shouldCheck(node) && new enum_validator_1.default().validate(node, accept);
62
+ }
63
+ checkAttribute(node, accept) {
64
+ this.shouldCheck(node) && new attribute_validator_1.default().validate(node, accept);
65
+ }
66
+ checkExpression(node, accept) {
67
+ this.shouldCheck(node) && new expression_validator_1.default().validate(node, accept);
68
+ }
69
+ checkFunctionInvocation(node, accept) {
70
+ this.shouldCheck(node) && new function_invocation_validator_1.default().validate(node, accept);
71
+ }
72
+ }
73
+ exports.ZModelValidator = ZModelValidator;
74
+ //# sourceMappingURL=zmodel-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zmodel-validator.js","sourceRoot":"","sources":["../../../src/language-server/validator/zmodel-validator.ts"],"names":[],"mappings":";;;;;;AAAA,qCAA6G;AAY7G,0EAAiD;AACjD,kFAAyD;AACzD,gFAAuD;AACvD,gFAAuD;AACvD,sEAA6C;AAC7C,kFAAyD;AACzD,oGAA0E;AAE1E;;GAEG;AACH,MAAa,wBAAyB,SAAQ,4BAAkB;IAC5D,YAAY,QAAwB;QAChC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChB,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC;QACtD,MAAM,MAAM,GAAoC;YAC5C,KAAK,EAAE,SAAS,CAAC,UAAU;YAC3B,UAAU,EAAE,SAAS,CAAC,eAAe;YACrC,SAAS,EAAE,SAAS,CAAC,cAAc;YACnC,IAAI,EAAE,SAAS,CAAC,SAAS;YACzB,SAAS,EAAE,SAAS,CAAC,cAAc;YACnC,UAAU,EAAE,SAAS,CAAC,eAAe;YACrC,cAAc,EAAE,SAAS,CAAC,uBAAuB;SACpD,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,CAAC;CACJ;AAfD,4DAeC;AAED;;GAEG;AACH,MAAa,eAAe;IAChB,WAAW,CAAC,IAAa;QAC7B,IAAI,GAAgC,CAAC;QACrC,IAAI,QAAQ,GAAwB,IAAI,CAAC;QACzC,OAAO,QAAQ,EAAE;YACb,IAAI,QAAQ,CAAC,SAAS,EAAE;gBACpB,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC;gBACzB,MAAM;aACT;YACD,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC;SAClC;QAED,OAAO,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,WAAW,CAAC,WAAW,CAAC,MAAM,MAAK,CAAC,IAAI,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,WAAW,CAAC,YAAY,CAAC,MAAM,MAAK,CAAC,CAAC;IACnG,CAAC;IAED,UAAU,CAAC,IAAW,EAAE,MAA0B;QAC9C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,0BAAe,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3E,CAAC;IAED,eAAe,CAAC,IAAgB,EAAE,MAA0B;QACxD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,8BAAmB,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/E,CAAC;IAED,cAAc,CAAC,IAAe,EAAE,MAA0B;QACtD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,6BAAkB,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9E,CAAC;IAED,SAAS,CAAC,IAAU,EAAE,MAA0B;QAC5C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,wBAAa,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IAED,cAAc,CAAC,IAAe,EAAE,MAA0B;QACtD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,6BAAkB,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9E,CAAC;IAED,eAAe,CAAC,IAAgB,EAAE,MAA0B;QACxD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,8BAAmB,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/E,CAAC;IAED,uBAAuB,CAAC,IAAoB,EAAE,MAA0B;QACpE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,uCAA2B,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvF,CAAC;CACJ;AA1CD,0CA0CC"}