@divmain/jdm-asm 0.2.0
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/.github/workflows/ci.yml +53 -0
- package/.oxfmtrc.json +16 -0
- package/.oxlintrc.json +183 -0
- package/AGENTS.md +81 -0
- package/README.md +769 -0
- package/asconfig.json +23 -0
- package/benchmarks/fixtures.ts +111 -0
- package/benchmarks/input-fixtures.ts +80 -0
- package/benchmarks/run.ts +913 -0
- package/benchmarks/worker-pool.ts +223 -0
- package/benchmarks/worker.ts +374 -0
- package/dist/index.d.ts +996 -0
- package/dist/index.js +12239 -0
- package/dist/index.js.map +1 -0
- package/package.json +49 -0
- package/scripts/run-all-tests.ts +220 -0
- package/src/compiler/EXPRESSION_SUBSETS.md +228 -0
- package/src/compiler/asc-compiler.ts +315 -0
- package/src/compiler/ast-types.ts +215 -0
- package/src/compiler/build.ts +56 -0
- package/src/compiler/cache.ts +414 -0
- package/src/compiler/code-generators.ts +211 -0
- package/src/compiler/codegen/index.ts +15 -0
- package/src/compiler/codegen/js-marshal.ts +999 -0
- package/src/compiler/codegen/js-validation.ts +243 -0
- package/src/compiler/codegen.ts +19 -0
- package/src/compiler/compile-time-validation.ts +507 -0
- package/src/compiler/cst-visitor.ts +434 -0
- package/src/compiler/errors.ts +227 -0
- package/src/compiler/expression-parser.ts +536 -0
- package/src/compiler/graph.ts +197 -0
- package/src/compiler/index.ts +199 -0
- package/src/compiler/input-validation.ts +33 -0
- package/src/compiler/marshal-gen.ts +21 -0
- package/src/compiler/nodes/context-resolvers.ts +197 -0
- package/src/compiler/nodes/decision-table.ts +507 -0
- package/src/compiler/nodes/decision.ts +292 -0
- package/src/compiler/nodes/expression-compiler.ts +526 -0
- package/src/compiler/nodes/expression.ts +425 -0
- package/src/compiler/nodes/function.ts +316 -0
- package/src/compiler/nodes/input.ts +60 -0
- package/src/compiler/nodes/switch.ts +547 -0
- package/src/compiler/optimizer.ts +948 -0
- package/src/compiler/orchestrator.ts +352 -0
- package/src/compiler/parser.ts +115 -0
- package/src/compiler/result-selection.ts +161 -0
- package/src/compiler/runtime/index.ts +26 -0
- package/src/compiler/runtime-codegen.ts +211 -0
- package/src/compiler/runtime-validation-codegen.ts +294 -0
- package/src/compiler/runtime.ts +452 -0
- package/src/compiler/schema.ts +245 -0
- package/src/compiler/switch-branch-detection.ts +92 -0
- package/src/compiler/types.ts +136 -0
- package/src/compiler/unary-ast-transforms.ts +148 -0
- package/src/compiler/unary-parser.ts +301 -0
- package/src/compiler/unary-transform.ts +161 -0
- package/src/compiler/utils.ts +27 -0
- package/src/compiler/virtual-fs.ts +90 -0
- package/src/compiler/wasm-instantiate.ts +127 -0
- package/src/index.ts +1 -0
- package/src/runtime/arrays.ts +579 -0
- package/src/runtime/context.ts +189 -0
- package/src/runtime/expressions.ts +1811 -0
- package/src/runtime/index.ts +8 -0
- package/src/runtime/memory.ts +607 -0
- package/src/runtime/strings.ts +260 -0
- package/src/runtime/tables.ts +96 -0
- package/src/runtime/tsconfig.json +4 -0
- package/src/runtime/values.ts +209 -0
- package/test-data/README.md +83 -0
- package/test-data/decision-tables/basic/8k.json +87992 -0
- package/test-data/decision-tables/basic/affiliate-commission-calculator.json +228 -0
- package/test-data/decision-tables/basic/airline-loyalty-points-calculations.json +285 -0
- package/test-data/decision-tables/basic/airline-upgrade-eligibility.json +466 -0
- package/test-data/decision-tables/basic/auto-insurance-premium-calculator.json +412 -0
- package/test-data/decision-tables/basic/booking-personalization-system.json +553 -0
- package/test-data/decision-tables/basic/care-team-assignment-system.json +585 -0
- package/test-data/decision-tables/basic/claim-validation-system.json +307 -0
- package/test-data/decision-tables/basic/clinical-lab-result-interpreter.json +433 -0
- package/test-data/decision-tables/basic/clinical-treatment-protocol.json +474 -0
- package/test-data/decision-tables/basic/credit-limit-adjustment.json +479 -0
- package/test-data/decision-tables/basic/customer-eligibility-engine.json +551 -0
- package/test-data/decision-tables/basic/customer-lifetime-value.json +200 -0
- package/test-data/decision-tables/basic/customer-onboarding-kyc-verification.json +611 -0
- package/test-data/decision-tables/basic/customer-service-escalation.json +191 -0
- package/test-data/decision-tables/basic/decision-table-discounts.json +168 -0
- package/test-data/decision-tables/basic/decision-table-shipping.json +398 -0
- package/test-data/decision-tables/basic/delivery-route-optimizer.json +271 -0
- package/test-data/decision-tables/basic/device-compatibility-checker.json +303 -0
- package/test-data/decision-tables/basic/disaster-relief-fund-allocation.json +296 -0
- package/test-data/decision-tables/basic/dynamic-fx-rate-pricing-system.json +237 -0
- package/test-data/decision-tables/basic/dynamic-marketplace-comission-calculator.json +242 -0
- package/test-data/decision-tables/basic/dynamic-shipping-cost-calculator.json +378 -0
- package/test-data/decision-tables/basic/dynamic-tarrif-engine.json +289 -0
- package/test-data/decision-tables/basic/dynamic-ticket-pricing.json +325 -0
- package/test-data/decision-tables/basic/empty-column-with-space.json +100 -0
- package/test-data/decision-tables/basic/empty-column-without-space.json +100 -0
- package/test-data/decision-tables/basic/environment-compliance-assessment.json +386 -0
- package/test-data/decision-tables/basic/expression-table-map.json +313 -0
- package/test-data/decision-tables/basic/flash-sale-eligibility.json +366 -0
- package/test-data/decision-tables/basic/flight-dispatch-decision-system.json +455 -0
- package/test-data/decision-tables/basic/flight-rebooking-fee-calculator.json +406 -0
- package/test-data/decision-tables/basic/government-assistance.json +299 -0
- package/test-data/decision-tables/basic/grant-funding-distribution.json +307 -0
- package/test-data/decision-tables/basic/hazardous-materials-management-system.json +414 -0
- package/test-data/decision-tables/basic/immigration-eligibility-evaluator.json +765 -0
- package/test-data/decision-tables/basic/import-duties-calculator.json +318 -0
- package/test-data/decision-tables/basic/insurance-agent-commission.json +228 -0
- package/test-data/decision-tables/basic/insurance-coverage-calculator.json +362 -0
- package/test-data/decision-tables/basic/insurance-underwriting-risk.json +321 -0
- package/test-data/decision-tables/basic/international-roaming-policy-manager.json +199 -0
- package/test-data/decision-tables/basic/legacy-plan-management.json +434 -0
- package/test-data/decision-tables/basic/marketplace-listing-verification-system.json +334 -0
- package/test-data/decision-tables/basic/medication-dosage-calculator.json +318 -0
- package/test-data/decision-tables/basic/merch-bags.json +171 -0
- package/test-data/decision-tables/basic/municipal-permit-evaluation-system.json +364 -0
- package/test-data/decision-tables/basic/mvno-partner-enablement.json +313 -0
- package/test-data/decision-tables/basic/partner-revenue-sharing.json +244 -0
- package/test-data/decision-tables/basic/payment-routing-and-fee-calculator.json +475 -0
- package/test-data/decision-tables/basic/policy-discount-calculator.json +307 -0
- package/test-data/decision-tables/basic/policy-eligibility-analyzer.json +299 -0
- package/test-data/decision-tables/basic/product-listing-scoring.json +358 -0
- package/test-data/decision-tables/basic/realtime-fraud-detection.json +235 -0
- package/test-data/decision-tables/basic/regional-compliance-manager.json +278 -0
- package/test-data/decision-tables/basic/returns-and-refund-policy.json +366 -0
- package/test-data/decision-tables/basic/returns-processing-system.json +448 -0
- package/test-data/decision-tables/basic/school-district-resource-allocation.json +282 -0
- package/test-data/decision-tables/basic/seat-map-optimization.json +325 -0
- package/test-data/decision-tables/basic/seller-fee-calculator.json +307 -0
- package/test-data/decision-tables/basic/service-level-agreement-enforcement.json +575 -0
- package/test-data/decision-tables/basic/smart-financial-product-matcher.json +249 -0
- package/test-data/decision-tables/basic/supply-chain-risk.json +316 -0
- package/test-data/decision-tables/basic/table-loop.json +93 -0
- package/test-data/decision-tables/basic/table.json +76 -0
- package/test-data/decision-tables/basic/traffic-violation-penalty-calculator.json +436 -0
- package/test-data/decision-tables/basic/transaction-compliance-classifier.json +525 -0
- package/test-data/decision-tables/basic/vehicle-claims-resolution.json +310 -0
- package/test-data/decision-tables/basic/warehouse-storage-location.json +345 -0
- package/test-data/decision-tables/hit-policy-collect/collect-multiple-matches.json +127 -0
- package/test-data/decision-tables/hit-policy-collect/collect-no-match.json +95 -0
- package/test-data/decision-tables/hit-policy-first/first-match.json +103 -0
- package/test-data/decision-tables/hit-policy-first/no-match.json +95 -0
- package/test-data/decision-tables/hit-policy-output-order/output-order-respected.json +94 -0
- package/test-data/decision-tables/hit-policy-output-order/string-output-order.json +94 -0
- package/test-data/decision-tables/hit-policy-priority/priority-respected.json +86 -0
- package/test-data/decision-tables/hit-policy-rule-order/rule-order-respected.json +94 -0
- package/test-data/decision-tables/hit-policy-unique/all-match-error.json +89 -0
- package/test-data/decision-tables/hit-policy-unique/multiple-match-error.json +89 -0
- package/test-data/decision-tables/hit-policy-unique/no-match.json +88 -0
- package/test-data/decision-tables/hit-policy-unique/unique-match.json +99 -0
- package/test-data/expressions/arithmetic/error-cyclic.json +114 -0
- package/test-data/expressions/arithmetic/error-missing-input.json +54 -0
- package/test-data/expressions/arithmetic/error-missing-output.json +54 -0
- package/test-data/expressions/arithmetic/expression-default.json +93 -0
- package/test-data/expressions/arithmetic/expression-fields.json +94 -0
- package/test-data/expressions/arithmetic/expression-loop.json +94 -0
- package/test-data/expressions/arithmetic/expression-passthrough.json +108 -0
- package/test-data/expressions/arithmetic/expression.json +69 -0
- package/test-data/expressions/arithmetic/nested-request.json +125 -0
- package/test-data/expressions/arithmetic/number-function.json +58 -0
- package/test-data/expressions/arithmetic/test-number-functions.json +68 -0
- package/test-data/expressions/functions/all.json +149 -0
- package/test-data/expressions/functions/avg.json +89 -0
- package/test-data/expressions/functions/filter.json +109 -0
- package/test-data/expressions/functions/flat.json +167 -0
- package/test-data/expressions/functions/map-strings.json +65 -0
- package/test-data/expressions/functions/map.json +73 -0
- package/test-data/expressions/functions/reduce.json +49 -0
- package/test-data/expressions/functions/some.json +175 -0
- package/test-data/expressions/functions/sort-strings.json +97 -0
- package/test-data/expressions/functions/sort.json +97 -0
- package/test-data/expressions/logical/logical-and.json +116 -0
- package/test-data/expressions/logical/logical-complex.json +260 -0
- package/test-data/expressions/logical/logical-not.json +111 -0
- package/test-data/expressions/logical/logical-or.json +123 -0
- package/test-data/expressions/string/string-comparison.json +128 -0
- package/test-data/expressions/string/string-concat.json +106 -0
- package/test-data/expressions/string/string-contains.json +125 -0
- package/test-data/expressions/string/string-endsWith.json +113 -0
- package/test-data/expressions/string/string-indexOf.json +131 -0
- package/test-data/expressions/string/string-join.json +92 -0
- package/test-data/expressions/string/string-lower.json +94 -0
- package/test-data/expressions/string/string-replace.json +130 -0
- package/test-data/expressions/string/string-split.json +101 -0
- package/test-data/expressions/string/string-startsWith.json +113 -0
- package/test-data/expressions/string/string-substring.json +138 -0
- package/test-data/expressions/string/string-trim.json +100 -0
- package/test-data/expressions/string/string-upper.json +94 -0
- package/test-data/other/custom.json +51 -0
- package/test-data/other/customer-input-schema.json +34 -0
- package/test-data/other/customer-output-schema.json +34 -0
- package/test-data/other/passthrough.json +31 -0
- package/test-data/sub-decisions/basic/$nodes-child.json +31 -0
- package/test-data/sub-decisions/basic/$nodes-parent.json +49 -0
- package/test-data/sub-decisions/basic/recursive-table1.json +49 -0
- package/test-data/sub-decisions/basic/recursive-table2.json +49 -0
- package/test-data/sub-decisions/complex-multi/approval-decision.json +31 -0
- package/test-data/sub-decisions/complex-multi/complex-dag.json +175 -0
- package/test-data/sub-decisions/complex-multi/credit-check.json +31 -0
- package/test-data/sub-decisions/complex-multi/customer-segmentation.json +31 -0
- package/test-data/sub-decisions/complex-multi/discount-eligibility.json +31 -0
- package/test-data/sub-decisions/complex-multi/eligibility-check.json +31 -0
- package/test-data/sub-decisions/complex-multi/final-offer.json +31 -0
- package/test-data/sub-decisions/complex-multi/income-verification.json +31 -0
- package/test-data/sub-decisions/complex-multi/linear-chain.json +121 -0
- package/test-data/sub-decisions/complex-multi/pricing-calculation.json +31 -0
- package/test-data/sub-decisions/complex-multi/product-eligibility.json +31 -0
- package/test-data/sub-decisions/complex-multi/risk-assessment.json +31 -0
- package/test-data/sub-decisions/complex-multi/shared-validation.json +31 -0
- package/test-data/sub-decisions/complex-multi/validation.json +31 -0
- package/test-data/sub-decisions/diamond/decision-a.json +31 -0
- package/test-data/sub-decisions/diamond/decision-b.json +31 -0
- package/test-data/sub-decisions/diamond/decision-c.json +31 -0
- package/test-data/sub-decisions/diamond/decision-shared.json +31 -0
- package/test-data/sub-decisions/diamond/diamond-pattern.json +109 -0
- package/test-data/sub-decisions/error-propagation/parent-calls-error.json +44 -0
- package/test-data/sub-decisions/error-propagation/sub-decision-with-error.json +60 -0
- package/test-data/switch-nodes/basic/account-dormancy-management.json +245 -0
- package/test-data/switch-nodes/basic/application-risk-assessment.json +474 -0
- package/test-data/switch-nodes/basic/cellular-data-rollover-system.json +281 -0
- package/test-data/switch-nodes/basic/clinical-pathway-selection.json +454 -0
- package/test-data/switch-nodes/basic/insurance-prior-authorization.json +467 -0
- package/test-data/switch-nodes/basic/last-mile-delivery-assignment.json +373 -0
- package/test-data/switch-nodes/basic/loan-approval.json +469 -0
- package/test-data/switch-nodes/basic/multi-switch.json +498 -0
- package/test-data/switch-nodes/basic/online-checkin-eligibility.json +285 -0
- package/test-data/switch-nodes/basic/order-consolidation-system.json +493 -0
- package/test-data/switch-nodes/basic/seller-approval-workflow.json +383 -0
- package/test-data/switch-nodes/basic/set-fee.json +243 -0
- package/test-data/switch-nodes/basic/shipping-carrier-selector.json +379 -0
- package/test-data/switch-nodes/basic/switch-node.json +167 -0
- package/test-data/switch-nodes/basic/switch-performance-2.json +1307 -0
- package/test-data/switch-nodes/basic/switch-performance.json +691 -0
- package/test-data/switch-nodes/basic/tax-exemption.json +295 -0
- package/test-data/switch-nodes/basic/warehouse-cross-docking.json +313 -0
- package/test-data/switch-nodes/default-cases/switch-with-default.json +134 -0
- package/test-data/zen-reference/$nodes-child.json +69 -0
- package/test-data/zen-reference/$nodes-parent.json +34 -0
- package/test-data/zen-reference/8k.json +87992 -0
- package/test-data/zen-reference/credit-analysis.json +324 -0
- package/test-data/zen-reference/custom.json +51 -0
- package/test-data/zen-reference/customer-input-schema.json +34 -0
- package/test-data/zen-reference/customer-output-schema.json +34 -0
- package/test-data/zen-reference/error-cyclic.json +114 -0
- package/test-data/zen-reference/error-missing-input.json +54 -0
- package/test-data/zen-reference/error-missing-output.json +54 -0
- package/test-data/zen-reference/expression.json +69 -0
- package/test-data/zen-reference/function-v2.json +48 -0
- package/test-data/zen-reference/function.json +46 -0
- package/test-data/zen-reference/graphs/account-dormancy-management.json +245 -0
- package/test-data/zen-reference/graphs/affiliate-commission-calculator.json +228 -0
- package/test-data/zen-reference/graphs/airline-loyalty-points-calculations.json +285 -0
- package/test-data/zen-reference/graphs/airline-upgrade-eligibility.json +466 -0
- package/test-data/zen-reference/graphs/aml.json +537 -0
- package/test-data/zen-reference/graphs/application-risk-assessment.json +474 -0
- package/test-data/zen-reference/graphs/auto-insurance-premium-calculator.json +412 -0
- package/test-data/zen-reference/graphs/booking-personalization-system.json +553 -0
- package/test-data/zen-reference/graphs/care-team-assignment-system.json +585 -0
- package/test-data/zen-reference/graphs/cellular-data-rollover-system.json +281 -0
- package/test-data/zen-reference/graphs/claim-validation-system.json +307 -0
- package/test-data/zen-reference/graphs/clinical-lab-result-interpreter.json +433 -0
- package/test-data/zen-reference/graphs/clinical-pathway-selection.json +454 -0
- package/test-data/zen-reference/graphs/clinical-treatment-protocol.json +474 -0
- package/test-data/zen-reference/graphs/company-analysis.json +390 -0
- package/test-data/zen-reference/graphs/credit-limit-adjustment.json +479 -0
- package/test-data/zen-reference/graphs/customer-eligibility-engine.json +551 -0
- package/test-data/zen-reference/graphs/customer-lifetime-value.json +200 -0
- package/test-data/zen-reference/graphs/customer-onboarding-kyc-verification.json +611 -0
- package/test-data/zen-reference/graphs/customer-service-escalation.json +191 -0
- package/test-data/zen-reference/graphs/decision-table-discounts.json +168 -0
- package/test-data/zen-reference/graphs/decision-table-shipping.json +398 -0
- package/test-data/zen-reference/graphs/delivery-route-optimizer.json +271 -0
- package/test-data/zen-reference/graphs/device-compatibility-checker.json +303 -0
- package/test-data/zen-reference/graphs/disaster-relief-fund-allocation.json +296 -0
- package/test-data/zen-reference/graphs/dynamic-fx-rate-pricing-system.json +237 -0
- package/test-data/zen-reference/graphs/dynamic-marketplace-comission-calculator.json +242 -0
- package/test-data/zen-reference/graphs/dynamic-shipping-cost-calculator.json +378 -0
- package/test-data/zen-reference/graphs/dynamic-tarrif-engine.json +289 -0
- package/test-data/zen-reference/graphs/dynamic-ticket-pricing.json +325 -0
- package/test-data/zen-reference/graphs/empty-column-with-space.json +100 -0
- package/test-data/zen-reference/graphs/empty-column-without-space.json +100 -0
- package/test-data/zen-reference/graphs/environment-compliance-assessment.json +386 -0
- package/test-data/zen-reference/graphs/expression-default.json +93 -0
- package/test-data/zen-reference/graphs/expression-fields.json +94 -0
- package/test-data/zen-reference/graphs/expression-loop.json +94 -0
- package/test-data/zen-reference/graphs/expression-passthrough.json +108 -0
- package/test-data/zen-reference/graphs/expression-table-map.json +313 -0
- package/test-data/zen-reference/graphs/flash-sale-eligibility.json +366 -0
- package/test-data/zen-reference/graphs/flight-dispatch-decision-system.json +455 -0
- package/test-data/zen-reference/graphs/flight-rebooking-fee-calculator.json +406 -0
- package/test-data/zen-reference/graphs/government-assistance.json +299 -0
- package/test-data/zen-reference/graphs/grant-funding-distribution.json +307 -0
- package/test-data/zen-reference/graphs/hazardous-materials-management-system.json +414 -0
- package/test-data/zen-reference/graphs/immigration-eligibility-evaluator.json +765 -0
- package/test-data/zen-reference/graphs/import-duties-calculator.json +318 -0
- package/test-data/zen-reference/graphs/insurance-agent-commission.json +228 -0
- package/test-data/zen-reference/graphs/insurance-breakdown.json +421 -0
- package/test-data/zen-reference/graphs/insurance-coverage-calculator.json +362 -0
- package/test-data/zen-reference/graphs/insurance-prior-authorization.json +467 -0
- package/test-data/zen-reference/graphs/insurance-underwriting-risk.json +321 -0
- package/test-data/zen-reference/graphs/international-roaming-policy-manager.json +199 -0
- package/test-data/zen-reference/graphs/last-mile-delivery-assignment.json +373 -0
- package/test-data/zen-reference/graphs/legacy-plan-management.json +434 -0
- package/test-data/zen-reference/graphs/loan-approval.json +469 -0
- package/test-data/zen-reference/graphs/marketplace-listing-verification-system.json +334 -0
- package/test-data/zen-reference/graphs/medication-dosage-calculator.json +318 -0
- package/test-data/zen-reference/graphs/merch-bags.json +171 -0
- package/test-data/zen-reference/graphs/multi-switch.json +498 -0
- package/test-data/zen-reference/graphs/municipal-permit-evaluation-system.json +364 -0
- package/test-data/zen-reference/graphs/mvno-partner-enablement.json +313 -0
- package/test-data/zen-reference/graphs/nested-request.json +125 -0
- package/test-data/zen-reference/graphs/online-checkin-eligibility.json +285 -0
- package/test-data/zen-reference/graphs/order-consolidation-system.json +493 -0
- package/test-data/zen-reference/graphs/partner-revenue-sharing.json +244 -0
- package/test-data/zen-reference/graphs/payment-routing-and-fee-calculator.json +475 -0
- package/test-data/zen-reference/graphs/policy-discount-calculator.json +307 -0
- package/test-data/zen-reference/graphs/policy-eligibility-analyzer.json +299 -0
- package/test-data/zen-reference/graphs/product-listing-scoring.json +358 -0
- package/test-data/zen-reference/graphs/realtime-fraud-detection.json +235 -0
- package/test-data/zen-reference/graphs/regional-compliance-manager.json +278 -0
- package/test-data/zen-reference/graphs/returns-and-refund-policy.json +366 -0
- package/test-data/zen-reference/graphs/returns-processing-system.json +448 -0
- package/test-data/zen-reference/graphs/school-district-resource-allocation.json +282 -0
- package/test-data/zen-reference/graphs/seat-map-optimization.json +325 -0
- package/test-data/zen-reference/graphs/seller-approval-workflow.json +383 -0
- package/test-data/zen-reference/graphs/seller-fee-calculator.json +307 -0
- package/test-data/zen-reference/graphs/service-level-agreement-enforcement.json +575 -0
- package/test-data/zen-reference/graphs/set-fee.json +243 -0
- package/test-data/zen-reference/graphs/shipping-carrier-selector.json +379 -0
- package/test-data/zen-reference/graphs/smart-financial-product-matcher.json +249 -0
- package/test-data/zen-reference/graphs/supply-chain-risk.json +316 -0
- package/test-data/zen-reference/graphs/table-loop.json +93 -0
- package/test-data/zen-reference/graphs/tax-exemption.json +295 -0
- package/test-data/zen-reference/graphs/traffic-violation-penalty-calculator.json +436 -0
- package/test-data/zen-reference/graphs/transaction-compliance-classifier.json +525 -0
- package/test-data/zen-reference/graphs/vehicle-claims-resolution.json +310 -0
- package/test-data/zen-reference/graphs/warehouse-cross-docking.json +313 -0
- package/test-data/zen-reference/graphs/warehouse-storage-location.json +345 -0
- package/test-data/zen-reference/http-function.json +34 -0
- package/test-data/zen-reference/infinite-function.json +46 -0
- package/test-data/zen-reference/js/imports.js +25 -0
- package/test-data/zen-reference/passthrough.json +31 -0
- package/test-data/zen-reference/recursive-table1.json +49 -0
- package/test-data/zen-reference/recursive-table2.json +49 -0
- package/test-data/zen-reference/sleep-function.json +34 -0
- package/test-data/zen-reference/switch-node.json +167 -0
- package/test-data/zen-reference/switch-performance-2.json +1307 -0
- package/test-data/zen-reference/switch-performance.json +691 -0
- package/test-data/zen-reference/table.json +76 -0
- package/tests/helpers/index.ts +73 -0
- package/tests/helpers/mock-context.ts +231 -0
- package/tests/helpers/round-trip.ts +398 -0
- package/tests/helpers/test-harness-comparison.ts +325 -0
- package/tests/helpers/test-harness-wasm.ts +710 -0
- package/tests/helpers/test-harness.ts +28 -0
- package/tests/helpers/wasm-test.ts +659 -0
- package/tests/integration/compilation-errors.test.ts +864 -0
- package/tests/integration/decision-tables.test.ts +531 -0
- package/tests/integration/edge-cases.test.ts +787 -0
- package/tests/integration/expressions.test.ts +513 -0
- package/tests/integration/function-node-integration.test.ts +182 -0
- package/tests/integration/sub-decisions.test.ts +108 -0
- package/tests/integration/switch-nodes.test.ts +399 -0
- package/tests/integration/unary-or-matching.test.ts +53 -0
- package/tests/integration/wasm-data-types.test.ts +398 -0
- package/tests/integration/wasm-errors.test.ts +199 -0
- package/tests/integration/wasm-execution.test.ts +348 -0
- package/tests/integration/wasm-memory.test.ts +228 -0
- package/tests/scripts/analyze-coverage.ts +166 -0
- package/tests/scripts/categorize-tests.ts +396 -0
- package/tests/scripts/coverage-analysis.ts +836 -0
- package/tests/unit/compiler/cache.test.ts +238 -0
- package/tests/unit/compiler/errors.test.ts +316 -0
- package/tests/unit/compiler/graph-scalability.test.ts +510 -0
- package/tests/unit/compiler/graph.test.ts +878 -0
- package/tests/unit/compiler/input-validation.test.ts +447 -0
- package/tests/unit/compiler/logical-and-parser.test.ts +143 -0
- package/tests/unit/compiler/logical-not-parser.test.ts +107 -0
- package/tests/unit/compiler/logical-or-parser.test.ts +236 -0
- package/tests/unit/compiler/marshal-gen/marshal-gen.test.ts +97 -0
- package/tests/unit/compiler/nodes/decision-table.test.ts +103 -0
- package/tests/unit/compiler/nodes/decision.test.ts +182 -0
- package/tests/unit/compiler/nodes/function-compile.test.ts +204 -0
- package/tests/unit/compiler/nodes/function.test.ts +176 -0
- package/tests/unit/compiler/nodes/input.test.ts +30 -0
- package/tests/unit/compiler/nodes/switch.test.ts +127 -0
- package/tests/unit/compiler/optimizer-cache.test.ts +327 -0
- package/tests/unit/compiler/optimizer-implementation.test.ts +625 -0
- package/tests/unit/compiler/parser.test.ts +508 -0
- package/tests/unit/compiler/runtime-error-cleanup.test.ts +426 -0
- package/tests/unit/compiler/runtime-validation.test.ts +303 -0
- package/tests/unit/compiler/runtime.test.ts +221 -0
- package/tests/unit/compiler/schema/schema.test.ts +248 -0
- package/tests/unit/compiler/unary-ast-transforms.test.ts +245 -0
- package/tsconfig.json +27 -0
- package/tsup.config.ts +11 -0
- package/vitest.config.ts +12 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,996 @@
|
|
|
1
|
+
import { TSchema } from '@sinclair/typebox';
|
|
2
|
+
export { TSchema } from '@sinclair/typebox';
|
|
3
|
+
import { DirectedGraph } from 'graphology';
|
|
4
|
+
|
|
5
|
+
declare enum NodeType {
|
|
6
|
+
INPUT = "inputNode",
|
|
7
|
+
OUTPUT = "outputNode",
|
|
8
|
+
DECISION_TABLE = "decisionTableNode",
|
|
9
|
+
SWITCH = "switchNode",
|
|
10
|
+
EXPRESSION = "expressionNode",
|
|
11
|
+
DECISION = "decisionNode",
|
|
12
|
+
FUNCTION = "functionNode"
|
|
13
|
+
}
|
|
14
|
+
interface JDMNode {
|
|
15
|
+
id: string;
|
|
16
|
+
type: NodeType;
|
|
17
|
+
name: string;
|
|
18
|
+
position: {
|
|
19
|
+
x: number;
|
|
20
|
+
y: number;
|
|
21
|
+
};
|
|
22
|
+
content?: any;
|
|
23
|
+
parsedContent?: any;
|
|
24
|
+
}
|
|
25
|
+
interface JDMEdge {
|
|
26
|
+
id: string;
|
|
27
|
+
type: string;
|
|
28
|
+
sourceId: string;
|
|
29
|
+
targetId: string;
|
|
30
|
+
/** Optional source handle for nodes with multiple outputs (e.g., switch statements) */
|
|
31
|
+
sourceHandle?: string;
|
|
32
|
+
}
|
|
33
|
+
interface JDMDecision {
|
|
34
|
+
nodes: JDMNode[];
|
|
35
|
+
edges: JDMEdge[];
|
|
36
|
+
metadata?: any;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Validate that a node has all required fields.
|
|
40
|
+
*
|
|
41
|
+
* All JDM nodes must have: id, name, and type.
|
|
42
|
+
* Validating early provides clear error messages before processing.
|
|
43
|
+
*
|
|
44
|
+
* @param node - The node to validate
|
|
45
|
+
* @param index - The index of the node in the nodes array (for error reporting)
|
|
46
|
+
* @throws CompilationError if required fields are missing
|
|
47
|
+
*/
|
|
48
|
+
declare function validateNodeStructure(node: any, index: number): void;
|
|
49
|
+
/**
|
|
50
|
+
* Parse and validate JDM JSON.
|
|
51
|
+
* Function nodes have complex internal structure that needs schema validation and transformation.
|
|
52
|
+
* Validating early provides better error messages and catches issues before expensive compilation steps.
|
|
53
|
+
*/
|
|
54
|
+
declare function parseJDM(jdm: string | JDMDecision | any): JDMDecision;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* No-match behavior options for decision tables and switch nodes.
|
|
58
|
+
*
|
|
59
|
+
* This is a discriminated union to ensure type safety:
|
|
60
|
+
* - returnNull and throwError don't require additional data
|
|
61
|
+
* - returnDefault requires a value at type level
|
|
62
|
+
*/
|
|
63
|
+
type NoMatchBehavior = {
|
|
64
|
+
type: 'returnNull';
|
|
65
|
+
} | {
|
|
66
|
+
type: 'throwError';
|
|
67
|
+
} | {
|
|
68
|
+
type: 'returnDefault';
|
|
69
|
+
value: unknown;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Context passed through compilation phases.
|
|
73
|
+
*/
|
|
74
|
+
interface CompilationContext {
|
|
75
|
+
/** The parsed JDM */
|
|
76
|
+
jdm: JDMDecision;
|
|
77
|
+
/** Input schema (TypeBox) */
|
|
78
|
+
inputSchema: TSchema;
|
|
79
|
+
/** Output schema (TypeBox) */
|
|
80
|
+
outputSchema: TSchema;
|
|
81
|
+
/** Flattened input memory layout */
|
|
82
|
+
inputLayout: FlattenedLayout;
|
|
83
|
+
/** Flattened output memory layout */
|
|
84
|
+
outputLayout: FlattenedLayout;
|
|
85
|
+
/** Schema hash for runtime validation */
|
|
86
|
+
schemaHash: bigint;
|
|
87
|
+
/** Compiler options */
|
|
88
|
+
options: CompilerOptions;
|
|
89
|
+
/** Parse an expression string to AST */
|
|
90
|
+
parseExpression(expr: string): any;
|
|
91
|
+
/** Parse an expression in unary mode */
|
|
92
|
+
parseUnaryExpression(expr: string): any;
|
|
93
|
+
/** Get unique identifier for generated code */
|
|
94
|
+
getUniqueId(prefix: string): string;
|
|
95
|
+
/** Loader function to load sub-decision JDM files by reference key */
|
|
96
|
+
loadDecision(key: string): JDMDecision;
|
|
97
|
+
/** Cache of compiled sub-decisions (key -> compiled code) */
|
|
98
|
+
compiledSubDecisions: Map<string, AssemblyScriptCode>;
|
|
99
|
+
/** Track the current decision path for cycle detection */
|
|
100
|
+
decisionPath: string[];
|
|
101
|
+
/** Generated helper functions for higher-order operations */
|
|
102
|
+
helperFunctions: Map<string, string>;
|
|
103
|
+
/** Function node sources for JavaScript bridge (node ID -> JavaScript source code) */
|
|
104
|
+
functionSources?: Map<string, string>;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Flattened schema layout for direct memory access.
|
|
108
|
+
*/
|
|
109
|
+
interface FlattenedLayout {
|
|
110
|
+
fields: Array<{
|
|
111
|
+
path: string;
|
|
112
|
+
flatName: string;
|
|
113
|
+
type: 'f64' | 'i32' | 'i64' | 'bool' | 'string' | 'array';
|
|
114
|
+
offset: number;
|
|
115
|
+
size: number;
|
|
116
|
+
}>;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Compiler options.
|
|
120
|
+
*/
|
|
121
|
+
interface CompilerOptions {
|
|
122
|
+
optimize?: boolean;
|
|
123
|
+
debug?: boolean;
|
|
124
|
+
validate?: boolean;
|
|
125
|
+
/** How to handle cases where no rules match in decision tables/switches */
|
|
126
|
+
noMatchBehavior?: NoMatchBehavior;
|
|
127
|
+
/** Optional loader function to load sub-decision JDM files */
|
|
128
|
+
loadDecision?: (key: string) => JDMDecision;
|
|
129
|
+
/** Optional testDataRoot path for default loader to search */
|
|
130
|
+
testDataRoot?: string;
|
|
131
|
+
/**
|
|
132
|
+
* Optional path to write debug AssemblyScript files on compilation failure.
|
|
133
|
+
*
|
|
134
|
+
* When compilation fails, the generated AssemblyScript code is written to disk
|
|
135
|
+
* to aid debugging. This option controls where these files are written:
|
|
136
|
+
*
|
|
137
|
+
* - `undefined` (default): No debug files are written
|
|
138
|
+
* - `string`: Files are written to a secure temporary directory under this path
|
|
139
|
+
* - Environment variable `JDM_ASM_DEBUG_OUTPUT`: Falls back to this path if option not set
|
|
140
|
+
*
|
|
141
|
+
* **Filesystem Side Effects:**
|
|
142
|
+
* - Creates temporary directories with random names (e.g., `jdm-asm-debug-XXXXXX`)
|
|
143
|
+
* - Writes `.ts` files with 0o600 permissions (owner read/write only)
|
|
144
|
+
* - Files are NOT automatically cleaned up and may accumulate
|
|
145
|
+
*
|
|
146
|
+
* **Security:**
|
|
147
|
+
* - Uses `fs.mkdtempSync()` to create secure temporary directories
|
|
148
|
+
* - Files are created with restricted permissions (0o600)
|
|
149
|
+
* - Temporary directories have random names to prevent conflicts
|
|
150
|
+
*/
|
|
151
|
+
debugOutputPath?: string;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Result of compilation.
|
|
155
|
+
*/
|
|
156
|
+
interface CompilationResult {
|
|
157
|
+
/** Compiled WASM binary */
|
|
158
|
+
wasm: Uint8Array;
|
|
159
|
+
/** Schema hash for runtime validation */
|
|
160
|
+
schemaHash: bigint;
|
|
161
|
+
/** Generated marshaling code (JS) */
|
|
162
|
+
marshalCode: string;
|
|
163
|
+
/** Generated validation code (JS) */
|
|
164
|
+
validationCode: string;
|
|
165
|
+
/** WAT text format (if debug enabled) */
|
|
166
|
+
wat?: string;
|
|
167
|
+
/** Generated AssemblyScript source (if debug enabled) */
|
|
168
|
+
assemblyScript?: string;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Alias for generated AssemblyScript code strings.
|
|
172
|
+
*/
|
|
173
|
+
type AssemblyScriptCode = string;
|
|
174
|
+
|
|
175
|
+
type JDMGraph = DirectedGraph<JDMNode, JDMEdge>;
|
|
176
|
+
declare function buildGraph(jdm: JDMDecision): JDMGraph;
|
|
177
|
+
declare function validateGraph(graph: JDMGraph): void;
|
|
178
|
+
/**
|
|
179
|
+
* Get nodes in topological order for evaluation.
|
|
180
|
+
* This ensures dependencies are evaluated before dependents.
|
|
181
|
+
*/
|
|
182
|
+
declare function getEvaluationOrder(graph: JDMGraph): string[];
|
|
183
|
+
/**
|
|
184
|
+
* Get all nodes that feed into a given node.
|
|
185
|
+
*/
|
|
186
|
+
declare function getInputNodes(graph: JDMGraph, nodeId: string): JDMNode[];
|
|
187
|
+
/**
|
|
188
|
+
* Get all nodes that a given node feeds into.
|
|
189
|
+
*/
|
|
190
|
+
declare function getOutputNodes(graph: JDMGraph, nodeId: string): JDMNode[];
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Error handling infrastructure for the JDM compiler.
|
|
194
|
+
*
|
|
195
|
+
* This module provides:
|
|
196
|
+
* - CompilationError: The main error class for all compilation failures
|
|
197
|
+
* - ErrorCode: A comprehensive enumeration of all possible error types
|
|
198
|
+
* - SourceLocation: Detailed location information for error reporting
|
|
199
|
+
* - ErrorCollector: Aggregates non-fatal expression errors for batch reporting
|
|
200
|
+
*/
|
|
201
|
+
/**
|
|
202
|
+
* Detailed source location for error reporting.
|
|
203
|
+
*/
|
|
204
|
+
interface SourceLocation {
|
|
205
|
+
/** ID of the node where the error occurred */
|
|
206
|
+
nodeId?: string;
|
|
207
|
+
/** Name of the node where the error occurred */
|
|
208
|
+
nodeName?: string;
|
|
209
|
+
/** Field name within the node */
|
|
210
|
+
field?: string;
|
|
211
|
+
/** Line number in source JDM */
|
|
212
|
+
line?: number;
|
|
213
|
+
/** Column number in source JDM */
|
|
214
|
+
column?: number;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Enumeration of all possible compilation error codes.
|
|
218
|
+
*
|
|
219
|
+
* Errors are categorized into three types:
|
|
220
|
+
* - Structural errors: Critical JDM structure issues that fail compilation immediately
|
|
221
|
+
* - Feature errors: Unsupported features that cannot be handled
|
|
222
|
+
* - Expression errors: Issues in expression parsing that can be collected and reported together
|
|
223
|
+
*/
|
|
224
|
+
declare enum ErrorCode {
|
|
225
|
+
INVALID_JSON = "INVALID_JSON",
|
|
226
|
+
INVALID_NODE_STRUCTURE = "INVALID_NODE_STRUCTURE",
|
|
227
|
+
MISSING_INPUT_NODE = "MISSING_INPUT_NODE",
|
|
228
|
+
MISSING_OUTPUT_NODE = "MISSING_OUTPUT_NODE",
|
|
229
|
+
MULTIPLE_INPUT_NODES = "MULTIPLE_INPUT_NODES",
|
|
230
|
+
CYCLE_DETECTED = "CYCLE_DETECTED",
|
|
231
|
+
INVALID_EDGE = "INVALID_EDGE",
|
|
232
|
+
UNSUPPORTED_FUNCTION_NODE = "UNSUPPORTED_FUNCTION_NODE",
|
|
233
|
+
UNSUPPORTED_EXPRESSION = "UNSUPPORTED_EXPRESSION",
|
|
234
|
+
PARSE_ERROR = "PARSE_ERROR",
|
|
235
|
+
UNKNOWN_FUNCTION = "UNKNOWN_FUNCTION",
|
|
236
|
+
TYPE_MISMATCH = "TYPE_MISMATCH",
|
|
237
|
+
UNKNOWN_FIELD = "UNKNOWN_FIELD",
|
|
238
|
+
SCHEMA_MISMATCH = "SCHEMA_MISMATCH",
|
|
239
|
+
INVALID_SCHEMA = "INVALID_SCHEMA"
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Custom error class for compilation failures.
|
|
243
|
+
*
|
|
244
|
+
* Provides structured error information including error code, source location,
|
|
245
|
+
* and additional context for debugging.
|
|
246
|
+
*/
|
|
247
|
+
declare class CompilationError extends Error {
|
|
248
|
+
readonly code: ErrorCode;
|
|
249
|
+
readonly location?: SourceLocation | undefined;
|
|
250
|
+
readonly context?: Record<string, unknown> | undefined;
|
|
251
|
+
readonly name = "CompilationError";
|
|
252
|
+
constructor(message: string, code: ErrorCode, location?: SourceLocation | undefined, context?: Record<string, unknown> | undefined);
|
|
253
|
+
/**
|
|
254
|
+
* Get a formatted error message with location information.
|
|
255
|
+
*/
|
|
256
|
+
getFormattedMessage(): string;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Collector for non-fatal errors during expression parsing.
|
|
260
|
+
*
|
|
261
|
+
* This allows the parser to continue and collect multiple errors rather than
|
|
262
|
+
* failing on the first one, providing a better user experience by reporting
|
|
263
|
+
* all issues at once.
|
|
264
|
+
*
|
|
265
|
+
* @example
|
|
266
|
+
* const collector = new ErrorCollector();
|
|
267
|
+
* collector.add(new CompilationError('Undefined variable', ErrorCode.UNKNOWN_FIELD, { nodeName: 'AgeCheck' }));
|
|
268
|
+
* collector.add(new CompilationError('Type mismatch', ErrorCode.TYPE_MISMATCH, { nodeName: 'AgeCheck' }));
|
|
269
|
+
* collector.throwIfErrors(); // Throws with aggregated message
|
|
270
|
+
*/
|
|
271
|
+
declare class ErrorCollector {
|
|
272
|
+
private errors;
|
|
273
|
+
/**
|
|
274
|
+
* Add an error to the collector.
|
|
275
|
+
*/
|
|
276
|
+
add(error: CompilationError): void;
|
|
277
|
+
/**
|
|
278
|
+
* Check if any errors have been collected.
|
|
279
|
+
*/
|
|
280
|
+
hasErrors(): boolean;
|
|
281
|
+
/**
|
|
282
|
+
* Throw if there are any collected errors.
|
|
283
|
+
*
|
|
284
|
+
* Single errors throw directly to preserve original context and stack trace. Multiple
|
|
285
|
+
* errors are aggregated into one with numbered list, so developers see all problems at
|
|
286
|
+
* once instead of fixing issues one-by-one through repeated compile attempts.
|
|
287
|
+
*/
|
|
288
|
+
throwIfErrors(): void;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Type guard to check if an error is a CompilationError.
|
|
292
|
+
*/
|
|
293
|
+
declare function isCompilationError(error: unknown): error is CompilationError;
|
|
294
|
+
/**
|
|
295
|
+
* Type guard to check if an error code is a structural error.
|
|
296
|
+
*/
|
|
297
|
+
declare function isStructuralError(code: ErrorCode): boolean;
|
|
298
|
+
/**
|
|
299
|
+
* Type guard to check if an error code is a feature error.
|
|
300
|
+
*/
|
|
301
|
+
declare function isFeatureError(code: ErrorCode): boolean;
|
|
302
|
+
/**
|
|
303
|
+
* Type guard to check if an error code is an expression error.
|
|
304
|
+
*/
|
|
305
|
+
declare function isExpressionError(code: ErrorCode): boolean;
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Union type of all expression AST nodes.
|
|
309
|
+
*/
|
|
310
|
+
type ExpressionAST = NumberLiteral | StringLiteral | BooleanLiteral | NullLiteral | Identifier | DollarRef | HashRef | BinaryOp | UnaryOp | TernaryOp | MemberAccess | IndexAccess | FunctionCall | Interval | TemplateLiteral | ArrayLiteral | ObjectLiteral;
|
|
311
|
+
interface NumberLiteral {
|
|
312
|
+
type: 'NumberLiteral';
|
|
313
|
+
value: number;
|
|
314
|
+
}
|
|
315
|
+
interface StringLiteral {
|
|
316
|
+
type: 'StringLiteral';
|
|
317
|
+
value: string;
|
|
318
|
+
}
|
|
319
|
+
interface BooleanLiteral {
|
|
320
|
+
type: 'BooleanLiteral';
|
|
321
|
+
value: boolean;
|
|
322
|
+
}
|
|
323
|
+
interface NullLiteral {
|
|
324
|
+
type: 'NullLiteral';
|
|
325
|
+
}
|
|
326
|
+
interface Identifier {
|
|
327
|
+
type: 'Identifier';
|
|
328
|
+
name: string;
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Dollar reference - used in unary mode to refer to the current value.
|
|
332
|
+
* Represents `$` in decision table cell expressions.
|
|
333
|
+
*/
|
|
334
|
+
interface DollarRef {
|
|
335
|
+
type: 'DollarRef';
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Hash reference - used in higher-order functions to refer to current element.
|
|
339
|
+
* Represents `#` in expressions like `filter(items, # > 5)`.
|
|
340
|
+
*/
|
|
341
|
+
interface HashRef {
|
|
342
|
+
type: 'HashRef';
|
|
343
|
+
}
|
|
344
|
+
interface BinaryOp {
|
|
345
|
+
type: 'BinaryOp';
|
|
346
|
+
op: BinaryOperator;
|
|
347
|
+
left: ExpressionAST;
|
|
348
|
+
right: ExpressionAST;
|
|
349
|
+
}
|
|
350
|
+
type BinaryOperator = '+' | '-' | '*' | '/' | '%' | '^' | '==' | '!=' | '<' | '>' | '<=' | '>=' | 'and' | 'or' | '??' | 'in' | 'not in';
|
|
351
|
+
interface UnaryOp {
|
|
352
|
+
type: 'UnaryOp';
|
|
353
|
+
op: UnaryOperator;
|
|
354
|
+
operand: ExpressionAST;
|
|
355
|
+
}
|
|
356
|
+
type UnaryOperator = 'not' | '-';
|
|
357
|
+
interface TernaryOp {
|
|
358
|
+
type: 'TernaryOp';
|
|
359
|
+
condition: ExpressionAST;
|
|
360
|
+
consequent: ExpressionAST;
|
|
361
|
+
alternate: ExpressionAST;
|
|
362
|
+
}
|
|
363
|
+
interface MemberAccess {
|
|
364
|
+
type: 'MemberAccess';
|
|
365
|
+
object: ExpressionAST;
|
|
366
|
+
property: string;
|
|
367
|
+
}
|
|
368
|
+
interface IndexAccess {
|
|
369
|
+
type: 'IndexAccess';
|
|
370
|
+
object: ExpressionAST;
|
|
371
|
+
index: ExpressionAST;
|
|
372
|
+
}
|
|
373
|
+
interface FunctionCall {
|
|
374
|
+
type: 'FunctionCall';
|
|
375
|
+
callee: ExpressionAST;
|
|
376
|
+
args: ExpressionAST[];
|
|
377
|
+
}
|
|
378
|
+
interface Interval {
|
|
379
|
+
type: 'Interval';
|
|
380
|
+
start: ExpressionAST;
|
|
381
|
+
end: ExpressionAST;
|
|
382
|
+
startInclusive: boolean;
|
|
383
|
+
endInclusive: boolean;
|
|
384
|
+
}
|
|
385
|
+
interface TemplateLiteral {
|
|
386
|
+
type: 'TemplateLiteral';
|
|
387
|
+
parts: Array<{
|
|
388
|
+
text: string;
|
|
389
|
+
} | {
|
|
390
|
+
expr: ExpressionAST;
|
|
391
|
+
}>;
|
|
392
|
+
}
|
|
393
|
+
interface ArrayLiteral {
|
|
394
|
+
type: 'ArrayLiteral';
|
|
395
|
+
elements: ExpressionAST[];
|
|
396
|
+
}
|
|
397
|
+
interface ObjectLiteral {
|
|
398
|
+
type: 'ObjectLiteral';
|
|
399
|
+
properties: Array<{
|
|
400
|
+
key: string;
|
|
401
|
+
value: ExpressionAST;
|
|
402
|
+
}>;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* Optimization Pipeline for JDM to WebAssembly Compilation
|
|
407
|
+
*
|
|
408
|
+
* This module defines the interface for optimization passes and the runner
|
|
409
|
+
* that applies them sequentially to transform the compiled AST into an
|
|
410
|
+
* optimized form before code generation.
|
|
411
|
+
*/
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* Cache for parsed expression ASTs.
|
|
415
|
+
* Maps expression strings to their parsed AST nodes to avoid redundant parsing.
|
|
416
|
+
*/
|
|
417
|
+
type ExpressionCache = Map<string, ExpressionAST>;
|
|
418
|
+
/**
|
|
419
|
+
* Compiled AST - the intermediate representation after parsing.
|
|
420
|
+
*
|
|
421
|
+
* JDMDecision structure is simple enough for in-place transformation, avoiding the
|
|
422
|
+
* complexity and memory overhead of building a separate intermediate representation.
|
|
423
|
+
*/
|
|
424
|
+
type CompiledAST = JDMDecision;
|
|
425
|
+
/**
|
|
426
|
+
* Interface for an optimization pass.
|
|
427
|
+
*
|
|
428
|
+
* Each optimization pass receives the compiled AST and returns a
|
|
429
|
+
* potentially modified/optimized AST.
|
|
430
|
+
*/
|
|
431
|
+
interface OptimizationPass {
|
|
432
|
+
/** Human-readable name of the optimization pass */
|
|
433
|
+
name: string;
|
|
434
|
+
/**
|
|
435
|
+
* Run the optimization pass on the given AST.
|
|
436
|
+
*
|
|
437
|
+
* @param ast - The compiled AST to optimize
|
|
438
|
+
* @returns The optimized AST
|
|
439
|
+
*/
|
|
440
|
+
run(ast: CompiledAST): CompiledAST;
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Ordered list of optimization passes.
|
|
444
|
+
*
|
|
445
|
+
* Passes have dependencies - one pass may create opportunities for the next. For example,
|
|
446
|
+
* constant folding might convert "if (2 > 3)" to "if (false)", then dead code elimination
|
|
447
|
+
* removes the unreachable branch. Running DCE before folding would miss this optimization.
|
|
448
|
+
*/
|
|
449
|
+
declare const optimizer: OptimizationPass[];
|
|
450
|
+
/**
|
|
451
|
+
* Run all optimization passes sequentially on the given AST.
|
|
452
|
+
*
|
|
453
|
+
* @param ast - The compiled AST to optimize
|
|
454
|
+
* @returns The fully optimized AST
|
|
455
|
+
*/
|
|
456
|
+
declare function runOptimizations(ast: CompiledAST): CompiledAST;
|
|
457
|
+
/**
|
|
458
|
+
* Get the expression cache for a node, creating it if it doesn't exist.
|
|
459
|
+
*/
|
|
460
|
+
declare function getExpressionCache(node: JDMNode): ExpressionCache;
|
|
461
|
+
/**
|
|
462
|
+
* Clear the expression cache for a node.
|
|
463
|
+
* Should be called when the node's expressions are modified.
|
|
464
|
+
*/
|
|
465
|
+
declare function clearExpressionCache(node: JDMNode): void;
|
|
466
|
+
|
|
467
|
+
/**
|
|
468
|
+
* Fold constant expressions at compile time.
|
|
469
|
+
*
|
|
470
|
+
* This pass traverses expression ASTs and evaluates them at compile time
|
|
471
|
+
* when possible. Examples:
|
|
472
|
+
* - Replace (2 + 3) with 5
|
|
473
|
+
* - Replace true and false with false
|
|
474
|
+
* - Replace "hello" + " world" with "hello world"
|
|
475
|
+
*
|
|
476
|
+
* @param ast - The compiled AST to optimize
|
|
477
|
+
* @returns The AST with folded constants
|
|
478
|
+
*/
|
|
479
|
+
declare function constantFolding(ast: CompiledAST): CompiledAST;
|
|
480
|
+
/**
|
|
481
|
+
* Remove unreachable code.
|
|
482
|
+
*
|
|
483
|
+
* This pass identifies and removes branches that can never be reached.
|
|
484
|
+
* Examples:
|
|
485
|
+
* - Remove if branches with constant false conditions
|
|
486
|
+
* - Remove decision table rows with always-false conditions
|
|
487
|
+
* - Remove decision table rows that can never match after previous rows
|
|
488
|
+
*
|
|
489
|
+
* @param ast - The compiled AST to optimize
|
|
490
|
+
* @returns The AST with dead code removed
|
|
491
|
+
*/
|
|
492
|
+
declare function deadCodeElimination(ast: CompiledAST): CompiledAST;
|
|
493
|
+
/**
|
|
494
|
+
* Inline small expressions.
|
|
495
|
+
*
|
|
496
|
+
* This pass replaces function calls with evaluated results for pure functions.
|
|
497
|
+
* Examples:
|
|
498
|
+
* - Inline small arithmetic operations in decision table cells
|
|
499
|
+
* - Pre-evaluate expressions that don't depend on runtime values
|
|
500
|
+
*
|
|
501
|
+
* @param ast - The compiled AST to optimize
|
|
502
|
+
* @returns The AST with inlined expressions
|
|
503
|
+
*/
|
|
504
|
+
declare function expressionInlining(ast: CompiledAST): CompiledAST;
|
|
505
|
+
/**
|
|
506
|
+
* Build index structures for efficient table lookup.
|
|
507
|
+
*
|
|
508
|
+
* This pass transforms linear search structures into more efficient alternatives.
|
|
509
|
+
* Examples:
|
|
510
|
+
* - Convert decision table rows with equality checks to index-based lookup
|
|
511
|
+
* - Mark tables that are good candidates for switch statement generation
|
|
512
|
+
*
|
|
513
|
+
* Table indexing converts O(n) linear search to O(1) hash lookup when all rules check
|
|
514
|
+
* equality on a single column with unique values - this is common in lookup tables
|
|
515
|
+
* (e.g., pricing tiers by customer type) and can improve evaluation time by 10-100x
|
|
516
|
+
* for large tables.
|
|
517
|
+
*
|
|
518
|
+
* @param ast - The compiled AST to optimize
|
|
519
|
+
* @returns The AST with optimized table lookups
|
|
520
|
+
*/
|
|
521
|
+
declare function tableIndexing(ast: CompiledAST): CompiledAST;
|
|
522
|
+
|
|
523
|
+
/**
|
|
524
|
+
* JavaScript Validation Code Generation
|
|
525
|
+
*
|
|
526
|
+
* This module generates JavaScript code for validating input data against
|
|
527
|
+
* TypeBox schemas before marshaling. The generated code performs:
|
|
528
|
+
*
|
|
529
|
+
* - Type checking for primitives (string, number, boolean)
|
|
530
|
+
* - Required field validation
|
|
531
|
+
* - Nested object validation
|
|
532
|
+
* - Array element validation
|
|
533
|
+
* - Union type validation
|
|
534
|
+
* - Literal value validation
|
|
535
|
+
*
|
|
536
|
+
* The generated validators are standalone JavaScript code that doesn't
|
|
537
|
+
* require runtime schema compilation, making validation fast and predictable.
|
|
538
|
+
*/
|
|
539
|
+
|
|
540
|
+
/**
|
|
541
|
+
* Generate JavaScript validation code.
|
|
542
|
+
*
|
|
543
|
+
* This function generates JavaScript code that validates input data
|
|
544
|
+
* against the TypeBox schema before marshaling.
|
|
545
|
+
*
|
|
546
|
+
* Generates custom validation code that checks types and required fields
|
|
547
|
+
* without requiring runtime schema compilation.
|
|
548
|
+
*
|
|
549
|
+
* @param schema - The TypeBox schema to validate against
|
|
550
|
+
* @returns Generated validation code as a string
|
|
551
|
+
*/
|
|
552
|
+
declare function generateValidationCode(schema: TSchema): string;
|
|
553
|
+
|
|
554
|
+
/**
|
|
555
|
+
* Type definitions for marshal and unmarshal functions.
|
|
556
|
+
*/
|
|
557
|
+
type MarshalFn = (data: Record<string, unknown>, memory: WebAssembly.Memory) => number;
|
|
558
|
+
type UnmarshalFn = (ptr: number, memory: WebAssembly.Memory) => Record<string, unknown>;
|
|
559
|
+
type ValidateFn = (data: unknown) => void;
|
|
560
|
+
/**
|
|
561
|
+
* Load generated marshaling code as executable functions.
|
|
562
|
+
*
|
|
563
|
+
* @internal This function uses Function constructor to execute generated code.
|
|
564
|
+
* The code is generated by the compiler and is trusted, but users should be
|
|
565
|
+
* aware that this executes arbitrary JavaScript in the current context.
|
|
566
|
+
*
|
|
567
|
+
* @param code - The generated marshaling code
|
|
568
|
+
* @returns Object with marshal and unmarshal functions
|
|
569
|
+
*/
|
|
570
|
+
declare function loadGeneratedMarshaling(code: string): {
|
|
571
|
+
marshal: MarshalFn;
|
|
572
|
+
unmarshal: UnmarshalFn;
|
|
573
|
+
};
|
|
574
|
+
/**
|
|
575
|
+
* Load generated validation code as executable function.
|
|
576
|
+
*
|
|
577
|
+
* @param code - The generated validation code
|
|
578
|
+
* @returns Validation function
|
|
579
|
+
*/
|
|
580
|
+
declare function loadGeneratedValidation(code: string): Promise<ValidateFn>;
|
|
581
|
+
|
|
582
|
+
/**
|
|
583
|
+
* Error type for runtime evaluation errors.
|
|
584
|
+
*/
|
|
585
|
+
declare class RuntimeError extends Error {
|
|
586
|
+
readonly code: number;
|
|
587
|
+
readonly context?: Record<string, unknown> | undefined;
|
|
588
|
+
constructor(message: string, code?: number, context?: Record<string, unknown> | undefined);
|
|
589
|
+
}
|
|
590
|
+
/**
|
|
591
|
+
* Ensure WASM memory is large enough for the required size.
|
|
592
|
+
*
|
|
593
|
+
* This function checks if the current memory buffer is large enough
|
|
594
|
+
* and grows it by 64KB pages if needed.
|
|
595
|
+
*
|
|
596
|
+
* @param memory - The WebAssembly.Memory instance
|
|
597
|
+
* @param required - The required memory size in bytes
|
|
598
|
+
* @throws {RuntimeError} If memory cannot be grown (e.g., exceeds maximum)
|
|
599
|
+
*
|
|
600
|
+
* @example
|
|
601
|
+
* ```typescript
|
|
602
|
+
* ensureMemory(memory, 131072); // Ensure at least 128KB is available
|
|
603
|
+
* ```
|
|
604
|
+
*/
|
|
605
|
+
declare function ensureMemory(memory: WebAssembly.Memory, required: number): void;
|
|
606
|
+
|
|
607
|
+
/**
|
|
608
|
+
* Options for creating a CompiledDecision instance.
|
|
609
|
+
*/
|
|
610
|
+
interface CompiledDecisionOptions {
|
|
611
|
+
/** The compiled WASM binary */
|
|
612
|
+
wasm: Uint8Array;
|
|
613
|
+
/** Schema hash for validation */
|
|
614
|
+
schemaHash: bigint;
|
|
615
|
+
/** Function to marshal input to WASM memory */
|
|
616
|
+
marshal: MarshalFn;
|
|
617
|
+
/** Function to unmarshal output from WASM memory */
|
|
618
|
+
unmarshal: UnmarshalFn;
|
|
619
|
+
/** Function to validate input against schema */
|
|
620
|
+
validate?: ValidateFn;
|
|
621
|
+
/** Initial memory size in pages (default: 1 page = 64KB) */
|
|
622
|
+
initialMemoryPages?: number;
|
|
623
|
+
/** Maximum memory pages (default: DEFAULT_MAX_MEMORY_PAGES = 256 pages = 16MB) */
|
|
624
|
+
maximumMemoryPages?: number;
|
|
625
|
+
}
|
|
626
|
+
/**
|
|
627
|
+
* A compiled JDM decision ready for evaluation.
|
|
628
|
+
*
|
|
629
|
+
* This class manages the lifecycle of evaluating a compiled decision:
|
|
630
|
+
* 1. Validates input against schema (fail fast with good error)
|
|
631
|
+
* 2. Marshals input to WASM memory
|
|
632
|
+
* 3. Resets heap for fresh evaluation
|
|
633
|
+
* 4. Runs evaluation
|
|
634
|
+
* 5. Checks for runtime errors (schema mismatch, etc.)
|
|
635
|
+
* 6. Unmarshals output from WASM memory
|
|
636
|
+
*
|
|
637
|
+
* @example
|
|
638
|
+
* ```typescript
|
|
639
|
+
* const decision = new CompiledDecision({
|
|
640
|
+
* wasm: compilationResult.wasm,
|
|
641
|
+
* schemaHash: compilationResult.schemaHash,
|
|
642
|
+
* marshal: marshalInput,
|
|
643
|
+
* unmarshal: unmarshalOutput,
|
|
644
|
+
* validate: validateInput,
|
|
645
|
+
* });
|
|
646
|
+
*
|
|
647
|
+
* const output = await decision.evaluate({ age: 25, name: 'Alice' });
|
|
648
|
+
* ```
|
|
649
|
+
*/
|
|
650
|
+
declare class CompiledDecision {
|
|
651
|
+
private options;
|
|
652
|
+
private instance;
|
|
653
|
+
private memory;
|
|
654
|
+
private module;
|
|
655
|
+
private marshal;
|
|
656
|
+
private unmarshal;
|
|
657
|
+
private validate?;
|
|
658
|
+
constructor(options: CompiledDecisionOptions);
|
|
659
|
+
/**
|
|
660
|
+
* Initialize the WebAssembly instance.
|
|
661
|
+
* This is done lazily on first evaluation, or can be called explicitly.
|
|
662
|
+
*/
|
|
663
|
+
private initialize;
|
|
664
|
+
/**
|
|
665
|
+
* Evaluate the decision with the given input.
|
|
666
|
+
*
|
|
667
|
+
* @param input - The input data to evaluate
|
|
668
|
+
* @returns The output of the decision evaluation
|
|
669
|
+
* @throws {RuntimeError} If evaluation fails
|
|
670
|
+
* @throws {ValidationError} If input validation fails (if validate is provided)
|
|
671
|
+
*/
|
|
672
|
+
evaluate<I = Record<string, unknown>, O = Record<string, unknown>>(input: I): Promise<O>;
|
|
673
|
+
/**
|
|
674
|
+
* Get a human-readable error message for a given error code.
|
|
675
|
+
*
|
|
676
|
+
* @param errorCode - The error code from getLastError()
|
|
677
|
+
* @returns A human-readable error message
|
|
678
|
+
*/
|
|
679
|
+
private getErrorMessage;
|
|
680
|
+
/**
|
|
681
|
+
* Get the current WebAssembly memory instance.
|
|
682
|
+
* This can be useful for debugging or direct memory inspection.
|
|
683
|
+
*
|
|
684
|
+
* @returns The WebAssembly.Memory instance (null if not initialized)
|
|
685
|
+
*/
|
|
686
|
+
getMemory(): WebAssembly.Memory | null;
|
|
687
|
+
/**
|
|
688
|
+
* Get the current WebAssembly instance.
|
|
689
|
+
*
|
|
690
|
+
* @returns The WebAssembly.Instance instance (null if not initialized)
|
|
691
|
+
*/
|
|
692
|
+
getInstance(): WebAssembly.Instance | null;
|
|
693
|
+
/**
|
|
694
|
+
* Dispose of this CompiledDecision instance.
|
|
695
|
+
* This clears the WebAssembly instance and allows garbage collection.
|
|
696
|
+
*/
|
|
697
|
+
dispose(): void;
|
|
698
|
+
/**
|
|
699
|
+
* Get memory usage statistics.
|
|
700
|
+
*
|
|
701
|
+
* @returns Object with memory usage information
|
|
702
|
+
*/
|
|
703
|
+
getMemoryStats(): {
|
|
704
|
+
current: number;
|
|
705
|
+
maximum: number;
|
|
706
|
+
used: number;
|
|
707
|
+
};
|
|
708
|
+
/**
|
|
709
|
+
* Get the input buffer pointer, ensuring sufficient memory is available.
|
|
710
|
+
*
|
|
711
|
+
* This method doesn't allocate new buffers on each call - it always returns the
|
|
712
|
+
* same INPUT_BUFFER_START_OFFSET constant after ensuring the memory can accommodate the
|
|
713
|
+
* required size. Single-allocation design chosen because: (1) heap is reset between
|
|
714
|
+
* evaluations so fragmentation isn't an issue, (2) simpler than maintaining a free
|
|
715
|
+
* list, (3) marshal code controls actual layout in WASM memory. All input data is
|
|
716
|
+
* marshaled into a single buffer starting at INPUT_BUFFER_START_OFFSET.
|
|
717
|
+
*
|
|
718
|
+
* @param required - The required memory size in bytes
|
|
719
|
+
* @returns The base pointer of the input buffer (always INPUT_BUFFER_START_OFFSET)
|
|
720
|
+
* @throws {RuntimeError} If memory cannot be grown to accommodate the required size
|
|
721
|
+
*
|
|
722
|
+
* @example
|
|
723
|
+
* ```typescript
|
|
724
|
+
* const ptr = decision.getInputBuffer(1024); // Ensure 1KB available
|
|
725
|
+
* ```
|
|
726
|
+
*/
|
|
727
|
+
getInputBuffer(required: number): number;
|
|
728
|
+
}
|
|
729
|
+
/**
|
|
730
|
+
* Create a CompiledDecision instance from a CompilationResult.
|
|
731
|
+
*
|
|
732
|
+
* This is a convenience function that creates the necessary marshal,
|
|
733
|
+
* unmarshal, and validation functions from the generated code.
|
|
734
|
+
*
|
|
735
|
+
* @param result - The compilation result
|
|
736
|
+
* @param validate - Optional validation function (defaults to generated validation code)
|
|
737
|
+
* @returns A CompiledDecision instance ready for evaluation
|
|
738
|
+
*
|
|
739
|
+
* @example
|
|
740
|
+
* ```typescript
|
|
741
|
+
* const result = await compile({
|
|
742
|
+
* jdm: myJdm,
|
|
743
|
+
* inputSchema: MyInputSchema,
|
|
744
|
+
* outputSchema: MyOutputSchema,
|
|
745
|
+
* });
|
|
746
|
+
*
|
|
747
|
+
* const decision = createCompiledDecision(result);
|
|
748
|
+
* const output = await decision.evaluate({ age: 25 });
|
|
749
|
+
* ```
|
|
750
|
+
*/
|
|
751
|
+
declare function createCompiledDecision(result: CompilationResult, validate?: ValidateFn): Promise<CompiledDecision>;
|
|
752
|
+
|
|
753
|
+
/**
|
|
754
|
+
* Compile-time validation for decision models.
|
|
755
|
+
*
|
|
756
|
+
* This module provides functions to perform static analysis of JDM structure
|
|
757
|
+
* and references at compile time. These checks detect missing references,
|
|
758
|
+
* undeclared identifiers, and unassigned outputs before code generation.
|
|
759
|
+
*
|
|
760
|
+
* These functions operate on ASTs and CompilationContext - they do NOT
|
|
761
|
+
* execute at runtime. For runtime data validation, see runtime-validation-codegen.ts.
|
|
762
|
+
*/
|
|
763
|
+
|
|
764
|
+
/**
|
|
765
|
+
* Collect all identifier references from an expression AST.
|
|
766
|
+
*
|
|
767
|
+
* This function walks the AST and collects all variable/field references
|
|
768
|
+
* that need to be resolved from the context. It handles:
|
|
769
|
+
* - Simple identifiers: `age`, `name`
|
|
770
|
+
* - Member access: `customer.age`, `order.items[0].price`
|
|
771
|
+
*
|
|
772
|
+
* @param ast - The expression AST to analyze
|
|
773
|
+
* @returns Set of all identifier names referenced in the expression
|
|
774
|
+
*/
|
|
775
|
+
declare function collectIdentifiers(ast: ExpressionAST): Set<string>;
|
|
776
|
+
/**
|
|
777
|
+
* Validate that all referenced identifiers exist in the input schema.
|
|
778
|
+
*
|
|
779
|
+
* This function checks that all input references in expressions are declared
|
|
780
|
+
* in the input schema. It builds a set of expected input fields from the
|
|
781
|
+
* flattened layout and compares it against the identifiers used in expressions.
|
|
782
|
+
*
|
|
783
|
+
* @param referencedIdentifiers - Set of identifiers used in expressions
|
|
784
|
+
* @param context - The compilation context containing the input schema
|
|
785
|
+
* @param location - Source location for error reporting
|
|
786
|
+
* @throws CompilationError if any referenced input is not declared
|
|
787
|
+
*/
|
|
788
|
+
declare function validateInputReferences(referencedIdentifiers: Set<string>, context: CompilationContext, location?: SourceLocation): void;
|
|
789
|
+
/**
|
|
790
|
+
* Collect all output assignments from a decision.
|
|
791
|
+
*
|
|
792
|
+
* This function walks through all nodes in the decision and collects
|
|
793
|
+
* the output paths that are assigned by expression nodes and decision table nodes.
|
|
794
|
+
*
|
|
795
|
+
* @param context - The compilation context
|
|
796
|
+
* @returns Set of all output paths assigned by the decision
|
|
797
|
+
*/
|
|
798
|
+
declare function collectOutputAssignments(context: CompilationContext, errorCollector?: ErrorCollector): Set<string>;
|
|
799
|
+
/**
|
|
800
|
+
* Validate that all expected outputs from the schema are assigned.
|
|
801
|
+
*
|
|
802
|
+
* This function checks that all output fields defined in the output schema
|
|
803
|
+
* are actually assigned by the decision logic. It builds a set of expected
|
|
804
|
+
* output fields from the flattened layout and compares it against the
|
|
805
|
+
* outputs that are assigned by expression nodes and decision table nodes.
|
|
806
|
+
*
|
|
807
|
+
* @param assignedOutputs - Set of output paths assigned by the decision
|
|
808
|
+
* @param context - The compilation context containing the output schema
|
|
809
|
+
* @param location - Source location for error reporting
|
|
810
|
+
* @throws CompilationError if any expected output is not assigned
|
|
811
|
+
*/
|
|
812
|
+
declare function validateOutputReferences(assignedOutputs: Set<string>, context: CompilationContext, location?: SourceLocation): void;
|
|
813
|
+
/**
|
|
814
|
+
* Validate output assignments for all nodes in a decision.
|
|
815
|
+
*
|
|
816
|
+
* This is a convenience function that validates that all expected outputs
|
|
817
|
+
* from the output schema are actually assigned by the decision logic.
|
|
818
|
+
*
|
|
819
|
+
* @param context - The compilation context
|
|
820
|
+
* @throws CompilationError if any expected output is not assigned or if errors occur during collection
|
|
821
|
+
*/
|
|
822
|
+
declare function validateAllOutputReferences(context: CompilationContext): void;
|
|
823
|
+
/**
|
|
824
|
+
* Validate input references for all expression nodes in a decision.
|
|
825
|
+
*
|
|
826
|
+
* This is a convenience function that validates all expressions in the decision
|
|
827
|
+
* at once, collecting all errors before throwing.
|
|
828
|
+
*
|
|
829
|
+
* @param context - The compilation context
|
|
830
|
+
* @throws CompilationError if any expression references an undeclared input or contains parse errors
|
|
831
|
+
*/
|
|
832
|
+
declare function validateAllInputReferences(context: CompilationContext): void;
|
|
833
|
+
|
|
834
|
+
/**
|
|
835
|
+
* Runtime validation code generation for decision models.
|
|
836
|
+
*
|
|
837
|
+
* This module provides functions that generate or perform validation code
|
|
838
|
+
* that executes at runtime. These functions validate actual data against
|
|
839
|
+
* schemas when the decision is evaluated.
|
|
840
|
+
*
|
|
841
|
+
* For compile-time static analysis (checking references exist, etc.),
|
|
842
|
+
* see compile-time-validation.ts.
|
|
843
|
+
*/
|
|
844
|
+
|
|
845
|
+
/**
|
|
846
|
+
* Validation error containing field path, expected type, and actual value.
|
|
847
|
+
*/
|
|
848
|
+
interface ValidationError {
|
|
849
|
+
/** The field path (e.g., "customer.age") */
|
|
850
|
+
path: string;
|
|
851
|
+
/** Error message describing the issue */
|
|
852
|
+
message: string;
|
|
853
|
+
/** The expected type */
|
|
854
|
+
expected?: string;
|
|
855
|
+
/** The actual value that failed validation */
|
|
856
|
+
actual?: unknown;
|
|
857
|
+
}
|
|
858
|
+
/**
|
|
859
|
+
* Result of runtime validation.
|
|
860
|
+
*/
|
|
861
|
+
interface ValidationResult {
|
|
862
|
+
/** Whether validation passed */
|
|
863
|
+
valid: boolean;
|
|
864
|
+
/** Array of validation errors (empty if valid) */
|
|
865
|
+
errors: ValidationError[];
|
|
866
|
+
}
|
|
867
|
+
/**
|
|
868
|
+
* Validate runtime input data against the input schema.
|
|
869
|
+
*
|
|
870
|
+
* This function checks that all required input fields from the schema
|
|
871
|
+
* are present in the provided input data AND that they have correct types.
|
|
872
|
+
* It returns a list of validation errors including missing fields and
|
|
873
|
+
* type mismatches.
|
|
874
|
+
*
|
|
875
|
+
* Security note: This validation prevents malformed input with wrong types
|
|
876
|
+
* (string instead of number, object instead of array) from being marshaled
|
|
877
|
+
* to WASM, which could cause runtime errors or unexpected behavior.
|
|
878
|
+
*
|
|
879
|
+
* @param inputData - Runtime input data as a JavaScript object
|
|
880
|
+
* @param inputLayout - Flattened layout from the input schema
|
|
881
|
+
* @returns Array of missing/invalid input field paths (empty if all valid)
|
|
882
|
+
*/
|
|
883
|
+
declare function validateRuntimeInputs(inputData: Record<string, any>, inputLayout: FlattenedLayout): string[];
|
|
884
|
+
/**
|
|
885
|
+
* Validate runtime input data with detailed error information.
|
|
886
|
+
*
|
|
887
|
+
* This function performs comprehensive validation including:
|
|
888
|
+
* - Presence checking: All required fields must be present
|
|
889
|
+
* - Type checking: Values must match expected types
|
|
890
|
+
* - Range checking: Numbers must be finite (not NaN/Infinity unless intended)
|
|
891
|
+
*
|
|
892
|
+
* @param inputData - Runtime input data as a JavaScript object
|
|
893
|
+
* @param inputLayout - Flattened layout from the input schema
|
|
894
|
+
* @returns Detailed validation result with errors
|
|
895
|
+
*/
|
|
896
|
+
declare function validateRuntimeInputsDetailed(inputData: Record<string, any>, inputLayout: FlattenedLayout): ValidationResult;
|
|
897
|
+
/**
|
|
898
|
+
* Validate runtime output data against the output schema.
|
|
899
|
+
*
|
|
900
|
+
* This function checks that all required output fields from the schema
|
|
901
|
+
* are present in the provided output data AND that they have correct types.
|
|
902
|
+
* It returns a list of validation errors including missing fields and
|
|
903
|
+
* type mismatches.
|
|
904
|
+
*
|
|
905
|
+
* @param outputData - Runtime output data as a JavaScript object
|
|
906
|
+
* @param outputLayout - Flattened layout from the output schema
|
|
907
|
+
* @returns Array of missing/invalid output field paths (empty if all valid)
|
|
908
|
+
*/
|
|
909
|
+
declare function validateRuntimeOutputs(outputData: Record<string, any>, outputLayout: FlattenedLayout): string[];
|
|
910
|
+
/**
|
|
911
|
+
* Validate runtime output data with detailed error information.
|
|
912
|
+
*
|
|
913
|
+
* This function performs comprehensive validation including:
|
|
914
|
+
* - Presence checking: All required output fields must be present
|
|
915
|
+
* - Type checking: Values must match expected types
|
|
916
|
+
*
|
|
917
|
+
* @param outputData - Runtime output data as a JavaScript object
|
|
918
|
+
* @param outputLayout - Flattened layout from the output schema
|
|
919
|
+
* @returns Detailed validation result with errors
|
|
920
|
+
*/
|
|
921
|
+
declare function validateRuntimeOutputsDetailed(outputData: Record<string, any>, outputLayout: FlattenedLayout): ValidationResult;
|
|
922
|
+
|
|
923
|
+
/**
|
|
924
|
+
* Get the cache directory path
|
|
925
|
+
* Exposes where compiled WASM modules are stored on disk
|
|
926
|
+
*/
|
|
927
|
+
declare function getCacheDirectory(): string;
|
|
928
|
+
/**
|
|
929
|
+
* Get cache health diagnostics
|
|
930
|
+
* Returns information about cache status, any issues, and recent operations
|
|
931
|
+
*/
|
|
932
|
+
declare function getCacheHealth(): {
|
|
933
|
+
enabled: boolean;
|
|
934
|
+
directory: string;
|
|
935
|
+
directoryExists: boolean;
|
|
936
|
+
accessible: boolean;
|
|
937
|
+
stats: {
|
|
938
|
+
entries: number;
|
|
939
|
+
totalSize: number;
|
|
940
|
+
oldestEntry: number | null;
|
|
941
|
+
newestEntry: number | null;
|
|
942
|
+
};
|
|
943
|
+
issues: string[];
|
|
944
|
+
};
|
|
945
|
+
/**
|
|
946
|
+
* Clear the entire cache
|
|
947
|
+
*/
|
|
948
|
+
declare function clearCache(): void;
|
|
949
|
+
/**
|
|
950
|
+
* Get cache statistics
|
|
951
|
+
*/
|
|
952
|
+
declare function getCacheStats(): {
|
|
953
|
+
entries: number;
|
|
954
|
+
totalSize: number;
|
|
955
|
+
oldestEntry: number | null;
|
|
956
|
+
newestEntry: number | null;
|
|
957
|
+
};
|
|
958
|
+
/**
|
|
959
|
+
* Prune old cache entries (keep most recent N entries or entries younger than maxAge)
|
|
960
|
+
*/
|
|
961
|
+
declare function pruneCache(options?: {
|
|
962
|
+
maxEntries?: number;
|
|
963
|
+
maxAgeMs?: number;
|
|
964
|
+
}): number;
|
|
965
|
+
/**
|
|
966
|
+
* Check if caching is enabled
|
|
967
|
+
* Can be disabled via JDM_ASM_NO_CACHE=1 environment variable
|
|
968
|
+
*/
|
|
969
|
+
declare function isCacheEnabled(): boolean;
|
|
970
|
+
|
|
971
|
+
/**
|
|
972
|
+
* Main entry point: Compile JDM to WASM with schema-driven marshaling.
|
|
973
|
+
*
|
|
974
|
+
* @example
|
|
975
|
+
* const result = await compile({
|
|
976
|
+
* inputSchema: InputSchema,
|
|
977
|
+
* outputSchema: OutputSchema,
|
|
978
|
+
* jdm: jdmJson,
|
|
979
|
+
* optimize: true,
|
|
980
|
+
* });
|
|
981
|
+
*/
|
|
982
|
+
declare function compile(options: {
|
|
983
|
+
inputSchema: TSchema;
|
|
984
|
+
outputSchema: TSchema;
|
|
985
|
+
jdm: string | JDMDecision;
|
|
986
|
+
optimize?: boolean;
|
|
987
|
+
debug?: boolean;
|
|
988
|
+
/** How to handle cases where no rules match in decision tables/switches */
|
|
989
|
+
noMatchBehavior?: NoMatchBehavior;
|
|
990
|
+
/** Optional loader function to load sub-decision JDM files */
|
|
991
|
+
loadDecision?: CompilerOptions['loadDecision'];
|
|
992
|
+
/** Optional testDataRoot path for default loader to search */
|
|
993
|
+
testDataRoot?: string;
|
|
994
|
+
}): Promise<CompilationResult>;
|
|
995
|
+
|
|
996
|
+
export { type AssemblyScriptCode, type CompilationContext, CompilationError, type CompilationResult, type CompiledAST, CompiledDecision, type CompiledDecisionOptions, type CompilerOptions, ErrorCode, ErrorCollector, type FlattenedLayout, type JDMDecision, type JDMEdge, type JDMGraph, type JDMNode, type MarshalFn, type NoMatchBehavior, NodeType, type OptimizationPass, RuntimeError, type SourceLocation, type UnmarshalFn, type ValidateFn, type ValidationError, type ValidationResult, buildGraph, clearCache, clearExpressionCache, collectIdentifiers, collectOutputAssignments, compile, constantFolding, createCompiledDecision, deadCodeElimination, ensureMemory, expressionInlining, generateValidationCode, getCacheDirectory, getCacheHealth, getCacheStats, getEvaluationOrder, getExpressionCache, getInputNodes, getOutputNodes, isCacheEnabled, isCompilationError, isExpressionError, isFeatureError, isStructuralError, loadGeneratedMarshaling, loadGeneratedValidation, optimizer, parseJDM, pruneCache, runOptimizations, tableIndexing, validateAllInputReferences, validateAllOutputReferences, validateGraph, validateInputReferences, validateNodeStructure, validateOutputReferences, validateRuntimeInputs, validateRuntimeInputsDetailed, validateRuntimeOutputs, validateRuntimeOutputsDetailed };
|