zenstack 1.0.0-alpha.23 → 1.0.0-alpha.25

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 (84) hide show
  1. package/README.md +79 -9
  2. package/cli/cli-error.js +3 -5
  3. package/cli/cli-error.js.map +1 -1
  4. package/cli/cli-util.js +123 -105
  5. package/cli/cli-util.js.map +1 -1
  6. package/cli/index.js +105 -63
  7. package/cli/index.js.map +1 -1
  8. package/cli/plugin-runner.js +130 -127
  9. package/cli/plugin-runner.js.map +1 -1
  10. package/language-server/constants.js +5 -13
  11. package/language-server/constants.js.map +1 -1
  12. package/language-server/main.js +8 -15
  13. package/language-server/main.js.map +1 -1
  14. package/language-server/types.js +3 -1
  15. package/language-server/types.js.map +1 -1
  16. package/language-server/utils.js +13 -16
  17. package/language-server/utils.js.map +1 -1
  18. package/language-server/validator/attribute-validator.js +3 -7
  19. package/language-server/validator/attribute-validator.js.map +1 -1
  20. package/language-server/validator/datamodel-validator.js +293 -347
  21. package/language-server/validator/datamodel-validator.js.map +1 -1
  22. package/language-server/validator/datasource-validator.js +61 -71
  23. package/language-server/validator/datasource-validator.js.map +1 -1
  24. package/language-server/validator/enum-validator.js +6 -10
  25. package/language-server/validator/enum-validator.js.map +1 -1
  26. package/language-server/validator/expression-validator.js +25 -31
  27. package/language-server/validator/expression-validator.js.map +1 -1
  28. package/language-server/validator/schema-validator.js +18 -25
  29. package/language-server/validator/schema-validator.js.map +1 -1
  30. package/language-server/validator/utils.js +86 -85
  31. package/language-server/validator/utils.js.map +1 -1
  32. package/language-server/validator/zmodel-validator.js +55 -58
  33. package/language-server/validator/zmodel-validator.js.map +1 -1
  34. package/language-server/zmodel-formatter.js +40 -21
  35. package/language-server/zmodel-formatter.js.map +1 -1
  36. package/language-server/zmodel-linker.js +328 -331
  37. package/language-server/zmodel-linker.js.map +1 -1
  38. package/language-server/zmodel-module.js +50 -59
  39. package/language-server/zmodel-module.js.map +1 -1
  40. package/language-server/zmodel-scope.js +35 -25
  41. package/language-server/zmodel-scope.js.map +1 -1
  42. package/language-server/zmodel-workspace-manager.js +30 -18
  43. package/language-server/zmodel-workspace-manager.js.map +1 -1
  44. package/package.json +8 -12
  45. package/plugins/access-policy/expression-writer.js +301 -292
  46. package/plugins/access-policy/expression-writer.js.map +1 -1
  47. package/plugins/access-policy/index.js +20 -11
  48. package/plugins/access-policy/index.js.map +1 -1
  49. package/plugins/access-policy/policy-guard-generator.js +327 -321
  50. package/plugins/access-policy/policy-guard-generator.js.map +1 -1
  51. package/plugins/access-policy/typescript-expression-transformer.js +94 -95
  52. package/plugins/access-policy/typescript-expression-transformer.js.map +1 -1
  53. package/plugins/access-policy/utils.js +7 -9
  54. package/plugins/access-policy/utils.js.map +1 -1
  55. package/plugins/access-policy/zod-schema-generator.js +143 -159
  56. package/plugins/access-policy/zod-schema-generator.js.map +1 -1
  57. package/plugins/model-meta/index.js +97 -102
  58. package/plugins/model-meta/index.js.map +1 -1
  59. package/plugins/plugin-utils.js +34 -40
  60. package/plugins/plugin-utils.js.map +1 -1
  61. package/plugins/prisma/indent-string.js +4 -8
  62. package/plugins/prisma/indent-string.js.map +1 -1
  63. package/plugins/prisma/index.js +20 -11
  64. package/plugins/prisma/index.js.map +1 -1
  65. package/plugins/prisma/prisma-builder.js +235 -213
  66. package/plugins/prisma/prisma-builder.js.map +1 -1
  67. package/plugins/prisma/schema-generator.js +205 -192
  68. package/plugins/prisma/schema-generator.js.map +1 -1
  69. package/plugins/prisma/zmodel-code-generator.js +109 -114
  70. package/plugins/prisma/zmodel-code-generator.js.map +1 -1
  71. package/telemetry.js +107 -90
  72. package/telemetry.js.map +1 -1
  73. package/types.js +3 -1
  74. package/types.js.map +1 -1
  75. package/utils/ast-utils.js +67 -67
  76. package/utils/ast-utils.js.map +1 -1
  77. package/utils/exec-utils.js +6 -15
  78. package/utils/exec-utils.js.map +1 -1
  79. package/utils/pkg-utils.js +38 -35
  80. package/utils/pkg-utils.js.map +1 -1
  81. package/utils/version-utils.js +9 -10
  82. package/utils/version-utils.js.map +1 -1
  83. package/global.d.js +0 -1
  84. package/global.d.js.map +0 -1
@@ -1,323 +1,332 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
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
6
  exports.ExpressionWriter = void 0;
7
- var _ast = require("@zenstackhq/language/ast");
8
- var _sdk = require("@zenstackhq/sdk");
9
- var _astUtils = require("../../utils/ast-utils");
10
- var _typescriptExpressionTransformer = _interopRequireDefault(require("./typescript-expression-transformer"));
11
- var _utils = require("./utils");
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
7
+ const ast_1 = require("@zenstackhq/language/ast");
8
+ const sdk_1 = require("@zenstackhq/sdk");
9
+ const ast_utils_1 = require("../../utils/ast-utils");
10
+ const typescript_expression_transformer_1 = __importDefault(require("./typescript-expression-transformer"));
11
+ const utils_1 = require("./utils");
13
12
  /**
14
13
  * Utility for writing ZModel expression as Prisma query argument objects into a ts-morph writer
15
14
  */
16
15
  class ExpressionWriter {
17
- /**
18
- * Constructs a new ExpressionWriter
19
- *
20
- * @param isPostGuard indicates if we're writing for post-update conditions
21
- */
22
- constructor(writer, isPostGuard = false) {
23
- this.writer = writer;
24
- this.isPostGuard = isPostGuard;
25
- this.plainExprBuilder = new _typescriptExpressionTransformer.default(this.isPostGuard);
26
- }
27
-
28
- /**
29
- * Writes the given ZModel expression.
30
- */
31
- write(expr) {
32
- const _write = () => {
33
- switch (expr.$type) {
34
- case _ast.LiteralExpr:
35
- this.writeLiteral(expr);
36
- break;
37
- case _ast.UnaryExpr:
38
- this.writeUnary(expr);
39
- break;
40
- case _ast.BinaryExpr:
41
- this.writeBinary(expr);
42
- break;
43
- case _ast.ReferenceExpr:
44
- this.writeReference(expr);
45
- break;
46
- case _ast.MemberAccessExpr:
47
- this.writeMemberAccess(expr);
48
- break;
49
- default:
50
- throw new Error(`Not implemented: ${expr.$type}`);
51
- }
52
- };
53
- this.block(_write);
54
- }
55
- writeReference(expr) {
56
- if ((0, _ast.isEnumField)(expr.target.ref)) {
57
- throw new Error('We should never get here');
58
- } else {
59
- var _expr$target$ref;
60
- this.writer.write(`${(_expr$target$ref = expr.target.ref) === null || _expr$target$ref === void 0 ? void 0 : _expr$target$ref.name}: true`);
16
+ /**
17
+ * Constructs a new ExpressionWriter
18
+ *
19
+ * @param isPostGuard indicates if we're writing for post-update conditions
20
+ */
21
+ constructor(writer, isPostGuard = false) {
22
+ this.writer = writer;
23
+ this.isPostGuard = isPostGuard;
24
+ this.plainExprBuilder = new typescript_expression_transformer_1.default(this.isPostGuard);
61
25
  }
62
- }
63
- writeMemberAccess(expr) {
64
- this.writeFieldCondition(expr.operand, () => {
65
- this.block(() => {
66
- var _expr$member$ref;
67
- this.writer.write(`${(_expr$member$ref = expr.member.ref) === null || _expr$member$ref === void 0 ? void 0 : _expr$member$ref.name}: true`);
68
- });
69
- }, 'is');
70
- }
71
- writeExprList(exprs) {
72
- this.writer.write('[');
73
- for (let i = 0; i < exprs.length; i++) {
74
- this.write(exprs[i]);
75
- if (i !== exprs.length - 1) {
76
- this.writer.write(',');
77
- }
26
+ /**
27
+ * Writes the given ZModel expression.
28
+ */
29
+ write(expr) {
30
+ const _write = () => {
31
+ switch (expr.$type) {
32
+ case ast_1.LiteralExpr:
33
+ this.writeLiteral(expr);
34
+ break;
35
+ case ast_1.UnaryExpr:
36
+ this.writeUnary(expr);
37
+ break;
38
+ case ast_1.BinaryExpr:
39
+ this.writeBinary(expr);
40
+ break;
41
+ case ast_1.ReferenceExpr:
42
+ this.writeReference(expr);
43
+ break;
44
+ case ast_1.MemberAccessExpr:
45
+ this.writeMemberAccess(expr);
46
+ break;
47
+ default:
48
+ throw new Error(`Not implemented: ${expr.$type}`);
49
+ }
50
+ };
51
+ this.block(_write);
78
52
  }
79
- this.writer.write(']');
80
- }
81
- writeBinary(expr) {
82
- switch (expr.operator) {
83
- case '&&':
84
- case '||':
85
- this.writeLogical(expr, expr.operator);
86
- break;
87
- case '==':
88
- case '!=':
89
- case '>':
90
- case '>=':
91
- case '<':
92
- case '<=':
93
- this.writeComparison(expr, expr.operator);
94
- break;
95
- case '?':
96
- case '!':
97
- case '^':
98
- this.writeCollectionPredicate(expr, expr.operator);
99
- break;
53
+ writeReference(expr) {
54
+ var _a;
55
+ if ((0, ast_1.isEnumField)(expr.target.ref)) {
56
+ throw new Error('We should never get here');
57
+ }
58
+ else {
59
+ this.writer.write(`${(_a = expr.target.ref) === null || _a === void 0 ? void 0 : _a.name}: true`);
60
+ }
100
61
  }
101
- }
102
- writeCollectionPredicate(expr, operator) {
103
- this.writeFieldCondition(expr.left, () => {
104
- this.write(expr.right);
105
- }, operator === '?' ? 'some' : operator === '!' ? 'every' : 'none');
106
- }
107
- isFieldAccess(expr) {
108
- if ((0, _ast.isThisExpr)(expr)) {
109
- return true;
62
+ writeMemberAccess(expr) {
63
+ this.writeFieldCondition(expr.operand, () => {
64
+ this.block(() => {
65
+ var _a;
66
+ this.writer.write(`${(_a = expr.member.ref) === null || _a === void 0 ? void 0 : _a.name}: true`);
67
+ });
68
+ }, 'is');
110
69
  }
111
- if ((0, _ast.isMemberAccessExpr)(expr)) {
112
- if ((0, _utils.isFutureExpr)(expr.operand) && this.isPostGuard) {
113
- // when writing for post-update, future().field.x is a field access
114
- return true;
115
- } else {
116
- return this.isFieldAccess(expr.operand);
117
- }
70
+ writeExprList(exprs) {
71
+ this.writer.write('[');
72
+ for (let i = 0; i < exprs.length; i++) {
73
+ this.write(exprs[i]);
74
+ if (i !== exprs.length - 1) {
75
+ this.writer.write(',');
76
+ }
77
+ }
78
+ this.writer.write(']');
118
79
  }
119
- if ((0, _ast.isReferenceExpr)(expr) && (0, _ast.isDataModelField)(expr.target.ref) && !this.isPostGuard) {
120
- return true;
80
+ writeBinary(expr) {
81
+ switch (expr.operator) {
82
+ case '&&':
83
+ case '||':
84
+ this.writeLogical(expr, expr.operator);
85
+ break;
86
+ case '==':
87
+ case '!=':
88
+ case '>':
89
+ case '>=':
90
+ case '<':
91
+ case '<=':
92
+ this.writeComparison(expr, expr.operator);
93
+ break;
94
+ case '?':
95
+ case '!':
96
+ case '^':
97
+ this.writeCollectionPredicate(expr, expr.operator);
98
+ break;
99
+ }
121
100
  }
122
- return false;
123
- }
124
- guard(write) {
125
- this.writer.write(`${_sdk.GUARD_FIELD_NAME}: `);
126
- write();
127
- }
128
- plain(expr) {
129
- this.writer.write(this.plainExprBuilder.transform(expr));
130
- }
131
- writeComparison(expr, operator) {
132
- const leftIsFieldAccess = this.isFieldAccess(expr.left);
133
- const rightIsFieldAccess = this.isFieldAccess(expr.right);
134
- if (leftIsFieldAccess && rightIsFieldAccess) {
135
- throw new _sdk.PluginError(`Comparison between fields are not supported yet`);
101
+ writeCollectionPredicate(expr, operator) {
102
+ this.writeFieldCondition(expr.left, () => {
103
+ this.write(expr.right);
104
+ }, operator === '?' ? 'some' : operator === '!' ? 'every' : 'none');
136
105
  }
137
- if (!leftIsFieldAccess && !rightIsFieldAccess) {
138
- // compile down to a plain expression
139
- this.guard(() => {
140
- this.plain(expr.left);
141
- this.writer.write(' ' + operator + ' ');
142
- this.plain(expr.right);
143
- });
144
- return;
106
+ isFieldAccess(expr) {
107
+ if ((0, ast_1.isThisExpr)(expr)) {
108
+ return true;
109
+ }
110
+ if ((0, ast_1.isMemberAccessExpr)(expr)) {
111
+ if ((0, utils_1.isFutureExpr)(expr.operand) && this.isPostGuard) {
112
+ // when writing for post-update, future().field.x is a field access
113
+ return true;
114
+ }
115
+ else {
116
+ return this.isFieldAccess(expr.operand);
117
+ }
118
+ }
119
+ if ((0, ast_1.isReferenceExpr)(expr) && (0, ast_1.isDataModelField)(expr.target.ref) && !this.isPostGuard) {
120
+ return true;
121
+ }
122
+ return false;
145
123
  }
146
- let fieldAccess;
147
- let operand;
148
- if (leftIsFieldAccess) {
149
- fieldAccess = expr.left;
150
- operand = expr.right;
151
- } else {
152
- fieldAccess = expr.right;
153
- operand = expr.left;
154
- operator = this.negateOperator(operator);
124
+ guard(write) {
125
+ this.writer.write(`${sdk_1.GUARD_FIELD_NAME}: `);
126
+ write();
155
127
  }
156
- if ((0, _ast.isMemberAccessExpr)(fieldAccess) && (0, _utils.isFutureExpr)(fieldAccess.operand)) {
157
- // future().field should be treated as the "field" directly, so we
158
- // strip 'future().' and synthesize a reference expr
159
- fieldAccess = {
160
- $type: _ast.ReferenceExpr,
161
- $container: fieldAccess.$container,
162
- target: fieldAccess.member,
163
- $resolvedType: fieldAccess.$resolvedType
164
- };
128
+ plain(expr) {
129
+ this.writer.write(this.plainExprBuilder.transform(expr));
165
130
  }
166
- this.writeFieldCondition(fieldAccess, () => {
167
- this.block(() => {
168
- const dataModel = this.isModelTyped(fieldAccess);
169
- if (dataModel) {
170
- const idField = (0, _astUtils.getIdField)(dataModel);
171
- if (!idField) {
172
- throw new _sdk.PluginError(`Data model ${dataModel.name} does not have an id field`);
173
- }
174
- // comparing with an object, conver to "id" comparison instead
175
- this.writer.write(`${idField.name}: `);
176
- this.block(() => {
177
- this.writeOperator(operator, () => {
178
- this.plain(operand);
179
- this.writer.write(`?.${idField.name}`);
131
+ writeComparison(expr, operator) {
132
+ const leftIsFieldAccess = this.isFieldAccess(expr.left);
133
+ const rightIsFieldAccess = this.isFieldAccess(expr.right);
134
+ if (leftIsFieldAccess && rightIsFieldAccess) {
135
+ throw new sdk_1.PluginError(`Comparison between fields are not supported yet`);
136
+ }
137
+ if (!leftIsFieldAccess && !rightIsFieldAccess) {
138
+ // compile down to a plain expression
139
+ this.guard(() => {
140
+ this.plain(expr.left);
141
+ this.writer.write(' ' + operator + ' ');
142
+ this.plain(expr.right);
180
143
  });
181
- });
182
- } else {
183
- this.writeOperator(operator, () => {
184
- this.plain(operand);
185
- });
144
+ return;
186
145
  }
187
- },
188
- // "this" expression is compiled away (to .id access), so we should
189
- // avoid generating a new layer
190
- !(0, _ast.isThisExpr)(fieldAccess));
191
- }, 'is');
192
- }
193
- writeOperator(operator, writeOperand) {
194
- if (operator === '!=') {
195
- // wrap a 'not'
196
- this.writer.write('not: ');
197
- this.block(() => {
198
- this.writeOperator('==', writeOperand);
199
- });
200
- } else {
201
- this.writer.write(`${this.mapOperator(operator)}: `);
202
- writeOperand();
203
- }
204
- }
205
- writeFieldCondition(fieldAccess, writeCondition, relationOp) {
206
- let selector;
207
- let operand;
208
- if ((0, _ast.isThisExpr)(fieldAccess)) {
209
- // pass on
210
- writeCondition();
211
- return;
212
- } else if ((0, _ast.isReferenceExpr)(fieldAccess)) {
213
- var _fieldAccess$target$r;
214
- selector = (_fieldAccess$target$r = fieldAccess.target.ref) === null || _fieldAccess$target$r === void 0 ? void 0 : _fieldAccess$target$r.name;
215
- } else if ((0, _ast.isMemberAccessExpr)(fieldAccess)) {
216
- if ((0, _utils.isFutureExpr)(fieldAccess.operand)) {
217
- var _fieldAccess$member$r;
218
- // future().field should be treated as the "field"
219
- selector = (_fieldAccess$member$r = fieldAccess.member.ref) === null || _fieldAccess$member$r === void 0 ? void 0 : _fieldAccess$member$r.name;
220
- } else {
221
- var _fieldAccess$member$r2;
222
- selector = (_fieldAccess$member$r2 = fieldAccess.member.ref) === null || _fieldAccess$member$r2 === void 0 ? void 0 : _fieldAccess$member$r2.name;
223
- operand = fieldAccess.operand;
224
- }
225
- } else {
226
- throw new _sdk.PluginError(`Unsupported expression type: ${fieldAccess.$type}`);
146
+ let fieldAccess;
147
+ let operand;
148
+ if (leftIsFieldAccess) {
149
+ fieldAccess = expr.left;
150
+ operand = expr.right;
151
+ }
152
+ else {
153
+ fieldAccess = expr.right;
154
+ operand = expr.left;
155
+ operator = this.negateOperator(operator);
156
+ }
157
+ if ((0, ast_1.isMemberAccessExpr)(fieldAccess) && (0, utils_1.isFutureExpr)(fieldAccess.operand)) {
158
+ // future().field should be treated as the "field" directly, so we
159
+ // strip 'future().' and synthesize a reference expr
160
+ fieldAccess = {
161
+ $type: ast_1.ReferenceExpr,
162
+ $container: fieldAccess.$container,
163
+ target: fieldAccess.member,
164
+ $resolvedType: fieldAccess.$resolvedType,
165
+ };
166
+ }
167
+ this.writeFieldCondition(fieldAccess, () => {
168
+ this.block(() => {
169
+ const dataModel = this.isModelTyped(fieldAccess);
170
+ if (dataModel) {
171
+ const idField = (0, ast_utils_1.getIdField)(dataModel);
172
+ if (!idField) {
173
+ throw new sdk_1.PluginError(`Data model ${dataModel.name} does not have an id field`);
174
+ }
175
+ // comparing with an object, conver to "id" comparison instead
176
+ this.writer.write(`${idField.name}: `);
177
+ this.block(() => {
178
+ this.writeOperator(operator, () => {
179
+ this.plain(operand);
180
+ this.writer.write(`?.${idField.name}`);
181
+ });
182
+ });
183
+ }
184
+ else {
185
+ this.writeOperator(operator, () => {
186
+ this.plain(operand);
187
+ });
188
+ }
189
+ },
190
+ // "this" expression is compiled away (to .id access), so we should
191
+ // avoid generating a new layer
192
+ !(0, ast_1.isThisExpr)(fieldAccess));
193
+ }, 'is');
227
194
  }
228
- if (!selector) {
229
- throw new _sdk.PluginError(`Failed to write FieldAccess expression`);
195
+ writeOperator(operator, writeOperand) {
196
+ if (operator === '!=') {
197
+ // wrap a 'not'
198
+ this.writer.write('not: ');
199
+ this.block(() => {
200
+ this.writeOperator('==', writeOperand);
201
+ });
202
+ }
203
+ else {
204
+ this.writer.write(`${this.mapOperator(operator)}: `);
205
+ writeOperand();
206
+ }
230
207
  }
231
- if (operand) {
232
- // member access expression
233
- this.writeFieldCondition(operand, () => {
234
- this.block(() => {
235
- this.writer.write(selector + ': ');
236
- if (this.isModelTyped(fieldAccess)) {
237
- // expression is resolved to a model, generate relation query
208
+ writeFieldCondition(fieldAccess, writeCondition, relationOp) {
209
+ var _a, _b, _c;
210
+ let selector;
211
+ let operand;
212
+ if ((0, ast_1.isThisExpr)(fieldAccess)) {
213
+ // pass on
214
+ writeCondition();
215
+ return;
216
+ }
217
+ else if ((0, ast_1.isReferenceExpr)(fieldAccess)) {
218
+ selector = (_a = fieldAccess.target.ref) === null || _a === void 0 ? void 0 : _a.name;
219
+ }
220
+ else if ((0, ast_1.isMemberAccessExpr)(fieldAccess)) {
221
+ if ((0, utils_1.isFutureExpr)(fieldAccess.operand)) {
222
+ // future().field should be treated as the "field"
223
+ selector = (_b = fieldAccess.member.ref) === null || _b === void 0 ? void 0 : _b.name;
224
+ }
225
+ else {
226
+ selector = (_c = fieldAccess.member.ref) === null || _c === void 0 ? void 0 : _c.name;
227
+ operand = fieldAccess.operand;
228
+ }
229
+ }
230
+ else {
231
+ throw new sdk_1.PluginError(`Unsupported expression type: ${fieldAccess.$type}`);
232
+ }
233
+ if (!selector) {
234
+ throw new sdk_1.PluginError(`Failed to write FieldAccess expression`);
235
+ }
236
+ if (operand) {
237
+ // member access expression
238
+ this.writeFieldCondition(operand, () => {
239
+ this.block(() => {
240
+ this.writer.write(selector + ': ');
241
+ if (this.isModelTyped(fieldAccess)) {
242
+ // expression is resolved to a model, generate relation query
243
+ this.block(() => {
244
+ this.writer.write(`${relationOp}: `);
245
+ writeCondition();
246
+ });
247
+ }
248
+ else {
249
+ // generate plain query
250
+ writeCondition();
251
+ }
252
+ },
253
+ // if operand is "this", it doesn't really generate a new layer of query,
254
+ // so we should avoid generating a new block
255
+ !(0, ast_1.isThisExpr)(operand));
256
+ }, 'is');
257
+ }
258
+ else if (this.isModelTyped(fieldAccess)) {
259
+ // reference resolved to a model, generate relation query
260
+ this.writer.write(selector + ': ');
238
261
  this.block(() => {
239
- this.writer.write(`${relationOp}: `);
240
- writeCondition();
262
+ this.writer.write(`${relationOp}: `);
263
+ writeCondition();
241
264
  });
242
- } else {
243
- // generate plain query
265
+ }
266
+ else {
267
+ // generate a plain query
268
+ this.writer.write(selector + ': ');
244
269
  writeCondition();
245
- }
246
- },
247
- // if operand is "this", it doesn't really generate a new layer of query,
248
- // so we should avoid generating a new block
249
- !(0, _ast.isThisExpr)(operand));
250
- }, 'is');
251
- } else if (this.isModelTyped(fieldAccess)) {
252
- // reference resolved to a model, generate relation query
253
- this.writer.write(selector + ': ');
254
- this.block(() => {
255
- this.writer.write(`${relationOp}: `);
256
- writeCondition();
257
- });
258
- } else {
259
- // generate a plain query
260
- this.writer.write(selector + ': ');
261
- writeCondition();
270
+ }
262
271
  }
263
- }
264
- block(write, condition = true) {
265
- if (condition) {
266
- this.writer.inlineBlock(write);
267
- } else {
268
- write();
272
+ block(write, condition = true) {
273
+ if (condition) {
274
+ this.writer.inlineBlock(write);
275
+ }
276
+ else {
277
+ write();
278
+ }
269
279
  }
270
- }
271
- isModelTyped(expr) {
272
- var _expr$$resolvedType, _expr$$resolvedType2;
273
- return (0, _ast.isDataModel)((_expr$$resolvedType = expr.$resolvedType) === null || _expr$$resolvedType === void 0 ? void 0 : _expr$$resolvedType.decl) ? (_expr$$resolvedType2 = expr.$resolvedType) === null || _expr$$resolvedType2 === void 0 ? void 0 : _expr$$resolvedType2.decl : undefined;
274
- }
275
- mapOperator(operator) {
276
- switch (operator) {
277
- case '==':
278
- return 'equals';
279
- case '!=':
280
- throw new Error('Operation != should have been compiled away');
281
- case '>':
282
- return 'gt';
283
- case '>=':
284
- return 'gte';
285
- case '<':
286
- return 'lt';
287
- case '<=':
288
- return 'lte';
280
+ isModelTyped(expr) {
281
+ var _a, _b;
282
+ return (0, ast_1.isDataModel)((_a = expr.$resolvedType) === null || _a === void 0 ? void 0 : _a.decl) ? (_b = expr.$resolvedType) === null || _b === void 0 ? void 0 : _b.decl : undefined;
283
+ }
284
+ mapOperator(operator) {
285
+ switch (operator) {
286
+ case '==':
287
+ return 'equals';
288
+ case '!=':
289
+ throw new Error('Operation != should have been compiled away');
290
+ case '>':
291
+ return 'gt';
292
+ case '>=':
293
+ return 'gte';
294
+ case '<':
295
+ return 'lt';
296
+ case '<=':
297
+ return 'lte';
298
+ }
289
299
  }
290
- }
291
- negateOperator(operator) {
292
- switch (operator) {
293
- case '>':
294
- return '<=';
295
- case '<':
296
- return '>=';
297
- case '>=':
298
- return '<';
299
- case '<=':
300
- return '>';
301
- default:
302
- return operator;
300
+ negateOperator(operator) {
301
+ switch (operator) {
302
+ case '>':
303
+ return '<=';
304
+ case '<':
305
+ return '>=';
306
+ case '>=':
307
+ return '<';
308
+ case '<=':
309
+ return '>';
310
+ default:
311
+ return operator;
312
+ }
313
+ }
314
+ writeLogical(expr, operator) {
315
+ this.writer.write(`${operator === '&&' ? 'AND' : 'OR'}: `);
316
+ this.writeExprList([expr.left, expr.right]);
317
+ }
318
+ writeUnary(expr) {
319
+ if (expr.operator !== '!') {
320
+ throw new sdk_1.PluginError(`Unary operator "${expr.operator}" is not supported`);
321
+ }
322
+ this.writer.write('NOT: ');
323
+ this.write(expr.operand);
303
324
  }
304
- }
305
- writeLogical(expr, operator) {
306
- this.writer.write(`${operator === '&&' ? 'AND' : 'OR'}: `);
307
- this.writeExprList([expr.left, expr.right]);
308
- }
309
- writeUnary(expr) {
310
- if (expr.operator !== '!') {
311
- throw new _sdk.PluginError(`Unary operator "${expr.operator}" is not supported`);
325
+ writeLiteral(expr) {
326
+ this.guard(() => {
327
+ this.plain(expr);
328
+ });
312
329
  }
313
- this.writer.write('NOT: ');
314
- this.write(expr.operand);
315
- }
316
- writeLiteral(expr) {
317
- this.guard(() => {
318
- this.plain(expr);
319
- });
320
- }
321
330
  }
322
331
  exports.ExpressionWriter = ExpressionWriter;
323
332
  //# sourceMappingURL=expression-writer.js.map