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,676 +0,0 @@
1
- import { Project, VariableDeclarationKind } from 'ts-morph';
2
- import {
3
- DataModel,
4
- Enum,
5
- Expression,
6
- isDataModel,
7
- isEnum,
8
- } from '../../src/language-server/generated/ast';
9
- import { loadModel } from '../utils';
10
- import * as tmp from 'tmp';
11
- import { GUARD_FIELD_NAME } from '../../src/generator/constants';
12
- import expressionWriter from '../../src/generator/prisma/expression-writer';
13
-
14
- async function check(
15
- schema: string,
16
- getExpr: (model: DataModel) => Expression,
17
- expected: string
18
- ) {
19
- const model = await loadModel(schema);
20
- const expr = getExpr(
21
- model.declarations.find(
22
- (d) => isDataModel(d) && d.name === 'Test'
23
- ) as DataModel
24
- );
25
-
26
- const project = new Project();
27
-
28
- const { name: sourcePath } = tmp.fileSync({ postfix: '.ts' });
29
- const sf = project.createSourceFile(sourcePath, undefined, {
30
- overwrite: true,
31
- });
32
-
33
- // inject user variable
34
- sf.addVariableStatement({
35
- declarationKind: VariableDeclarationKind.Const,
36
- declarations: [{ name: 'user', initializer: '{ id: "user1" }' }],
37
- });
38
-
39
- // inject enums
40
- model.declarations
41
- .filter((d) => isEnum(d))
42
- .map((e) => {
43
- sf.addVariableStatement({
44
- declarationKind: VariableDeclarationKind.Const,
45
- declarations: [
46
- {
47
- name: e.name,
48
- initializer: `
49
- {
50
- ${(e as Enum).fields
51
- .map((f) => `${f.name}: "${f.name}"`)
52
- .join(',\n')}
53
- }
54
- `,
55
- },
56
- ],
57
- });
58
- });
59
-
60
- sf.addVariableStatement({
61
- declarationKind: VariableDeclarationKind.Const,
62
- declarations: [
63
- {
64
- name: 'expr',
65
- initializer: (writer) =>
66
- new expressionWriter(writer).write(expr),
67
- },
68
- ],
69
- });
70
- sf.formatText();
71
-
72
- await project.save();
73
-
74
- if (project.getPreEmitDiagnostics().length > 0) {
75
- for (const d of project.getPreEmitDiagnostics()) {
76
- console.warn(`${d.getLineNumber()}: ${d.getMessageText()}`);
77
- }
78
- console.log(`Generated source: ${sourcePath}`);
79
- throw new Error('Compilation errors occurred');
80
- }
81
-
82
- const outExpr = sf.getVariableDeclaration('expr');
83
- // console.log('Generated expr:\n', outExpr?.getText());
84
-
85
- if (expected) {
86
- const generatedExpr = outExpr!.getInitializer()!.getText();
87
- expect(generatedExpr.replace(/\s+/g, '')).toBe(
88
- expected.replace(/\s+/g, '')
89
- );
90
- }
91
- }
92
-
93
- describe('Expression Writer Tests', () => {
94
- it('boolean literal', async () => {
95
- await check(
96
- `
97
- model Test {
98
- @@allow('all', true)
99
- }
100
- `,
101
- (model) => model.attributes[0].args[1].value,
102
- `{ ${GUARD_FIELD_NAME}: true }`
103
- );
104
-
105
- await check(
106
- `
107
- model Test {
108
- @@allow('all', false)
109
- }
110
- `,
111
- (model) => model.attributes[0].args[1].value,
112
- `{ ${GUARD_FIELD_NAME}: false }`
113
- );
114
- });
115
-
116
- it('boolean field', async () => {
117
- await check(
118
- `
119
- model Test {
120
- flag Boolean
121
- @@allow('all', flag)
122
- }
123
- `,
124
- (model) => model.attributes[0].args[1].value,
125
- `{ flag: true }`
126
- );
127
-
128
- await check(
129
- `
130
- model Test {
131
- flag Boolean
132
- @@allow('all', !flag)
133
- }
134
- `,
135
- (model) => model.attributes[0].args[1].value,
136
- `{ NOT: { flag: true } }`
137
- );
138
- });
139
-
140
- it('enum', async () => {
141
- await check(
142
- `
143
- enum Role {
144
- USER
145
- ADMIN
146
- }
147
- model Test {
148
- role Role
149
- @@allow('all', role == ADMIN)
150
- }
151
- `,
152
- (model) => model.attributes[0].args[1].value,
153
- `{ role: { equals: Role.ADMIN } }`
154
- );
155
- });
156
-
157
- it('field against literal', async () => {
158
- await check(
159
- `
160
- model Test {
161
- x Int
162
- @@allow('all', x > 0)
163
- }
164
- `,
165
- (model) => model.attributes[0].args[1].value,
166
- `{
167
- x: {
168
- gt: 0
169
- }
170
- }`
171
- );
172
-
173
- await check(
174
- `
175
- model Test {
176
- label String
177
- @@allow('all', label == 'thing')
178
- }
179
- `,
180
- (model) => model.attributes[0].args[1].value,
181
- `{
182
- label: {
183
- equals: 'thing'
184
- }
185
- }`
186
- );
187
- });
188
-
189
- it('this reference', async () => {
190
- await check(
191
- `
192
- model Test {
193
- id String @id
194
- @@allow('all', auth() == this)
195
- }
196
- `,
197
- (model) => model.attributes[0].args[1].value,
198
- `{
199
- id: {
200
- equals: user?.id
201
- }
202
- }`
203
- );
204
-
205
- await check(
206
- `
207
- model Test {
208
- id String @id
209
- @@deny('all', this != auth())
210
- }
211
- `,
212
- (model) => model.attributes[0].args[1].value,
213
- `{
214
- id: {
215
- not: {
216
- equals: user?.id
217
- }
218
- }
219
- }`
220
- );
221
-
222
- await check(
223
- `
224
- model Test {
225
- x Int
226
- @@allow('all', this.x > 0)
227
- }
228
- `,
229
- (model) => model.attributes[0].args[1].value,
230
- `{
231
- x: {
232
- gt: 0
233
- }
234
- }`
235
- );
236
- });
237
-
238
- it('logical', async () => {
239
- await check(
240
- `
241
- model Test {
242
- x Int
243
- @@allow('all', x > 0 && x > 1)
244
- }
245
- `,
246
- (model) => model.attributes[0].args[1].value,
247
- `{
248
- AND:
249
- [
250
- {
251
- x : {
252
- gt: 0
253
- }
254
- }
255
- ,
256
- {
257
- x : {
258
- gt: 1
259
- }
260
- }
261
- ]
262
- }`
263
- );
264
-
265
- await check(
266
- `
267
- model Test {
268
- x Int
269
- @@allow('all', x > 0 || x > 1)
270
- }
271
- `,
272
- (model) => model.attributes[0].args[1].value,
273
- `{
274
- OR:
275
- [
276
- {
277
- x : {
278
- gt: 0
279
- }
280
- }
281
- ,
282
- {
283
- x : {
284
- gt: 1
285
- }
286
- }
287
- ]
288
- }`
289
- );
290
-
291
- await check(
292
- `
293
- model Test {
294
- x Int
295
- @@allow('all', x > 0 && x > 1 || x > 2)
296
- }
297
- `,
298
- (model) => model.attributes[0].args[1].value,
299
- `{
300
- OR:
301
- [
302
- {
303
- AND:
304
- [
305
- {
306
- x : {
307
- gt: 0
308
- }
309
- }
310
- ,
311
- {
312
- x : {
313
- gt: 1
314
- }
315
- }
316
- ]
317
- }
318
- ,
319
- {
320
- x : {
321
- gt: 2
322
- }
323
- }
324
- ]
325
- }`
326
- );
327
-
328
- await check(
329
- `
330
- model Test {
331
- x Int
332
- @@allow('all', !(x > 0 && x > 1 || !x > 2))
333
- }
334
- `,
335
- (model) => model.attributes[0].args[1].value,
336
- `{
337
- NOT:
338
- {
339
- OR:
340
- [
341
- {
342
- AND:
343
- [
344
- {
345
- x : {
346
- gt: 0
347
- }
348
- }
349
- ,
350
- {
351
- x : {
352
- gt: 1
353
- }
354
- }
355
- ]
356
- }
357
- ,
358
- {
359
- NOT:
360
- {
361
- x : {
362
- gt: 2
363
- }
364
- }
365
- }
366
- ]
367
- }
368
- }`
369
- );
370
- });
371
-
372
- it('to-one relation query', async () => {
373
- await check(
374
- `
375
- model Foo {
376
- x Int
377
- }
378
-
379
- model Test {
380
- foo Foo
381
- @@deny('all', foo.x <= 0)
382
- }
383
- `,
384
- (model) => model.attributes[0].args[1].value,
385
- `{
386
- foo: {
387
- is: {
388
- x : {
389
- le: 0
390
- }
391
- }
392
- }
393
- }`
394
- );
395
-
396
- await check(
397
- `
398
- model Foo {
399
- x Int
400
- }
401
-
402
- model Test {
403
- foo Foo
404
- @@deny('all', !(foo.x > 0))
405
- }
406
- `,
407
- (model) => model.attributes[0].args[1].value,
408
- `{
409
- NOT:
410
- {
411
- foo: {
412
- is: {
413
- x : {
414
- gt: 0
415
- }
416
- }
417
- }
418
- }
419
- }`
420
- );
421
-
422
- await check(
423
- `
424
- model Foo {
425
- x Boolean
426
- }
427
-
428
- model Test {
429
- foo Foo
430
- @@deny('all', !foo.x)
431
- }
432
- `,
433
- (model) => model.attributes[0].args[1].value,
434
- `{
435
- NOT: {
436
- foo: {
437
- is: {
438
- x: true
439
- }
440
- }
441
- }
442
- }`
443
- );
444
-
445
- await check(
446
- `
447
- model Foo {
448
- bar Bar
449
- }
450
-
451
- model Bar {
452
- x Int
453
- }
454
-
455
- model Test {
456
- foo Foo
457
- @@deny('all', foo.bar.x <= 0)
458
- }
459
- `,
460
- (model) => model.attributes[0].args[1].value,
461
- `{
462
- foo: {
463
- is: {
464
- bar: {
465
- is: {
466
- x : {
467
- le: 0
468
- }
469
- }
470
- }
471
- }
472
- }
473
- }`
474
- );
475
- });
476
-
477
- it('to-many relation query', async () => {
478
- await check(
479
- `
480
- model Foo {
481
- x Int
482
- }
483
-
484
- model Test {
485
- foos Foo[]
486
- @@deny('all', foos?[x <= 0])
487
- }
488
- `,
489
- (model) => model.attributes[0].args[1].value,
490
- `{
491
- foos: {
492
- some: {
493
- x: {
494
- le: 0
495
- }
496
- }
497
- }
498
- }`
499
- );
500
-
501
- await check(
502
- `
503
- model Foo {
504
- x Int
505
- }
506
-
507
- model Test {
508
- foos Foo[]
509
- @@deny('all', foos![x <= 0])
510
- }
511
- `,
512
- (model) => model.attributes[0].args[1].value,
513
- `{
514
- foos: {
515
- every: {
516
- x: {
517
- le: 0
518
- }
519
- }
520
- }
521
- }`
522
- );
523
-
524
- await check(
525
- `
526
- model Foo {
527
- x Int
528
- }
529
-
530
- model Test {
531
- foos Foo[]
532
- @@deny('all', foos^[x <= 0])
533
- }
534
- `,
535
- (model) => model.attributes[0].args[1].value,
536
- `{
537
- foos: {
538
- none: {
539
- x: {
540
- le: 0
541
- }
542
- }
543
- }
544
- }`
545
- );
546
-
547
- await check(
548
- `
549
- model Foo {
550
- bars Bar[]
551
- }
552
-
553
- model Bar {
554
- x Int
555
- }
556
-
557
- model Test {
558
- foo Foo
559
- @@deny('all', foo.bars?[x <= 0])
560
- }
561
- `,
562
- (model) => model.attributes[0].args[1].value,
563
- `{
564
- foo: {
565
- is: {
566
- bars: {
567
- some: {
568
- x: {
569
- le: 0
570
- }
571
- }
572
- }
573
- }
574
- }
575
- }`
576
- );
577
- });
578
-
579
- it('auth check', async () => {
580
- await check(
581
- `
582
- model Test {
583
- @@deny('all', auth() == null)
584
- }
585
- `,
586
- (model) => model.attributes[0].args[1].value,
587
- `{ ${GUARD_FIELD_NAME}: user == null }`
588
- );
589
-
590
- await check(
591
- `
592
- model Test {
593
- @@allow('all', auth() != null)
594
- }
595
- `,
596
- (model) => model.attributes[0].args[1].value,
597
- `{ ${GUARD_FIELD_NAME}: user != null }`
598
- );
599
- });
600
-
601
- it('auth check against field', async () => {
602
- await check(
603
- `
604
- model User {
605
- id String @id
606
- }
607
-
608
- model Test {
609
- id String @id
610
- owner User
611
- @@allow('all', auth() == owner)
612
- }
613
- `,
614
- (model) => model.attributes[0].args[1].value,
615
- `{
616
- owner: {
617
- is: {
618
- id: {
619
- equals: user?.id
620
- }
621
- }
622
- }
623
- }`
624
- );
625
-
626
- await check(
627
- `
628
- model User {
629
- id String @id
630
- }
631
-
632
- model Test {
633
- id String @id
634
- owner User
635
- @@deny('all', auth() != owner)
636
- }
637
- `,
638
- (model) => model.attributes[0].args[1].value,
639
- `{
640
- owner: {
641
- is: {
642
- id: {
643
- not: {
644
- equals: user?.id
645
- }
646
- }
647
- }
648
- }
649
- }`
650
- );
651
-
652
- await check(
653
- `
654
- model User {
655
- id String @id
656
- }
657
-
658
- model Test {
659
- id String @id
660
- owner User
661
- @@allow('all', auth().id == owner.id)
662
- }
663
- `,
664
- (model) => model.attributes[0].args[1].value,
665
- `{
666
- owner: {
667
- is: {
668
- id: {
669
- equals: user?.id
670
- }
671
- }
672
- }
673
- }`
674
- );
675
- });
676
- });