zenstack 1.0.0 → 1.0.1

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 (300) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +194 -1
  3. package/bin/cli +3 -0
  4. package/bin/post-install.js +24 -0
  5. package/cli/actions/generate.d.ts +13 -0
  6. package/cli/actions/generate.js +71 -0
  7. package/cli/actions/generate.js.map +1 -0
  8. package/cli/actions/index.d.ts +3 -0
  9. package/cli/actions/index.js +20 -0
  10. package/cli/actions/index.js.map +1 -0
  11. package/cli/actions/info.d.ts +4 -0
  12. package/cli/actions/info.js +63 -0
  13. package/cli/actions/info.js.map +1 -0
  14. package/cli/actions/init.d.ts +12 -0
  15. package/cli/actions/init.js +83 -0
  16. package/cli/actions/init.js.map +1 -0
  17. package/cli/cli-error.d.ts +5 -0
  18. package/cli/cli-error.js +10 -0
  19. package/cli/cli-error.js.map +1 -0
  20. package/cli/cli-util.d.ts +21 -0
  21. package/cli/cli-util.js +211 -0
  22. package/cli/cli-util.js.map +1 -0
  23. package/cli/config.d.ts +10 -0
  24. package/cli/config.js +62 -0
  25. package/cli/config.js.map +1 -0
  26. package/cli/index.d.ts +7 -0
  27. package/cli/index.js +128 -0
  28. package/cli/index.js.map +1 -0
  29. package/cli/plugin-runner.d.ts +24 -0
  30. package/cli/plugin-runner.js +229 -0
  31. package/cli/plugin-runner.js.map +1 -0
  32. package/constants.d.ts +1 -0
  33. package/constants.js +6 -0
  34. package/constants.js.map +1 -0
  35. package/language-server/constants.d.ts +22 -0
  36. package/language-server/constants.js +27 -0
  37. package/language-server/constants.js.map +1 -0
  38. package/language-server/main.d.ts +1 -0
  39. package/language-server/main.js +13 -0
  40. package/language-server/main.js.map +1 -0
  41. package/language-server/types.d.ts +10 -0
  42. package/language-server/types.js +3 -0
  43. package/language-server/types.js.map +1 -0
  44. package/language-server/utils.d.ts +5 -0
  45. package/language-server/utils.js +22 -0
  46. package/language-server/utils.js.map +1 -0
  47. package/language-server/validator/attribute-application-validator.d.ts +15 -0
  48. package/language-server/validator/attribute-application-validator.js +246 -0
  49. package/language-server/validator/attribute-application-validator.js.map +1 -0
  50. package/language-server/validator/attribute-validator.d.ts +9 -0
  51. package/language-server/validator/attribute-validator.js +14 -0
  52. package/language-server/validator/attribute-validator.js.map +1 -0
  53. package/language-server/validator/datamodel-validator.d.ts +22 -0
  54. package/language-server/validator/datamodel-validator.js +329 -0
  55. package/language-server/validator/datamodel-validator.js.map +1 -0
  56. package/language-server/validator/datasource-validator.d.ts +12 -0
  57. package/language-server/validator/datasource-validator.js +66 -0
  58. package/language-server/validator/datasource-validator.js.map +1 -0
  59. package/language-server/validator/enum-validator.d.ts +11 -0
  60. package/language-server/validator/enum-validator.js +25 -0
  61. package/language-server/validator/enum-validator.js.map +1 -0
  62. package/language-server/validator/expression-validator.d.ts +10 -0
  63. package/language-server/validator/expression-validator.js +135 -0
  64. package/language-server/validator/expression-validator.js.map +1 -0
  65. package/language-server/validator/function-decl-validator.d.ts +9 -0
  66. package/language-server/validator/function-decl-validator.js +13 -0
  67. package/language-server/validator/function-decl-validator.js.map +1 -0
  68. package/language-server/validator/function-invocation-validator.d.ts +11 -0
  69. package/language-server/validator/function-invocation-validator.js +135 -0
  70. package/language-server/validator/function-invocation-validator.js.map +1 -0
  71. package/language-server/validator/schema-validator.d.ts +13 -0
  72. package/language-server/validator/schema-validator.js +49 -0
  73. package/language-server/validator/schema-validator.js.map +1 -0
  74. package/language-server/validator/utils.d.ts +24 -0
  75. package/language-server/validator/utils.js +154 -0
  76. package/language-server/validator/utils.js.map +1 -0
  77. package/language-server/validator/zmodel-validator.d.ts +25 -0
  78. package/language-server/validator/zmodel-validator.js +83 -0
  79. package/language-server/validator/zmodel-validator.js.map +1 -0
  80. package/language-server/zmodel-code-action.d.ts +15 -0
  81. package/language-server/zmodel-code-action.js +118 -0
  82. package/language-server/zmodel-code-action.js.map +1 -0
  83. package/language-server/zmodel-definition.d.ts +7 -0
  84. package/language-server/zmodel-definition.js +31 -0
  85. package/language-server/zmodel-definition.js.map +1 -0
  86. package/language-server/zmodel-formatter.d.ts +9 -0
  87. package/language-server/zmodel-formatter.js +76 -0
  88. package/language-server/zmodel-formatter.js.map +1 -0
  89. package/language-server/zmodel-linker.d.ts +32 -0
  90. package/language-server/zmodel-linker.js +447 -0
  91. package/language-server/zmodel-linker.js.map +1 -0
  92. package/language-server/zmodel-module.d.ts +41 -0
  93. package/language-server/zmodel-module.js +83 -0
  94. package/language-server/zmodel-module.js.map +1 -0
  95. package/language-server/zmodel-scope.d.ts +16 -0
  96. package/language-server/zmodel-scope.js +100 -0
  97. package/language-server/zmodel-scope.js.map +1 -0
  98. package/language-server/zmodel-workspace-manager.d.ts +12 -0
  99. package/language-server/zmodel-workspace-manager.js +138 -0
  100. package/language-server/zmodel-workspace-manager.js.map +1 -0
  101. package/package.json +140 -8
  102. package/plugins/access-policy/expression-writer.d.ts +46 -0
  103. package/plugins/access-policy/expression-writer.js +580 -0
  104. package/plugins/access-policy/expression-writer.js.map +1 -0
  105. package/plugins/access-policy/index.d.ts +4 -0
  106. package/plugins/access-policy/index.js +22 -0
  107. package/plugins/access-policy/index.js.map +1 -0
  108. package/plugins/access-policy/policy-guard-generator.d.ts +22 -0
  109. package/plugins/access-policy/policy-guard-generator.js +634 -0
  110. package/plugins/access-policy/policy-guard-generator.js.map +1 -0
  111. package/plugins/model-meta/index.d.ts +4 -0
  112. package/plugins/model-meta/index.js +232 -0
  113. package/plugins/model-meta/index.js.map +1 -0
  114. package/plugins/plugin-utils.d.ts +17 -0
  115. package/plugins/plugin-utils.js +80 -0
  116. package/plugins/plugin-utils.js.map +1 -0
  117. package/plugins/prisma/indent-string.d.ts +4 -0
  118. package/plugins/prisma/indent-string.js +12 -0
  119. package/plugins/prisma/indent-string.js.map +1 -0
  120. package/plugins/prisma/index.d.ts +4 -0
  121. package/plugins/prisma/index.js +22 -0
  122. package/plugins/prisma/index.js.map +1 -0
  123. package/plugins/prisma/prisma-builder.d.ts +145 -0
  124. package/plugins/prisma/prisma-builder.js +358 -0
  125. package/plugins/prisma/prisma-builder.js.map +1 -0
  126. package/plugins/prisma/schema-generator.d.ts +29 -0
  127. package/plugins/prisma/schema-generator.js +336 -0
  128. package/plugins/prisma/schema-generator.js.map +1 -0
  129. package/plugins/prisma/zmodel-code-generator.d.ts +30 -0
  130. package/plugins/prisma/zmodel-code-generator.js +124 -0
  131. package/plugins/prisma/zmodel-code-generator.js.map +1 -0
  132. package/plugins/zod/generator.d.ts +4 -0
  133. package/plugins/zod/generator.js +254 -0
  134. package/plugins/zod/generator.js.map +1 -0
  135. package/plugins/zod/index.d.ts +4 -0
  136. package/plugins/zod/index.js +24 -0
  137. package/plugins/zod/index.js.map +1 -0
  138. package/plugins/zod/transformer.d.ts +68 -0
  139. package/plugins/zod/transformer.js +554 -0
  140. package/plugins/zod/transformer.js.map +1 -0
  141. package/plugins/zod/types.d.ts +25 -0
  142. package/plugins/zod/types.js +3 -0
  143. package/plugins/zod/types.js.map +1 -0
  144. package/plugins/zod/utils/removeDir.d.ts +1 -0
  145. package/plugins/zod/utils/removeDir.js +30 -0
  146. package/plugins/zod/utils/removeDir.js.map +1 -0
  147. package/plugins/zod/utils/schema-gen.d.ts +3 -0
  148. package/plugins/zod/utils/schema-gen.js +188 -0
  149. package/plugins/zod/utils/schema-gen.js.map +1 -0
  150. package/res/prism-zmodel.js +20 -0
  151. package/res/starter.zmodel +51 -0
  152. package/res/stdlib.zmodel +506 -0
  153. package/telemetry.d.ts +21 -0
  154. package/telemetry.js +129 -0
  155. package/telemetry.js.map +1 -0
  156. package/utils/ast-utils.d.ts +13 -0
  157. package/utils/ast-utils.js +136 -0
  158. package/utils/ast-utils.js.map +1 -0
  159. package/utils/exec-utils.d.ts +6 -0
  160. package/utils/exec-utils.js +13 -0
  161. package/utils/exec-utils.js.map +1 -0
  162. package/utils/pkg-utils.d.ts +3 -0
  163. package/utils/pkg-utils.js +64 -0
  164. package/utils/pkg-utils.js.map +1 -0
  165. package/utils/typescript-expression-transformer.d.ts +54 -0
  166. package/utils/typescript-expression-transformer.js +326 -0
  167. package/utils/typescript-expression-transformer.js.map +1 -0
  168. package/utils/version-utils.d.ts +1 -0
  169. package/utils/version-utils.js +20 -0
  170. package/utils/version-utils.js.map +1 -0
  171. package/.vscode/extensions.json +0 -7
  172. package/.vscode/launch.json +0 -49
  173. package/.vscode/settings.json +0 -4
  174. package/packages/internal/jest.config.ts +0 -32
  175. package/packages/internal/package.json +0 -42
  176. package/packages/internal/src/constants.ts +0 -1
  177. package/packages/internal/src/handler/data/guard-utils.ts +0 -7
  178. package/packages/internal/src/handler/data/handler.ts +0 -415
  179. package/packages/internal/src/handler/data/query-processor.ts +0 -504
  180. package/packages/internal/src/handler/index.ts +0 -1
  181. package/packages/internal/src/handler/types.ts +0 -20
  182. package/packages/internal/src/index.ts +0 -3
  183. package/packages/internal/src/request-handler.ts +0 -27
  184. package/packages/internal/src/request.ts +0 -101
  185. package/packages/internal/src/types.ts +0 -40
  186. package/packages/internal/tests/query-processor.test.ts +0 -172
  187. package/packages/internal/tsconfig.json +0 -21
  188. package/packages/runtime/auth.d.ts +0 -1
  189. package/packages/runtime/auth.js +0 -3
  190. package/packages/runtime/hooks.d.ts +0 -10
  191. package/packages/runtime/hooks.js +0 -3
  192. package/packages/runtime/index.d.ts +0 -3
  193. package/packages/runtime/index.js +0 -1
  194. package/packages/runtime/package-lock.json +0 -512
  195. package/packages/runtime/package.json +0 -16
  196. package/packages/runtime/server.d.ts +0 -1
  197. package/packages/runtime/server.js +0 -3
  198. package/packages/runtime/types.d.ts +0 -1
  199. package/packages/runtime/types.js +0 -3
  200. package/packages/schema/.eslintrc.json +0 -13
  201. package/packages/schema/.vscodeignore +0 -4
  202. package/packages/schema/asset/logo-dark.png +0 -0
  203. package/packages/schema/asset/logo-light.png +0 -0
  204. package/packages/schema/bin/cli +0 -3
  205. package/packages/schema/jest.config.ts +0 -32
  206. package/packages/schema/langium-config.json +0 -14
  207. package/packages/schema/langium-quickstart.md +0 -41
  208. package/packages/schema/language-configuration.json +0 -30
  209. package/packages/schema/package.json +0 -96
  210. package/packages/schema/src/cli/cli-util.ts +0 -80
  211. package/packages/schema/src/cli/index.ts +0 -64
  212. package/packages/schema/src/extension.ts +0 -76
  213. package/packages/schema/src/generator/constants.ts +0 -5
  214. package/packages/schema/src/generator/index.ts +0 -92
  215. package/packages/schema/src/generator/next-auth/index.ts +0 -197
  216. package/packages/schema/src/generator/package.template.json +0 -9
  217. package/packages/schema/src/generator/prisma/expression-writer.ts +0 -352
  218. package/packages/schema/src/generator/prisma/index.ts +0 -32
  219. package/packages/schema/src/generator/prisma/plain-expression-builder.ts +0 -91
  220. package/packages/schema/src/generator/prisma/prisma-builder.ts +0 -366
  221. package/packages/schema/src/generator/prisma/query-gard-generator.ts +0 -208
  222. package/packages/schema/src/generator/prisma/schema-generator.ts +0 -300
  223. package/packages/schema/src/generator/react-hooks/index.ts +0 -181
  224. package/packages/schema/src/generator/service/index.ts +0 -107
  225. package/packages/schema/src/generator/tsconfig.template.json +0 -17
  226. package/packages/schema/src/generator/types.ts +0 -17
  227. package/packages/schema/src/generator/utils.ts +0 -9
  228. package/packages/schema/src/language-server/generated/ast.ts +0 -603
  229. package/packages/schema/src/language-server/generated/grammar.ts +0 -2190
  230. package/packages/schema/src/language-server/generated/module.ts +0 -24
  231. package/packages/schema/src/language-server/main.ts +0 -12
  232. package/packages/schema/src/language-server/stdlib.zmodel +0 -22
  233. package/packages/schema/src/language-server/types.ts +0 -9
  234. package/packages/schema/src/language-server/zmodel-index.ts +0 -33
  235. package/packages/schema/src/language-server/zmodel-linker.ts +0 -409
  236. package/packages/schema/src/language-server/zmodel-module.ts +0 -90
  237. package/packages/schema/src/language-server/zmodel-scope.ts +0 -21
  238. package/packages/schema/src/language-server/zmodel-validator.ts +0 -35
  239. package/packages/schema/src/language-server/zmodel.langium +0 -186
  240. package/packages/schema/src/utils/exec-utils.ts +0 -5
  241. package/packages/schema/src/utils/indent-string.ts +0 -6
  242. package/packages/schema/syntaxes/zmodel.json +0 -57
  243. package/packages/schema/syntaxes/zmodel.tmLanguage.json +0 -57
  244. package/packages/schema/tests/generator/expression-writer.test.ts +0 -676
  245. package/packages/schema/tests/generator/prisma-builder.test.ts +0 -138
  246. package/packages/schema/tests/schema/parser.test.ts +0 -423
  247. package/packages/schema/tests/schema/sample-todo.test.ts +0 -14
  248. package/packages/schema/tests/utils.ts +0 -38
  249. package/packages/schema/tsconfig.json +0 -23
  250. package/pnpm-workspace.yaml +0 -3
  251. package/samples/todo/.env +0 -2
  252. package/samples/todo/.eslintrc.json +0 -3
  253. package/samples/todo/.vscode/launch.json +0 -11
  254. package/samples/todo/README.md +0 -34
  255. package/samples/todo/components/AuthGuard.tsx +0 -17
  256. package/samples/todo/components/Avatar.tsx +0 -22
  257. package/samples/todo/components/BreadCrumb.tsx +0 -44
  258. package/samples/todo/components/ManageMembers.tsx +0 -134
  259. package/samples/todo/components/NavBar.tsx +0 -57
  260. package/samples/todo/components/SpaceMembers.tsx +0 -76
  261. package/samples/todo/components/Spaces.tsx +0 -28
  262. package/samples/todo/components/TimeInfo.tsx +0 -17
  263. package/samples/todo/components/Todo.tsx +0 -72
  264. package/samples/todo/components/TodoList.tsx +0 -77
  265. package/samples/todo/lib/context.ts +0 -31
  266. package/samples/todo/next.config.js +0 -10
  267. package/samples/todo/package-lock.json +0 -7527
  268. package/samples/todo/package.json +0 -45
  269. package/samples/todo/pages/_app.tsx +0 -50
  270. package/samples/todo/pages/api/auth/[...nextauth].ts +0 -83
  271. package/samples/todo/pages/api/zenstack/[...path].ts +0 -16
  272. package/samples/todo/pages/create-space.tsx +0 -114
  273. package/samples/todo/pages/index.tsx +0 -32
  274. package/samples/todo/pages/space/[slug]/[listId]/index.tsx +0 -88
  275. package/samples/todo/pages/space/[slug]/index.tsx +0 -169
  276. package/samples/todo/postcss.config.js +0 -6
  277. package/samples/todo/public/avatar.jpg +0 -0
  278. package/samples/todo/public/favicon.ico +0 -0
  279. package/samples/todo/public/logo.png +0 -0
  280. package/samples/todo/public/vercel.svg +0 -4
  281. package/samples/todo/styles/globals.css +0 -7
  282. package/samples/todo/tailwind.config.js +0 -11
  283. package/samples/todo/tsconfig.json +0 -28
  284. package/samples/todo/types/next-auth.d.ts +0 -14
  285. package/samples/todo/types/next.d.ts +0 -16
  286. package/samples/todo/zenstack/migrations/20221014084317_init/migration.sql +0 -153
  287. package/samples/todo/zenstack/migrations/20221020094651_upate_cli/migration.sql +0 -23
  288. package/samples/todo/zenstack/migrations/migration_lock.toml +0 -3
  289. package/samples/todo/zenstack/schema.prisma +0 -126
  290. package/samples/todo/zenstack/schema.zmodel +0 -161
  291. package/tests/integration/jest.config.ts +0 -16
  292. package/tests/integration/package-lock.json +0 -1081
  293. package/tests/integration/package.json +0 -27
  294. package/tests/integration/tests/operation-coverate.test.ts +0 -563
  295. package/tests/integration/tests/operations.zmodel +0 -69
  296. package/tests/integration/tests/todo-e2e.test.ts +0 -577
  297. package/tests/integration/tests/todo.zmodel +0 -123
  298. package/tests/integration/tests/tsconfig.template.json +0 -10
  299. package/tests/integration/tests/utils.ts +0 -133
  300. package/tests/integration/tsconfig.json +0 -10
@@ -1,9 +0,0 @@
1
- {
2
- "name": ".zenstack",
3
- "version": "1.0.0",
4
- "description": "ZenStack generated code",
5
- "main": "lib/index.js",
6
- "types": "lib/index.d.ts",
7
- "author": "ZenStack",
8
- "license": "MIT"
9
- }
@@ -1,352 +0,0 @@
1
- import {
2
- BinaryExpr,
3
- Expression,
4
- isDataModel,
5
- isDataModelField,
6
- isEnumField,
7
- isMemberAccessExpr,
8
- isReferenceExpr,
9
- isThisExpr,
10
- LiteralExpr,
11
- MemberAccessExpr,
12
- ReferenceExpr,
13
- UnaryExpr,
14
- } from '@lang/generated/ast';
15
- import { CodeBlockWriter } from 'ts-morph';
16
- import { GeneratorError } from '../types';
17
- import { TypedNode } from '@lang/types';
18
- import PlainExpressionBuilder from './plain-expression-builder';
19
-
20
- const AUX_GUARD_FIELD = 'zenstack_guard';
21
-
22
- type ComparisonOperator = '==' | '!=' | '>' | '>=' | '<' | '<=';
23
-
24
- export default class ExpressionWriter {
25
- private readonly plainExprBuilder = new PlainExpressionBuilder();
26
-
27
- constructor(private readonly writer: CodeBlockWriter) {}
28
-
29
- write(expr: Expression) {
30
- const _write = () => {
31
- switch (expr.$type) {
32
- case LiteralExpr:
33
- this.writeLiteral(expr as LiteralExpr);
34
- break;
35
-
36
- case UnaryExpr:
37
- this.writeUnary(expr as UnaryExpr);
38
- break;
39
-
40
- case BinaryExpr:
41
- this.writeBinary(expr as BinaryExpr);
42
- break;
43
-
44
- case ReferenceExpr:
45
- this.writeReference(expr as ReferenceExpr);
46
- break;
47
-
48
- case MemberAccessExpr:
49
- this.writeMemberAccess(expr as MemberAccessExpr);
50
- break;
51
-
52
- default:
53
- throw new Error(`Not implemented: ${expr.$type}`);
54
- }
55
- };
56
-
57
- this.block(_write);
58
- }
59
-
60
- private writeReference(expr: ReferenceExpr) {
61
- if (isEnumField(expr.target.ref)) {
62
- throw new Error('We should never get here');
63
- } else {
64
- this.writer.write(`${expr.target.ref!.name}: true`);
65
- }
66
- }
67
-
68
- private writeMemberAccess(expr: MemberAccessExpr) {
69
- this.writeFieldCondition(
70
- expr.operand,
71
- () => {
72
- this.block(() => {
73
- this.writer.write(`${expr.member.ref?.name}: true`);
74
- });
75
- },
76
- 'is'
77
- );
78
- }
79
-
80
- private writeExprList(exprs: Expression[]) {
81
- this.writer.writeLine('[');
82
- for (let i = 0; i < exprs.length; i++) {
83
- this.write(exprs[i]);
84
- if (i !== exprs.length - 1) {
85
- this.writer.writeLine(',');
86
- }
87
- }
88
- this.writer.writeLine(']');
89
- }
90
-
91
- private writeBinary(expr: BinaryExpr) {
92
- switch (expr.operator) {
93
- case '&&':
94
- case '||':
95
- this.writeLogical(expr, expr.operator);
96
- break;
97
-
98
- case '==':
99
- case '!=':
100
- case '>':
101
- case '>=':
102
- case '<':
103
- case '<=':
104
- this.writeComparison(expr, expr.operator);
105
- break;
106
-
107
- case '?':
108
- case '!':
109
- case '^':
110
- this.writeCollectionPredicate(expr, expr.operator);
111
- break;
112
- }
113
- }
114
-
115
- private writeCollectionPredicate(expr: BinaryExpr, operator: string) {
116
- this.writeFieldCondition(
117
- expr.left,
118
- () => {
119
- this.write(expr.right);
120
- },
121
- operator === '?' ? 'some' : operator === '!' ? 'every' : 'none'
122
- );
123
- }
124
-
125
- private isFieldAccess(expr: Expression): boolean {
126
- if (isThisExpr(expr)) {
127
- return true;
128
- }
129
- if (isMemberAccessExpr(expr)) {
130
- return this.isFieldAccess(expr.operand);
131
- }
132
- if (isReferenceExpr(expr) && isDataModelField(expr.target.ref)) {
133
- return true;
134
- }
135
- return false;
136
- }
137
-
138
- private guard(write: () => void) {
139
- this.writer.write(`${AUX_GUARD_FIELD}: `);
140
- write();
141
- }
142
-
143
- private plain(expr: Expression) {
144
- this.writer.write(this.plainExprBuilder.build(expr));
145
- }
146
-
147
- private writeComparison(expr: BinaryExpr, operator: ComparisonOperator) {
148
- const leftIsFieldAccess = this.isFieldAccess(expr.left);
149
- const rightIsFieldAccess = this.isFieldAccess(expr.right);
150
-
151
- if (leftIsFieldAccess && rightIsFieldAccess) {
152
- throw new GeneratorError(
153
- `Comparison between fields are not supported yet`
154
- );
155
- }
156
-
157
- if (!leftIsFieldAccess && !rightIsFieldAccess) {
158
- // compile down to a plain expression
159
- this.guard(() => {
160
- this.plain(expr.left);
161
- this.writer.write(' ' + operator + ' ');
162
- this.plain(expr.right);
163
- });
164
-
165
- return;
166
- }
167
-
168
- let fieldAccess: Expression;
169
- let operand: Expression;
170
- if (leftIsFieldAccess) {
171
- fieldAccess = expr.left;
172
- operand = expr.right;
173
- } else {
174
- fieldAccess = expr.right;
175
- operand = expr.left;
176
- operator = this.negateOperator(operator);
177
- }
178
-
179
- this.writeFieldCondition(
180
- fieldAccess,
181
- () => {
182
- this.block(
183
- () => {
184
- if (this.isModelTyped(fieldAccess)) {
185
- // comparing with an object, conver to "id" comparison instead
186
- this.writer.write('id: ');
187
- this.block(() => {
188
- this.writeOperator(operator, () => {
189
- this.plain(operand);
190
- this.writer.write('?.id');
191
- });
192
- });
193
- } else {
194
- this.writeOperator(operator, () => {
195
- this.plain(operand);
196
- });
197
- }
198
- },
199
- // "this" expression is compiled away (to .id access), so we should
200
- // avoid generating a new layer
201
- !isThisExpr(fieldAccess)
202
- );
203
- },
204
- 'is'
205
- );
206
- }
207
-
208
- private writeOperator(
209
- operator: ComparisonOperator,
210
- writeOperand: () => void
211
- ) {
212
- if (operator === '!=') {
213
- // wrap a 'not'
214
- this.writer.write('not: ');
215
- this.block(() => {
216
- this.writeOperator('==', writeOperand);
217
- });
218
- } else {
219
- this.writer.write(`${this.mapOperator(operator)}: `);
220
- writeOperand();
221
- }
222
- }
223
-
224
- private writeFieldCondition(
225
- fieldAccess: Expression,
226
- writeCondition: () => void,
227
- relationOp: 'is' | 'some' | 'every' | 'none'
228
- ) {
229
- let selector: string;
230
- let operand: Expression | undefined;
231
-
232
- if (isThisExpr(fieldAccess)) {
233
- // pass on
234
- writeCondition();
235
- return;
236
- } else if (isReferenceExpr(fieldAccess)) {
237
- selector = fieldAccess.target.ref?.name!;
238
- } else if (isMemberAccessExpr(fieldAccess)) {
239
- selector = fieldAccess.member.ref?.name!;
240
- operand = fieldAccess.operand;
241
- } else {
242
- throw new GeneratorError(
243
- `Unsupported expression type: ${fieldAccess.$type}`
244
- );
245
- }
246
-
247
- if (operand) {
248
- // member access expression
249
- this.writeFieldCondition(
250
- operand,
251
- () => {
252
- this.block(
253
- () => {
254
- this.writer.write(selector + ': ');
255
- if (this.isModelTyped(fieldAccess)) {
256
- // expression is resolved to a model, generate relation query
257
- this.block(() => {
258
- this.writer.write(`${relationOp}: `);
259
- writeCondition();
260
- });
261
- } else {
262
- // generate plain query
263
- writeCondition();
264
- }
265
- },
266
- // if operand is "this", it doesn't really generate a new layer of query,
267
- // so we should avoid generating a new block
268
- !isThisExpr(operand)
269
- );
270
- },
271
- 'is'
272
- );
273
- } else if (this.isModelTyped(fieldAccess)) {
274
- // reference resolved to a model, generate relation query
275
- this.writer.write(selector + ': ');
276
- this.block(() => {
277
- this.writer.write(`${relationOp}: `);
278
- writeCondition();
279
- });
280
- } else {
281
- // generate a plain query
282
- this.writer.write(selector + ': ');
283
- writeCondition();
284
- }
285
- }
286
-
287
- private block(write: () => void, condition = true) {
288
- if (condition) {
289
- this.writer.block(write);
290
- } else {
291
- write();
292
- }
293
- }
294
-
295
- private isModelTyped(expr: Expression) {
296
- return isDataModel((expr as TypedNode).$resolvedType?.decl);
297
- }
298
-
299
- mapOperator(operator: '==' | '!=' | '>' | '>=' | '<' | '<=') {
300
- switch (operator) {
301
- case '==':
302
- return 'equals';
303
- case '!=':
304
- throw new Error('Operation != should have been compiled away');
305
- case '>':
306
- return 'gt';
307
- case '>=':
308
- return 'ge';
309
- case '<':
310
- return 'lt';
311
- case '<=':
312
- return 'le';
313
- }
314
- }
315
-
316
- private negateOperator(operator: '==' | '!=' | '>' | '>=' | '<' | '<=') {
317
- switch (operator) {
318
- case '>':
319
- return '<=';
320
- case '<':
321
- return '>=';
322
- case '>=':
323
- return '<';
324
- case '<=':
325
- return '>';
326
- default:
327
- return operator;
328
- }
329
- }
330
-
331
- private writeLogical(expr: BinaryExpr, operator: '&&' | '||') {
332
- this.writer.writeLine(`${operator === '&&' ? 'AND' : 'OR'}: `);
333
- this.writeExprList([expr.left, expr.right]);
334
- }
335
-
336
- private writeUnary(expr: UnaryExpr) {
337
- if (expr.operator !== '!') {
338
- throw new GeneratorError(
339
- `Unary operator "${expr.operator}" is not supported`
340
- );
341
- }
342
-
343
- this.writer.writeLine('NOT: ');
344
- this.write(expr.operand);
345
- }
346
-
347
- private writeLiteral(expr: LiteralExpr) {
348
- this.guard(() => {
349
- this.plain(expr);
350
- });
351
- }
352
- }
@@ -1,32 +0,0 @@
1
- import colors from 'colors';
2
- import { Context, Generator, GeneratorError } from '../types';
3
- import { execSync } from '../../utils/exec-utils';
4
- import PrismaSchemaGenerator from './schema-generator';
5
- import QueryGuardGenerator from './query-gard-generator';
6
-
7
- export default class PrismaGenerator implements Generator {
8
- async generate(context: Context) {
9
- // generate prisma schema
10
- const schemaFile = await new PrismaSchemaGenerator(context).generate();
11
-
12
- // run prisma generate and install @prisma/client
13
- await this.generatePrismaClient(schemaFile);
14
-
15
- // generate prisma query guard
16
- await new QueryGuardGenerator(context).generate();
17
-
18
- console.log(
19
- colors.blue(` ✔️ Prisma schema and query guard generated`)
20
- );
21
- }
22
-
23
- async generatePrismaClient(schemaFile: string) {
24
- try {
25
- execSync(`npx prisma generate --schema "${schemaFile}"`);
26
- } catch {
27
- throw new GeneratorError(
28
- `Failed to generate client code with Prisma. Check errors above for clues.\nThis normally shouldn't happen. Please file an issue at: http://go.zenstack.dev/bug.`
29
- );
30
- }
31
- }
32
- }
@@ -1,91 +0,0 @@
1
- import { GeneratorError } from '../types';
2
- import {
3
- ArrayExpr,
4
- Expression,
5
- InvocationExpr,
6
- isEnumField,
7
- isThisExpr,
8
- LiteralExpr,
9
- MemberAccessExpr,
10
- NullExpr,
11
- ReferenceExpr,
12
- ThisExpr,
13
- } from '@lang/generated/ast';
14
-
15
- export default class PlainExpressionBuilder {
16
- build(expr: Expression): string {
17
- switch (expr.$type) {
18
- case LiteralExpr:
19
- return this.literal(expr as LiteralExpr);
20
-
21
- case ArrayExpr:
22
- return this.array(expr as ArrayExpr);
23
-
24
- case NullExpr:
25
- return this.null();
26
-
27
- case ThisExpr:
28
- return this.this(expr as ThisExpr);
29
-
30
- case ReferenceExpr:
31
- return this.reference(expr as ReferenceExpr);
32
-
33
- case InvocationExpr:
34
- return this.invocation(expr as InvocationExpr);
35
-
36
- case MemberAccessExpr:
37
- return this.memberAccess(expr as MemberAccessExpr);
38
-
39
- default:
40
- throw new GeneratorError(
41
- `Unsupported expression type: ${expr.$type}`
42
- );
43
- }
44
- }
45
-
46
- private this(expr: ThisExpr) {
47
- // "this" is mapped to id comparison
48
- return 'id';
49
- }
50
-
51
- private memberAccess(expr: MemberAccessExpr) {
52
- if (isThisExpr(expr.operand)) {
53
- return expr.member.ref!.name;
54
- } else {
55
- return `${this.build(expr.operand)}?.${expr.member.ref!.name}`;
56
- }
57
- }
58
-
59
- private invocation(expr: InvocationExpr) {
60
- if (expr.function.ref?.name !== 'auth') {
61
- throw new GeneratorError(
62
- `Function invocation is not supported: ${expr.function.ref?.name}`
63
- );
64
- }
65
- return 'user';
66
- }
67
-
68
- private reference(expr: ReferenceExpr) {
69
- if (isEnumField(expr.target.ref)) {
70
- return `${expr.target.ref.$container.name}.${expr.target.ref.name}`;
71
- } else {
72
- return expr.target.ref!.name;
73
- }
74
- }
75
-
76
- private null() {
77
- return 'null';
78
- }
79
-
80
- private array(expr: ArrayExpr) {
81
- return `[${expr.items.map((item) => this.build(item)).join(', ')}]`;
82
- }
83
-
84
- private literal(expr: LiteralExpr) {
85
- if (typeof expr.value === 'string') {
86
- return `'${expr.value}'`;
87
- } else {
88
- return expr.value.toString();
89
- }
90
- }
91
- }