zenstack 0.6.0-pre.8 → 1.0.0-alpha.19

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 (133) hide show
  1. package/cli/cli-error.d.ts +5 -0
  2. package/cli/cli-error.js +12 -0
  3. package/cli/cli-error.js.map +1 -0
  4. package/cli/cli-util.d.ts +18 -0
  5. package/cli/cli-util.js +122 -0
  6. package/cli/cli-util.js.map +1 -0
  7. package/cli/index.d.ts +14 -0
  8. package/cli/index.js +72 -6529
  9. package/cli/index.js.map +1 -0
  10. package/cli/plugin-runner.d.ts +14 -0
  11. package/cli/plugin-runner.js +133 -0
  12. package/cli/plugin-runner.js.map +1 -0
  13. package/global.d.js +1 -0
  14. package/global.d.js.map +1 -0
  15. package/language-server/constants.d.ts +12 -0
  16. package/language-server/constants.js +24 -0
  17. package/language-server/constants.js.map +1 -0
  18. package/language-server/main.d.ts +1 -0
  19. package/language-server/main.js +20 -6436
  20. package/language-server/main.js.map +1 -0
  21. package/language-server/types.d.ts +10 -0
  22. package/language-server/types.js +1 -0
  23. package/language-server/types.js.map +1 -0
  24. package/language-server/utils.d.ts +10 -0
  25. package/language-server/utils.js +28 -0
  26. package/language-server/utils.js.map +1 -0
  27. package/language-server/validator/attribute-validator.d.ts +9 -0
  28. package/language-server/validator/attribute-validator.js +15 -0
  29. package/language-server/validator/attribute-validator.js.map +1 -0
  30. package/language-server/validator/datamodel-validator.d.ts +16 -0
  31. package/language-server/validator/datamodel-validator.js +365 -0
  32. package/language-server/validator/datamodel-validator.js.map +1 -0
  33. package/language-server/validator/datasource-validator.d.ts +13 -0
  34. package/language-server/validator/datasource-validator.js +85 -0
  35. package/language-server/validator/datasource-validator.js.map +1 -0
  36. package/language-server/validator/enum-validator.d.ts +9 -0
  37. package/language-server/validator/enum-validator.js +18 -0
  38. package/language-server/validator/enum-validator.js.map +1 -0
  39. package/language-server/validator/expression-validator.d.ts +11 -0
  40. package/language-server/validator/expression-validator.js +40 -0
  41. package/language-server/validator/expression-validator.js.map +1 -0
  42. package/language-server/validator/schema-validator.d.ts +10 -0
  43. package/language-server/validator/schema-validator.js +35 -0
  44. package/language-server/validator/schema-validator.js.map +1 -0
  45. package/language-server/validator/utils.d.ts +24 -0
  46. package/language-server/validator/utils.js +116 -0
  47. package/language-server/validator/utils.js.map +1 -0
  48. package/language-server/validator/zmodel-validator.d.ts +21 -0
  49. package/language-server/validator/zmodel-validator.js +72 -0
  50. package/language-server/validator/zmodel-validator.js.map +1 -0
  51. package/language-server/zmodel-linker.d.ts +29 -0
  52. package/language-server/zmodel-linker.js +364 -0
  53. package/language-server/zmodel-linker.js.map +1 -0
  54. package/language-server/zmodel-module.d.ts +41 -0
  55. package/language-server/zmodel-module.js +83 -0
  56. package/language-server/zmodel-module.js.map +1 -0
  57. package/language-server/zmodel-scope.d.ts +10 -0
  58. package/language-server/zmodel-scope.js +34 -0
  59. package/language-server/zmodel-scope.js.map +1 -0
  60. package/language-server/zmodel-workspace-manager.d.ts +8 -0
  61. package/language-server/zmodel-workspace-manager.js +25 -0
  62. package/language-server/zmodel-workspace-manager.js.map +1 -0
  63. package/package.json +23 -18
  64. package/plugins/access-policy/expression-writer.d.ts +38 -0
  65. package/plugins/access-policy/expression-writer.js +323 -0
  66. package/plugins/access-policy/expression-writer.js.map +1 -0
  67. package/plugins/access-policy/index.d.ts +4 -0
  68. package/plugins/access-policy/index.js +15 -0
  69. package/plugins/access-policy/index.js.map +1 -0
  70. package/plugins/access-policy/policy-guard-generator.d.ts +15 -0
  71. package/plugins/access-policy/policy-guard-generator.js +345 -0
  72. package/plugins/access-policy/policy-guard-generator.js.map +1 -0
  73. package/plugins/access-policy/typescript-expression-transformer.d.ts +26 -0
  74. package/plugins/access-policy/typescript-expression-transformer.js +110 -0
  75. package/plugins/access-policy/typescript-expression-transformer.js.map +1 -0
  76. package/plugins/access-policy/utils.d.ts +5 -0
  77. package/plugins/access-policy/utils.js +16 -0
  78. package/plugins/access-policy/utils.js.map +1 -0
  79. package/plugins/access-policy/zod-schema-generator.d.ts +12 -0
  80. package/plugins/access-policy/zod-schema-generator.js +174 -0
  81. package/plugins/access-policy/zod-schema-generator.js.map +1 -0
  82. package/plugins/model-meta/index.d.ts +4 -0
  83. package/plugins/model-meta/index.js +130 -0
  84. package/plugins/model-meta/index.js.map +1 -0
  85. package/plugins/plugin-utils.d.ts +16 -0
  86. package/plugins/plugin-utils.js +58 -0
  87. package/plugins/plugin-utils.js.map +1 -0
  88. package/plugins/prisma/indent-string.d.ts +4 -0
  89. package/plugins/prisma/indent-string.js +16 -0
  90. package/plugins/prisma/indent-string.js.map +1 -0
  91. package/plugins/prisma/index.d.ts +4 -0
  92. package/plugins/prisma/index.js +15 -3740
  93. package/plugins/prisma/index.js.map +1 -0
  94. package/plugins/prisma/prisma-builder.d.ts +130 -0
  95. package/plugins/prisma/prisma-builder.js +271 -0
  96. package/plugins/prisma/prisma-builder.js.map +1 -0
  97. package/plugins/prisma/schema-generator.d.ts +24 -0
  98. package/plugins/prisma/schema-generator.js +212 -0
  99. package/plugins/prisma/schema-generator.js.map +1 -0
  100. package/plugins/prisma/zmodel-code-generator.d.ts +27 -0
  101. package/plugins/prisma/zmodel-code-generator.js +110 -0
  102. package/plugins/prisma/zmodel-code-generator.js.map +1 -0
  103. package/res/prism-zmodel.js +2 -4
  104. package/res/starter.zmodel +47 -0
  105. package/res/stdlib.zmodel +12 -1
  106. package/telemetry.d.ts +21 -0
  107. package/telemetry.js +102 -0
  108. package/telemetry.js.map +1 -0
  109. package/types.d.ts +11 -0
  110. package/types.js +1 -0
  111. package/types.js.map +1 -0
  112. package/utils/ast-utils.d.ts +15 -0
  113. package/utils/ast-utils.js +79 -0
  114. package/utils/ast-utils.js.map +1 -0
  115. package/utils/exec-utils.d.ts +6 -0
  116. package/utils/exec-utils.js +22 -0
  117. package/utils/exec-utils.js.map +1 -0
  118. package/utils/pkg-utils.d.ts +3 -0
  119. package/utils/pkg-utils.js +43 -0
  120. package/utils/pkg-utils.js.map +1 -0
  121. package/utils/version-utils.d.ts +1 -0
  122. package/utils/version-utils.js +15 -0
  123. package/utils/version-utils.js.map +1 -0
  124. package/asset/logo-256-bg.png +0 -0
  125. package/asset/logo-dark-256.png +0 -0
  126. package/asset/logo-light-256.png +0 -0
  127. package/extension.js +0 -39
  128. package/plugins/policy-guard/index.js +0 -4289
  129. package/plugins/react-hooks/index.js +0 -4318
  130. package/plugins/trpc/index.js +0 -5386
  131. package/plugins/zod/index.js +0 -4808
  132. package/res/package.template.json +0 -9
  133. package/res/tsconfig.template.json +0 -17
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ 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");
11
+ /**
12
+ * Writes Zod schema for data models.
13
+ */
14
+ 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(`);
28
+ writer.inlineBlock(() => {
29
+ fields.forEach(field => {
30
+ writer.writeLine(`${field.name}: ${this.makeFieldValidator(field)},`);
31
+ });
32
+ });
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
+ }
131
+ if (field.type.optional) {
132
+ schema += '.nullable()';
133
+ }
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;
159
+ }
160
+ if (field.type.array) {
161
+ schema = `z.array(${schema})`;
162
+ }
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
+ }
173
+ exports.ZodSchemaGenerator = ZodSchemaGenerator;
174
+ //# sourceMappingURL=zod-schema-generator.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,4 @@
1
+ import { Model } from '@zenstackhq/language/ast';
2
+ import { PluginOptions } from '@zenstackhq/sdk';
3
+ export declare const name = "Model Metadata";
4
+ export default function run(model: Model, options: PluginOptions): Promise<void>;
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = run;
7
+ 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();
42
+ }
43
+ function generateModelMetadata(dataModels, writer) {
44
+ writer.block(() => {
45
+ writer.write('fields:');
46
+ writer.block(() => {
47
+ for (const model of dataModels) {
48
+ writer.write(`${(0, _changeCase.camelCase)(model.name)}:`);
49
+ writer.block(() => {
50
+ for (const f of model.fields) {
51
+ var _f$type$reference;
52
+ const backlink = getBackLink(f);
53
+ writer.write(`${f.name}: {
54
+ 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}",
58
+ 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)},
60
+ isArray: ${f.type.array},
61
+ isOptional: ${f.type.optional},
62
+ attributes: ${JSON.stringify(getFieldAttributes(f))},
63
+ backLink: ${backlink ? "'" + backlink + "'" : 'undefined'}
64
+ },`);
65
+ }
66
+ });
67
+ writer.write(',');
68
+ }
69
+ });
70
+ writer.write(',');
71
+ });
72
+ }
73
+ 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;
88
+ }
89
+ } else {
90
+ return otherField.name;
91
+ }
92
+ }
93
+ }
94
+ return undefined;
95
+ }
96
+ 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;
104
+ }
105
+ 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);
123
+ }
124
+ 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
+ });
129
+ }
130
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,16 @@
1
+ import { PolicyOperationKind } from '@zenstackhq/runtime';
2
+ export declare const RUNTIME_PACKAGE = "@zenstackhq/runtime";
3
+ export declare const ALL_OPERATION_KINDS: PolicyOperationKind[];
4
+ /**
5
+ * Gets the nearest "node_modules" folder by walking up froma start path.
6
+ */
7
+ export declare function getNodeModulesFolder(startPath?: string): string | undefined;
8
+ /**
9
+ * Gets the default node_modules/.zenstack output folder for plugins.
10
+ * @returns
11
+ */
12
+ export declare function getDefaultOutputFolder(): string | undefined;
13
+ /**
14
+ * Ensure a folder exists and has a package.json in it.
15
+ */
16
+ export declare function ensureNodeModuleFolder(folder: string): void;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.RUNTIME_PACKAGE = exports.ALL_OPERATION_KINDS = void 0;
7
+ exports.ensureNodeModuleFolder = ensureNodeModuleFolder;
8
+ exports.getDefaultOutputFolder = getDefaultOutputFolder;
9
+ exports.getNodeModulesFolder = getNodeModulesFolder;
10
+ var _fs = _interopRequireDefault(require("fs"));
11
+ var _path = _interopRequireDefault(require("path"));
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+ const RUNTIME_PACKAGE = '@zenstackhq/runtime';
14
+ exports.RUNTIME_PACKAGE = RUNTIME_PACKAGE;
15
+ const ALL_OPERATION_KINDS = ['create', 'update', 'postUpdate', 'read', 'delete'];
16
+
17
+ /**
18
+ * Gets the nearest "node_modules" folder by walking up froma start path.
19
+ */
20
+ exports.ALL_OPERATION_KINDS = ALL_OPERATION_KINDS;
21
+ function getNodeModulesFolder(startPath) {
22
+ startPath = startPath ?? process.cwd();
23
+ if (_fs.default.existsSync(_path.default.join(startPath, 'node_modules'))) {
24
+ return _path.default.join(startPath, 'node_modules');
25
+ } else if (startPath !== '/') {
26
+ const parent = _path.default.join(startPath, '..');
27
+ return getNodeModulesFolder(parent);
28
+ } else {
29
+ return undefined;
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Gets the default node_modules/.zenstack output folder for plugins.
35
+ * @returns
36
+ */
37
+ function getDefaultOutputFolder() {
38
+ const modulesFolder = getNodeModulesFolder();
39
+ return modulesFolder ? _path.default.join(modulesFolder, '.zenstack') : undefined;
40
+ }
41
+
42
+ /**
43
+ * Ensure a folder exists and has a package.json in it.
44
+ */
45
+ function ensureNodeModuleFolder(folder) {
46
+ if (!_fs.default.existsSync(folder)) {
47
+ _fs.default.mkdirSync(folder, {
48
+ recursive: true
49
+ });
50
+ }
51
+ if (!_fs.default.existsSync(_path.default.join(folder, 'package.json'))) {
52
+ _fs.default.writeFileSync(_path.default.join(folder, 'package.json'), JSON.stringify({
53
+ name: '.zenstack',
54
+ version: '1.0.0'
55
+ }));
56
+ }
57
+ }
58
+ //# sourceMappingURL=plugin-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-utils.js","names":["RUNTIME_PACKAGE","ALL_OPERATION_KINDS","getNodeModulesFolder","startPath","process","cwd","fs","existsSync","path","join","parent","undefined","getDefaultOutputFolder","modulesFolder","ensureNodeModuleFolder","folder","mkdirSync","recursive","writeFileSync","JSON","stringify","name","version"],"sources":["../../src/plugins/plugin-utils.ts"],"sourcesContent":["import { PolicyOperationKind } from '@zenstackhq/runtime';\nimport fs from 'fs';\nimport path from 'path';\n\nexport const RUNTIME_PACKAGE = '@zenstackhq/runtime';\nexport const ALL_OPERATION_KINDS: PolicyOperationKind[] = ['create', 'update', 'postUpdate', 'read', 'delete'];\n\n/**\n * Gets the nearest \"node_modules\" folder by walking up froma start path.\n */\nexport function getNodeModulesFolder(startPath?: string): string | undefined {\n startPath = startPath ?? process.cwd();\n if (fs.existsSync(path.join(startPath, 'node_modules'))) {\n return path.join(startPath, 'node_modules');\n } else if (startPath !== '/') {\n const parent = path.join(startPath, '..');\n return getNodeModulesFolder(parent);\n } else {\n return undefined;\n }\n}\n\n/**\n * Gets the default node_modules/.zenstack output folder for plugins.\n * @returns\n */\nexport function getDefaultOutputFolder() {\n const modulesFolder = getNodeModulesFolder();\n return modulesFolder ? path.join(modulesFolder, '.zenstack') : undefined;\n}\n\n/**\n * Ensure a folder exists and has a package.json in it.\n */\nexport function ensureNodeModuleFolder(folder: string) {\n if (!fs.existsSync(folder)) {\n fs.mkdirSync(folder, { recursive: true });\n }\n if (!fs.existsSync(path.join(folder, 'package.json'))) {\n fs.writeFileSync(\n path.join(folder, 'package.json'),\n JSON.stringify({\n name: '.zenstack',\n version: '1.0.0',\n })\n );\n }\n}\n"],"mappings":";;;;;;;;;AACA;AACA;AAAwB;AAEjB,MAAMA,eAAe,GAAG,qBAAqB;AAAC;AAC9C,MAAMC,mBAA0C,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC;;AAE9G;AACA;AACA;AAFA;AAGO,SAASC,oBAAoB,CAACC,SAAkB,EAAsB;EACzEA,SAAS,GAAGA,SAAS,IAAIC,OAAO,CAACC,GAAG,EAAE;EACtC,IAAIC,WAAE,CAACC,UAAU,CAACC,aAAI,CAACC,IAAI,CAACN,SAAS,EAAE,cAAc,CAAC,CAAC,EAAE;IACrD,OAAOK,aAAI,CAACC,IAAI,CAACN,SAAS,EAAE,cAAc,CAAC;EAC/C,CAAC,MAAM,IAAIA,SAAS,KAAK,GAAG,EAAE;IAC1B,MAAMO,MAAM,GAAGF,aAAI,CAACC,IAAI,CAACN,SAAS,EAAE,IAAI,CAAC;IACzC,OAAOD,oBAAoB,CAACQ,MAAM,CAAC;EACvC,CAAC,MAAM;IACH,OAAOC,SAAS;EACpB;AACJ;;AAEA;AACA;AACA;AACA;AACO,SAASC,sBAAsB,GAAG;EACrC,MAAMC,aAAa,GAAGX,oBAAoB,EAAE;EAC5C,OAAOW,aAAa,GAAGL,aAAI,CAACC,IAAI,CAACI,aAAa,EAAE,WAAW,CAAC,GAAGF,SAAS;AAC5E;;AAEA;AACA;AACA;AACO,SAASG,sBAAsB,CAACC,MAAc,EAAE;EACnD,IAAI,CAACT,WAAE,CAACC,UAAU,CAACQ,MAAM,CAAC,EAAE;IACxBT,WAAE,CAACU,SAAS,CAACD,MAAM,EAAE;MAAEE,SAAS,EAAE;IAAK,CAAC,CAAC;EAC7C;EACA,IAAI,CAACX,WAAE,CAACC,UAAU,CAACC,aAAI,CAACC,IAAI,CAACM,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE;IACnDT,WAAE,CAACY,aAAa,CACZV,aAAI,CAACC,IAAI,CAACM,MAAM,EAAE,cAAc,CAAC,EACjCI,IAAI,CAACC,SAAS,CAAC;MACXC,IAAI,EAAE,WAAW;MACjBC,OAAO,EAAE;IACb,CAAC,CAAC,CACL;EACL;AACJ"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Utility for indenting strings
3
+ */
4
+ export default function indentString(string: string, count?: number): string;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = indentString;
7
+ // https://github.com/sindresorhus/indent-string
8
+
9
+ /**
10
+ * Utility for indenting strings
11
+ */
12
+ function indentString(string, count = 4) {
13
+ const indent = ' ';
14
+ return string.replace(/^(?!\s*$)/gm, indent.repeat(count));
15
+ }
16
+ //# sourceMappingURL=indent-string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indent-string.js","names":["indentString","string","count","indent","replace","repeat"],"sources":["../../../src/plugins/prisma/indent-string.ts"],"sourcesContent":["// https://github.com/sindresorhus/indent-string\n\n/**\n * Utility for indenting strings\n */\nexport default function indentString(string: string, count = 4): string {\n const indent = ' ';\n return string.replace(/^(?!\\s*$)/gm, indent.repeat(count));\n}\n"],"mappings":";;;;;;AAAA;;AAEA;AACA;AACA;AACe,SAASA,YAAY,CAACC,MAAc,EAAEC,KAAK,GAAG,CAAC,EAAU;EACpE,MAAMC,MAAM,GAAG,GAAG;EAClB,OAAOF,MAAM,CAACG,OAAO,CAAC,aAAa,EAAED,MAAM,CAACE,MAAM,CAACH,KAAK,CAAC,CAAC;AAC9D"}
@@ -0,0 +1,4 @@
1
+ import { Model } from '@zenstackhq/language/ast';
2
+ import { PluginOptions } from '@zenstackhq/sdk';
3
+ export declare const name = "Prisma";
4
+ export default function run(model: Model, options: PluginOptions): Promise<void>;