@divmain/jdm-asm 0.2.0 → 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,434 +0,0 @@
|
|
|
1
|
-
import { parser } from './expression-parser';
|
|
2
|
-
import {
|
|
3
|
-
type ExpressionAST,
|
|
4
|
-
type StringLiteral,
|
|
5
|
-
type Interval,
|
|
6
|
-
type TemplateLiteral,
|
|
7
|
-
type ArrayLiteral,
|
|
8
|
-
type ObjectLiteral,
|
|
9
|
-
type BinaryOperator,
|
|
10
|
-
} from './ast-types';
|
|
11
|
-
import type { CstNode } from 'chevrotain';
|
|
12
|
-
|
|
13
|
-
const BaseCstVisitor = parser.getBaseCstVisitorConstructor();
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Converts Chevrotain CST to our AST format.
|
|
17
|
-
*/
|
|
18
|
-
class ExpressionAstBuilder extends BaseCstVisitor {
|
|
19
|
-
constructor() {
|
|
20
|
-
super();
|
|
21
|
-
this.validateVisitor();
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
expression(ctx: any): ExpressionAST {
|
|
25
|
-
const condition = this.visit(ctx.condition);
|
|
26
|
-
|
|
27
|
-
if (ctx.Question) {
|
|
28
|
-
return {
|
|
29
|
-
type: 'TernaryOp',
|
|
30
|
-
condition,
|
|
31
|
-
consequent: this.visit(ctx.consequent),
|
|
32
|
-
alternate: this.visit(ctx.alternate),
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return condition;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
nullCoalescingExpression(ctx: any): ExpressionAST {
|
|
40
|
-
let result = this.visit(ctx.lhs);
|
|
41
|
-
|
|
42
|
-
if (ctx.rhs) {
|
|
43
|
-
for (const rhsNode of ctx.rhs) {
|
|
44
|
-
result = {
|
|
45
|
-
type: 'BinaryOp',
|
|
46
|
-
op: '??',
|
|
47
|
-
left: result,
|
|
48
|
-
right: this.visit(rhsNode),
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return result;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
orExpression(ctx: any): ExpressionAST {
|
|
57
|
-
let result = this.visit(ctx.lhs);
|
|
58
|
-
|
|
59
|
-
if (ctx.rhs) {
|
|
60
|
-
for (const rhsNode of ctx.rhs) {
|
|
61
|
-
result = {
|
|
62
|
-
type: 'BinaryOp',
|
|
63
|
-
op: 'or',
|
|
64
|
-
left: result,
|
|
65
|
-
right: this.visit(rhsNode),
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return result;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
andExpression(ctx: any): ExpressionAST {
|
|
74
|
-
let result = this.visit(ctx.lhs);
|
|
75
|
-
|
|
76
|
-
if (ctx.rhs) {
|
|
77
|
-
for (const rhsNode of ctx.rhs) {
|
|
78
|
-
result = {
|
|
79
|
-
type: 'BinaryOp',
|
|
80
|
-
op: 'and',
|
|
81
|
-
left: result,
|
|
82
|
-
right: this.visit(rhsNode),
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
return result;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
comparisonExpression(ctx: any): ExpressionAST {
|
|
91
|
-
const lhs = this.visit(ctx.lhs);
|
|
92
|
-
|
|
93
|
-
if (!ctx.rhs) {
|
|
94
|
-
return lhs;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Determine operator
|
|
98
|
-
let op: BinaryOperator;
|
|
99
|
-
if (ctx.Eq) {
|
|
100
|
-
op = '==';
|
|
101
|
-
} else if (ctx.NotEq) {
|
|
102
|
-
op = '!=';
|
|
103
|
-
} else if (ctx.Lt) {
|
|
104
|
-
op = '<';
|
|
105
|
-
} else if (ctx.Gt) {
|
|
106
|
-
op = '>';
|
|
107
|
-
} else if (ctx.LtEq) {
|
|
108
|
-
op = '<=';
|
|
109
|
-
} else if (ctx.GtEq) {
|
|
110
|
-
op = '>=';
|
|
111
|
-
} else if (ctx.In) {
|
|
112
|
-
op = ctx.Not ? 'not in' : 'in';
|
|
113
|
-
} else {
|
|
114
|
-
throw new Error('Unknown comparison operator');
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return {
|
|
118
|
-
type: 'BinaryOp',
|
|
119
|
-
op,
|
|
120
|
-
left: lhs,
|
|
121
|
-
right: this.visit(ctx.rhs),
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
additiveExpression(ctx: any): ExpressionAST {
|
|
126
|
-
return this.buildLeftAssociativeBinaryOp(ctx, ['Plus', 'Minus'], ['+', '-']);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
multiplicativeExpression(ctx: any): ExpressionAST {
|
|
130
|
-
return this.buildLeftAssociativeBinaryOp(ctx, ['Mult', 'Div', 'Mod'], ['*', '/', '%']);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// Power is right-associative, handled differently via recursion in grammar
|
|
134
|
-
powerExpression(ctx: any): ExpressionAST {
|
|
135
|
-
const base = this.visit(ctx.base);
|
|
136
|
-
|
|
137
|
-
if (ctx.exponent) {
|
|
138
|
-
return {
|
|
139
|
-
type: 'BinaryOp',
|
|
140
|
-
op: '^',
|
|
141
|
-
left: base,
|
|
142
|
-
right: this.visit(ctx.exponent),
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
return base;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
unaryExpression(ctx: any): ExpressionAST {
|
|
150
|
-
if (ctx.Not || ctx.NotNot) {
|
|
151
|
-
return { type: 'UnaryOp', op: 'not', operand: this.visit(ctx.operand) };
|
|
152
|
-
}
|
|
153
|
-
if (ctx.Minus) {
|
|
154
|
-
return { type: 'UnaryOp', op: '-', operand: this.visit(ctx.operand) };
|
|
155
|
-
}
|
|
156
|
-
return this.visit(ctx.postfixExpression);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
postfixExpression(ctx: any): ExpressionAST {
|
|
160
|
-
let result = this.visit(ctx.primaryExpression);
|
|
161
|
-
|
|
162
|
-
// Collect all postfix operations with their source positions
|
|
163
|
-
type PostfixOp =
|
|
164
|
-
| { type: 'member'; offset: number; idx: number }
|
|
165
|
-
| { type: 'index'; offset: number; idx: number }
|
|
166
|
-
| { type: 'call'; offset: number; idx: number };
|
|
167
|
-
|
|
168
|
-
const ops: PostfixOp[] = [];
|
|
169
|
-
|
|
170
|
-
if (ctx.Dot) {
|
|
171
|
-
for (let i = 0; i < ctx.Dot.length; i++) {
|
|
172
|
-
ops.push({ type: 'member', offset: ctx.Dot[i].startOffset, idx: i });
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
if (ctx.LBracket) {
|
|
177
|
-
for (let i = 0; i < ctx.LBracket.length; i++) {
|
|
178
|
-
ops.push({ type: 'index', offset: ctx.LBracket[i].startOffset, idx: i });
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
if (ctx.LParen) {
|
|
183
|
-
for (let i = 0; i < ctx.LParen.length; i++) {
|
|
184
|
-
ops.push({ type: 'call', offset: ctx.LParen[i].startOffset, idx: i });
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Sort by source position to apply in correct order: Chevrotain collects each operator
|
|
189
|
-
// type separately, but the actual evaluation order depends on source position when multiple
|
|
190
|
-
// operator types can appear.
|
|
191
|
-
//
|
|
192
|
-
// We must sort by position to reconstruct left-to-right evaluation order
|
|
193
|
-
ops.sort((a, b) => a.offset - b.offset);
|
|
194
|
-
|
|
195
|
-
// Apply each operation in order
|
|
196
|
-
for (const op of ops) {
|
|
197
|
-
if (op.type === 'member') {
|
|
198
|
-
const prop = ctx.property[op.idx].image;
|
|
199
|
-
result = { type: 'MemberAccess', object: result, property: prop };
|
|
200
|
-
} else if (op.type === 'index') {
|
|
201
|
-
const indexExpr = ctx.index[op.idx];
|
|
202
|
-
result = { type: 'IndexAccess', object: result, index: this.visit(indexExpr) };
|
|
203
|
-
} else if (op.type === 'call') {
|
|
204
|
-
// Check if there's an argumentList for this call
|
|
205
|
-
const args =
|
|
206
|
-
ctx.argumentList && ctx.argumentList[op.idx] ? this.visit(ctx.argumentList[op.idx]) : [];
|
|
207
|
-
result = { type: 'FunctionCall', callee: result, args };
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
return result;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
primaryExpression(ctx: any): ExpressionAST {
|
|
215
|
-
if (ctx.NumberLiteral) {
|
|
216
|
-
const raw = ctx.NumberLiteral[0].image.replace(/_/g, '');
|
|
217
|
-
return { type: 'NumberLiteral', value: parseFloat(raw) };
|
|
218
|
-
}
|
|
219
|
-
if (ctx.StringLiteral) {
|
|
220
|
-
const raw = ctx.StringLiteral[0].image;
|
|
221
|
-
const value = this.unescapeString(raw.slice(1, -1));
|
|
222
|
-
return { type: 'StringLiteral', value };
|
|
223
|
-
}
|
|
224
|
-
if (ctx.True) {
|
|
225
|
-
return { type: 'BooleanLiteral', value: true };
|
|
226
|
-
}
|
|
227
|
-
if (ctx.False) {
|
|
228
|
-
return { type: 'BooleanLiteral', value: false };
|
|
229
|
-
}
|
|
230
|
-
if (ctx.Null) {
|
|
231
|
-
return { type: 'NullLiteral' };
|
|
232
|
-
}
|
|
233
|
-
if (ctx.Hash) {
|
|
234
|
-
return { type: 'HashRef' };
|
|
235
|
-
}
|
|
236
|
-
if (ctx.Dollar) {
|
|
237
|
-
return { type: 'DollarRef' };
|
|
238
|
-
}
|
|
239
|
-
if (ctx.Identifier) {
|
|
240
|
-
return { type: 'Identifier', name: ctx.Identifier[0].image };
|
|
241
|
-
}
|
|
242
|
-
if (ctx.arrayLiteralExpression) {
|
|
243
|
-
return this.visit(ctx.arrayLiteralExpression);
|
|
244
|
-
}
|
|
245
|
-
if (ctx.objectLiteralExpression) {
|
|
246
|
-
return this.visit(ctx.objectLiteralExpression);
|
|
247
|
-
}
|
|
248
|
-
if (ctx.expression) {
|
|
249
|
-
return this.visit(ctx.expression);
|
|
250
|
-
}
|
|
251
|
-
if (ctx.intervalExpression) {
|
|
252
|
-
return this.visit(ctx.intervalExpression);
|
|
253
|
-
}
|
|
254
|
-
if (ctx.templateLiteral) {
|
|
255
|
-
return this.visit(ctx.templateLiteral);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
throw new Error('Unknown primary expression');
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
intervalExpression(ctx: any): Interval {
|
|
262
|
-
const startBracket = ctx.startBracket[0];
|
|
263
|
-
const endBracket = ctx.endBracket[0];
|
|
264
|
-
|
|
265
|
-
return {
|
|
266
|
-
type: 'Interval',
|
|
267
|
-
start: this.visit(ctx.start) as ExpressionAST,
|
|
268
|
-
end: this.visit(ctx.end) as ExpressionAST,
|
|
269
|
-
startInclusive: startBracket.tokenType.name === 'LBracket',
|
|
270
|
-
endInclusive: endBracket.tokenType.name === 'RBracket',
|
|
271
|
-
};
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
arrayLiteralExpression(ctx: any): ArrayLiteral {
|
|
275
|
-
if (!ctx.argumentList) {
|
|
276
|
-
return { type: 'ArrayLiteral', elements: [] };
|
|
277
|
-
}
|
|
278
|
-
const args = this.visit(ctx.argumentList);
|
|
279
|
-
return { type: 'ArrayLiteral', elements: args as ExpressionAST[] };
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
objectLiteralExpression(ctx: any): ObjectLiteral {
|
|
283
|
-
if (!ctx.objectPropertyList) {
|
|
284
|
-
return { type: 'ObjectLiteral', properties: [] };
|
|
285
|
-
}
|
|
286
|
-
const props = this.visit(ctx.objectPropertyList);
|
|
287
|
-
return {
|
|
288
|
-
type: 'ObjectLiteral',
|
|
289
|
-
properties: props as Array<{ key: string; value: ExpressionAST }>,
|
|
290
|
-
};
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
objectPropertyList(ctx: any): Array<{ key: string; value: ExpressionAST }> {
|
|
294
|
-
return ctx.prop.map(
|
|
295
|
-
(propNode: CstNode) => this.visit(propNode) as { key: string; value: ExpressionAST },
|
|
296
|
-
);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
objectProperty(ctx: any): { key: string; value: ExpressionAST } {
|
|
300
|
-
const keyToken = ctx.key[0];
|
|
301
|
-
const key =
|
|
302
|
-
keyToken.tokenType.name === 'StringLiteral'
|
|
303
|
-
? this.unescapeString(keyToken.image.slice(1, -1))
|
|
304
|
-
: keyToken.image;
|
|
305
|
-
const value = this.visit(ctx.value) as ExpressionAST;
|
|
306
|
-
return { key, value };
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
templateLiteral(ctx: any): TemplateLiteral | StringLiteral {
|
|
310
|
-
// Handle simple template with no substitution
|
|
311
|
-
if (ctx.TemplateNoSub) {
|
|
312
|
-
const raw = ctx.TemplateNoSub[0].image;
|
|
313
|
-
return { type: 'StringLiteral', value: this.unescapeString(raw.slice(1, -1)) };
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
// Handle template with interpolation
|
|
317
|
-
const parts: Array<{ text: string } | { expr: ExpressionAST }> = [];
|
|
318
|
-
|
|
319
|
-
// Extract text from TemplateHead (remove ` and ${)
|
|
320
|
-
const headRaw = ctx.TemplateHead[0].image;
|
|
321
|
-
const headText = this.unescapeString(headRaw.slice(1, -2));
|
|
322
|
-
if (headText) {
|
|
323
|
-
parts.push({ text: headText });
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
// Add expressions and middle parts
|
|
327
|
-
for (let i = 0; i < ctx.expr.length; i++) {
|
|
328
|
-
parts.push({ expr: this.visit(ctx.expr[i]) as ExpressionAST });
|
|
329
|
-
|
|
330
|
-
if (ctx.TemplateMiddle && ctx.TemplateMiddle[i]) {
|
|
331
|
-
const midRaw = ctx.TemplateMiddle[i].image;
|
|
332
|
-
const midText = this.unescapeString(midRaw.slice(1, -2));
|
|
333
|
-
if (midText) {
|
|
334
|
-
parts.push({ text: midText });
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
// Extract text from TemplateTail (remove } and `)
|
|
340
|
-
const tailRaw = ctx.TemplateTail[0].image;
|
|
341
|
-
const tailText = this.unescapeString(tailRaw.slice(1, -1));
|
|
342
|
-
if (tailText) {
|
|
343
|
-
parts.push({ text: tailText });
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
// Template literals with no interpolation (just text) can be converted to simple string
|
|
347
|
-
// literals, avoiding runtime template processing overhead.
|
|
348
|
-
if (parts.every((p) => 'text' in p)) {
|
|
349
|
-
const combined = parts.map((p) => (p as { text: string }).text).join('');
|
|
350
|
-
return { type: 'StringLiteral', value: combined };
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
return { type: 'TemplateLiteral', parts };
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
argumentList(ctx: any): ExpressionAST[] {
|
|
357
|
-
return ctx.arg.map((argNode: CstNode) => this.visit(argNode) as ExpressionAST);
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
/**
|
|
361
|
-
* Helper to unescape string literals.
|
|
362
|
-
* Handles basic escape sequences like \n, \t, \", \', \\, etc.
|
|
363
|
-
*/
|
|
364
|
-
private unescapeString(s: string): string {
|
|
365
|
-
return s
|
|
366
|
-
.replace(/\\n/g, '\n')
|
|
367
|
-
.replace(/\\t/g, '\t')
|
|
368
|
-
.replace(/\\r/g, '\r')
|
|
369
|
-
.replace(/\\'/g, "'")
|
|
370
|
-
.replace(/"/g, '"')
|
|
371
|
-
.replace(/\\\\/g, '\\');
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
/**
|
|
375
|
-
* Helper for left-associative binary operators.
|
|
376
|
-
* Collects all operator tokens, sorts them by position, and pairs them with RHS operands.
|
|
377
|
-
*/
|
|
378
|
-
private buildLeftAssociativeBinaryOp(
|
|
379
|
-
ctx: any,
|
|
380
|
-
tokenNames: string[],
|
|
381
|
-
ops: BinaryOperator[],
|
|
382
|
-
): ExpressionAST {
|
|
383
|
-
let result = this.visit(ctx.lhs) as ExpressionAST;
|
|
384
|
-
|
|
385
|
-
if (!ctx.rhs) {
|
|
386
|
-
// No right-hand side: return just the left expression
|
|
387
|
-
return result;
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
// Collect all operator tokens with their corresponding operator symbol
|
|
391
|
-
const operatorTokens: Array<{ op: BinaryOperator; offset: number }> = [];
|
|
392
|
-
for (let j = 0; j < tokenNames.length; j++) {
|
|
393
|
-
const tokens = ctx[tokenNames[j]];
|
|
394
|
-
if (tokens) {
|
|
395
|
-
for (const token of tokens) {
|
|
396
|
-
operatorTokens.push({ op: ops[j], offset: token.startOffset });
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
// Sort operators by their position in the source
|
|
402
|
-
operatorTokens.sort((a, b) => a.offset - b.offset);
|
|
403
|
-
|
|
404
|
-
// Build the expression tree left-to-right
|
|
405
|
-
for (let i = 0; i < ctx.rhs.length; i++) {
|
|
406
|
-
const op = operatorTokens[i]?.op;
|
|
407
|
-
if (!op) {
|
|
408
|
-
throw new Error(`Operator not found for ${tokenNames.join(', ')}`);
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
result = {
|
|
412
|
-
type: 'BinaryOp',
|
|
413
|
-
op,
|
|
414
|
-
left: result,
|
|
415
|
-
right: this.visit(ctx.rhs[i]) as ExpressionAST,
|
|
416
|
-
};
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
return result;
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
export const astBuilder = new ExpressionAstBuilder();
|
|
424
|
-
|
|
425
|
-
/**
|
|
426
|
-
* Convert a CST (Concrete Syntax Tree) to an AST (Abstract Syntax Tree).
|
|
427
|
-
* CST contains low-level parsing artifacts; AST simplifies structure for compilation
|
|
428
|
-
*
|
|
429
|
-
* @param cst - The CST from the Chevrotain parser
|
|
430
|
-
* @returns The AST node
|
|
431
|
-
*/
|
|
432
|
-
export function cstToAst(cst: CstNode): ExpressionAST {
|
|
433
|
-
return astBuilder.visit(cst);
|
|
434
|
-
}
|
package/src/compiler/errors.ts
DELETED
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Error handling infrastructure for the JDM compiler.
|
|
3
|
-
*
|
|
4
|
-
* This module provides:
|
|
5
|
-
* - CompilationError: The main error class for all compilation failures
|
|
6
|
-
* - ErrorCode: A comprehensive enumeration of all possible error types
|
|
7
|
-
* - SourceLocation: Detailed location information for error reporting
|
|
8
|
-
* - ErrorCollector: Aggregates non-fatal expression errors for batch reporting
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Detailed source location for error reporting.
|
|
13
|
-
*/
|
|
14
|
-
export interface SourceLocation {
|
|
15
|
-
/** ID of the node where the error occurred */
|
|
16
|
-
nodeId?: string;
|
|
17
|
-
/** Name of the node where the error occurred */
|
|
18
|
-
nodeName?: string;
|
|
19
|
-
/** Field name within the node */
|
|
20
|
-
field?: string;
|
|
21
|
-
/** Line number in source JDM */
|
|
22
|
-
line?: number;
|
|
23
|
-
/** Column number in source JDM */
|
|
24
|
-
column?: number;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Enumeration of all possible compilation error codes.
|
|
29
|
-
*
|
|
30
|
-
* Errors are categorized into three types:
|
|
31
|
-
* - Structural errors: Critical JDM structure issues that fail compilation immediately
|
|
32
|
-
* - Feature errors: Unsupported features that cannot be handled
|
|
33
|
-
* - Expression errors: Issues in expression parsing that can be collected and reported together
|
|
34
|
-
*/
|
|
35
|
-
export enum ErrorCode {
|
|
36
|
-
// Structural errors (fail immediately)
|
|
37
|
-
INVALID_JSON = 'INVALID_JSON',
|
|
38
|
-
INVALID_NODE_STRUCTURE = 'INVALID_NODE_STRUCTURE',
|
|
39
|
-
MISSING_INPUT_NODE = 'MISSING_INPUT_NODE',
|
|
40
|
-
MISSING_OUTPUT_NODE = 'MISSING_OUTPUT_NODE',
|
|
41
|
-
MULTIPLE_INPUT_NODES = 'MULTIPLE_INPUT_NODES',
|
|
42
|
-
CYCLE_DETECTED = 'CYCLE_DETECTED',
|
|
43
|
-
INVALID_EDGE = 'INVALID_EDGE',
|
|
44
|
-
|
|
45
|
-
// Feature errors (fail immediately)
|
|
46
|
-
UNSUPPORTED_FUNCTION_NODE = 'UNSUPPORTED_FUNCTION_NODE',
|
|
47
|
-
UNSUPPORTED_EXPRESSION = 'UNSUPPORTED_EXPRESSION',
|
|
48
|
-
|
|
49
|
-
// Expression errors (collected, reported together)
|
|
50
|
-
PARSE_ERROR = 'PARSE_ERROR',
|
|
51
|
-
UNKNOWN_FUNCTION = 'UNKNOWN_FUNCTION',
|
|
52
|
-
TYPE_MISMATCH = 'TYPE_MISMATCH',
|
|
53
|
-
UNKNOWN_FIELD = 'UNKNOWN_FIELD',
|
|
54
|
-
|
|
55
|
-
// Schema errors
|
|
56
|
-
SCHEMA_MISMATCH = 'SCHEMA_MISMATCH',
|
|
57
|
-
INVALID_SCHEMA = 'INVALID_SCHEMA',
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Custom error class for compilation failures.
|
|
62
|
-
*
|
|
63
|
-
* Provides structured error information including error code, source location,
|
|
64
|
-
* and additional context for debugging.
|
|
65
|
-
*/
|
|
66
|
-
export class CompilationError extends Error {
|
|
67
|
-
readonly name = 'CompilationError';
|
|
68
|
-
|
|
69
|
-
constructor(
|
|
70
|
-
message: string,
|
|
71
|
-
public readonly code: ErrorCode,
|
|
72
|
-
public readonly location?: SourceLocation,
|
|
73
|
-
public readonly context?: Record<string, unknown>,
|
|
74
|
-
) {
|
|
75
|
-
super(message);
|
|
76
|
-
// Exclude the CompilationError constructor frame from the stack trace.
|
|
77
|
-
// Without this, stack traces would include an unhelpful constructor frame,
|
|
78
|
-
// making it harder to identify the actual error source in compiled code.
|
|
79
|
-
// Only available on V8-based engines (Node.js, Chrome, Edge).
|
|
80
|
-
if (Error.captureStackTrace) {
|
|
81
|
-
Error.captureStackTrace(this, CompilationError);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Get a formatted error message with location information.
|
|
87
|
-
*/
|
|
88
|
-
getFormattedMessage(): string {
|
|
89
|
-
const parts: string[] = [];
|
|
90
|
-
|
|
91
|
-
if (this.location) {
|
|
92
|
-
const locParts: string[] = [];
|
|
93
|
-
if (this.location.nodeName) {
|
|
94
|
-
locParts.push(this.location.nodeName);
|
|
95
|
-
}
|
|
96
|
-
if (this.location.nodeId) {
|
|
97
|
-
locParts.push(`(id: ${this.location.nodeId})`);
|
|
98
|
-
}
|
|
99
|
-
if (this.location.field) {
|
|
100
|
-
locParts.push(`.${this.location.field}`);
|
|
101
|
-
}
|
|
102
|
-
// Combine line and column: @10:5
|
|
103
|
-
if (this.location.line !== undefined && this.location.column !== undefined) {
|
|
104
|
-
locParts.push(`@${this.location.line}:${this.location.column}`);
|
|
105
|
-
} else if (this.location.line !== undefined) {
|
|
106
|
-
locParts.push(`@${this.location.line}`);
|
|
107
|
-
} else if (this.location.column !== undefined) {
|
|
108
|
-
locParts.push(`:${this.location.column}`);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
if (locParts.length > 0) {
|
|
112
|
-
parts.push(`[${locParts.join(' ')}]`);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
parts.push(`[${this.code}]`);
|
|
117
|
-
parts.push(this.message);
|
|
118
|
-
|
|
119
|
-
return parts.join(' ');
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Collector for non-fatal errors during expression parsing.
|
|
125
|
-
*
|
|
126
|
-
* This allows the parser to continue and collect multiple errors rather than
|
|
127
|
-
* failing on the first one, providing a better user experience by reporting
|
|
128
|
-
* all issues at once.
|
|
129
|
-
*
|
|
130
|
-
* @example
|
|
131
|
-
* const collector = new ErrorCollector();
|
|
132
|
-
* collector.add(new CompilationError('Undefined variable', ErrorCode.UNKNOWN_FIELD, { nodeName: 'AgeCheck' }));
|
|
133
|
-
* collector.add(new CompilationError('Type mismatch', ErrorCode.TYPE_MISMATCH, { nodeName: 'AgeCheck' }));
|
|
134
|
-
* collector.throwIfErrors(); // Throws with aggregated message
|
|
135
|
-
*/
|
|
136
|
-
export class ErrorCollector {
|
|
137
|
-
private errors: CompilationError[] = [];
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Add an error to the collector.
|
|
141
|
-
*/
|
|
142
|
-
add(error: CompilationError): void {
|
|
143
|
-
this.errors.push(error);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Check if any errors have been collected.
|
|
148
|
-
*/
|
|
149
|
-
hasErrors(): boolean {
|
|
150
|
-
return this.errors.length > 0;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Throw if there are any collected errors.
|
|
155
|
-
*
|
|
156
|
-
* Single errors throw directly to preserve original context and stack trace. Multiple
|
|
157
|
-
* errors are aggregated into one with numbered list, so developers see all problems at
|
|
158
|
-
* once instead of fixing issues one-by-one through repeated compile attempts.
|
|
159
|
-
*/
|
|
160
|
-
throwIfErrors(): void {
|
|
161
|
-
if (this.errors.length === 0) {
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
if (this.errors.length === 1) {
|
|
166
|
-
throw this.errors[0];
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
const message =
|
|
170
|
-
`${this.errors.length} compilation errors:\n` +
|
|
171
|
-
this.errors
|
|
172
|
-
.map((e, i) => {
|
|
173
|
-
const prefix = ` ${i + 1}. ${e.code}`;
|
|
174
|
-
const formatted = e.getFormattedMessage();
|
|
175
|
-
// getFormattedMessage() includes [CODE] prefix, but we already show the code in
|
|
176
|
-
// our numbered list, so strip it to avoid "1. CODE: [CODE] message"
|
|
177
|
-
const rest = formatted.replace(`[${e.code}]`, '').trim();
|
|
178
|
-
return `${prefix}${rest ? ': ' + rest : ''}`;
|
|
179
|
-
})
|
|
180
|
-
.join('\n');
|
|
181
|
-
|
|
182
|
-
// Use the location from the first error as the aggregated error's location
|
|
183
|
-
const firstErrorLocation = this.errors[0].location;
|
|
184
|
-
throw new CompilationError(message, ErrorCode.PARSE_ERROR, firstErrorLocation);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Type guard to check if an error is a CompilationError.
|
|
190
|
-
*/
|
|
191
|
-
export function isCompilationError(error: unknown): error is CompilationError {
|
|
192
|
-
return error instanceof CompilationError;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* Type guard to check if an error code is a structural error.
|
|
197
|
-
*/
|
|
198
|
-
export function isStructuralError(code: ErrorCode): boolean {
|
|
199
|
-
return [
|
|
200
|
-
ErrorCode.INVALID_JSON,
|
|
201
|
-
ErrorCode.INVALID_NODE_STRUCTURE,
|
|
202
|
-
ErrorCode.MISSING_INPUT_NODE,
|
|
203
|
-
ErrorCode.MISSING_OUTPUT_NODE,
|
|
204
|
-
ErrorCode.MULTIPLE_INPUT_NODES,
|
|
205
|
-
ErrorCode.CYCLE_DETECTED,
|
|
206
|
-
ErrorCode.INVALID_EDGE,
|
|
207
|
-
].includes(code);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Type guard to check if an error code is a feature error.
|
|
212
|
-
*/
|
|
213
|
-
export function isFeatureError(code: ErrorCode): boolean {
|
|
214
|
-
return [ErrorCode.UNSUPPORTED_FUNCTION_NODE, ErrorCode.UNSUPPORTED_EXPRESSION].includes(code);
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Type guard to check if an error code is an expression error.
|
|
219
|
-
*/
|
|
220
|
-
export function isExpressionError(code: ErrorCode): boolean {
|
|
221
|
-
return [
|
|
222
|
-
ErrorCode.PARSE_ERROR,
|
|
223
|
-
ErrorCode.UNKNOWN_FUNCTION,
|
|
224
|
-
ErrorCode.TYPE_MISMATCH,
|
|
225
|
-
ErrorCode.UNKNOWN_FIELD,
|
|
226
|
-
].includes(code);
|
|
227
|
-
}
|