@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,507 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Compile-time validation for decision models.
|
|
3
|
-
*
|
|
4
|
-
* This module provides functions to perform static analysis of JDM structure
|
|
5
|
-
* and references at compile time. These checks detect missing references,
|
|
6
|
-
* undeclared identifiers, and unassigned outputs before code generation.
|
|
7
|
-
*
|
|
8
|
-
* These functions operate on ASTs and CompilationContext - they do NOT
|
|
9
|
-
* execute at runtime. For runtime data validation, see runtime-validation-codegen.ts.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import type { ExpressionAST, Identifier } from './ast-types';
|
|
13
|
-
import { CompilationError, ErrorCode, ErrorCollector, type SourceLocation } from './errors';
|
|
14
|
-
import type { CompilationContext } from './types';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Collect all identifier references from an expression AST.
|
|
18
|
-
*
|
|
19
|
-
* This function walks the AST and collects all variable/field references
|
|
20
|
-
* that need to be resolved from the context. It handles:
|
|
21
|
-
* - Simple identifiers: `age`, `name`
|
|
22
|
-
* - Member access: `customer.age`, `order.items[0].price`
|
|
23
|
-
*
|
|
24
|
-
* @param ast - The expression AST to analyze
|
|
25
|
-
* @returns Set of all identifier names referenced in the expression
|
|
26
|
-
*/
|
|
27
|
-
export function collectIdentifiers(ast: ExpressionAST): Set<string> {
|
|
28
|
-
const identifiers = new Set<string>();
|
|
29
|
-
collectIdentifiersRecursive(ast, identifiers);
|
|
30
|
-
return identifiers;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Recursively collect identifiers from an AST node.
|
|
35
|
-
*/
|
|
36
|
-
function collectIdentifiersRecursive(ast: ExpressionAST, identifiers: Set<string>): void {
|
|
37
|
-
switch (ast.type) {
|
|
38
|
-
case 'Identifier': {
|
|
39
|
-
const ident = ast as Identifier;
|
|
40
|
-
identifiers.add(ident.name);
|
|
41
|
-
break;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
case 'MemberAccess':
|
|
45
|
-
// For member access like `customer.age`, we need to track the base object `customer`
|
|
46
|
-
collectIdentifiersRecursive((ast as any).object, identifiers);
|
|
47
|
-
// The property name is a literal, not an identifier
|
|
48
|
-
break;
|
|
49
|
-
|
|
50
|
-
case 'IndexAccess':
|
|
51
|
-
// For index access like `items[0]`, we need the base object
|
|
52
|
-
collectIdentifiersRecursive((ast as any).object, identifiers);
|
|
53
|
-
// The index is an expression that may contain identifiers
|
|
54
|
-
collectIdentifiersRecursive((ast as any).index, identifiers);
|
|
55
|
-
break;
|
|
56
|
-
|
|
57
|
-
case 'BinaryOp':
|
|
58
|
-
collectIdentifiersRecursive((ast as any).left, identifiers);
|
|
59
|
-
collectIdentifiersRecursive((ast as any).right, identifiers);
|
|
60
|
-
break;
|
|
61
|
-
|
|
62
|
-
case 'UnaryOp':
|
|
63
|
-
collectIdentifiersRecursive((ast as any).operand, identifiers);
|
|
64
|
-
break;
|
|
65
|
-
|
|
66
|
-
case 'TernaryOp':
|
|
67
|
-
collectIdentifiersRecursive((ast as any).condition, identifiers);
|
|
68
|
-
collectIdentifiersRecursive((ast as any).consequent, identifiers);
|
|
69
|
-
collectIdentifiersRecursive((ast as any).alternate, identifiers);
|
|
70
|
-
break;
|
|
71
|
-
|
|
72
|
-
case 'FunctionCall':
|
|
73
|
-
collectIdentifiersRecursive((ast as any).callee, identifiers);
|
|
74
|
-
for (const arg of (ast as any).args) {
|
|
75
|
-
collectIdentifiersRecursive(arg, identifiers);
|
|
76
|
-
}
|
|
77
|
-
break;
|
|
78
|
-
|
|
79
|
-
case 'ArrayLiteral':
|
|
80
|
-
for (const element of (ast as any).elements) {
|
|
81
|
-
collectIdentifiersRecursive(element, identifiers);
|
|
82
|
-
}
|
|
83
|
-
break;
|
|
84
|
-
|
|
85
|
-
case 'ObjectLiteral':
|
|
86
|
-
for (const [_key, value] of Object.entries((ast as any).properties)) {
|
|
87
|
-
collectIdentifiersRecursive(value as ExpressionAST, identifiers);
|
|
88
|
-
}
|
|
89
|
-
break;
|
|
90
|
-
|
|
91
|
-
case 'TemplateLiteral':
|
|
92
|
-
for (const part of (ast as any).parts) {
|
|
93
|
-
if (typeof part === 'object') {
|
|
94
|
-
// It's an expression
|
|
95
|
-
collectIdentifiersRecursive(part as ExpressionAST, identifiers);
|
|
96
|
-
}
|
|
97
|
-
// String literals are ignored
|
|
98
|
-
}
|
|
99
|
-
break;
|
|
100
|
-
|
|
101
|
-
case 'Interval':
|
|
102
|
-
collectIdentifiersRecursive((ast as any).start, identifiers);
|
|
103
|
-
collectIdentifiersRecursive((ast as any).end, identifiers);
|
|
104
|
-
break;
|
|
105
|
-
|
|
106
|
-
// Literals don't reference identifiers
|
|
107
|
-
case 'NumberLiteral':
|
|
108
|
-
case 'StringLiteral':
|
|
109
|
-
case 'BooleanLiteral':
|
|
110
|
-
case 'NullLiteral':
|
|
111
|
-
case 'DollarRef':
|
|
112
|
-
case 'HashRef':
|
|
113
|
-
// No identifiers to collect
|
|
114
|
-
break;
|
|
115
|
-
|
|
116
|
-
default:
|
|
117
|
-
throw new Error(`Unknown AST node type: ${(ast as any).type}`);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Validate that all referenced identifiers exist in the input schema.
|
|
123
|
-
*
|
|
124
|
-
* This function checks that all input references in expressions are declared
|
|
125
|
-
* in the input schema. It builds a set of expected input fields from the
|
|
126
|
-
* flattened layout and compares it against the identifiers used in expressions.
|
|
127
|
-
*
|
|
128
|
-
* @param referencedIdentifiers - Set of identifiers used in expressions
|
|
129
|
-
* @param context - The compilation context containing the input schema
|
|
130
|
-
* @param location - Source location for error reporting
|
|
131
|
-
* @throws CompilationError if any referenced input is not declared
|
|
132
|
-
*/
|
|
133
|
-
export function validateInputReferences(
|
|
134
|
-
referencedIdentifiers: Set<string>,
|
|
135
|
-
context: CompilationContext,
|
|
136
|
-
location?: SourceLocation,
|
|
137
|
-
): void {
|
|
138
|
-
// Build a set of all expected input fields from the flattened layout
|
|
139
|
-
const expectedInputs = new Set<string>();
|
|
140
|
-
|
|
141
|
-
// Add all top-level fields (e.g., "age", "name", "customer")
|
|
142
|
-
for (const field of context.inputLayout.fields) {
|
|
143
|
-
const parts = field.path.split('.');
|
|
144
|
-
expectedInputs.add(parts[0]); // Add the top-level field name
|
|
145
|
-
|
|
146
|
-
// Also add the full path for cases like "customer.age"
|
|
147
|
-
expectedInputs.add(field.path);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// Check each referenced identifier
|
|
151
|
-
const missingInputs: string[] = [];
|
|
152
|
-
|
|
153
|
-
for (const identifier of referencedIdentifiers) {
|
|
154
|
-
// $ is the unary context variable in decision table cells, # is the iteration variable
|
|
155
|
-
// in higher-order functions (map, filter, etc.). Both are implicit and don't need schema
|
|
156
|
-
// declaration.
|
|
157
|
-
if (identifier === '$' || identifier === '#') {
|
|
158
|
-
continue;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Check if this identifier is declared
|
|
162
|
-
let found = false;
|
|
163
|
-
// Check exact match first
|
|
164
|
-
if (expectedInputs.has(identifier)) {
|
|
165
|
-
found = true;
|
|
166
|
-
} else {
|
|
167
|
-
// Check if it's a prefix match (e.g., "customer" matches "customer.age")
|
|
168
|
-
for (const expected of expectedInputs) {
|
|
169
|
-
if (expected.startsWith(identifier + '.')) {
|
|
170
|
-
found = true;
|
|
171
|
-
break;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
if (!found) {
|
|
177
|
-
missingInputs.push(identifier);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// If we found missing inputs, throw an error
|
|
182
|
-
if (missingInputs.length > 0) {
|
|
183
|
-
const missingList = missingInputs
|
|
184
|
-
.sort()
|
|
185
|
-
.map((id) => `"${id}"`)
|
|
186
|
-
.join(', ');
|
|
187
|
-
const message =
|
|
188
|
-
missingInputs.length === 1
|
|
189
|
-
? `Input reference "${missingInputs[0]}" is not declared in the input schema`
|
|
190
|
-
: `Input references are not declared in the input schema: ${missingList}`;
|
|
191
|
-
|
|
192
|
-
throw new CompilationError(
|
|
193
|
-
message,
|
|
194
|
-
ErrorCode.UNKNOWN_FIELD,
|
|
195
|
-
{
|
|
196
|
-
...location,
|
|
197
|
-
field: 'inputs',
|
|
198
|
-
},
|
|
199
|
-
{ missingInputs: missingInputs as any },
|
|
200
|
-
);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Collect all output assignments from a decision.
|
|
206
|
-
*
|
|
207
|
-
* This function walks through all nodes in the decision and collects
|
|
208
|
-
* the output paths that are assigned by expression nodes and decision table nodes.
|
|
209
|
-
*
|
|
210
|
-
* @param context - The compilation context
|
|
211
|
-
* @returns Set of all output paths assigned by the decision
|
|
212
|
-
*/
|
|
213
|
-
export function collectOutputAssignments(
|
|
214
|
-
context: CompilationContext,
|
|
215
|
-
errorCollector?: ErrorCollector,
|
|
216
|
-
): Set<string> {
|
|
217
|
-
const assignedOutputs = new Set<string>();
|
|
218
|
-
|
|
219
|
-
for (const node of context.jdm.nodes) {
|
|
220
|
-
const nodeType = node.type;
|
|
221
|
-
|
|
222
|
-
try {
|
|
223
|
-
if (nodeType === 'expressionNode') {
|
|
224
|
-
// Collect output assignments from expression nodes
|
|
225
|
-
const expressions = node.content.expressions as Array<{ key: string; value: string }>;
|
|
226
|
-
for (const expr of expressions) {
|
|
227
|
-
assignedOutputs.add(expr.key);
|
|
228
|
-
}
|
|
229
|
-
} else if (nodeType === 'decisionTableNode') {
|
|
230
|
-
// Collect output fields from decision table nodes
|
|
231
|
-
const content = node.content as any;
|
|
232
|
-
if (content.outputs) {
|
|
233
|
-
for (const output of content.outputs) {
|
|
234
|
-
if (output.field) {
|
|
235
|
-
assignedOutputs.add(output.field);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
// Switch nodes and sub-decision nodes delegate to other nodes which will be processed
|
|
241
|
-
// separately, so their outputs will be collected from those target nodes.
|
|
242
|
-
} catch (error) {
|
|
243
|
-
// Collect errors for batch reporting rather than swallowing them silently
|
|
244
|
-
if (errorCollector) {
|
|
245
|
-
const err =
|
|
246
|
-
error instanceof CompilationError
|
|
247
|
-
? error
|
|
248
|
-
: new CompilationError(
|
|
249
|
-
`Failed to collect output assignments from node "${node.name || node.id}": ${error instanceof Error ? error.message : String(error)}`,
|
|
250
|
-
ErrorCode.PARSE_ERROR,
|
|
251
|
-
{ nodeId: node.id, nodeName: node.name },
|
|
252
|
-
);
|
|
253
|
-
errorCollector.add(err);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
return assignedOutputs;
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
/**
|
|
262
|
-
* Validate that all expected outputs from the schema are assigned.
|
|
263
|
-
*
|
|
264
|
-
* This function checks that all output fields defined in the output schema
|
|
265
|
-
* are actually assigned by the decision logic. It builds a set of expected
|
|
266
|
-
* output fields from the flattened layout and compares it against the
|
|
267
|
-
* outputs that are assigned by expression nodes and decision table nodes.
|
|
268
|
-
*
|
|
269
|
-
* @param assignedOutputs - Set of output paths assigned by the decision
|
|
270
|
-
* @param context - The compilation context containing the output schema
|
|
271
|
-
* @param location - Source location for error reporting
|
|
272
|
-
* @throws CompilationError if any expected output is not assigned
|
|
273
|
-
*/
|
|
274
|
-
export function validateOutputReferences(
|
|
275
|
-
assignedOutputs: Set<string>,
|
|
276
|
-
context: CompilationContext,
|
|
277
|
-
location?: SourceLocation,
|
|
278
|
-
): void {
|
|
279
|
-
// Build a set of all expected output fields from the flattened layout
|
|
280
|
-
const expectedOutputs = new Set<string>();
|
|
281
|
-
|
|
282
|
-
// Add all output fields from the layout
|
|
283
|
-
for (const field of context.outputLayout.fields) {
|
|
284
|
-
expectedOutputs.add(field.path);
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
// Check each expected output
|
|
288
|
-
const missingOutputs: string[] = [];
|
|
289
|
-
|
|
290
|
-
for (const output of expectedOutputs) {
|
|
291
|
-
// Prefix matching handles nested object assignment - if schema expects "customer" but decision
|
|
292
|
-
// assigns "customer.name" and "customer.age", those partial assignments satisfy the requirement
|
|
293
|
-
let found = false;
|
|
294
|
-
|
|
295
|
-
// Check exact match
|
|
296
|
-
if (assignedOutputs.has(output)) {
|
|
297
|
-
found = true;
|
|
298
|
-
} else {
|
|
299
|
-
// Check if any assigned output is a nested field of the expected output
|
|
300
|
-
// e.g., if "customer" is expected and "customer.name" is assigned
|
|
301
|
-
for (const assigned of assignedOutputs) {
|
|
302
|
-
if (assigned.startsWith(output + '.')) {
|
|
303
|
-
found = true;
|
|
304
|
-
break;
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
if (!found) {
|
|
310
|
-
missingOutputs.push(output);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
// If we found missing outputs, throw an error
|
|
315
|
-
if (missingOutputs.length > 0) {
|
|
316
|
-
const missingList = missingOutputs
|
|
317
|
-
.sort()
|
|
318
|
-
.map((field) => `"${field}"`)
|
|
319
|
-
.join(', ');
|
|
320
|
-
const message =
|
|
321
|
-
missingOutputs.length === 1
|
|
322
|
-
? `Output field "${missingOutputs[0]}" is declared in the output schema but not assigned by the decision`
|
|
323
|
-
: `Output fields are declared in the output schema but not assigned by the decision: ${missingList}`;
|
|
324
|
-
|
|
325
|
-
throw new CompilationError(
|
|
326
|
-
message,
|
|
327
|
-
ErrorCode.UNKNOWN_FIELD,
|
|
328
|
-
{
|
|
329
|
-
...location,
|
|
330
|
-
field: 'outputs',
|
|
331
|
-
},
|
|
332
|
-
{ missingOutputs: missingOutputs as any },
|
|
333
|
-
);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
/**
|
|
338
|
-
* Validate output assignments for all nodes in a decision.
|
|
339
|
-
*
|
|
340
|
-
* This is a convenience function that validates that all expected outputs
|
|
341
|
-
* from the output schema are actually assigned by the decision logic.
|
|
342
|
-
*
|
|
343
|
-
* @param context - The compilation context
|
|
344
|
-
* @throws CompilationError if any expected output is not assigned or if errors occur during collection
|
|
345
|
-
*/
|
|
346
|
-
export function validateAllOutputReferences(context: CompilationContext): void {
|
|
347
|
-
const errorCollector = new ErrorCollector();
|
|
348
|
-
|
|
349
|
-
// Collect all output assignments, gathering any errors
|
|
350
|
-
const assignedOutputs = collectOutputAssignments(context, errorCollector);
|
|
351
|
-
|
|
352
|
-
// Validate that all expected outputs are assigned
|
|
353
|
-
try {
|
|
354
|
-
validateOutputReferences(assignedOutputs, context);
|
|
355
|
-
} catch (error) {
|
|
356
|
-
if (error instanceof CompilationError) {
|
|
357
|
-
errorCollector.add(error);
|
|
358
|
-
} else {
|
|
359
|
-
throw error;
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
// Throw all collected errors (parse errors + validation errors)
|
|
364
|
-
errorCollector.throwIfErrors();
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
/**
|
|
368
|
-
* Validate input references for all expression nodes in a decision.
|
|
369
|
-
*
|
|
370
|
-
* This is a convenience function that validates all expressions in the decision
|
|
371
|
-
* at once, collecting all errors before throwing.
|
|
372
|
-
*
|
|
373
|
-
* @param context - The compilation context
|
|
374
|
-
* @throws CompilationError if any expression references an undeclared input or contains parse errors
|
|
375
|
-
*/
|
|
376
|
-
export function validateAllInputReferences(context: CompilationContext): void {
|
|
377
|
-
const errorCollector = new ErrorCollector();
|
|
378
|
-
const inputLayout = context.inputLayout;
|
|
379
|
-
const expectedInputs = new Set<string>();
|
|
380
|
-
|
|
381
|
-
// Build set of expected inputs
|
|
382
|
-
for (const field of inputLayout.fields) {
|
|
383
|
-
const parts = field.path.split('.');
|
|
384
|
-
expectedInputs.add(parts[0]);
|
|
385
|
-
expectedInputs.add(field.path);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
// Collect all references and validate them
|
|
389
|
-
const allIdentifiers = new Set<string>();
|
|
390
|
-
|
|
391
|
-
// Helper to create a parse error with location context
|
|
392
|
-
const createParseError = (
|
|
393
|
-
nodeId: string,
|
|
394
|
-
nodeName: string | undefined,
|
|
395
|
-
expression: string,
|
|
396
|
-
error: unknown,
|
|
397
|
-
): CompilationError => {
|
|
398
|
-
if (error instanceof CompilationError) {
|
|
399
|
-
// Preserve original error but add node context if missing
|
|
400
|
-
if (!error.location?.nodeId) {
|
|
401
|
-
return new CompilationError(error.message, error.code, { nodeId, nodeName }, error.context);
|
|
402
|
-
}
|
|
403
|
-
return error;
|
|
404
|
-
}
|
|
405
|
-
return new CompilationError(
|
|
406
|
-
`Failed to parse expression "${expression}": ${error instanceof Error ? error.message : String(error)}`,
|
|
407
|
-
ErrorCode.PARSE_ERROR,
|
|
408
|
-
{ nodeId, nodeName },
|
|
409
|
-
);
|
|
410
|
-
};
|
|
411
|
-
|
|
412
|
-
// Process all nodes that contain expressions
|
|
413
|
-
for (const node of context.jdm.nodes) {
|
|
414
|
-
const nodeType = node.type;
|
|
415
|
-
|
|
416
|
-
try {
|
|
417
|
-
if (nodeType === 'expressionNode') {
|
|
418
|
-
// Collect identifiers from all expressions in the node
|
|
419
|
-
const expressions = node.content.expressions as Array<{ key: string; value: string }>;
|
|
420
|
-
for (const expr of expressions) {
|
|
421
|
-
try {
|
|
422
|
-
const ast = context.parseExpression(expr.value);
|
|
423
|
-
const identifiers = collectIdentifiers(ast);
|
|
424
|
-
for (const id of identifiers) {
|
|
425
|
-
allIdentifiers.add(id);
|
|
426
|
-
}
|
|
427
|
-
} catch (error) {
|
|
428
|
-
errorCollector.add(createParseError(node.id, node.name, expr.value, error));
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
} else if (nodeType === 'decisionTableNode') {
|
|
432
|
-
// Collect identifiers from decision table conditions
|
|
433
|
-
const content = node.content as any;
|
|
434
|
-
if (content.rules) {
|
|
435
|
-
for (const rule of content.rules) {
|
|
436
|
-
if (rule.input) {
|
|
437
|
-
for (const [_key, value] of Object.entries(rule.input as Record<string, string>)) {
|
|
438
|
-
if (
|
|
439
|
-
value &&
|
|
440
|
-
typeof value === 'string' &&
|
|
441
|
-
!['true', 'false', 'null'].includes(value.toLowerCase())
|
|
442
|
-
) {
|
|
443
|
-
try {
|
|
444
|
-
const ast = context.parseExpression(value);
|
|
445
|
-
const identifiers = collectIdentifiers(ast);
|
|
446
|
-
for (const id of identifiers) {
|
|
447
|
-
allIdentifiers.add(id);
|
|
448
|
-
}
|
|
449
|
-
} catch (error) {
|
|
450
|
-
// Collect parse errors for batch reporting
|
|
451
|
-
errorCollector.add(createParseError(node.id, node.name, value, error));
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
} else if (nodeType === 'switchNode') {
|
|
459
|
-
// Collect identifiers from switch conditions
|
|
460
|
-
const content = node.content as any;
|
|
461
|
-
if (content.cases) {
|
|
462
|
-
for (const switchCase of content.cases) {
|
|
463
|
-
if (switchCase.condition && switchCase.condition.expression) {
|
|
464
|
-
try {
|
|
465
|
-
const ast = context.parseExpression(switchCase.condition.expression);
|
|
466
|
-
const identifiers = collectIdentifiers(ast);
|
|
467
|
-
for (const id of identifiers) {
|
|
468
|
-
allIdentifiers.add(id);
|
|
469
|
-
}
|
|
470
|
-
} catch (error) {
|
|
471
|
-
// Collect parse errors for batch reporting
|
|
472
|
-
errorCollector.add(
|
|
473
|
-
createParseError(node.id, node.name, switchCase.condition.expression, error),
|
|
474
|
-
);
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
} catch (error) {
|
|
481
|
-
// Collect errors from node processing for batch reporting
|
|
482
|
-
const err =
|
|
483
|
-
error instanceof CompilationError
|
|
484
|
-
? error
|
|
485
|
-
: new CompilationError(
|
|
486
|
-
`Failed to process node "${node.name || node.id}": ${error instanceof Error ? error.message : String(error)}`,
|
|
487
|
-
ErrorCode.PARSE_ERROR,
|
|
488
|
-
{ nodeId: node.id, nodeName: node.name },
|
|
489
|
-
);
|
|
490
|
-
errorCollector.add(err);
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
// Validate all collected identifiers
|
|
495
|
-
try {
|
|
496
|
-
validateInputReferences(allIdentifiers, context);
|
|
497
|
-
} catch (error) {
|
|
498
|
-
if (error instanceof CompilationError) {
|
|
499
|
-
errorCollector.add(error);
|
|
500
|
-
} else {
|
|
501
|
-
throw error;
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
// Throw all collected errors (parse errors + validation errors)
|
|
506
|
-
errorCollector.throwIfErrors();
|
|
507
|
-
}
|