zenstack 0.6.0-pre.9 → 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,364 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ZModelLinker = void 0;
7
+ var _ast = require("@zenstackhq/language/ast");
8
+ var _langium = require("langium");
9
+ var _vscodeJsonrpc = require("vscode-jsonrpc");
10
+ var _utils = require("./utils");
11
+ var _utils2 = require("./validator/utils");
12
+ /**
13
+ * Langium linker implementation which links references and resolves expression types
14
+ */
15
+ class ZModelLinker extends _langium.DefaultLinker {
16
+ constructor(services) {
17
+ super(services);
18
+ this.descriptions = services.workspace.AstNodeDescriptionProvider;
19
+ }
20
+
21
+ //#region Reference linking
22
+
23
+ async link(document, cancelToken = _vscodeJsonrpc.CancellationToken.None) {
24
+ var _document$parseResult, _document$parseResult2;
25
+ if (((_document$parseResult = document.parseResult.lexerErrors) === null || _document$parseResult === void 0 ? void 0 : _document$parseResult.length) > 0 || ((_document$parseResult2 = document.parseResult.parserErrors) === null || _document$parseResult2 === void 0 ? void 0 : _document$parseResult2.length) > 0) {
26
+ return;
27
+ }
28
+ for (const node of (0, _langium.streamContents)(document.parseResult.value)) {
29
+ await (0, _langium.interruptAndCheck)(cancelToken);
30
+ this.resolve(node, document);
31
+ }
32
+ document.state = _langium.DocumentState.Linked;
33
+ }
34
+ linkReference(container, property, document, extraScopes) {
35
+ if (!this.resolveFromScopeProviders(container, property, document, extraScopes)) {
36
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
37
+ const reference = container[property];
38
+ this.doLink({
39
+ reference,
40
+ container,
41
+ property
42
+ }, document);
43
+ }
44
+ }
45
+
46
+ //#endregion
47
+
48
+ //#region Expression type resolving
49
+
50
+ resolveFromScopeProviders(node, property, document, providers) {
51
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
52
+ const reference = node[property];
53
+ for (const provider of providers) {
54
+ const target = provider(reference.$refText);
55
+ if (target) {
56
+ reference._ref = target;
57
+ reference._nodeDescription = this.descriptions.createDescription(target, target.name, document);
58
+ return target;
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+ resolve(node, document, extraScopes = []) {
64
+ switch (node.$type) {
65
+ case _ast.LiteralExpr:
66
+ this.resolveLiteral(node);
67
+ break;
68
+ case _ast.InvocationExpr:
69
+ this.resolveInvocation(node, document, extraScopes);
70
+ break;
71
+ case _ast.ArrayExpr:
72
+ this.resolveArray(node, document, extraScopes);
73
+ break;
74
+ case _ast.ReferenceExpr:
75
+ this.resolveReference(node, document, extraScopes);
76
+ break;
77
+ case _ast.MemberAccessExpr:
78
+ this.resolveMemberAccess(node, document, extraScopes);
79
+ break;
80
+ case _ast.UnaryExpr:
81
+ this.resolveUnary(node, document, extraScopes);
82
+ break;
83
+ case _ast.BinaryExpr:
84
+ this.resolveBinary(node, document, extraScopes);
85
+ break;
86
+ case _ast.ThisExpr:
87
+ this.resolveThis(node, document, extraScopes);
88
+ break;
89
+ case _ast.NullExpr:
90
+ this.resolveNull(node, document, extraScopes);
91
+ break;
92
+ case _ast.AttributeArg:
93
+ this.resolveAttributeArg(node, document, extraScopes);
94
+ break;
95
+ default:
96
+ this.resolveDefault(node, document, extraScopes);
97
+ break;
98
+ }
99
+ }
100
+ resolveBinary(node, document, extraScopes) {
101
+ switch (node.operator) {
102
+ // TODO: support arithmetics?
103
+ // case '+':
104
+ // case '-':
105
+ // case '*':
106
+ // case '/':
107
+ // this.resolve(node.left, document, extraScopes);
108
+ // this.resolve(node.right, document, extraScopes);
109
+ // this.resolveToBuiltinTypeOrDecl(node, 'Int');
110
+ // break;
111
+
112
+ case '>':
113
+ case '>=':
114
+ case '<':
115
+ case '<=':
116
+ case '==':
117
+ case '!=':
118
+ case '&&':
119
+ case '||':
120
+ this.resolve(node.left, document, extraScopes);
121
+ this.resolve(node.right, document, extraScopes);
122
+ this.resolveToBuiltinTypeOrDecl(node, 'Boolean');
123
+ break;
124
+ case '?':
125
+ case '!':
126
+ case '^':
127
+ this.resolveCollectionPredicate(node, document, extraScopes);
128
+ break;
129
+ default:
130
+ throw Error(`Unsupported binary operator: ${node.operator}`);
131
+ }
132
+ }
133
+ resolveUnary(node, document, extraScopes) {
134
+ this.resolve(node.operand, document, extraScopes);
135
+ node.$resolvedType = node.operand.$resolvedType;
136
+ }
137
+ resolveReference(node, document, extraScopes) {
138
+ this.linkReference(node, 'target', document, extraScopes);
139
+ node.args.forEach(arg => this.resolve(arg, document, extraScopes));
140
+ if (node.target.ref) {
141
+ // resolve type
142
+ if (node.target.ref.$type === _ast.EnumField) {
143
+ this.resolveToBuiltinTypeOrDecl(node, node.target.ref.$container);
144
+ } else {
145
+ this.resolveToDeclaredType(node, node.target.ref.type);
146
+ }
147
+ }
148
+ }
149
+ resolveArray(node, document, extraScopes) {
150
+ node.items.forEach(item => this.resolve(item, document, extraScopes));
151
+ const itemType = node.items[0].$resolvedType;
152
+ if (itemType !== null && itemType !== void 0 && itemType.decl) {
153
+ this.resolveToBuiltinTypeOrDecl(node, itemType.decl, true);
154
+ }
155
+ }
156
+ resolveInvocation(node, document, extraScopes) {
157
+ this.linkReference(node, 'function', document, extraScopes);
158
+ node.args.forEach(arg => this.resolve(arg, document, extraScopes));
159
+ if (node.function.ref) {
160
+ // eslint-disable-next-line @typescript-eslint/ban-types
161
+ const funcDecl = node.function.ref;
162
+ if (funcDecl.name === 'auth' && (0, _utils.isFromStdlib)(funcDecl)) {
163
+ // auth() function is resolved to User model in the current document
164
+ const model = (0, _utils.getContainingModel)(node);
165
+ const userModel = model === null || model === void 0 ? void 0 : model.declarations.find(d => (0, _ast.isDataModel)(d) && d.name === 'User');
166
+ if (userModel) {
167
+ node.$resolvedType = {
168
+ decl: userModel
169
+ };
170
+ }
171
+ } else if (funcDecl.name === 'future' && (0, _utils.isFromStdlib)(funcDecl)) {
172
+ // future() function is resolved to current model
173
+ node.$resolvedType = {
174
+ decl: this.getContainingDataModel(node)
175
+ };
176
+ } else {
177
+ this.resolveToDeclaredType(node, funcDecl.returnType);
178
+ }
179
+ }
180
+ }
181
+ getContainingDataModel(node) {
182
+ let curr = node.$container;
183
+ while (curr) {
184
+ if ((0, _ast.isDataModel)(curr)) {
185
+ return curr;
186
+ }
187
+ curr = curr.$container;
188
+ }
189
+ return undefined;
190
+ }
191
+ resolveLiteral(node) {
192
+ const type = typeof node.value === 'string' ? 'String' : typeof node.value === 'boolean' ? 'Boolean' : typeof node.value === 'number' ? 'Int' : undefined;
193
+ if (type) {
194
+ this.resolveToBuiltinTypeOrDecl(node, type);
195
+ }
196
+ }
197
+ resolveMemberAccess(node, document, extraScopes) {
198
+ this.resolve(node.operand, document, extraScopes);
199
+ const operandResolved = node.operand.$resolvedType;
200
+ if (operandResolved && !operandResolved.array && (0, _ast.isDataModel)(operandResolved.decl)) {
201
+ const modelDecl = operandResolved.decl;
202
+ const provider = name => modelDecl.fields.find(f => f.name === name);
203
+ extraScopes = [provider, ...extraScopes];
204
+ }
205
+ this.linkReference(node, 'member', document, extraScopes);
206
+ if (node.member.ref) {
207
+ this.resolveToDeclaredType(node, node.member.ref.type);
208
+ }
209
+ }
210
+ resolveCollectionPredicate(node, document, extraScopes) {
211
+ this.resolve(node.left, document, extraScopes);
212
+ const resolvedType = node.left.$resolvedType;
213
+ if (resolvedType && (0, _ast.isDataModel)(resolvedType.decl) && resolvedType.array) {
214
+ const dataModelDecl = resolvedType.decl;
215
+ const provider = name => dataModelDecl.fields.find(f => f.name === name);
216
+ extraScopes = [provider, ...extraScopes];
217
+ this.resolve(node.right, document, extraScopes);
218
+ this.resolveToBuiltinTypeOrDecl(node, 'Boolean');
219
+ } else {
220
+ // error is reported in validation pass
221
+ }
222
+ }
223
+ resolveThis(node,
224
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
225
+ document,
226
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
227
+ extraScopes) {
228
+ let decl = node.$container;
229
+ while (decl && !(0, _ast.isDataModel)(decl)) {
230
+ decl = decl.$container;
231
+ }
232
+ if (decl) {
233
+ this.resolveToBuiltinTypeOrDecl(node, decl);
234
+ }
235
+ }
236
+ resolveNull(node,
237
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
238
+ document,
239
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
240
+ extraScopes) {
241
+ // TODO: how to really resolve null?
242
+ this.resolveToBuiltinTypeOrDecl(node, 'Null');
243
+ }
244
+ resolveAttributeArg(node, document, extraScopes) {
245
+ const attrParam = this.findAttrParamForArg(node);
246
+ const attrAppliedOn = node.$container.$container;
247
+ if ((attrParam === null || attrParam === void 0 ? void 0 : attrParam.type.type) === 'TransitiveFieldReference' && (0, _ast.isDataModelField)(attrAppliedOn)) {
248
+ var _attrAppliedOn$type$r;
249
+ // "TransitiveFieldReference" is resolved in the context of the containing model of the field
250
+ // where the attribute is applied
251
+ //
252
+ // E.g.:
253
+ //
254
+ // model A {
255
+ // myId @id String
256
+ // }
257
+ //
258
+ // model B {
259
+ // id @id String
260
+ // a A @relation(fields: [id], references: [myId])
261
+ // }
262
+ //
263
+ // In model B, the attribute argument "myId" is resolved to the field "myId" in model A
264
+
265
+ const transtiveDataModel = (_attrAppliedOn$type$r = attrAppliedOn.type.reference) === null || _attrAppliedOn$type$r === void 0 ? void 0 : _attrAppliedOn$type$r.ref;
266
+ if (transtiveDataModel) {
267
+ // resolve references in the context of the transitive data model
268
+ const scopeProvider = name => transtiveDataModel.fields.find(f => f.name === name);
269
+ if ((0, _ast.isArrayExpr)(node.value)) {
270
+ var _node$value$items$, _node$value$items$$$r;
271
+ node.value.items.forEach(item => {
272
+ if ((0, _ast.isReferenceExpr)(item)) {
273
+ const resolved = this.resolveFromScopeProviders(item, 'target', document, [scopeProvider]);
274
+ if (resolved) {
275
+ this.resolveToDeclaredType(item, resolved.type);
276
+ } else {
277
+ // need to clear linked reference, because it's resolved in default scope by default
278
+ const ref = item.target;
279
+ ref._ref = this.createLinkingError({
280
+ reference: ref,
281
+ container: item,
282
+ property: 'target'
283
+ });
284
+ }
285
+ }
286
+ });
287
+ if ((_node$value$items$ = node.value.items[0]) !== null && _node$value$items$ !== void 0 && (_node$value$items$$$r = _node$value$items$.$resolvedType) !== null && _node$value$items$$$r !== void 0 && _node$value$items$$$r.decl) {
288
+ this.resolveToBuiltinTypeOrDecl(node.value, node.value.items[0].$resolvedType.decl, true);
289
+ }
290
+ } else if ((0, _ast.isReferenceExpr)(node.value)) {
291
+ const resolved = this.resolveFromScopeProviders(node.value, 'target', document, [scopeProvider]);
292
+ if (resolved) {
293
+ this.resolveToDeclaredType(node.value, resolved.type);
294
+ } else {
295
+ // need to clear linked reference, because it's resolved in default scope by default
296
+ const ref = node.value.target;
297
+ ref._ref = this.createLinkingError({
298
+ reference: ref,
299
+ container: node.value,
300
+ property: 'target'
301
+ });
302
+ }
303
+ }
304
+ }
305
+ } else {
306
+ this.resolve(node.value, document, extraScopes);
307
+ }
308
+ node.$resolvedType = node.value.$resolvedType;
309
+ }
310
+ findAttrParamForArg(arg) {
311
+ const attr = arg.$container.decl.ref;
312
+ if (!attr) {
313
+ return undefined;
314
+ }
315
+ if (arg.name) {
316
+ var _attr$params;
317
+ return (_attr$params = attr.params) === null || _attr$params === void 0 ? void 0 : _attr$params.find(p => p.name === arg.name);
318
+ } else {
319
+ const index = arg.$container.args.findIndex(a => a === arg);
320
+ return attr.params[index];
321
+ }
322
+ }
323
+ resolveDefault(node, document, extraScopes) {
324
+ for (const [property, value] of Object.entries(node)) {
325
+ if (!property.startsWith('$')) {
326
+ if ((0, _langium.isReference)(value)) {
327
+ this.linkReference(node, property, document, extraScopes);
328
+ }
329
+ }
330
+ }
331
+ for (const child of (0, _langium.streamContents)(node)) {
332
+ this.resolve(child, document, extraScopes);
333
+ }
334
+ }
335
+
336
+ //#endregion
337
+
338
+ //#region Utils
339
+
340
+ resolveToDeclaredType(node, type) {
341
+ if (type.type) {
342
+ const mappedType = (0, _utils2.mapBuiltinTypeToExpressionType)(type.type);
343
+ node.$resolvedType = {
344
+ decl: mappedType,
345
+ array: type.array
346
+ };
347
+ } else if (type.reference) {
348
+ node.$resolvedType = {
349
+ decl: type.reference.ref,
350
+ array: type.array
351
+ };
352
+ }
353
+ }
354
+ resolveToBuiltinTypeOrDecl(node, type, array = false) {
355
+ node.$resolvedType = {
356
+ decl: type,
357
+ array
358
+ };
359
+ }
360
+
361
+ //#endregion
362
+ }
363
+ exports.ZModelLinker = ZModelLinker;
364
+ //# sourceMappingURL=zmodel-linker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zmodel-linker.js","names":["ZModelLinker","DefaultLinker","constructor","services","descriptions","workspace","AstNodeDescriptionProvider","link","document","cancelToken","CancellationToken","None","parseResult","lexerErrors","length","parserErrors","node","streamContents","value","interruptAndCheck","resolve","state","DocumentState","Linked","linkReference","container","property","extraScopes","resolveFromScopeProviders","reference","doLink","providers","provider","target","$refText","_ref","_nodeDescription","createDescription","name","$type","LiteralExpr","resolveLiteral","InvocationExpr","resolveInvocation","ArrayExpr","resolveArray","ReferenceExpr","resolveReference","MemberAccessExpr","resolveMemberAccess","UnaryExpr","resolveUnary","BinaryExpr","resolveBinary","ThisExpr","resolveThis","NullExpr","resolveNull","AttributeArg","resolveAttributeArg","resolveDefault","operator","left","right","resolveToBuiltinTypeOrDecl","resolveCollectionPredicate","Error","operand","$resolvedType","args","forEach","arg","ref","EnumField","$container","resolveToDeclaredType","type","items","item","itemType","decl","function","funcDecl","isFromStdlib","model","getContainingModel","userModel","declarations","find","d","isDataModel","getContainingDataModel","returnType","curr","undefined","operandResolved","array","modelDecl","fields","f","member","resolvedType","dataModelDecl","attrParam","findAttrParamForArg","attrAppliedOn","isDataModelField","transtiveDataModel","scopeProvider","isArrayExpr","isReferenceExpr","resolved","createLinkingError","attr","params","p","index","findIndex","a","Object","entries","startsWith","isReference","child","mappedType","mapBuiltinTypeToExpressionType"],"sources":["../../src/language-server/zmodel-linker.ts"],"sourcesContent":["import {\n ArrayExpr,\n AttributeArg,\n AttributeParam,\n BinaryExpr,\n DataModel,\n DataModelField,\n DataModelFieldType,\n EnumField,\n Expression,\n FunctionDecl,\n FunctionParam,\n FunctionParamType,\n InvocationExpr,\n LiteralExpr,\n MemberAccessExpr,\n NullExpr,\n ReferenceExpr,\n ReferenceTarget,\n ResolvedShape,\n ThisExpr,\n UnaryExpr,\n isArrayExpr,\n isDataModel,\n isDataModelField,\n isReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport {\n AstNode,\n AstNodeDescription,\n AstNodeDescriptionProvider,\n DefaultLinker,\n DocumentState,\n LangiumDocument,\n LangiumServices,\n LinkingError,\n Reference,\n interruptAndCheck,\n isReference,\n streamContents,\n} from 'langium';\nimport { CancellationToken } from 'vscode-jsonrpc';\nimport { getContainingModel, isFromStdlib } from './utils';\nimport { mapBuiltinTypeToExpressionType } from './validator/utils';\n\ninterface DefaultReference extends Reference {\n _ref?: AstNode | LinkingError;\n _nodeDescription?: AstNodeDescription;\n}\n\ntype ScopeProvider = (name: string) => ReferenceTarget | undefined;\n\n/**\n * Langium linker implementation which links references and resolves expression types\n */\nexport class ZModelLinker extends DefaultLinker {\n private readonly descriptions: AstNodeDescriptionProvider;\n\n constructor(services: LangiumServices) {\n super(services);\n this.descriptions = services.workspace.AstNodeDescriptionProvider;\n }\n\n //#region Reference linking\n\n async link(document: LangiumDocument, cancelToken = CancellationToken.None): Promise<void> {\n if (document.parseResult.lexerErrors?.length > 0 || document.parseResult.parserErrors?.length > 0) {\n return;\n }\n\n for (const node of streamContents(document.parseResult.value)) {\n await interruptAndCheck(cancelToken);\n this.resolve(node, document);\n }\n document.state = DocumentState.Linked;\n }\n\n private linkReference(\n container: AstNode,\n property: string,\n document: LangiumDocument,\n extraScopes: ScopeProvider[]\n ) {\n if (!this.resolveFromScopeProviders(container, property, document, extraScopes)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const reference: Reference<AstNode> = (container as any)[property];\n this.doLink({ reference, container, property }, document);\n }\n }\n\n //#endregion\n\n //#region Expression type resolving\n\n private resolveFromScopeProviders(\n node: AstNode,\n property: string,\n document: LangiumDocument,\n providers: ScopeProvider[]\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const reference: DefaultReference = (node as any)[property];\n for (const provider of providers) {\n const target = provider(reference.$refText);\n if (target) {\n reference._ref = target;\n reference._nodeDescription = this.descriptions.createDescription(target, target.name, document);\n return target;\n }\n }\n return null;\n }\n\n private resolve(node: AstNode, document: LangiumDocument, extraScopes: ScopeProvider[] = []) {\n switch (node.$type) {\n case LiteralExpr:\n this.resolveLiteral(node as LiteralExpr);\n break;\n\n case InvocationExpr:\n this.resolveInvocation(node as InvocationExpr, document, extraScopes);\n break;\n\n case ArrayExpr:\n this.resolveArray(node as ArrayExpr, document, extraScopes);\n break;\n\n case ReferenceExpr:\n this.resolveReference(node as ReferenceExpr, document, extraScopes);\n break;\n\n case MemberAccessExpr:\n this.resolveMemberAccess(node as MemberAccessExpr, document, extraScopes);\n break;\n\n case UnaryExpr:\n this.resolveUnary(node as UnaryExpr, document, extraScopes);\n break;\n\n case BinaryExpr:\n this.resolveBinary(node as BinaryExpr, document, extraScopes);\n break;\n\n case ThisExpr:\n this.resolveThis(node as ThisExpr, document, extraScopes);\n break;\n\n case NullExpr:\n this.resolveNull(node as NullExpr, document, extraScopes);\n break;\n\n case AttributeArg:\n this.resolveAttributeArg(node as AttributeArg, document, extraScopes);\n break;\n\n default:\n this.resolveDefault(node, document, extraScopes);\n break;\n }\n }\n\n private resolveBinary(node: BinaryExpr, document: LangiumDocument<AstNode>, extraScopes: ScopeProvider[]) {\n switch (node.operator) {\n // TODO: support arithmetics?\n // case '+':\n // case '-':\n // case '*':\n // case '/':\n // this.resolve(node.left, document, extraScopes);\n // this.resolve(node.right, document, extraScopes);\n // this.resolveToBuiltinTypeOrDecl(node, 'Int');\n // break;\n\n case '>':\n case '>=':\n case '<':\n case '<=':\n case '==':\n case '!=':\n case '&&':\n case '||':\n this.resolve(node.left, document, extraScopes);\n this.resolve(node.right, document, extraScopes);\n this.resolveToBuiltinTypeOrDecl(node, 'Boolean');\n break;\n\n case '?':\n case '!':\n case '^':\n this.resolveCollectionPredicate(node, document, extraScopes);\n break;\n\n default:\n throw Error(`Unsupported binary operator: ${node.operator}`);\n }\n }\n\n private resolveUnary(node: UnaryExpr, document: LangiumDocument<AstNode>, extraScopes: ScopeProvider[]) {\n this.resolve(node.operand, document, extraScopes);\n node.$resolvedType = node.operand.$resolvedType;\n }\n\n private resolveReference(node: ReferenceExpr, document: LangiumDocument<AstNode>, extraScopes: ScopeProvider[]) {\n this.linkReference(node, 'target', document, extraScopes);\n node.args.forEach((arg) => this.resolve(arg, document, extraScopes));\n\n if (node.target.ref) {\n // resolve type\n if (node.target.ref.$type === EnumField) {\n this.resolveToBuiltinTypeOrDecl(node, node.target.ref.$container);\n } else {\n this.resolveToDeclaredType(node, (node.target.ref as DataModelField | FunctionParam).type);\n }\n }\n }\n\n private resolveArray(node: ArrayExpr, document: LangiumDocument<AstNode>, extraScopes: ScopeProvider[]) {\n node.items.forEach((item) => this.resolve(item, document, extraScopes));\n\n const itemType = node.items[0].$resolvedType;\n if (itemType?.decl) {\n this.resolveToBuiltinTypeOrDecl(node, itemType.decl, true);\n }\n }\n\n private resolveInvocation(node: InvocationExpr, document: LangiumDocument, extraScopes: ScopeProvider[]) {\n this.linkReference(node, 'function', document, extraScopes);\n node.args.forEach((arg) => this.resolve(arg, document, extraScopes));\n if (node.function.ref) {\n // eslint-disable-next-line @typescript-eslint/ban-types\n const funcDecl = node.function.ref as FunctionDecl;\n if (funcDecl.name === 'auth' && isFromStdlib(funcDecl)) {\n // auth() function is resolved to User model in the current document\n const model = getContainingModel(node);\n const userModel = model?.declarations.find((d) => isDataModel(d) && d.name === 'User');\n if (userModel) {\n node.$resolvedType = { decl: userModel };\n }\n } else if (funcDecl.name === 'future' && isFromStdlib(funcDecl)) {\n // future() function is resolved to current model\n node.$resolvedType = { decl: this.getContainingDataModel(node) };\n } else {\n this.resolveToDeclaredType(node, funcDecl.returnType);\n }\n }\n }\n\n private getContainingDataModel(node: Expression): DataModel | undefined {\n let curr: AstNode | undefined = node.$container;\n while (curr) {\n if (isDataModel(curr)) {\n return curr;\n }\n curr = curr.$container;\n }\n return undefined;\n }\n\n private resolveLiteral(node: LiteralExpr) {\n const type =\n typeof node.value === 'string'\n ? 'String'\n : typeof node.value === 'boolean'\n ? 'Boolean'\n : typeof node.value === 'number'\n ? 'Int'\n : undefined;\n\n if (type) {\n this.resolveToBuiltinTypeOrDecl(node, type);\n }\n }\n\n private resolveMemberAccess(\n node: MemberAccessExpr,\n document: LangiumDocument<AstNode>,\n extraScopes: ScopeProvider[]\n ) {\n this.resolve(node.operand, document, extraScopes);\n const operandResolved = node.operand.$resolvedType;\n\n if (operandResolved && !operandResolved.array && isDataModel(operandResolved.decl)) {\n const modelDecl = operandResolved.decl as DataModel;\n const provider = (name: string) => modelDecl.fields.find((f) => f.name === name);\n extraScopes = [provider, ...extraScopes];\n }\n\n this.linkReference(node, 'member', document, extraScopes);\n if (node.member.ref) {\n this.resolveToDeclaredType(node, node.member.ref.type);\n }\n }\n\n private resolveCollectionPredicate(node: BinaryExpr, document: LangiumDocument, extraScopes: ScopeProvider[]) {\n this.resolve(node.left, document, extraScopes);\n\n const resolvedType = node.left.$resolvedType;\n if (resolvedType && isDataModel(resolvedType.decl) && resolvedType.array) {\n const dataModelDecl = resolvedType.decl;\n const provider = (name: string) => dataModelDecl.fields.find((f) => f.name === name);\n extraScopes = [provider, ...extraScopes];\n this.resolve(node.right, document, extraScopes);\n this.resolveToBuiltinTypeOrDecl(node, 'Boolean');\n } else {\n // error is reported in validation pass\n }\n }\n\n private resolveThis(\n node: ThisExpr,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n document: LangiumDocument<AstNode>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n extraScopes: ScopeProvider[]\n ) {\n let decl: AstNode | undefined = node.$container;\n\n while (decl && !isDataModel(decl)) {\n decl = decl.$container;\n }\n\n if (decl) {\n this.resolveToBuiltinTypeOrDecl(node, decl);\n }\n }\n\n private resolveNull(\n node: NullExpr,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n document: LangiumDocument<AstNode>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n extraScopes: ScopeProvider[]\n ) {\n // TODO: how to really resolve null?\n this.resolveToBuiltinTypeOrDecl(node, 'Null');\n }\n\n private resolveAttributeArg(node: AttributeArg, document: LangiumDocument<AstNode>, extraScopes: ScopeProvider[]) {\n const attrParam = this.findAttrParamForArg(node);\n const attrAppliedOn = node.$container.$container;\n\n if (attrParam?.type.type === 'TransitiveFieldReference' && isDataModelField(attrAppliedOn)) {\n // \"TransitiveFieldReference\" is resolved in the context of the containing model of the field\n // where the attribute is applied\n //\n // E.g.:\n //\n // model A {\n // myId @id String\n // }\n //\n // model B {\n // id @id String\n // a A @relation(fields: [id], references: [myId])\n // }\n //\n // In model B, the attribute argument \"myId\" is resolved to the field \"myId\" in model A\n\n const transtiveDataModel = attrAppliedOn.type.reference?.ref as DataModel;\n if (transtiveDataModel) {\n // resolve references in the context of the transitive data model\n const scopeProvider = (name: string) => transtiveDataModel.fields.find((f) => f.name === name);\n if (isArrayExpr(node.value)) {\n node.value.items.forEach((item) => {\n if (isReferenceExpr(item)) {\n const resolved = this.resolveFromScopeProviders(item, 'target', document, [scopeProvider]);\n if (resolved) {\n this.resolveToDeclaredType(item, (resolved as DataModelField).type);\n } else {\n // need to clear linked reference, because it's resolved in default scope by default\n const ref = item.target as DefaultReference;\n ref._ref = this.createLinkingError({\n reference: ref,\n container: item,\n property: 'target',\n });\n }\n }\n });\n if (node.value.items[0]?.$resolvedType?.decl) {\n this.resolveToBuiltinTypeOrDecl(node.value, node.value.items[0].$resolvedType.decl, true);\n }\n } else if (isReferenceExpr(node.value)) {\n const resolved = this.resolveFromScopeProviders(node.value, 'target', document, [scopeProvider]);\n if (resolved) {\n this.resolveToDeclaredType(node.value, (resolved as DataModelField).type);\n } else {\n // need to clear linked reference, because it's resolved in default scope by default\n const ref = node.value.target as DefaultReference;\n ref._ref = this.createLinkingError({\n reference: ref,\n container: node.value,\n property: 'target',\n });\n }\n }\n }\n } else {\n this.resolve(node.value, document, extraScopes);\n }\n node.$resolvedType = node.value.$resolvedType;\n }\n\n private findAttrParamForArg(arg: AttributeArg): AttributeParam | undefined {\n const attr = arg.$container.decl.ref;\n if (!attr) {\n return undefined;\n }\n if (arg.name) {\n return attr.params?.find((p) => p.name === arg.name);\n } else {\n const index = arg.$container.args.findIndex((a) => a === arg);\n return attr.params[index];\n }\n }\n\n private resolveDefault(node: AstNode, document: LangiumDocument<AstNode>, extraScopes: ScopeProvider[]) {\n for (const [property, value] of Object.entries(node)) {\n if (!property.startsWith('$')) {\n if (isReference(value)) {\n this.linkReference(node, property, document, extraScopes);\n }\n }\n }\n for (const child of streamContents(node)) {\n this.resolve(child, document, extraScopes);\n }\n }\n\n //#endregion\n\n //#region Utils\n\n private resolveToDeclaredType(node: AstNode, type: FunctionParamType | DataModelFieldType) {\n if (type.type) {\n const mappedType = mapBuiltinTypeToExpressionType(type.type);\n node.$resolvedType = { decl: mappedType, array: type.array };\n } else if (type.reference) {\n node.$resolvedType = {\n decl: type.reference.ref,\n array: type.array,\n };\n }\n }\n\n private resolveToBuiltinTypeOrDecl(node: AstNode, type: ResolvedShape, array = false) {\n node.$resolvedType = { decl: type, array };\n }\n\n //#endregion\n}\n"],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { DefaultSharedModuleContext, LangiumDefaultSharedServices, LangiumServices, LangiumSharedServices, Module, PartialLangiumServices } from 'langium';
2
+ import { ZModelValidator } from './validator/zmodel-validator';
3
+ /**
4
+ * Declaration of custom services - add your own service classes here.
5
+ */
6
+ export declare type ZModelAddedServices = {
7
+ validation: {
8
+ ZModelValidator: ZModelValidator;
9
+ };
10
+ };
11
+ /**
12
+ * Union of Langium default services and your custom services - use this as constructor parameter
13
+ * of custom service classes.
14
+ */
15
+ export declare type ZModelServices = LangiumServices & ZModelAddedServices;
16
+ /**
17
+ * Dependency injection module that overrides Langium default services and contributes the
18
+ * declared custom services. The Langium defaults can be partially specified to override only
19
+ * selected services, while the custom services must be fully specified.
20
+ */
21
+ export declare const ZModelModule: Module<ZModelServices, PartialLangiumServices & ZModelAddedServices>;
22
+ export declare function createSharedModule(context: DefaultSharedModuleContext): Module<LangiumSharedServices, LangiumDefaultSharedServices>;
23
+ /**
24
+ * Create the full set of services required by Langium.
25
+ *
26
+ * First inject the shared services by merging two modules:
27
+ * - Langium default shared services
28
+ * - Services generated by langium-cli
29
+ *
30
+ * Then inject the language-specific services by merging three modules:
31
+ * - Langium default language-specific services
32
+ * - Services generated by langium-cli
33
+ * - Services specified in this file
34
+ *
35
+ * @param context Optional module context with the LSP connection
36
+ * @returns An object wrapping the shared services and the language-specific services
37
+ */
38
+ export declare function createZModelServices(context: DefaultSharedModuleContext): {
39
+ shared: LangiumSharedServices;
40
+ ZModel: ZModelServices;
41
+ };
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ZModelModule = void 0;
7
+ exports.createSharedModule = createSharedModule;
8
+ exports.createZModelServices = createZModelServices;
9
+ var _module = require("@zenstackhq/language/module");
10
+ var _langium = require("langium");
11
+ var _vscodeLanguageserver = require("vscode-languageserver");
12
+ var _vscodeLanguageserverTextdocument = require("vscode-languageserver-textdocument");
13
+ var _zmodelValidator = require("./validator/zmodel-validator");
14
+ var _zmodelLinker = require("./zmodel-linker");
15
+ var _zmodelScope = require("./zmodel-scope");
16
+ var _zmodelWorkspaceManager = _interopRequireDefault(require("./zmodel-workspace-manager"));
17
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
+ /**
19
+ * Dependency injection module that overrides Langium default services and contributes the
20
+ * declared custom services. The Langium defaults can be partially specified to override only
21
+ * selected services, while the custom services must be fully specified.
22
+ */
23
+ const ZModelModule = {
24
+ references: {
25
+ ScopeComputation: services => new _zmodelScope.ZModelScopeComputation(services),
26
+ Linker: services => new _zmodelLinker.ZModelLinker(services)
27
+ },
28
+ validation: {
29
+ ValidationRegistry: services => new _zmodelValidator.ZModelValidationRegistry(services),
30
+ ZModelValidator: () => new _zmodelValidator.ZModelValidator()
31
+ }
32
+ };
33
+
34
+ // this duplicates createDefaultSharedModule except that a custom WorkspaceManager is used
35
+ exports.ZModelModule = ZModelModule;
36
+ function createSharedModule(context) {
37
+ return {
38
+ ServiceRegistry: () => new _langium.DefaultServiceRegistry(),
39
+ lsp: {
40
+ Connection: () => context.connection,
41
+ LanguageServer: services => new _langium.DefaultLanguageServer(services)
42
+ },
43
+ workspace: {
44
+ LangiumDocuments: services => new _langium.DefaultLangiumDocuments(services),
45
+ LangiumDocumentFactory: services => new _langium.DefaultLangiumDocumentFactory(services),
46
+ DocumentBuilder: services => new _langium.DefaultDocumentBuilder(services),
47
+ TextDocuments: () => new _vscodeLanguageserver.TextDocuments(_vscodeLanguageserverTextdocument.TextDocument),
48
+ IndexManager: services => new _langium.DefaultIndexManager(services),
49
+ WorkspaceManager: services => new _zmodelWorkspaceManager.default(services),
50
+ FileSystemProvider: services => context.fileSystemProvider(services),
51
+ MutexLock: () => new _langium.MutexLock(),
52
+ ConfigurationProvider: services => new _langium.DefaultConfigurationProvider(services)
53
+ }
54
+ };
55
+ }
56
+
57
+ /**
58
+ * Create the full set of services required by Langium.
59
+ *
60
+ * First inject the shared services by merging two modules:
61
+ * - Langium default shared services
62
+ * - Services generated by langium-cli
63
+ *
64
+ * Then inject the language-specific services by merging three modules:
65
+ * - Langium default language-specific services
66
+ * - Services generated by langium-cli
67
+ * - Services specified in this file
68
+ *
69
+ * @param context Optional module context with the LSP connection
70
+ * @returns An object wrapping the shared services and the language-specific services
71
+ */
72
+ function createZModelServices(context) {
73
+ const shared = (0, _langium.inject)(createSharedModule(context), _module.ZModelGeneratedSharedModule);
74
+ const ZModel = (0, _langium.inject)((0, _langium.createDefaultModule)({
75
+ shared
76
+ }), _module.ZModelGeneratedModule, ZModelModule);
77
+ shared.ServiceRegistry.register(ZModel);
78
+ return {
79
+ shared,
80
+ ZModel
81
+ };
82
+ }
83
+ //# sourceMappingURL=zmodel-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zmodel-module.js","names":["ZModelModule","references","ScopeComputation","services","ZModelScopeComputation","Linker","ZModelLinker","validation","ValidationRegistry","ZModelValidationRegistry","ZModelValidator","createSharedModule","context","ServiceRegistry","DefaultServiceRegistry","lsp","Connection","connection","LanguageServer","DefaultLanguageServer","workspace","LangiumDocuments","DefaultLangiumDocuments","LangiumDocumentFactory","DefaultLangiumDocumentFactory","DocumentBuilder","DefaultDocumentBuilder","TextDocuments","TextDocument","IndexManager","DefaultIndexManager","WorkspaceManager","ZModelWorkspaceManager","FileSystemProvider","fileSystemProvider","MutexLock","ConfigurationProvider","DefaultConfigurationProvider","createZModelServices","shared","inject","ZModelGeneratedSharedModule","ZModel","createDefaultModule","ZModelGeneratedModule","register"],"sources":["../../src/language-server/zmodel-module.ts"],"sourcesContent":["import { ZModelGeneratedModule, ZModelGeneratedSharedModule } from '@zenstackhq/language/module';\nimport {\n createDefaultModule,\n DefaultConfigurationProvider,\n DefaultDocumentBuilder,\n DefaultIndexManager,\n DefaultLangiumDocumentFactory,\n DefaultLangiumDocuments,\n DefaultLanguageServer,\n DefaultServiceRegistry,\n DefaultSharedModuleContext,\n inject,\n LangiumDefaultSharedServices,\n LangiumServices,\n LangiumSharedServices,\n Module,\n MutexLock,\n PartialLangiumServices,\n} from 'langium';\nimport { TextDocuments } from 'vscode-languageserver';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\nimport { ZModelValidationRegistry, ZModelValidator } from './validator/zmodel-validator';\nimport { ZModelLinker } from './zmodel-linker';\nimport { ZModelScopeComputation } from './zmodel-scope';\nimport ZModelWorkspaceManager from './zmodel-workspace-manager';\n\n/**\n * Declaration of custom services - add your own service classes here.\n */\nexport type ZModelAddedServices = {\n validation: {\n ZModelValidator: ZModelValidator;\n };\n};\n\n/**\n * Union of Langium default services and your custom services - use this as constructor parameter\n * of custom service classes.\n */\nexport type ZModelServices = LangiumServices & ZModelAddedServices;\n\n/**\n * Dependency injection module that overrides Langium default services and contributes the\n * declared custom services. The Langium defaults can be partially specified to override only\n * selected services, while the custom services must be fully specified.\n */\nexport const ZModelModule: Module<ZModelServices, PartialLangiumServices & ZModelAddedServices> = {\n references: {\n ScopeComputation: (services) => new ZModelScopeComputation(services),\n Linker: (services) => new ZModelLinker(services),\n },\n validation: {\n ValidationRegistry: (services) => new ZModelValidationRegistry(services),\n ZModelValidator: () => new ZModelValidator(),\n },\n};\n\n// this duplicates createDefaultSharedModule except that a custom WorkspaceManager is used\nexport function createSharedModule(\n context: DefaultSharedModuleContext\n): Module<LangiumSharedServices, LangiumDefaultSharedServices> {\n return {\n ServiceRegistry: () => new DefaultServiceRegistry(),\n lsp: {\n Connection: () => context.connection,\n LanguageServer: (services) => new DefaultLanguageServer(services),\n },\n workspace: {\n LangiumDocuments: (services) => new DefaultLangiumDocuments(services),\n LangiumDocumentFactory: (services) => new DefaultLangiumDocumentFactory(services),\n DocumentBuilder: (services) => new DefaultDocumentBuilder(services),\n TextDocuments: () => new TextDocuments(TextDocument),\n IndexManager: (services) => new DefaultIndexManager(services),\n WorkspaceManager: (services) => new ZModelWorkspaceManager(services),\n FileSystemProvider: (services) => context.fileSystemProvider(services),\n MutexLock: () => new MutexLock(),\n ConfigurationProvider: (services) => new DefaultConfigurationProvider(services),\n },\n };\n}\n\n/**\n * Create the full set of services required by Langium.\n *\n * First inject the shared services by merging two modules:\n * - Langium default shared services\n * - Services generated by langium-cli\n *\n * Then inject the language-specific services by merging three modules:\n * - Langium default language-specific services\n * - Services generated by langium-cli\n * - Services specified in this file\n *\n * @param context Optional module context with the LSP connection\n * @returns An object wrapping the shared services and the language-specific services\n */\nexport function createZModelServices(context: DefaultSharedModuleContext): {\n shared: LangiumSharedServices;\n ZModel: ZModelServices;\n} {\n const shared = inject(createSharedModule(context), ZModelGeneratedSharedModule);\n\n const ZModel = inject(createDefaultModule({ shared }), ZModelGeneratedModule, ZModelModule);\n shared.ServiceRegistry.register(ZModel);\n return { shared, ZModel };\n}\n"],"mappings":";;;;;;;;AAAA;AACA;AAkBA;AACA;AACA;AACA;AACA;AACA;AAAgE;AAiBhE;AACA;AACA;AACA;AACA;AACO,MAAMA,YAAkF,GAAG;EAC9FC,UAAU,EAAE;IACRC,gBAAgB,EAAGC,QAAQ,IAAK,IAAIC,mCAAsB,CAACD,QAAQ,CAAC;IACpEE,MAAM,EAAGF,QAAQ,IAAK,IAAIG,0BAAY,CAACH,QAAQ;EACnD,CAAC;EACDI,UAAU,EAAE;IACRC,kBAAkB,EAAGL,QAAQ,IAAK,IAAIM,yCAAwB,CAACN,QAAQ,CAAC;IACxEO,eAAe,EAAE,MAAM,IAAIA,gCAAe;EAC9C;AACJ,CAAC;;AAED;AAAA;AACO,SAASC,kBAAkB,CAC9BC,OAAmC,EACwB;EAC3D,OAAO;IACHC,eAAe,EAAE,MAAM,IAAIC,+BAAsB,EAAE;IACnDC,GAAG,EAAE;MACDC,UAAU,EAAE,MAAMJ,OAAO,CAACK,UAAU;MACpCC,cAAc,EAAGf,QAAQ,IAAK,IAAIgB,8BAAqB,CAAChB,QAAQ;IACpE,CAAC;IACDiB,SAAS,EAAE;MACPC,gBAAgB,EAAGlB,QAAQ,IAAK,IAAImB,gCAAuB,CAACnB,QAAQ,CAAC;MACrEoB,sBAAsB,EAAGpB,QAAQ,IAAK,IAAIqB,sCAA6B,CAACrB,QAAQ,CAAC;MACjFsB,eAAe,EAAGtB,QAAQ,IAAK,IAAIuB,+BAAsB,CAACvB,QAAQ,CAAC;MACnEwB,aAAa,EAAE,MAAM,IAAIA,mCAAa,CAACC,8CAAY,CAAC;MACpDC,YAAY,EAAG1B,QAAQ,IAAK,IAAI2B,4BAAmB,CAAC3B,QAAQ,CAAC;MAC7D4B,gBAAgB,EAAG5B,QAAQ,IAAK,IAAI6B,+BAAsB,CAAC7B,QAAQ,CAAC;MACpE8B,kBAAkB,EAAG9B,QAAQ,IAAKS,OAAO,CAACsB,kBAAkB,CAAC/B,QAAQ,CAAC;MACtEgC,SAAS,EAAE,MAAM,IAAIA,kBAAS,EAAE;MAChCC,qBAAqB,EAAGjC,QAAQ,IAAK,IAAIkC,qCAA4B,CAAClC,QAAQ;IAClF;EACJ,CAAC;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASmC,oBAAoB,CAAC1B,OAAmC,EAGtE;EACE,MAAM2B,MAAM,GAAG,IAAAC,eAAM,EAAC7B,kBAAkB,CAACC,OAAO,CAAC,EAAE6B,mCAA2B,CAAC;EAE/E,MAAMC,MAAM,GAAG,IAAAF,eAAM,EAAC,IAAAG,4BAAmB,EAAC;IAAEJ;EAAO,CAAC,CAAC,EAAEK,6BAAqB,EAAE5C,YAAY,CAAC;EAC3FuC,MAAM,CAAC1B,eAAe,CAACgC,QAAQ,CAACH,MAAM,CAAC;EACvC,OAAO;IAAEH,MAAM;IAAEG;EAAO,CAAC;AAC7B"}
@@ -0,0 +1,10 @@
1
+ import { AstNode, AstNodeDescription, DefaultScopeComputation, LangiumDocument, LangiumServices } from 'langium';
2
+ import { CancellationToken } from 'vscode-jsonrpc';
3
+ /**
4
+ * Custom Langium ScopeComputation implementation which adds enum fields into global scope
5
+ */
6
+ export declare class ZModelScopeComputation extends DefaultScopeComputation {
7
+ private readonly services;
8
+ constructor(services: LangiumServices);
9
+ computeExports(document: LangiumDocument<AstNode>, cancelToken?: CancellationToken | undefined): Promise<AstNodeDescription[]>;
10
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ZModelScopeComputation = void 0;
7
+ var _ast = require("@zenstackhq/language/ast");
8
+ var _langium = require("langium");
9
+ /**
10
+ * Custom Langium ScopeComputation implementation which adds enum fields into global scope
11
+ */
12
+ class ZModelScopeComputation extends _langium.DefaultScopeComputation {
13
+ constructor(services) {
14
+ super(services);
15
+ this.services = services;
16
+ }
17
+ async computeExports(document, cancelToken) {
18
+ const result = await super.computeExports(document, cancelToken);
19
+
20
+ // add enum fields so they can be globally resolved across modules
21
+ for (const node of (0, _langium.streamAllContents)(document.parseResult.value)) {
22
+ if (cancelToken) {
23
+ await (0, _langium.interruptAndCheck)(cancelToken);
24
+ }
25
+ if ((0, _ast.isEnumField)(node)) {
26
+ const desc = this.services.workspace.AstNodeDescriptionProvider.createDescription(node, node.name, document);
27
+ result.push(desc);
28
+ }
29
+ }
30
+ return result;
31
+ }
32
+ }
33
+ exports.ZModelScopeComputation = ZModelScopeComputation;
34
+ //# sourceMappingURL=zmodel-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zmodel-scope.js","names":["ZModelScopeComputation","DefaultScopeComputation","constructor","services","computeExports","document","cancelToken","result","node","streamAllContents","parseResult","value","interruptAndCheck","isEnumField","desc","workspace","AstNodeDescriptionProvider","createDescription","name","push"],"sources":["../../src/language-server/zmodel-scope.ts"],"sourcesContent":["import { isEnumField } from '@zenstackhq/language/ast';\nimport {\n AstNode,\n AstNodeDescription,\n DefaultScopeComputation,\n interruptAndCheck,\n LangiumDocument,\n LangiumServices,\n streamAllContents,\n} from 'langium';\nimport { CancellationToken } from 'vscode-jsonrpc';\n\n/**\n * Custom Langium ScopeComputation implementation which adds enum fields into global scope\n */\nexport class ZModelScopeComputation extends DefaultScopeComputation {\n constructor(private readonly services: LangiumServices) {\n super(services);\n }\n\n async computeExports(\n document: LangiumDocument<AstNode>,\n cancelToken?: CancellationToken | undefined\n ): Promise<AstNodeDescription[]> {\n const result = await super.computeExports(document, cancelToken);\n\n // add enum fields so they can be globally resolved across modules\n for (const node of streamAllContents(document.parseResult.value)) {\n if (cancelToken) {\n await interruptAndCheck(cancelToken);\n }\n if (isEnumField(node)) {\n const desc = this.services.workspace.AstNodeDescriptionProvider.createDescription(\n node,\n node.name,\n document\n );\n result.push(desc);\n }\n }\n\n return result;\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;AAWA;AACA;AACA;AACO,MAAMA,sBAAsB,SAASC,gCAAuB,CAAC;EAChEC,WAAW,CAAkBC,QAAyB,EAAE;IACpD,KAAK,CAACA,QAAQ,CAAC;IAAC,KADSA,QAAyB,GAAzBA,QAAyB;EAEtD;EAEA,MAAMC,cAAc,CAChBC,QAAkC,EAClCC,WAA2C,EACd;IAC7B,MAAMC,MAAM,GAAG,MAAM,KAAK,CAACH,cAAc,CAACC,QAAQ,EAAEC,WAAW,CAAC;;IAEhE;IACA,KAAK,MAAME,IAAI,IAAI,IAAAC,0BAAiB,EAACJ,QAAQ,CAACK,WAAW,CAACC,KAAK,CAAC,EAAE;MAC9D,IAAIL,WAAW,EAAE;QACb,MAAM,IAAAM,0BAAiB,EAACN,WAAW,CAAC;MACxC;MACA,IAAI,IAAAO,gBAAW,EAACL,IAAI,CAAC,EAAE;QACnB,MAAMM,IAAI,GAAG,IAAI,CAACX,QAAQ,CAACY,SAAS,CAACC,0BAA0B,CAACC,iBAAiB,CAC7ET,IAAI,EACJA,IAAI,CAACU,IAAI,EACTb,QAAQ,CACX;QACDE,MAAM,CAACY,IAAI,CAACL,IAAI,CAAC;MACrB;IACJ;IAEA,OAAOP,MAAM;EACjB;AACJ;AAAC"}
@@ -0,0 +1,8 @@
1
+ import { DefaultWorkspaceManager, LangiumDocument } from 'langium';
2
+ import { WorkspaceFolder } from 'vscode-languageserver';
3
+ /**
4
+ * Custom Langium WorkspaceManager implementation which automatically loads stdlib.zmodel
5
+ */
6
+ export default class ZModelWorkspaceManager extends DefaultWorkspaceManager {
7
+ protected loadAdditionalDocuments(_folders: WorkspaceFolder[], _collector: (document: LangiumDocument) => void): Promise<void>;
8
+ }