@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
package/src/compiler/graph.ts
DELETED
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
import { DirectedGraph } from 'graphology';
|
|
2
|
-
import { topologicalSort } from 'graphology-dag';
|
|
3
|
-
import { type JDMNode, type JDMEdge, type JDMDecision, NodeType } from './parser';
|
|
4
|
-
import { CompilationError, ErrorCode, type SourceLocation } from './errors';
|
|
5
|
-
|
|
6
|
-
export type JDMGraph = DirectedGraph<JDMNode, JDMEdge>;
|
|
7
|
-
|
|
8
|
-
export function buildGraph(jdm: JDMDecision): JDMGraph {
|
|
9
|
-
const graph = new DirectedGraph<JDMNode, JDMEdge>();
|
|
10
|
-
|
|
11
|
-
// Map provides O(1) lookups for edge validation and node existence checks
|
|
12
|
-
const nodeMap = new Map<string, JDMNode>();
|
|
13
|
-
for (const node of jdm.nodes) {
|
|
14
|
-
graph.addNode(node.id, node);
|
|
15
|
-
nodeMap.set(node.id, node);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// Switch nodes can have multiple edges to same target (different cases/handles pointing to
|
|
19
|
-
// same node), but topological sort only needs one edge per source→target pair to establish
|
|
20
|
-
// ordering dependencies.
|
|
21
|
-
const addedEdges = new Set<string>();
|
|
22
|
-
|
|
23
|
-
// Add edges and check for self-references
|
|
24
|
-
for (const edge of jdm.edges) {
|
|
25
|
-
if (!nodeMap.has(edge.sourceId) || !nodeMap.has(edge.targetId)) {
|
|
26
|
-
const sourceNode = nodeMap.get(edge.sourceId);
|
|
27
|
-
const targetNode = nodeMap.get(edge.targetId);
|
|
28
|
-
throw new CompilationError(
|
|
29
|
-
`Invalid edge "${edge.id}": references non-existent node`,
|
|
30
|
-
ErrorCode.INVALID_EDGE,
|
|
31
|
-
{
|
|
32
|
-
nodeId: edge.sourceId,
|
|
33
|
-
nodeName: sourceNode?.name ?? targetNode?.name,
|
|
34
|
-
field: !nodeMap.has(edge.sourceId) ? 'sourceId' : 'targetId',
|
|
35
|
-
},
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Check for self-references (edge where source equals target)
|
|
40
|
-
if (edge.sourceId === edge.targetId) {
|
|
41
|
-
const node = graph.getNodeAttributes(edge.sourceId);
|
|
42
|
-
const location: SourceLocation = { nodeId: edge.sourceId, nodeName: node.name };
|
|
43
|
-
throw new CompilationError(
|
|
44
|
-
`Self-reference detected: node "${node.name || edge.sourceId}" references itself through edge "${edge.id}"`,
|
|
45
|
-
ErrorCode.CYCLE_DETECTED,
|
|
46
|
-
location,
|
|
47
|
-
);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// For topological ordering, we only need one edge between any two nodes.
|
|
51
|
-
// Switch nodes may have multiple edges to the same target (via different handles).
|
|
52
|
-
// We track the edge pair to avoid duplicates while preserving all edges in jdm.edges
|
|
53
|
-
// for the switch node compilation to use.
|
|
54
|
-
const edgePairKey = `${edge.sourceId}->${edge.targetId}`;
|
|
55
|
-
if (!addedEdges.has(edgePairKey)) {
|
|
56
|
-
graph.addEdgeWithKey(edge.id, edge.sourceId, edge.targetId, edge);
|
|
57
|
-
addedEdges.add(edgePairKey);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return graph;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Find a cycle path in the graph using DFS. Graphology's cycle detection only returns a boolean,
|
|
66
|
-
* but we need the actual cycle path to provide better error messages showing the problematic node
|
|
67
|
-
* sequence to users.
|
|
68
|
-
*
|
|
69
|
-
* @param graph - The graph to search
|
|
70
|
-
* @returns Array of node IDs representing the cycle, or null if no cycle
|
|
71
|
-
*/
|
|
72
|
-
function findCyclePath(graph: JDMGraph): string[] | null {
|
|
73
|
-
const visited = new Set<string>();
|
|
74
|
-
const recursionStack = new Set<string>();
|
|
75
|
-
const parentMap = new Map<string, string | null>();
|
|
76
|
-
|
|
77
|
-
function dfs(nodeId: string, path: string[]): string[] | null {
|
|
78
|
-
visited.add(nodeId);
|
|
79
|
-
recursionStack.add(nodeId);
|
|
80
|
-
path.push(nodeId);
|
|
81
|
-
|
|
82
|
-
const neighbors = graph.outNeighbors(nodeId);
|
|
83
|
-
for (const neighborId of neighbors) {
|
|
84
|
-
if (!visited.has(neighborId)) {
|
|
85
|
-
parentMap.set(neighborId, nodeId);
|
|
86
|
-
const cycle = dfs(neighborId, path);
|
|
87
|
-
if (cycle) {
|
|
88
|
-
return cycle;
|
|
89
|
-
}
|
|
90
|
-
} else if (recursionStack.has(neighborId)) {
|
|
91
|
-
// Found a back edge - reconstruct the cycle path
|
|
92
|
-
// Path contains full traversal, but cycle only starts where we revisit a node.
|
|
93
|
-
// Slicing gives just the cycle portion (e.g., A→B→C→B extracts B→C→B).
|
|
94
|
-
const startIndex = path.indexOf(neighborId);
|
|
95
|
-
const cycle = [...path.slice(startIndex), neighborId];
|
|
96
|
-
return cycle;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
recursionStack.delete(nodeId);
|
|
101
|
-
path.pop();
|
|
102
|
-
return null;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Start DFS from each unvisited node
|
|
106
|
-
for (const nodeId of graph.nodes()) {
|
|
107
|
-
if (!visited.has(nodeId)) {
|
|
108
|
-
const cycle = dfs(nodeId, []);
|
|
109
|
-
if (cycle) {
|
|
110
|
-
return cycle;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
return null;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Format a cycle path as a readable string.
|
|
120
|
-
*
|
|
121
|
-
* @param cycle - Array of node IDs representing a cycle
|
|
122
|
-
* @param graph - The graph to get node names from
|
|
123
|
-
* @returns Formatted string like "Node1 -> Node2 -> Node3 -> Node1"
|
|
124
|
-
*/
|
|
125
|
-
function formatCyclePath(cycle: string[], graph: JDMGraph): string {
|
|
126
|
-
return cycle
|
|
127
|
-
.map((nodeId) => {
|
|
128
|
-
const node = graph.getNodeAttributes(nodeId);
|
|
129
|
-
return node.name || nodeId;
|
|
130
|
-
})
|
|
131
|
-
.join(' -> ');
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
export function validateGraph(graph: JDMGraph): void {
|
|
135
|
-
// Check for cycles using DFS to find the actual cycle path
|
|
136
|
-
const cyclePath = findCyclePath(graph);
|
|
137
|
-
if (cyclePath) {
|
|
138
|
-
const formattedPath = formatCyclePath(cyclePath, graph);
|
|
139
|
-
throw new CompilationError(
|
|
140
|
-
`Circular dependency detected: ${formattedPath}`,
|
|
141
|
-
ErrorCode.CYCLE_DETECTED,
|
|
142
|
-
{ nodeId: cyclePath[0], nodeName: graph.getNodeAttributes(cyclePath[0]).name },
|
|
143
|
-
);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// Check for single input node
|
|
147
|
-
const inputNodes: string[] = [];
|
|
148
|
-
const outputNodes: string[] = [];
|
|
149
|
-
|
|
150
|
-
graph.forEachNode((nodeId, attrs) => {
|
|
151
|
-
if (attrs.type === NodeType.INPUT) {
|
|
152
|
-
inputNodes.push(nodeId);
|
|
153
|
-
}
|
|
154
|
-
if (attrs.type === NodeType.OUTPUT) {
|
|
155
|
-
outputNodes.push(nodeId);
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
if (inputNodes.length !== 1) {
|
|
160
|
-
// If there are multiple input nodes, include the first one in the location
|
|
161
|
-
const firstInputNode = inputNodes.length > 0 ? graph.getNodeAttributes(inputNodes[0]) : null;
|
|
162
|
-
throw new CompilationError(
|
|
163
|
-
`Expected exactly 1 input node, found ${inputNodes.length}`,
|
|
164
|
-
ErrorCode.MULTIPLE_INPUT_NODES,
|
|
165
|
-
firstInputNode ? { nodeId: firstInputNode.id, nodeName: firstInputNode.name } : undefined,
|
|
166
|
-
);
|
|
167
|
-
}
|
|
168
|
-
if (outputNodes.length === 0) {
|
|
169
|
-
throw new CompilationError(
|
|
170
|
-
'Expected at least 1 output node, found 0',
|
|
171
|
-
ErrorCode.MISSING_OUTPUT_NODE,
|
|
172
|
-
{ field: 'outputNode' },
|
|
173
|
-
);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Get nodes in topological order for evaluation.
|
|
179
|
-
* This ensures dependencies are evaluated before dependents.
|
|
180
|
-
*/
|
|
181
|
-
export function getEvaluationOrder(graph: JDMGraph): string[] {
|
|
182
|
-
return topologicalSort(graph);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Get all nodes that feed into a given node.
|
|
187
|
-
*/
|
|
188
|
-
export function getInputNodes(graph: JDMGraph, nodeId: string): JDMNode[] {
|
|
189
|
-
return graph.inNeighbors(nodeId).map((id) => graph.getNodeAttributes(id));
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Get all nodes that a given node feeds into.
|
|
194
|
-
*/
|
|
195
|
-
export function getOutputNodes(graph: JDMGraph, nodeId: string): JDMNode[] {
|
|
196
|
-
return graph.outNeighbors(nodeId).map((id) => graph.getNodeAttributes(id));
|
|
197
|
-
}
|
package/src/compiler/index.ts
DELETED
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
// src/compiler/index.ts
|
|
2
|
-
import type { TSchema } from '@sinclair/typebox';
|
|
3
|
-
import { parseJDM, type JDMDecision } from './parser';
|
|
4
|
-
import { compileDecision } from './codegen';
|
|
5
|
-
import { compileAssemblyScript } from './build';
|
|
6
|
-
import { flattenSchema, computeSchemaHash } from './schema';
|
|
7
|
-
import { generateMarshalCode, generateValidationCode } from './marshal-gen';
|
|
8
|
-
import type {
|
|
9
|
-
CompilerOptions,
|
|
10
|
-
CompilationResult,
|
|
11
|
-
CompilationContext,
|
|
12
|
-
NoMatchBehavior,
|
|
13
|
-
} from './types';
|
|
14
|
-
import { readFileSync } from 'fs';
|
|
15
|
-
import path from 'path';
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Type guard for Node.js file system errors.
|
|
19
|
-
*/
|
|
20
|
-
function isFileNotFoundError(error: unknown): boolean {
|
|
21
|
-
return error !== null && typeof error === 'object' && 'code' in error && error.code === 'ENOENT';
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Creates a filesystem-based loader for sub-decision JDM files.
|
|
26
|
-
*
|
|
27
|
-
* This loader performs I/O by reading from the filesystem and may throw filesystem errors
|
|
28
|
-
* (e.g., ENOENT for missing files, EACCES for permission denied).
|
|
29
|
-
*
|
|
30
|
-
* Supports both zen-engine compatibility (flat structure in zen-reference/) and organized test
|
|
31
|
-
* structure (nested by feature in sub-decisions/). This dual approach allows us to port
|
|
32
|
-
* zen-engine fixtures without reorganization while providing better organization for our own
|
|
33
|
-
* tests.
|
|
34
|
-
*
|
|
35
|
-
* @param testDataRoot - Optional root directory for test data. Defaults to "test-data/" in current working directory.
|
|
36
|
-
* @returns A loader function that reads JDM files from the filesystem
|
|
37
|
-
* @throws Error if file is not found in any search path
|
|
38
|
-
* @throws Error for other filesystem errors (permissions, invalid content, etc.)
|
|
39
|
-
*/
|
|
40
|
-
function createFilesystemLoader(testDataRoot?: string): (key: string) => JDMDecision {
|
|
41
|
-
const root = testDataRoot || path.join(process.cwd(), 'test-data');
|
|
42
|
-
const possiblePaths = [
|
|
43
|
-
root,
|
|
44
|
-
path.join(root, 'sub-decisions'),
|
|
45
|
-
path.join(root, 'sub-decisions/basic'),
|
|
46
|
-
path.join(root, 'sub-decisions/simple-multi'),
|
|
47
|
-
path.join(root, 'sub-decisions/complex-multi'),
|
|
48
|
-
path.join(root, 'sub-decisions/diamond'),
|
|
49
|
-
path.join(root, 'sub-decisions/error-propagation'),
|
|
50
|
-
path.join(root, 'zen-reference'),
|
|
51
|
-
];
|
|
52
|
-
|
|
53
|
-
return (key: string): JDMDecision => {
|
|
54
|
-
for (const basePath of possiblePaths) {
|
|
55
|
-
try {
|
|
56
|
-
const filePath = path.join(basePath, key);
|
|
57
|
-
const content = readFileSync(filePath, 'utf-8');
|
|
58
|
-
return parseJDM(content);
|
|
59
|
-
} catch (error) {
|
|
60
|
-
// Only try next path for file-not-found errors
|
|
61
|
-
// Let other errors (parse errors, permission denied) propagate immediately
|
|
62
|
-
if (isFileNotFoundError(error)) {
|
|
63
|
-
continue;
|
|
64
|
-
}
|
|
65
|
-
throw error;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
throw new Error(
|
|
69
|
-
`Failed to load sub-decision "${key}": not found in any search path (${possiblePaths.join(', ')})`,
|
|
70
|
-
);
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// Re-export parser, graph, optimizer, runtime, validation, types, and errors
|
|
75
|
-
export * from './parser';
|
|
76
|
-
export * from './graph';
|
|
77
|
-
export * from './types';
|
|
78
|
-
export * from './errors';
|
|
79
|
-
export * from './optimizer';
|
|
80
|
-
export * from './runtime';
|
|
81
|
-
export * from './runtime-codegen';
|
|
82
|
-
|
|
83
|
-
// Validation modules - split by concern:
|
|
84
|
-
// - compile-time-validation: Static analysis of JDM structure and references
|
|
85
|
-
// - runtime-validation-codegen: Validation code that executes at runtime
|
|
86
|
-
export * from './compile-time-validation';
|
|
87
|
-
export * from './runtime-validation-codegen';
|
|
88
|
-
|
|
89
|
-
// Backward compatibility: re-export from input-validation (deprecated)
|
|
90
|
-
export * from './input-validation';
|
|
91
|
-
|
|
92
|
-
// Export cache utilities for advanced usage
|
|
93
|
-
export {
|
|
94
|
-
clearCache,
|
|
95
|
-
getCacheStats,
|
|
96
|
-
pruneCache,
|
|
97
|
-
isCacheEnabled,
|
|
98
|
-
getCacheDirectory,
|
|
99
|
-
getCacheHealth,
|
|
100
|
-
} from './cache';
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Main entry point: Compile JDM to WASM with schema-driven marshaling.
|
|
104
|
-
*
|
|
105
|
-
* @example
|
|
106
|
-
* const result = await compile({
|
|
107
|
-
* inputSchema: InputSchema,
|
|
108
|
-
* outputSchema: OutputSchema,
|
|
109
|
-
* jdm: jdmJson,
|
|
110
|
-
* optimize: true,
|
|
111
|
-
* });
|
|
112
|
-
*/
|
|
113
|
-
export async function compile(options: {
|
|
114
|
-
inputSchema: TSchema;
|
|
115
|
-
outputSchema: TSchema;
|
|
116
|
-
jdm: string | JDMDecision;
|
|
117
|
-
optimize?: boolean;
|
|
118
|
-
debug?: boolean;
|
|
119
|
-
/** How to handle cases where no rules match in decision tables/switches */
|
|
120
|
-
noMatchBehavior?: NoMatchBehavior;
|
|
121
|
-
/** Optional loader function to load sub-decision JDM files */
|
|
122
|
-
loadDecision?: CompilerOptions['loadDecision'];
|
|
123
|
-
/** Optional testDataRoot path for default loader to search */
|
|
124
|
-
testDataRoot?: string;
|
|
125
|
-
}): Promise<CompilationResult> {
|
|
126
|
-
const opts: CompilerOptions = {
|
|
127
|
-
optimize: options.optimize ?? true,
|
|
128
|
-
debug: options.debug ?? false,
|
|
129
|
-
// Validation disabled during compilation for performance (compile-time checks).
|
|
130
|
-
// Schema validation is generated as separate code (generateValidationCode()) that
|
|
131
|
-
// the runtime can call before evaluation.
|
|
132
|
-
validate: false,
|
|
133
|
-
noMatchBehavior: options.noMatchBehavior,
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
// Phase 1: Parse and validate JDM
|
|
137
|
-
const parsed = parseJDM(options.jdm);
|
|
138
|
-
|
|
139
|
-
// Phase 2: Flatten schemas to memory layout
|
|
140
|
-
const inputLayout = flattenSchema(options.inputSchema);
|
|
141
|
-
const outputLayout = flattenSchema(options.outputSchema);
|
|
142
|
-
|
|
143
|
-
// Phase 3: Compute schema hash for runtime validation
|
|
144
|
-
const schemaHash = computeSchemaHash(options.inputSchema, options.outputSchema);
|
|
145
|
-
|
|
146
|
-
// Phase 4: Build compilation context
|
|
147
|
-
const context: CompilationContext = {
|
|
148
|
-
jdm: parsed,
|
|
149
|
-
inputSchema: options.inputSchema,
|
|
150
|
-
outputSchema: options.outputSchema,
|
|
151
|
-
inputLayout,
|
|
152
|
-
outputLayout,
|
|
153
|
-
schemaHash,
|
|
154
|
-
options: opts,
|
|
155
|
-
parseExpression: (expr) => parseStandardExpression(expr),
|
|
156
|
-
parseUnaryExpression: (expr) => parseUnaryExpressionImpl(expr),
|
|
157
|
-
getUniqueId: createIdGenerator(),
|
|
158
|
-
loadDecision: options.loadDecision ?? createFilesystemLoader(options.testDataRoot),
|
|
159
|
-
// Avoids duplicate compilation when multiple nodes reference same sub-decision
|
|
160
|
-
compiledSubDecisions: new Map(),
|
|
161
|
-
// Detects circular references to prevent infinite loops during compilation
|
|
162
|
-
decisionPath: [],
|
|
163
|
-
helperFunctions: new Map(),
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
// Phase 5: Generate AssemblyScript code
|
|
167
|
-
const asCode = compileDecision(parsed, context);
|
|
168
|
-
|
|
169
|
-
// Phase 6: Compile to WASM
|
|
170
|
-
const { binary, wat } = await compileAssemblyScript(asCode, opts);
|
|
171
|
-
|
|
172
|
-
// Phase 7: Generate JS marshaling code
|
|
173
|
-
const marshalCode = generateMarshalCode(inputLayout, outputLayout, schemaHash);
|
|
174
|
-
const validationCode = generateValidationCode(options.inputSchema);
|
|
175
|
-
|
|
176
|
-
return {
|
|
177
|
-
wasm: binary,
|
|
178
|
-
schemaHash,
|
|
179
|
-
marshalCode,
|
|
180
|
-
validationCode,
|
|
181
|
-
wat: opts.debug ? wat : undefined,
|
|
182
|
-
assemblyScript: opts.debug ? asCode : undefined,
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
function createIdGenerator(): (prefix: string) => string {
|
|
187
|
-
const counters = new Map<string, number>();
|
|
188
|
-
return (prefix: string) => {
|
|
189
|
-
const count = counters.get(prefix) ?? 0;
|
|
190
|
-
counters.set(prefix, count + 1);
|
|
191
|
-
return `${prefix}_${count}`;
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
// Import parse functions
|
|
196
|
-
import {
|
|
197
|
-
parseStandardExpression,
|
|
198
|
-
parseUnaryExpression as parseUnaryExpressionImpl,
|
|
199
|
-
} from './unary-parser';
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Input/Output validation for decision models.
|
|
3
|
-
*
|
|
4
|
-
* @deprecated This module re-exports from compile-time-validation.ts and
|
|
5
|
-
* runtime-validation-codegen.ts for backward compatibility. Import directly
|
|
6
|
-
* from those modules instead:
|
|
7
|
-
*
|
|
8
|
-
* - compile-time-validation.ts: Static analysis of JDM structure and references
|
|
9
|
-
* (collectIdentifiers, validateInputReferences, validateAllInputReferences, etc.)
|
|
10
|
-
*
|
|
11
|
-
* - runtime-validation-codegen.ts: Validation code that executes at runtime
|
|
12
|
-
* (validateRuntimeInputs, validateRuntimeOutputs)
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
// Re-export compile-time validation functions
|
|
16
|
-
export {
|
|
17
|
-
collectIdentifiers,
|
|
18
|
-
validateInputReferences,
|
|
19
|
-
collectOutputAssignments,
|
|
20
|
-
validateOutputReferences,
|
|
21
|
-
validateAllInputReferences,
|
|
22
|
-
validateAllOutputReferences,
|
|
23
|
-
} from './compile-time-validation';
|
|
24
|
-
|
|
25
|
-
// Re-export runtime validation functions and types
|
|
26
|
-
export {
|
|
27
|
-
validateRuntimeInputs,
|
|
28
|
-
validateRuntimeOutputs,
|
|
29
|
-
validateRuntimeInputsDetailed,
|
|
30
|
-
validateRuntimeOutputsDetailed,
|
|
31
|
-
type ValidationError,
|
|
32
|
-
type ValidationResult,
|
|
33
|
-
} from './runtime-validation-codegen';
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Marshaling Code Generation - Backward Compatibility Module
|
|
3
|
-
*
|
|
4
|
-
* This module re-exports code generation utilities from their focused modules
|
|
5
|
-
* for backward compatibility. New code should import directly from the specific
|
|
6
|
-
* modules in src/compiler/codegen/:
|
|
7
|
-
*
|
|
8
|
-
* - codegen/js-marshal.ts: JavaScript marshaling code generation
|
|
9
|
-
* - codegen/js-validation.ts: JavaScript validation code generation
|
|
10
|
-
*
|
|
11
|
-
* @deprecated Import from specific codegen modules instead:
|
|
12
|
-
* - `import { generateMarshalCode } from "./codegen/js-marshal"`
|
|
13
|
-
* - `import { generateValidationCode } from "./codegen/js-validation"`
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
// Re-export all code generation functions for backward compatibility
|
|
17
|
-
export {
|
|
18
|
-
generateMarshalCode,
|
|
19
|
-
generateValidationCode,
|
|
20
|
-
_generateUnmarshalBody,
|
|
21
|
-
} from './codegen/index';
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// Context Resolver Strategy Pattern
|
|
3
|
-
// ============================================================================
|
|
4
|
-
//
|
|
5
|
-
// The ContextResolver interface provides a strategy for resolving identifiers
|
|
6
|
-
// and dollar references in different compilation contexts. This replaces three
|
|
7
|
-
// separate compilation functions with a single unified function plus small
|
|
8
|
-
// strategy implementations.
|
|
9
|
-
//
|
|
10
|
-
// Three modes:
|
|
11
|
-
// 1. Standard: $ -> ctx.get("$"), identifiers -> ctx.get("name")
|
|
12
|
-
// 2. LocalDollar: $ -> Value.Object(dollarVar), identifiers -> ctx.get("name")
|
|
13
|
-
// 3. Scoped: $ -> Value.Object(resultVar), identifiers -> scopedCtx.get("name")
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Strategy interface for resolving context references during expression compilation.
|
|
17
|
-
*
|
|
18
|
-
* Different compilation contexts require different resolutions:
|
|
19
|
-
* - In standard expressions, $ refers to the global context
|
|
20
|
-
* - In expression nodes, $ refers to the local result object being built
|
|
21
|
-
* - In scoped expressions (inputField), identifiers resolve from a scoped context
|
|
22
|
-
*/
|
|
23
|
-
export interface ContextResolver {
|
|
24
|
-
/** Resolve an identifier reference (e.g., "firstName") */
|
|
25
|
-
resolveIdentifier(name: string): string;
|
|
26
|
-
|
|
27
|
-
/** Resolve a $ reference */
|
|
28
|
-
resolveDollarRef(): string;
|
|
29
|
-
|
|
30
|
-
/** Resolve a # reference (current element in higher-order functions) */
|
|
31
|
-
resolveHashRef(): string;
|
|
32
|
-
|
|
33
|
-
/** Resolve a member access path rooted at $ (e.g., "$.foo.bar" returns "foo.bar") */
|
|
34
|
-
resolveDollarPath(path: string): string;
|
|
35
|
-
|
|
36
|
-
/** Resolve a $nodes.X.Y path */
|
|
37
|
-
resolveNodesPath(path: string): string;
|
|
38
|
-
|
|
39
|
-
/** Get the context variable name for use in helper functions */
|
|
40
|
-
getContextVar(): string;
|
|
41
|
-
|
|
42
|
-
/** Create a child resolver for use inside helper functions (e.g., object literals) */
|
|
43
|
-
createChildResolver(): ContextResolver;
|
|
44
|
-
|
|
45
|
-
/** Get extra parameters for generated helper function signatures */
|
|
46
|
-
getHelperParams(): string;
|
|
47
|
-
|
|
48
|
-
/** Get extra arguments for calls to generated helper functions */
|
|
49
|
-
getHelperArgs(): string;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Standard context resolver: $ and identifiers resolve from the global context.
|
|
54
|
-
* Used in switch conditions, decision tables, and other standard expressions.
|
|
55
|
-
*/
|
|
56
|
-
export class StandardContextResolver implements ContextResolver {
|
|
57
|
-
resolveIdentifier(name: string): string {
|
|
58
|
-
return `ctx.get("${name}")`;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
resolveDollarRef(): string {
|
|
62
|
-
return `ctx.get("$")`;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
resolveHashRef(): string {
|
|
66
|
-
return `ctx.get("#")`;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
resolveDollarPath(path: string): string {
|
|
70
|
-
// In standard mode, $.foo.bar -> getProperty(ctx.get("$"), "foo", "bar")
|
|
71
|
-
// Actually use nested getProperty calls for each segment
|
|
72
|
-
const segments = path.split('.');
|
|
73
|
-
let result = `ctx.get("$")`;
|
|
74
|
-
for (const segment of segments) {
|
|
75
|
-
result = `getProperty(${result}, "${segment}")`;
|
|
76
|
-
}
|
|
77
|
-
return result;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
resolveNodesPath(path: string): string {
|
|
81
|
-
return `ctx.get("${path}")`;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
getContextVar(): string {
|
|
85
|
-
return 'ctx';
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
createChildResolver(): ContextResolver {
|
|
89
|
-
// Child is same as parent in standard mode
|
|
90
|
-
return this;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
getHelperParams(): string {
|
|
94
|
-
return '';
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
getHelperArgs(): string {
|
|
98
|
-
return '';
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Local dollar resolver: $ refers to a local Map variable (e.g., "result").
|
|
104
|
-
* Used in expression nodes where $ references the output being built.
|
|
105
|
-
*/
|
|
106
|
-
export class LocalDollarContextResolver implements ContextResolver {
|
|
107
|
-
constructor(private dollarVar: string = 'result') {}
|
|
108
|
-
|
|
109
|
-
resolveIdentifier(name: string): string {
|
|
110
|
-
return `ctx.get("${name}")`;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
resolveDollarRef(): string {
|
|
114
|
-
return `Value.Object(${this.dollarVar})`;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
resolveHashRef(): string {
|
|
118
|
-
return `ctx.get("#")`;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
resolveDollarPath(path: string): string {
|
|
122
|
-
// $.foo.bar looks up "foo.bar" as a flat key in the local result map
|
|
123
|
-
// Expression nodes store keys like "eligibility.specialOffers" as flat strings
|
|
124
|
-
return `(${this.dollarVar}.has("${path}") ? ${this.dollarVar}.get("${path}") : Value.Null())`;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
resolveNodesPath(path: string): string {
|
|
128
|
-
return `ctx.get("${path}")`;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
getContextVar(): string {
|
|
132
|
-
return 'ctx';
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
createChildResolver(): ContextResolver {
|
|
136
|
-
// Child resolver references 'parentResult' to maintain access to outer scope
|
|
137
|
-
// Example: {a: 5, nested: {b: $.a}} - nested object's $.a refers to outer result
|
|
138
|
-
return new LocalDollarContextResolver('parentResult');
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
getHelperParams(): string {
|
|
142
|
-
return ', parentResult: Map<string, Value>';
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
getHelperArgs(): string {
|
|
146
|
-
return `, ${this.dollarVar}`;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Scoped context resolver: identifiers resolve from a scoped context variable.
|
|
152
|
-
* Used for inputField scoping and loop mode where a subset of the context is available.
|
|
153
|
-
*/
|
|
154
|
-
export class ScopedContextResolver implements ContextResolver {
|
|
155
|
-
constructor(
|
|
156
|
-
private ctxVar: string = 'scopedCtx',
|
|
157
|
-
private resultVar: string = 'itemResult',
|
|
158
|
-
) {}
|
|
159
|
-
|
|
160
|
-
resolveIdentifier(name: string): string {
|
|
161
|
-
return `${this.ctxVar}.get("${name}")`;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
resolveDollarRef(): string {
|
|
165
|
-
return `Value.Object(${this.resultVar})`;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
resolveHashRef(): string {
|
|
169
|
-
return `${this.ctxVar}.get("#")`;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
resolveDollarPath(path: string): string {
|
|
173
|
-
// $.foo looks up "foo" in the local result variable
|
|
174
|
-
return `(${this.resultVar}.has("${path}") ? ${this.resultVar}.get("${path}") : Value.Null())`;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
resolveNodesPath(path: string): string {
|
|
178
|
-
return `${this.ctxVar}.get("${path}")`;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
getContextVar(): string {
|
|
182
|
-
return this.ctxVar;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
createChildResolver(): ContextResolver {
|
|
186
|
-
// In scoped context, child keeps the same context var and result var
|
|
187
|
-
return this;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
getHelperParams(): string {
|
|
191
|
-
return `, ${this.ctxVar}: Context, ${this.resultVar}: Map<string, Value>`;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
getHelperArgs(): string {
|
|
195
|
-
return `, ${this.ctxVar}, ${this.resultVar}`;
|
|
196
|
-
}
|
|
197
|
-
}
|