@divmain/jdm-asm 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2227 -29
- package/dist/index.js.map +1 -1
- package/package.json +8 -2
- package/.github/workflows/ci.yml +0 -53
- package/.oxfmtrc.json +0 -16
- package/.oxlintrc.json +0 -183
- package/AGENTS.md +0 -81
- package/asconfig.json +0 -23
- package/benchmarks/fixtures.ts +0 -111
- package/benchmarks/input-fixtures.ts +0 -80
- package/benchmarks/run.ts +0 -913
- package/benchmarks/worker-pool.ts +0 -223
- package/benchmarks/worker.ts +0 -374
- package/scripts/run-all-tests.ts +0 -220
- package/src/compiler/EXPRESSION_SUBSETS.md +0 -228
- package/src/compiler/asc-compiler.ts +0 -315
- package/src/compiler/ast-types.ts +0 -215
- package/src/compiler/build.ts +0 -56
- package/src/compiler/cache.ts +0 -414
- package/src/compiler/code-generators.ts +0 -211
- package/src/compiler/codegen/index.ts +0 -15
- package/src/compiler/codegen/js-marshal.ts +0 -999
- package/src/compiler/codegen/js-validation.ts +0 -243
- package/src/compiler/codegen.ts +0 -19
- package/src/compiler/compile-time-validation.ts +0 -507
- package/src/compiler/cst-visitor.ts +0 -434
- package/src/compiler/errors.ts +0 -227
- package/src/compiler/expression-parser.ts +0 -536
- package/src/compiler/graph.ts +0 -197
- package/src/compiler/index.ts +0 -199
- package/src/compiler/input-validation.ts +0 -33
- package/src/compiler/marshal-gen.ts +0 -21
- package/src/compiler/nodes/context-resolvers.ts +0 -197
- package/src/compiler/nodes/decision-table.ts +0 -507
- package/src/compiler/nodes/decision.ts +0 -292
- package/src/compiler/nodes/expression-compiler.ts +0 -526
- package/src/compiler/nodes/expression.ts +0 -425
- package/src/compiler/nodes/function.ts +0 -316
- package/src/compiler/nodes/input.ts +0 -60
- package/src/compiler/nodes/switch.ts +0 -547
- package/src/compiler/optimizer.ts +0 -948
- package/src/compiler/orchestrator.ts +0 -352
- package/src/compiler/parser.ts +0 -115
- package/src/compiler/result-selection.ts +0 -161
- package/src/compiler/runtime/index.ts +0 -26
- package/src/compiler/runtime-codegen.ts +0 -211
- package/src/compiler/runtime-validation-codegen.ts +0 -294
- package/src/compiler/runtime.ts +0 -452
- package/src/compiler/schema.ts +0 -245
- package/src/compiler/switch-branch-detection.ts +0 -92
- package/src/compiler/types.ts +0 -136
- package/src/compiler/unary-ast-transforms.ts +0 -148
- package/src/compiler/unary-parser.ts +0 -301
- package/src/compiler/unary-transform.ts +0 -161
- package/src/compiler/utils.ts +0 -27
- package/src/compiler/virtual-fs.ts +0 -90
- package/src/compiler/wasm-instantiate.ts +0 -127
- package/src/index.ts +0 -1
- package/src/runtime/arrays.ts +0 -579
- package/src/runtime/context.ts +0 -189
- package/src/runtime/expressions.ts +0 -1811
- package/src/runtime/index.ts +0 -8
- package/src/runtime/memory.ts +0 -607
- package/src/runtime/strings.ts +0 -260
- package/src/runtime/tables.ts +0 -96
- package/src/runtime/tsconfig.json +0 -4
- package/src/runtime/values.ts +0 -209
- package/test-data/README.md +0 -83
- package/test-data/decision-tables/basic/8k.json +0 -87992
- package/test-data/decision-tables/basic/affiliate-commission-calculator.json +0 -228
- package/test-data/decision-tables/basic/airline-loyalty-points-calculations.json +0 -285
- package/test-data/decision-tables/basic/airline-upgrade-eligibility.json +0 -466
- package/test-data/decision-tables/basic/auto-insurance-premium-calculator.json +0 -412
- package/test-data/decision-tables/basic/booking-personalization-system.json +0 -553
- package/test-data/decision-tables/basic/care-team-assignment-system.json +0 -585
- package/test-data/decision-tables/basic/claim-validation-system.json +0 -307
- package/test-data/decision-tables/basic/clinical-lab-result-interpreter.json +0 -433
- package/test-data/decision-tables/basic/clinical-treatment-protocol.json +0 -474
- package/test-data/decision-tables/basic/credit-limit-adjustment.json +0 -479
- package/test-data/decision-tables/basic/customer-eligibility-engine.json +0 -551
- package/test-data/decision-tables/basic/customer-lifetime-value.json +0 -200
- package/test-data/decision-tables/basic/customer-onboarding-kyc-verification.json +0 -611
- package/test-data/decision-tables/basic/customer-service-escalation.json +0 -191
- package/test-data/decision-tables/basic/decision-table-discounts.json +0 -168
- package/test-data/decision-tables/basic/decision-table-shipping.json +0 -398
- package/test-data/decision-tables/basic/delivery-route-optimizer.json +0 -271
- package/test-data/decision-tables/basic/device-compatibility-checker.json +0 -303
- package/test-data/decision-tables/basic/disaster-relief-fund-allocation.json +0 -296
- package/test-data/decision-tables/basic/dynamic-fx-rate-pricing-system.json +0 -237
- package/test-data/decision-tables/basic/dynamic-marketplace-comission-calculator.json +0 -242
- package/test-data/decision-tables/basic/dynamic-shipping-cost-calculator.json +0 -378
- package/test-data/decision-tables/basic/dynamic-tarrif-engine.json +0 -289
- package/test-data/decision-tables/basic/dynamic-ticket-pricing.json +0 -325
- package/test-data/decision-tables/basic/empty-column-with-space.json +0 -100
- package/test-data/decision-tables/basic/empty-column-without-space.json +0 -100
- package/test-data/decision-tables/basic/environment-compliance-assessment.json +0 -386
- package/test-data/decision-tables/basic/expression-table-map.json +0 -313
- package/test-data/decision-tables/basic/flash-sale-eligibility.json +0 -366
- package/test-data/decision-tables/basic/flight-dispatch-decision-system.json +0 -455
- package/test-data/decision-tables/basic/flight-rebooking-fee-calculator.json +0 -406
- package/test-data/decision-tables/basic/government-assistance.json +0 -299
- package/test-data/decision-tables/basic/grant-funding-distribution.json +0 -307
- package/test-data/decision-tables/basic/hazardous-materials-management-system.json +0 -414
- package/test-data/decision-tables/basic/immigration-eligibility-evaluator.json +0 -765
- package/test-data/decision-tables/basic/import-duties-calculator.json +0 -318
- package/test-data/decision-tables/basic/insurance-agent-commission.json +0 -228
- package/test-data/decision-tables/basic/insurance-coverage-calculator.json +0 -362
- package/test-data/decision-tables/basic/insurance-underwriting-risk.json +0 -321
- package/test-data/decision-tables/basic/international-roaming-policy-manager.json +0 -199
- package/test-data/decision-tables/basic/legacy-plan-management.json +0 -434
- package/test-data/decision-tables/basic/marketplace-listing-verification-system.json +0 -334
- package/test-data/decision-tables/basic/medication-dosage-calculator.json +0 -318
- package/test-data/decision-tables/basic/merch-bags.json +0 -171
- package/test-data/decision-tables/basic/municipal-permit-evaluation-system.json +0 -364
- package/test-data/decision-tables/basic/mvno-partner-enablement.json +0 -313
- package/test-data/decision-tables/basic/partner-revenue-sharing.json +0 -244
- package/test-data/decision-tables/basic/payment-routing-and-fee-calculator.json +0 -475
- package/test-data/decision-tables/basic/policy-discount-calculator.json +0 -307
- package/test-data/decision-tables/basic/policy-eligibility-analyzer.json +0 -299
- package/test-data/decision-tables/basic/product-listing-scoring.json +0 -358
- package/test-data/decision-tables/basic/realtime-fraud-detection.json +0 -235
- package/test-data/decision-tables/basic/regional-compliance-manager.json +0 -278
- package/test-data/decision-tables/basic/returns-and-refund-policy.json +0 -366
- package/test-data/decision-tables/basic/returns-processing-system.json +0 -448
- package/test-data/decision-tables/basic/school-district-resource-allocation.json +0 -282
- package/test-data/decision-tables/basic/seat-map-optimization.json +0 -325
- package/test-data/decision-tables/basic/seller-fee-calculator.json +0 -307
- package/test-data/decision-tables/basic/service-level-agreement-enforcement.json +0 -575
- package/test-data/decision-tables/basic/smart-financial-product-matcher.json +0 -249
- package/test-data/decision-tables/basic/supply-chain-risk.json +0 -316
- package/test-data/decision-tables/basic/table-loop.json +0 -93
- package/test-data/decision-tables/basic/table.json +0 -76
- package/test-data/decision-tables/basic/traffic-violation-penalty-calculator.json +0 -436
- package/test-data/decision-tables/basic/transaction-compliance-classifier.json +0 -525
- package/test-data/decision-tables/basic/vehicle-claims-resolution.json +0 -310
- package/test-data/decision-tables/basic/warehouse-storage-location.json +0 -345
- package/test-data/decision-tables/hit-policy-collect/collect-multiple-matches.json +0 -127
- package/test-data/decision-tables/hit-policy-collect/collect-no-match.json +0 -95
- package/test-data/decision-tables/hit-policy-first/first-match.json +0 -103
- package/test-data/decision-tables/hit-policy-first/no-match.json +0 -95
- package/test-data/decision-tables/hit-policy-output-order/output-order-respected.json +0 -94
- package/test-data/decision-tables/hit-policy-output-order/string-output-order.json +0 -94
- package/test-data/decision-tables/hit-policy-priority/priority-respected.json +0 -86
- package/test-data/decision-tables/hit-policy-rule-order/rule-order-respected.json +0 -94
- package/test-data/decision-tables/hit-policy-unique/all-match-error.json +0 -89
- package/test-data/decision-tables/hit-policy-unique/multiple-match-error.json +0 -89
- package/test-data/decision-tables/hit-policy-unique/no-match.json +0 -88
- package/test-data/decision-tables/hit-policy-unique/unique-match.json +0 -99
- package/test-data/expressions/arithmetic/error-cyclic.json +0 -114
- package/test-data/expressions/arithmetic/error-missing-input.json +0 -54
- package/test-data/expressions/arithmetic/error-missing-output.json +0 -54
- package/test-data/expressions/arithmetic/expression-default.json +0 -93
- package/test-data/expressions/arithmetic/expression-fields.json +0 -94
- package/test-data/expressions/arithmetic/expression-loop.json +0 -94
- package/test-data/expressions/arithmetic/expression-passthrough.json +0 -108
- package/test-data/expressions/arithmetic/expression.json +0 -69
- package/test-data/expressions/arithmetic/nested-request.json +0 -125
- package/test-data/expressions/arithmetic/number-function.json +0 -58
- package/test-data/expressions/arithmetic/test-number-functions.json +0 -68
- package/test-data/expressions/functions/all.json +0 -149
- package/test-data/expressions/functions/avg.json +0 -89
- package/test-data/expressions/functions/filter.json +0 -109
- package/test-data/expressions/functions/flat.json +0 -167
- package/test-data/expressions/functions/map-strings.json +0 -65
- package/test-data/expressions/functions/map.json +0 -73
- package/test-data/expressions/functions/reduce.json +0 -49
- package/test-data/expressions/functions/some.json +0 -175
- package/test-data/expressions/functions/sort-strings.json +0 -97
- package/test-data/expressions/functions/sort.json +0 -97
- package/test-data/expressions/logical/logical-and.json +0 -116
- package/test-data/expressions/logical/logical-complex.json +0 -260
- package/test-data/expressions/logical/logical-not.json +0 -111
- package/test-data/expressions/logical/logical-or.json +0 -123
- package/test-data/expressions/string/string-comparison.json +0 -128
- package/test-data/expressions/string/string-concat.json +0 -106
- package/test-data/expressions/string/string-contains.json +0 -125
- package/test-data/expressions/string/string-endsWith.json +0 -113
- package/test-data/expressions/string/string-indexOf.json +0 -131
- package/test-data/expressions/string/string-join.json +0 -92
- package/test-data/expressions/string/string-lower.json +0 -94
- package/test-data/expressions/string/string-replace.json +0 -130
- package/test-data/expressions/string/string-split.json +0 -101
- package/test-data/expressions/string/string-startsWith.json +0 -113
- package/test-data/expressions/string/string-substring.json +0 -138
- package/test-data/expressions/string/string-trim.json +0 -100
- package/test-data/expressions/string/string-upper.json +0 -94
- package/test-data/other/custom.json +0 -51
- package/test-data/other/customer-input-schema.json +0 -34
- package/test-data/other/customer-output-schema.json +0 -34
- package/test-data/other/passthrough.json +0 -31
- package/test-data/sub-decisions/basic/$nodes-child.json +0 -31
- package/test-data/sub-decisions/basic/$nodes-parent.json +0 -49
- package/test-data/sub-decisions/basic/recursive-table1.json +0 -49
- package/test-data/sub-decisions/basic/recursive-table2.json +0 -49
- package/test-data/sub-decisions/complex-multi/approval-decision.json +0 -31
- package/test-data/sub-decisions/complex-multi/complex-dag.json +0 -175
- package/test-data/sub-decisions/complex-multi/credit-check.json +0 -31
- package/test-data/sub-decisions/complex-multi/customer-segmentation.json +0 -31
- package/test-data/sub-decisions/complex-multi/discount-eligibility.json +0 -31
- package/test-data/sub-decisions/complex-multi/eligibility-check.json +0 -31
- package/test-data/sub-decisions/complex-multi/final-offer.json +0 -31
- package/test-data/sub-decisions/complex-multi/income-verification.json +0 -31
- package/test-data/sub-decisions/complex-multi/linear-chain.json +0 -121
- package/test-data/sub-decisions/complex-multi/pricing-calculation.json +0 -31
- package/test-data/sub-decisions/complex-multi/product-eligibility.json +0 -31
- package/test-data/sub-decisions/complex-multi/risk-assessment.json +0 -31
- package/test-data/sub-decisions/complex-multi/shared-validation.json +0 -31
- package/test-data/sub-decisions/complex-multi/validation.json +0 -31
- package/test-data/sub-decisions/diamond/decision-a.json +0 -31
- package/test-data/sub-decisions/diamond/decision-b.json +0 -31
- package/test-data/sub-decisions/diamond/decision-c.json +0 -31
- package/test-data/sub-decisions/diamond/decision-shared.json +0 -31
- package/test-data/sub-decisions/diamond/diamond-pattern.json +0 -109
- package/test-data/sub-decisions/error-propagation/parent-calls-error.json +0 -44
- package/test-data/sub-decisions/error-propagation/sub-decision-with-error.json +0 -60
- package/test-data/switch-nodes/basic/account-dormancy-management.json +0 -245
- package/test-data/switch-nodes/basic/application-risk-assessment.json +0 -474
- package/test-data/switch-nodes/basic/cellular-data-rollover-system.json +0 -281
- package/test-data/switch-nodes/basic/clinical-pathway-selection.json +0 -454
- package/test-data/switch-nodes/basic/insurance-prior-authorization.json +0 -467
- package/test-data/switch-nodes/basic/last-mile-delivery-assignment.json +0 -373
- package/test-data/switch-nodes/basic/loan-approval.json +0 -469
- package/test-data/switch-nodes/basic/multi-switch.json +0 -498
- package/test-data/switch-nodes/basic/online-checkin-eligibility.json +0 -285
- package/test-data/switch-nodes/basic/order-consolidation-system.json +0 -493
- package/test-data/switch-nodes/basic/seller-approval-workflow.json +0 -383
- package/test-data/switch-nodes/basic/set-fee.json +0 -243
- package/test-data/switch-nodes/basic/shipping-carrier-selector.json +0 -379
- package/test-data/switch-nodes/basic/switch-node.json +0 -167
- package/test-data/switch-nodes/basic/switch-performance-2.json +0 -1307
- package/test-data/switch-nodes/basic/switch-performance.json +0 -691
- package/test-data/switch-nodes/basic/tax-exemption.json +0 -295
- package/test-data/switch-nodes/basic/warehouse-cross-docking.json +0 -313
- package/test-data/switch-nodes/default-cases/switch-with-default.json +0 -134
- package/test-data/zen-reference/$nodes-child.json +0 -69
- package/test-data/zen-reference/$nodes-parent.json +0 -34
- package/test-data/zen-reference/8k.json +0 -87992
- package/test-data/zen-reference/credit-analysis.json +0 -324
- package/test-data/zen-reference/custom.json +0 -51
- package/test-data/zen-reference/customer-input-schema.json +0 -34
- package/test-data/zen-reference/customer-output-schema.json +0 -34
- package/test-data/zen-reference/error-cyclic.json +0 -114
- package/test-data/zen-reference/error-missing-input.json +0 -54
- package/test-data/zen-reference/error-missing-output.json +0 -54
- package/test-data/zen-reference/expression.json +0 -69
- package/test-data/zen-reference/function-v2.json +0 -48
- package/test-data/zen-reference/function.json +0 -46
- package/test-data/zen-reference/graphs/account-dormancy-management.json +0 -245
- package/test-data/zen-reference/graphs/affiliate-commission-calculator.json +0 -228
- package/test-data/zen-reference/graphs/airline-loyalty-points-calculations.json +0 -285
- package/test-data/zen-reference/graphs/airline-upgrade-eligibility.json +0 -466
- package/test-data/zen-reference/graphs/aml.json +0 -537
- package/test-data/zen-reference/graphs/application-risk-assessment.json +0 -474
- package/test-data/zen-reference/graphs/auto-insurance-premium-calculator.json +0 -412
- package/test-data/zen-reference/graphs/booking-personalization-system.json +0 -553
- package/test-data/zen-reference/graphs/care-team-assignment-system.json +0 -585
- package/test-data/zen-reference/graphs/cellular-data-rollover-system.json +0 -281
- package/test-data/zen-reference/graphs/claim-validation-system.json +0 -307
- package/test-data/zen-reference/graphs/clinical-lab-result-interpreter.json +0 -433
- package/test-data/zen-reference/graphs/clinical-pathway-selection.json +0 -454
- package/test-data/zen-reference/graphs/clinical-treatment-protocol.json +0 -474
- package/test-data/zen-reference/graphs/company-analysis.json +0 -390
- package/test-data/zen-reference/graphs/credit-limit-adjustment.json +0 -479
- package/test-data/zen-reference/graphs/customer-eligibility-engine.json +0 -551
- package/test-data/zen-reference/graphs/customer-lifetime-value.json +0 -200
- package/test-data/zen-reference/graphs/customer-onboarding-kyc-verification.json +0 -611
- package/test-data/zen-reference/graphs/customer-service-escalation.json +0 -191
- package/test-data/zen-reference/graphs/decision-table-discounts.json +0 -168
- package/test-data/zen-reference/graphs/decision-table-shipping.json +0 -398
- package/test-data/zen-reference/graphs/delivery-route-optimizer.json +0 -271
- package/test-data/zen-reference/graphs/device-compatibility-checker.json +0 -303
- package/test-data/zen-reference/graphs/disaster-relief-fund-allocation.json +0 -296
- package/test-data/zen-reference/graphs/dynamic-fx-rate-pricing-system.json +0 -237
- package/test-data/zen-reference/graphs/dynamic-marketplace-comission-calculator.json +0 -242
- package/test-data/zen-reference/graphs/dynamic-shipping-cost-calculator.json +0 -378
- package/test-data/zen-reference/graphs/dynamic-tarrif-engine.json +0 -289
- package/test-data/zen-reference/graphs/dynamic-ticket-pricing.json +0 -325
- package/test-data/zen-reference/graphs/empty-column-with-space.json +0 -100
- package/test-data/zen-reference/graphs/empty-column-without-space.json +0 -100
- package/test-data/zen-reference/graphs/environment-compliance-assessment.json +0 -386
- package/test-data/zen-reference/graphs/expression-default.json +0 -93
- package/test-data/zen-reference/graphs/expression-fields.json +0 -94
- package/test-data/zen-reference/graphs/expression-loop.json +0 -94
- package/test-data/zen-reference/graphs/expression-passthrough.json +0 -108
- package/test-data/zen-reference/graphs/expression-table-map.json +0 -313
- package/test-data/zen-reference/graphs/flash-sale-eligibility.json +0 -366
- package/test-data/zen-reference/graphs/flight-dispatch-decision-system.json +0 -455
- package/test-data/zen-reference/graphs/flight-rebooking-fee-calculator.json +0 -406
- package/test-data/zen-reference/graphs/government-assistance.json +0 -299
- package/test-data/zen-reference/graphs/grant-funding-distribution.json +0 -307
- package/test-data/zen-reference/graphs/hazardous-materials-management-system.json +0 -414
- package/test-data/zen-reference/graphs/immigration-eligibility-evaluator.json +0 -765
- package/test-data/zen-reference/graphs/import-duties-calculator.json +0 -318
- package/test-data/zen-reference/graphs/insurance-agent-commission.json +0 -228
- package/test-data/zen-reference/graphs/insurance-breakdown.json +0 -421
- package/test-data/zen-reference/graphs/insurance-coverage-calculator.json +0 -362
- package/test-data/zen-reference/graphs/insurance-prior-authorization.json +0 -467
- package/test-data/zen-reference/graphs/insurance-underwriting-risk.json +0 -321
- package/test-data/zen-reference/graphs/international-roaming-policy-manager.json +0 -199
- package/test-data/zen-reference/graphs/last-mile-delivery-assignment.json +0 -373
- package/test-data/zen-reference/graphs/legacy-plan-management.json +0 -434
- package/test-data/zen-reference/graphs/loan-approval.json +0 -469
- package/test-data/zen-reference/graphs/marketplace-listing-verification-system.json +0 -334
- package/test-data/zen-reference/graphs/medication-dosage-calculator.json +0 -318
- package/test-data/zen-reference/graphs/merch-bags.json +0 -171
- package/test-data/zen-reference/graphs/multi-switch.json +0 -498
- package/test-data/zen-reference/graphs/municipal-permit-evaluation-system.json +0 -364
- package/test-data/zen-reference/graphs/mvno-partner-enablement.json +0 -313
- package/test-data/zen-reference/graphs/nested-request.json +0 -125
- package/test-data/zen-reference/graphs/online-checkin-eligibility.json +0 -285
- package/test-data/zen-reference/graphs/order-consolidation-system.json +0 -493
- package/test-data/zen-reference/graphs/partner-revenue-sharing.json +0 -244
- package/test-data/zen-reference/graphs/payment-routing-and-fee-calculator.json +0 -475
- package/test-data/zen-reference/graphs/policy-discount-calculator.json +0 -307
- package/test-data/zen-reference/graphs/policy-eligibility-analyzer.json +0 -299
- package/test-data/zen-reference/graphs/product-listing-scoring.json +0 -358
- package/test-data/zen-reference/graphs/realtime-fraud-detection.json +0 -235
- package/test-data/zen-reference/graphs/regional-compliance-manager.json +0 -278
- package/test-data/zen-reference/graphs/returns-and-refund-policy.json +0 -366
- package/test-data/zen-reference/graphs/returns-processing-system.json +0 -448
- package/test-data/zen-reference/graphs/school-district-resource-allocation.json +0 -282
- package/test-data/zen-reference/graphs/seat-map-optimization.json +0 -325
- package/test-data/zen-reference/graphs/seller-approval-workflow.json +0 -383
- package/test-data/zen-reference/graphs/seller-fee-calculator.json +0 -307
- package/test-data/zen-reference/graphs/service-level-agreement-enforcement.json +0 -575
- package/test-data/zen-reference/graphs/set-fee.json +0 -243
- package/test-data/zen-reference/graphs/shipping-carrier-selector.json +0 -379
- package/test-data/zen-reference/graphs/smart-financial-product-matcher.json +0 -249
- package/test-data/zen-reference/graphs/supply-chain-risk.json +0 -316
- package/test-data/zen-reference/graphs/table-loop.json +0 -93
- package/test-data/zen-reference/graphs/tax-exemption.json +0 -295
- package/test-data/zen-reference/graphs/traffic-violation-penalty-calculator.json +0 -436
- package/test-data/zen-reference/graphs/transaction-compliance-classifier.json +0 -525
- package/test-data/zen-reference/graphs/vehicle-claims-resolution.json +0 -310
- package/test-data/zen-reference/graphs/warehouse-cross-docking.json +0 -313
- package/test-data/zen-reference/graphs/warehouse-storage-location.json +0 -345
- package/test-data/zen-reference/http-function.json +0 -34
- package/test-data/zen-reference/infinite-function.json +0 -46
- package/test-data/zen-reference/js/imports.js +0 -25
- package/test-data/zen-reference/passthrough.json +0 -31
- package/test-data/zen-reference/recursive-table1.json +0 -49
- package/test-data/zen-reference/recursive-table2.json +0 -49
- package/test-data/zen-reference/sleep-function.json +0 -34
- package/test-data/zen-reference/switch-node.json +0 -167
- package/test-data/zen-reference/switch-performance-2.json +0 -1307
- package/test-data/zen-reference/switch-performance.json +0 -691
- package/test-data/zen-reference/table.json +0 -76
- package/tests/helpers/index.ts +0 -73
- package/tests/helpers/mock-context.ts +0 -231
- package/tests/helpers/round-trip.ts +0 -398
- package/tests/helpers/test-harness-comparison.ts +0 -325
- package/tests/helpers/test-harness-wasm.ts +0 -710
- package/tests/helpers/test-harness.ts +0 -28
- package/tests/helpers/wasm-test.ts +0 -659
- package/tests/integration/compilation-errors.test.ts +0 -864
- package/tests/integration/decision-tables.test.ts +0 -531
- package/tests/integration/edge-cases.test.ts +0 -787
- package/tests/integration/expressions.test.ts +0 -513
- package/tests/integration/function-node-integration.test.ts +0 -182
- package/tests/integration/sub-decisions.test.ts +0 -108
- package/tests/integration/switch-nodes.test.ts +0 -399
- package/tests/integration/unary-or-matching.test.ts +0 -53
- package/tests/integration/wasm-data-types.test.ts +0 -398
- package/tests/integration/wasm-errors.test.ts +0 -199
- package/tests/integration/wasm-execution.test.ts +0 -348
- package/tests/integration/wasm-memory.test.ts +0 -228
- package/tests/scripts/analyze-coverage.ts +0 -166
- package/tests/scripts/categorize-tests.ts +0 -396
- package/tests/scripts/coverage-analysis.ts +0 -836
- package/tests/unit/compiler/cache.test.ts +0 -238
- package/tests/unit/compiler/errors.test.ts +0 -316
- package/tests/unit/compiler/graph-scalability.test.ts +0 -510
- package/tests/unit/compiler/graph.test.ts +0 -878
- package/tests/unit/compiler/input-validation.test.ts +0 -447
- package/tests/unit/compiler/logical-and-parser.test.ts +0 -143
- package/tests/unit/compiler/logical-not-parser.test.ts +0 -107
- package/tests/unit/compiler/logical-or-parser.test.ts +0 -236
- package/tests/unit/compiler/marshal-gen/marshal-gen.test.ts +0 -97
- package/tests/unit/compiler/nodes/decision-table.test.ts +0 -103
- package/tests/unit/compiler/nodes/decision.test.ts +0 -182
- package/tests/unit/compiler/nodes/function-compile.test.ts +0 -204
- package/tests/unit/compiler/nodes/function.test.ts +0 -176
- package/tests/unit/compiler/nodes/input.test.ts +0 -30
- package/tests/unit/compiler/nodes/switch.test.ts +0 -127
- package/tests/unit/compiler/optimizer-cache.test.ts +0 -327
- package/tests/unit/compiler/optimizer-implementation.test.ts +0 -625
- package/tests/unit/compiler/parser.test.ts +0 -508
- package/tests/unit/compiler/runtime-error-cleanup.test.ts +0 -426
- package/tests/unit/compiler/runtime-validation.test.ts +0 -303
- package/tests/unit/compiler/runtime.test.ts +0 -221
- package/tests/unit/compiler/schema/schema.test.ts +0 -248
- package/tests/unit/compiler/unary-ast-transforms.test.ts +0 -245
- package/tsconfig.json +0 -27
- package/tsup.config.ts +0 -11
- package/vitest.config.ts +0 -12
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
// src/compiler/runtime-codegen.ts
|
|
2
|
-
// Compile-time code generation utilities for loading generated marshaling and validation code
|
|
3
|
-
|
|
4
|
-
import { CompilationError, ErrorCode } from './errors';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Type definitions for marshal and unmarshal functions.
|
|
8
|
-
*/
|
|
9
|
-
export type MarshalFn = (data: Record<string, unknown>, memory: WebAssembly.Memory) => number;
|
|
10
|
-
|
|
11
|
-
export type UnmarshalFn = (ptr: number, memory: WebAssembly.Memory) => Record<string, unknown>;
|
|
12
|
-
|
|
13
|
-
export type ValidateFn = (data: unknown) => void;
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Load generated marshaling code as executable functions.
|
|
17
|
-
*
|
|
18
|
-
* @internal This function uses Function constructor to execute generated code.
|
|
19
|
-
* The code is generated by the compiler and is trusted, but users should be
|
|
20
|
-
* aware that this executes arbitrary JavaScript in the current context.
|
|
21
|
-
*
|
|
22
|
-
* @param code - The generated marshaling code
|
|
23
|
-
* @returns Object with marshal and unmarshal functions
|
|
24
|
-
*/
|
|
25
|
-
export function loadGeneratedMarshaling(code: string): {
|
|
26
|
-
marshal: MarshalFn;
|
|
27
|
-
unmarshal: UnmarshalFn;
|
|
28
|
-
} {
|
|
29
|
-
// Create a function from the generated code
|
|
30
|
-
|
|
31
|
-
// We use string replacement instead of ES module loading because: (1) generated code
|
|
32
|
-
// uses ES6 exports which Function() doesn't support, (2) avoiding eval() for security,
|
|
33
|
-
// (3) provides isolated scope for generated code. Convert export syntax to regular functions.
|
|
34
|
-
const cleanedCode = code
|
|
35
|
-
.replace(/^export function marshalInput/gm, 'function marshalInputHelper')
|
|
36
|
-
.replace(/^export function unmarshalOutput/gm, 'function unmarshalOutputHelper')
|
|
37
|
-
.replace(/^export const SCHEMA_HASH/gm, 'const SCHEMA_HASH')
|
|
38
|
-
.replace(/^export const INPUT_FIXED_SIZE/gm, 'const INPUT_FIXED_SIZE')
|
|
39
|
-
.replace(/^export const OUTPUT_FIXED_SIZE/gm, 'const OUTPUT_FIXED_SIZE')
|
|
40
|
-
.replace(/^export function writeString/gm, 'function writeStringHelper')
|
|
41
|
-
.replace(/^export function readString/gm, 'function readStringHelper')
|
|
42
|
-
.replace(/^export function writeArray/gm, 'function writeArrayHelper')
|
|
43
|
-
.replace(/^export function readArray/gm, 'function readArrayHelper')
|
|
44
|
-
.replace(/^export function calculateInputSize/gm, 'function calculateInputSizeHelper');
|
|
45
|
-
|
|
46
|
-
// Helper function to extract nested values
|
|
47
|
-
const helperCode = `
|
|
48
|
-
function getNestedValue(obj, path) {
|
|
49
|
-
const parts = path.split('.');
|
|
50
|
-
let current = obj;
|
|
51
|
-
for (const part of parts) {
|
|
52
|
-
if (current == null) return undefined;
|
|
53
|
-
if (typeof current !== 'object') return undefined;
|
|
54
|
-
current = current[part];
|
|
55
|
-
}
|
|
56
|
-
return current;
|
|
57
|
-
}
|
|
58
|
-
`;
|
|
59
|
-
|
|
60
|
-
// Type for the raw 3-argument marshal function
|
|
61
|
-
type RawMarshalFn = (
|
|
62
|
-
data: Record<string, unknown>,
|
|
63
|
-
memory: WebAssembly.Memory,
|
|
64
|
-
allocate: (size: number) => number,
|
|
65
|
-
) => number;
|
|
66
|
-
|
|
67
|
-
const module: { marshalInput?: RawMarshalFn; unmarshalOutput?: UnmarshalFn } = {};
|
|
68
|
-
|
|
69
|
-
const setupFn = new Function(
|
|
70
|
-
'module',
|
|
71
|
-
helperCode +
|
|
72
|
-
cleanedCode +
|
|
73
|
-
`
|
|
74
|
-
module.marshalInput = marshalInputHelper;
|
|
75
|
-
module.unmarshalOutput = unmarshalOutputHelper;
|
|
76
|
-
`,
|
|
77
|
-
);
|
|
78
|
-
|
|
79
|
-
setupFn(module);
|
|
80
|
-
|
|
81
|
-
if (!module.marshalInput || !module.unmarshalOutput) {
|
|
82
|
-
throw new CompilationError(
|
|
83
|
-
'Generated marshaling code did not export required functions',
|
|
84
|
-
ErrorCode.INVALID_NODE_STRUCTURE,
|
|
85
|
-
{ field: 'marshalCode' },
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Create a 2-argument wrapper that provides an internal allocator
|
|
90
|
-
// The allocator starts at 192KB to avoid collision with:
|
|
91
|
-
// - AssemblyScript static data (0 - ~50KB)
|
|
92
|
-
// - AssemblyScript runtime heap (~50KB - ~192KB, grows during evaluation)
|
|
93
|
-
// This matches the memory layout expected by the WASM module.
|
|
94
|
-
const rawMarshal = module.marshalInput;
|
|
95
|
-
const INPUT_BUFFER_START = 192 * 1024; // 192KB
|
|
96
|
-
const REQUIRED_MEMORY = 768 * 1024; // 768KB minimum to fit input + output buffers
|
|
97
|
-
|
|
98
|
-
const wrappedMarshal: MarshalFn = (data, memory) => {
|
|
99
|
-
// Ensure memory is large enough for the expected layout
|
|
100
|
-
if (memory.buffer.byteLength < REQUIRED_MEMORY) {
|
|
101
|
-
const pagesNeeded = Math.ceil((REQUIRED_MEMORY - memory.buffer.byteLength) / 65536);
|
|
102
|
-
memory.grow(pagesNeeded);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Simple bump allocator starting at 192KB (after AS runtime heap region)
|
|
106
|
-
let heapOffset = INPUT_BUFFER_START;
|
|
107
|
-
const allocate = (size: number): number => {
|
|
108
|
-
const ptr = heapOffset;
|
|
109
|
-
heapOffset += size;
|
|
110
|
-
// Grow memory if needed
|
|
111
|
-
if (heapOffset > memory.buffer.byteLength) {
|
|
112
|
-
const pagesNeeded = Math.ceil((heapOffset - memory.buffer.byteLength) / 65536);
|
|
113
|
-
memory.grow(pagesNeeded);
|
|
114
|
-
}
|
|
115
|
-
return ptr;
|
|
116
|
-
};
|
|
117
|
-
return rawMarshal(data, memory, allocate);
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
return {
|
|
121
|
-
marshal: wrappedMarshal,
|
|
122
|
-
unmarshal: module.unmarshalOutput,
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Cache TypeCompiler to avoid repeated dynamic imports
|
|
127
|
-
let cachedTypeCompiler: unknown = null;
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Load generated validation code as executable function.
|
|
131
|
-
*
|
|
132
|
-
* @param code - The generated validation code
|
|
133
|
-
* @returns Validation function
|
|
134
|
-
*/
|
|
135
|
-
export async function loadGeneratedValidation(code: string): Promise<ValidateFn> {
|
|
136
|
-
// The generated validation code uses ES6 import/export syntax and TypeScript syntax
|
|
137
|
-
// We need to:
|
|
138
|
-
// 1. Strip import statements
|
|
139
|
-
// 2. Strip TypeScript type annotations
|
|
140
|
-
// 3. Convert exports to regular function/class definitions
|
|
141
|
-
// 4. Pass TypeCompiler as a dependency
|
|
142
|
-
// 5. Return the validateInput function
|
|
143
|
-
|
|
144
|
-
let cleanedCode = code;
|
|
145
|
-
|
|
146
|
-
// Remove import statements
|
|
147
|
-
const importRegex = /^import\s+.*from\s+['"].*['"];?\s*$/gm;
|
|
148
|
-
cleanedCode = cleanedCode.replace(importRegex, '');
|
|
149
|
-
|
|
150
|
-
// Strip TypeScript parameter type annotations
|
|
151
|
-
// Matches: function foo(param: Type, other: Type)
|
|
152
|
-
cleanedCode = cleanedCode.replace(/(\w+)\s*:\s*\w+(?:<[^>]+>)?(?=[,)])/g, '$1');
|
|
153
|
-
|
|
154
|
-
// Strip TypeScript "asserts" return type annotations
|
|
155
|
-
// Matches: ): asserts data is Type {
|
|
156
|
-
cleanedCode = cleanedCode.replace(/\):\s+asserts\s+\w+\s+is\s+\w+\s*(<[^>]+>)?\s*\{/g, ') {');
|
|
157
|
-
|
|
158
|
-
// Strip TypeScript class property modifiers
|
|
159
|
-
// Matches: public readonly errors: Type {
|
|
160
|
-
cleanedCode = cleanedCode.replace(/public\s+readonly\s+/g, '');
|
|
161
|
-
cleanedCode = cleanedCode.replace(/public\s+/g, '');
|
|
162
|
-
|
|
163
|
-
// Strip generic type annotations from Array
|
|
164
|
-
// Matches: Array<{...}> and Array<Type>
|
|
165
|
-
cleanedCode = cleanedCode.replace(/Array<([^>]+)>/g, 'Array');
|
|
166
|
-
|
|
167
|
-
// Strip TSchema type reference (from @sinclair/typebox)
|
|
168
|
-
cleanedCode = cleanedCode.replace(/:\s*TSchema/g, '');
|
|
169
|
-
|
|
170
|
-
// Convert exports to regular definitions
|
|
171
|
-
cleanedCode = cleanedCode
|
|
172
|
-
.replace(/^export function validateInput/gm, 'function validateInput')
|
|
173
|
-
.replace(/^export class ValidationError/gm, 'class ValidationError')
|
|
174
|
-
.replace(/^export function checkInput/gm, 'function checkInput');
|
|
175
|
-
|
|
176
|
-
// Import TypeCompiler dynamically (cached for performance)
|
|
177
|
-
if (!cachedTypeCompiler) {
|
|
178
|
-
const module = await import('@sinclair/typebox/compiler');
|
|
179
|
-
cachedTypeCompiler = module.TypeCompiler;
|
|
180
|
-
}
|
|
181
|
-
const TypeCompiler = cachedTypeCompiler;
|
|
182
|
-
|
|
183
|
-
// Create a module object to hold the validator (no type annotation for Function context)
|
|
184
|
-
const module: any = {};
|
|
185
|
-
|
|
186
|
-
const setupFn = new Function(
|
|
187
|
-
'TypeCompiler',
|
|
188
|
-
'module',
|
|
189
|
-
`
|
|
190
|
-
${cleanedCode}
|
|
191
|
-
module.validateInput = validateInput;
|
|
192
|
-
`,
|
|
193
|
-
);
|
|
194
|
-
|
|
195
|
-
setupFn(TypeCompiler, module);
|
|
196
|
-
|
|
197
|
-
if (!module.validateInput) {
|
|
198
|
-
throw new CompilationError(
|
|
199
|
-
'Generated validation code did not export validateInput function',
|
|
200
|
-
ErrorCode.INVALID_NODE_STRUCTURE,
|
|
201
|
-
{ field: 'validationCode' },
|
|
202
|
-
);
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
return module.validateInput;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Re-export validation code generation functions from marshal-gen
|
|
210
|
-
*/
|
|
211
|
-
export { generateValidationCode } from './marshal-gen';
|
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Runtime validation code generation for decision models.
|
|
3
|
-
*
|
|
4
|
-
* This module provides functions that generate or perform validation code
|
|
5
|
-
* that executes at runtime. These functions validate actual data against
|
|
6
|
-
* schemas when the decision is evaluated.
|
|
7
|
-
*
|
|
8
|
-
* For compile-time static analysis (checking references exist, etc.),
|
|
9
|
-
* see compile-time-validation.ts.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import type { FlattenedLayout } from './types';
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Validation error containing field path, expected type, and actual value.
|
|
16
|
-
*/
|
|
17
|
-
export interface ValidationError {
|
|
18
|
-
/** The field path (e.g., "customer.age") */
|
|
19
|
-
path: string;
|
|
20
|
-
/** Error message describing the issue */
|
|
21
|
-
message: string;
|
|
22
|
-
/** The expected type */
|
|
23
|
-
expected?: string;
|
|
24
|
-
/** The actual value that failed validation */
|
|
25
|
-
actual?: unknown;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Result of runtime validation.
|
|
30
|
-
*/
|
|
31
|
-
export interface ValidationResult {
|
|
32
|
-
/** Whether validation passed */
|
|
33
|
-
valid: boolean;
|
|
34
|
-
/** Array of validation errors (empty if valid) */
|
|
35
|
-
errors: ValidationError[];
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Validate runtime input data against the input schema.
|
|
40
|
-
*
|
|
41
|
-
* This function checks that all required input fields from the schema
|
|
42
|
-
* are present in the provided input data AND that they have correct types.
|
|
43
|
-
* It returns a list of validation errors including missing fields and
|
|
44
|
-
* type mismatches.
|
|
45
|
-
*
|
|
46
|
-
* Security note: This validation prevents malformed input with wrong types
|
|
47
|
-
* (string instead of number, object instead of array) from being marshaled
|
|
48
|
-
* to WASM, which could cause runtime errors or unexpected behavior.
|
|
49
|
-
*
|
|
50
|
-
* @param inputData - Runtime input data as a JavaScript object
|
|
51
|
-
* @param inputLayout - Flattened layout from the input schema
|
|
52
|
-
* @returns Array of missing/invalid input field paths (empty if all valid)
|
|
53
|
-
*/
|
|
54
|
-
export function validateRuntimeInputs(
|
|
55
|
-
inputData: Record<string, any>,
|
|
56
|
-
inputLayout: FlattenedLayout,
|
|
57
|
-
): string[] {
|
|
58
|
-
const result = validateRuntimeInputsDetailed(inputData, inputLayout);
|
|
59
|
-
// Return just the paths for backwards compatibility
|
|
60
|
-
return result.errors.map((e) => e.path);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Validate runtime input data with detailed error information.
|
|
65
|
-
*
|
|
66
|
-
* This function performs comprehensive validation including:
|
|
67
|
-
* - Presence checking: All required fields must be present
|
|
68
|
-
* - Type checking: Values must match expected types
|
|
69
|
-
* - Range checking: Numbers must be finite (not NaN/Infinity unless intended)
|
|
70
|
-
*
|
|
71
|
-
* @param inputData - Runtime input data as a JavaScript object
|
|
72
|
-
* @param inputLayout - Flattened layout from the input schema
|
|
73
|
-
* @returns Detailed validation result with errors
|
|
74
|
-
*/
|
|
75
|
-
export function validateRuntimeInputsDetailed(
|
|
76
|
-
inputData: Record<string, any>,
|
|
77
|
-
inputLayout: FlattenedLayout,
|
|
78
|
-
): ValidationResult {
|
|
79
|
-
const errors: ValidationError[] = [];
|
|
80
|
-
|
|
81
|
-
for (const field of inputLayout.fields) {
|
|
82
|
-
const path = field.path;
|
|
83
|
-
const parts = path.split('.');
|
|
84
|
-
|
|
85
|
-
let current: any = inputData;
|
|
86
|
-
let exists = true;
|
|
87
|
-
|
|
88
|
-
// Navigate to the nested value
|
|
89
|
-
for (const part of parts) {
|
|
90
|
-
if (current === null || current === undefined || current[part] === undefined) {
|
|
91
|
-
exists = false;
|
|
92
|
-
break;
|
|
93
|
-
}
|
|
94
|
-
current = current[part];
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
if (!exists) {
|
|
98
|
-
errors.push({
|
|
99
|
-
path,
|
|
100
|
-
message: 'Required field is missing',
|
|
101
|
-
expected: field.type,
|
|
102
|
-
actual: undefined,
|
|
103
|
-
});
|
|
104
|
-
continue;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Now check type
|
|
108
|
-
const typeError = validateFieldType(current, field.type, path);
|
|
109
|
-
if (typeError) {
|
|
110
|
-
errors.push(typeError);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
return {
|
|
115
|
-
valid: errors.length === 0,
|
|
116
|
-
errors,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Validate that a value matches the expected field type.
|
|
122
|
-
*
|
|
123
|
-
* @param value - The actual value to validate
|
|
124
|
-
* @param expectedType - The expected type from the schema
|
|
125
|
-
* @param path - The field path for error reporting
|
|
126
|
-
* @returns ValidationError if type mismatch, null if valid
|
|
127
|
-
*/
|
|
128
|
-
function validateFieldType(
|
|
129
|
-
value: unknown,
|
|
130
|
-
expectedType: 'f64' | 'i32' | 'i64' | 'bool' | 'string' | 'array',
|
|
131
|
-
path: string,
|
|
132
|
-
): ValidationError | null {
|
|
133
|
-
const actualType = typeof value;
|
|
134
|
-
|
|
135
|
-
switch (expectedType) {
|
|
136
|
-
case 'f64':
|
|
137
|
-
case 'i32':
|
|
138
|
-
case 'i64': {
|
|
139
|
-
// Check for number type
|
|
140
|
-
if (actualType !== 'number' && actualType !== 'bigint') {
|
|
141
|
-
return {
|
|
142
|
-
path,
|
|
143
|
-
message: `Expected ${expectedType} (number), got ${actualType}`,
|
|
144
|
-
expected: expectedType,
|
|
145
|
-
actual: value,
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// For number types, also check for NaN
|
|
150
|
-
if (actualType === 'number' && Number.isNaN(value)) {
|
|
151
|
-
return {
|
|
152
|
-
path,
|
|
153
|
-
message: `Invalid number: NaN is not allowed`,
|
|
154
|
-
expected: expectedType,
|
|
155
|
-
actual: value,
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// For integer types, check that the value is actually an integer
|
|
160
|
-
if (expectedType === 'i32' || expectedType === 'i64') {
|
|
161
|
-
if (actualType === 'number' && !Number.isInteger(value)) {
|
|
162
|
-
return {
|
|
163
|
-
path,
|
|
164
|
-
message: `Expected integer, got floating-point number`,
|
|
165
|
-
expected: expectedType,
|
|
166
|
-
actual: value,
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
break;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
case 'bool': {
|
|
174
|
-
if (actualType !== 'boolean') {
|
|
175
|
-
return {
|
|
176
|
-
path,
|
|
177
|
-
message: `Expected boolean, got ${actualType}`,
|
|
178
|
-
expected: 'boolean',
|
|
179
|
-
actual: value,
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
break;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
case 'string': {
|
|
186
|
-
if (actualType !== 'string') {
|
|
187
|
-
return {
|
|
188
|
-
path,
|
|
189
|
-
message: `Expected string, got ${actualType}`,
|
|
190
|
-
expected: 'string',
|
|
191
|
-
actual: value,
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
break;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
case 'array': {
|
|
198
|
-
if (!Array.isArray(value)) {
|
|
199
|
-
return {
|
|
200
|
-
path,
|
|
201
|
-
message: `Expected array, got ${actualType}`,
|
|
202
|
-
expected: 'array',
|
|
203
|
-
actual: value,
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
break;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
default: {
|
|
210
|
-
// Unknown type - this shouldn't happen with a valid schema
|
|
211
|
-
// but we'll accept any value for forward compatibility
|
|
212
|
-
break;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
return null;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Validate runtime output data against the output schema.
|
|
221
|
-
*
|
|
222
|
-
* This function checks that all required output fields from the schema
|
|
223
|
-
* are present in the provided output data AND that they have correct types.
|
|
224
|
-
* It returns a list of validation errors including missing fields and
|
|
225
|
-
* type mismatches.
|
|
226
|
-
*
|
|
227
|
-
* @param outputData - Runtime output data as a JavaScript object
|
|
228
|
-
* @param outputLayout - Flattened layout from the output schema
|
|
229
|
-
* @returns Array of missing/invalid output field paths (empty if all valid)
|
|
230
|
-
*/
|
|
231
|
-
export function validateRuntimeOutputs(
|
|
232
|
-
outputData: Record<string, any>,
|
|
233
|
-
outputLayout: FlattenedLayout,
|
|
234
|
-
): string[] {
|
|
235
|
-
const result = validateRuntimeOutputsDetailed(outputData, outputLayout);
|
|
236
|
-
return result.errors.map((e) => e.path);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
* Validate runtime output data with detailed error information.
|
|
241
|
-
*
|
|
242
|
-
* This function performs comprehensive validation including:
|
|
243
|
-
* - Presence checking: All required output fields must be present
|
|
244
|
-
* - Type checking: Values must match expected types
|
|
245
|
-
*
|
|
246
|
-
* @param outputData - Runtime output data as a JavaScript object
|
|
247
|
-
* @param outputLayout - Flattened layout from the output schema
|
|
248
|
-
* @returns Detailed validation result with errors
|
|
249
|
-
*/
|
|
250
|
-
export function validateRuntimeOutputsDetailed(
|
|
251
|
-
outputData: Record<string, any>,
|
|
252
|
-
outputLayout: FlattenedLayout,
|
|
253
|
-
): ValidationResult {
|
|
254
|
-
const errors: ValidationError[] = [];
|
|
255
|
-
|
|
256
|
-
for (const field of outputLayout.fields) {
|
|
257
|
-
const path = field.path;
|
|
258
|
-
const parts = path.split('.');
|
|
259
|
-
|
|
260
|
-
// Allows objects to be built incrementally (e.g., output.customer.name and
|
|
261
|
-
// output.customer.age) instead of requiring the entire object at once.
|
|
262
|
-
let current: any = outputData;
|
|
263
|
-
let exists = true;
|
|
264
|
-
|
|
265
|
-
for (const part of parts) {
|
|
266
|
-
if (current === null || current === undefined || current[part] === undefined) {
|
|
267
|
-
exists = false;
|
|
268
|
-
break;
|
|
269
|
-
}
|
|
270
|
-
current = current[part];
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
if (!exists) {
|
|
274
|
-
errors.push({
|
|
275
|
-
path,
|
|
276
|
-
message: 'Required output field is missing',
|
|
277
|
-
expected: field.type,
|
|
278
|
-
actual: undefined,
|
|
279
|
-
});
|
|
280
|
-
continue;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
// Now check type
|
|
284
|
-
const typeError = validateFieldType(current, field.type, path);
|
|
285
|
-
if (typeError) {
|
|
286
|
-
errors.push(typeError);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
return {
|
|
291
|
-
valid: errors.length === 0,
|
|
292
|
-
errors,
|
|
293
|
-
};
|
|
294
|
-
}
|