@divmain/jdm-asm 0.2.1 → 0.2.3
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/dist/index.js +2227 -29
- package/dist/index.js.map +1 -1
- package/package.json +8 -2
- package/.github/workflows/ci.yml +0 -53
- package/.oxfmtrc.json +0 -16
- package/.oxlintrc.json +0 -183
- package/AGENTS.md +0 -81
- package/asconfig.json +0 -23
- package/benchmarks/fixtures.ts +0 -111
- package/benchmarks/input-fixtures.ts +0 -80
- package/benchmarks/run.ts +0 -913
- package/benchmarks/worker-pool.ts +0 -223
- package/benchmarks/worker.ts +0 -374
- package/scripts/run-all-tests.ts +0 -220
- package/src/compiler/EXPRESSION_SUBSETS.md +0 -228
- package/src/compiler/asc-compiler.ts +0 -315
- package/src/compiler/ast-types.ts +0 -215
- package/src/compiler/build.ts +0 -56
- package/src/compiler/cache.ts +0 -414
- package/src/compiler/code-generators.ts +0 -211
- package/src/compiler/codegen/index.ts +0 -15
- package/src/compiler/codegen/js-marshal.ts +0 -999
- package/src/compiler/codegen/js-validation.ts +0 -243
- package/src/compiler/codegen.ts +0 -19
- package/src/compiler/compile-time-validation.ts +0 -507
- package/src/compiler/cst-visitor.ts +0 -434
- package/src/compiler/errors.ts +0 -227
- package/src/compiler/expression-parser.ts +0 -536
- package/src/compiler/graph.ts +0 -197
- package/src/compiler/index.ts +0 -199
- package/src/compiler/input-validation.ts +0 -33
- package/src/compiler/marshal-gen.ts +0 -21
- package/src/compiler/nodes/context-resolvers.ts +0 -197
- package/src/compiler/nodes/decision-table.ts +0 -507
- package/src/compiler/nodes/decision.ts +0 -292
- package/src/compiler/nodes/expression-compiler.ts +0 -526
- package/src/compiler/nodes/expression.ts +0 -425
- package/src/compiler/nodes/function.ts +0 -316
- package/src/compiler/nodes/input.ts +0 -60
- package/src/compiler/nodes/switch.ts +0 -547
- package/src/compiler/optimizer.ts +0 -948
- package/src/compiler/orchestrator.ts +0 -352
- package/src/compiler/parser.ts +0 -115
- package/src/compiler/result-selection.ts +0 -161
- package/src/compiler/runtime/index.ts +0 -26
- package/src/compiler/runtime-codegen.ts +0 -211
- package/src/compiler/runtime-validation-codegen.ts +0 -294
- package/src/compiler/runtime.ts +0 -452
- package/src/compiler/schema.ts +0 -245
- package/src/compiler/switch-branch-detection.ts +0 -92
- package/src/compiler/types.ts +0 -136
- package/src/compiler/unary-ast-transforms.ts +0 -148
- package/src/compiler/unary-parser.ts +0 -301
- package/src/compiler/unary-transform.ts +0 -161
- package/src/compiler/utils.ts +0 -27
- package/src/compiler/virtual-fs.ts +0 -90
- package/src/compiler/wasm-instantiate.ts +0 -127
- package/src/index.ts +0 -1
- package/src/runtime/arrays.ts +0 -579
- package/src/runtime/context.ts +0 -189
- package/src/runtime/expressions.ts +0 -1811
- package/src/runtime/index.ts +0 -8
- package/src/runtime/memory.ts +0 -607
- package/src/runtime/strings.ts +0 -260
- package/src/runtime/tables.ts +0 -96
- package/src/runtime/tsconfig.json +0 -4
- package/src/runtime/values.ts +0 -209
- package/test-data/README.md +0 -83
- package/test-data/decision-tables/basic/8k.json +0 -87992
- package/test-data/decision-tables/basic/affiliate-commission-calculator.json +0 -228
- package/test-data/decision-tables/basic/airline-loyalty-points-calculations.json +0 -285
- package/test-data/decision-tables/basic/airline-upgrade-eligibility.json +0 -466
- package/test-data/decision-tables/basic/auto-insurance-premium-calculator.json +0 -412
- package/test-data/decision-tables/basic/booking-personalization-system.json +0 -553
- package/test-data/decision-tables/basic/care-team-assignment-system.json +0 -585
- package/test-data/decision-tables/basic/claim-validation-system.json +0 -307
- package/test-data/decision-tables/basic/clinical-lab-result-interpreter.json +0 -433
- package/test-data/decision-tables/basic/clinical-treatment-protocol.json +0 -474
- package/test-data/decision-tables/basic/credit-limit-adjustment.json +0 -479
- package/test-data/decision-tables/basic/customer-eligibility-engine.json +0 -551
- package/test-data/decision-tables/basic/customer-lifetime-value.json +0 -200
- package/test-data/decision-tables/basic/customer-onboarding-kyc-verification.json +0 -611
- package/test-data/decision-tables/basic/customer-service-escalation.json +0 -191
- package/test-data/decision-tables/basic/decision-table-discounts.json +0 -168
- package/test-data/decision-tables/basic/decision-table-shipping.json +0 -398
- package/test-data/decision-tables/basic/delivery-route-optimizer.json +0 -271
- package/test-data/decision-tables/basic/device-compatibility-checker.json +0 -303
- package/test-data/decision-tables/basic/disaster-relief-fund-allocation.json +0 -296
- package/test-data/decision-tables/basic/dynamic-fx-rate-pricing-system.json +0 -237
- package/test-data/decision-tables/basic/dynamic-marketplace-comission-calculator.json +0 -242
- package/test-data/decision-tables/basic/dynamic-shipping-cost-calculator.json +0 -378
- package/test-data/decision-tables/basic/dynamic-tarrif-engine.json +0 -289
- package/test-data/decision-tables/basic/dynamic-ticket-pricing.json +0 -325
- package/test-data/decision-tables/basic/empty-column-with-space.json +0 -100
- package/test-data/decision-tables/basic/empty-column-without-space.json +0 -100
- package/test-data/decision-tables/basic/environment-compliance-assessment.json +0 -386
- package/test-data/decision-tables/basic/expression-table-map.json +0 -313
- package/test-data/decision-tables/basic/flash-sale-eligibility.json +0 -366
- package/test-data/decision-tables/basic/flight-dispatch-decision-system.json +0 -455
- package/test-data/decision-tables/basic/flight-rebooking-fee-calculator.json +0 -406
- package/test-data/decision-tables/basic/government-assistance.json +0 -299
- package/test-data/decision-tables/basic/grant-funding-distribution.json +0 -307
- package/test-data/decision-tables/basic/hazardous-materials-management-system.json +0 -414
- package/test-data/decision-tables/basic/immigration-eligibility-evaluator.json +0 -765
- package/test-data/decision-tables/basic/import-duties-calculator.json +0 -318
- package/test-data/decision-tables/basic/insurance-agent-commission.json +0 -228
- package/test-data/decision-tables/basic/insurance-coverage-calculator.json +0 -362
- package/test-data/decision-tables/basic/insurance-underwriting-risk.json +0 -321
- package/test-data/decision-tables/basic/international-roaming-policy-manager.json +0 -199
- package/test-data/decision-tables/basic/legacy-plan-management.json +0 -434
- package/test-data/decision-tables/basic/marketplace-listing-verification-system.json +0 -334
- package/test-data/decision-tables/basic/medication-dosage-calculator.json +0 -318
- package/test-data/decision-tables/basic/merch-bags.json +0 -171
- package/test-data/decision-tables/basic/municipal-permit-evaluation-system.json +0 -364
- package/test-data/decision-tables/basic/mvno-partner-enablement.json +0 -313
- package/test-data/decision-tables/basic/partner-revenue-sharing.json +0 -244
- package/test-data/decision-tables/basic/payment-routing-and-fee-calculator.json +0 -475
- package/test-data/decision-tables/basic/policy-discount-calculator.json +0 -307
- package/test-data/decision-tables/basic/policy-eligibility-analyzer.json +0 -299
- package/test-data/decision-tables/basic/product-listing-scoring.json +0 -358
- package/test-data/decision-tables/basic/realtime-fraud-detection.json +0 -235
- package/test-data/decision-tables/basic/regional-compliance-manager.json +0 -278
- package/test-data/decision-tables/basic/returns-and-refund-policy.json +0 -366
- package/test-data/decision-tables/basic/returns-processing-system.json +0 -448
- package/test-data/decision-tables/basic/school-district-resource-allocation.json +0 -282
- package/test-data/decision-tables/basic/seat-map-optimization.json +0 -325
- package/test-data/decision-tables/basic/seller-fee-calculator.json +0 -307
- package/test-data/decision-tables/basic/service-level-agreement-enforcement.json +0 -575
- package/test-data/decision-tables/basic/smart-financial-product-matcher.json +0 -249
- package/test-data/decision-tables/basic/supply-chain-risk.json +0 -316
- package/test-data/decision-tables/basic/table-loop.json +0 -93
- package/test-data/decision-tables/basic/table.json +0 -76
- package/test-data/decision-tables/basic/traffic-violation-penalty-calculator.json +0 -436
- package/test-data/decision-tables/basic/transaction-compliance-classifier.json +0 -525
- package/test-data/decision-tables/basic/vehicle-claims-resolution.json +0 -310
- package/test-data/decision-tables/basic/warehouse-storage-location.json +0 -345
- package/test-data/decision-tables/hit-policy-collect/collect-multiple-matches.json +0 -127
- package/test-data/decision-tables/hit-policy-collect/collect-no-match.json +0 -95
- package/test-data/decision-tables/hit-policy-first/first-match.json +0 -103
- package/test-data/decision-tables/hit-policy-first/no-match.json +0 -95
- package/test-data/decision-tables/hit-policy-output-order/output-order-respected.json +0 -94
- package/test-data/decision-tables/hit-policy-output-order/string-output-order.json +0 -94
- package/test-data/decision-tables/hit-policy-priority/priority-respected.json +0 -86
- package/test-data/decision-tables/hit-policy-rule-order/rule-order-respected.json +0 -94
- package/test-data/decision-tables/hit-policy-unique/all-match-error.json +0 -89
- package/test-data/decision-tables/hit-policy-unique/multiple-match-error.json +0 -89
- package/test-data/decision-tables/hit-policy-unique/no-match.json +0 -88
- package/test-data/decision-tables/hit-policy-unique/unique-match.json +0 -99
- package/test-data/expressions/arithmetic/error-cyclic.json +0 -114
- package/test-data/expressions/arithmetic/error-missing-input.json +0 -54
- package/test-data/expressions/arithmetic/error-missing-output.json +0 -54
- package/test-data/expressions/arithmetic/expression-default.json +0 -93
- package/test-data/expressions/arithmetic/expression-fields.json +0 -94
- package/test-data/expressions/arithmetic/expression-loop.json +0 -94
- package/test-data/expressions/arithmetic/expression-passthrough.json +0 -108
- package/test-data/expressions/arithmetic/expression.json +0 -69
- package/test-data/expressions/arithmetic/nested-request.json +0 -125
- package/test-data/expressions/arithmetic/number-function.json +0 -58
- package/test-data/expressions/arithmetic/test-number-functions.json +0 -68
- package/test-data/expressions/functions/all.json +0 -149
- package/test-data/expressions/functions/avg.json +0 -89
- package/test-data/expressions/functions/filter.json +0 -109
- package/test-data/expressions/functions/flat.json +0 -167
- package/test-data/expressions/functions/map-strings.json +0 -65
- package/test-data/expressions/functions/map.json +0 -73
- package/test-data/expressions/functions/reduce.json +0 -49
- package/test-data/expressions/functions/some.json +0 -175
- package/test-data/expressions/functions/sort-strings.json +0 -97
- package/test-data/expressions/functions/sort.json +0 -97
- package/test-data/expressions/logical/logical-and.json +0 -116
- package/test-data/expressions/logical/logical-complex.json +0 -260
- package/test-data/expressions/logical/logical-not.json +0 -111
- package/test-data/expressions/logical/logical-or.json +0 -123
- package/test-data/expressions/string/string-comparison.json +0 -128
- package/test-data/expressions/string/string-concat.json +0 -106
- package/test-data/expressions/string/string-contains.json +0 -125
- package/test-data/expressions/string/string-endsWith.json +0 -113
- package/test-data/expressions/string/string-indexOf.json +0 -131
- package/test-data/expressions/string/string-join.json +0 -92
- package/test-data/expressions/string/string-lower.json +0 -94
- package/test-data/expressions/string/string-replace.json +0 -130
- package/test-data/expressions/string/string-split.json +0 -101
- package/test-data/expressions/string/string-startsWith.json +0 -113
- package/test-data/expressions/string/string-substring.json +0 -138
- package/test-data/expressions/string/string-trim.json +0 -100
- package/test-data/expressions/string/string-upper.json +0 -94
- package/test-data/other/custom.json +0 -51
- package/test-data/other/customer-input-schema.json +0 -34
- package/test-data/other/customer-output-schema.json +0 -34
- package/test-data/other/passthrough.json +0 -31
- package/test-data/sub-decisions/basic/$nodes-child.json +0 -31
- package/test-data/sub-decisions/basic/$nodes-parent.json +0 -49
- package/test-data/sub-decisions/basic/recursive-table1.json +0 -49
- package/test-data/sub-decisions/basic/recursive-table2.json +0 -49
- package/test-data/sub-decisions/complex-multi/approval-decision.json +0 -31
- package/test-data/sub-decisions/complex-multi/complex-dag.json +0 -175
- package/test-data/sub-decisions/complex-multi/credit-check.json +0 -31
- package/test-data/sub-decisions/complex-multi/customer-segmentation.json +0 -31
- package/test-data/sub-decisions/complex-multi/discount-eligibility.json +0 -31
- package/test-data/sub-decisions/complex-multi/eligibility-check.json +0 -31
- package/test-data/sub-decisions/complex-multi/final-offer.json +0 -31
- package/test-data/sub-decisions/complex-multi/income-verification.json +0 -31
- package/test-data/sub-decisions/complex-multi/linear-chain.json +0 -121
- package/test-data/sub-decisions/complex-multi/pricing-calculation.json +0 -31
- package/test-data/sub-decisions/complex-multi/product-eligibility.json +0 -31
- package/test-data/sub-decisions/complex-multi/risk-assessment.json +0 -31
- package/test-data/sub-decisions/complex-multi/shared-validation.json +0 -31
- package/test-data/sub-decisions/complex-multi/validation.json +0 -31
- package/test-data/sub-decisions/diamond/decision-a.json +0 -31
- package/test-data/sub-decisions/diamond/decision-b.json +0 -31
- package/test-data/sub-decisions/diamond/decision-c.json +0 -31
- package/test-data/sub-decisions/diamond/decision-shared.json +0 -31
- package/test-data/sub-decisions/diamond/diamond-pattern.json +0 -109
- package/test-data/sub-decisions/error-propagation/parent-calls-error.json +0 -44
- package/test-data/sub-decisions/error-propagation/sub-decision-with-error.json +0 -60
- package/test-data/switch-nodes/basic/account-dormancy-management.json +0 -245
- package/test-data/switch-nodes/basic/application-risk-assessment.json +0 -474
- package/test-data/switch-nodes/basic/cellular-data-rollover-system.json +0 -281
- package/test-data/switch-nodes/basic/clinical-pathway-selection.json +0 -454
- package/test-data/switch-nodes/basic/insurance-prior-authorization.json +0 -467
- package/test-data/switch-nodes/basic/last-mile-delivery-assignment.json +0 -373
- package/test-data/switch-nodes/basic/loan-approval.json +0 -469
- package/test-data/switch-nodes/basic/multi-switch.json +0 -498
- package/test-data/switch-nodes/basic/online-checkin-eligibility.json +0 -285
- package/test-data/switch-nodes/basic/order-consolidation-system.json +0 -493
- package/test-data/switch-nodes/basic/seller-approval-workflow.json +0 -383
- package/test-data/switch-nodes/basic/set-fee.json +0 -243
- package/test-data/switch-nodes/basic/shipping-carrier-selector.json +0 -379
- package/test-data/switch-nodes/basic/switch-node.json +0 -167
- package/test-data/switch-nodes/basic/switch-performance-2.json +0 -1307
- package/test-data/switch-nodes/basic/switch-performance.json +0 -691
- package/test-data/switch-nodes/basic/tax-exemption.json +0 -295
- package/test-data/switch-nodes/basic/warehouse-cross-docking.json +0 -313
- package/test-data/switch-nodes/default-cases/switch-with-default.json +0 -134
- package/test-data/zen-reference/$nodes-child.json +0 -69
- package/test-data/zen-reference/$nodes-parent.json +0 -34
- package/test-data/zen-reference/8k.json +0 -87992
- package/test-data/zen-reference/credit-analysis.json +0 -324
- package/test-data/zen-reference/custom.json +0 -51
- package/test-data/zen-reference/customer-input-schema.json +0 -34
- package/test-data/zen-reference/customer-output-schema.json +0 -34
- package/test-data/zen-reference/error-cyclic.json +0 -114
- package/test-data/zen-reference/error-missing-input.json +0 -54
- package/test-data/zen-reference/error-missing-output.json +0 -54
- package/test-data/zen-reference/expression.json +0 -69
- package/test-data/zen-reference/function-v2.json +0 -48
- package/test-data/zen-reference/function.json +0 -46
- package/test-data/zen-reference/graphs/account-dormancy-management.json +0 -245
- package/test-data/zen-reference/graphs/affiliate-commission-calculator.json +0 -228
- package/test-data/zen-reference/graphs/airline-loyalty-points-calculations.json +0 -285
- package/test-data/zen-reference/graphs/airline-upgrade-eligibility.json +0 -466
- package/test-data/zen-reference/graphs/aml.json +0 -537
- package/test-data/zen-reference/graphs/application-risk-assessment.json +0 -474
- package/test-data/zen-reference/graphs/auto-insurance-premium-calculator.json +0 -412
- package/test-data/zen-reference/graphs/booking-personalization-system.json +0 -553
- package/test-data/zen-reference/graphs/care-team-assignment-system.json +0 -585
- package/test-data/zen-reference/graphs/cellular-data-rollover-system.json +0 -281
- package/test-data/zen-reference/graphs/claim-validation-system.json +0 -307
- package/test-data/zen-reference/graphs/clinical-lab-result-interpreter.json +0 -433
- package/test-data/zen-reference/graphs/clinical-pathway-selection.json +0 -454
- package/test-data/zen-reference/graphs/clinical-treatment-protocol.json +0 -474
- package/test-data/zen-reference/graphs/company-analysis.json +0 -390
- package/test-data/zen-reference/graphs/credit-limit-adjustment.json +0 -479
- package/test-data/zen-reference/graphs/customer-eligibility-engine.json +0 -551
- package/test-data/zen-reference/graphs/customer-lifetime-value.json +0 -200
- package/test-data/zen-reference/graphs/customer-onboarding-kyc-verification.json +0 -611
- package/test-data/zen-reference/graphs/customer-service-escalation.json +0 -191
- package/test-data/zen-reference/graphs/decision-table-discounts.json +0 -168
- package/test-data/zen-reference/graphs/decision-table-shipping.json +0 -398
- package/test-data/zen-reference/graphs/delivery-route-optimizer.json +0 -271
- package/test-data/zen-reference/graphs/device-compatibility-checker.json +0 -303
- package/test-data/zen-reference/graphs/disaster-relief-fund-allocation.json +0 -296
- package/test-data/zen-reference/graphs/dynamic-fx-rate-pricing-system.json +0 -237
- package/test-data/zen-reference/graphs/dynamic-marketplace-comission-calculator.json +0 -242
- package/test-data/zen-reference/graphs/dynamic-shipping-cost-calculator.json +0 -378
- package/test-data/zen-reference/graphs/dynamic-tarrif-engine.json +0 -289
- package/test-data/zen-reference/graphs/dynamic-ticket-pricing.json +0 -325
- package/test-data/zen-reference/graphs/empty-column-with-space.json +0 -100
- package/test-data/zen-reference/graphs/empty-column-without-space.json +0 -100
- package/test-data/zen-reference/graphs/environment-compliance-assessment.json +0 -386
- package/test-data/zen-reference/graphs/expression-default.json +0 -93
- package/test-data/zen-reference/graphs/expression-fields.json +0 -94
- package/test-data/zen-reference/graphs/expression-loop.json +0 -94
- package/test-data/zen-reference/graphs/expression-passthrough.json +0 -108
- package/test-data/zen-reference/graphs/expression-table-map.json +0 -313
- package/test-data/zen-reference/graphs/flash-sale-eligibility.json +0 -366
- package/test-data/zen-reference/graphs/flight-dispatch-decision-system.json +0 -455
- package/test-data/zen-reference/graphs/flight-rebooking-fee-calculator.json +0 -406
- package/test-data/zen-reference/graphs/government-assistance.json +0 -299
- package/test-data/zen-reference/graphs/grant-funding-distribution.json +0 -307
- package/test-data/zen-reference/graphs/hazardous-materials-management-system.json +0 -414
- package/test-data/zen-reference/graphs/immigration-eligibility-evaluator.json +0 -765
- package/test-data/zen-reference/graphs/import-duties-calculator.json +0 -318
- package/test-data/zen-reference/graphs/insurance-agent-commission.json +0 -228
- package/test-data/zen-reference/graphs/insurance-breakdown.json +0 -421
- package/test-data/zen-reference/graphs/insurance-coverage-calculator.json +0 -362
- package/test-data/zen-reference/graphs/insurance-prior-authorization.json +0 -467
- package/test-data/zen-reference/graphs/insurance-underwriting-risk.json +0 -321
- package/test-data/zen-reference/graphs/international-roaming-policy-manager.json +0 -199
- package/test-data/zen-reference/graphs/last-mile-delivery-assignment.json +0 -373
- package/test-data/zen-reference/graphs/legacy-plan-management.json +0 -434
- package/test-data/zen-reference/graphs/loan-approval.json +0 -469
- package/test-data/zen-reference/graphs/marketplace-listing-verification-system.json +0 -334
- package/test-data/zen-reference/graphs/medication-dosage-calculator.json +0 -318
- package/test-data/zen-reference/graphs/merch-bags.json +0 -171
- package/test-data/zen-reference/graphs/multi-switch.json +0 -498
- package/test-data/zen-reference/graphs/municipal-permit-evaluation-system.json +0 -364
- package/test-data/zen-reference/graphs/mvno-partner-enablement.json +0 -313
- package/test-data/zen-reference/graphs/nested-request.json +0 -125
- package/test-data/zen-reference/graphs/online-checkin-eligibility.json +0 -285
- package/test-data/zen-reference/graphs/order-consolidation-system.json +0 -493
- package/test-data/zen-reference/graphs/partner-revenue-sharing.json +0 -244
- package/test-data/zen-reference/graphs/payment-routing-and-fee-calculator.json +0 -475
- package/test-data/zen-reference/graphs/policy-discount-calculator.json +0 -307
- package/test-data/zen-reference/graphs/policy-eligibility-analyzer.json +0 -299
- package/test-data/zen-reference/graphs/product-listing-scoring.json +0 -358
- package/test-data/zen-reference/graphs/realtime-fraud-detection.json +0 -235
- package/test-data/zen-reference/graphs/regional-compliance-manager.json +0 -278
- package/test-data/zen-reference/graphs/returns-and-refund-policy.json +0 -366
- package/test-data/zen-reference/graphs/returns-processing-system.json +0 -448
- package/test-data/zen-reference/graphs/school-district-resource-allocation.json +0 -282
- package/test-data/zen-reference/graphs/seat-map-optimization.json +0 -325
- package/test-data/zen-reference/graphs/seller-approval-workflow.json +0 -383
- package/test-data/zen-reference/graphs/seller-fee-calculator.json +0 -307
- package/test-data/zen-reference/graphs/service-level-agreement-enforcement.json +0 -575
- package/test-data/zen-reference/graphs/set-fee.json +0 -243
- package/test-data/zen-reference/graphs/shipping-carrier-selector.json +0 -379
- package/test-data/zen-reference/graphs/smart-financial-product-matcher.json +0 -249
- package/test-data/zen-reference/graphs/supply-chain-risk.json +0 -316
- package/test-data/zen-reference/graphs/table-loop.json +0 -93
- package/test-data/zen-reference/graphs/tax-exemption.json +0 -295
- package/test-data/zen-reference/graphs/traffic-violation-penalty-calculator.json +0 -436
- package/test-data/zen-reference/graphs/transaction-compliance-classifier.json +0 -525
- package/test-data/zen-reference/graphs/vehicle-claims-resolution.json +0 -310
- package/test-data/zen-reference/graphs/warehouse-cross-docking.json +0 -313
- package/test-data/zen-reference/graphs/warehouse-storage-location.json +0 -345
- package/test-data/zen-reference/http-function.json +0 -34
- package/test-data/zen-reference/infinite-function.json +0 -46
- package/test-data/zen-reference/js/imports.js +0 -25
- package/test-data/zen-reference/passthrough.json +0 -31
- package/test-data/zen-reference/recursive-table1.json +0 -49
- package/test-data/zen-reference/recursive-table2.json +0 -49
- package/test-data/zen-reference/sleep-function.json +0 -34
- package/test-data/zen-reference/switch-node.json +0 -167
- package/test-data/zen-reference/switch-performance-2.json +0 -1307
- package/test-data/zen-reference/switch-performance.json +0 -691
- package/test-data/zen-reference/table.json +0 -76
- package/tests/helpers/index.ts +0 -73
- package/tests/helpers/mock-context.ts +0 -231
- package/tests/helpers/round-trip.ts +0 -398
- package/tests/helpers/test-harness-comparison.ts +0 -325
- package/tests/helpers/test-harness-wasm.ts +0 -710
- package/tests/helpers/test-harness.ts +0 -28
- package/tests/helpers/wasm-test.ts +0 -659
- package/tests/integration/compilation-errors.test.ts +0 -864
- package/tests/integration/decision-tables.test.ts +0 -531
- package/tests/integration/edge-cases.test.ts +0 -787
- package/tests/integration/expressions.test.ts +0 -513
- package/tests/integration/function-node-integration.test.ts +0 -182
- package/tests/integration/sub-decisions.test.ts +0 -108
- package/tests/integration/switch-nodes.test.ts +0 -399
- package/tests/integration/unary-or-matching.test.ts +0 -53
- package/tests/integration/wasm-data-types.test.ts +0 -398
- package/tests/integration/wasm-errors.test.ts +0 -199
- package/tests/integration/wasm-execution.test.ts +0 -348
- package/tests/integration/wasm-memory.test.ts +0 -228
- package/tests/scripts/analyze-coverage.ts +0 -166
- package/tests/scripts/categorize-tests.ts +0 -396
- package/tests/scripts/coverage-analysis.ts +0 -836
- package/tests/unit/compiler/cache.test.ts +0 -238
- package/tests/unit/compiler/errors.test.ts +0 -316
- package/tests/unit/compiler/graph-scalability.test.ts +0 -510
- package/tests/unit/compiler/graph.test.ts +0 -878
- package/tests/unit/compiler/input-validation.test.ts +0 -447
- package/tests/unit/compiler/logical-and-parser.test.ts +0 -143
- package/tests/unit/compiler/logical-not-parser.test.ts +0 -107
- package/tests/unit/compiler/logical-or-parser.test.ts +0 -236
- package/tests/unit/compiler/marshal-gen/marshal-gen.test.ts +0 -97
- package/tests/unit/compiler/nodes/decision-table.test.ts +0 -103
- package/tests/unit/compiler/nodes/decision.test.ts +0 -182
- package/tests/unit/compiler/nodes/function-compile.test.ts +0 -204
- package/tests/unit/compiler/nodes/function.test.ts +0 -176
- package/tests/unit/compiler/nodes/input.test.ts +0 -30
- package/tests/unit/compiler/nodes/switch.test.ts +0 -127
- package/tests/unit/compiler/optimizer-cache.test.ts +0 -327
- package/tests/unit/compiler/optimizer-implementation.test.ts +0 -625
- package/tests/unit/compiler/parser.test.ts +0 -508
- package/tests/unit/compiler/runtime-error-cleanup.test.ts +0 -426
- package/tests/unit/compiler/runtime-validation.test.ts +0 -303
- package/tests/unit/compiler/runtime.test.ts +0 -221
- package/tests/unit/compiler/schema/schema.test.ts +0 -248
- package/tests/unit/compiler/unary-ast-transforms.test.ts +0 -245
- package/tsconfig.json +0 -27
- package/tsup.config.ts +0 -11
- package/vitest.config.ts +0 -12
|
@@ -1,526 +0,0 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// Expression AST Compiler
|
|
3
|
-
// ============================================================================
|
|
4
|
-
//
|
|
5
|
-
// This module provides the core expression compilation functionality for
|
|
6
|
-
// transforming expression ASTs into AssemblyScript code. It uses the
|
|
7
|
-
// ContextResolver strategy pattern to handle different compilation contexts.
|
|
8
|
-
|
|
9
|
-
import type {
|
|
10
|
-
ExpressionAST,
|
|
11
|
-
BinaryOp,
|
|
12
|
-
UnaryOp,
|
|
13
|
-
NumberLiteral,
|
|
14
|
-
StringLiteral,
|
|
15
|
-
BooleanLiteral,
|
|
16
|
-
Identifier,
|
|
17
|
-
TernaryOp,
|
|
18
|
-
MemberAccess,
|
|
19
|
-
IndexAccess,
|
|
20
|
-
FunctionCall,
|
|
21
|
-
Interval,
|
|
22
|
-
TemplateLiteral,
|
|
23
|
-
ArrayLiteral,
|
|
24
|
-
ObjectLiteral,
|
|
25
|
-
} from '../ast-types';
|
|
26
|
-
import type { CompilationContext } from '../types';
|
|
27
|
-
import type { ContextResolver } from './context-resolvers';
|
|
28
|
-
import { StandardContextResolver } from './context-resolvers';
|
|
29
|
-
|
|
30
|
-
// ============================================================================
|
|
31
|
-
// Unified Expression Compiler
|
|
32
|
-
// ============================================================================
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Compile an expression AST using the provided context resolver strategy.
|
|
36
|
-
*
|
|
37
|
-
* This is the single unified implementation that handles all expression compilation.
|
|
38
|
-
* The resolver parameter determines how identifiers, $, and # are resolved.
|
|
39
|
-
*
|
|
40
|
-
* @param ast - The AST node to compile
|
|
41
|
-
* @param context - The compilation context
|
|
42
|
-
* @param resolver - The context resolution strategy
|
|
43
|
-
* @returns AssemblyScript code string that produces a Value
|
|
44
|
-
*/
|
|
45
|
-
export function compileExpressionUnified(
|
|
46
|
-
ast: ExpressionAST,
|
|
47
|
-
context: CompilationContext,
|
|
48
|
-
resolver: ContextResolver,
|
|
49
|
-
): string {
|
|
50
|
-
switch (ast.type) {
|
|
51
|
-
case 'NumberLiteral':
|
|
52
|
-
return `Value.Float(${(ast as NumberLiteral).value})`;
|
|
53
|
-
|
|
54
|
-
case 'StringLiteral':
|
|
55
|
-
return `Value.String("${escapeString((ast as StringLiteral).value)}")`;
|
|
56
|
-
|
|
57
|
-
case 'BooleanLiteral':
|
|
58
|
-
return `Value.Bool(${(ast as BooleanLiteral).value})`;
|
|
59
|
-
|
|
60
|
-
case 'NullLiteral':
|
|
61
|
-
return `Value.Null()`;
|
|
62
|
-
|
|
63
|
-
case 'Identifier':
|
|
64
|
-
return resolver.resolveIdentifier((ast as Identifier).name);
|
|
65
|
-
|
|
66
|
-
case 'DollarRef':
|
|
67
|
-
return resolver.resolveDollarRef();
|
|
68
|
-
|
|
69
|
-
case 'HashRef':
|
|
70
|
-
return resolver.resolveHashRef();
|
|
71
|
-
|
|
72
|
-
case 'BinaryOp': {
|
|
73
|
-
const bop = ast as BinaryOp;
|
|
74
|
-
const left = compileExpressionUnified(bop.left, context, resolver);
|
|
75
|
-
const right = compileExpressionUnified(bop.right, context, resolver);
|
|
76
|
-
return compileBinaryOpWithValues(bop.op, left, right);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
case 'UnaryOp': {
|
|
80
|
-
const uop = ast as UnaryOp;
|
|
81
|
-
const operand = compileExpressionUnified(uop.operand, context, resolver);
|
|
82
|
-
switch (uop.op) {
|
|
83
|
-
case 'not':
|
|
84
|
-
return `Value.Bool(!(${operand}).asBool())`;
|
|
85
|
-
case '-':
|
|
86
|
-
return `negateValue(${operand})`;
|
|
87
|
-
default:
|
|
88
|
-
throw new Error(`Unknown unary operator: ${uop.op}`);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
case 'TernaryOp': {
|
|
93
|
-
const top = ast as TernaryOp;
|
|
94
|
-
const cond = compileExpressionUnified(top.condition, context, resolver);
|
|
95
|
-
const cons = compileExpressionUnified(top.consequent, context, resolver);
|
|
96
|
-
const alt = compileExpressionUnified(top.alternate, context, resolver);
|
|
97
|
-
return `(${cond}.asBool() ? ${cons} : ${alt})`;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
case 'MemberAccess': {
|
|
101
|
-
const ma = ast as MemberAccess;
|
|
102
|
-
// Handle $.property.subproperty - look up in appropriate context
|
|
103
|
-
const dollarPath = buildDollarPath(ma);
|
|
104
|
-
if (dollarPath) {
|
|
105
|
-
return resolver.resolveDollarPath(dollarPath);
|
|
106
|
-
}
|
|
107
|
-
// Check if this is a $nodes reference
|
|
108
|
-
if (checkIsNodesReference(ma)) {
|
|
109
|
-
const nodesPath = buildNodesPath(ma);
|
|
110
|
-
return resolver.resolveNodesPath(nodesPath);
|
|
111
|
-
}
|
|
112
|
-
// For other member access, use getProperty helper
|
|
113
|
-
const obj = compileExpressionUnified(ma.object, context, resolver);
|
|
114
|
-
return `getProperty(${obj}, "${ma.property}")`;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
case 'IndexAccess': {
|
|
118
|
-
const ia = ast as IndexAccess;
|
|
119
|
-
const arr = compileExpressionUnified(ia.object, context, resolver);
|
|
120
|
-
const idx = compileExpressionUnified(ia.index, context, resolver);
|
|
121
|
-
return `getIndex(${arr}, ${idx})`;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
case 'FunctionCall': {
|
|
125
|
-
const fc = ast as FunctionCall;
|
|
126
|
-
if (fc.callee.type === 'Identifier') {
|
|
127
|
-
const name = (fc.callee as Identifier).name;
|
|
128
|
-
|
|
129
|
-
// Higher-order functions need special handling
|
|
130
|
-
if (name === 'filter') {
|
|
131
|
-
return compileHigherOrderCall(fc, context, resolver, 'filter');
|
|
132
|
-
}
|
|
133
|
-
if (name === 'map') {
|
|
134
|
-
return compileHigherOrderCall(fc, context, resolver, 'map');
|
|
135
|
-
}
|
|
136
|
-
if (name === 'reduce') {
|
|
137
|
-
return compileHigherOrderCall(fc, context, resolver, 'reduce');
|
|
138
|
-
}
|
|
139
|
-
if (name === 'all') {
|
|
140
|
-
return compileHigherOrderCall(fc, context, resolver, 'all');
|
|
141
|
-
}
|
|
142
|
-
if (name === 'some') {
|
|
143
|
-
return compileHigherOrderCall(fc, context, resolver, 'some');
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// Regular function call
|
|
147
|
-
const args = fc.args.map((arg) => compileExpressionUnified(arg, context, resolver));
|
|
148
|
-
const numArgs = args.length;
|
|
149
|
-
|
|
150
|
-
// AssemblyScript requires typed array constructors
|
|
151
|
-
if (numArgs === 1) {
|
|
152
|
-
return `evaluateFunction("${name}", makeArgs1(${args[0]}))`;
|
|
153
|
-
} else if (numArgs === 2) {
|
|
154
|
-
return `evaluateFunction("${name}", makeArgs2(${args[0]}, ${args[1]}))`;
|
|
155
|
-
} else if (numArgs === 3) {
|
|
156
|
-
return `evaluateFunction("${name}", makeArgs3(${args[0]}, ${args[1]}, ${args[2]}))`;
|
|
157
|
-
} else {
|
|
158
|
-
return `evaluateFunction("${name}", [${args.join(', ')}])`;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
throw new Error('Only direct function calls are supported');
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
case 'Interval': {
|
|
165
|
-
const intv = ast as Interval;
|
|
166
|
-
const start = compileExpressionUnified(intv.start, context, resolver);
|
|
167
|
-
const end = compileExpressionUnified(intv.end, context, resolver);
|
|
168
|
-
return `createInterval(${start}, ${end}, ${intv.startInclusive}, ${intv.endInclusive})`;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
case 'ArrayLiteral': {
|
|
172
|
-
const al = ast as ArrayLiteral;
|
|
173
|
-
if (al.elements.length === 0) {
|
|
174
|
-
return 'Value.Array(new Array<Value>(0))';
|
|
175
|
-
}
|
|
176
|
-
const elements = al.elements.map((e) => compileExpressionUnified(e, context, resolver));
|
|
177
|
-
return `Value.Array([${elements.join(', ')}])`;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
case 'ObjectLiteral': {
|
|
181
|
-
const ol = ast as ObjectLiteral;
|
|
182
|
-
if (ol.properties.length === 0) {
|
|
183
|
-
return 'Value.Object(new Map<string, Value>())';
|
|
184
|
-
}
|
|
185
|
-
// Generate a helper function for object construction
|
|
186
|
-
const childResolver = resolver.createChildResolver();
|
|
187
|
-
const helperId = context.getUniqueId('object');
|
|
188
|
-
const props = ol.properties.map((p) => {
|
|
189
|
-
const value = compileExpressionUnified(p.value, context, childResolver);
|
|
190
|
-
return ` objResult.set("${p.key}", ${value});`;
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
const helperCode = `
|
|
194
|
-
function objectHelper_${helperId}(ctx: Context${resolver.getHelperParams()}): Value {
|
|
195
|
-
const objResult = new Map<string, Value>();
|
|
196
|
-
${props.join('\n')}
|
|
197
|
-
return Value.Object(objResult);
|
|
198
|
-
}`;
|
|
199
|
-
context.helperFunctions.set(`objectHelper_${helperId}`, helperCode);
|
|
200
|
-
return `objectHelper_${helperId}(ctx${resolver.getHelperArgs()})`;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
case 'TemplateLiteral': {
|
|
204
|
-
const tl = ast as TemplateLiteral;
|
|
205
|
-
const parts = tl.parts.map((part) => {
|
|
206
|
-
if ('text' in part) {
|
|
207
|
-
return `"${escapeString(part.text)}"`;
|
|
208
|
-
} else {
|
|
209
|
-
return `(${compileExpressionUnified(part.expr, context, resolver)}).asString()`;
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
if (parts.length === 0) {
|
|
213
|
-
return 'Value.String("")';
|
|
214
|
-
}
|
|
215
|
-
if (parts.length === 1) {
|
|
216
|
-
return `Value.String(${parts[0]})`;
|
|
217
|
-
}
|
|
218
|
-
return `Value.String(${parts.join(' + ')})`;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
default:
|
|
222
|
-
throw new Error(`Unsupported expression type: ${(ast as any).type}`);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
// ============================================================================
|
|
227
|
-
// Higher-Order Function Compilation
|
|
228
|
-
// ============================================================================
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Compile a higher-order function call (filter, map, reduce, all, some).
|
|
232
|
-
*
|
|
233
|
-
* These functions iterate over arrays and need helper functions that set # for each element.
|
|
234
|
-
* The resolver's child resolver is used inside the helper to maintain proper scoping.
|
|
235
|
-
*/
|
|
236
|
-
function compileHigherOrderCall(
|
|
237
|
-
ast: FunctionCall,
|
|
238
|
-
context: CompilationContext,
|
|
239
|
-
resolver: ContextResolver,
|
|
240
|
-
fnName: 'filter' | 'map' | 'reduce' | 'all' | 'some',
|
|
241
|
-
): string {
|
|
242
|
-
const expectedArgs = fnName === 'reduce' ? 3 : 2;
|
|
243
|
-
if (ast.args.length !== expectedArgs) {
|
|
244
|
-
throw new Error(
|
|
245
|
-
`${fnName}() requires exactly ${expectedArgs} arguments, got ${ast.args.length}`,
|
|
246
|
-
);
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
const arrayExpr = ast.args[0];
|
|
250
|
-
const lambdaExpr = ast.args[1];
|
|
251
|
-
|
|
252
|
-
// Compile array expression with current resolver
|
|
253
|
-
const arrayCode = compileExpressionUnified(arrayExpr, context, resolver);
|
|
254
|
-
|
|
255
|
-
// Use child resolver for lambda (maintains access to outer scope)
|
|
256
|
-
const childResolver = resolver.createChildResolver();
|
|
257
|
-
const lambdaCode = compileExpressionUnified(lambdaExpr, context, childResolver);
|
|
258
|
-
|
|
259
|
-
const helperId = context.getUniqueId(fnName);
|
|
260
|
-
const extraParams = resolver.getHelperParams();
|
|
261
|
-
const extraArgs = resolver.getHelperArgs();
|
|
262
|
-
|
|
263
|
-
let helperCode: string;
|
|
264
|
-
|
|
265
|
-
switch (fnName) {
|
|
266
|
-
case 'filter':
|
|
267
|
-
helperCode = `
|
|
268
|
-
function filterHelper_${helperId}(ctx: Context, arr: Value${extraParams}): Value {
|
|
269
|
-
if (!arr.isArray()) {
|
|
270
|
-
return Value.Array(new Array<Value>(0));
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
const inputArr = arr.asArray();
|
|
274
|
-
const filterResult = new Array<Value>(0);
|
|
275
|
-
|
|
276
|
-
for (let i = 0; i < inputArr.length; i++) {
|
|
277
|
-
const element = inputArr[i];
|
|
278
|
-
ctx.set("#", element);
|
|
279
|
-
if (${lambdaCode}.asBool()) {
|
|
280
|
-
filterResult.push(element);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
return Value.Array(filterResult);
|
|
285
|
-
}`;
|
|
286
|
-
break;
|
|
287
|
-
|
|
288
|
-
case 'map':
|
|
289
|
-
helperCode = `
|
|
290
|
-
function mapHelper_${helperId}(ctx: Context, arr: Value${extraParams}): Value {
|
|
291
|
-
if (!arr.isArray()) {
|
|
292
|
-
return Value.Array(new Array<Value>(0));
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
const inputArr = arr.asArray();
|
|
296
|
-
const mapResult = new Array<Value>(0);
|
|
297
|
-
|
|
298
|
-
for (let i = 0; i < inputArr.length; i++) {
|
|
299
|
-
const element = inputArr[i];
|
|
300
|
-
ctx.set("#", element);
|
|
301
|
-
mapResult.push(${lambdaCode});
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
return Value.Array(mapResult);
|
|
305
|
-
}`;
|
|
306
|
-
break;
|
|
307
|
-
|
|
308
|
-
case 'reduce': {
|
|
309
|
-
const initialExpr = ast.args[2];
|
|
310
|
-
const initialCode = compileExpressionUnified(initialExpr, context, resolver);
|
|
311
|
-
helperCode = `
|
|
312
|
-
function reduceHelper_${helperId}(ctx: Context, arr: Value, initAcc: Value${extraParams}): Value {
|
|
313
|
-
if (!arr.isArray()) {
|
|
314
|
-
return initAcc;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
const inputArr = arr.asArray();
|
|
318
|
-
let reduceAcc = initAcc;
|
|
319
|
-
|
|
320
|
-
for (let i = 0; i < inputArr.length; i++) {
|
|
321
|
-
const element = inputArr[i];
|
|
322
|
-
ctx.set("#", element);
|
|
323
|
-
ctx.set("acc", reduceAcc);
|
|
324
|
-
reduceAcc = ${lambdaCode};
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
return reduceAcc;
|
|
328
|
-
}`;
|
|
329
|
-
context.helperFunctions.set(`reduceHelper_${helperId}`, helperCode);
|
|
330
|
-
return `reduceHelper_${helperId}(ctx, ${arrayCode}, ${initialCode}${extraArgs})`;
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
case 'all':
|
|
334
|
-
helperCode = `
|
|
335
|
-
function allHelper_${helperId}(ctx: Context, arr: Value${extraParams}): Value {
|
|
336
|
-
if (!arr.isArray()) {
|
|
337
|
-
return Value.Bool(false);
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
const inputArr = arr.asArray();
|
|
341
|
-
|
|
342
|
-
for (let i = 0; i < inputArr.length; i++) {
|
|
343
|
-
const element = inputArr[i];
|
|
344
|
-
ctx.set("#", element);
|
|
345
|
-
if (!${lambdaCode}.asBool()) {
|
|
346
|
-
return Value.Bool(false);
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
return Value.Bool(true);
|
|
351
|
-
}`;
|
|
352
|
-
break;
|
|
353
|
-
|
|
354
|
-
case 'some':
|
|
355
|
-
helperCode = `
|
|
356
|
-
function someHelper_${helperId}(ctx: Context, arr: Value${extraParams}): Value {
|
|
357
|
-
if (!arr.isArray()) {
|
|
358
|
-
return Value.Bool(false);
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
const inputArr = arr.asArray();
|
|
362
|
-
|
|
363
|
-
for (let i = 0; i < inputArr.length; i++) {
|
|
364
|
-
const element = inputArr[i];
|
|
365
|
-
ctx.set("#", element);
|
|
366
|
-
if (${lambdaCode}.asBool()) {
|
|
367
|
-
return Value.Bool(true);
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
return Value.Bool(false);
|
|
372
|
-
}`;
|
|
373
|
-
break;
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
context.helperFunctions.set(`${fnName}Helper_${helperId}`, helperCode);
|
|
377
|
-
return `${fnName}Helper_${helperId}(ctx, ${arrayCode}${extraArgs})`;
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
// ============================================================================
|
|
381
|
-
// Binary Operator Compilation
|
|
382
|
-
// ============================================================================
|
|
383
|
-
|
|
384
|
-
/**
|
|
385
|
-
* Helper to compile binary operations with pre-compiled left and right values.
|
|
386
|
-
* This is the single source of truth for all binary operator code generation.
|
|
387
|
-
*
|
|
388
|
-
* @param op - The operator string (e.g., "+", "-", "==", "and", etc.)
|
|
389
|
-
* @param left - Pre-compiled code string for the left operand
|
|
390
|
-
* @param right - Pre-compiled code string for the right operand
|
|
391
|
-
* @returns AssemblyScript code string for the binary operation
|
|
392
|
-
*/
|
|
393
|
-
export function compileBinaryOpWithValues(op: string, left: string, right: string): string {
|
|
394
|
-
switch (op) {
|
|
395
|
-
// Arithmetic
|
|
396
|
-
case '+':
|
|
397
|
-
return `addValues(${left}, ${right})`;
|
|
398
|
-
case '-':
|
|
399
|
-
return `subtractValues(${left}, ${right})`;
|
|
400
|
-
case '*':
|
|
401
|
-
return `multiplyValues(${left}, ${right})`;
|
|
402
|
-
case '/':
|
|
403
|
-
return `divideValues(${left}, ${right})`;
|
|
404
|
-
case '%':
|
|
405
|
-
return `moduloValues(${left}, ${right})`;
|
|
406
|
-
case '^':
|
|
407
|
-
return `powerValues(${left}, ${right})`;
|
|
408
|
-
|
|
409
|
-
// Comparison
|
|
410
|
-
case '==':
|
|
411
|
-
return `Value.Bool(valuesEqual(${left}, ${right}))`;
|
|
412
|
-
case '!=':
|
|
413
|
-
return `Value.Bool(!valuesEqual(${left}, ${right}))`;
|
|
414
|
-
case '<':
|
|
415
|
-
return `Value.Bool(compareValues(${left}, ${right}) < 0)`;
|
|
416
|
-
case '>':
|
|
417
|
-
return `Value.Bool(compareValues(${left}, ${right}) > 0)`;
|
|
418
|
-
case '<=':
|
|
419
|
-
return `Value.Bool(compareValues(${left}, ${right}) <= 0)`;
|
|
420
|
-
case '>=':
|
|
421
|
-
return `Value.Bool(compareValues(${left}, ${right}) >= 0)`;
|
|
422
|
-
|
|
423
|
-
// Logical
|
|
424
|
-
case 'and':
|
|
425
|
-
return `((${left}).asBool() ? (${right}) : (${left}))`;
|
|
426
|
-
case 'or':
|
|
427
|
-
return `((${left}).asBool() ? (${left}) : (${right}))`;
|
|
428
|
-
|
|
429
|
-
// Null coalescing
|
|
430
|
-
case '??':
|
|
431
|
-
return `(${left}.isNull() ? ${right} : ${left})`;
|
|
432
|
-
|
|
433
|
-
// Membership
|
|
434
|
-
case 'in':
|
|
435
|
-
return `valueIn(${left}, ${right})`;
|
|
436
|
-
case 'not in':
|
|
437
|
-
return `Value.Bool(!valueIn(${left}, ${right}).asBool())`;
|
|
438
|
-
|
|
439
|
-
default:
|
|
440
|
-
throw new Error(`Unknown binary operator: ${op}`);
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
// ============================================================================
|
|
445
|
-
// Utility Functions
|
|
446
|
-
// ============================================================================
|
|
447
|
-
|
|
448
|
-
/**
|
|
449
|
-
* Escape a string for use in AssemblyScript string literals.
|
|
450
|
-
*/
|
|
451
|
-
export function escapeString(s: string): string {
|
|
452
|
-
return s
|
|
453
|
-
.replace(/\\/g, '\\\\')
|
|
454
|
-
.replace(/"/g, '\\"')
|
|
455
|
-
.replace(/\n/g, '\\n')
|
|
456
|
-
.replace(/\r/g, '\\r')
|
|
457
|
-
.replace(/\t/g, '\\t');
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
/**
|
|
461
|
-
* Build the full dotted path for a $-rooted member access chain.
|
|
462
|
-
* Returns null if the path is not rooted at $.
|
|
463
|
-
*
|
|
464
|
-
* Example: $.eligibility.specialOffers -> "eligibility.specialOffers"
|
|
465
|
-
*/
|
|
466
|
-
export function buildDollarPath(ast: MemberAccess): string | null {
|
|
467
|
-
if (ast.object.type === 'DollarRef') {
|
|
468
|
-
return ast.property;
|
|
469
|
-
}
|
|
470
|
-
if (ast.object.type === 'MemberAccess') {
|
|
471
|
-
const parentPath = buildDollarPath(ast.object as MemberAccess);
|
|
472
|
-
if (parentPath !== null) {
|
|
473
|
-
return `${parentPath}.${ast.property}`;
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
return null;
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
/**
|
|
480
|
-
* Check if a member access chain is rooted at the '$nodes' identifier.
|
|
481
|
-
*/
|
|
482
|
-
export function checkIsNodesReference(ast: MemberAccess): boolean {
|
|
483
|
-
if (ast.object.type === 'Identifier') {
|
|
484
|
-
return (ast.object as Identifier).name === '$nodes';
|
|
485
|
-
} else if (ast.object.type === 'MemberAccess') {
|
|
486
|
-
return checkIsNodesReference(ast.object as MemberAccess);
|
|
487
|
-
}
|
|
488
|
-
return false;
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
/**
|
|
492
|
-
* Build the full dotted path for a $nodes-rooted member access chain.
|
|
493
|
-
*/
|
|
494
|
-
export function buildNodesPath(ast: MemberAccess): string {
|
|
495
|
-
if (ast.object.type === 'Identifier') {
|
|
496
|
-
return `${(ast.object as Identifier).name}.${ast.property}`;
|
|
497
|
-
} else if (ast.object.type === 'MemberAccess') {
|
|
498
|
-
return `${buildNodesPath(ast.object as MemberAccess)}.${ast.property}`;
|
|
499
|
-
}
|
|
500
|
-
throw new Error('Invalid object type for $nodes reference');
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
// ============================================================================
|
|
504
|
-
// Convenience Functions
|
|
505
|
-
// ============================================================================
|
|
506
|
-
|
|
507
|
-
// Singleton instance for standard context compilation
|
|
508
|
-
const standardResolver = new StandardContextResolver();
|
|
509
|
-
|
|
510
|
-
/**
|
|
511
|
-
* Compile an AST node to AssemblyScript code using standard context resolution.
|
|
512
|
-
*
|
|
513
|
-
* This is a convenience function that uses StandardContextResolver, where:
|
|
514
|
-
* - $ references resolve to ctx.get("$")
|
|
515
|
-
* - Identifiers resolve to ctx.get("name")
|
|
516
|
-
*
|
|
517
|
-
* For specialized compilation contexts (expression nodes with local $, scoped contexts),
|
|
518
|
-
* use compileExpressionUnified directly with the appropriate resolver.
|
|
519
|
-
*
|
|
520
|
-
* @param ast - The AST node to compile
|
|
521
|
-
* @param context - The compilation context
|
|
522
|
-
* @returns AssemblyScript code string that produces a Value
|
|
523
|
-
*/
|
|
524
|
-
export function compileExpression(ast: ExpressionAST, context: CompilationContext): string {
|
|
525
|
-
return compileExpressionUnified(ast, context, standardResolver);
|
|
526
|
-
}
|