zenstack 0.1.42 → 1.0.0

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 (215) hide show
  1. package/.vscode/extensions.json +7 -0
  2. package/.vscode/launch.json +49 -0
  3. package/.vscode/settings.json +4 -0
  4. package/README.md +1 -0
  5. package/package.json +8 -90
  6. package/packages/internal/jest.config.ts +32 -0
  7. package/packages/internal/package.json +42 -0
  8. package/packages/internal/src/constants.ts +1 -0
  9. package/packages/internal/src/handler/data/guard-utils.ts +7 -0
  10. package/packages/internal/src/handler/data/handler.ts +415 -0
  11. package/packages/internal/src/handler/data/query-processor.ts +504 -0
  12. package/packages/internal/src/handler/index.ts +1 -0
  13. package/packages/internal/src/handler/types.ts +20 -0
  14. package/packages/internal/src/index.ts +3 -0
  15. package/packages/internal/src/request-handler.ts +27 -0
  16. package/packages/internal/src/request.ts +101 -0
  17. package/packages/internal/src/types.ts +40 -0
  18. package/packages/internal/tests/query-processor.test.ts +172 -0
  19. package/{out/cli/tsconfig.template.json → packages/internal/tsconfig.json} +7 -3
  20. package/packages/runtime/auth.d.ts +1 -0
  21. package/packages/runtime/auth.js +3 -0
  22. package/packages/runtime/hooks.d.ts +10 -0
  23. package/packages/runtime/hooks.js +3 -0
  24. package/packages/runtime/index.d.ts +3 -0
  25. package/packages/runtime/index.js +1 -0
  26. package/packages/runtime/package-lock.json +512 -0
  27. package/packages/runtime/package.json +16 -0
  28. package/packages/runtime/server.d.ts +1 -0
  29. package/packages/runtime/server.js +3 -0
  30. package/packages/runtime/types.d.ts +1 -0
  31. package/packages/runtime/types.js +3 -0
  32. package/packages/schema/.eslintrc.json +13 -0
  33. package/packages/schema/.vscodeignore +4 -0
  34. package/packages/schema/asset/logo-dark.png +0 -0
  35. package/packages/schema/asset/logo-light.png +0 -0
  36. package/{bin → packages/schema/bin}/cli +0 -0
  37. package/packages/schema/jest.config.ts +32 -0
  38. package/packages/schema/langium-config.json +14 -0
  39. package/packages/schema/langium-quickstart.md +41 -0
  40. package/packages/schema/language-configuration.json +30 -0
  41. package/packages/schema/package.json +96 -0
  42. package/packages/schema/src/cli/cli-util.ts +80 -0
  43. package/packages/schema/src/cli/index.ts +64 -0
  44. package/packages/schema/src/extension.ts +76 -0
  45. package/packages/schema/src/generator/constants.ts +5 -0
  46. package/packages/schema/src/generator/index.ts +92 -0
  47. package/{out/generator/next-auth/index.js → packages/schema/src/generator/next-auth/index.ts} +46 -58
  48. package/{out → packages/schema/src}/generator/package.template.json +0 -0
  49. package/packages/schema/src/generator/prisma/expression-writer.ts +352 -0
  50. package/packages/schema/src/generator/prisma/index.ts +32 -0
  51. package/packages/schema/src/generator/prisma/plain-expression-builder.ts +91 -0
  52. package/packages/schema/src/generator/prisma/prisma-builder.ts +366 -0
  53. package/packages/schema/src/generator/prisma/query-gard-generator.ts +208 -0
  54. package/packages/schema/src/generator/prisma/schema-generator.ts +300 -0
  55. package/packages/schema/src/generator/react-hooks/index.ts +181 -0
  56. package/packages/schema/src/generator/service/index.ts +107 -0
  57. package/{out → packages/schema/src}/generator/tsconfig.template.json +0 -0
  58. package/packages/schema/src/generator/types.ts +17 -0
  59. package/packages/schema/src/generator/utils.ts +9 -0
  60. package/packages/schema/src/language-server/generated/ast.ts +603 -0
  61. package/{out/language-server/generated/grammar.js → packages/schema/src/language-server/generated/grammar.ts} +5 -8
  62. package/packages/schema/src/language-server/generated/module.ts +24 -0
  63. package/packages/schema/src/language-server/main.ts +12 -0
  64. package/{out → packages/schema/src}/language-server/stdlib.zmodel +0 -0
  65. package/packages/schema/src/language-server/types.ts +9 -0
  66. package/packages/schema/src/language-server/zmodel-index.ts +33 -0
  67. package/packages/schema/src/language-server/zmodel-linker.ts +409 -0
  68. package/packages/schema/src/language-server/zmodel-module.ts +90 -0
  69. package/packages/schema/src/language-server/zmodel-scope.ts +21 -0
  70. package/packages/schema/src/language-server/zmodel-validator.ts +35 -0
  71. package/packages/schema/src/language-server/zmodel.langium +186 -0
  72. package/packages/schema/src/utils/exec-utils.ts +5 -0
  73. package/packages/schema/src/utils/indent-string.ts +6 -0
  74. package/packages/schema/syntaxes/zmodel.json +57 -0
  75. package/packages/schema/syntaxes/zmodel.tmLanguage.json +57 -0
  76. package/packages/schema/tests/generator/expression-writer.test.ts +676 -0
  77. package/packages/schema/tests/generator/prisma-builder.test.ts +138 -0
  78. package/packages/schema/tests/schema/parser.test.ts +423 -0
  79. package/packages/schema/tests/schema/sample-todo.test.ts +14 -0
  80. package/packages/schema/tests/utils.ts +38 -0
  81. package/packages/schema/tsconfig.json +23 -0
  82. package/pnpm-workspace.yaml +3 -0
  83. package/samples/todo/.env +2 -0
  84. package/samples/todo/.eslintrc.json +3 -0
  85. package/samples/todo/.vscode/launch.json +11 -0
  86. package/samples/todo/README.md +34 -0
  87. package/samples/todo/components/AuthGuard.tsx +17 -0
  88. package/samples/todo/components/Avatar.tsx +22 -0
  89. package/samples/todo/components/BreadCrumb.tsx +44 -0
  90. package/samples/todo/components/ManageMembers.tsx +134 -0
  91. package/samples/todo/components/NavBar.tsx +57 -0
  92. package/samples/todo/components/SpaceMembers.tsx +76 -0
  93. package/samples/todo/components/Spaces.tsx +28 -0
  94. package/samples/todo/components/TimeInfo.tsx +17 -0
  95. package/samples/todo/components/Todo.tsx +72 -0
  96. package/samples/todo/components/TodoList.tsx +77 -0
  97. package/samples/todo/lib/context.ts +31 -0
  98. package/samples/todo/next.config.js +10 -0
  99. package/samples/todo/package-lock.json +7527 -0
  100. package/samples/todo/package.json +45 -0
  101. package/samples/todo/pages/_app.tsx +50 -0
  102. package/samples/todo/pages/api/auth/[...nextauth].ts +83 -0
  103. package/samples/todo/pages/api/zenstack/[...path].ts +16 -0
  104. package/samples/todo/pages/create-space.tsx +114 -0
  105. package/samples/todo/pages/index.tsx +32 -0
  106. package/samples/todo/pages/space/[slug]/[listId]/index.tsx +88 -0
  107. package/samples/todo/pages/space/[slug]/index.tsx +169 -0
  108. package/samples/todo/postcss.config.js +6 -0
  109. package/samples/todo/public/avatar.jpg +0 -0
  110. package/samples/todo/public/favicon.ico +0 -0
  111. package/samples/todo/public/logo.png +0 -0
  112. package/samples/todo/public/vercel.svg +4 -0
  113. package/samples/todo/styles/globals.css +7 -0
  114. package/samples/todo/tailwind.config.js +11 -0
  115. package/samples/todo/tsconfig.json +28 -0
  116. package/samples/todo/types/next-auth.d.ts +14 -0
  117. package/samples/todo/types/next.d.ts +16 -0
  118. package/samples/todo/zenstack/migrations/20221014084317_init/migration.sql +153 -0
  119. package/samples/todo/zenstack/migrations/20221020094651_upate_cli/migration.sql +23 -0
  120. package/samples/todo/zenstack/migrations/migration_lock.toml +3 -0
  121. package/samples/todo/zenstack/schema.prisma +126 -0
  122. package/samples/todo/zenstack/schema.zmodel +161 -0
  123. package/tests/integration/jest.config.ts +16 -0
  124. package/tests/integration/package-lock.json +1081 -0
  125. package/tests/integration/package.json +27 -0
  126. package/tests/integration/tests/operation-coverate.test.ts +563 -0
  127. package/tests/integration/tests/operations.zmodel +69 -0
  128. package/tests/integration/tests/todo-e2e.test.ts +577 -0
  129. package/tests/integration/tests/todo.zmodel +123 -0
  130. package/tests/integration/tests/tsconfig.template.json +10 -0
  131. package/tests/integration/tests/utils.ts +133 -0
  132. package/tests/integration/tsconfig.json +10 -0
  133. package/out/cli/cli-util.js +0 -64
  134. package/out/cli/cli-util.js.map +0 -1
  135. package/out/cli/generator.js +0 -1
  136. package/out/cli/generator.js.map +0 -1
  137. package/out/cli/index.js +0 -46
  138. package/out/cli/index.js.map +0 -1
  139. package/out/cli/package.template.json +0 -10
  140. package/out/extension.js +0 -81
  141. package/out/extension.js.map +0 -1
  142. package/out/generator/constants.js +0 -9
  143. package/out/generator/constants.js.map +0 -1
  144. package/out/generator/data-server/index.js +0 -1
  145. package/out/generator/data-server/index.js.map +0 -1
  146. package/out/generator/index.js +0 -98
  147. package/out/generator/index.js.map +0 -1
  148. package/out/generator/next-auth/index.js.map +0 -1
  149. package/out/generator/prisma/expression-writer.js +0 -287
  150. package/out/generator/prisma/expression-writer.js.map +0 -1
  151. package/out/generator/prisma/index.js +0 -38
  152. package/out/generator/prisma/index.js.map +0 -1
  153. package/out/generator/prisma/plain-expression-builder.js +0 -69
  154. package/out/generator/prisma/plain-expression-builder.js.map +0 -1
  155. package/out/generator/prisma/prisma-builder.js +0 -307
  156. package/out/generator/prisma/prisma-builder.js.map +0 -1
  157. package/out/generator/prisma/query-gard-generator.js +0 -159
  158. package/out/generator/prisma/query-gard-generator.js.map +0 -1
  159. package/out/generator/prisma/schema-generator.js +0 -201
  160. package/out/generator/prisma/schema-generator.js.map +0 -1
  161. package/out/generator/query-guard/index.js +0 -2
  162. package/out/generator/query-guard/index.js.map +0 -1
  163. package/out/generator/react-hooks/index.js +0 -179
  164. package/out/generator/react-hooks/index.js.map +0 -1
  165. package/out/generator/server/data/data-generator.js +0 -376
  166. package/out/generator/server/data/data-generator.js.map +0 -1
  167. package/out/generator/server/data/expression-writer.js +0 -287
  168. package/out/generator/server/data/expression-writer.js.map +0 -1
  169. package/out/generator/server/data/plain-expression-builder.js +0 -69
  170. package/out/generator/server/data/plain-expression-builder.js.map +0 -1
  171. package/out/generator/server/data-generator.js +0 -82
  172. package/out/generator/server/data-generator.js.map +0 -1
  173. package/out/generator/server/expression-writer.js +0 -1
  174. package/out/generator/server/expression-writer.js.map +0 -1
  175. package/out/generator/server/function/function-generator.js +0 -50
  176. package/out/generator/server/function/function-generator.js.map +0 -1
  177. package/out/generator/server/function-generator.js +0 -13
  178. package/out/generator/server/function-generator.js.map +0 -1
  179. package/out/generator/server/index.js +0 -88
  180. package/out/generator/server/index.js.map +0 -1
  181. package/out/generator/server/js-expression-builder.js +0 -1
  182. package/out/generator/server/js-expression-builder.js.map +0 -1
  183. package/out/generator/server/plain-expression-builder.js +0 -1
  184. package/out/generator/server/plain-expression-builder.js.map +0 -1
  185. package/out/generator/server/server-code-generator.js +0 -3
  186. package/out/generator/server/server-code-generator.js.map +0 -1
  187. package/out/generator/server/server-code-writer.js +0 -1
  188. package/out/generator/server/server-code-writer.js.map +0 -1
  189. package/out/generator/service/index.js +0 -133
  190. package/out/generator/service/index.js.map +0 -1
  191. package/out/generator/types.js +0 -10
  192. package/out/generator/types.js.map +0 -1
  193. package/out/generator/utils.js +0 -10
  194. package/out/generator/utils.js.map +0 -1
  195. package/out/language-server/generated/ast.js +0 -386
  196. package/out/language-server/generated/ast.js.map +0 -1
  197. package/out/language-server/generated/grammar.js.map +0 -1
  198. package/out/language-server/generated/module.js +0 -23
  199. package/out/language-server/generated/module.js.map +0 -1
  200. package/out/language-server/main.js +0 -12
  201. package/out/language-server/main.js.map +0 -1
  202. package/out/language-server/types.js +0 -3
  203. package/out/language-server/types.js.map +0 -1
  204. package/out/language-server/zmodel-index.js +0 -38
  205. package/out/language-server/zmodel-index.js.map +0 -1
  206. package/out/language-server/zmodel-linker.js +0 -241
  207. package/out/language-server/zmodel-linker.js.map +0 -1
  208. package/out/language-server/zmodel-module.js +0 -51
  209. package/out/language-server/zmodel-module.js.map +0 -1
  210. package/out/language-server/zmodel-scope.js +0 -30
  211. package/out/language-server/zmodel-scope.js.map +0 -1
  212. package/out/language-server/zmodel-validator.js +0 -25
  213. package/out/language-server/zmodel-validator.js.map +0 -1
  214. package/out/utils/indent-string.js +0 -9
  215. package/out/utils/indent-string.js.map +0 -1
@@ -1,376 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- const types_1 = require("../../types");
30
- const ts_morph_1 = require("ts-morph");
31
- const ast_1 = require("../../../language-server/generated/ast");
32
- const path = __importStar(require("path"));
33
- const change_case_1 = require("change-case");
34
- const utils_1 = require("../../utils");
35
- const expression_writer_1 = __importDefault(require("./expression-writer"));
36
- const langium_1 = require("langium");
37
- const colors_1 = __importDefault(require("colors"));
38
- class DataServerGenerator {
39
- generate(project, context) {
40
- const models = (0, utils_1.extractDataModelsWithAllowRules)(context.schema);
41
- this.generateIndex(models, project, context);
42
- this.generateUtils(project, context);
43
- models.forEach((model) => this.generateForModel(model, project, context));
44
- console.log(colors_1.default.blue(' ✔️ Server-side CRUD generated'));
45
- }
46
- //#region Index & Utils
47
- generateIndex(models, project, context) {
48
- const content = `
49
- import type { NextApiRequest, NextApiResponse } from 'next';
50
- import { RequestHandlerOptions } from '..';
51
- ${models.map((model) => this.writeModelImport(model)).join('\n')}
52
-
53
- export default async function (
54
- req: NextApiRequest,
55
- res: NextApiResponse,
56
- path: string[],
57
- options: RequestHandlerOptions
58
- ) {
59
- const [type, ...rest] = path;
60
- switch (type) {
61
- ${models
62
- .map((model) => this.writeModelEntrance(model))
63
- .join('\n')}
64
- default:
65
- res.status(404).json({ error: 'Unknown type: ' + type });
66
- }
67
- }
68
- `;
69
- const sf = project.createSourceFile(path.join(context.outDir, 'server/data/index.ts'), content, { overwrite: true });
70
- sf.formatText();
71
- }
72
- generateUtils(project, context) {
73
- const content = `
74
- import type { NextApiRequest, NextApiResponse } from 'next';
75
- import { RequestHandlerOptions } from '..';
76
-
77
- export async function getUser(
78
- req: NextApiRequest,
79
- res: NextApiResponse,
80
- options: RequestHandlerOptions
81
- ) {
82
- return await options.getServerUser(req, res);
83
- }
84
-
85
- export function unauthorized(res: NextApiResponse) {
86
- res.status(403).json({ message: 'Unauthorized' });
87
- }
88
-
89
- export function notFound(res: NextApiResponse) {
90
- res.status(404).json({ message: 'Entity not found' });
91
- }
92
- `;
93
- const sf = project.createSourceFile(path.join(context.outDir, 'server/data/_utils.ts'), content, { overwrite: true });
94
- sf.formatText();
95
- }
96
- writeModelImport(model) {
97
- return `import ${(0, change_case_1.camelCase)(model.name)}Handler from './${(0, change_case_1.paramCase)(model.name)}';`;
98
- }
99
- writeModelEntrance(model) {
100
- return `
101
- case '${(0, change_case_1.camelCase)(model.name)}':
102
- return ${(0, change_case_1.camelCase)(model.name)}Handler(req, res, rest, options);
103
- `;
104
- }
105
- //#endregion
106
- //#region Per-Model
107
- generateForModel(model, project, context) {
108
- const content = `
109
- import type { NextApiRequest, NextApiResponse } from 'next';
110
- import type { Prisma as P } from '@zenstack/.prisma';
111
- import { RequestHandlerOptions } from '..';
112
- import service from '@zenstack/service';
113
- import { getUser, notFound } from './_utils';
114
-
115
- export default async function (
116
- req: NextApiRequest,
117
- res: NextApiResponse,
118
- path: string[],
119
- options: RequestHandlerOptions
120
- ) {
121
- switch (req.method) {
122
- case 'GET':
123
- if (path.length > 0) {
124
- return get(req, res, path[0], options);
125
- } else {
126
- return find(req, res, options);
127
- }
128
-
129
- case 'POST':
130
- return create(req, res, options);
131
-
132
- case 'PUT':
133
- return update(req, res, path[0], options);
134
-
135
- case 'DELETE':
136
- return del(req, res, path[0], options);
137
-
138
- default:
139
- throw new Error('Unsupported HTTP method: ' + req.method);
140
- }
141
- }
142
- `;
143
- const sf = project.createSourceFile(path.join(context.outDir, `server/data/${(0, change_case_1.paramCase)(model.name)}.ts`), content, { overwrite: true });
144
- this.generateFind(sf, model);
145
- this.generateGet(sf, model);
146
- this.generateCreate(sf, model);
147
- this.generateUpdate(sf, model);
148
- this.generateDel(sf, model);
149
- sf.formatText();
150
- sf.saveSync();
151
- }
152
- generateServeFunction(sourceFile, model, operation) {
153
- const parameters = [];
154
- parameters.push({
155
- name: 'req',
156
- type: 'NextApiRequest',
157
- });
158
- parameters.push({
159
- name: 'res',
160
- type: 'NextApiResponse',
161
- });
162
- if (operation === 'get' ||
163
- operation === 'update' ||
164
- operation === 'del') {
165
- // an extra "id" parameter
166
- parameters.push({
167
- name: 'id',
168
- type: 'string',
169
- });
170
- }
171
- parameters.push({
172
- name: 'options',
173
- type: 'RequestHandlerOptions',
174
- });
175
- const func = sourceFile
176
- .addFunction({
177
- name: operation,
178
- isAsync: true,
179
- parameters,
180
- })
181
- .addBody();
182
- if (this.modelUsesAuth(model)) {
183
- func.addStatements([
184
- `const user = await getUser(req, res, options);`,
185
- ]);
186
- }
187
- return func;
188
- }
189
- modelUsesAuth(model) {
190
- return !!(0, langium_1.streamAllContents)(model).find((node) => { var _a; return (0, ast_1.isInvocationExpr)(node) && ((_a = node.function.ref) === null || _a === void 0 ? void 0 : _a.name) === 'auth'; });
191
- }
192
- //#region Find & Get
193
- generateFind(sourceFile, model) {
194
- const func = this.generateServeFunction(sourceFile, model, 'find');
195
- func.addStatements([
196
- `const query: P.${model.name}FindManyArgs = req.query.q? (JSON.parse(req.query.q as string)): {};`,
197
- ]);
198
- func.addVariableStatement({
199
- declarationKind: ts_morph_1.VariableDeclarationKind.Const,
200
- declarations: [
201
- {
202
- name: 'args',
203
- type: `P.${model.name}FindManyArgs`,
204
- initializer: (writer) => {
205
- writer.block(() => {
206
- writer.writeLine('...query,');
207
- writer.write('where:');
208
- writer.block(() => {
209
- writer.write('AND: [');
210
- writer.write('{ ...query.where },');
211
- this.writeFindArgs(writer, model, 'read');
212
- writer.write(']');
213
- });
214
- });
215
- },
216
- },
217
- ],
218
- });
219
- func.addStatements([
220
- `res.status(200).send(await service.db.${(0, change_case_1.camelCase)(model.name)}.findMany(args));`,
221
- ]);
222
- }
223
- generateGet(sourceFile, model) {
224
- const func = this.generateServeFunction(sourceFile, model, 'get');
225
- func.addStatements([
226
- `const query: P.${model.name}FindFirstArgs = req.query.q? (JSON.parse(req.query.q as string)): {};`,
227
- ]);
228
- func.addVariableStatement({
229
- declarationKind: ts_morph_1.VariableDeclarationKind.Const,
230
- declarations: [
231
- {
232
- name: 'args',
233
- type: `P.${model.name}FindFirstArgs`,
234
- initializer: (writer) => {
235
- writer.block(() => {
236
- writer.writeLine('...query,');
237
- writer.write('where:');
238
- writer.block(() => {
239
- writer.write('AND: [');
240
- writer.write('{ id },');
241
- this.writeFindArgs(writer, model, 'read');
242
- writer.write(']');
243
- });
244
- });
245
- },
246
- },
247
- ],
248
- });
249
- func.addStatements([
250
- `
251
- const r = await service.db.${(0, change_case_1.camelCase)(model.name)}.findFirst(args);
252
- if (!r) {
253
- notFound(res);
254
- } else {
255
- res.status(200).send(r);
256
- }
257
- `,
258
- ]);
259
- }
260
- writeFindArgs(writer, model, action) {
261
- writer.block(() => {
262
- writer.writeLine('AND: [');
263
- this.writeDenyRules(writer, model, action);
264
- this.writeAllowRules(writer, model, action);
265
- writer.writeLine(']');
266
- });
267
- }
268
- //#endregion
269
- //#region Create
270
- generateCreate(sourceFile, model) {
271
- const func = this.generateServeFunction(sourceFile, model, 'create');
272
- func.addVariableStatement({
273
- declarationKind: ts_morph_1.VariableDeclarationKind.Const,
274
- declarations: [
275
- {
276
- name: 'args',
277
- type: `P.${model.name}CreateArgs`,
278
- initializer: 'req.body',
279
- },
280
- ],
281
- });
282
- // TODO: policy
283
- func.addStatements([
284
- `
285
- const r = await service.db.${(0, change_case_1.camelCase)(model.name)}.create(args);
286
- res.status(200).send(r);
287
- `,
288
- ]);
289
- }
290
- //#endregion
291
- //#region Update
292
- generateUpdate(sourceFile, model) {
293
- const func = this.generateServeFunction(sourceFile, model, 'update');
294
- func.addVariableStatement({
295
- declarationKind: ts_morph_1.VariableDeclarationKind.Const,
296
- declarations: [
297
- {
298
- name: 'body',
299
- type: `P.${model.name}UpdateArgs`,
300
- initializer: 'req.body',
301
- },
302
- ],
303
- });
304
- // TODO: policy
305
- func.addStatements([
306
- `
307
- const r = await service.db.${(0, change_case_1.camelCase)(model.name)}.update({
308
- ...body,
309
- where: { id }
310
- });
311
- res.status(200).send(r);
312
- `,
313
- ]);
314
- }
315
- //#endregion
316
- //#region Delete
317
- generateDel(sourceFile, model) {
318
- const func = this.generateServeFunction(sourceFile, model, 'del');
319
- func.addStatements([
320
- `const args: P.${model.name}DeleteArgs = req.query.q? (JSON.parse(req.query.q as string)): {};`,
321
- ]);
322
- // TODO: policy
323
- func.addStatements([
324
- `
325
- const r = await service.db.${(0, change_case_1.camelCase)(model.name)}.delete({
326
- ...args,
327
- where: { id }
328
- });
329
- res.status(200).send(r);
330
- `,
331
- ]);
332
- }
333
- //#endregion
334
- //#endregion
335
- //#region Policy
336
- ruleSpecCovers(ruleSpec, action) {
337
- if (!(0, ast_1.isLiteralExpr)(ruleSpec) || typeof ruleSpec.value !== 'string') {
338
- throw new types_1.GeneratorError(`Rule spec must be a string literal`);
339
- }
340
- const specs = ruleSpec.value.split(',').map((s) => s.trim());
341
- return specs.includes('all') || specs.includes(action);
342
- }
343
- writeDenyRules(writer, model, action) {
344
- const attrs = model.attributes.filter((attr) => {
345
- var _a;
346
- return attr.args.length > 0 &&
347
- ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === 'deny' &&
348
- attr.args.length > 1 &&
349
- this.ruleSpecCovers(attr.args[0].value, action);
350
- });
351
- attrs.forEach((attr) => this.writeDenyRule(writer, model, attr.args[1].value));
352
- }
353
- writeDenyRule(writer, model, rule) {
354
- writer.block(() => {
355
- writer.writeLine('NOT: ');
356
- new expression_writer_1.default(writer).write(rule);
357
- });
358
- writer.write(',');
359
- }
360
- writeAllowRules(writer, model, action) {
361
- const attrs = model.attributes.filter((attr) => {
362
- var _a;
363
- return attr.args.length > 0 &&
364
- ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === 'allow' &&
365
- attr.args.length > 1 &&
366
- this.ruleSpecCovers(attr.args[0].value, action);
367
- });
368
- attrs.forEach((attr) => this.writeAllowRule(writer, model, attr.args[1].value));
369
- }
370
- writeAllowRule(writer, model, rule) {
371
- new expression_writer_1.default(writer).write(rule);
372
- writer.write(',');
373
- }
374
- }
375
- exports.default = DataServerGenerator;
376
- //# sourceMappingURL=data-generator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-generator.js","sourceRoot":"","sources":["../../../../src/generator/server/data/data-generator.ts"],"names":[],"mappings":"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"}
@@ -1,287 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const ast_1 = require("../../../language-server/generated/ast");
7
- const types_1 = require("../../types");
8
- const plain_expression_builder_1 = __importDefault(require("./plain-expression-builder"));
9
- const AUX_GUARD_FIELD = 'zenstack_guard';
10
- class ExpressionWriter {
11
- constructor(writer) {
12
- this.writer = writer;
13
- this.plainExprBuilder = new plain_expression_builder_1.default();
14
- }
15
- write(expr) {
16
- const _write = () => {
17
- switch (expr.$type) {
18
- case ast_1.LiteralExpr:
19
- this.writeLiteral(expr);
20
- break;
21
- case ast_1.UnaryExpr:
22
- this.writeUnary(expr);
23
- break;
24
- case ast_1.BinaryExpr:
25
- this.writeBinary(expr);
26
- break;
27
- case ast_1.ReferenceExpr:
28
- this.writeReference(expr);
29
- break;
30
- case ast_1.MemberAccessExpr:
31
- this.writeMemberAccess(expr);
32
- break;
33
- default:
34
- throw new Error(`Not implemented: ${expr.$type}`);
35
- }
36
- };
37
- this.block(_write);
38
- }
39
- writeReference(expr) {
40
- if ((0, ast_1.isEnumField)(expr.target.ref)) {
41
- throw new Error('We should never get here');
42
- }
43
- else {
44
- this.writer.write(`${expr.target.ref.name}: true`);
45
- }
46
- }
47
- writeMemberAccess(expr) {
48
- this.writeFieldCondition(expr.operand, () => {
49
- this.block(() => {
50
- var _a;
51
- this.writer.write(`${(_a = expr.member.ref) === null || _a === void 0 ? void 0 : _a.name}: true`);
52
- });
53
- }, 'is');
54
- }
55
- writeExprList(exprs) {
56
- this.writer.writeLine('[');
57
- for (let i = 0; i < exprs.length; i++) {
58
- this.write(exprs[i]);
59
- if (i !== exprs.length - 1) {
60
- this.writer.writeLine(',');
61
- }
62
- }
63
- this.writer.writeLine(']');
64
- }
65
- writeBinary(expr) {
66
- switch (expr.operator) {
67
- case '&&':
68
- case '||':
69
- this.writeLogical(expr, expr.operator);
70
- break;
71
- case '==':
72
- case '!=':
73
- case '>':
74
- case '>=':
75
- case '<':
76
- case '<=':
77
- this.writeComparison(expr, expr.operator);
78
- break;
79
- case '?':
80
- case '!':
81
- case '^':
82
- this.writeCollectionPredicate(expr, expr.operator);
83
- break;
84
- }
85
- }
86
- writeCollectionPredicate(expr, operator) {
87
- this.writeFieldCondition(expr.left, () => {
88
- this.write(expr.right);
89
- }, operator === '?' ? 'some' : operator === '!' ? 'every' : 'none');
90
- }
91
- isFieldAccess(expr) {
92
- if ((0, ast_1.isThisExpr)(expr)) {
93
- return true;
94
- }
95
- if ((0, ast_1.isMemberAccessExpr)(expr)) {
96
- return this.isFieldAccess(expr.operand);
97
- }
98
- if ((0, ast_1.isReferenceExpr)(expr) && (0, ast_1.isDataModelField)(expr.target.ref)) {
99
- return true;
100
- }
101
- return false;
102
- }
103
- guard(write) {
104
- this.writer.write(`${AUX_GUARD_FIELD}: `);
105
- write();
106
- }
107
- plain(expr) {
108
- this.writer.write(this.plainExprBuilder.build(expr));
109
- }
110
- writeComparison(expr, operator) {
111
- const leftIsFieldAccess = this.isFieldAccess(expr.left);
112
- const rightIsFieldAccess = this.isFieldAccess(expr.right);
113
- if (leftIsFieldAccess && rightIsFieldAccess) {
114
- throw new types_1.GeneratorError(`Comparison between fields are not supported yet`);
115
- }
116
- if (!leftIsFieldAccess && !rightIsFieldAccess) {
117
- // compile down to a plain expression
118
- this.guard(() => {
119
- this.plain(expr.left);
120
- this.writer.write(' ' + operator + ' ');
121
- this.plain(expr.right);
122
- });
123
- return;
124
- }
125
- let fieldAccess;
126
- let operand;
127
- if (leftIsFieldAccess) {
128
- fieldAccess = expr.left;
129
- operand = expr.right;
130
- }
131
- else {
132
- fieldAccess = expr.right;
133
- operand = expr.left;
134
- operator = this.negateOperator(operator);
135
- }
136
- this.writeFieldCondition(fieldAccess, () => {
137
- this.block(() => {
138
- if (this.isModelTyped(fieldAccess)) {
139
- // comparing with an object, conver to "id" comparison instead
140
- this.writer.write('id: ');
141
- this.block(() => {
142
- this.writeOperator(operator, () => {
143
- this.plain(operand);
144
- this.writer.write('?.id');
145
- });
146
- });
147
- }
148
- else {
149
- this.writeOperator(operator, () => {
150
- this.plain(operand);
151
- });
152
- }
153
- },
154
- // "this" expression is compiled away (to .id access), so we should
155
- // avoid generating a new layer
156
- !(0, ast_1.isThisExpr)(fieldAccess));
157
- }, 'is');
158
- }
159
- writeOperator(operator, writeOperand) {
160
- if (operator === '!=') {
161
- // wrap a 'not'
162
- this.writer.write('not: ');
163
- this.block(() => {
164
- this.writeOperator('==', writeOperand);
165
- });
166
- }
167
- else {
168
- this.writer.write(`${this.mapOperator(operator)}: `);
169
- writeOperand();
170
- }
171
- }
172
- writeFieldCondition(fieldAccess, writeCondition, relationOp) {
173
- var _a, _b;
174
- let selector;
175
- let operand;
176
- if ((0, ast_1.isThisExpr)(fieldAccess)) {
177
- // pass on
178
- writeCondition();
179
- return;
180
- }
181
- else if ((0, ast_1.isReferenceExpr)(fieldAccess)) {
182
- selector = (_a = fieldAccess.target.ref) === null || _a === void 0 ? void 0 : _a.name;
183
- }
184
- else if ((0, ast_1.isMemberAccessExpr)(fieldAccess)) {
185
- selector = (_b = fieldAccess.member.ref) === null || _b === void 0 ? void 0 : _b.name;
186
- operand = fieldAccess.operand;
187
- }
188
- else {
189
- throw new types_1.GeneratorError(`Unsupported expression type: ${fieldAccess.$type}`);
190
- }
191
- if (operand) {
192
- // member access expression
193
- this.writeFieldCondition(operand, () => {
194
- this.block(() => {
195
- this.writer.write(selector + ': ');
196
- if (this.isModelTyped(fieldAccess)) {
197
- // expression is resolved to a model, generate relation query
198
- this.block(() => {
199
- this.writer.write(`${relationOp}: `);
200
- writeCondition();
201
- });
202
- }
203
- else {
204
- // generate plain query
205
- writeCondition();
206
- }
207
- },
208
- // if operand is "this", it doesn't really generate a new layer of query,
209
- // so we should avoid generating a new block
210
- !(0, ast_1.isThisExpr)(operand));
211
- }, 'is');
212
- }
213
- else if (this.isModelTyped(fieldAccess)) {
214
- // reference resolved to a model, generate relation query
215
- this.writer.write(selector + ': ');
216
- this.block(() => {
217
- this.writer.write(`${relationOp}: `);
218
- writeCondition();
219
- });
220
- }
221
- else {
222
- // generate a plain query
223
- this.writer.write(selector + ': ');
224
- writeCondition();
225
- }
226
- }
227
- block(write, condition = true) {
228
- if (condition) {
229
- this.writer.block(write);
230
- }
231
- else {
232
- write();
233
- }
234
- }
235
- isModelTyped(expr) {
236
- var _a;
237
- return (0, ast_1.isDataModel)((_a = expr.$resolvedType) === null || _a === void 0 ? void 0 : _a.decl);
238
- }
239
- mapOperator(operator) {
240
- switch (operator) {
241
- case '==':
242
- return 'equals';
243
- case '!=':
244
- throw new Error('Operation != should have been compiled away');
245
- case '>':
246
- return 'gt';
247
- case '>=':
248
- return 'ge';
249
- case '<':
250
- return 'lt';
251
- case '<=':
252
- return 'le';
253
- }
254
- }
255
- negateOperator(operator) {
256
- switch (operator) {
257
- case '>':
258
- return '<=';
259
- case '<':
260
- return '>=';
261
- case '>=':
262
- return '<';
263
- case '<=':
264
- return '>';
265
- default:
266
- return operator;
267
- }
268
- }
269
- writeLogical(expr, operator) {
270
- this.writer.writeLine(`${operator === '&&' ? 'AND' : 'OR'}: `);
271
- this.writeExprList([expr.left, expr.right]);
272
- }
273
- writeUnary(expr) {
274
- if (expr.operator !== '!') {
275
- throw new types_1.GeneratorError(`Unary operator "${expr.operator}" is not supported`);
276
- }
277
- this.writer.writeLine('NOT: ');
278
- this.write(expr.operand);
279
- }
280
- writeLiteral(expr) {
281
- this.guard(() => {
282
- this.plain(expr);
283
- });
284
- }
285
- }
286
- exports.default = ExpressionWriter;
287
- //# sourceMappingURL=expression-writer.js.map