@rytass/bpm-core-nestjs-module 0.19.0 → 0.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/package.json +3 -2
  3. package/src/index.d.ts +1 -0
  4. package/src/index.js +1 -0
  5. package/src/index.js.map +1 -1
  6. package/src/lib/bpm/bpm-root-options.d.ts +13 -0
  7. package/src/lib/bpm/bpm-root-options.js.map +1 -1
  8. package/src/lib/bpm/bpm-root.module.d.ts +12 -0
  9. package/src/lib/bpm/bpm-root.module.js +5 -0
  10. package/src/lib/bpm/bpm-root.module.js.map +1 -1
  11. package/src/lib/condition/adapters/cel-legacy.adapter.d.ts +62 -0
  12. package/src/lib/condition/adapters/cel-legacy.adapter.js +141 -0
  13. package/src/lib/condition/adapters/cel-legacy.adapter.js.map +1 -0
  14. package/src/lib/condition/adapters/cel-v2.adapter.d.ts +76 -0
  15. package/src/lib/condition/adapters/cel-v2.adapter.js +371 -0
  16. package/src/lib/condition/adapters/cel-v2.adapter.js.map +1 -0
  17. package/src/lib/condition/condition.service.d.ts +90 -5
  18. package/src/lib/condition/condition.service.js +287 -71
  19. package/src/lib/condition/condition.service.js.map +1 -1
  20. package/src/lib/condition/expression-ast.d.ts +176 -0
  21. package/src/lib/condition/expression-ast.js +1254 -0
  22. package/src/lib/condition/expression-ast.js.map +1 -0
  23. package/src/lib/condition/expression-budget.d.ts +44 -0
  24. package/src/lib/condition/expression-budget.js +61 -0
  25. package/src/lib/condition/expression-budget.js.map +1 -0
  26. package/src/lib/condition/expression-dialect.d.ts +29 -0
  27. package/src/lib/condition/expression-dialect.js +44 -0
  28. package/src/lib/condition/expression-dialect.js.map +1 -0
  29. package/src/lib/condition/expression-differential.corpus.d.ts +34 -0
  30. package/src/lib/condition/expression-differential.corpus.js +995 -0
  31. package/src/lib/condition/expression-differential.corpus.js.map +1 -0
  32. package/src/lib/condition/expression-differential.d.ts +33 -0
  33. package/src/lib/condition/expression-differential.js +48 -0
  34. package/src/lib/condition/expression-differential.js.map +1 -0
  35. package/src/lib/condition/expression-engine-failure.d.ts +15 -0
  36. package/src/lib/condition/expression-engine-failure.js +22 -0
  37. package/src/lib/condition/expression-engine-failure.js.map +1 -0
  38. package/src/lib/condition/expression-errors.d.ts +40 -0
  39. package/src/lib/condition/expression-errors.js +121 -0
  40. package/src/lib/condition/expression-errors.js.map +1 -0
  41. package/src/lib/condition/expression-function-invocation.d.ts +50 -0
  42. package/src/lib/condition/expression-function-invocation.js +290 -0
  43. package/src/lib/condition/expression-function-invocation.js.map +1 -0
  44. package/src/lib/condition/expression-result.walker.d.ts +18 -0
  45. package/src/lib/condition/expression-result.walker.js +152 -0
  46. package/src/lib/condition/expression-result.walker.js.map +1 -0
  47. package/src/lib/condition/expression-runtime.d.ts +70 -0
  48. package/src/lib/condition/expression-runtime.js +134 -0
  49. package/src/lib/condition/expression-runtime.js.map +1 -0
  50. package/src/lib/condition/index.d.ts +4 -0
  51. package/src/lib/condition/index.js +8 -0
  52. package/src/lib/condition/index.js.map +1 -1
  53. package/src/lib/delegation/delegation-rule.entity.d.ts +7 -0
  54. package/src/lib/delegation/delegation-rule.entity.js +10 -0
  55. package/src/lib/delegation/delegation-rule.entity.js.map +1 -1
  56. package/src/lib/delegation/delegation.service.d.ts +7 -1
  57. package/src/lib/delegation/delegation.service.js +22 -5
  58. package/src/lib/delegation/delegation.service.js.map +1 -1
  59. package/src/lib/delegation/dto/delegation-rule.input.d.ts +2 -0
  60. package/src/lib/delegation/dto/delegation-rule.input.js +10 -0
  61. package/src/lib/delegation/dto/delegation-rule.input.js.map +1 -1
  62. package/src/lib/expression-function/expression-function.built-ins.d.ts +9 -0
  63. package/src/lib/expression-function/expression-function.built-ins.js +117 -0
  64. package/src/lib/expression-function/expression-function.built-ins.js.map +1 -0
  65. package/src/lib/expression-function/expression-function.module.d.ts +19 -0
  66. package/src/lib/expression-function/expression-function.module.js +34 -0
  67. package/src/lib/expression-function/expression-function.module.js.map +1 -0
  68. package/src/lib/expression-function/expression-function.provider.d.ts +17 -0
  69. package/src/lib/expression-function/expression-function.provider.js +39 -0
  70. package/src/lib/expression-function/expression-function.provider.js.map +1 -0
  71. package/src/lib/expression-function/expression-function.registry.d.ts +36 -0
  72. package/src/lib/expression-function/expression-function.registry.js +231 -0
  73. package/src/lib/expression-function/expression-function.registry.js.map +1 -0
  74. package/src/lib/expression-function/expression-function.types.d.ts +30 -0
  75. package/src/lib/expression-function/expression-function.types.js +8 -0
  76. package/src/lib/expression-function/expression-function.types.js.map +1 -0
  77. package/src/lib/expression-function/index.d.ts +5 -0
  78. package/src/lib/expression-function/index.js +9 -0
  79. package/src/lib/expression-function/index.js.map +1 -0
  80. package/src/lib/form/form-schema.validator.js +53 -6
  81. package/src/lib/form/form-schema.validator.js.map +1 -1
  82. package/src/lib/form-data-source/form-data-source-value-resolver.service.d.ts +12 -1
  83. package/src/lib/form-data-source/form-data-source-value-resolver.service.js +45 -26
  84. package/src/lib/form-data-source/form-data-source-value-resolver.service.js.map +1 -1
  85. package/src/lib/form-data-source/form-data-source.expression.d.ts +95 -0
  86. package/src/lib/form-data-source/form-data-source.expression.js +267 -0
  87. package/src/lib/form-data-source/form-data-source.expression.js.map +1 -0
  88. package/src/lib/form-data-source/form-data-source.module.js +4 -0
  89. package/src/lib/form-data-source/form-data-source.module.js.map +1 -1
  90. package/src/lib/form-data-source/form-data-source.service.d.ts +22 -3
  91. package/src/lib/form-data-source/form-data-source.service.js +78 -18
  92. package/src/lib/form-data-source/form-data-source.service.js.map +1 -1
  93. package/src/lib/form-data-source/form-data-source.validation.d.ts +47 -4
  94. package/src/lib/form-data-source/form-data-source.validation.js +151 -23
  95. package/src/lib/form-data-source/form-data-source.validation.js.map +1 -1
  96. package/src/lib/migrations/0000000030000-delegation-scope-condition-dialect.d.ts +22 -0
  97. package/src/lib/migrations/0000000030000-delegation-scope-condition-dialect.js +76 -0
  98. package/src/lib/migrations/0000000030000-delegation-scope-condition-dialect.js.map +1 -0
  99. package/src/lib/migrations/index.d.ts +1 -0
  100. package/src/lib/migrations/index.js +3 -0
  101. package/src/lib/migrations/index.js.map +1 -1
  102. package/src/lib/notification/notification.service.d.ts +1 -1
  103. package/src/lib/notification/notification.service.js +7 -3
  104. package/src/lib/notification/notification.service.js.map +1 -1
  105. package/src/lib/template/dto/expression-designer.dto.d.ts +107 -0
  106. package/src/lib/template/dto/expression-designer.dto.js +415 -0
  107. package/src/lib/template/dto/expression-designer.dto.js.map +1 -0
  108. package/src/lib/template/expression-designer.queries.d.ts +16 -0
  109. package/src/lib/template/expression-designer.queries.js +66 -0
  110. package/src/lib/template/expression-designer.queries.js.map +1 -0
  111. package/src/lib/template/expression-designer.service.d.ts +72 -0
  112. package/src/lib/template/expression-designer.service.js +543 -0
  113. package/src/lib/template/expression-designer.service.js.map +1 -0
  114. package/src/lib/template/index.d.ts +2 -0
  115. package/src/lib/template/index.js +2 -0
  116. package/src/lib/template/index.js.map +1 -1
  117. package/src/lib/template/template.module.js +4 -0
  118. package/src/lib/template/template.module.js.map +1 -1
  119. package/src/lib/template/template.service.d.ts +37 -1
  120. package/src/lib/template/template.service.js +317 -29
  121. package/src/lib/template/template.service.js.map +1 -1
  122. package/src/lib/template/workflow-definition.validator.d.ts +7 -0
  123. package/src/lib/template/workflow-definition.validator.js +26 -2
  124. package/src/lib/template/workflow-definition.validator.js.map +1 -1
  125. package/src/lib/workflow-engine/time-budget.d.ts +13 -0
  126. package/src/lib/workflow-engine/time-budget.js +58 -0
  127. package/src/lib/workflow-engine/time-budget.js.map +1 -0
  128. package/src/lib/workflow-engine/workflow-condition-evaluator.js +12 -12
  129. package/src/lib/workflow-engine/workflow-condition-evaluator.js.map +1 -1
  130. package/src/lib/workflow-engine/workflow-engine.service.d.ts +24 -0
  131. package/src/lib/workflow-engine/workflow-engine.service.js +311 -88
  132. package/src/lib/workflow-engine/workflow-engine.service.js.map +1 -1
  133. package/src/lib/workflow-engine/workflow-form-value.d.ts +11 -0
  134. package/src/lib/workflow-engine/workflow-form-value.js +33 -0
  135. package/src/lib/workflow-engine/workflow-form-value.js.map +1 -0
  136. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.js +4 -0
  137. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.js.map +1 -1
  138. package/src/lib/workflow-webhook/workflow-webhook-delivery.service.d.ts +3 -1
  139. package/src/lib/workflow-webhook/workflow-webhook-delivery.service.js +11 -2
  140. package/src/lib/workflow-webhook/workflow-webhook-delivery.service.js.map +1 -1
  141. package/src/lib/workflow-webhook/workflow-webhook-enqueue.d.ts +8 -1
  142. package/src/lib/workflow-webhook/workflow-webhook-enqueue.js +70 -27
  143. package/src/lib/workflow-webhook/workflow-webhook-enqueue.js.map +1 -1
  144. package/src/lib/workflow-webhook/workflow-webhook-expression.d.ts +57 -0
  145. package/src/lib/workflow-webhook/workflow-webhook-expression.js +123 -0
  146. package/src/lib/workflow-webhook/workflow-webhook-expression.js.map +1 -0
  147. package/src/lib/workflow-webhook/workflow-webhook.module.js +4 -0
  148. package/src/lib/workflow-webhook/workflow-webhook.module.js.map +1 -1
  149. package/src/lib/workflow-webhook/workflow-webhook.validator.d.ts +7 -0
  150. package/src/lib/workflow-webhook/workflow-webhook.validator.js +29 -6
  151. package/src/lib/workflow-webhook/workflow-webhook.validator.js.map +1 -1
@@ -0,0 +1,995 @@
1
+ "use strict";
2
+ /**
3
+ * The expressions the two dialects are compared on (Phase 23 P1 gate: every
4
+ * expression shape that exists in the repo). Each entry names where the shape
5
+ * comes from. `expected` pins what each dialect really does today, so a change
6
+ * in either engine, or in the runtime, fails the real-engine suite instead of
7
+ * silently changing what a dialect upgrade means. Every difference is listed
8
+ * and judged in docs/23 §P1.
9
+ *
10
+ * Sources:
11
+ * - SEED: apps/api/tools/reset-demo-data.ts
12
+ * - DOCS: docs/05, docs/22, docs/24 examples
13
+ * - DESIGNER: expressions the UI writes (form-rendering.ts `form.<key> op
14
+ * literal`, workflow-graph.ts `readConditionExpression`,
15
+ * TemplateDesignerView initiator policy)
16
+ * - FIXTURE: expressions used by the backend and frontend test suites
17
+ * - PROBE: edge cases added to cover the documented differences
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.DIFFERENTIAL_CORPUS = exports.readDifferentialContext = exports.DIFFERENTIAL_BASE_FORM = void 0;
21
+ const MEMBER_CONTEXT = {
22
+ memberId: 'member-101',
23
+ org: { code: 'FIN' },
24
+ orgUnitIds: ['unit-1', 'org-finance'],
25
+ positionIds: ['position-department-head'],
26
+ roles: ['manager', 'admin'],
27
+ };
28
+ exports.DIFFERENTIAL_BASE_FORM = {
29
+ 'a-b': ['x"y'],
30
+ amount: 1_500_000,
31
+ approvalLevel: 2,
32
+ audit: { level: 2 },
33
+ email: 'a@example.com',
34
+ empty: '',
35
+ flag: true,
36
+ invoiceKind: 'B2B',
37
+ invoiceKindNote: 'x',
38
+ items: [
39
+ { name: 'Bolt', qty: 3 },
40
+ { name: 'Nut', qty: 1 },
41
+ ],
42
+ kind: 'general',
43
+ multi: ['A', 'B'],
44
+ note: 'audit',
45
+ nothing: null,
46
+ owner: 'member-201',
47
+ price: 2.5,
48
+ priority: 'urgent',
49
+ qty: 3,
50
+ region: 'TW',
51
+ reviewer: [],
52
+ sec: 'x',
53
+ status: 'account',
54
+ systemName: 'cloud-console',
55
+ tags: ['a', 'b', 'urgent'],
56
+ zero: 0,
57
+ 稅額: 10,
58
+ };
59
+ /** The full context of one entry: every root any use point can read. */
60
+ const readDifferentialContext = (entry) => {
61
+ const form = { ...exports.DIFFERENTIAL_BASE_FORM, ...entry.form };
62
+ return {
63
+ env: { now: '2026-11-07T00:00:00.000Z' },
64
+ form,
65
+ formData: form,
66
+ initiator: MEMBER_CONTEXT,
67
+ instance: {
68
+ id: 'instance-1',
69
+ state: 'RUNNING',
70
+ templateId: 'template-1',
71
+ templateVersionId: 'template-version-1',
72
+ title: 'Purchase',
73
+ },
74
+ lastDecision: entry.lastDecision ?? null,
75
+ principal: { memberId: 'member-200' },
76
+ subject: MEMBER_CONTEXT,
77
+ };
78
+ };
79
+ exports.readDifferentialContext = readDifferentialContext;
80
+ exports.DIFFERENTIAL_CORPUS = [
81
+ {
82
+ id: 'S01',
83
+ source: 'SEED',
84
+ expression: 'form.systemName == "cloud-console"',
85
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
86
+ },
87
+ {
88
+ id: 'D01',
89
+ source: 'DOCS',
90
+ expression: 'form.amount > 1000000',
91
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
92
+ },
93
+ {
94
+ id: 'D02',
95
+ source: 'DOCS',
96
+ expression: 'form.amount < 100000',
97
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
98
+ },
99
+ {
100
+ id: 'D03',
101
+ source: 'DOCS',
102
+ expression: "form.region == 'TW'",
103
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
104
+ },
105
+ {
106
+ id: 'D04',
107
+ source: 'DOCS',
108
+ expression: "form.region in ['TW', 'JP', 'KR']",
109
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
110
+ },
111
+ {
112
+ id: 'D05',
113
+ source: 'DOCS',
114
+ expression: "form.email == 'a@example.com'",
115
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
116
+ },
117
+ {
118
+ id: 'D06',
119
+ source: 'DOCS',
120
+ expression: "form.email.contains('@example.com')",
121
+ expected: { legacy: 'err:EXPRESSION_TYPE_ERROR', v2: 'ok:true' },
122
+ },
123
+ {
124
+ id: 'D07',
125
+ source: 'DOCS',
126
+ expression: 'form.amount >= 100000 && form.amount <= 1000000',
127
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
128
+ },
129
+ {
130
+ id: 'D08',
131
+ source: 'DOCS',
132
+ expression: "lastDecision != null && lastDecision.action == 'RETURNED'",
133
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
134
+ },
135
+ {
136
+ id: 'D09',
137
+ source: 'DOCS',
138
+ expression: "'manager' in initiator.roles",
139
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
140
+ },
141
+ {
142
+ id: 'D10',
143
+ source: 'DOCS',
144
+ expression: "'admin' in subject.roles",
145
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
146
+ },
147
+ {
148
+ id: 'D11',
149
+ source: 'DOCS',
150
+ expression: "form.amount > 100000 && initiator.org.code == 'FIN'",
151
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
152
+ },
153
+ {
154
+ id: 'D12',
155
+ source: 'DOCS',
156
+ expression: "form.priority == 'urgent'",
157
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
158
+ },
159
+ {
160
+ id: 'D13',
161
+ source: 'DOCS',
162
+ expression: "form.region == 'JP' ? 'JP_HEAD' : 'TW_HEAD'",
163
+ expected: { legacy: 'ok:"TW_HEAD"', v2: 'ok:"TW_HEAD"' },
164
+ },
165
+ {
166
+ id: 'D14',
167
+ source: 'DOCS',
168
+ expression: 'form.price * 2',
169
+ expected: { legacy: 'ok:5', v2: 'ok:5' },
170
+ },
171
+ {
172
+ id: 'D15',
173
+ source: 'DOCS',
174
+ expression: 'form.amount + 1',
175
+ expected: { legacy: 'ok:1500001', v2: 'ok:1500001' },
176
+ },
177
+ {
178
+ id: 'D16',
179
+ source: 'DOCS',
180
+ expression: 'form.amount * 2',
181
+ expected: { legacy: 'ok:3000000', v2: 'ok:3000000' },
182
+ },
183
+ {
184
+ id: 'D17',
185
+ source: 'DOCS',
186
+ expression: 'form.amount / 2',
187
+ expected: { legacy: 'ok:750000', v2: 'ok:750000' },
188
+ },
189
+ {
190
+ id: 'D18',
191
+ source: 'DOCS',
192
+ expression: '2 + form.price',
193
+ expected: { legacy: 'ok:4.5', v2: 'ok:4.5' },
194
+ },
195
+ {
196
+ id: 'D19',
197
+ source: 'DOCS',
198
+ expression: 'form.amount * 2 > 1.0',
199
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
200
+ },
201
+ {
202
+ id: 'D20',
203
+ source: 'DOCS',
204
+ expression: 'has(form.missing.deeper)',
205
+ expected: { legacy: 'ok:false', v2: 'err:EXPRESSION_MISSING_KEY' },
206
+ },
207
+ {
208
+ id: 'D21',
209
+ source: 'DOCS',
210
+ expression: 'form.missing == 1 || form.amount > 0',
211
+ expected: { legacy: 'err:EXPRESSION_MISSING_KEY', v2: 'ok:true' },
212
+ },
213
+ {
214
+ id: 'D22',
215
+ source: 'DOCS',
216
+ expression: 'form.missing == 1 && form.amount > 0',
217
+ expected: {
218
+ legacy: 'err:EXPRESSION_MISSING_KEY',
219
+ v2: 'err:EXPRESSION_MISSING_KEY',
220
+ },
221
+ },
222
+ {
223
+ id: 'D23',
224
+ source: 'DOCS',
225
+ expression: 'form.amount < 0 && form.missing == 1',
226
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
227
+ },
228
+ {
229
+ id: 'D24',
230
+ source: 'DOCS',
231
+ expression: 'form["sec"+"ret"]',
232
+ expected: {
233
+ legacy: 'err:EXPRESSION_MISSING_KEY',
234
+ v2: 'err:EXPRESSION_MISSING_KEY',
235
+ },
236
+ },
237
+ {
238
+ id: 'D25',
239
+ source: 'DOCS',
240
+ expression: 'form["sec"]',
241
+ expected: { legacy: 'ok:"x"', v2: 'ok:"x"' },
242
+ },
243
+ {
244
+ id: 'D26',
245
+ source: 'DOCS',
246
+ expression: 'form["hyphen-key"]',
247
+ expected: {
248
+ legacy: 'err:EXPRESSION_MISSING_KEY',
249
+ v2: 'err:EXPRESSION_MISSING_KEY',
250
+ },
251
+ },
252
+ {
253
+ id: 'D27',
254
+ source: 'DOCS',
255
+ expression: 'form.kind == "a" ? 1 : 2',
256
+ expected: { legacy: 'ok:2', v2: 'ok:2' },
257
+ },
258
+ {
259
+ id: 'D28',
260
+ source: 'DOCS',
261
+ expression: 'has(form.flag) ? 1 : 0',
262
+ expected: { legacy: 'ok:1', v2: 'ok:1' },
263
+ },
264
+ {
265
+ id: 'D29',
266
+ source: 'DOCS',
267
+ expression: 'form.items.all(x, x.qty > 0)',
268
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
269
+ },
270
+ {
271
+ id: 'D30',
272
+ source: 'DOCS',
273
+ expression: 'form.constructor',
274
+ expected: {
275
+ legacy: 'err:EXPRESSION_INVALID_RESULT',
276
+ v2: 'err:EXPRESSION_MISSING_KEY',
277
+ },
278
+ },
279
+ {
280
+ id: 'D31',
281
+ source: 'DOCS',
282
+ expression: 'form.toString',
283
+ expected: {
284
+ legacy: 'err:EXPRESSION_INVALID_RESULT',
285
+ v2: 'err:EXPRESSION_MISSING_KEY',
286
+ },
287
+ },
288
+ {
289
+ id: 'D32',
290
+ source: 'DOCS',
291
+ expression: 'form.__proto__',
292
+ expected: {
293
+ legacy: 'err:EXPRESSION_INVALID_RESULT',
294
+ v2: 'err:EXPRESSION_MISSING_KEY',
295
+ },
296
+ },
297
+ {
298
+ id: 'D33',
299
+ source: 'DOCS',
300
+ expression: '{ "title": instance.title, "amount": form.amount }',
301
+ expected: {
302
+ legacy: 'err:EXPRESSION_TYPE_ERROR',
303
+ v2: 'ok:{"amount":1500000,"title":"Purchase"}',
304
+ },
305
+ },
306
+ {
307
+ id: 'G01',
308
+ source: 'DESIGNER',
309
+ expression: 'form.amount > 1000',
310
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
311
+ },
312
+ {
313
+ id: 'G02',
314
+ source: 'DESIGNER',
315
+ expression: 'form.amount == 1500000',
316
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
317
+ },
318
+ {
319
+ id: 'G03',
320
+ source: 'DESIGNER',
321
+ expression: 'form.amount != 0',
322
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
323
+ },
324
+ {
325
+ id: 'G04',
326
+ source: 'DESIGNER',
327
+ expression: 'form.amount >= 1000.5',
328
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
329
+ },
330
+ {
331
+ id: 'G05',
332
+ source: 'DESIGNER',
333
+ expression: 'form.price <= 2.5',
334
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
335
+ },
336
+ {
337
+ id: 'G06',
338
+ source: 'DESIGNER',
339
+ expression: 'form.kind == "general"',
340
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
341
+ },
342
+ {
343
+ id: 'G07',
344
+ source: 'DESIGNER',
345
+ expression: 'form.flag == true',
346
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
347
+ },
348
+ {
349
+ id: 'G08',
350
+ source: 'DESIGNER',
351
+ expression: 'form.flag == false',
352
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
353
+ },
354
+ {
355
+ id: 'G09',
356
+ source: 'DESIGNER',
357
+ expression: 'form.note != null && form.note != ""',
358
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
359
+ },
360
+ {
361
+ id: 'G10',
362
+ source: 'DESIGNER',
363
+ expression: 'form.note == null || form.note == ""',
364
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
365
+ },
366
+ {
367
+ id: 'G11',
368
+ source: 'DESIGNER',
369
+ expression: 'form.empty != null && form.empty != ""',
370
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
371
+ },
372
+ {
373
+ id: 'G12',
374
+ source: 'DESIGNER',
375
+ expression: 'form.items != null && size(form.items) > 0',
376
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
377
+ },
378
+ {
379
+ id: 'G13',
380
+ source: 'DESIGNER',
381
+ expression: 'form.items == null || size(form.items) == 0',
382
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
383
+ },
384
+ {
385
+ id: 'G14',
386
+ source: 'DESIGNER',
387
+ expression: 'form.nothing == null || size(form.nothing) == 0',
388
+ expected: { legacy: 'err:EXPRESSION_TYPE_ERROR', v2: 'ok:true' },
389
+ },
390
+ {
391
+ id: 'G15',
392
+ source: 'DESIGNER',
393
+ expression: 'form.nothing != null && size(form.nothing) > 0',
394
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
395
+ },
396
+ {
397
+ id: 'G16',
398
+ source: 'DESIGNER',
399
+ expression: 'form.reviewer != null && form.reviewer != "" && form.reviewer != []',
400
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
401
+ },
402
+ {
403
+ id: 'G17',
404
+ source: 'DESIGNER',
405
+ expression: 'form.reviewer == null || form.reviewer == "" || form.reviewer == []',
406
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
407
+ },
408
+ {
409
+ id: 'G18',
410
+ source: 'DESIGNER',
411
+ expression: 'form.owner != null && form.owner != "" && form.owner != []',
412
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
413
+ },
414
+ {
415
+ id: 'G19',
416
+ source: 'DESIGNER',
417
+ expression: 'form.multi != null && "A" in form.multi',
418
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
419
+ },
420
+ {
421
+ id: 'G20',
422
+ source: 'DESIGNER',
423
+ expression: '!(form.multi != null && "Z" in form.multi)',
424
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
425
+ },
426
+ {
427
+ id: 'G21',
428
+ source: 'DESIGNER',
429
+ expression: 'form.multi != null && form.multi != []',
430
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
431
+ },
432
+ {
433
+ id: 'G22',
434
+ source: 'DESIGNER',
435
+ expression: 'form.multi == null || form.multi == []',
436
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
437
+ },
438
+ {
439
+ id: 'G23',
440
+ source: 'DESIGNER',
441
+ expression: 'form.nothing != null && "A" in form.nothing',
442
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
443
+ },
444
+ {
445
+ id: 'G24',
446
+ source: 'DESIGNER',
447
+ expression: 'form["稅額"] > 0',
448
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
449
+ },
450
+ {
451
+ id: 'G25',
452
+ source: 'DESIGNER',
453
+ expression: 'form["a-b"] != null && "x\\"y" in form["a-b"]',
454
+ expected: { legacy: 'ok:false', v2: 'ok:true' },
455
+ },
456
+ {
457
+ id: 'G26',
458
+ source: 'DESIGNER',
459
+ expression: '("unit-1" in subject.orgUnitIds || "org-finance" in subject.orgUnitIds)',
460
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
461
+ },
462
+ {
463
+ id: 'G27',
464
+ source: 'DESIGNER',
465
+ expression: '("unit-9" in subject.orgUnitIds) && "position-department-head" in subject.positionIds',
466
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
467
+ },
468
+ {
469
+ id: 'G28',
470
+ source: 'DESIGNER',
471
+ expression: '("unit-1" in subject.orgUnitIds) && "position-department-head" in subject.positionIds',
472
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
473
+ },
474
+ {
475
+ id: 'F01',
476
+ source: 'FIXTURE',
477
+ expression: 'subject.orgUnitIds.size() > 0',
478
+ expected: { legacy: 'err:EXPRESSION_TYPE_ERROR', v2: 'ok:true' },
479
+ },
480
+ {
481
+ id: 'F02',
482
+ source: 'FIXTURE',
483
+ expression: 'form.invoiceKind == "B2B"',
484
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
485
+ },
486
+ {
487
+ id: 'F03',
488
+ source: 'FIXTURE',
489
+ expression: 'form.invoiceKind == "B2B" && form.amount > 10',
490
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
491
+ },
492
+ {
493
+ id: 'F04',
494
+ source: 'FIXTURE',
495
+ expression: 'formData["invoiceKind"] == "B2B"',
496
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
497
+ },
498
+ {
499
+ id: 'F05',
500
+ source: 'FIXTURE',
501
+ expression: 'form.items[0].qty > 3',
502
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
503
+ },
504
+ {
505
+ id: 'F06',
506
+ source: 'FIXTURE',
507
+ expression: 'form.items[0].qty',
508
+ expected: { legacy: 'ok:3', v2: 'ok:3' },
509
+ },
510
+ {
511
+ id: 'F07',
512
+ source: 'FIXTURE',
513
+ expression: 'form.items[5].qty > 1',
514
+ expected: {
515
+ legacy: 'err:EXPRESSION_MISSING_KEY',
516
+ v2: 'err:EXPRESSION_MISSING_KEY',
517
+ },
518
+ },
519
+ {
520
+ id: 'F08',
521
+ source: 'FIXTURE',
522
+ expression: 'form.items[0].missing == null',
523
+ expected: {
524
+ legacy: 'err:EXPRESSION_MISSING_KEY',
525
+ v2: 'err:EXPRESSION_MISSING_KEY',
526
+ },
527
+ },
528
+ {
529
+ id: 'F09',
530
+ source: 'FIXTURE',
531
+ expression: 'form.items.exists(row, row.qty > 2)',
532
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
533
+ },
534
+ {
535
+ id: 'F10',
536
+ source: 'FIXTURE',
537
+ expression: 'form.items.all(row, row.qty >= 0)',
538
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
539
+ },
540
+ {
541
+ id: 'F11',
542
+ source: 'FIXTURE',
543
+ expression: 'form.items.size() > 0',
544
+ expected: { legacy: 'err:EXPRESSION_TYPE_ERROR', v2: 'ok:true' },
545
+ },
546
+ {
547
+ id: 'F12',
548
+ source: 'FIXTURE',
549
+ expression: 'size(form.items) == 2',
550
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
551
+ },
552
+ {
553
+ id: 'F13',
554
+ source: 'FIXTURE',
555
+ expression: 'has(form.items)',
556
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
557
+ },
558
+ {
559
+ id: 'F14',
560
+ source: 'FIXTURE',
561
+ expression: 'has(form.missing)',
562
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
563
+ },
564
+ {
565
+ id: 'F15',
566
+ source: 'FIXTURE',
567
+ expression: 'form.tags != null && "urgent" in form.tags',
568
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
569
+ },
570
+ {
571
+ id: 'F16',
572
+ source: 'FIXTURE',
573
+ expression: 'form.tags == "urgent"',
574
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
575
+ },
576
+ {
577
+ id: 'F17',
578
+ source: 'FIXTURE',
579
+ expression: 'form.amount.currency',
580
+ expected: {
581
+ legacy: 'err:EXPRESSION_MISSING_KEY',
582
+ v2: 'err:EXPRESSION_MISSING_KEY',
583
+ },
584
+ },
585
+ {
586
+ id: 'F18',
587
+ source: 'FIXTURE',
588
+ expression: 'form.audit.level',
589
+ expected: { legacy: 'ok:2', v2: 'ok:2' },
590
+ },
591
+ {
592
+ id: 'F19',
593
+ source: 'FIXTURE',
594
+ expression: 'form.audit.level == 2',
595
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
596
+ },
597
+ {
598
+ id: 'F20',
599
+ source: 'FIXTURE',
600
+ expression: 'form.missing == 1',
601
+ expected: {
602
+ legacy: 'err:EXPRESSION_MISSING_KEY',
603
+ v2: 'err:EXPRESSION_MISSING_KEY',
604
+ },
605
+ },
606
+ {
607
+ id: 'F21',
608
+ source: 'FIXTURE',
609
+ expression: 'size(form.invoiceKind)',
610
+ expected: { legacy: 'ok:3', v2: 'ok:3' },
611
+ },
612
+ {
613
+ id: 'F22',
614
+ source: 'FIXTURE',
615
+ expression: 'form.amount > 0 && formData.amount > 0 && initiator.memberId != principal.memberId && instance.templateId != "" && env.now != ""',
616
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
617
+ },
618
+ {
619
+ id: 'F23',
620
+ source: 'FIXTURE',
621
+ expression: 'lastDecision != null && lastDecision.action == "APPROVED"',
622
+ lastDecision: { action: 'APPROVED' },
623
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
624
+ },
625
+ {
626
+ id: 'F24',
627
+ source: 'FIXTURE',
628
+ expression: 'initiator.memberId == "member-101"',
629
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
630
+ },
631
+ {
632
+ id: 'F25',
633
+ source: 'FIXTURE',
634
+ expression: 'instance.state == "RUNNING"',
635
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
636
+ },
637
+ {
638
+ id: 'F26',
639
+ source: 'FIXTURE',
640
+ expression: 'form.amount / 0',
641
+ expected: {
642
+ legacy: 'err:EXPRESSION_TYPE_ERROR',
643
+ v2: 'err:EXPRESSION_TYPE_ERROR',
644
+ },
645
+ },
646
+ {
647
+ id: 'F27',
648
+ source: 'FIXTURE',
649
+ expression: 'form.email.contains("@")',
650
+ expected: { legacy: 'err:EXPRESSION_TYPE_ERROR', v2: 'ok:true' },
651
+ },
652
+ {
653
+ id: 'F28',
654
+ source: 'FIXTURE',
655
+ expression: 'form.approvalLevel',
656
+ expected: { legacy: 'ok:2', v2: 'ok:2' },
657
+ },
658
+ {
659
+ id: 'F29',
660
+ source: 'FIXTURE',
661
+ expression: 'form.owner',
662
+ expected: { legacy: 'ok:"member-201"', v2: 'ok:"member-201"' },
663
+ },
664
+ {
665
+ id: 'F30',
666
+ source: 'FIXTURE',
667
+ expression: 'form.invoiceKind',
668
+ expected: { legacy: 'ok:"B2B"', v2: 'ok:"B2B"' },
669
+ },
670
+ {
671
+ id: 'F31',
672
+ source: 'FIXTURE',
673
+ expression: 'form.status == "account"',
674
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
675
+ },
676
+ {
677
+ id: 'F32',
678
+ source: 'FIXTURE',
679
+ expression: 'form.amount >= 100000 && form.amount <= 1000000',
680
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
681
+ },
682
+ {
683
+ id: 'F33',
684
+ source: 'FIXTURE',
685
+ expression: 'form.items.map(i, i.qty)',
686
+ expected: { legacy: 'ok:[3,1]', v2: 'ok:[3,1]' },
687
+ },
688
+ {
689
+ id: 'F34',
690
+ source: 'FIXTURE',
691
+ expression: 'size(form.items.map(a, form.items.map(b, a))) > 0',
692
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
693
+ },
694
+ {
695
+ id: 'P01',
696
+ source: 'PROBE',
697
+ expression: '1 == 1.0',
698
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
699
+ },
700
+ {
701
+ id: 'P02',
702
+ source: 'PROBE',
703
+ expression: '2.0 in [1, 2]',
704
+ expected: { legacy: 'ok:true', v2: 'err:EXPRESSION_TYPE_ERROR' },
705
+ },
706
+ {
707
+ id: 'P03',
708
+ source: 'PROBE',
709
+ expression: 'form.qty in [1, 2, 3]',
710
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
711
+ },
712
+ {
713
+ id: 'P04',
714
+ source: 'PROBE',
715
+ expression: '7 / 2',
716
+ expected: { legacy: 'ok:3.5', v2: 'ok:3' },
717
+ },
718
+ {
719
+ id: 'P05',
720
+ source: 'PROBE',
721
+ expression: 'form.qty / 2',
722
+ expected: { legacy: 'ok:1.5', v2: 'ok:1.5' },
723
+ },
724
+ {
725
+ id: 'P06',
726
+ source: 'PROBE',
727
+ expression: '3 / form.price',
728
+ expected: { legacy: 'err:EXPRESSION_TYPE_ERROR', v2: 'ok:1.2' },
729
+ },
730
+ {
731
+ id: 'P07',
732
+ source: 'PROBE',
733
+ expression: '10 - form.price',
734
+ expected: { legacy: 'ok:7.5', v2: 'ok:7.5' },
735
+ },
736
+ {
737
+ id: 'P08',
738
+ source: 'PROBE',
739
+ expression: 'form.price / form.zero',
740
+ expected: {
741
+ legacy: 'err:EXPRESSION_TYPE_ERROR',
742
+ v2: 'err:EXPRESSION_INVALID_RESULT',
743
+ },
744
+ },
745
+ {
746
+ id: 'P09',
747
+ source: 'PROBE',
748
+ expression: 'form.price / 0.0',
749
+ expected: {
750
+ legacy: 'err:EXPRESSION_TYPE_ERROR',
751
+ v2: 'err:EXPRESSION_INVALID_RESULT',
752
+ },
753
+ },
754
+ {
755
+ id: 'P10',
756
+ source: 'PROBE',
757
+ expression: 'form.qty % form.qty',
758
+ expected: { legacy: 'ok:0', v2: 'err:EXPRESSION_TYPE_ERROR' },
759
+ },
760
+ {
761
+ id: 'P11',
762
+ source: 'PROBE',
763
+ expression: '{"a": "x", "b": 2}',
764
+ expected: { legacy: 'err:EXPRESSION_TYPE_ERROR', v2: 'ok:{"a":"x","b":2}' },
765
+ },
766
+ {
767
+ id: 'P12',
768
+ source: 'PROBE',
769
+ expression: '[1, "a"]',
770
+ expected: { legacy: 'ok:[1,"a"]', v2: 'ok:[1,"a"]' },
771
+ },
772
+ {
773
+ id: 'P13',
774
+ source: 'PROBE',
775
+ expression: 'true ? 1 : 2',
776
+ expected: { legacy: 'ok:1', v2: 'ok:1' },
777
+ },
778
+ {
779
+ id: 'P14',
780
+ source: 'PROBE',
781
+ expression: 'form.flag ? form.amount : 0',
782
+ expected: { legacy: 'ok:1500000', v2: 'ok:1500000' },
783
+ },
784
+ {
785
+ id: 'P15',
786
+ source: 'PROBE',
787
+ expression: 'form.note + "!"',
788
+ expected: { legacy: 'ok:"audit!"', v2: 'ok:"audit!"' },
789
+ },
790
+ {
791
+ id: 'P16',
792
+ source: 'PROBE',
793
+ expression: 'form.note + 1',
794
+ expected: {
795
+ legacy: 'err:EXPRESSION_TYPE_ERROR',
796
+ v2: 'err:EXPRESSION_TYPE_ERROR',
797
+ },
798
+ },
799
+ {
800
+ id: 'P17',
801
+ source: 'PROBE',
802
+ expression: 'form.amount > "1"',
803
+ expected: {
804
+ legacy: 'err:EXPRESSION_TYPE_ERROR',
805
+ v2: 'err:EXPRESSION_TYPE_ERROR',
806
+ },
807
+ },
808
+ {
809
+ id: 'P18',
810
+ source: 'PROBE',
811
+ expression: 'form.nothing == null',
812
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
813
+ },
814
+ {
815
+ id: 'P19',
816
+ source: 'PROBE',
817
+ expression: 'form.missing == null',
818
+ expected: {
819
+ legacy: 'err:EXPRESSION_MISSING_KEY',
820
+ v2: 'err:EXPRESSION_MISSING_KEY',
821
+ },
822
+ },
823
+ {
824
+ id: 'P20',
825
+ source: 'PROBE',
826
+ expression: 'null',
827
+ expected: { legacy: 'ok:null', v2: 'ok:null' },
828
+ },
829
+ {
830
+ id: 'P21',
831
+ source: 'PROBE',
832
+ expression: '[1, 2].all(x, x > 0)',
833
+ expected: { legacy: 'err:EXPRESSION_SYNTAX_ERROR', v2: 'ok:true' },
834
+ },
835
+ {
836
+ id: 'P22',
837
+ source: 'PROBE',
838
+ expression: '9007199254740993',
839
+ expected: {
840
+ legacy: 'err:EXPRESSION_INVALID_RESULT',
841
+ v2: 'err:EXPRESSION_INVALID_RESULT',
842
+ },
843
+ },
844
+ {
845
+ id: 'P23',
846
+ source: 'PROBE',
847
+ expression: 'form.amount * 10000000000',
848
+ expected: {
849
+ legacy: 'err:EXPRESSION_INVALID_RESULT',
850
+ v2: 'err:EXPRESSION_INVALID_RESULT',
851
+ },
852
+ },
853
+ {
854
+ id: 'P24',
855
+ source: 'PROBE',
856
+ expression: 'form.email.startsWith("a")',
857
+ expected: { legacy: 'err:EXPRESSION_TYPE_ERROR', v2: 'ok:true' },
858
+ },
859
+ {
860
+ id: 'P25',
861
+ source: 'PROBE',
862
+ expression: 'form.email.matches("^a@")',
863
+ expected: { legacy: 'err:EXPRESSION_TYPE_ERROR', v2: 'ok:true' },
864
+ },
865
+ {
866
+ id: 'P26',
867
+ source: 'PROBE',
868
+ expression: 'string(form.qty)',
869
+ expected: { legacy: 'err:EXPRESSION_TYPE_ERROR', v2: 'ok:"3"' },
870
+ },
871
+ {
872
+ id: 'P27',
873
+ source: 'PROBE',
874
+ expression: 'int(form.price)',
875
+ expected: { legacy: 'err:EXPRESSION_TYPE_ERROR', v2: 'ok:2' },
876
+ },
877
+ {
878
+ id: 'P28',
879
+ source: 'PROBE',
880
+ expression: 'form.multi.filter(x, x == "A").size() == 1',
881
+ expected: { legacy: 'err:EXPRESSION_TYPE_ERROR', v2: 'ok:true' },
882
+ },
883
+ {
884
+ id: 'P29',
885
+ source: 'PROBE',
886
+ expression: 'form.items.exists(row, row.missing == 1)',
887
+ expected: {
888
+ legacy: 'err:EXPRESSION_MISSING_KEY',
889
+ v2: 'err:EXPRESSION_MISSING_KEY',
890
+ },
891
+ },
892
+ {
893
+ id: 'P30',
894
+ source: 'PROBE',
895
+ expression: 'form.multi == ["A", "B"]',
896
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
897
+ },
898
+ {
899
+ id: 'P31',
900
+ source: 'PROBE',
901
+ expression: 'form.audit == {"level": 2}',
902
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
903
+ },
904
+ {
905
+ id: 'P32',
906
+ source: 'PROBE',
907
+ expression: '-form.amount',
908
+ expected: { legacy: 'ok:-1500000', v2: 'ok:-1500000' },
909
+ },
910
+ {
911
+ id: 'P33',
912
+ source: 'PROBE',
913
+ expression: '!form.flag',
914
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
915
+ },
916
+ {
917
+ id: 'P34',
918
+ source: 'PROBE',
919
+ expression: 'form.amount > 1 == true',
920
+ expected: { legacy: 'err:EXPRESSION_SYNTAX_ERROR', v2: 'ok:true' },
921
+ },
922
+ {
923
+ id: 'P35',
924
+ source: 'PROBE',
925
+ expression: 'form.price / form.zero > 1',
926
+ expected: { legacy: 'err:EXPRESSION_TYPE_ERROR', v2: 'ok:true' },
927
+ },
928
+ {
929
+ id: 'P36',
930
+ source: 'PROBE',
931
+ expression: 'size(form.items) / 2',
932
+ expected: { legacy: 'ok:1', v2: 'ok:1' },
933
+ },
934
+ {
935
+ id: 'P37',
936
+ source: 'PROBE',
937
+ expression: 'form.qty in [1, 2.5]',
938
+ expected: { legacy: 'ok:false', v2: 'ok:false' },
939
+ },
940
+ {
941
+ id: 'P38',
942
+ source: 'PROBE',
943
+ expression: '"x\\"y" == "x" + "\\"" + "y"',
944
+ expected: { legacy: 'ok:true', v2: 'ok:true' },
945
+ },
946
+ {
947
+ id: 'P39',
948
+ source: 'PROBE',
949
+ expression: 'size("x\\"y")',
950
+ expected: { legacy: 'ok:4', v2: 'ok:3' },
951
+ },
952
+ {
953
+ id: 'P40',
954
+ source: 'PROBE',
955
+ expression: 'form.missing != null && form.missing == 1',
956
+ expected: {
957
+ legacy: 'err:EXPRESSION_MISSING_KEY',
958
+ v2: 'err:EXPRESSION_MISSING_KEY',
959
+ },
960
+ },
961
+ {
962
+ id: 'P41',
963
+ source: 'PROBE',
964
+ expression: 'true || form.missing == 1',
965
+ expected: { legacy: 'err:EXPRESSION_MISSING_KEY', v2: 'ok:true' },
966
+ },
967
+ {
968
+ id: 'P42',
969
+ source: 'PROBE',
970
+ expression: 'form.missing == 1 || true',
971
+ expected: { legacy: 'err:EXPRESSION_MISSING_KEY', v2: 'ok:true' },
972
+ },
973
+ // Reserved keys written in a map literal. cel-v2 drops them while building
974
+ // the map (`safeFromEntries`), so the walker never sees them; cel-legacy
975
+ // keeps them and the walker refuses the result.
976
+ {
977
+ id: 'P43',
978
+ source: 'PROBE',
979
+ expression: '{"constructor": 1}',
980
+ expected: { legacy: 'err:EXPRESSION_INVALID_RESULT', v2: 'ok:{}' },
981
+ },
982
+ {
983
+ id: 'P44',
984
+ source: 'PROBE',
985
+ expression: '{"__proto__": {"polluted": true}}',
986
+ expected: { legacy: 'err:EXPRESSION_INVALID_RESULT', v2: 'ok:{}' },
987
+ },
988
+ {
989
+ id: 'P45',
990
+ source: 'PROBE',
991
+ expression: '{"a": 1, "prototype": 2}',
992
+ expected: { legacy: 'err:EXPRESSION_INVALID_RESULT', v2: 'ok:{"a":1}' },
993
+ },
994
+ ];
995
+ //# sourceMappingURL=expression-differential.corpus.js.map