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

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 +138 -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 +24 -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,212 @@
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 _zmodelCodeGenerator = _interopRequireDefault(require("./zmodel-code-generator"));
15
+ var _prismaBuilder = require("./prisma-builder");
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+ /**
18
+ * Generates Prisma schema file
19
+ */
20
+ class PrismaSchemaGenerator {
21
+ zModelGenerator = new _zmodelCodeGenerator.default();
22
+ PRELUDE = `//////////////////////////////////////////////////////////////////////////////////////////////
23
+ // DO NOT MODIFY THIS FILE //
24
+ // This file is automatically generated by ZenStack CLI and should not be manually updated. //
25
+ //////////////////////////////////////////////////////////////////////////////////////////////
26
+
27
+ `;
28
+ async generate(model, options) {
29
+ const prisma = new _prismaBuilder.PrismaModel();
30
+ for (const decl of model.declarations) {
31
+ switch (decl.$type) {
32
+ case _ast.DataSource:
33
+ this.generateDataSource(prisma, decl);
34
+ break;
35
+ case _ast.Enum:
36
+ this.generateEnum(prisma, decl);
37
+ break;
38
+ case _ast.DataModel:
39
+ this.generateModel(prisma, decl);
40
+ break;
41
+ case _ast.GeneratorDecl:
42
+ this.generateGenerator(prisma, decl);
43
+ break;
44
+ }
45
+ }
46
+ const outFile = options.output ?? './prisma/schema.prisma';
47
+ if (!_fs.default.existsSync(_path.default.dirname(outFile))) {
48
+ _fs.default.mkdirSync(_path.default.dirname(outFile), {
49
+ recursive: true
50
+ });
51
+ }
52
+ await (0, _promises.writeFile)(outFile, this.PRELUDE + prisma.toString());
53
+
54
+ // run 'prisma generate'
55
+ await (0, _execUtils.execSync)(`npx prisma generate --schema ${outFile}`);
56
+ }
57
+ generateDataSource(prisma, dataSource) {
58
+ let provider = undefined;
59
+ let url = undefined;
60
+ let shadowDatabaseUrl = undefined;
61
+ for (const f of dataSource.fields) {
62
+ switch (f.name) {
63
+ case 'provider':
64
+ {
65
+ if (this.isStringLiteral(f.value)) {
66
+ provider = f.value.value;
67
+ } else {
68
+ throw new _sdk.PluginError('Datasource provider must be set to a string');
69
+ }
70
+ break;
71
+ }
72
+ case 'url':
73
+ {
74
+ const r = this.extractDataSourceUrl(f.value);
75
+ if (!r) {
76
+ throw new _sdk.PluginError('Invalid value for datasource url');
77
+ }
78
+ url = r;
79
+ break;
80
+ }
81
+ case 'shadowDatabaseUrl':
82
+ {
83
+ const r = this.extractDataSourceUrl(f.value);
84
+ if (!r) {
85
+ throw new _sdk.PluginError('Invalid value for datasource url');
86
+ }
87
+ shadowDatabaseUrl = r;
88
+ break;
89
+ }
90
+ }
91
+ }
92
+ if (!provider) {
93
+ throw new _sdk.PluginError('Datasource is missing "provider" field');
94
+ }
95
+ if (!url) {
96
+ throw new _sdk.PluginError('Datasource is missing "url" field');
97
+ }
98
+ prisma.addDataSource(dataSource.name, provider, url, shadowDatabaseUrl);
99
+ }
100
+ extractDataSourceUrl(fieldValue) {
101
+ var _fieldValue$function$;
102
+ if (this.isStringLiteral(fieldValue)) {
103
+ return new _prismaBuilder.DataSourceUrl(fieldValue.value, false);
104
+ } 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)) {
105
+ return new _prismaBuilder.DataSourceUrl(fieldValue.args[0].value.value, true);
106
+ } else {
107
+ return null;
108
+ }
109
+ }
110
+ generateGenerator(prisma, decl) {
111
+ prisma.addGenerator(decl.name, decl.fields.map(f => {
112
+ const value = (0, _ast.isArrayExpr)(f.value) ? (0, _sdk.getLiteralArray)(f.value) : (0, _sdk.getLiteral)(f.value);
113
+ return {
114
+ name: f.name,
115
+ value
116
+ };
117
+ }));
118
+ }
119
+ generateModel(prisma, decl) {
120
+ const model = prisma.addModel(decl.name);
121
+ for (const field of decl.fields) {
122
+ this.generateModelField(model, field);
123
+ }
124
+ const {
125
+ allowAll,
126
+ denyAll,
127
+ hasFieldValidation
128
+ } = (0, _astUtils.analyzePolicies)(decl);
129
+ if (!allowAll && !denyAll || hasFieldValidation) {
130
+ // generate auxiliary fields for policy check
131
+
132
+ // add an "zenstack_guard" field for dealing with pure auth() related conditions
133
+ model.addField(_sdk.GUARD_FIELD_NAME, 'Boolean', [new _prismaBuilder.FieldAttribute('@default', [new _prismaBuilder.AttributeArg(undefined, new _prismaBuilder.AttributeArgValue('Boolean', true))])]);
134
+
135
+ // add an "zenstack_transaction" field for tracking records created/updated with nested writes
136
+ model.addField(_sdk.TRANSACTION_FIELD_NAME, 'String?');
137
+
138
+ // create an index for "zenstack_transaction" field
139
+ model.addAttribute('@@index', [new _prismaBuilder.AttributeArg(undefined, new _prismaBuilder.AttributeArgValue('Array', [new _prismaBuilder.AttributeArgValue('FieldReference', _sdk.TRANSACTION_FIELD_NAME)]))]);
140
+ }
141
+ for (const attr of decl.attributes.filter(attr => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))) {
142
+ this.generateModelAttribute(model, attr);
143
+ }
144
+ decl.attributes.filter(attr => attr.decl.ref && !this.isPrismaAttribute(attr.decl.ref)).forEach(attr => model.addComment(this.zModelGenerator.generateAttribute(attr)));
145
+ }
146
+ isPrismaAttribute(attr) {
147
+ return !!attr.attributes.find(a => {
148
+ var _a$decl$ref;
149
+ return ((_a$decl$ref = a.decl.ref) === null || _a$decl$ref === void 0 ? void 0 : _a$decl$ref.name) === '@@@prisma';
150
+ });
151
+ }
152
+ generateModelField(model, field) {
153
+ var _field$type$reference, _field$type$reference2;
154
+ 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);
155
+ if (!fieldType) {
156
+ throw new _sdk.PluginError(`Field type is not resolved: ${field.$container.name}.${field.name}`);
157
+ }
158
+ const type = new _prismaBuilder.ModelFieldType(fieldType, field.type.array, field.type.optional);
159
+ const attributes = field.attributes.filter(attr => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref)).map(attr => this.makeFieldAttribute(attr));
160
+ const nonPrismaAttributes = field.attributes.filter(attr => !attr.decl.ref || !this.isPrismaAttribute(attr.decl.ref));
161
+ const documentations = nonPrismaAttributes.map(attr => this.zModelGenerator.generateAttribute(attr));
162
+ model.addField(field.name, type, attributes, documentations);
163
+ }
164
+ makeFieldAttribute(attr) {
165
+ return new _prismaBuilder.FieldAttribute((0, _sdk.resolved)(attr.decl).name, attr.args.map(arg => this.makeAttributeArg(arg)));
166
+ }
167
+ makeAttributeArg(arg) {
168
+ return new _prismaBuilder.AttributeArg(arg.name, this.makeAttributeArgValue(arg.value));
169
+ }
170
+ makeAttributeArgValue(node) {
171
+ if ((0, _ast.isLiteralExpr)(node)) {
172
+ switch (typeof node.value) {
173
+ case 'string':
174
+ return new _prismaBuilder.AttributeArgValue('String', node.value);
175
+ case 'number':
176
+ return new _prismaBuilder.AttributeArgValue('Number', node.value);
177
+ case 'boolean':
178
+ return new _prismaBuilder.AttributeArgValue('Boolean', node.value);
179
+ default:
180
+ throw new _sdk.PluginError(`Unexpected literal type: ${typeof node.value}`);
181
+ }
182
+ } else if ((0, _ast.isArrayExpr)(node)) {
183
+ return new _prismaBuilder.AttributeArgValue('Array', new Array(...node.items.map(item => this.makeAttributeArgValue(item))));
184
+ } else if ((0, _ast.isReferenceExpr)(node)) {
185
+ 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))));
186
+ } else if ((0, _ast.isInvocationExpr)(node)) {
187
+ // invocation
188
+ return new _prismaBuilder.AttributeArgValue('FunctionCall', this.makeFunctionCall(node));
189
+ } else {
190
+ throw new _sdk.PluginError(`Unsupported attribute argument expression type: ${node.$type}`);
191
+ }
192
+ }
193
+ makeFunctionCall(node) {
194
+ return new _prismaBuilder.FunctionCall((0, _sdk.resolved)(node.function).name, node.args.map(arg => {
195
+ if (!(0, _ast.isLiteralExpr)(arg.value)) {
196
+ throw new _sdk.PluginError('Function call argument must be literal');
197
+ }
198
+ return new _prismaBuilder.FunctionCallArg(arg.name, arg.value.value);
199
+ }));
200
+ }
201
+ generateModelAttribute(model, attr) {
202
+ model.attributes.push(new _prismaBuilder.ModelAttribute((0, _sdk.resolved)(attr.decl).name, attr.args.map(arg => this.makeAttributeArg(arg))));
203
+ }
204
+ generateEnum(prisma, decl) {
205
+ prisma.addEnum(decl.name, decl.fields.map(f => f.name));
206
+ }
207
+ isStringLiteral(node) {
208
+ return (0, _ast.isLiteralExpr)(node) && typeof node.value === 'string';
209
+ }
210
+ }
211
+ exports.default = PrismaSchemaGenerator;
212
+ //# sourceMappingURL=schema-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-generator.js","names":["PrismaSchemaGenerator","zModelGenerator","ZModelCodeGenerator","PRELUDE","generate","model","options","prisma","PrismaModel","decl","declarations","$type","DataSource","generateDataSource","Enum","generateEnum","DataModel","generateModel","GeneratorDecl","generateGenerator","outFile","output","fs","existsSync","path","dirname","mkdirSync","recursive","writeFile","toString","execSync","dataSource","provider","undefined","url","shadowDatabaseUrl","f","fields","name","isStringLiteral","value","PluginError","r","extractDataSourceUrl","addDataSource","fieldValue","PrismaDataSourceUrl","isInvocationExpr","function","ref","args","length","addGenerator","map","isArrayExpr","getLiteralArray","getLiteral","addModel","field","generateModelField","allowAll","denyAll","hasFieldValidation","analyzePolicies","addField","GUARD_FIELD_NAME","PrismaFieldAttribute","PrismaAttributeArg","PrismaAttributeArgValue","TRANSACTION_FIELD_NAME","addAttribute","attr","attributes","filter","isPrismaAttribute","generateModelAttribute","forEach","addComment","generateAttribute","find","a","fieldType","type","reference","$container","ModelFieldType","array","optional","makeFieldAttribute","nonPrismaAttributes","documentations","resolved","arg","makeAttributeArg","makeAttributeArgValue","node","isLiteralExpr","Array","items","item","isReferenceExpr","PrismaFieldReference","target","PrismaFieldReferenceArg","makeFunctionCall","PrismaFunctionCall","PrismaFunctionCallArg","push","PrismaModelAttribute","addEnum"],"sources":["../../../src/plugins/prisma/schema-generator.ts"],"sourcesContent":["import {\n AstNode,\n Attribute,\n AttributeArg,\n DataModel,\n DataModelAttribute,\n DataModelField,\n DataModelFieldAttribute,\n DataSource,\n Enum,\n Expression,\n GeneratorDecl,\n InvocationExpr,\n LiteralExpr,\n Model,\n isArrayExpr,\n isInvocationExpr,\n isLiteralExpr,\n isReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport {\n GUARD_FIELD_NAME,\n PluginError,\n PluginOptions,\n TRANSACTION_FIELD_NAME,\n getLiteral,\n getLiteralArray,\n resolved,\n} from '@zenstackhq/sdk';\nimport fs from 'fs';\nimport { writeFile } from 'fs/promises';\nimport path from 'path';\nimport { analyzePolicies } from '../../utils/ast-utils';\nimport { execSync } from '../../utils/exec-utils';\nimport ZModelCodeGenerator from './zmodel-code-generator';\nimport {\n ModelFieldType,\n AttributeArg as PrismaAttributeArg,\n AttributeArgValue as PrismaAttributeArgValue,\n Model as PrismaDataModel,\n DataSourceUrl as PrismaDataSourceUrl,\n FieldAttribute as PrismaFieldAttribute,\n FieldReference as PrismaFieldReference,\n FieldReferenceArg as PrismaFieldReferenceArg,\n FunctionCall as PrismaFunctionCall,\n FunctionCallArg as PrismaFunctionCallArg,\n PrismaModel,\n ModelAttribute as PrismaModelAttribute,\n} from './prisma-builder';\n\n/**\n * Generates Prisma schema file\n */\nexport default class PrismaSchemaGenerator {\n private zModelGenerator: ZModelCodeGenerator = new ZModelCodeGenerator();\n\n private readonly PRELUDE = `//////////////////////////////////////////////////////////////////////////////////////////////\n// DO NOT MODIFY THIS FILE //\n// This file is automatically generated by ZenStack CLI and should not be manually updated. //\n//////////////////////////////////////////////////////////////////////////////////////////////\n\n`;\n\n async generate(model: Model, options: PluginOptions) {\n const prisma = new PrismaModel();\n\n for (const decl of model.declarations) {\n switch (decl.$type) {\n case DataSource:\n this.generateDataSource(prisma, decl as DataSource);\n break;\n\n case Enum:\n this.generateEnum(prisma, decl as Enum);\n break;\n\n case DataModel:\n this.generateModel(prisma, decl as DataModel);\n break;\n\n case GeneratorDecl:\n this.generateGenerator(prisma, decl as GeneratorDecl);\n break;\n }\n }\n\n const outFile = (options.output as string) ?? './prisma/schema.prisma';\n if (!fs.existsSync(path.dirname(outFile))) {\n fs.mkdirSync(path.dirname(outFile), { recursive: true });\n }\n await writeFile(outFile, this.PRELUDE + prisma.toString());\n\n // run 'prisma generate'\n await execSync(`npx prisma generate --schema ${outFile}`);\n }\n\n private generateDataSource(prisma: PrismaModel, dataSource: DataSource) {\n let provider: string | undefined = undefined;\n let url: PrismaDataSourceUrl | undefined = undefined;\n let shadowDatabaseUrl: PrismaDataSourceUrl | undefined = undefined;\n\n for (const f of dataSource.fields) {\n switch (f.name) {\n case 'provider': {\n if (this.isStringLiteral(f.value)) {\n provider = f.value.value as string;\n } else {\n throw new PluginError('Datasource provider must be set to a string');\n }\n break;\n }\n\n case 'url': {\n const r = this.extractDataSourceUrl(f.value);\n if (!r) {\n throw new PluginError('Invalid value for datasource url');\n }\n url = r;\n break;\n }\n\n case 'shadowDatabaseUrl': {\n const r = this.extractDataSourceUrl(f.value);\n if (!r) {\n throw new PluginError('Invalid value for datasource url');\n }\n shadowDatabaseUrl = r;\n break;\n }\n }\n }\n\n if (!provider) {\n throw new PluginError('Datasource is missing \"provider\" field');\n }\n if (!url) {\n throw new PluginError('Datasource is missing \"url\" field');\n }\n\n prisma.addDataSource(dataSource.name, provider, url, shadowDatabaseUrl);\n }\n\n private extractDataSourceUrl(fieldValue: LiteralExpr | InvocationExpr) {\n if (this.isStringLiteral(fieldValue)) {\n return new PrismaDataSourceUrl(fieldValue.value as string, false);\n } else if (\n isInvocationExpr(fieldValue) &&\n fieldValue.function.ref?.name === 'env' &&\n fieldValue.args.length === 1 &&\n this.isStringLiteral(fieldValue.args[0].value)\n ) {\n return new PrismaDataSourceUrl(fieldValue.args[0].value.value as string, true);\n } else {\n return null;\n }\n }\n\n private generateGenerator(prisma: PrismaModel, decl: GeneratorDecl) {\n prisma.addGenerator(\n decl.name,\n decl.fields.map((f) => {\n const value = isArrayExpr(f.value) ? getLiteralArray(f.value) : getLiteral(f.value);\n return { name: f.name, value };\n })\n );\n }\n\n private generateModel(prisma: PrismaModel, decl: DataModel) {\n const model = prisma.addModel(decl.name);\n for (const field of decl.fields) {\n this.generateModelField(model, field);\n }\n\n const { allowAll, denyAll, hasFieldValidation } = analyzePolicies(decl);\n\n if ((!allowAll && !denyAll) || hasFieldValidation) {\n // generate auxiliary fields for policy check\n\n // add an \"zenstack_guard\" field for dealing with pure auth() related conditions\n model.addField(GUARD_FIELD_NAME, 'Boolean', [\n new PrismaFieldAttribute('@default', [\n new PrismaAttributeArg(undefined, new PrismaAttributeArgValue('Boolean', true)),\n ]),\n ]);\n\n // add an \"zenstack_transaction\" field for tracking records created/updated with nested writes\n model.addField(TRANSACTION_FIELD_NAME, 'String?');\n\n // create an index for \"zenstack_transaction\" field\n model.addAttribute('@@index', [\n new PrismaAttributeArg(\n undefined,\n new PrismaAttributeArgValue('Array', [\n new PrismaAttributeArgValue('FieldReference', TRANSACTION_FIELD_NAME),\n ])\n ),\n ]);\n }\n\n for (const attr of decl.attributes.filter((attr) => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))) {\n this.generateModelAttribute(model, attr);\n }\n\n decl.attributes\n .filter((attr) => attr.decl.ref && !this.isPrismaAttribute(attr.decl.ref))\n .forEach((attr) => model.addComment(this.zModelGenerator.generateAttribute(attr)));\n }\n\n private isPrismaAttribute(attr: Attribute) {\n return !!attr.attributes.find((a) => a.decl.ref?.name === '@@@prisma');\n }\n\n private generateModelField(model: PrismaDataModel, field: DataModelField) {\n const fieldType = field.type.type || field.type.reference?.ref?.name;\n if (!fieldType) {\n throw new PluginError(`Field type is not resolved: ${field.$container.name}.${field.name}`);\n }\n\n const type = new ModelFieldType(fieldType, field.type.array, field.type.optional);\n\n const attributes = field.attributes\n .filter((attr) => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))\n .map((attr) => this.makeFieldAttribute(attr));\n\n const nonPrismaAttributes = field.attributes.filter(\n (attr) => !attr.decl.ref || !this.isPrismaAttribute(attr.decl.ref)\n );\n\n const documentations = nonPrismaAttributes.map((attr) => this.zModelGenerator.generateAttribute(attr));\n\n model.addField(field.name, type, attributes, documentations);\n }\n\n private makeFieldAttribute(attr: DataModelFieldAttribute) {\n return new PrismaFieldAttribute(\n resolved(attr.decl).name,\n attr.args.map((arg) => this.makeAttributeArg(arg))\n );\n }\n\n private makeAttributeArg(arg: AttributeArg): PrismaAttributeArg {\n return new PrismaAttributeArg(arg.name, this.makeAttributeArgValue(arg.value));\n }\n\n private makeAttributeArgValue(node: Expression): PrismaAttributeArgValue {\n if (isLiteralExpr(node)) {\n switch (typeof node.value) {\n case 'string':\n return new PrismaAttributeArgValue('String', node.value);\n case 'number':\n return new PrismaAttributeArgValue('Number', node.value);\n case 'boolean':\n return new PrismaAttributeArgValue('Boolean', node.value);\n default:\n throw new PluginError(`Unexpected literal type: ${typeof node.value}`);\n }\n } else if (isArrayExpr(node)) {\n return new PrismaAttributeArgValue(\n 'Array',\n new Array(...node.items.map((item) => this.makeAttributeArgValue(item)))\n );\n } else if (isReferenceExpr(node)) {\n return new PrismaAttributeArgValue(\n 'FieldReference',\n new PrismaFieldReference(\n resolved(node.target).name,\n node.args.map((arg) => new PrismaFieldReferenceArg(arg.name, arg.value))\n )\n );\n } else if (isInvocationExpr(node)) {\n // invocation\n return new PrismaAttributeArgValue('FunctionCall', this.makeFunctionCall(node));\n } else {\n throw new PluginError(`Unsupported attribute argument expression type: ${node.$type}`);\n }\n }\n\n makeFunctionCall(node: InvocationExpr): PrismaFunctionCall {\n return new PrismaFunctionCall(\n resolved(node.function).name,\n node.args.map((arg) => {\n if (!isLiteralExpr(arg.value)) {\n throw new PluginError('Function call argument must be literal');\n }\n return new PrismaFunctionCallArg(arg.name, arg.value.value);\n })\n );\n }\n\n private generateModelAttribute(model: PrismaDataModel, attr: DataModelAttribute) {\n model.attributes.push(\n new PrismaModelAttribute(\n resolved(attr.decl).name,\n attr.args.map((arg) => this.makeAttributeArg(arg))\n )\n );\n }\n\n private generateEnum(prisma: PrismaModel, decl: Enum) {\n prisma.addEnum(\n decl.name,\n decl.fields.map((f) => f.name)\n );\n }\n\n private isStringLiteral(node: AstNode): node is LiteralExpr {\n return isLiteralExpr(node) && typeof node.value === 'string';\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Argument, AttributeArg, BinaryExpr, DataModelAttribute, DataModelFieldAttribute, Expression, InvocationExpr, LiteralExpr, MemberAccessExpr, ReferenceArg, ReferenceExpr, UnaryExpr } from '@zenstackhq/language/ast';
2
+ /**
3
+ * Options for the generator.
4
+ */
5
+ export interface ZModelCodeOptions {
6
+ binaryExprNumberOfSpaces: number;
7
+ unaryExprNumberOfSpaces: number;
8
+ }
9
+ export default class ZModelCodeGenerator {
10
+ private readonly options;
11
+ constructor(options?: Partial<ZModelCodeOptions>);
12
+ generateAttribute(ast: DataModelAttribute | DataModelFieldAttribute): string;
13
+ generateAttributeArg(ast: AttributeArg): string;
14
+ generateExpression(ast: Expression): string;
15
+ generateLiteralExpr(ast: LiteralExpr): string;
16
+ generateUnaryExpr(ast: UnaryExpr): string;
17
+ generateBinaryExpr(ast: BinaryExpr): string;
18
+ generateReferenceExpr(ast: ReferenceExpr): string;
19
+ generateReferenceArg(ast: ReferenceArg): string;
20
+ generateMemberExpr(ast: MemberAccessExpr): string;
21
+ generateInvocationExpr(ast: InvocationExpr): string;
22
+ generateArgument(ast: Argument): string;
23
+ private get binaryExprSpace();
24
+ private get unaryExprSpace();
25
+ private isParenthesesNeededForBinaryExpr;
26
+ private isCollectionPredicateOperator;
27
+ }
@@ -0,0 +1,110 @@
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
+ class ZModelCodeGenerator {
10
+ constructor(options) {
11
+ this.options = {
12
+ binaryExprNumberOfSpaces: (options === null || options === void 0 ? void 0 : options.binaryExprNumberOfSpaces) ?? 1,
13
+ unaryExprNumberOfSpaces: (options === null || options === void 0 ? void 0 : options.unaryExprNumberOfSpaces) ?? 0
14
+ };
15
+ }
16
+ generateAttribute(ast) {
17
+ const args = ast.args.length ? `(${ast.args.map(x => this.generateAttributeArg(x)).join(', ')})` : '';
18
+ return `${(0, _sdk.resolved)(ast.decl).name}${args}`;
19
+ }
20
+ generateAttributeArg(ast) {
21
+ return this.generateExpression(ast.value);
22
+ }
23
+ generateExpression(ast) {
24
+ switch (ast.$type) {
25
+ case _ast.LiteralExpr:
26
+ return this.generateLiteralExpr(ast);
27
+ case _ast.UnaryExpr:
28
+ return this.generateUnaryExpr(ast);
29
+ case _ast.BinaryExpr:
30
+ return this.generateBinaryExpr(ast);
31
+ case _ast.ReferenceExpr:
32
+ return this.generateReferenceExpr(ast);
33
+ case _ast.MemberAccessExpr:
34
+ return this.generateMemberExpr(ast);
35
+ case _ast.InvocationExpr:
36
+ return this.generateInvocationExpr(ast);
37
+ case _ast.NullExpr:
38
+ case _ast.ThisExpr:
39
+ return ast.value;
40
+ default:
41
+ throw new Error(`Not implemented: ${ast.$type}`);
42
+ }
43
+ }
44
+ generateLiteralExpr(ast) {
45
+ return typeof ast.value === 'string' ? `'${ast.value}'` : ast.value.toString();
46
+ }
47
+ generateUnaryExpr(ast) {
48
+ return `${ast.operator}${this.unaryExprSpace}${this.generateExpression(ast.operand)}`;
49
+ }
50
+ generateBinaryExpr(ast) {
51
+ const operator = ast.operator;
52
+ const isCollectionPredicate = this.isCollectionPredicateOperator(operator);
53
+ const rightExpr = this.generateExpression(ast.right);
54
+ const {
55
+ left: isLeftParenthesis,
56
+ right: isRightParenthesis
57
+ } = this.isParenthesesNeededForBinaryExpr(ast);
58
+ return `${isLeftParenthesis ? '(' : ''}${this.generateExpression(ast.left)}${isLeftParenthesis ? ')' : ''}${this.binaryExprSpace}${operator}${this.binaryExprSpace}${isRightParenthesis ? '(' : ''}${isCollectionPredicate ? `[${rightExpr}]` : rightExpr}${isRightParenthesis ? ')' : ''}`;
59
+ }
60
+ generateReferenceExpr(ast) {
61
+ var _ast$target$ref;
62
+ const args = ast.args.length ? `(${ast.args.map(x => this.generateReferenceArg(x)).join(', ')})` : '';
63
+ return `${(_ast$target$ref = ast.target.ref) === null || _ast$target$ref === void 0 ? void 0 : _ast$target$ref.name}${args}`;
64
+ }
65
+ generateReferenceArg(ast) {
66
+ return `${ast.name}:${ast.value}`;
67
+ }
68
+ generateMemberExpr(ast) {
69
+ var _ast$member$ref;
70
+ return `${this.generateExpression(ast.operand)}.${(_ast$member$ref = ast.member.ref) === null || _ast$member$ref === void 0 ? void 0 : _ast$member$ref.name}`;
71
+ }
72
+ generateInvocationExpr(ast) {
73
+ var _ast$function$ref;
74
+ return `${(_ast$function$ref = ast.function.ref) === null || _ast$function$ref === void 0 ? void 0 : _ast$function$ref.name}(${ast.args.map(x => this.generateArgument(x)).join(', ')})`;
75
+ }
76
+ generateArgument(ast) {
77
+ return `${ast.name && ':'} ${this.generateExpression(ast.value)}`;
78
+ }
79
+ get binaryExprSpace() {
80
+ return ' '.repeat(this.options.binaryExprNumberOfSpaces);
81
+ }
82
+ get unaryExprSpace() {
83
+ return ' '.repeat(this.options.unaryExprNumberOfSpaces);
84
+ }
85
+ isParenthesesNeededForBinaryExpr(ast) {
86
+ const result = {
87
+ left: false,
88
+ right: false
89
+ };
90
+ const operator = ast.operator;
91
+ const isCollectionPredicate = this.isCollectionPredicateOperator(operator);
92
+ const currentPriority = _ast.BinaryExprOperatorPriority[operator];
93
+ if (ast.left.$type === _ast.BinaryExpr && _ast.BinaryExprOperatorPriority[ast.left['operator']] < currentPriority) {
94
+ result.left = true;
95
+ }
96
+ /**
97
+ * 1 collection predicate operator has [] around the right operand, no need to add parenthesis.
98
+ * 2 grammar is left associative, so if the right operand has the same priority still need to add parenthesis.
99
+ **/
100
+ if (!isCollectionPredicate && ast.right.$type === _ast.BinaryExpr && _ast.BinaryExprOperatorPriority[ast.right['operator']] <= currentPriority) {
101
+ result.right = true;
102
+ }
103
+ return result;
104
+ }
105
+ isCollectionPredicateOperator(op) {
106
+ return ['?', '!', '^'].includes(op);
107
+ }
108
+ }
109
+ exports.default = ZModelCodeGenerator;
110
+ //# sourceMappingURL=zmodel-code-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zmodel-code-generator.js","names":["ZModelCodeGenerator","constructor","options","binaryExprNumberOfSpaces","unaryExprNumberOfSpaces","generateAttribute","ast","args","length","map","x","generateAttributeArg","join","resolved","decl","name","generateExpression","value","$type","LiteralExpr","generateLiteralExpr","UnaryExpr","generateUnaryExpr","BinaryExpr","generateBinaryExpr","ReferenceExpr","generateReferenceExpr","MemberAccessExpr","generateMemberExpr","InvocationExpr","generateInvocationExpr","NullExpr","ThisExpr","Error","toString","operator","unaryExprSpace","operand","isCollectionPredicate","isCollectionPredicateOperator","rightExpr","right","left","isLeftParenthesis","isRightParenthesis","isParenthesesNeededForBinaryExpr","binaryExprSpace","generateReferenceArg","target","ref","member","function","generateArgument","repeat","result","currentPriority","BinaryExprOperatorPriority","op","includes"],"sources":["../../../src/plugins/prisma/zmodel-code-generator.ts"],"sourcesContent":["import {\n Argument,\n AttributeArg,\n BinaryExpr,\n DataModelAttribute,\n DataModelFieldAttribute,\n Expression,\n InvocationExpr,\n LiteralExpr,\n MemberAccessExpr,\n NullExpr,\n ReferenceArg,\n ReferenceExpr,\n ThisExpr,\n UnaryExpr,\n BinaryExprOperatorPriority,\n} from '@zenstackhq/language/ast';\nimport { resolved } from '@zenstackhq/sdk';\n\n/**\n * Options for the generator.\n */\nexport interface ZModelCodeOptions {\n binaryExprNumberOfSpaces: number;\n unaryExprNumberOfSpaces: number;\n}\n\nexport default class ZModelCodeGenerator {\n private readonly options: ZModelCodeOptions;\n constructor(options?: Partial<ZModelCodeOptions>) {\n this.options = {\n binaryExprNumberOfSpaces: options?.binaryExprNumberOfSpaces ?? 1,\n unaryExprNumberOfSpaces: options?.unaryExprNumberOfSpaces ?? 0,\n };\n }\n generateAttribute(ast: DataModelAttribute | DataModelFieldAttribute): string {\n const args = ast.args.length ? `(${ast.args.map((x) => this.generateAttributeArg(x)).join(', ')})` : '';\n return `${resolved(ast.decl).name}${args}`;\n }\n\n generateAttributeArg(ast: AttributeArg) {\n return this.generateExpression(ast.value);\n }\n\n generateExpression(ast: Expression): string {\n switch (ast.$type) {\n case LiteralExpr:\n return this.generateLiteralExpr(ast as LiteralExpr);\n case UnaryExpr:\n return this.generateUnaryExpr(ast as UnaryExpr);\n case BinaryExpr:\n return this.generateBinaryExpr(ast as BinaryExpr);\n case ReferenceExpr:\n return this.generateReferenceExpr(ast as ReferenceExpr);\n case MemberAccessExpr:\n return this.generateMemberExpr(ast as MemberAccessExpr);\n case InvocationExpr:\n return this.generateInvocationExpr(ast as InvocationExpr);\n case NullExpr:\n case ThisExpr:\n return (ast as NullExpr | ThisExpr).value;\n default:\n throw new Error(`Not implemented: ${ast.$type}`);\n }\n }\n\n generateLiteralExpr(ast: LiteralExpr) {\n return typeof ast.value === 'string' ? `'${ast.value}'` : ast.value.toString();\n }\n\n generateUnaryExpr(ast: UnaryExpr) {\n return `${ast.operator}${this.unaryExprSpace}${this.generateExpression(ast.operand)}`;\n }\n\n generateBinaryExpr(ast: BinaryExpr) {\n const operator = ast.operator;\n const isCollectionPredicate = this.isCollectionPredicateOperator(operator);\n const rightExpr = this.generateExpression(ast.right);\n\n const { left: isLeftParenthesis, right: isRightParenthesis } = this.isParenthesesNeededForBinaryExpr(ast);\n\n return `${isLeftParenthesis ? '(' : ''}${this.generateExpression(ast.left)}${isLeftParenthesis ? ')' : ''}${\n this.binaryExprSpace\n }${operator}${this.binaryExprSpace}${isRightParenthesis ? '(' : ''}${\n isCollectionPredicate ? `[${rightExpr}]` : rightExpr\n }${isRightParenthesis ? ')' : ''}`;\n }\n\n generateReferenceExpr(ast: ReferenceExpr) {\n const args = ast.args.length ? `(${ast.args.map((x) => this.generateReferenceArg(x)).join(', ')})` : '';\n return `${ast.target.ref?.name}${args}`;\n }\n\n generateReferenceArg(ast: ReferenceArg) {\n return `${ast.name}:${ast.value}`;\n }\n\n generateMemberExpr(ast: MemberAccessExpr) {\n return `${this.generateExpression(ast.operand)}.${ast.member.ref?.name}`;\n }\n\n generateInvocationExpr(ast: InvocationExpr) {\n return `${ast.function.ref?.name}(${ast.args.map((x) => this.generateArgument(x)).join(', ')})`;\n }\n\n generateArgument(ast: Argument) {\n return `${ast.name && ':'} ${this.generateExpression(ast.value)}`;\n }\n\n private get binaryExprSpace(): string {\n return ' '.repeat(this.options.binaryExprNumberOfSpaces);\n }\n\n private get unaryExprSpace(): string {\n return ' '.repeat(this.options.unaryExprNumberOfSpaces);\n }\n\n private isParenthesesNeededForBinaryExpr(ast: BinaryExpr): { left: boolean; right: boolean } {\n const result = { left: false, right: false };\n const operator = ast.operator;\n const isCollectionPredicate = this.isCollectionPredicateOperator(operator);\n\n const currentPriority = BinaryExprOperatorPriority[operator];\n\n if (\n ast.left.$type === BinaryExpr &&\n BinaryExprOperatorPriority[(ast.left as BinaryExpr)['operator']] < currentPriority\n ) {\n result.left = true;\n }\n /**\n * 1 collection predicate operator has [] around the right operand, no need to add parenthesis.\n * 2 grammar is left associative, so if the right operand has the same priority still need to add parenthesis.\n **/\n if (\n !isCollectionPredicate &&\n ast.right.$type === BinaryExpr &&\n BinaryExprOperatorPriority[(ast.right as BinaryExpr)['operator']] <= currentPriority\n ) {\n result.right = true;\n }\n\n return result;\n }\n\n private isCollectionPredicateOperator(op: BinaryExpr['operator']) {\n return ['?', '!', '^'].includes(op);\n }\n}\n"],"mappings":"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"}
@@ -2,13 +2,11 @@
2
2
 
3
3
  (function (Prism) {
4
4
  Prism.languages.zmodel = Prism.languages.extend('clike', {
5
- keyword:
6
- /\b(?:datasource|enum|generator|model|attribute|function|null|this)\b/,
5
+ keyword: /\b(?:datasource|enum|generator|model|attribute|function|null|this)\b/,
7
6
  'type-class-name': /(\b()\s+)[\w.\\]+/,
8
7
  });
9
8
 
10
- Prism.languages.javascript['class-name'][0].pattern =
11
- /(\b(?:model|datasource|enum|generator)\s+)[\w.\\]+/;
9
+ Prism.languages.javascript['class-name'][0].pattern = /(\b(?:model|datasource|enum|generator)\s+)[\w.\\]+/;
12
10
 
13
11
  Prism.languages.insertBefore('zmodel', 'function', {
14
12
  annotation: {
@@ -0,0 +1,47 @@
1
+ // This is a sample model to get you started.
2
+ // Learn how to model you app: https://zenstack.dev/#/modeling-your-app.
3
+
4
+ /*
5
+ * A sample data source using local sqlite db.
6
+ * See how to use a different db: https://zenstack.dev/#/zmodel-data-source.
7
+ */
8
+ datasource db {
9
+ provider = 'sqlite'
10
+ url = 'file:./todo.db'
11
+ }
12
+
13
+ /*
14
+ * User model
15
+ */
16
+ model User {
17
+ id String @id @default(cuid())
18
+ email String @unique @email
19
+ password String @password @omit @length(8, 16)
20
+ posts Post[]
21
+
22
+ // everybody can signup
23
+ @@allow('create', true)
24
+
25
+ // full access by self
26
+ @@allow('all', auth() == this)
27
+ }
28
+
29
+ /*
30
+ * Post model
31
+ */
32
+ model Post {
33
+ id String @id @default(cuid())
34
+ createdAt DateTime @default(now())
35
+ updatedAt DateTime @updatedAt
36
+ title String @length(1, 256)
37
+ content String
38
+ published Boolean @default(false)
39
+ author User? @relation(fields: [authorId], references: [id])
40
+ authorId String?
41
+
42
+ // allow read for all signin users
43
+ @@allow('read', auth() != null && published)
44
+
45
+ // full access by author
46
+ @@allow('all', author == auth())
47
+ }
package/res/stdlib.zmodel CHANGED
@@ -84,8 +84,19 @@ function autoincrement(): Int {}
84
84
  */
85
85
  function dbgenerated(expr: String): Any {}
86
86
 
87
+ /**
88
+ * Gets entities value before an update. Only valid when used in a "update" policy rule.
89
+ */
90
+ function future(): Any {}
91
+
92
+ /**
93
+ * Marks an attribute to be only applicable to certain field types.
94
+ */
87
95
  attribute @@@targetField(targetField: AttributeTargetField[])
88
96
 
97
+ /**
98
+ * Indicates an attribute is directly supported by the Prisma schema.
99
+ */
89
100
  attribute @@@prisma()
90
101
 
91
102
  /*
@@ -116,7 +127,7 @@ attribute @@index(_ fields: FieldReference[], map: String?) @@@prisma
116
127
  /*
117
128
  * Defines meta information about the relation.
118
129
  */
119
- attribute @relation(_ name: String?, fields: FieldReference[]?, references: FieldReference[]?, onDelete: ReferentialAction?, onUpdate: ReferentialAction?, map: String?) @@@prisma
130
+ attribute @relation(_ name: String?, fields: FieldReference[]?, references: TransitiveFieldReference[]?, onDelete: ReferentialAction?, onUpdate: ReferentialAction?, map: String?) @@@prisma
120
131
 
121
132
  /*
122
133
  * Maps a field name or enum value from the schema to a column with a different name in the database.
package/telemetry.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Telemetry events
3
+ */
4
+ export declare type TelemetryEvents = 'cli:start' | 'cli:complete' | 'cli:error' | 'cli:command:start' | 'cli:command:complete' | 'cli:command:error' | 'cli:plugin:start' | 'cli:plugin:complete' | 'cli:plugin:error';
5
+ /**
6
+ * Utility class for sending telemetry
7
+ */
8
+ export declare class Telemetry {
9
+ private readonly mixpanel;
10
+ private readonly hostId;
11
+ private readonly sessionid;
12
+ private readonly trackingToken;
13
+ private readonly _os;
14
+ private readonly version;
15
+ private exitWait;
16
+ constructor();
17
+ track(event: TelemetryEvents, properties?: Record<string, unknown>): void;
18
+ trackSpan(startEvent: TelemetryEvents, completeEvent: TelemetryEvents, errorEvent: TelemetryEvents, properties: Record<string, unknown>, action: () => Promise<unknown> | void): Promise<void>;
19
+ }
20
+ declare const _default: Telemetry;
21
+ export default _default;
package/telemetry.js ADDED
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.Telemetry = void 0;
7
+ var _asyncExitHook = _interopRequireDefault(require("async-exit-hook"));
8
+ var _commander = require("commander");
9
+ var _cuid = _interopRequireDefault(require("cuid"));
10
+ var _mixpanel = require("mixpanel");
11
+ var _nodeMachineId = require("node-machine-id");
12
+ var os = _interopRequireWildcard(require("os"));
13
+ var _sleepPromise = _interopRequireDefault(require("sleep-promise"));
14
+ var _cliError = require("./cli/cli-error");
15
+ var _versionUtils = require("./utils/version-utils");
16
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+ /**
20
+ * Utility class for sending telemetry
21
+ */
22
+ class Telemetry {
23
+ hostId = (0, _nodeMachineId.machineIdSync)();
24
+ sessionid = (0, _cuid.default)();
25
+ trackingToken = process && process.env && process.env.TELEMETRY_TRACKING_TOKEN || "74944eb779d7d3b4ce185be843fde9fc";
26
+ _os = os.platform();
27
+ version = (0, _versionUtils.getVersion)();
28
+ exitWait = 200;
29
+ constructor() {
30
+ if ((process && process.env && process.env.DO_NOT_TRACK || "1") !== '1' && this.trackingToken) {
31
+ this.mixpanel = (0, _mixpanel.init)(this.trackingToken, {
32
+ geolocate: true
33
+ });
34
+ }
35
+ (0, _asyncExitHook.default)(async callback => {
36
+ if (this.mixpanel) {
37
+ // a small delay to ensure telemetry is sent
38
+ await (0, _sleepPromise.default)(this.exitWait);
39
+ }
40
+ callback();
41
+ });
42
+ const errorHandler = async err => {
43
+ this.track('cli:error', {
44
+ message: err.message,
45
+ stack: err.stack
46
+ });
47
+ if (this.mixpanel) {
48
+ // a small delay to ensure telemetry is sent
49
+ await (0, _sleepPromise.default)(this.exitWait);
50
+ }
51
+ if (err instanceof _cliError.CliError || err instanceof _commander.CommanderError) {
52
+ // error already logged
53
+ } else {
54
+ console.error('\nAn unexpected error occurred:\n', err);
55
+ }
56
+ process.exit(1);
57
+ };
58
+ _asyncExitHook.default.unhandledRejectionHandler(errorHandler);
59
+ _asyncExitHook.default.uncaughtExceptionHandler(errorHandler);
60
+ }
61
+ track(event, properties = {}) {
62
+ if (this.mixpanel) {
63
+ const payload = {
64
+ distinct_id: this.hostId,
65
+ session: this.sessionid,
66
+ time: new Date(),
67
+ $os: this._os,
68
+ nodeVersion: process.version,
69
+ version: this.version,
70
+ ...properties
71
+ };
72
+ this.mixpanel.track(event, payload);
73
+ }
74
+ }
75
+ async trackSpan(startEvent, completeEvent, errorEvent, properties, action) {
76
+ this.track(startEvent, properties);
77
+ const start = Date.now();
78
+ let success = true;
79
+ try {
80
+ await Promise.resolve(action());
81
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
82
+ } catch (err) {
83
+ this.track(errorEvent, {
84
+ message: err.message,
85
+ stack: err.stack,
86
+ ...properties
87
+ });
88
+ success = false;
89
+ throw err;
90
+ } finally {
91
+ this.track(completeEvent, {
92
+ duration: Date.now() - start,
93
+ success,
94
+ ...properties
95
+ });
96
+ }
97
+ }
98
+ }
99
+ exports.Telemetry = Telemetry;
100
+ var _default = new Telemetry();
101
+ exports.default = _default;
102
+ //# sourceMappingURL=telemetry.js.map