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.
- package/README.md +79 -9
- package/cli/cli-error.js +3 -5
- package/cli/cli-error.js.map +1 -1
- package/cli/cli-util.js +123 -105
- package/cli/cli-util.js.map +1 -1
- package/cli/index.js +105 -63
- package/cli/index.js.map +1 -1
- package/cli/plugin-runner.js +130 -127
- package/cli/plugin-runner.js.map +1 -1
- package/language-server/constants.js +5 -13
- package/language-server/constants.js.map +1 -1
- package/language-server/main.js +8 -15
- package/language-server/main.js.map +1 -1
- package/language-server/types.js +3 -1
- package/language-server/types.js.map +1 -1
- package/language-server/utils.js +13 -16
- package/language-server/utils.js.map +1 -1
- package/language-server/validator/attribute-validator.js +3 -7
- package/language-server/validator/attribute-validator.js.map +1 -1
- package/language-server/validator/datamodel-validator.js +293 -347
- package/language-server/validator/datamodel-validator.js.map +1 -1
- package/language-server/validator/datasource-validator.js +61 -71
- package/language-server/validator/datasource-validator.js.map +1 -1
- package/language-server/validator/enum-validator.js +6 -10
- package/language-server/validator/enum-validator.js.map +1 -1
- package/language-server/validator/expression-validator.js +25 -31
- package/language-server/validator/expression-validator.js.map +1 -1
- package/language-server/validator/schema-validator.js +18 -25
- package/language-server/validator/schema-validator.js.map +1 -1
- package/language-server/validator/utils.js +86 -85
- package/language-server/validator/utils.js.map +1 -1
- package/language-server/validator/zmodel-validator.js +55 -58
- package/language-server/validator/zmodel-validator.js.map +1 -1
- package/language-server/zmodel-formatter.js +40 -21
- package/language-server/zmodel-formatter.js.map +1 -1
- package/language-server/zmodel-linker.js +328 -331
- package/language-server/zmodel-linker.js.map +1 -1
- package/language-server/zmodel-module.js +50 -59
- package/language-server/zmodel-module.js.map +1 -1
- package/language-server/zmodel-scope.js +35 -25
- package/language-server/zmodel-scope.js.map +1 -1
- package/language-server/zmodel-workspace-manager.js +30 -18
- package/language-server/zmodel-workspace-manager.js.map +1 -1
- package/package.json +8 -12
- package/plugins/access-policy/expression-writer.js +301 -292
- package/plugins/access-policy/expression-writer.js.map +1 -1
- package/plugins/access-policy/index.js +20 -11
- package/plugins/access-policy/index.js.map +1 -1
- package/plugins/access-policy/policy-guard-generator.js +327 -321
- package/plugins/access-policy/policy-guard-generator.js.map +1 -1
- package/plugins/access-policy/typescript-expression-transformer.js +94 -95
- package/plugins/access-policy/typescript-expression-transformer.js.map +1 -1
- package/plugins/access-policy/utils.js +7 -9
- package/plugins/access-policy/utils.js.map +1 -1
- package/plugins/access-policy/zod-schema-generator.js +143 -159
- package/plugins/access-policy/zod-schema-generator.js.map +1 -1
- package/plugins/model-meta/index.js +97 -102
- package/plugins/model-meta/index.js.map +1 -1
- package/plugins/plugin-utils.js +34 -40
- package/plugins/plugin-utils.js.map +1 -1
- package/plugins/prisma/indent-string.js +4 -8
- package/plugins/prisma/indent-string.js.map +1 -1
- package/plugins/prisma/index.js +20 -11
- package/plugins/prisma/index.js.map +1 -1
- package/plugins/prisma/prisma-builder.js +235 -213
- package/plugins/prisma/prisma-builder.js.map +1 -1
- package/plugins/prisma/schema-generator.js +205 -192
- package/plugins/prisma/schema-generator.js.map +1 -1
- package/plugins/prisma/zmodel-code-generator.js +109 -114
- package/plugins/prisma/zmodel-code-generator.js.map +1 -1
- package/telemetry.js +107 -90
- package/telemetry.js.map +1 -1
- package/types.js +3 -1
- package/types.js.map +1 -1
- package/utils/ast-utils.js +67 -67
- package/utils/ast-utils.js.map +1 -1
- package/utils/exec-utils.js +6 -15
- package/utils/exec-utils.js.map +1 -1
- package/utils/pkg-utils.js +38 -35
- package/utils/pkg-utils.js.map +1 -1
- package/utils/version-utils.js +9 -10
- package/utils/version-utils.js.map +1 -1
- package/global.d.js +0 -1
- package/global.d.js.map +0 -1
|
@@ -1,323 +1,332 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
120
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
|
|
157
|
-
|
|
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
|
-
|
|
167
|
-
|
|
168
|
-
const
|
|
169
|
-
if (
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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
|
-
|
|
229
|
-
|
|
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
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
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
|
-
|
|
240
|
-
|
|
262
|
+
this.writer.write(`${relationOp}: `);
|
|
263
|
+
writeCondition();
|
|
241
264
|
});
|
|
242
|
-
|
|
243
|
-
|
|
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
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
272
|
+
block(write, condition = true) {
|
|
273
|
+
if (condition) {
|
|
274
|
+
this.writer.inlineBlock(write);
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
write();
|
|
278
|
+
}
|
|
269
279
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
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
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
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
|
-
|
|
306
|
-
|
|
307
|
-
|
|
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
|