zenstack 0.6.0-pre.11 → 0.6.0-pre.12

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 (203) 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 +168 -0
  6. package/cli/cli-util.js.map +1 -0
  7. package/cli/index.d.ts +10 -0
  8. package/cli/index.js +78 -6531
  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 +84 -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 +20 -15
  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 -4289
  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 +123 -0
  95. package/plugins/prisma/prisma-builder.js +256 -0
  96. package/plugins/prisma/prisma-builder.js.map +1 -0
  97. package/plugins/prisma/schema-generator.d.ts +22 -0
  98. package/plugins/prisma/schema-generator.js +201 -0
  99. package/plugins/prisma/schema-generator.js.map +1 -0
  100. package/plugins/react-hooks/index.d.ts +4 -0
  101. package/plugins/react-hooks/index.js +14 -4332
  102. package/plugins/react-hooks/index.js.map +1 -0
  103. package/plugins/react-hooks/react-hooks-generator.d.ts +3 -0
  104. package/plugins/react-hooks/react-hooks-generator.js +333 -0
  105. package/plugins/react-hooks/react-hooks-generator.js.map +1 -0
  106. package/plugins/trpc/config.d.ts +9 -0
  107. package/plugins/trpc/config.js +12 -0
  108. package/plugins/trpc/config.js.map +1 -0
  109. package/plugins/trpc/generator.d.ts +4 -0
  110. package/plugins/trpc/generator.js +132 -0
  111. package/plugins/trpc/generator.js.map +1 -0
  112. package/plugins/trpc/helpers.d.ts +9 -0
  113. package/plugins/trpc/helpers.js +144 -0
  114. package/plugins/trpc/helpers.js.map +1 -0
  115. package/plugins/trpc/index.d.ts +5 -0
  116. package/plugins/trpc/index.js +14 -5401
  117. package/plugins/trpc/index.js.map +1 -0
  118. package/plugins/trpc/project.d.ts +2 -0
  119. package/plugins/trpc/project.js +21 -0
  120. package/plugins/trpc/project.js.map +1 -0
  121. package/plugins/trpc/types.d.ts +0 -0
  122. package/plugins/trpc/types.js +1 -0
  123. package/plugins/trpc/types.js.map +1 -0
  124. package/plugins/trpc/utils/removeDir.d.ts +1 -0
  125. package/plugins/trpc/utils/removeDir.js +22 -0
  126. package/plugins/trpc/utils/removeDir.js.map +1 -0
  127. package/plugins/trpc/utils/uncapitalizeFirstLetter.d.ts +1 -0
  128. package/plugins/trpc/utils/uncapitalizeFirstLetter.js +11 -0
  129. package/plugins/trpc/utils/uncapitalizeFirstLetter.js.map +1 -0
  130. package/plugins/zod/generator.d.ts +4 -0
  131. package/plugins/zod/generator.js +78 -0
  132. package/plugins/zod/generator.js.map +1 -0
  133. package/plugins/zod/helpers/aggregate-helpers.d.ts +5 -0
  134. package/plugins/zod/helpers/aggregate-helpers.js +77 -0
  135. package/plugins/zod/helpers/aggregate-helpers.js.map +1 -0
  136. package/plugins/zod/helpers/comments-helpers.d.ts +6 -0
  137. package/plugins/zod/helpers/comments-helpers.js +91 -0
  138. package/plugins/zod/helpers/comments-helpers.js.map +1 -0
  139. package/plugins/zod/helpers/helpers.d.ts +8 -0
  140. package/plugins/zod/helpers/helpers.js +39 -0
  141. package/plugins/zod/helpers/helpers.js.map +1 -0
  142. package/plugins/zod/helpers/include-helpers.d.ts +2 -0
  143. package/plugins/zod/helpers/include-helpers.js +94 -0
  144. package/plugins/zod/helpers/include-helpers.js.map +1 -0
  145. package/plugins/zod/helpers/index.d.ts +4 -0
  146. package/plugins/zod/helpers/index.js +50 -0
  147. package/plugins/zod/helpers/index.js.map +1 -0
  148. package/plugins/zod/helpers/model-helpers.d.ts +6 -0
  149. package/plugins/zod/helpers/model-helpers.js +50 -0
  150. package/plugins/zod/helpers/model-helpers.js.map +1 -0
  151. package/plugins/zod/helpers/modelArgs-helpers.d.ts +2 -0
  152. package/plugins/zod/helpers/modelArgs-helpers.js +62 -0
  153. package/plugins/zod/helpers/modelArgs-helpers.js.map +1 -0
  154. package/plugins/zod/helpers/mongodb-helpers.d.ts +3 -0
  155. package/plugins/zod/helpers/mongodb-helpers.js +63 -0
  156. package/plugins/zod/helpers/mongodb-helpers.js.map +1 -0
  157. package/plugins/zod/helpers/select-helpers.d.ts +2 -0
  158. package/plugins/zod/helpers/select-helpers.js +150 -0
  159. package/plugins/zod/helpers/select-helpers.js.map +1 -0
  160. package/plugins/zod/index.d.ts +5 -0
  161. package/plugins/zod/index.js +14 -4824
  162. package/plugins/zod/index.js.map +1 -0
  163. package/plugins/zod/transformer.d.ts +70 -0
  164. package/plugins/zod/transformer.js +464 -0
  165. package/plugins/zod/transformer.js.map +1 -0
  166. package/plugins/zod/types.d.ts +20 -0
  167. package/plugins/zod/types.js +1 -0
  168. package/plugins/zod/types.js.map +1 -0
  169. package/plugins/zod/utils/formatFile.d.ts +1 -0
  170. package/plugins/zod/utils/formatFile.js +35 -0
  171. package/plugins/zod/utils/formatFile.js.map +1 -0
  172. package/plugins/zod/utils/removeDir.d.ts +1 -0
  173. package/plugins/zod/utils/removeDir.js +22 -0
  174. package/plugins/zod/utils/removeDir.js.map +1 -0
  175. package/plugins/zod/utils/writeFileSafely.d.ts +1 -0
  176. package/plugins/zod/utils/writeFileSafely.js +18 -0
  177. package/plugins/zod/utils/writeFileSafely.js.map +1 -0
  178. package/res/prism-zmodel.js +2 -4
  179. package/res/stdlib.zmodel +12 -1
  180. package/telemetry.d.ts +21 -0
  181. package/telemetry.js +102 -0
  182. package/telemetry.js.map +1 -0
  183. package/types.d.ts +11 -0
  184. package/types.js +1 -0
  185. package/types.js.map +1 -0
  186. package/utils/ast-utils.d.ts +15 -0
  187. package/utils/ast-utils.js +79 -0
  188. package/utils/ast-utils.js.map +1 -0
  189. package/utils/exec-utils.d.ts +6 -0
  190. package/utils/exec-utils.js +17 -0
  191. package/utils/exec-utils.js.map +1 -0
  192. package/utils/indent-string.d.ts +4 -0
  193. package/utils/indent-string.js +16 -0
  194. package/utils/indent-string.js.map +1 -0
  195. package/utils/pkg-utils.d.ts +3 -0
  196. package/utils/pkg-utils.js +43 -0
  197. package/utils/pkg-utils.js.map +1 -0
  198. package/asset/logo-256-bg.png +0 -0
  199. package/asset/logo-dark-256.png +0 -0
  200. package/asset/logo-light-256.png +0 -0
  201. package/extension.js +0 -39
  202. package/res/package.template.json +0 -9
  203. package/res/tsconfig.template.json +0 -17
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["name","run","model","options","PrismaSchemaGenerator","generate"],"sources":["../../../src/plugins/prisma/index.ts"],"sourcesContent":["import { Model } from '@zenstackhq/language/ast';\nimport { PluginOptions } from '@zenstackhq/sdk';\nimport PrismaSchemaGenerator from './schema-generator';\n\nexport const name = 'Prisma';\n\nexport default async function run(model: Model, options: PluginOptions) {\n return new PrismaSchemaGenerator().generate(model, options);\n}\n"],"mappings":";;;;;;;AAEA;AAAuD;AAEhD,MAAMA,IAAI,GAAG,QAAQ;AAAC;AAEd,eAAeC,GAAG,CAACC,KAAY,EAAEC,OAAsB,EAAE;EACpE,OAAO,IAAIC,wBAAqB,EAAE,CAACC,QAAQ,CAACH,KAAK,EAAEC,OAAO,CAAC;AAC/D"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Prisma schema builder
3
+ */
4
+ export declare class PrismaModel {
5
+ private datasources;
6
+ private generators;
7
+ private models;
8
+ private enums;
9
+ addDataSource(name: string, provider: string, url: DataSourceUrl, shadowDatabaseUrl?: DataSourceUrl): DataSource;
10
+ addGenerator(name: string, fields: Array<{
11
+ name: string;
12
+ value: string | string[];
13
+ }>): Generator;
14
+ addModel(name: string): Model;
15
+ addEnum(name: string, fields: string[]): Enum;
16
+ toString(): string;
17
+ }
18
+ export declare class DataSource {
19
+ name: string;
20
+ provider: string;
21
+ url: DataSourceUrl;
22
+ shadowDatabaseUrl?: DataSourceUrl | undefined;
23
+ constructor(name: string, provider: string, url: DataSourceUrl, shadowDatabaseUrl?: DataSourceUrl | undefined);
24
+ toString(): string;
25
+ }
26
+ export declare class DataSourceUrl {
27
+ value: string;
28
+ isEnv: boolean;
29
+ constructor(value: string, isEnv: boolean);
30
+ toString(): string;
31
+ }
32
+ export declare class Generator {
33
+ name: string;
34
+ fields: Array<{
35
+ name: string;
36
+ value: string | string[];
37
+ }>;
38
+ constructor(name: string, fields: Array<{
39
+ name: string;
40
+ value: string | string[];
41
+ }>);
42
+ toString(): string;
43
+ }
44
+ export declare class Model {
45
+ name: string;
46
+ fields: ModelField[];
47
+ attributes: ModelAttribute[];
48
+ constructor(name: string);
49
+ addField(name: string, type: ModelFieldType | string, attributes?: FieldAttribute[]): ModelField;
50
+ addAttribute(name: string, args?: AttributeArg[]): ModelAttribute;
51
+ toString(): string;
52
+ }
53
+ export declare type ScalarTypes = 'String' | 'Boolean' | 'Int' | 'BigInt' | 'Float' | 'Decimal' | 'DateTime' | 'Json' | 'Bytes' | 'Unsupported';
54
+ export declare class ModelFieldType {
55
+ type: ScalarTypes | string;
56
+ array?: boolean | undefined;
57
+ optional?: boolean | undefined;
58
+ constructor(type: ScalarTypes | string, array?: boolean | undefined, optional?: boolean | undefined);
59
+ toString(): string;
60
+ }
61
+ export declare class ModelField {
62
+ name: string;
63
+ type: ModelFieldType | string;
64
+ attributes: FieldAttribute[];
65
+ constructor(name: string, type: ModelFieldType | string, attributes?: FieldAttribute[]);
66
+ addAttribute(name: string, args?: AttributeArg[]): FieldAttribute;
67
+ toString(): string;
68
+ }
69
+ export declare class FieldAttribute {
70
+ name: string;
71
+ args: AttributeArg[];
72
+ constructor(name: string, args?: AttributeArg[]);
73
+ toString(): string;
74
+ }
75
+ export declare class ModelAttribute {
76
+ name: string;
77
+ args: AttributeArg[];
78
+ constructor(name: string, args?: AttributeArg[]);
79
+ toString(): string;
80
+ }
81
+ export declare class AttributeArg {
82
+ name: string | undefined;
83
+ value: AttributeArgValue;
84
+ constructor(name: string | undefined, value: AttributeArgValue);
85
+ toString(): string;
86
+ }
87
+ export declare class AttributeArgValue {
88
+ type: 'String' | 'FieldReference' | 'Number' | 'Boolean' | 'Array' | 'FunctionCall';
89
+ value: string | number | boolean | FieldReference | FunctionCall | AttributeArgValue[];
90
+ constructor(type: 'String' | 'FieldReference' | 'Number' | 'Boolean' | 'Array' | 'FunctionCall', value: string | number | boolean | FieldReference | FunctionCall | AttributeArgValue[]);
91
+ toString(): string;
92
+ }
93
+ export declare class FieldReference {
94
+ field: string;
95
+ args: FieldReferenceArg[];
96
+ constructor(field: string, args?: FieldReferenceArg[]);
97
+ }
98
+ export declare class FieldReferenceArg {
99
+ name: 'sort';
100
+ value: 'Asc' | 'Desc';
101
+ constructor(name: 'sort', value: 'Asc' | 'Desc');
102
+ toString(): string;
103
+ }
104
+ export declare class FunctionCall {
105
+ func: string;
106
+ args: FunctionCallArg[];
107
+ constructor(func: string, args?: FunctionCallArg[]);
108
+ toString(): string;
109
+ }
110
+ export declare class FunctionCallArg {
111
+ name: string | undefined;
112
+ value: any;
113
+ constructor(name: string | undefined, value: any);
114
+ toString(): string;
115
+ }
116
+ export declare class Enum {
117
+ name: string;
118
+ fields: EnumField[];
119
+ constructor(name: string, fields: EnumField[]);
120
+ toString(): string;
121
+ }
122
+ declare type EnumField = string;
123
+ export {};
@@ -0,0 +1,256 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.PrismaModel = exports.ModelFieldType = exports.ModelField = exports.ModelAttribute = exports.Model = exports.Generator = exports.FunctionCallArg = exports.FunctionCall = exports.FieldReferenceArg = exports.FieldReference = exports.FieldAttribute = exports.Enum = exports.DataSourceUrl = exports.DataSource = exports.AttributeArgValue = exports.AttributeArg = void 0;
7
+ var _indentString = _interopRequireDefault(require("./indent-string"));
8
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
+ /**
10
+ * Prisma schema builder
11
+ */
12
+ class PrismaModel {
13
+ datasources = [];
14
+ generators = [];
15
+ models = [];
16
+ enums = [];
17
+ addDataSource(name, provider, url, shadowDatabaseUrl) {
18
+ const ds = new DataSource(name, provider, url, shadowDatabaseUrl);
19
+ this.datasources.push(ds);
20
+ return ds;
21
+ }
22
+ addGenerator(name, fields) {
23
+ const generator = new Generator(name, fields);
24
+ this.generators.push(generator);
25
+ return generator;
26
+ }
27
+ addModel(name) {
28
+ const model = new Model(name);
29
+ this.models.push(model);
30
+ return model;
31
+ }
32
+ addEnum(name, fields) {
33
+ const e = new Enum(name, fields);
34
+ this.enums.push(e);
35
+ return e;
36
+ }
37
+ toString() {
38
+ return [...this.datasources, ...this.generators, ...this.enums, ...this.models].map(d => d.toString()).join('\n\n');
39
+ }
40
+ }
41
+ exports.PrismaModel = PrismaModel;
42
+ class DataSource {
43
+ constructor(name, provider, url, shadowDatabaseUrl) {
44
+ this.name = name;
45
+ this.provider = provider;
46
+ this.url = url;
47
+ this.shadowDatabaseUrl = shadowDatabaseUrl;
48
+ }
49
+ toString() {
50
+ return `datasource ${this.name} {\n` + (0, _indentString.default)(`provider="${this.provider}"\n`) + (0, _indentString.default)(`url=${this.url}\n`) + (this.shadowDatabaseUrl ? (0, _indentString.default)(`shadowDatabaseurl=${this.shadowDatabaseUrl}\n`) : '') + `}`;
51
+ }
52
+ }
53
+ exports.DataSource = DataSource;
54
+ class DataSourceUrl {
55
+ constructor(value, isEnv) {
56
+ this.value = value;
57
+ this.isEnv = isEnv;
58
+ }
59
+ toString() {
60
+ return this.isEnv ? `env("${this.value}")` : `"${this.value}"`;
61
+ }
62
+ }
63
+ exports.DataSourceUrl = DataSourceUrl;
64
+ class Generator {
65
+ constructor(name, fields) {
66
+ this.name = name;
67
+ this.fields = fields;
68
+ }
69
+ toString() {
70
+ return `generator ${this.name} {\n` + this.fields.map(f => (0, _indentString.default)(`${f.name} = ${JSON.stringify(f.value)}`)).join('\n') + `\n}`;
71
+ }
72
+ }
73
+ exports.Generator = Generator;
74
+ class Model {
75
+ fields = [];
76
+ attributes = [];
77
+ constructor(name) {
78
+ this.name = name;
79
+ }
80
+ addField(name, type, attributes = []) {
81
+ const field = new ModelField(name, type, attributes);
82
+ this.fields.push(field);
83
+ return field;
84
+ }
85
+ addAttribute(name, args = []) {
86
+ const attr = new ModelAttribute(name, args);
87
+ this.attributes.push(attr);
88
+ return attr;
89
+ }
90
+ toString() {
91
+ return `model ${this.name} {\n` + (0, _indentString.default)([...this.fields, ...this.attributes].map(d => d.toString()).join('\n')) + `\n}`;
92
+ }
93
+ }
94
+ exports.Model = Model;
95
+ class ModelFieldType {
96
+ constructor(type, array, optional) {
97
+ this.type = type;
98
+ this.array = array;
99
+ this.optional = optional;
100
+ }
101
+ toString() {
102
+ return `${this.type}${this.array ? '[]' : ''}${this.optional ? '?' : ''}`;
103
+ }
104
+ }
105
+ exports.ModelFieldType = ModelFieldType;
106
+ class ModelField {
107
+ constructor(name, type, attributes = []) {
108
+ this.name = name;
109
+ this.type = type;
110
+ this.attributes = attributes;
111
+ }
112
+ addAttribute(name, args = []) {
113
+ const attr = new FieldAttribute(name, args);
114
+ this.attributes.push(attr);
115
+ return attr;
116
+ }
117
+ toString() {
118
+ return `${this.name} ${this.type}` + (this.attributes.length > 0 ? ' ' + this.attributes.map(a => a.toString()).join(' ') : '');
119
+ }
120
+ }
121
+ exports.ModelField = ModelField;
122
+ class FieldAttribute {
123
+ constructor(name, args = []) {
124
+ this.name = name;
125
+ this.args = args;
126
+ }
127
+ toString() {
128
+ return `${this.name}(` + this.args.map(a => a.toString()).join(', ') + `)`;
129
+ }
130
+ }
131
+ exports.FieldAttribute = FieldAttribute;
132
+ class ModelAttribute {
133
+ constructor(name, args = []) {
134
+ this.name = name;
135
+ this.args = args;
136
+ }
137
+ toString() {
138
+ return `${this.name}(` + this.args.map(a => a.toString()).join(', ') + `)`;
139
+ }
140
+ }
141
+ exports.ModelAttribute = ModelAttribute;
142
+ class AttributeArg {
143
+ constructor(name, value) {
144
+ this.name = name;
145
+ this.value = value;
146
+ }
147
+ toString() {
148
+ return this.name ? `${this.name}: ${this.value}` : this.value.toString();
149
+ }
150
+ }
151
+ exports.AttributeArg = AttributeArg;
152
+ class AttributeArgValue {
153
+ constructor(type, value) {
154
+ this.type = type;
155
+ this.value = value;
156
+ switch (type) {
157
+ case 'String':
158
+ if (typeof value !== 'string') throw new Error('Value must be string');
159
+ break;
160
+ case 'Number':
161
+ if (typeof value !== 'number') throw new Error('Value must be number');
162
+ break;
163
+ case 'Boolean':
164
+ if (typeof value !== 'boolean') throw new Error('Value must be boolean');
165
+ break;
166
+ case 'Array':
167
+ if (!Array.isArray(value)) throw new Error('Value must be array');
168
+ break;
169
+ case 'FieldReference':
170
+ if (typeof value !== 'string' && !(value instanceof FieldReference)) throw new Error('Value must be string or FieldReference');
171
+ break;
172
+ case 'FunctionCall':
173
+ if (!(value instanceof FunctionCall)) throw new Error('Value must be FunctionCall');
174
+ break;
175
+ }
176
+ }
177
+ toString() {
178
+ switch (this.type) {
179
+ case 'String':
180
+ return `"${this.value}"`;
181
+ case 'Number':
182
+ return this.value.toString();
183
+ case 'FieldReference':
184
+ {
185
+ if (typeof this.value === 'string') {
186
+ return this.value;
187
+ } else {
188
+ const fr = this.value;
189
+ let r = fr.field;
190
+ if (fr.args.length > 0) {
191
+ r += '(' + fr.args.map(a => a.toString()).join(',') + ')';
192
+ }
193
+ return r;
194
+ }
195
+ }
196
+ case 'FunctionCall':
197
+ return this.value.toString();
198
+ case 'Boolean':
199
+ return this.value ? 'true' : 'false';
200
+ case 'Array':
201
+ return '[' + this.value.map(v => v.toString()).join(', ') + ']';
202
+ default:
203
+ throw new Error(`Unknown attribute value type ${this.type}`);
204
+ }
205
+ }
206
+ }
207
+ exports.AttributeArgValue = AttributeArgValue;
208
+ class FieldReference {
209
+ constructor(field, args = []) {
210
+ this.field = field;
211
+ this.args = args;
212
+ }
213
+ }
214
+ exports.FieldReference = FieldReference;
215
+ class FieldReferenceArg {
216
+ constructor(name, value) {
217
+ this.name = name;
218
+ this.value = value;
219
+ }
220
+ toString() {
221
+ return `${this.name}: ${this.value}`;
222
+ }
223
+ }
224
+ exports.FieldReferenceArg = FieldReferenceArg;
225
+ class FunctionCall {
226
+ constructor(func, args = []) {
227
+ this.func = func;
228
+ this.args = args;
229
+ }
230
+ toString() {
231
+ return `${this.func}` + '(' + this.args.map(a => a.toString()).join(', ') + ')';
232
+ }
233
+ }
234
+ exports.FunctionCall = FunctionCall;
235
+ class FunctionCallArg {
236
+ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any
237
+ constructor(name, value) {
238
+ this.name = name;
239
+ this.value = value;
240
+ }
241
+ toString() {
242
+ return this.name ? `${this.name}: ${this.value}` : this.value;
243
+ }
244
+ }
245
+ exports.FunctionCallArg = FunctionCallArg;
246
+ class Enum {
247
+ constructor(name, fields) {
248
+ this.name = name;
249
+ this.fields = fields;
250
+ }
251
+ toString() {
252
+ return `enum ${this.name} {\n` + (0, _indentString.default)(this.fields.join('\n')) + '\n}';
253
+ }
254
+ }
255
+ exports.Enum = Enum;
256
+ //# sourceMappingURL=prisma-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-builder.js","names":["PrismaModel","datasources","generators","models","enums","addDataSource","name","provider","url","shadowDatabaseUrl","ds","DataSource","push","addGenerator","fields","generator","Generator","addModel","model","Model","addEnum","e","Enum","toString","map","d","join","constructor","indentString","DataSourceUrl","value","isEnv","f","JSON","stringify","attributes","addField","type","field","ModelField","addAttribute","args","attr","ModelAttribute","ModelFieldType","array","optional","FieldAttribute","length","a","AttributeArg","AttributeArgValue","Error","Array","isArray","FieldReference","FunctionCall","fr","r","v","FieldReferenceArg","func","FunctionCallArg"],"sources":["../../../src/plugins/prisma/prisma-builder.ts"],"sourcesContent":["import indentString from './indent-string';\n\n/**\n * Prisma schema builder\n */\nexport class PrismaModel {\n private datasources: DataSource[] = [];\n private generators: Generator[] = [];\n private models: Model[] = [];\n private enums: Enum[] = [];\n\n addDataSource(name: string, provider: string, url: DataSourceUrl, shadowDatabaseUrl?: DataSourceUrl): DataSource {\n const ds = new DataSource(name, provider, url, shadowDatabaseUrl);\n this.datasources.push(ds);\n return ds;\n }\n\n addGenerator(name: string, fields: Array<{ name: string; value: string | string[] }>): Generator {\n const generator = new Generator(name, fields);\n this.generators.push(generator);\n return generator;\n }\n\n addModel(name: string): Model {\n const model = new Model(name);\n this.models.push(model);\n return model;\n }\n\n addEnum(name: string, fields: string[]): Enum {\n const e = new Enum(name, fields);\n this.enums.push(e);\n return e;\n }\n\n toString(): string {\n return [...this.datasources, ...this.generators, ...this.enums, ...this.models]\n .map((d) => d.toString())\n .join('\\n\\n');\n }\n}\n\nexport class DataSource {\n constructor(\n public name: string,\n public provider: string,\n public url: DataSourceUrl,\n public shadowDatabaseUrl?: DataSourceUrl\n ) {}\n\n toString(): string {\n return (\n `datasource ${this.name} {\\n` +\n indentString(`provider=\"${this.provider}\"\\n`) +\n indentString(`url=${this.url}\\n`) +\n (this.shadowDatabaseUrl ? indentString(`shadowDatabaseurl=${this.shadowDatabaseUrl}\\n`) : '') +\n `}`\n );\n }\n}\n\nexport class DataSourceUrl {\n constructor(public value: string, public isEnv: boolean) {}\n\n toString(): string {\n return this.isEnv ? `env(\"${this.value}\")` : `\"${this.value}\"`;\n }\n}\n\nexport class Generator {\n constructor(public name: string, public fields: Array<{ name: string; value: string | string[] }>) {}\n\n toString(): string {\n return (\n `generator ${this.name} {\\n` +\n this.fields.map((f) => indentString(`${f.name} = ${JSON.stringify(f.value)}`)).join('\\n') +\n `\\n}`\n );\n }\n}\n\nexport class Model {\n public fields: ModelField[] = [];\n public attributes: ModelAttribute[] = [];\n constructor(public name: string) {}\n\n addField(name: string, type: ModelFieldType | string, attributes: FieldAttribute[] = []): ModelField {\n const field = new ModelField(name, type, attributes);\n this.fields.push(field);\n return field;\n }\n\n addAttribute(name: string, args: AttributeArg[] = []): ModelAttribute {\n const attr = new ModelAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n toString(): string {\n return (\n `model ${this.name} {\\n` +\n indentString([...this.fields, ...this.attributes].map((d) => d.toString()).join('\\n')) +\n `\\n}`\n );\n }\n}\n\nexport type ScalarTypes =\n | 'String'\n | 'Boolean'\n | 'Int'\n | 'BigInt'\n | 'Float'\n | 'Decimal'\n | 'DateTime'\n | 'Json'\n | 'Bytes'\n | 'Unsupported';\n\nexport class ModelFieldType {\n constructor(public type: ScalarTypes | string, public array?: boolean, public optional?: boolean) {}\n\n toString(): string {\n return `${this.type}${this.array ? '[]' : ''}${this.optional ? '?' : ''}`;\n }\n}\n\nexport class ModelField {\n constructor(public name: string, public type: ModelFieldType | string, public attributes: FieldAttribute[] = []) {}\n\n addAttribute(name: string, args: AttributeArg[] = []): FieldAttribute {\n const attr = new FieldAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n toString(): string {\n return (\n `${this.name} ${this.type}` +\n (this.attributes.length > 0 ? ' ' + this.attributes.map((a) => a.toString()).join(' ') : '')\n );\n }\n}\n\nexport class FieldAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\nexport class ModelAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\nexport class AttributeArg {\n constructor(public name: string | undefined, public value: AttributeArgValue) {}\n\n toString(): string {\n return this.name ? `${this.name}: ${this.value}` : this.value.toString();\n }\n}\n\nexport class AttributeArgValue {\n constructor(\n public type: 'String' | 'FieldReference' | 'Number' | 'Boolean' | 'Array' | 'FunctionCall',\n public value: string | number | boolean | FieldReference | FunctionCall | AttributeArgValue[]\n ) {\n switch (type) {\n case 'String':\n if (typeof value !== 'string') throw new Error('Value must be string');\n break;\n case 'Number':\n if (typeof value !== 'number') throw new Error('Value must be number');\n break;\n case 'Boolean':\n if (typeof value !== 'boolean') throw new Error('Value must be boolean');\n break;\n case 'Array':\n if (!Array.isArray(value)) throw new Error('Value must be array');\n break;\n case 'FieldReference':\n if (typeof value !== 'string' && !(value instanceof FieldReference))\n throw new Error('Value must be string or FieldReference');\n break;\n case 'FunctionCall':\n if (!(value instanceof FunctionCall)) throw new Error('Value must be FunctionCall');\n break;\n }\n }\n\n toString(): string {\n switch (this.type) {\n case 'String':\n return `\"${this.value}\"`;\n case 'Number':\n return this.value.toString();\n case 'FieldReference': {\n if (typeof this.value === 'string') {\n return this.value;\n } else {\n const fr = this.value as FieldReference;\n let r = fr.field;\n if (fr.args.length > 0) {\n r += '(' + fr.args.map((a) => a.toString()).join(',') + ')';\n }\n return r;\n }\n }\n case 'FunctionCall':\n return this.value.toString();\n case 'Boolean':\n return this.value ? 'true' : 'false';\n case 'Array':\n return '[' + (this.value as AttributeArgValue[]).map((v) => v.toString()).join(', ') + ']';\n default:\n throw new Error(`Unknown attribute value type ${this.type}`);\n }\n }\n}\n\nexport class FieldReference {\n constructor(public field: string, public args: FieldReferenceArg[] = []) {}\n}\n\nexport class FieldReferenceArg {\n constructor(public name: 'sort', public value: 'Asc' | 'Desc') {}\n\n toString(): string {\n return `${this.name}: ${this.value}`;\n }\n}\n\nexport class FunctionCall {\n constructor(public func: string, public args: FunctionCallArg[] = []) {}\n\n toString(): string {\n return `${this.func}` + '(' + this.args.map((a) => a.toString()).join(', ') + ')';\n }\n}\n\nexport class FunctionCallArg {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any\n constructor(public name: string | undefined, public value: any) {}\n\n toString(): string {\n return this.name ? `${this.name}: ${this.value}` : this.value;\n }\n}\n\nexport class Enum {\n constructor(public name: string, public fields: EnumField[]) {}\n\n toString(): string {\n return `enum ${this.name} {\\n` + indentString(this.fields.join('\\n')) + '\\n}';\n }\n}\n\ntype EnumField = string;\n"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { InvocationExpr, Model } from '@zenstackhq/language/ast';
2
+ import { PluginOptions } from '@zenstackhq/sdk';
3
+ import { FunctionCall as PrismaFunctionCall } from './prisma-builder';
4
+ /**
5
+ * Generates Prisma schema file
6
+ */
7
+ export default class PrismaSchemaGenerator {
8
+ generate(model: Model, options: PluginOptions): Promise<void>;
9
+ private generateDataSource;
10
+ private extractDataSourceUrl;
11
+ private generateGenerator;
12
+ private generateModel;
13
+ private isPrismaAttribute;
14
+ private generateModelField;
15
+ private makeFieldAttribute;
16
+ private makeAttributeArg;
17
+ private makeAttributeArgValue;
18
+ makeFunctionCall(node: InvocationExpr): PrismaFunctionCall;
19
+ private generateModelAttribute;
20
+ private generateEnum;
21
+ private isStringLiteral;
22
+ }
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _ast = require("@zenstackhq/language/ast");
8
+ var _sdk = require("@zenstackhq/sdk");
9
+ var _fs = _interopRequireDefault(require("fs"));
10
+ var _promises = require("fs/promises");
11
+ var _path = _interopRequireDefault(require("path"));
12
+ var _astUtils = require("../../utils/ast-utils");
13
+ var _execUtils = require("../../utils/exec-utils");
14
+ var _prismaBuilder = require("./prisma-builder");
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+ /**
17
+ * Generates Prisma schema file
18
+ */
19
+ class PrismaSchemaGenerator {
20
+ async generate(model, options) {
21
+ const prisma = new _prismaBuilder.PrismaModel();
22
+ for (const decl of model.declarations) {
23
+ switch (decl.$type) {
24
+ case _ast.DataSource:
25
+ this.generateDataSource(prisma, decl);
26
+ break;
27
+ case _ast.Enum:
28
+ this.generateEnum(prisma, decl);
29
+ break;
30
+ case _ast.DataModel:
31
+ this.generateModel(prisma, decl);
32
+ break;
33
+ case _ast.Generator:
34
+ this.generateGenerator(prisma, decl);
35
+ break;
36
+ }
37
+ }
38
+ const outFile = options.output ?? './prisma/schema.prisma';
39
+ if (!_fs.default.existsSync(_path.default.dirname(outFile))) {
40
+ _fs.default.mkdirSync(_path.default.dirname(outFile), {
41
+ recursive: true
42
+ });
43
+ }
44
+ await (0, _promises.writeFile)(outFile, prisma.toString());
45
+
46
+ // run 'prisma generate'
47
+ await (0, _execUtils.execSync)(`npx prisma generate --schema ${outFile}`);
48
+ }
49
+ generateDataSource(prisma, dataSource) {
50
+ let provider = undefined;
51
+ let url = undefined;
52
+ let shadowDatabaseUrl = undefined;
53
+ for (const f of dataSource.fields) {
54
+ switch (f.name) {
55
+ case 'provider':
56
+ {
57
+ if (this.isStringLiteral(f.value)) {
58
+ provider = f.value.value;
59
+ } else {
60
+ throw new _sdk.PluginError('Datasource provider must be set to a string');
61
+ }
62
+ break;
63
+ }
64
+ case 'url':
65
+ {
66
+ const r = this.extractDataSourceUrl(f.value);
67
+ if (!r) {
68
+ throw new _sdk.PluginError('Invalid value for datasource url');
69
+ }
70
+ url = r;
71
+ break;
72
+ }
73
+ case 'shadowDatabaseUrl':
74
+ {
75
+ const r = this.extractDataSourceUrl(f.value);
76
+ if (!r) {
77
+ throw new _sdk.PluginError('Invalid value for datasource url');
78
+ }
79
+ shadowDatabaseUrl = r;
80
+ break;
81
+ }
82
+ }
83
+ }
84
+ if (!provider) {
85
+ throw new _sdk.PluginError('Datasource is missing "provider" field');
86
+ }
87
+ if (!url) {
88
+ throw new _sdk.PluginError('Datasource is missing "url" field');
89
+ }
90
+ prisma.addDataSource(dataSource.name, provider, url, shadowDatabaseUrl);
91
+ }
92
+ extractDataSourceUrl(fieldValue) {
93
+ var _fieldValue$function$;
94
+ if (this.isStringLiteral(fieldValue)) {
95
+ return new _prismaBuilder.DataSourceUrl(fieldValue.value, false);
96
+ } else if ((0, _ast.isInvocationExpr)(fieldValue) && ((_fieldValue$function$ = fieldValue.function.ref) === null || _fieldValue$function$ === void 0 ? void 0 : _fieldValue$function$.name) === 'env' && fieldValue.args.length === 1 && this.isStringLiteral(fieldValue.args[0].value)) {
97
+ return new _prismaBuilder.DataSourceUrl(fieldValue.args[0].value.value, true);
98
+ } else {
99
+ return null;
100
+ }
101
+ }
102
+ generateGenerator(prisma, decl) {
103
+ prisma.addGenerator(decl.name, decl.fields.map(f => {
104
+ const value = (0, _ast.isArrayExpr)(f.value) ? (0, _sdk.getLiteralArray)(f.value) : (0, _sdk.getLiteral)(f.value);
105
+ return {
106
+ name: f.name,
107
+ value
108
+ };
109
+ }));
110
+ }
111
+ generateModel(prisma, decl) {
112
+ const model = prisma.addModel(decl.name);
113
+ for (const field of decl.fields) {
114
+ this.generateModelField(model, field);
115
+ }
116
+ const {
117
+ allowAll,
118
+ denyAll,
119
+ hasFieldValidation
120
+ } = (0, _astUtils.analyzePolicies)(decl);
121
+ if (!allowAll && !denyAll || hasFieldValidation) {
122
+ // generate auxiliary fields for policy check
123
+
124
+ // add an "zenstack_guard" field for dealing with pure auth() related conditions
125
+ model.addField(_sdk.GUARD_FIELD_NAME, 'Boolean', [new _prismaBuilder.FieldAttribute('@default', [new _prismaBuilder.AttributeArg(undefined, new _prismaBuilder.AttributeArgValue('Boolean', true))])]);
126
+
127
+ // add an "zenstack_transaction" field for tracking records created/updated with nested writes
128
+ model.addField(_sdk.TRANSACTION_FIELD_NAME, 'String?');
129
+
130
+ // create an index for "zenstack_transaction" field
131
+ model.addAttribute('@@index', [new _prismaBuilder.AttributeArg(undefined, new _prismaBuilder.AttributeArgValue('Array', [new _prismaBuilder.AttributeArgValue('FieldReference', _sdk.TRANSACTION_FIELD_NAME)]))]);
132
+ }
133
+ for (const attr of decl.attributes.filter(attr => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))) {
134
+ this.generateModelAttribute(model, attr);
135
+ }
136
+ }
137
+ isPrismaAttribute(attr) {
138
+ return !!attr.attributes.find(a => {
139
+ var _a$decl$ref;
140
+ return ((_a$decl$ref = a.decl.ref) === null || _a$decl$ref === void 0 ? void 0 : _a$decl$ref.name) === '@@@prisma';
141
+ });
142
+ }
143
+ generateModelField(model, field) {
144
+ var _field$type$reference, _field$type$reference2;
145
+ const fieldType = field.type.type || ((_field$type$reference = field.type.reference) === null || _field$type$reference === void 0 ? void 0 : (_field$type$reference2 = _field$type$reference.ref) === null || _field$type$reference2 === void 0 ? void 0 : _field$type$reference2.name);
146
+ if (!fieldType) {
147
+ throw new _sdk.PluginError(`Field type is not resolved: ${field.$container.name}.${field.name}`);
148
+ }
149
+ const type = new _prismaBuilder.ModelFieldType(fieldType, field.type.array, field.type.optional);
150
+ const attributes = field.attributes.filter(attr => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref)).map(attr => this.makeFieldAttribute(attr));
151
+ model.addField(field.name, type, attributes);
152
+ }
153
+ makeFieldAttribute(attr) {
154
+ return new _prismaBuilder.FieldAttribute((0, _sdk.resolved)(attr.decl).name, attr.args.map(arg => this.makeAttributeArg(arg)));
155
+ }
156
+ makeAttributeArg(arg) {
157
+ return new _prismaBuilder.AttributeArg(arg.name, this.makeAttributeArgValue(arg.value));
158
+ }
159
+ makeAttributeArgValue(node) {
160
+ if ((0, _ast.isLiteralExpr)(node)) {
161
+ switch (typeof node.value) {
162
+ case 'string':
163
+ return new _prismaBuilder.AttributeArgValue('String', node.value);
164
+ case 'number':
165
+ return new _prismaBuilder.AttributeArgValue('Number', node.value);
166
+ case 'boolean':
167
+ return new _prismaBuilder.AttributeArgValue('Boolean', node.value);
168
+ default:
169
+ throw new _sdk.PluginError(`Unexpected literal type: ${typeof node.value}`);
170
+ }
171
+ } else if ((0, _ast.isArrayExpr)(node)) {
172
+ return new _prismaBuilder.AttributeArgValue('Array', new Array(...node.items.map(item => this.makeAttributeArgValue(item))));
173
+ } else if ((0, _ast.isReferenceExpr)(node)) {
174
+ return new _prismaBuilder.AttributeArgValue('FieldReference', new _prismaBuilder.FieldReference((0, _sdk.resolved)(node.target).name, node.args.map(arg => new _prismaBuilder.FieldReferenceArg(arg.name, arg.value))));
175
+ } else if ((0, _ast.isInvocationExpr)(node)) {
176
+ // invocation
177
+ return new _prismaBuilder.AttributeArgValue('FunctionCall', this.makeFunctionCall(node));
178
+ } else {
179
+ throw new _sdk.PluginError(`Unsupported attribute argument expression type: ${node.$type}`);
180
+ }
181
+ }
182
+ makeFunctionCall(node) {
183
+ return new _prismaBuilder.FunctionCall((0, _sdk.resolved)(node.function).name, node.args.map(arg => {
184
+ if (!(0, _ast.isLiteralExpr)(arg.value)) {
185
+ throw new _sdk.PluginError('Function call argument must be literal');
186
+ }
187
+ return new _prismaBuilder.FunctionCallArg(arg.name, arg.value.value);
188
+ }));
189
+ }
190
+ generateModelAttribute(model, attr) {
191
+ model.attributes.push(new _prismaBuilder.ModelAttribute((0, _sdk.resolved)(attr.decl).name, attr.args.map(arg => this.makeAttributeArg(arg))));
192
+ }
193
+ generateEnum(prisma, decl) {
194
+ prisma.addEnum(decl.name, decl.fields.map(f => f.name));
195
+ }
196
+ isStringLiteral(node) {
197
+ return (0, _ast.isLiteralExpr)(node) && typeof node.value === 'string';
198
+ }
199
+ }
200
+ exports.default = PrismaSchemaGenerator;
201
+ //# sourceMappingURL=schema-generator.js.map