zenstack 1.0.0-alpha.22 → 1.0.0-alpha.24

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 (85) hide show
  1. package/README.md +79 -9
  2. package/cli/cli-error.js +3 -5
  3. package/cli/cli-error.js.map +1 -1
  4. package/cli/cli-util.js +123 -105
  5. package/cli/cli-util.js.map +1 -1
  6. package/cli/index.js +105 -63
  7. package/cli/index.js.map +1 -1
  8. package/cli/plugin-runner.js +130 -127
  9. package/cli/plugin-runner.js.map +1 -1
  10. package/language-server/constants.js +5 -13
  11. package/language-server/constants.js.map +1 -1
  12. package/language-server/main.js +8 -15
  13. package/language-server/main.js.map +1 -1
  14. package/language-server/types.js +3 -1
  15. package/language-server/types.js.map +1 -1
  16. package/language-server/utils.js +13 -16
  17. package/language-server/utils.js.map +1 -1
  18. package/language-server/validator/attribute-validator.js +3 -7
  19. package/language-server/validator/attribute-validator.js.map +1 -1
  20. package/language-server/validator/datamodel-validator.js +293 -347
  21. package/language-server/validator/datamodel-validator.js.map +1 -1
  22. package/language-server/validator/datasource-validator.js +61 -71
  23. package/language-server/validator/datasource-validator.js.map +1 -1
  24. package/language-server/validator/enum-validator.js +6 -10
  25. package/language-server/validator/enum-validator.js.map +1 -1
  26. package/language-server/validator/expression-validator.js +25 -31
  27. package/language-server/validator/expression-validator.js.map +1 -1
  28. package/language-server/validator/schema-validator.js +18 -25
  29. package/language-server/validator/schema-validator.js.map +1 -1
  30. package/language-server/validator/utils.js +86 -85
  31. package/language-server/validator/utils.js.map +1 -1
  32. package/language-server/validator/zmodel-validator.js +55 -58
  33. package/language-server/validator/zmodel-validator.js.map +1 -1
  34. package/language-server/zmodel-formatter.js +40 -21
  35. package/language-server/zmodel-formatter.js.map +1 -1
  36. package/language-server/zmodel-linker.js +328 -331
  37. package/language-server/zmodel-linker.js.map +1 -1
  38. package/language-server/zmodel-module.js +50 -59
  39. package/language-server/zmodel-module.js.map +1 -1
  40. package/language-server/zmodel-scope.js +35 -25
  41. package/language-server/zmodel-scope.js.map +1 -1
  42. package/language-server/zmodel-workspace-manager.js +30 -18
  43. package/language-server/zmodel-workspace-manager.js.map +1 -1
  44. package/package.json +8 -12
  45. package/plugins/access-policy/expression-writer.js +301 -292
  46. package/plugins/access-policy/expression-writer.js.map +1 -1
  47. package/plugins/access-policy/index.js +20 -11
  48. package/plugins/access-policy/index.js.map +1 -1
  49. package/plugins/access-policy/policy-guard-generator.js +327 -321
  50. package/plugins/access-policy/policy-guard-generator.js.map +1 -1
  51. package/plugins/access-policy/typescript-expression-transformer.js +94 -95
  52. package/plugins/access-policy/typescript-expression-transformer.js.map +1 -1
  53. package/plugins/access-policy/utils.js +7 -9
  54. package/plugins/access-policy/utils.js.map +1 -1
  55. package/plugins/access-policy/zod-schema-generator.js +143 -159
  56. package/plugins/access-policy/zod-schema-generator.js.map +1 -1
  57. package/plugins/model-meta/index.js +97 -102
  58. package/plugins/model-meta/index.js.map +1 -1
  59. package/plugins/plugin-utils.js +34 -40
  60. package/plugins/plugin-utils.js.map +1 -1
  61. package/plugins/prisma/indent-string.js +4 -8
  62. package/plugins/prisma/indent-string.js.map +1 -1
  63. package/plugins/prisma/index.js +20 -11
  64. package/plugins/prisma/index.js.map +1 -1
  65. package/plugins/prisma/prisma-builder.js +235 -213
  66. package/plugins/prisma/prisma-builder.js.map +1 -1
  67. package/plugins/prisma/schema-generator.js +205 -186
  68. package/plugins/prisma/schema-generator.js.map +1 -1
  69. package/plugins/prisma/zmodel-code-generator.d.ts +2 -1
  70. package/plugins/prisma/zmodel-code-generator.js +109 -105
  71. package/plugins/prisma/zmodel-code-generator.js.map +1 -1
  72. package/telemetry.js +107 -90
  73. package/telemetry.js.map +1 -1
  74. package/types.js +3 -1
  75. package/types.js.map +1 -1
  76. package/utils/ast-utils.js +67 -67
  77. package/utils/ast-utils.js.map +1 -1
  78. package/utils/exec-utils.js +6 -15
  79. package/utils/exec-utils.js.map +1 -1
  80. package/utils/pkg-utils.js +38 -35
  81. package/utils/pkg-utils.js.map +1 -1
  82. package/utils/version-utils.js +9 -10
  83. package/utils/version-utils.js.map +1 -1
  84. package/global.d.js +0 -1
  85. package/global.d.js.map +0 -1
@@ -1,174 +1,158 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
2
+ Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.ZodSchemaGenerator = void 0;
7
- var _ast = require("@zenstackhq/language/ast");
8
- var _sdk = require("@zenstackhq/sdk");
9
- var _changeCase = require("change-case");
10
- var _astUtils = require("../../utils/ast-utils");
4
+ const ast_1 = require("@zenstackhq/language/ast");
5
+ const sdk_1 = require("@zenstackhq/sdk");
6
+ const change_case_1 = require("change-case");
7
+ const ast_utils_1 = require("../../utils/ast-utils");
11
8
  /**
12
9
  * Writes Zod schema for data models.
13
10
  */
14
11
  class ZodSchemaGenerator {
15
- generate(writer, models) {
16
- writer.inlineBlock(() => {
17
- models.forEach(model => {
18
- const fields = model.fields.filter(field => {
19
- var _field$type$reference;
20
- return !_sdk.AUXILIARY_FIELDS.includes(field.name) &&
21
- // scalar fields only
22
- !(0, _ast.isDataModelField)((_field$type$reference = field.type.reference) === null || _field$type$reference === void 0 ? void 0 : _field$type$reference.ref) && this.hasValidationAttributes(field);
23
- });
24
- if (fields.length === 0) {
25
- return;
26
- }
27
- writer.write(`${(0, _changeCase.camelCase)(model.name)}: z.object(`);
12
+ generate(writer, models) {
28
13
  writer.inlineBlock(() => {
29
- fields.forEach(field => {
30
- writer.writeLine(`${field.name}: ${this.makeFieldValidator(field)},`);
31
- });
14
+ models.forEach((model) => {
15
+ const fields = model.fields.filter((field) => {
16
+ var _a;
17
+ return !sdk_1.AUXILIARY_FIELDS.includes(field.name) &&
18
+ // scalar fields only
19
+ !(0, ast_1.isDataModelField)((_a = field.type.reference) === null || _a === void 0 ? void 0 : _a.ref) &&
20
+ this.hasValidationAttributes(field);
21
+ });
22
+ if (fields.length === 0) {
23
+ return;
24
+ }
25
+ writer.write(`${(0, change_case_1.camelCase)(model.name)}: z.object(`);
26
+ writer.inlineBlock(() => {
27
+ fields.forEach((field) => {
28
+ writer.writeLine(`${field.name}: ${this.makeFieldValidator(field)},`);
29
+ });
30
+ });
31
+ writer.writeLine(').partial(),');
32
+ });
32
33
  });
33
- writer.writeLine(').partial(),');
34
- });
35
- });
36
- }
37
- hasValidationAttributes(field) {
38
- return field.attributes.some(attr => _astUtils.VALIDATION_ATTRIBUTES.includes(attr.decl.$refText));
39
- }
40
- makeFieldValidator(field) {
41
- let schema = this.makeZodSchema(field);
42
- // translate field constraint attributes to zod schema
43
- for (const attr of field.attributes) {
44
- var _attr$decl$ref;
45
- switch ((_attr$decl$ref = attr.decl.ref) === null || _attr$decl$ref === void 0 ? void 0 : _attr$decl$ref.name) {
46
- case '@length':
47
- {
48
- const min = this.getAttrLiteralArg(attr, 'min');
49
- if (min) {
50
- schema += `.min(${min})`;
51
- }
52
- const max = this.getAttrLiteralArg(attr, 'max');
53
- if (max) {
54
- schema += `.max(${max})`;
55
- }
56
- break;
57
- }
58
- case '@regex':
59
- {
60
- const expr = this.getAttrLiteralArg(attr, 'regex');
61
- if (expr) {
62
- schema += `.regex(/${expr}/)`;
63
- }
64
- break;
65
- }
66
- case '@startsWith':
67
- {
68
- const text = this.getAttrLiteralArg(attr, 'text');
69
- if (text) {
70
- schema += `.startsWith(${JSON.stringify(text)})`;
71
- }
72
- break;
73
- }
74
- case '@endsWith':
75
- {
76
- const text = this.getAttrLiteralArg(attr, 'text');
77
- if (text) {
78
- schema += `.endsWith(${JSON.stringify(text)})`;
79
- }
80
- break;
81
- }
82
- case '@email':
83
- {
84
- schema += `.email()`;
85
- break;
86
- }
87
- case '@url':
88
- {
89
- schema += `.url()`;
90
- break;
91
- }
92
- case '@datetime':
93
- {
94
- schema += `.datetime({ offset: true })`;
95
- break;
96
- }
97
- case '@gt':
98
- {
99
- const value = this.getAttrLiteralArg(attr, 'value');
100
- if (value !== undefined) {
101
- schema += `.gt(${value})`;
102
- }
103
- break;
104
- }
105
- case '@gte':
106
- {
107
- const value = this.getAttrLiteralArg(attr, 'value');
108
- if (value !== undefined) {
109
- schema += `.gte(${value})`;
110
- }
111
- break;
112
- }
113
- case '@lt':
114
- {
115
- const value = this.getAttrLiteralArg(attr, 'value');
116
- if (value !== undefined) {
117
- schema += `.lt(${value})`;
118
- }
119
- break;
120
- }
121
- case '@lte':
122
- {
123
- const value = this.getAttrLiteralArg(attr, 'value');
124
- if (value !== undefined) {
125
- schema += `.lte(${value})`;
126
- }
127
- break;
128
- }
129
- }
130
34
  }
131
- if (field.type.optional) {
132
- schema += '.nullable()';
35
+ hasValidationAttributes(field) {
36
+ return field.attributes.some((attr) => ast_utils_1.VALIDATION_ATTRIBUTES.includes(attr.decl.$refText));
37
+ }
38
+ makeFieldValidator(field) {
39
+ var _a;
40
+ let schema = this.makeZodSchema(field);
41
+ // translate field constraint attributes to zod schema
42
+ for (const attr of field.attributes) {
43
+ switch ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) {
44
+ case '@length': {
45
+ const min = this.getAttrLiteralArg(attr, 'min');
46
+ if (min) {
47
+ schema += `.min(${min})`;
48
+ }
49
+ const max = this.getAttrLiteralArg(attr, 'max');
50
+ if (max) {
51
+ schema += `.max(${max})`;
52
+ }
53
+ break;
54
+ }
55
+ case '@regex': {
56
+ const expr = this.getAttrLiteralArg(attr, 'regex');
57
+ if (expr) {
58
+ schema += `.regex(/${expr}/)`;
59
+ }
60
+ break;
61
+ }
62
+ case '@startsWith': {
63
+ const text = this.getAttrLiteralArg(attr, 'text');
64
+ if (text) {
65
+ schema += `.startsWith(${JSON.stringify(text)})`;
66
+ }
67
+ break;
68
+ }
69
+ case '@endsWith': {
70
+ const text = this.getAttrLiteralArg(attr, 'text');
71
+ if (text) {
72
+ schema += `.endsWith(${JSON.stringify(text)})`;
73
+ }
74
+ break;
75
+ }
76
+ case '@email': {
77
+ schema += `.email()`;
78
+ break;
79
+ }
80
+ case '@url': {
81
+ schema += `.url()`;
82
+ break;
83
+ }
84
+ case '@datetime': {
85
+ schema += `.datetime({ offset: true })`;
86
+ break;
87
+ }
88
+ case '@gt': {
89
+ const value = this.getAttrLiteralArg(attr, 'value');
90
+ if (value !== undefined) {
91
+ schema += `.gt(${value})`;
92
+ }
93
+ break;
94
+ }
95
+ case '@gte': {
96
+ const value = this.getAttrLiteralArg(attr, 'value');
97
+ if (value !== undefined) {
98
+ schema += `.gte(${value})`;
99
+ }
100
+ break;
101
+ }
102
+ case '@lt': {
103
+ const value = this.getAttrLiteralArg(attr, 'value');
104
+ if (value !== undefined) {
105
+ schema += `.lt(${value})`;
106
+ }
107
+ break;
108
+ }
109
+ case '@lte': {
110
+ const value = this.getAttrLiteralArg(attr, 'value');
111
+ if (value !== undefined) {
112
+ schema += `.lte(${value})`;
113
+ }
114
+ break;
115
+ }
116
+ }
117
+ }
118
+ if (field.type.optional) {
119
+ schema += '.nullable()';
120
+ }
121
+ return schema;
133
122
  }
134
- return schema;
135
- }
136
- makeZodSchema(field) {
137
- let schema;
138
- switch (field.type.type) {
139
- case 'Int':
140
- case 'Float':
141
- case 'Decimal':
142
- schema = 'z.number()';
143
- break;
144
- case 'BigInt':
145
- schema = 'z.bigint()';
146
- break;
147
- case 'String':
148
- schema = 'z.string()';
149
- break;
150
- case 'Boolean':
151
- schema = 'z.boolean()';
152
- break;
153
- case 'DateTime':
154
- schema = 'z.date()';
155
- break;
156
- default:
157
- schema = 'z.any()';
158
- break;
123
+ makeZodSchema(field) {
124
+ let schema;
125
+ switch (field.type.type) {
126
+ case 'Int':
127
+ case 'Float':
128
+ case 'Decimal':
129
+ schema = 'z.number()';
130
+ break;
131
+ case 'BigInt':
132
+ schema = 'z.bigint()';
133
+ break;
134
+ case 'String':
135
+ schema = 'z.string()';
136
+ break;
137
+ case 'Boolean':
138
+ schema = 'z.boolean()';
139
+ break;
140
+ case 'DateTime':
141
+ schema = 'z.date()';
142
+ break;
143
+ default:
144
+ schema = 'z.any()';
145
+ break;
146
+ }
147
+ if (field.type.array) {
148
+ schema = `z.array(${schema})`;
149
+ }
150
+ return schema;
159
151
  }
160
- if (field.type.array) {
161
- schema = `z.array(${schema})`;
152
+ getAttrLiteralArg(attr, paramName) {
153
+ const arg = attr.args.find((arg) => { var _a; return ((_a = arg.$resolvedParam) === null || _a === void 0 ? void 0 : _a.name) === paramName; });
154
+ return arg && (0, sdk_1.getLiteral)(arg.value);
162
155
  }
163
- return schema;
164
- }
165
- getAttrLiteralArg(attr, paramName) {
166
- const arg = attr.args.find(arg => {
167
- var _arg$$resolvedParam;
168
- return ((_arg$$resolvedParam = arg.$resolvedParam) === null || _arg$$resolvedParam === void 0 ? void 0 : _arg$$resolvedParam.name) === paramName;
169
- });
170
- return arg && (0, _sdk.getLiteral)(arg.value);
171
- }
172
156
  }
173
157
  exports.ZodSchemaGenerator = ZodSchemaGenerator;
174
158
  //# sourceMappingURL=zod-schema-generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zod-schema-generator.js","names":["ZodSchemaGenerator","generate","writer","models","inlineBlock","forEach","model","fields","filter","field","AUXILIARY_FIELDS","includes","name","isDataModelField","type","reference","ref","hasValidationAttributes","length","write","camelCase","writeLine","makeFieldValidator","attributes","some","attr","VALIDATION_ATTRIBUTES","decl","$refText","schema","makeZodSchema","min","getAttrLiteralArg","max","expr","text","JSON","stringify","value","undefined","optional","array","paramName","arg","args","find","$resolvedParam","getLiteral"],"sources":["../../../src/plugins/access-policy/zod-schema-generator.ts"],"sourcesContent":["import { DataModel, DataModelField, DataModelFieldAttribute, isDataModelField } from '@zenstackhq/language/ast';\nimport { AUXILIARY_FIELDS, getLiteral } from '@zenstackhq/sdk';\nimport { camelCase } from 'change-case';\nimport { CodeBlockWriter } from 'ts-morph';\nimport { VALIDATION_ATTRIBUTES } from '../../utils/ast-utils';\n\n/**\n * Writes Zod schema for data models.\n */\nexport class ZodSchemaGenerator {\n generate(writer: CodeBlockWriter, models: DataModel[]) {\n writer.inlineBlock(() => {\n models.forEach((model) => {\n const fields = model.fields.filter(\n (field) =>\n !AUXILIARY_FIELDS.includes(field.name) &&\n // scalar fields only\n !isDataModelField(field.type.reference?.ref) &&\n this.hasValidationAttributes(field)\n );\n\n if (fields.length === 0) {\n return;\n }\n\n writer.write(`${camelCase(model.name)}: z.object(`);\n writer.inlineBlock(() => {\n fields.forEach((field) => {\n writer.writeLine(`${field.name}: ${this.makeFieldValidator(field)},`);\n });\n });\n writer.writeLine(').partial(),');\n });\n });\n }\n\n private hasValidationAttributes(field: DataModelField) {\n return field.attributes.some((attr) => VALIDATION_ATTRIBUTES.includes(attr.decl.$refText));\n }\n\n private makeFieldValidator(field: DataModelField) {\n let schema = this.makeZodSchema(field);\n // translate field constraint attributes to zod schema\n for (const attr of field.attributes) {\n switch (attr.decl.ref?.name) {\n case '@length': {\n const min = this.getAttrLiteralArg<number>(attr, 'min');\n if (min) {\n schema += `.min(${min})`;\n }\n const max = this.getAttrLiteralArg<number>(attr, 'max');\n if (max) {\n schema += `.max(${max})`;\n }\n break;\n }\n case '@regex': {\n const expr = this.getAttrLiteralArg<string>(attr, 'regex');\n if (expr) {\n schema += `.regex(/${expr}/)`;\n }\n break;\n }\n case '@startsWith': {\n const text = this.getAttrLiteralArg<string>(attr, 'text');\n if (text) {\n schema += `.startsWith(${JSON.stringify(text)})`;\n }\n break;\n }\n case '@endsWith': {\n const text = this.getAttrLiteralArg<string>(attr, 'text');\n if (text) {\n schema += `.endsWith(${JSON.stringify(text)})`;\n }\n break;\n }\n case '@email': {\n schema += `.email()`;\n break;\n }\n case '@url': {\n schema += `.url()`;\n break;\n }\n case '@datetime': {\n schema += `.datetime({ offset: true })`;\n break;\n }\n case '@gt': {\n const value = this.getAttrLiteralArg<number>(attr, 'value');\n if (value !== undefined) {\n schema += `.gt(${value})`;\n }\n break;\n }\n case '@gte': {\n const value = this.getAttrLiteralArg<number>(attr, 'value');\n if (value !== undefined) {\n schema += `.gte(${value})`;\n }\n break;\n }\n case '@lt': {\n const value = this.getAttrLiteralArg<number>(attr, 'value');\n if (value !== undefined) {\n schema += `.lt(${value})`;\n }\n break;\n }\n case '@lte': {\n const value = this.getAttrLiteralArg<number>(attr, 'value');\n if (value !== undefined) {\n schema += `.lte(${value})`;\n }\n break;\n }\n }\n }\n\n if (field.type.optional) {\n schema += '.nullable()';\n }\n\n return schema;\n }\n\n private makeZodSchema(field: DataModelField) {\n let schema: string;\n switch (field.type.type) {\n case 'Int':\n case 'Float':\n case 'Decimal':\n schema = 'z.number()';\n break;\n case 'BigInt':\n schema = 'z.bigint()';\n break;\n case 'String':\n schema = 'z.string()';\n break;\n case 'Boolean':\n schema = 'z.boolean()';\n break;\n case 'DateTime':\n schema = 'z.date()';\n break;\n default:\n schema = 'z.any()';\n break;\n }\n\n if (field.type.array) {\n schema = `z.array(${schema})`;\n }\n\n return schema;\n }\n\n private getAttrLiteralArg<T extends string | number>(attr: DataModelFieldAttribute, paramName: string) {\n const arg = attr.args.find((arg) => arg.$resolvedParam?.name === paramName);\n return arg && getLiteral<T>(arg.value);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"zod-schema-generator.js","sourceRoot":"","sources":["../../../src/plugins/access-policy/zod-schema-generator.ts"],"names":[],"mappings":"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"}
@@ -1,130 +1,125 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = run;
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 });
7
15
  exports.name = void 0;
8
- var _ast = require("@zenstackhq/language/ast");
9
- var _sdk = require("@zenstackhq/sdk");
10
- var _changeCase = require("change-case");
11
- var _path = _interopRequireDefault(require("path"));
12
- var _tsMorph = require("ts-morph");
13
- var _pluginUtils = require("../plugin-utils");
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
- const name = 'Model Metadata';
16
- exports.name = name;
17
- async function run(model, options) {
18
- const output = options.output ? options.output : (0, _pluginUtils.getDefaultOutputFolder)();
19
- if (!output) {
20
- console.error(`Unable to determine output path, not running plugin ${name}`);
21
- return;
22
- }
23
- const dataModels = model.declarations.filter(d => (0, _ast.isDataModel)(d));
24
- const project = new _tsMorph.Project();
25
- if (!options.output) {
26
- (0, _pluginUtils.ensureNodeModuleFolder)(output);
27
- }
28
- const sf = project.createSourceFile(_path.default.join(output, 'model-meta.ts'), undefined, {
29
- overwrite: true
30
- });
31
- sf.addVariableStatement({
32
- declarationKind: _tsMorph.VariableDeclarationKind.Const,
33
- declarations: [{
34
- name: 'metadata',
35
- initializer: writer => generateModelMetadata(dataModels, writer)
36
- }]
37
- });
38
- sf.addStatements('export default metadata;');
39
- sf.formatText();
40
- await project.save();
41
- await project.emit();
16
+ const ast_1 = require("@zenstackhq/language/ast");
17
+ const sdk_1 = require("@zenstackhq/sdk");
18
+ const change_case_1 = require("change-case");
19
+ const path_1 = __importDefault(require("path"));
20
+ const ts_morph_1 = require("ts-morph");
21
+ const plugin_utils_1 = require("../plugin-utils");
22
+ exports.name = 'Model Metadata';
23
+ function run(model, options) {
24
+ return __awaiter(this, void 0, void 0, function* () {
25
+ const output = options.output ? options.output : (0, plugin_utils_1.getDefaultOutputFolder)();
26
+ if (!output) {
27
+ console.error(`Unable to determine output path, not running plugin ${exports.name}`);
28
+ return;
29
+ }
30
+ const dataModels = model.declarations.filter((d) => (0, ast_1.isDataModel)(d));
31
+ const project = new ts_morph_1.Project();
32
+ if (!options.output) {
33
+ (0, plugin_utils_1.ensureNodeModuleFolder)(output);
34
+ }
35
+ const sf = project.createSourceFile(path_1.default.join(output, 'model-meta.ts'), undefined, { overwrite: true });
36
+ sf.addVariableStatement({
37
+ declarationKind: ts_morph_1.VariableDeclarationKind.Const,
38
+ declarations: [{ name: 'metadata', initializer: (writer) => generateModelMetadata(dataModels, writer) }],
39
+ });
40
+ sf.addStatements('export default metadata;');
41
+ sf.formatText();
42
+ yield project.save();
43
+ yield project.emit();
44
+ });
42
45
  }
46
+ exports.default = run;
43
47
  function generateModelMetadata(dataModels, writer) {
44
- writer.block(() => {
45
- writer.write('fields:');
46
48
  writer.block(() => {
47
- for (const model of dataModels) {
48
- writer.write(`${(0, _changeCase.camelCase)(model.name)}:`);
49
+ writer.write('fields:');
49
50
  writer.block(() => {
50
- for (const f of model.fields) {
51
- var _f$type$reference;
52
- const backlink = getBackLink(f);
53
- writer.write(`${f.name}: {
51
+ for (const model of dataModels) {
52
+ writer.write(`${(0, change_case_1.camelCase)(model.name)}:`);
53
+ writer.block(() => {
54
+ var _a;
55
+ for (const f of model.fields) {
56
+ const backlink = getBackLink(f);
57
+ writer.write(`${f.name}: {
54
58
  name: "${f.name}",
55
- type: "${f.type.reference ? f.type.reference.$refText :
56
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
57
- f.type.type}",
59
+ type: "${f.type.reference
60
+ ? f.type.reference.$refText
61
+ : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
62
+ f.type.type}",
58
63
  isId: ${isIdField(f)},
59
- isDataModel: ${(0, _ast.isDataModel)((_f$type$reference = f.type.reference) === null || _f$type$reference === void 0 ? void 0 : _f$type$reference.ref)},
64
+ isDataModel: ${(0, ast_1.isDataModel)((_a = f.type.reference) === null || _a === void 0 ? void 0 : _a.ref)},
60
65
  isArray: ${f.type.array},
61
66
  isOptional: ${f.type.optional},
62
67
  attributes: ${JSON.stringify(getFieldAttributes(f))},
63
68
  backLink: ${backlink ? "'" + backlink + "'" : 'undefined'}
64
69
  },`);
65
- }
70
+ }
71
+ });
72
+ writer.write(',');
73
+ }
66
74
  });
67
75
  writer.write(',');
68
- }
69
76
  });
70
- writer.write(',');
71
- });
72
77
  }
73
78
  function getBackLink(field) {
74
- var _field$type$reference, _field$type$reference2;
75
- if (!((_field$type$reference = field.type.reference) !== null && _field$type$reference !== void 0 && _field$type$reference.ref) || !(0, _ast.isDataModel)((_field$type$reference2 = field.type.reference) === null || _field$type$reference2 === void 0 ? void 0 : _field$type$reference2.ref)) {
76
- return undefined;
77
- }
78
- const relName = getRelationName(field);
79
- const sourceModel = field.$container;
80
- const targetModel = field.type.reference.ref;
81
- for (const otherField of targetModel.fields) {
82
- var _otherField$type$refe;
83
- if (((_otherField$type$refe = otherField.type.reference) === null || _otherField$type$refe === void 0 ? void 0 : _otherField$type$refe.ref) === sourceModel) {
84
- if (relName) {
85
- const otherRelName = getRelationName(otherField);
86
- if (relName === otherRelName) {
87
- return otherField.name;
79
+ var _a, _b, _c;
80
+ if (!((_a = field.type.reference) === null || _a === void 0 ? void 0 : _a.ref) || !(0, ast_1.isDataModel)((_b = field.type.reference) === null || _b === void 0 ? void 0 : _b.ref)) {
81
+ return undefined;
82
+ }
83
+ const relName = getRelationName(field);
84
+ const sourceModel = field.$container;
85
+ const targetModel = field.type.reference.ref;
86
+ for (const otherField of targetModel.fields) {
87
+ if (((_c = otherField.type.reference) === null || _c === void 0 ? void 0 : _c.ref) === sourceModel) {
88
+ if (relName) {
89
+ const otherRelName = getRelationName(otherField);
90
+ if (relName === otherRelName) {
91
+ return otherField.name;
92
+ }
93
+ }
94
+ else {
95
+ return otherField.name;
96
+ }
88
97
  }
89
- } else {
90
- return otherField.name;
91
- }
92
98
  }
93
- }
94
- return undefined;
99
+ return undefined;
95
100
  }
96
101
  function getRelationName(field) {
97
- var _relAttr$args, _relAttr$args2;
98
- const relAttr = field.attributes.find(attr => {
99
- var _attr$decl$ref;
100
- return ((_attr$decl$ref = attr.decl.ref) === null || _attr$decl$ref === void 0 ? void 0 : _attr$decl$ref.name) === 'relation';
101
- });
102
- const relName = relAttr && ((_relAttr$args = relAttr.args) === null || _relAttr$args === void 0 ? void 0 : _relAttr$args[0]) && (0, _sdk.getLiteral)((_relAttr$args2 = relAttr.args) === null || _relAttr$args2 === void 0 ? void 0 : _relAttr$args2[0].value);
103
- return relName;
102
+ var _a, _b;
103
+ const relAttr = field.attributes.find((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === 'relation'; });
104
+ const relName = relAttr && ((_a = relAttr.args) === null || _a === void 0 ? void 0 : _a[0]) && (0, sdk_1.getLiteral)((_b = relAttr.args) === null || _b === void 0 ? void 0 : _b[0].value);
105
+ return relName;
104
106
  }
105
107
  function getFieldAttributes(field) {
106
- return field.attributes.map(attr => {
107
- const args = [];
108
- for (const arg of attr.args) {
109
- if (!(0, _ast.isLiteralExpr)(arg.value)) {
110
- // attributes with non-literal args are skipped
111
- return undefined;
112
- }
113
- args.push({
114
- name: arg.name,
115
- value: arg.value.value
116
- });
117
- }
118
- return {
119
- name: (0, _sdk.resolved)(attr.decl).name,
120
- args
121
- };
122
- }).filter(d => !!d);
108
+ return field.attributes
109
+ .map((attr) => {
110
+ const args = [];
111
+ for (const arg of attr.args) {
112
+ if (!(0, ast_1.isLiteralExpr)(arg.value)) {
113
+ // attributes with non-literal args are skipped
114
+ return undefined;
115
+ }
116
+ args.push({ name: arg.name, value: arg.value.value });
117
+ }
118
+ return { name: (0, sdk_1.resolved)(attr.decl).name, args };
119
+ })
120
+ .filter((d) => !!d);
123
121
  }
124
122
  function isIdField(field) {
125
- return field.attributes.some(attr => {
126
- var _attr$decl$ref2;
127
- return ((_attr$decl$ref2 = attr.decl.ref) === null || _attr$decl$ref2 === void 0 ? void 0 : _attr$decl$ref2.name) === '@id';
128
- });
123
+ return field.attributes.some((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@id'; });
129
124
  }
130
125
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["name","run","model","options","output","getDefaultOutputFolder","console","error","dataModels","declarations","filter","d","isDataModel","project","Project","ensureNodeModuleFolder","sf","createSourceFile","path","join","undefined","overwrite","addVariableStatement","declarationKind","VariableDeclarationKind","Const","initializer","writer","generateModelMetadata","addStatements","formatText","save","emit","block","write","camelCase","f","fields","backlink","getBackLink","type","reference","$refText","isIdField","ref","array","optional","JSON","stringify","getFieldAttributes","field","relName","getRelationName","sourceModel","$container","targetModel","otherField","otherRelName","relAttr","attributes","find","attr","decl","args","getLiteral","value","map","arg","isLiteralExpr","push","resolved","some"],"sources":["../../../src/plugins/model-meta/index.ts"],"sourcesContent":["import { DataModel, DataModelField, Model, isDataModel, isLiteralExpr } from '@zenstackhq/language/ast';\nimport { RuntimeAttribute } from '@zenstackhq/runtime';\nimport { PluginOptions, getLiteral, resolved } from '@zenstackhq/sdk';\nimport { camelCase } from 'change-case';\nimport path from 'path';\nimport { CodeBlockWriter, Project, VariableDeclarationKind } from 'ts-morph';\nimport { ensureNodeModuleFolder, getDefaultOutputFolder } from '../plugin-utils';\n\nexport const name = 'Model Metadata';\n\nexport default async function run(model: Model, options: PluginOptions) {\n const output = options.output ? (options.output as string) : getDefaultOutputFolder();\n if (!output) {\n console.error(`Unable to determine output path, not running plugin ${name}`);\n return;\n }\n\n const dataModels = model.declarations.filter((d): d is DataModel => isDataModel(d));\n\n const project = new Project();\n\n if (!options.output) {\n ensureNodeModuleFolder(output);\n }\n\n const sf = project.createSourceFile(path.join(output, 'model-meta.ts'), undefined, { overwrite: true });\n sf.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n declarations: [{ name: 'metadata', initializer: (writer) => generateModelMetadata(dataModels, writer) }],\n });\n sf.addStatements('export default metadata;');\n\n sf.formatText();\n\n await project.save();\n await project.emit();\n}\n\nfunction generateModelMetadata(dataModels: DataModel[], writer: CodeBlockWriter) {\n writer.block(() => {\n writer.write('fields:');\n writer.block(() => {\n for (const model of dataModels) {\n writer.write(`${camelCase(model.name)}:`);\n writer.block(() => {\n for (const f of model.fields) {\n const backlink = getBackLink(f);\n writer.write(`${f.name}: {\n name: \"${f.name}\",\n type: \"${\n f.type.reference\n ? f.type.reference.$refText\n : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n f.type.type!\n }\",\n isId: ${isIdField(f)},\n isDataModel: ${isDataModel(f.type.reference?.ref)},\n isArray: ${f.type.array},\n isOptional: ${f.type.optional},\n attributes: ${JSON.stringify(getFieldAttributes(f))},\n backLink: ${backlink ? \"'\" + backlink + \"'\" : 'undefined'} \n },`);\n }\n });\n writer.write(',');\n }\n });\n writer.write(',');\n });\n}\n\nfunction getBackLink(field: DataModelField) {\n if (!field.type.reference?.ref || !isDataModel(field.type.reference?.ref)) {\n return undefined;\n }\n\n const relName = getRelationName(field);\n\n const sourceModel = field.$container as DataModel;\n const targetModel = field.type.reference.ref as DataModel;\n\n for (const otherField of targetModel.fields) {\n if (otherField.type.reference?.ref === sourceModel) {\n if (relName) {\n const otherRelName = getRelationName(otherField);\n if (relName === otherRelName) {\n return otherField.name;\n }\n } else {\n return otherField.name;\n }\n }\n }\n return undefined;\n}\n\nfunction getRelationName(field: DataModelField) {\n const relAttr = field.attributes.find((attr) => attr.decl.ref?.name === 'relation');\n const relName = relAttr && relAttr.args?.[0] && getLiteral<string>(relAttr.args?.[0].value);\n return relName;\n}\n\nfunction getFieldAttributes(field: DataModelField): RuntimeAttribute[] {\n return field.attributes\n .map((attr) => {\n const args: Array<{ name?: string; value: unknown }> = [];\n for (const arg of attr.args) {\n if (!isLiteralExpr(arg.value)) {\n // attributes with non-literal args are skipped\n return undefined;\n }\n args.push({ name: arg.name, value: arg.value.value });\n }\n return { name: resolved(attr.decl).name, args };\n })\n .filter((d): d is RuntimeAttribute => !!d);\n}\n\nfunction isIdField(field: DataModelField) {\n return field.attributes.some((attr) => attr.decl.ref?.name === '@id');\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/model-meta/index.ts"],"names":[],"mappings":"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"}