zenstack 1.0.0 → 1.0.16

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 (264) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +126 -1
  3. package/bin/cli +3 -0
  4. package/bin/post-install.js +24 -0
  5. package/cli/cli-error.d.ts +5 -0
  6. package/cli/cli-error.js +10 -0
  7. package/cli/cli-error.js.map +1 -0
  8. package/cli/cli-util.d.ts +18 -0
  9. package/cli/cli-util.js +143 -0
  10. package/cli/cli-util.js.map +1 -0
  11. package/cli/index.d.ts +15 -0
  12. package/cli/index.js +121 -0
  13. package/cli/index.js.map +1 -0
  14. package/cli/plugin-runner.d.ts +14 -0
  15. package/cli/plugin-runner.js +145 -0
  16. package/cli/plugin-runner.js.map +1 -0
  17. package/constants.d.ts +1 -0
  18. package/constants.js +6 -0
  19. package/constants.js.map +1 -0
  20. package/language-server/constants.d.ts +15 -0
  21. package/language-server/constants.js +20 -0
  22. package/language-server/constants.js.map +1 -0
  23. package/language-server/main.d.ts +1 -0
  24. package/language-server/main.js +13 -0
  25. package/language-server/main.js.map +1 -0
  26. package/language-server/types.d.ts +10 -0
  27. package/language-server/types.js +3 -0
  28. package/language-server/types.js.map +1 -0
  29. package/language-server/utils.d.ts +18 -0
  30. package/language-server/utils.js +58 -0
  31. package/language-server/utils.js.map +1 -0
  32. package/language-server/validator/attribute-validator.d.ts +9 -0
  33. package/language-server/validator/attribute-validator.js +11 -0
  34. package/language-server/validator/attribute-validator.js.map +1 -0
  35. package/language-server/validator/datamodel-validator.d.ts +15 -0
  36. package/language-server/validator/datamodel-validator.js +278 -0
  37. package/language-server/validator/datamodel-validator.js.map +1 -0
  38. package/language-server/validator/datasource-validator.d.ts +12 -0
  39. package/language-server/validator/datasource-validator.js +66 -0
  40. package/language-server/validator/datasource-validator.js.map +1 -0
  41. package/language-server/validator/enum-validator.d.ts +11 -0
  42. package/language-server/validator/enum-validator.js +28 -0
  43. package/language-server/validator/enum-validator.js.map +1 -0
  44. package/language-server/validator/expression-validator.d.ts +10 -0
  45. package/language-server/validator/expression-validator.js +30 -0
  46. package/language-server/validator/expression-validator.js.map +1 -0
  47. package/language-server/validator/schema-validator.d.ts +10 -0
  48. package/language-server/validator/schema-validator.js +28 -0
  49. package/language-server/validator/schema-validator.js.map +1 -0
  50. package/language-server/validator/utils.d.ts +25 -0
  51. package/language-server/validator/utils.js +257 -0
  52. package/language-server/validator/utils.js.map +1 -0
  53. package/language-server/validator/zmodel-validator.d.ts +21 -0
  54. package/language-server/validator/zmodel-validator.js +69 -0
  55. package/language-server/validator/zmodel-validator.js.map +1 -0
  56. package/language-server/zmodel-code-action.d.ts +14 -0
  57. package/language-server/zmodel-code-action.js +93 -0
  58. package/language-server/zmodel-code-action.js.map +1 -0
  59. package/language-server/zmodel-formatter.d.ts +9 -0
  60. package/language-server/zmodel-formatter.js +76 -0
  61. package/language-server/zmodel-formatter.js.map +1 -0
  62. package/language-server/zmodel-linker.d.ts +29 -0
  63. package/language-server/zmodel-linker.js +366 -0
  64. package/language-server/zmodel-linker.js.map +1 -0
  65. package/language-server/zmodel-module.d.ts +41 -0
  66. package/language-server/zmodel-module.js +80 -0
  67. package/language-server/zmodel-module.js.map +1 -0
  68. package/language-server/zmodel-scope.d.ts +10 -0
  69. package/language-server/zmodel-scope.js +44 -0
  70. package/language-server/zmodel-scope.js.map +1 -0
  71. package/language-server/zmodel-workspace-manager.d.ts +8 -0
  72. package/language-server/zmodel-workspace-manager.js +37 -0
  73. package/language-server/zmodel-workspace-manager.js.map +1 -0
  74. package/package.json +133 -8
  75. package/plugins/access-policy/expression-writer.d.ts +39 -0
  76. package/plugins/access-policy/expression-writer.js +361 -0
  77. package/plugins/access-policy/expression-writer.js.map +1 -0
  78. package/plugins/access-policy/index.d.ts +4 -0
  79. package/plugins/access-policy/index.js +24 -0
  80. package/plugins/access-policy/index.js.map +1 -0
  81. package/plugins/access-policy/policy-guard-generator.d.ts +15 -0
  82. package/plugins/access-policy/policy-guard-generator.js +349 -0
  83. package/plugins/access-policy/policy-guard-generator.js.map +1 -0
  84. package/plugins/access-policy/typescript-expression-transformer.d.ts +26 -0
  85. package/plugins/access-policy/typescript-expression-transformer.js +111 -0
  86. package/plugins/access-policy/typescript-expression-transformer.js.map +1 -0
  87. package/plugins/access-policy/utils.d.ts +5 -0
  88. package/plugins/access-policy/utils.js +14 -0
  89. package/plugins/access-policy/utils.js.map +1 -0
  90. package/plugins/access-policy/zod-schema-generator.d.ts +12 -0
  91. package/plugins/access-policy/zod-schema-generator.js +158 -0
  92. package/plugins/access-policy/zod-schema-generator.js.map +1 -0
  93. package/plugins/model-meta/index.d.ts +4 -0
  94. package/plugins/model-meta/index.js +168 -0
  95. package/plugins/model-meta/index.js.map +1 -0
  96. package/plugins/plugin-utils.d.ts +16 -0
  97. package/plugins/plugin-utils.js +54 -0
  98. package/plugins/plugin-utils.js.map +1 -0
  99. package/plugins/prisma/indent-string.d.ts +4 -0
  100. package/plugins/prisma/indent-string.js +12 -0
  101. package/plugins/prisma/indent-string.js.map +1 -0
  102. package/plugins/prisma/index.d.ts +4 -0
  103. package/plugins/prisma/index.js +24 -0
  104. package/plugins/prisma/index.js.map +1 -0
  105. package/plugins/prisma/prisma-builder.d.ts +152 -0
  106. package/plugins/prisma/prisma-builder.js +363 -0
  107. package/plugins/prisma/prisma-builder.js.map +1 -0
  108. package/plugins/prisma/schema-generator.d.ts +25 -0
  109. package/plugins/prisma/schema-generator.js +292 -0
  110. package/plugins/prisma/schema-generator.js.map +1 -0
  111. package/plugins/prisma/zmodel-code-generator.d.ts +28 -0
  112. package/plugins/prisma/zmodel-code-generator.js +114 -0
  113. package/plugins/prisma/zmodel-code-generator.js.map +1 -0
  114. package/res/prism-zmodel.js +20 -0
  115. package/res/starter.zmodel +51 -0
  116. package/res/stdlib.zmodel +346 -0
  117. package/telemetry.d.ts +20 -0
  118. package/telemetry.js +119 -0
  119. package/telemetry.js.map +1 -0
  120. package/types.d.ts +12 -0
  121. package/types.js +3 -0
  122. package/types.js.map +1 -0
  123. package/utils/ast-utils.d.ts +16 -0
  124. package/utils/ast-utils.js +85 -0
  125. package/utils/ast-utils.js.map +1 -0
  126. package/utils/exec-utils.d.ts +6 -0
  127. package/utils/exec-utils.js +13 -0
  128. package/utils/exec-utils.js.map +1 -0
  129. package/utils/pkg-utils.d.ts +3 -0
  130. package/utils/pkg-utils.js +46 -0
  131. package/utils/pkg-utils.js.map +1 -0
  132. package/utils/version-utils.d.ts +1 -0
  133. package/utils/version-utils.js +14 -0
  134. package/utils/version-utils.js.map +1 -0
  135. package/.vscode/extensions.json +0 -7
  136. package/.vscode/launch.json +0 -49
  137. package/.vscode/settings.json +0 -4
  138. package/packages/internal/jest.config.ts +0 -32
  139. package/packages/internal/package.json +0 -42
  140. package/packages/internal/src/constants.ts +0 -1
  141. package/packages/internal/src/handler/data/guard-utils.ts +0 -7
  142. package/packages/internal/src/handler/data/handler.ts +0 -415
  143. package/packages/internal/src/handler/data/query-processor.ts +0 -504
  144. package/packages/internal/src/handler/index.ts +0 -1
  145. package/packages/internal/src/handler/types.ts +0 -20
  146. package/packages/internal/src/index.ts +0 -3
  147. package/packages/internal/src/request-handler.ts +0 -27
  148. package/packages/internal/src/request.ts +0 -101
  149. package/packages/internal/src/types.ts +0 -40
  150. package/packages/internal/tests/query-processor.test.ts +0 -172
  151. package/packages/internal/tsconfig.json +0 -21
  152. package/packages/runtime/auth.d.ts +0 -1
  153. package/packages/runtime/auth.js +0 -3
  154. package/packages/runtime/hooks.d.ts +0 -10
  155. package/packages/runtime/hooks.js +0 -3
  156. package/packages/runtime/index.d.ts +0 -3
  157. package/packages/runtime/index.js +0 -1
  158. package/packages/runtime/package-lock.json +0 -512
  159. package/packages/runtime/package.json +0 -16
  160. package/packages/runtime/server.d.ts +0 -1
  161. package/packages/runtime/server.js +0 -3
  162. package/packages/runtime/types.d.ts +0 -1
  163. package/packages/runtime/types.js +0 -3
  164. package/packages/schema/.eslintrc.json +0 -13
  165. package/packages/schema/.vscodeignore +0 -4
  166. package/packages/schema/asset/logo-dark.png +0 -0
  167. package/packages/schema/asset/logo-light.png +0 -0
  168. package/packages/schema/bin/cli +0 -3
  169. package/packages/schema/jest.config.ts +0 -32
  170. package/packages/schema/langium-config.json +0 -14
  171. package/packages/schema/langium-quickstart.md +0 -41
  172. package/packages/schema/language-configuration.json +0 -30
  173. package/packages/schema/package.json +0 -96
  174. package/packages/schema/src/cli/cli-util.ts +0 -80
  175. package/packages/schema/src/cli/index.ts +0 -64
  176. package/packages/schema/src/extension.ts +0 -76
  177. package/packages/schema/src/generator/constants.ts +0 -5
  178. package/packages/schema/src/generator/index.ts +0 -92
  179. package/packages/schema/src/generator/next-auth/index.ts +0 -197
  180. package/packages/schema/src/generator/package.template.json +0 -9
  181. package/packages/schema/src/generator/prisma/expression-writer.ts +0 -352
  182. package/packages/schema/src/generator/prisma/index.ts +0 -32
  183. package/packages/schema/src/generator/prisma/plain-expression-builder.ts +0 -91
  184. package/packages/schema/src/generator/prisma/prisma-builder.ts +0 -366
  185. package/packages/schema/src/generator/prisma/query-gard-generator.ts +0 -208
  186. package/packages/schema/src/generator/prisma/schema-generator.ts +0 -300
  187. package/packages/schema/src/generator/react-hooks/index.ts +0 -181
  188. package/packages/schema/src/generator/service/index.ts +0 -107
  189. package/packages/schema/src/generator/tsconfig.template.json +0 -17
  190. package/packages/schema/src/generator/types.ts +0 -17
  191. package/packages/schema/src/generator/utils.ts +0 -9
  192. package/packages/schema/src/language-server/generated/ast.ts +0 -603
  193. package/packages/schema/src/language-server/generated/grammar.ts +0 -2190
  194. package/packages/schema/src/language-server/generated/module.ts +0 -24
  195. package/packages/schema/src/language-server/main.ts +0 -12
  196. package/packages/schema/src/language-server/stdlib.zmodel +0 -22
  197. package/packages/schema/src/language-server/types.ts +0 -9
  198. package/packages/schema/src/language-server/zmodel-index.ts +0 -33
  199. package/packages/schema/src/language-server/zmodel-linker.ts +0 -409
  200. package/packages/schema/src/language-server/zmodel-module.ts +0 -90
  201. package/packages/schema/src/language-server/zmodel-scope.ts +0 -21
  202. package/packages/schema/src/language-server/zmodel-validator.ts +0 -35
  203. package/packages/schema/src/language-server/zmodel.langium +0 -186
  204. package/packages/schema/src/utils/exec-utils.ts +0 -5
  205. package/packages/schema/src/utils/indent-string.ts +0 -6
  206. package/packages/schema/syntaxes/zmodel.json +0 -57
  207. package/packages/schema/syntaxes/zmodel.tmLanguage.json +0 -57
  208. package/packages/schema/tests/generator/expression-writer.test.ts +0 -676
  209. package/packages/schema/tests/generator/prisma-builder.test.ts +0 -138
  210. package/packages/schema/tests/schema/parser.test.ts +0 -423
  211. package/packages/schema/tests/schema/sample-todo.test.ts +0 -14
  212. package/packages/schema/tests/utils.ts +0 -38
  213. package/packages/schema/tsconfig.json +0 -23
  214. package/pnpm-workspace.yaml +0 -3
  215. package/samples/todo/.env +0 -2
  216. package/samples/todo/.eslintrc.json +0 -3
  217. package/samples/todo/.vscode/launch.json +0 -11
  218. package/samples/todo/README.md +0 -34
  219. package/samples/todo/components/AuthGuard.tsx +0 -17
  220. package/samples/todo/components/Avatar.tsx +0 -22
  221. package/samples/todo/components/BreadCrumb.tsx +0 -44
  222. package/samples/todo/components/ManageMembers.tsx +0 -134
  223. package/samples/todo/components/NavBar.tsx +0 -57
  224. package/samples/todo/components/SpaceMembers.tsx +0 -76
  225. package/samples/todo/components/Spaces.tsx +0 -28
  226. package/samples/todo/components/TimeInfo.tsx +0 -17
  227. package/samples/todo/components/Todo.tsx +0 -72
  228. package/samples/todo/components/TodoList.tsx +0 -77
  229. package/samples/todo/lib/context.ts +0 -31
  230. package/samples/todo/next.config.js +0 -10
  231. package/samples/todo/package-lock.json +0 -7527
  232. package/samples/todo/package.json +0 -45
  233. package/samples/todo/pages/_app.tsx +0 -50
  234. package/samples/todo/pages/api/auth/[...nextauth].ts +0 -83
  235. package/samples/todo/pages/api/zenstack/[...path].ts +0 -16
  236. package/samples/todo/pages/create-space.tsx +0 -114
  237. package/samples/todo/pages/index.tsx +0 -32
  238. package/samples/todo/pages/space/[slug]/[listId]/index.tsx +0 -88
  239. package/samples/todo/pages/space/[slug]/index.tsx +0 -169
  240. package/samples/todo/postcss.config.js +0 -6
  241. package/samples/todo/public/avatar.jpg +0 -0
  242. package/samples/todo/public/favicon.ico +0 -0
  243. package/samples/todo/public/logo.png +0 -0
  244. package/samples/todo/public/vercel.svg +0 -4
  245. package/samples/todo/styles/globals.css +0 -7
  246. package/samples/todo/tailwind.config.js +0 -11
  247. package/samples/todo/tsconfig.json +0 -28
  248. package/samples/todo/types/next-auth.d.ts +0 -14
  249. package/samples/todo/types/next.d.ts +0 -16
  250. package/samples/todo/zenstack/migrations/20221014084317_init/migration.sql +0 -153
  251. package/samples/todo/zenstack/migrations/20221020094651_upate_cli/migration.sql +0 -23
  252. package/samples/todo/zenstack/migrations/migration_lock.toml +0 -3
  253. package/samples/todo/zenstack/schema.prisma +0 -126
  254. package/samples/todo/zenstack/schema.zmodel +0 -161
  255. package/tests/integration/jest.config.ts +0 -16
  256. package/tests/integration/package-lock.json +0 -1081
  257. package/tests/integration/package.json +0 -27
  258. package/tests/integration/tests/operation-coverate.test.ts +0 -563
  259. package/tests/integration/tests/operations.zmodel +0 -69
  260. package/tests/integration/tests/todo-e2e.test.ts +0 -577
  261. package/tests/integration/tests/todo.zmodel +0 -123
  262. package/tests/integration/tests/tsconfig.template.json +0 -10
  263. package/tests/integration/tests/utils.ts +0 -133
  264. package/tests/integration/tsconfig.json +0 -10
@@ -1,24 +0,0 @@
1
- /******************************************************************************
2
- * This file was generated by langium-cli 0.4.0.
3
- * DO NOT EDIT MANUALLY!
4
- ******************************************************************************/
5
-
6
- import { LangiumGeneratedServices, LangiumGeneratedSharedServices, LangiumSharedServices, LangiumServices, LanguageMetaData, Module } from 'langium';
7
- import { ZModelAstReflection } from './ast';
8
- import { ZModelGrammar } from './grammar';
9
-
10
- export const ZModelLanguageMetaData: LanguageMetaData = {
11
- languageId: 'zmodel',
12
- fileExtensions: ['.zmodel'],
13
- caseInsensitive: false
14
- };
15
-
16
- export const ZModelGeneratedSharedModule: Module<LangiumSharedServices, LangiumGeneratedSharedServices> = {
17
- AstReflection: () => new ZModelAstReflection()
18
- };
19
-
20
- export const ZModelGeneratedModule: Module<LangiumServices, LangiumGeneratedServices> = {
21
- Grammar: () => ZModelGrammar(),
22
- LanguageMetaData: () => ZModelLanguageMetaData,
23
- parser: {}
24
- };
@@ -1,12 +0,0 @@
1
- import { startLanguageServer } from 'langium';
2
- import { createConnection, ProposedFeatures } from 'vscode-languageserver/node';
3
- import { createZModelServices } from './zmodel-module';
4
-
5
- // Create a connection to the client
6
- const connection = createConnection(ProposedFeatures.all);
7
-
8
- // Inject the shared services and language-specific services
9
- const { shared } = createZModelServices({ connection });
10
-
11
- // Start the language server with the shared services
12
- startLanguageServer(shared);
@@ -1,22 +0,0 @@
1
- enum ReferentialIntegrity {
2
- Cascade
3
- }
4
-
5
- function env() String {}
6
- function auth() User {}
7
- function now() DateTime {}
8
- function uuid() String {}
9
- function cuid() String {}
10
- function autoincrement() Int {}
11
-
12
- attribute id()
13
- attribute index()
14
- attribute relation()
15
- attribute default()
16
- attribute updatedAt()
17
- attribute unique()
18
- attribute allow()
19
- attribute deny()
20
- attribute email()
21
- attribute url()
22
- attribute length()
@@ -1,9 +0,0 @@
1
- import { AstNode } from 'langium';
2
- import { AbstractDeclaration } from './generated/ast';
3
-
4
- export type TypedNode = AstNode & {
5
- $resolvedType?: {
6
- decl?: string | AbstractDeclaration;
7
- array?: boolean;
8
- };
9
- };
@@ -1,33 +0,0 @@
1
- import {
2
- AstNodeDescription,
3
- DefaultAstNodeDescriptionProvider,
4
- interruptAndCheck,
5
- LangiumDocument,
6
- LangiumServices,
7
- streamAllContents,
8
- } from 'langium';
9
- import { CancellationToken } from 'vscode-languageserver';
10
- import { isEnumField } from './generated/ast';
11
-
12
- export class ZModelDescriptionProvider extends DefaultAstNodeDescriptionProvider {
13
- constructor(services: LangiumServices) {
14
- super(services);
15
- }
16
-
17
- async createDescriptions(
18
- document: LangiumDocument,
19
- cancelToken = CancellationToken.None
20
- ): Promise<AstNodeDescription[]> {
21
- const descr = await super.createDescriptions(document, cancelToken);
22
- // add enum fields so they can be globally resolved across modules
23
- for (const node of streamAllContents(document.parseResult.value)) {
24
- await interruptAndCheck(cancelToken);
25
- if (isEnumField(node)) {
26
- await descr.push(
27
- this.createDescription(node, node.name, document)
28
- );
29
- }
30
- }
31
- return descr;
32
- }
33
- }
@@ -1,409 +0,0 @@
1
- import {
2
- AstNode,
3
- AstNodeDescription,
4
- AstNodeDescriptionProvider,
5
- DefaultLinker,
6
- DocumentState,
7
- interruptAndCheck,
8
- isReference,
9
- LangiumDocument,
10
- LangiumServices,
11
- LinkingError,
12
- Reference,
13
- streamContents,
14
- } from 'langium';
15
- import { CancellationToken } from 'vscode-jsonrpc';
16
- import {
17
- AbstractDeclaration,
18
- isDataModel,
19
- Function,
20
- FunctionParamType,
21
- DataModelFieldType,
22
- ReferenceTarget,
23
- MemberAccessExpr,
24
- DataModel,
25
- LiteralExpr,
26
- InvocationExpr,
27
- ArrayExpr,
28
- ReferenceExpr,
29
- UnaryExpr,
30
- BinaryExpr,
31
- EnumField,
32
- DataModelField,
33
- FunctionParam,
34
- ThisExpr,
35
- NullExpr,
36
- } from './generated/ast';
37
- import { TypedNode } from './types';
38
-
39
- interface DefaultReference extends Reference {
40
- _ref?: AstNode | LinkingError;
41
- _nodeDescription?: AstNodeDescription;
42
- }
43
-
44
- type ScopeProvider = (name: string) => ReferenceTarget | undefined;
45
-
46
- export class ZModelLinker extends DefaultLinker {
47
- private readonly descriptions: AstNodeDescriptionProvider;
48
-
49
- constructor(services: LangiumServices) {
50
- super(services);
51
- this.descriptions = services.workspace.AstNodeDescriptionProvider;
52
- }
53
-
54
- async link(
55
- document: LangiumDocument,
56
- cancelToken = CancellationToken.None
57
- ): Promise<void> {
58
- if (
59
- document.parseResult.lexerErrors?.length > 0 ||
60
- document.parseResult.parserErrors?.length > 0
61
- ) {
62
- return;
63
- }
64
-
65
- for (const node of streamContents(document.parseResult.value)) {
66
- await interruptAndCheck(cancelToken);
67
- this.resolve(node, document);
68
- }
69
- document.state = DocumentState.Linked;
70
- }
71
-
72
- linkReference(
73
- container: AstNode,
74
- property: string,
75
- document: LangiumDocument,
76
- extraScopes: ScopeProvider[]
77
- ) {
78
- if (
79
- !this.resolveFromScopeProviders(
80
- container,
81
- property,
82
- document,
83
- extraScopes
84
- )
85
- ) {
86
- const reference: Reference<AstNode> = (container as any)[property];
87
- this.doLink({ reference, container, property }, document);
88
- }
89
- }
90
-
91
- resolveFromScopeProviders(
92
- node: AstNode,
93
- property: string,
94
- document: LangiumDocument,
95
- providers: ScopeProvider[]
96
- ) {
97
- const reference: DefaultReference = (node as any)[property];
98
- for (const provider of providers) {
99
- const target = provider(reference.$refText);
100
- if (target) {
101
- reference._ref = target;
102
- reference._nodeDescription =
103
- this.descriptions.createDescription(
104
- target,
105
- target.name,
106
- document
107
- );
108
- return target;
109
- }
110
- }
111
- return null;
112
- }
113
-
114
- resolve(
115
- node: AstNode,
116
- document: LangiumDocument,
117
- extraScopes: ScopeProvider[] = []
118
- ) {
119
- switch (node.$type) {
120
- case LiteralExpr:
121
- this.resolveLiteral(node as LiteralExpr);
122
- break;
123
-
124
- case InvocationExpr:
125
- this.resolveInvocation(
126
- node as InvocationExpr,
127
- document,
128
- extraScopes
129
- );
130
- break;
131
-
132
- case ArrayExpr:
133
- this.resolveArray(node as ArrayExpr, document, extraScopes);
134
- break;
135
-
136
- case ReferenceExpr:
137
- this.resolveReference(
138
- node as ReferenceExpr,
139
- document,
140
- extraScopes
141
- );
142
- break;
143
-
144
- case MemberAccessExpr:
145
- this.resolveMemberAccess(
146
- node as MemberAccessExpr,
147
- document,
148
- extraScopes
149
- );
150
- break;
151
-
152
- case UnaryExpr:
153
- this.resolveUnary(node as UnaryExpr, document, extraScopes);
154
- break;
155
-
156
- case BinaryExpr:
157
- this.resolveBinary(node as BinaryExpr, document, extraScopes);
158
- break;
159
-
160
- case ThisExpr:
161
- this.resolveThis(node as ThisExpr, document, extraScopes);
162
- break;
163
-
164
- case NullExpr:
165
- this.resolveNull(node as NullExpr, document, extraScopes);
166
- break;
167
-
168
- default:
169
- this.resolveDefault(node, document, extraScopes);
170
- break;
171
- }
172
- }
173
-
174
- resolveBinary(
175
- node: BinaryExpr,
176
- document: LangiumDocument<AstNode>,
177
- extraScopes: ScopeProvider[]
178
- ) {
179
- switch (node.operator) {
180
- // TODO: support arithmetics?
181
- // case '+':
182
- // case '-':
183
- // case '*':
184
- // case '/':
185
- // this.resolve(node.left, document, extraScopes);
186
- // this.resolve(node.right, document, extraScopes);
187
- // this.resolveToBuiltinTypeOrDecl(node, 'Int');
188
- // break;
189
-
190
- case '>':
191
- case '>=':
192
- case '<':
193
- case '<=':
194
- case '==':
195
- case '!=':
196
- case '&&':
197
- case '||':
198
- this.resolve(node.left, document, extraScopes);
199
- this.resolve(node.right, document, extraScopes);
200
- this.resolveToBuiltinTypeOrDecl(node, 'Boolean');
201
- break;
202
-
203
- case '?':
204
- case '!':
205
- case '^':
206
- this.resolveCollectionPredicate(node, document, extraScopes);
207
- break;
208
-
209
- default:
210
- throw Error(`Unsupported binary operator: ${node.operator}`);
211
- }
212
- }
213
-
214
- resolveUnary(
215
- node: UnaryExpr,
216
- document: LangiumDocument<AstNode>,
217
- extraScopes: ScopeProvider[]
218
- ) {
219
- this.resolve(node.operand, document, extraScopes);
220
- (node as TypedNode).$resolvedType = (
221
- node.operand as TypedNode
222
- ).$resolvedType;
223
- }
224
-
225
- resolveReference(
226
- node: ReferenceExpr,
227
- document: LangiumDocument<AstNode>,
228
- extraScopes: ScopeProvider[]
229
- ) {
230
- this.linkReference(node, 'target', document, extraScopes);
231
- node.args.forEach((arg) => this.resolve(arg, document, extraScopes));
232
-
233
- if (node.target.ref) {
234
- // resolve type
235
- if (node.target.ref.$type === EnumField) {
236
- this.resolveToBuiltinTypeOrDecl(
237
- node,
238
- node.target.ref.$container
239
- );
240
- } else {
241
- this.resolveToDeclaredType(
242
- node,
243
- (node.target.ref as DataModelField | FunctionParam).type
244
- );
245
- }
246
- }
247
- }
248
-
249
- resolveArray(
250
- node: ArrayExpr,
251
- document: LangiumDocument<AstNode>,
252
- extraScopes: ScopeProvider[]
253
- ) {
254
- node.items.forEach((item) => this.resolve(item, document, extraScopes));
255
-
256
- const itemType = (node.items[0] as TypedNode).$resolvedType;
257
- if (itemType?.decl) {
258
- this.resolveToBuiltinTypeOrDecl(node, itemType.decl, true);
259
- }
260
- }
261
-
262
- resolveInvocation(
263
- node: InvocationExpr,
264
- document: LangiumDocument,
265
- extraScopes: ScopeProvider[]
266
- ) {
267
- this.linkReference(node, 'function', document, extraScopes);
268
- node.args.forEach((arg) => this.resolve(arg, document, extraScopes));
269
- const funcDecl = node.function.ref as Function;
270
- this.resolveToDeclaredType(node, funcDecl.returnType);
271
- }
272
-
273
- resolveLiteral(node: LiteralExpr) {
274
- const type =
275
- typeof node.value === 'string'
276
- ? 'String'
277
- : typeof node.value === 'boolean'
278
- ? 'Boolean'
279
- : typeof node.value === 'number'
280
- ? 'Int'
281
- : undefined;
282
-
283
- if (type) {
284
- this.resolveToBuiltinTypeOrDecl(node, type);
285
- }
286
- }
287
-
288
- resolveMemberAccess(
289
- node: MemberAccessExpr,
290
- document: LangiumDocument<AstNode>,
291
- extraScopes: ScopeProvider[]
292
- ) {
293
- this.resolve(node.operand, document, extraScopes);
294
- const operandResolved = (node.operand as TypedNode).$resolvedType;
295
-
296
- if (
297
- operandResolved &&
298
- !operandResolved.array &&
299
- isDataModel(operandResolved.decl)
300
- ) {
301
- const modelDecl = operandResolved.decl as DataModel;
302
- const provider = (name: string) =>
303
- modelDecl.fields.find((f) => f.name === name);
304
- extraScopes = [provider, ...extraScopes];
305
- }
306
-
307
- this.linkReference(node, 'member', document, extraScopes);
308
- if (node.member.ref) {
309
- this.resolveToDeclaredType(node, node.member.ref.type);
310
- }
311
- }
312
-
313
- resolveCollectionPredicate(
314
- node: BinaryExpr,
315
- document: LangiumDocument,
316
- extraScopes: ScopeProvider[]
317
- ) {
318
- this.resolve(node.left, document, extraScopes);
319
-
320
- const resolvedType = this.getResolvedType(node.left);
321
- if (
322
- resolvedType &&
323
- isDataModel(resolvedType.decl) &&
324
- resolvedType.array
325
- ) {
326
- const dataModelDecl = resolvedType.decl;
327
- const provider = (name: string) =>
328
- dataModelDecl.fields.find((f) => f.name === name);
329
- extraScopes = [provider, ...extraScopes];
330
- this.resolve(node.right, document, extraScopes);
331
- this.resolveToBuiltinTypeOrDecl(node, 'Boolean');
332
- } else {
333
- // TODO: how to attach type-checking error?
334
- throw new Error(`Unresolved collection predicate`);
335
- }
336
- }
337
-
338
- resolveThis(
339
- node: ThisExpr,
340
- document: LangiumDocument<AstNode>,
341
- extraScopes: ScopeProvider[]
342
- ) {
343
- let decl: AstNode | undefined = node.$container;
344
-
345
- while (decl && !isDataModel(decl)) {
346
- decl = decl.$container;
347
- }
348
-
349
- if (decl) {
350
- this.resolveToBuiltinTypeOrDecl(node, decl);
351
- }
352
- }
353
-
354
- resolveNull(
355
- node: NullExpr,
356
- document: LangiumDocument<AstNode>,
357
- extraScopes: ScopeProvider[]
358
- ) {
359
- // TODO: how to really resolve null?
360
- this.resolveToBuiltinTypeOrDecl(node, 'Null');
361
- }
362
-
363
- resolveDefault(
364
- node: AstNode,
365
- document: LangiumDocument<AstNode>,
366
- extraScopes: ScopeProvider[]
367
- ) {
368
- for (const property of Object.keys(node)) {
369
- if (!property.startsWith('$')) {
370
- const value = (node as any)[property];
371
- if (isReference(value)) {
372
- this.linkReference(node, property, document, extraScopes);
373
- }
374
- }
375
- }
376
- for (const child of streamContents(node)) {
377
- this.resolve(child, document, extraScopes);
378
- }
379
- }
380
-
381
- // utils
382
-
383
- getResolvedType(node: AstNode) {
384
- return (node as TypedNode).$resolvedType;
385
- }
386
-
387
- resolveToDeclaredType(
388
- node: AstNode,
389
- type: FunctionParamType | DataModelFieldType
390
- ) {
391
- const _node: TypedNode = node;
392
- if (type.type) {
393
- _node.$resolvedType = { decl: type.type, array: type.array };
394
- } else if (type.reference) {
395
- _node.$resolvedType = {
396
- decl: type.reference.ref,
397
- array: type.array,
398
- };
399
- }
400
- }
401
-
402
- resolveToBuiltinTypeOrDecl(
403
- node: AstNode,
404
- type: string | AbstractDeclaration,
405
- array = false
406
- ) {
407
- (node as TypedNode).$resolvedType = { decl: type, array };
408
- }
409
- }
@@ -1,90 +0,0 @@
1
- import {
2
- createDefaultModule,
3
- createDefaultSharedModule,
4
- DefaultSharedModuleContext,
5
- inject,
6
- LangiumServices,
7
- LangiumSharedServices,
8
- Module,
9
- PartialLangiumServices,
10
- } from 'langium';
11
- import {
12
- ZModelGeneratedModule,
13
- ZModelGeneratedSharedModule,
14
- } from './generated/module';
15
- import { ZModelDescriptionProvider } from './zmodel-index';
16
- import { ZModelLinker } from './zmodel-linker';
17
- import { ZModelScopeComputation } from './zmodel-scope';
18
- import { ZModelValidationRegistry, ZModelValidator } from './zmodel-validator';
19
-
20
- /**
21
- * Declaration of custom services - add your own service classes here.
22
- */
23
- export type ZModelAddedServices = {
24
- validation: {
25
- ZModelValidator: ZModelValidator;
26
- };
27
- };
28
-
29
- /**
30
- * Union of Langium default services and your custom services - use this as constructor parameter
31
- * of custom service classes.
32
- */
33
- export type ZModelServices = LangiumServices & ZModelAddedServices;
34
-
35
- /**
36
- * Dependency injection module that overrides Langium default services and contributes the
37
- * declared custom services. The Langium defaults can be partially specified to override only
38
- * selected services, while the custom services must be fully specified.
39
- */
40
- export const ZModelModule: Module<
41
- ZModelServices,
42
- PartialLangiumServices & ZModelAddedServices
43
- > = {
44
- references: {
45
- ScopeComputation: (services) => new ZModelScopeComputation(services),
46
- Linker: (services) => new ZModelLinker(services),
47
- // NameProvider: () => new ZModelNameProvider(),
48
- },
49
- validation: {
50
- ValidationRegistry: (services) =>
51
- new ZModelValidationRegistry(services),
52
- ZModelValidator: () => new ZModelValidator(),
53
- },
54
- workspace: {
55
- AstNodeDescriptionProvider: (services) =>
56
- new ZModelDescriptionProvider(services),
57
- },
58
- };
59
-
60
- /**
61
- * Create the full set of services required by Langium.
62
- *
63
- * First inject the shared services by merging two modules:
64
- * - Langium default shared services
65
- * - Services generated by langium-cli
66
- *
67
- * Then inject the language-specific services by merging three modules:
68
- * - Langium default language-specific services
69
- * - Services generated by langium-cli
70
- * - Services specified in this file
71
- *
72
- * @param context Optional module context with the LSP connection
73
- * @returns An object wrapping the shared services and the language-specific services
74
- */
75
- export function createZModelServices(context?: DefaultSharedModuleContext): {
76
- shared: LangiumSharedServices;
77
- ZModel: ZModelServices;
78
- } {
79
- const shared = inject(
80
- createDefaultSharedModule(context),
81
- ZModelGeneratedSharedModule
82
- );
83
- const ZModel = inject(
84
- createDefaultModule({ shared }),
85
- ZModelGeneratedModule,
86
- ZModelModule
87
- );
88
- shared.ServiceRegistry.register(ZModel);
89
- return { shared, ZModel };
90
- }
@@ -1,21 +0,0 @@
1
- import {
2
- DefaultScopeComputation,
3
- LangiumDocument,
4
- LangiumServices,
5
- PrecomputedScopes,
6
- } from 'langium';
7
- import { CancellationToken } from 'vscode-jsonrpc';
8
-
9
- export class ZModelScopeComputation extends DefaultScopeComputation {
10
- constructor(services: LangiumServices) {
11
- super(services);
12
- }
13
-
14
- async computeScope(
15
- document: LangiumDocument,
16
- cancelToken = CancellationToken.None
17
- ): Promise<PrecomputedScopes> {
18
- // Dummy for now
19
- return super.computeScope(document, cancelToken);
20
- }
21
- }
@@ -1,35 +0,0 @@
1
- import {
2
- // ValidationAcceptor,
3
- ValidationChecks,
4
- ValidationRegistry,
5
- } from 'langium';
6
- import { ZModelAstType } from './generated/ast';
7
- import type { ZModelServices } from './zmodel-module';
8
-
9
- /**
10
- * Registry for validation checks.
11
- */
12
- export class ZModelValidationRegistry extends ValidationRegistry {
13
- constructor(services: ZModelServices) {
14
- super(services);
15
- const validator = services.validation.ZModelValidator;
16
- const checks: ValidationChecks<ZModelAstType> = {
17
- // Person: validator.checkPersonStartsWithCapital
18
- };
19
- this.register(checks, validator);
20
- }
21
- }
22
-
23
- /**
24
- * Implementation of custom validations.
25
- */
26
- export class ZModelValidator {
27
- // checkPersonStartsWithCapital(person: Person, accept: ValidationAcceptor): void {
28
- // if (person.name) {
29
- // const firstChar = person.name.substring(0, 1);
30
- // if (firstChar.toUpperCase() !== firstChar) {
31
- // accept('warning', 'Person name should start with a capital.', { node: person, property: 'name' });
32
- // }
33
- // }
34
- // }
35
- }