@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.
Files changed (397) hide show
  1. package/.github/workflows/ci.yml +53 -0
  2. package/.oxfmtrc.json +16 -0
  3. package/.oxlintrc.json +183 -0
  4. package/AGENTS.md +81 -0
  5. package/README.md +769 -0
  6. package/asconfig.json +23 -0
  7. package/benchmarks/fixtures.ts +111 -0
  8. package/benchmarks/input-fixtures.ts +80 -0
  9. package/benchmarks/run.ts +913 -0
  10. package/benchmarks/worker-pool.ts +223 -0
  11. package/benchmarks/worker.ts +374 -0
  12. package/dist/index.d.ts +996 -0
  13. package/dist/index.js +12239 -0
  14. package/dist/index.js.map +1 -0
  15. package/package.json +49 -0
  16. package/scripts/run-all-tests.ts +220 -0
  17. package/src/compiler/EXPRESSION_SUBSETS.md +228 -0
  18. package/src/compiler/asc-compiler.ts +315 -0
  19. package/src/compiler/ast-types.ts +215 -0
  20. package/src/compiler/build.ts +56 -0
  21. package/src/compiler/cache.ts +414 -0
  22. package/src/compiler/code-generators.ts +211 -0
  23. package/src/compiler/codegen/index.ts +15 -0
  24. package/src/compiler/codegen/js-marshal.ts +999 -0
  25. package/src/compiler/codegen/js-validation.ts +243 -0
  26. package/src/compiler/codegen.ts +19 -0
  27. package/src/compiler/compile-time-validation.ts +507 -0
  28. package/src/compiler/cst-visitor.ts +434 -0
  29. package/src/compiler/errors.ts +227 -0
  30. package/src/compiler/expression-parser.ts +536 -0
  31. package/src/compiler/graph.ts +197 -0
  32. package/src/compiler/index.ts +199 -0
  33. package/src/compiler/input-validation.ts +33 -0
  34. package/src/compiler/marshal-gen.ts +21 -0
  35. package/src/compiler/nodes/context-resolvers.ts +197 -0
  36. package/src/compiler/nodes/decision-table.ts +507 -0
  37. package/src/compiler/nodes/decision.ts +292 -0
  38. package/src/compiler/nodes/expression-compiler.ts +526 -0
  39. package/src/compiler/nodes/expression.ts +425 -0
  40. package/src/compiler/nodes/function.ts +316 -0
  41. package/src/compiler/nodes/input.ts +60 -0
  42. package/src/compiler/nodes/switch.ts +547 -0
  43. package/src/compiler/optimizer.ts +948 -0
  44. package/src/compiler/orchestrator.ts +352 -0
  45. package/src/compiler/parser.ts +115 -0
  46. package/src/compiler/result-selection.ts +161 -0
  47. package/src/compiler/runtime/index.ts +26 -0
  48. package/src/compiler/runtime-codegen.ts +211 -0
  49. package/src/compiler/runtime-validation-codegen.ts +294 -0
  50. package/src/compiler/runtime.ts +452 -0
  51. package/src/compiler/schema.ts +245 -0
  52. package/src/compiler/switch-branch-detection.ts +92 -0
  53. package/src/compiler/types.ts +136 -0
  54. package/src/compiler/unary-ast-transforms.ts +148 -0
  55. package/src/compiler/unary-parser.ts +301 -0
  56. package/src/compiler/unary-transform.ts +161 -0
  57. package/src/compiler/utils.ts +27 -0
  58. package/src/compiler/virtual-fs.ts +90 -0
  59. package/src/compiler/wasm-instantiate.ts +127 -0
  60. package/src/index.ts +1 -0
  61. package/src/runtime/arrays.ts +579 -0
  62. package/src/runtime/context.ts +189 -0
  63. package/src/runtime/expressions.ts +1811 -0
  64. package/src/runtime/index.ts +8 -0
  65. package/src/runtime/memory.ts +607 -0
  66. package/src/runtime/strings.ts +260 -0
  67. package/src/runtime/tables.ts +96 -0
  68. package/src/runtime/tsconfig.json +4 -0
  69. package/src/runtime/values.ts +209 -0
  70. package/test-data/README.md +83 -0
  71. package/test-data/decision-tables/basic/8k.json +87992 -0
  72. package/test-data/decision-tables/basic/affiliate-commission-calculator.json +228 -0
  73. package/test-data/decision-tables/basic/airline-loyalty-points-calculations.json +285 -0
  74. package/test-data/decision-tables/basic/airline-upgrade-eligibility.json +466 -0
  75. package/test-data/decision-tables/basic/auto-insurance-premium-calculator.json +412 -0
  76. package/test-data/decision-tables/basic/booking-personalization-system.json +553 -0
  77. package/test-data/decision-tables/basic/care-team-assignment-system.json +585 -0
  78. package/test-data/decision-tables/basic/claim-validation-system.json +307 -0
  79. package/test-data/decision-tables/basic/clinical-lab-result-interpreter.json +433 -0
  80. package/test-data/decision-tables/basic/clinical-treatment-protocol.json +474 -0
  81. package/test-data/decision-tables/basic/credit-limit-adjustment.json +479 -0
  82. package/test-data/decision-tables/basic/customer-eligibility-engine.json +551 -0
  83. package/test-data/decision-tables/basic/customer-lifetime-value.json +200 -0
  84. package/test-data/decision-tables/basic/customer-onboarding-kyc-verification.json +611 -0
  85. package/test-data/decision-tables/basic/customer-service-escalation.json +191 -0
  86. package/test-data/decision-tables/basic/decision-table-discounts.json +168 -0
  87. package/test-data/decision-tables/basic/decision-table-shipping.json +398 -0
  88. package/test-data/decision-tables/basic/delivery-route-optimizer.json +271 -0
  89. package/test-data/decision-tables/basic/device-compatibility-checker.json +303 -0
  90. package/test-data/decision-tables/basic/disaster-relief-fund-allocation.json +296 -0
  91. package/test-data/decision-tables/basic/dynamic-fx-rate-pricing-system.json +237 -0
  92. package/test-data/decision-tables/basic/dynamic-marketplace-comission-calculator.json +242 -0
  93. package/test-data/decision-tables/basic/dynamic-shipping-cost-calculator.json +378 -0
  94. package/test-data/decision-tables/basic/dynamic-tarrif-engine.json +289 -0
  95. package/test-data/decision-tables/basic/dynamic-ticket-pricing.json +325 -0
  96. package/test-data/decision-tables/basic/empty-column-with-space.json +100 -0
  97. package/test-data/decision-tables/basic/empty-column-without-space.json +100 -0
  98. package/test-data/decision-tables/basic/environment-compliance-assessment.json +386 -0
  99. package/test-data/decision-tables/basic/expression-table-map.json +313 -0
  100. package/test-data/decision-tables/basic/flash-sale-eligibility.json +366 -0
  101. package/test-data/decision-tables/basic/flight-dispatch-decision-system.json +455 -0
  102. package/test-data/decision-tables/basic/flight-rebooking-fee-calculator.json +406 -0
  103. package/test-data/decision-tables/basic/government-assistance.json +299 -0
  104. package/test-data/decision-tables/basic/grant-funding-distribution.json +307 -0
  105. package/test-data/decision-tables/basic/hazardous-materials-management-system.json +414 -0
  106. package/test-data/decision-tables/basic/immigration-eligibility-evaluator.json +765 -0
  107. package/test-data/decision-tables/basic/import-duties-calculator.json +318 -0
  108. package/test-data/decision-tables/basic/insurance-agent-commission.json +228 -0
  109. package/test-data/decision-tables/basic/insurance-coverage-calculator.json +362 -0
  110. package/test-data/decision-tables/basic/insurance-underwriting-risk.json +321 -0
  111. package/test-data/decision-tables/basic/international-roaming-policy-manager.json +199 -0
  112. package/test-data/decision-tables/basic/legacy-plan-management.json +434 -0
  113. package/test-data/decision-tables/basic/marketplace-listing-verification-system.json +334 -0
  114. package/test-data/decision-tables/basic/medication-dosage-calculator.json +318 -0
  115. package/test-data/decision-tables/basic/merch-bags.json +171 -0
  116. package/test-data/decision-tables/basic/municipal-permit-evaluation-system.json +364 -0
  117. package/test-data/decision-tables/basic/mvno-partner-enablement.json +313 -0
  118. package/test-data/decision-tables/basic/partner-revenue-sharing.json +244 -0
  119. package/test-data/decision-tables/basic/payment-routing-and-fee-calculator.json +475 -0
  120. package/test-data/decision-tables/basic/policy-discount-calculator.json +307 -0
  121. package/test-data/decision-tables/basic/policy-eligibility-analyzer.json +299 -0
  122. package/test-data/decision-tables/basic/product-listing-scoring.json +358 -0
  123. package/test-data/decision-tables/basic/realtime-fraud-detection.json +235 -0
  124. package/test-data/decision-tables/basic/regional-compliance-manager.json +278 -0
  125. package/test-data/decision-tables/basic/returns-and-refund-policy.json +366 -0
  126. package/test-data/decision-tables/basic/returns-processing-system.json +448 -0
  127. package/test-data/decision-tables/basic/school-district-resource-allocation.json +282 -0
  128. package/test-data/decision-tables/basic/seat-map-optimization.json +325 -0
  129. package/test-data/decision-tables/basic/seller-fee-calculator.json +307 -0
  130. package/test-data/decision-tables/basic/service-level-agreement-enforcement.json +575 -0
  131. package/test-data/decision-tables/basic/smart-financial-product-matcher.json +249 -0
  132. package/test-data/decision-tables/basic/supply-chain-risk.json +316 -0
  133. package/test-data/decision-tables/basic/table-loop.json +93 -0
  134. package/test-data/decision-tables/basic/table.json +76 -0
  135. package/test-data/decision-tables/basic/traffic-violation-penalty-calculator.json +436 -0
  136. package/test-data/decision-tables/basic/transaction-compliance-classifier.json +525 -0
  137. package/test-data/decision-tables/basic/vehicle-claims-resolution.json +310 -0
  138. package/test-data/decision-tables/basic/warehouse-storage-location.json +345 -0
  139. package/test-data/decision-tables/hit-policy-collect/collect-multiple-matches.json +127 -0
  140. package/test-data/decision-tables/hit-policy-collect/collect-no-match.json +95 -0
  141. package/test-data/decision-tables/hit-policy-first/first-match.json +103 -0
  142. package/test-data/decision-tables/hit-policy-first/no-match.json +95 -0
  143. package/test-data/decision-tables/hit-policy-output-order/output-order-respected.json +94 -0
  144. package/test-data/decision-tables/hit-policy-output-order/string-output-order.json +94 -0
  145. package/test-data/decision-tables/hit-policy-priority/priority-respected.json +86 -0
  146. package/test-data/decision-tables/hit-policy-rule-order/rule-order-respected.json +94 -0
  147. package/test-data/decision-tables/hit-policy-unique/all-match-error.json +89 -0
  148. package/test-data/decision-tables/hit-policy-unique/multiple-match-error.json +89 -0
  149. package/test-data/decision-tables/hit-policy-unique/no-match.json +88 -0
  150. package/test-data/decision-tables/hit-policy-unique/unique-match.json +99 -0
  151. package/test-data/expressions/arithmetic/error-cyclic.json +114 -0
  152. package/test-data/expressions/arithmetic/error-missing-input.json +54 -0
  153. package/test-data/expressions/arithmetic/error-missing-output.json +54 -0
  154. package/test-data/expressions/arithmetic/expression-default.json +93 -0
  155. package/test-data/expressions/arithmetic/expression-fields.json +94 -0
  156. package/test-data/expressions/arithmetic/expression-loop.json +94 -0
  157. package/test-data/expressions/arithmetic/expression-passthrough.json +108 -0
  158. package/test-data/expressions/arithmetic/expression.json +69 -0
  159. package/test-data/expressions/arithmetic/nested-request.json +125 -0
  160. package/test-data/expressions/arithmetic/number-function.json +58 -0
  161. package/test-data/expressions/arithmetic/test-number-functions.json +68 -0
  162. package/test-data/expressions/functions/all.json +149 -0
  163. package/test-data/expressions/functions/avg.json +89 -0
  164. package/test-data/expressions/functions/filter.json +109 -0
  165. package/test-data/expressions/functions/flat.json +167 -0
  166. package/test-data/expressions/functions/map-strings.json +65 -0
  167. package/test-data/expressions/functions/map.json +73 -0
  168. package/test-data/expressions/functions/reduce.json +49 -0
  169. package/test-data/expressions/functions/some.json +175 -0
  170. package/test-data/expressions/functions/sort-strings.json +97 -0
  171. package/test-data/expressions/functions/sort.json +97 -0
  172. package/test-data/expressions/logical/logical-and.json +116 -0
  173. package/test-data/expressions/logical/logical-complex.json +260 -0
  174. package/test-data/expressions/logical/logical-not.json +111 -0
  175. package/test-data/expressions/logical/logical-or.json +123 -0
  176. package/test-data/expressions/string/string-comparison.json +128 -0
  177. package/test-data/expressions/string/string-concat.json +106 -0
  178. package/test-data/expressions/string/string-contains.json +125 -0
  179. package/test-data/expressions/string/string-endsWith.json +113 -0
  180. package/test-data/expressions/string/string-indexOf.json +131 -0
  181. package/test-data/expressions/string/string-join.json +92 -0
  182. package/test-data/expressions/string/string-lower.json +94 -0
  183. package/test-data/expressions/string/string-replace.json +130 -0
  184. package/test-data/expressions/string/string-split.json +101 -0
  185. package/test-data/expressions/string/string-startsWith.json +113 -0
  186. package/test-data/expressions/string/string-substring.json +138 -0
  187. package/test-data/expressions/string/string-trim.json +100 -0
  188. package/test-data/expressions/string/string-upper.json +94 -0
  189. package/test-data/other/custom.json +51 -0
  190. package/test-data/other/customer-input-schema.json +34 -0
  191. package/test-data/other/customer-output-schema.json +34 -0
  192. package/test-data/other/passthrough.json +31 -0
  193. package/test-data/sub-decisions/basic/$nodes-child.json +31 -0
  194. package/test-data/sub-decisions/basic/$nodes-parent.json +49 -0
  195. package/test-data/sub-decisions/basic/recursive-table1.json +49 -0
  196. package/test-data/sub-decisions/basic/recursive-table2.json +49 -0
  197. package/test-data/sub-decisions/complex-multi/approval-decision.json +31 -0
  198. package/test-data/sub-decisions/complex-multi/complex-dag.json +175 -0
  199. package/test-data/sub-decisions/complex-multi/credit-check.json +31 -0
  200. package/test-data/sub-decisions/complex-multi/customer-segmentation.json +31 -0
  201. package/test-data/sub-decisions/complex-multi/discount-eligibility.json +31 -0
  202. package/test-data/sub-decisions/complex-multi/eligibility-check.json +31 -0
  203. package/test-data/sub-decisions/complex-multi/final-offer.json +31 -0
  204. package/test-data/sub-decisions/complex-multi/income-verification.json +31 -0
  205. package/test-data/sub-decisions/complex-multi/linear-chain.json +121 -0
  206. package/test-data/sub-decisions/complex-multi/pricing-calculation.json +31 -0
  207. package/test-data/sub-decisions/complex-multi/product-eligibility.json +31 -0
  208. package/test-data/sub-decisions/complex-multi/risk-assessment.json +31 -0
  209. package/test-data/sub-decisions/complex-multi/shared-validation.json +31 -0
  210. package/test-data/sub-decisions/complex-multi/validation.json +31 -0
  211. package/test-data/sub-decisions/diamond/decision-a.json +31 -0
  212. package/test-data/sub-decisions/diamond/decision-b.json +31 -0
  213. package/test-data/sub-decisions/diamond/decision-c.json +31 -0
  214. package/test-data/sub-decisions/diamond/decision-shared.json +31 -0
  215. package/test-data/sub-decisions/diamond/diamond-pattern.json +109 -0
  216. package/test-data/sub-decisions/error-propagation/parent-calls-error.json +44 -0
  217. package/test-data/sub-decisions/error-propagation/sub-decision-with-error.json +60 -0
  218. package/test-data/switch-nodes/basic/account-dormancy-management.json +245 -0
  219. package/test-data/switch-nodes/basic/application-risk-assessment.json +474 -0
  220. package/test-data/switch-nodes/basic/cellular-data-rollover-system.json +281 -0
  221. package/test-data/switch-nodes/basic/clinical-pathway-selection.json +454 -0
  222. package/test-data/switch-nodes/basic/insurance-prior-authorization.json +467 -0
  223. package/test-data/switch-nodes/basic/last-mile-delivery-assignment.json +373 -0
  224. package/test-data/switch-nodes/basic/loan-approval.json +469 -0
  225. package/test-data/switch-nodes/basic/multi-switch.json +498 -0
  226. package/test-data/switch-nodes/basic/online-checkin-eligibility.json +285 -0
  227. package/test-data/switch-nodes/basic/order-consolidation-system.json +493 -0
  228. package/test-data/switch-nodes/basic/seller-approval-workflow.json +383 -0
  229. package/test-data/switch-nodes/basic/set-fee.json +243 -0
  230. package/test-data/switch-nodes/basic/shipping-carrier-selector.json +379 -0
  231. package/test-data/switch-nodes/basic/switch-node.json +167 -0
  232. package/test-data/switch-nodes/basic/switch-performance-2.json +1307 -0
  233. package/test-data/switch-nodes/basic/switch-performance.json +691 -0
  234. package/test-data/switch-nodes/basic/tax-exemption.json +295 -0
  235. package/test-data/switch-nodes/basic/warehouse-cross-docking.json +313 -0
  236. package/test-data/switch-nodes/default-cases/switch-with-default.json +134 -0
  237. package/test-data/zen-reference/$nodes-child.json +69 -0
  238. package/test-data/zen-reference/$nodes-parent.json +34 -0
  239. package/test-data/zen-reference/8k.json +87992 -0
  240. package/test-data/zen-reference/credit-analysis.json +324 -0
  241. package/test-data/zen-reference/custom.json +51 -0
  242. package/test-data/zen-reference/customer-input-schema.json +34 -0
  243. package/test-data/zen-reference/customer-output-schema.json +34 -0
  244. package/test-data/zen-reference/error-cyclic.json +114 -0
  245. package/test-data/zen-reference/error-missing-input.json +54 -0
  246. package/test-data/zen-reference/error-missing-output.json +54 -0
  247. package/test-data/zen-reference/expression.json +69 -0
  248. package/test-data/zen-reference/function-v2.json +48 -0
  249. package/test-data/zen-reference/function.json +46 -0
  250. package/test-data/zen-reference/graphs/account-dormancy-management.json +245 -0
  251. package/test-data/zen-reference/graphs/affiliate-commission-calculator.json +228 -0
  252. package/test-data/zen-reference/graphs/airline-loyalty-points-calculations.json +285 -0
  253. package/test-data/zen-reference/graphs/airline-upgrade-eligibility.json +466 -0
  254. package/test-data/zen-reference/graphs/aml.json +537 -0
  255. package/test-data/zen-reference/graphs/application-risk-assessment.json +474 -0
  256. package/test-data/zen-reference/graphs/auto-insurance-premium-calculator.json +412 -0
  257. package/test-data/zen-reference/graphs/booking-personalization-system.json +553 -0
  258. package/test-data/zen-reference/graphs/care-team-assignment-system.json +585 -0
  259. package/test-data/zen-reference/graphs/cellular-data-rollover-system.json +281 -0
  260. package/test-data/zen-reference/graphs/claim-validation-system.json +307 -0
  261. package/test-data/zen-reference/graphs/clinical-lab-result-interpreter.json +433 -0
  262. package/test-data/zen-reference/graphs/clinical-pathway-selection.json +454 -0
  263. package/test-data/zen-reference/graphs/clinical-treatment-protocol.json +474 -0
  264. package/test-data/zen-reference/graphs/company-analysis.json +390 -0
  265. package/test-data/zen-reference/graphs/credit-limit-adjustment.json +479 -0
  266. package/test-data/zen-reference/graphs/customer-eligibility-engine.json +551 -0
  267. package/test-data/zen-reference/graphs/customer-lifetime-value.json +200 -0
  268. package/test-data/zen-reference/graphs/customer-onboarding-kyc-verification.json +611 -0
  269. package/test-data/zen-reference/graphs/customer-service-escalation.json +191 -0
  270. package/test-data/zen-reference/graphs/decision-table-discounts.json +168 -0
  271. package/test-data/zen-reference/graphs/decision-table-shipping.json +398 -0
  272. package/test-data/zen-reference/graphs/delivery-route-optimizer.json +271 -0
  273. package/test-data/zen-reference/graphs/device-compatibility-checker.json +303 -0
  274. package/test-data/zen-reference/graphs/disaster-relief-fund-allocation.json +296 -0
  275. package/test-data/zen-reference/graphs/dynamic-fx-rate-pricing-system.json +237 -0
  276. package/test-data/zen-reference/graphs/dynamic-marketplace-comission-calculator.json +242 -0
  277. package/test-data/zen-reference/graphs/dynamic-shipping-cost-calculator.json +378 -0
  278. package/test-data/zen-reference/graphs/dynamic-tarrif-engine.json +289 -0
  279. package/test-data/zen-reference/graphs/dynamic-ticket-pricing.json +325 -0
  280. package/test-data/zen-reference/graphs/empty-column-with-space.json +100 -0
  281. package/test-data/zen-reference/graphs/empty-column-without-space.json +100 -0
  282. package/test-data/zen-reference/graphs/environment-compliance-assessment.json +386 -0
  283. package/test-data/zen-reference/graphs/expression-default.json +93 -0
  284. package/test-data/zen-reference/graphs/expression-fields.json +94 -0
  285. package/test-data/zen-reference/graphs/expression-loop.json +94 -0
  286. package/test-data/zen-reference/graphs/expression-passthrough.json +108 -0
  287. package/test-data/zen-reference/graphs/expression-table-map.json +313 -0
  288. package/test-data/zen-reference/graphs/flash-sale-eligibility.json +366 -0
  289. package/test-data/zen-reference/graphs/flight-dispatch-decision-system.json +455 -0
  290. package/test-data/zen-reference/graphs/flight-rebooking-fee-calculator.json +406 -0
  291. package/test-data/zen-reference/graphs/government-assistance.json +299 -0
  292. package/test-data/zen-reference/graphs/grant-funding-distribution.json +307 -0
  293. package/test-data/zen-reference/graphs/hazardous-materials-management-system.json +414 -0
  294. package/test-data/zen-reference/graphs/immigration-eligibility-evaluator.json +765 -0
  295. package/test-data/zen-reference/graphs/import-duties-calculator.json +318 -0
  296. package/test-data/zen-reference/graphs/insurance-agent-commission.json +228 -0
  297. package/test-data/zen-reference/graphs/insurance-breakdown.json +421 -0
  298. package/test-data/zen-reference/graphs/insurance-coverage-calculator.json +362 -0
  299. package/test-data/zen-reference/graphs/insurance-prior-authorization.json +467 -0
  300. package/test-data/zen-reference/graphs/insurance-underwriting-risk.json +321 -0
  301. package/test-data/zen-reference/graphs/international-roaming-policy-manager.json +199 -0
  302. package/test-data/zen-reference/graphs/last-mile-delivery-assignment.json +373 -0
  303. package/test-data/zen-reference/graphs/legacy-plan-management.json +434 -0
  304. package/test-data/zen-reference/graphs/loan-approval.json +469 -0
  305. package/test-data/zen-reference/graphs/marketplace-listing-verification-system.json +334 -0
  306. package/test-data/zen-reference/graphs/medication-dosage-calculator.json +318 -0
  307. package/test-data/zen-reference/graphs/merch-bags.json +171 -0
  308. package/test-data/zen-reference/graphs/multi-switch.json +498 -0
  309. package/test-data/zen-reference/graphs/municipal-permit-evaluation-system.json +364 -0
  310. package/test-data/zen-reference/graphs/mvno-partner-enablement.json +313 -0
  311. package/test-data/zen-reference/graphs/nested-request.json +125 -0
  312. package/test-data/zen-reference/graphs/online-checkin-eligibility.json +285 -0
  313. package/test-data/zen-reference/graphs/order-consolidation-system.json +493 -0
  314. package/test-data/zen-reference/graphs/partner-revenue-sharing.json +244 -0
  315. package/test-data/zen-reference/graphs/payment-routing-and-fee-calculator.json +475 -0
  316. package/test-data/zen-reference/graphs/policy-discount-calculator.json +307 -0
  317. package/test-data/zen-reference/graphs/policy-eligibility-analyzer.json +299 -0
  318. package/test-data/zen-reference/graphs/product-listing-scoring.json +358 -0
  319. package/test-data/zen-reference/graphs/realtime-fraud-detection.json +235 -0
  320. package/test-data/zen-reference/graphs/regional-compliance-manager.json +278 -0
  321. package/test-data/zen-reference/graphs/returns-and-refund-policy.json +366 -0
  322. package/test-data/zen-reference/graphs/returns-processing-system.json +448 -0
  323. package/test-data/zen-reference/graphs/school-district-resource-allocation.json +282 -0
  324. package/test-data/zen-reference/graphs/seat-map-optimization.json +325 -0
  325. package/test-data/zen-reference/graphs/seller-approval-workflow.json +383 -0
  326. package/test-data/zen-reference/graphs/seller-fee-calculator.json +307 -0
  327. package/test-data/zen-reference/graphs/service-level-agreement-enforcement.json +575 -0
  328. package/test-data/zen-reference/graphs/set-fee.json +243 -0
  329. package/test-data/zen-reference/graphs/shipping-carrier-selector.json +379 -0
  330. package/test-data/zen-reference/graphs/smart-financial-product-matcher.json +249 -0
  331. package/test-data/zen-reference/graphs/supply-chain-risk.json +316 -0
  332. package/test-data/zen-reference/graphs/table-loop.json +93 -0
  333. package/test-data/zen-reference/graphs/tax-exemption.json +295 -0
  334. package/test-data/zen-reference/graphs/traffic-violation-penalty-calculator.json +436 -0
  335. package/test-data/zen-reference/graphs/transaction-compliance-classifier.json +525 -0
  336. package/test-data/zen-reference/graphs/vehicle-claims-resolution.json +310 -0
  337. package/test-data/zen-reference/graphs/warehouse-cross-docking.json +313 -0
  338. package/test-data/zen-reference/graphs/warehouse-storage-location.json +345 -0
  339. package/test-data/zen-reference/http-function.json +34 -0
  340. package/test-data/zen-reference/infinite-function.json +46 -0
  341. package/test-data/zen-reference/js/imports.js +25 -0
  342. package/test-data/zen-reference/passthrough.json +31 -0
  343. package/test-data/zen-reference/recursive-table1.json +49 -0
  344. package/test-data/zen-reference/recursive-table2.json +49 -0
  345. package/test-data/zen-reference/sleep-function.json +34 -0
  346. package/test-data/zen-reference/switch-node.json +167 -0
  347. package/test-data/zen-reference/switch-performance-2.json +1307 -0
  348. package/test-data/zen-reference/switch-performance.json +691 -0
  349. package/test-data/zen-reference/table.json +76 -0
  350. package/tests/helpers/index.ts +73 -0
  351. package/tests/helpers/mock-context.ts +231 -0
  352. package/tests/helpers/round-trip.ts +398 -0
  353. package/tests/helpers/test-harness-comparison.ts +325 -0
  354. package/tests/helpers/test-harness-wasm.ts +710 -0
  355. package/tests/helpers/test-harness.ts +28 -0
  356. package/tests/helpers/wasm-test.ts +659 -0
  357. package/tests/integration/compilation-errors.test.ts +864 -0
  358. package/tests/integration/decision-tables.test.ts +531 -0
  359. package/tests/integration/edge-cases.test.ts +787 -0
  360. package/tests/integration/expressions.test.ts +513 -0
  361. package/tests/integration/function-node-integration.test.ts +182 -0
  362. package/tests/integration/sub-decisions.test.ts +108 -0
  363. package/tests/integration/switch-nodes.test.ts +399 -0
  364. package/tests/integration/unary-or-matching.test.ts +53 -0
  365. package/tests/integration/wasm-data-types.test.ts +398 -0
  366. package/tests/integration/wasm-errors.test.ts +199 -0
  367. package/tests/integration/wasm-execution.test.ts +348 -0
  368. package/tests/integration/wasm-memory.test.ts +228 -0
  369. package/tests/scripts/analyze-coverage.ts +166 -0
  370. package/tests/scripts/categorize-tests.ts +396 -0
  371. package/tests/scripts/coverage-analysis.ts +836 -0
  372. package/tests/unit/compiler/cache.test.ts +238 -0
  373. package/tests/unit/compiler/errors.test.ts +316 -0
  374. package/tests/unit/compiler/graph-scalability.test.ts +510 -0
  375. package/tests/unit/compiler/graph.test.ts +878 -0
  376. package/tests/unit/compiler/input-validation.test.ts +447 -0
  377. package/tests/unit/compiler/logical-and-parser.test.ts +143 -0
  378. package/tests/unit/compiler/logical-not-parser.test.ts +107 -0
  379. package/tests/unit/compiler/logical-or-parser.test.ts +236 -0
  380. package/tests/unit/compiler/marshal-gen/marshal-gen.test.ts +97 -0
  381. package/tests/unit/compiler/nodes/decision-table.test.ts +103 -0
  382. package/tests/unit/compiler/nodes/decision.test.ts +182 -0
  383. package/tests/unit/compiler/nodes/function-compile.test.ts +204 -0
  384. package/tests/unit/compiler/nodes/function.test.ts +176 -0
  385. package/tests/unit/compiler/nodes/input.test.ts +30 -0
  386. package/tests/unit/compiler/nodes/switch.test.ts +127 -0
  387. package/tests/unit/compiler/optimizer-cache.test.ts +327 -0
  388. package/tests/unit/compiler/optimizer-implementation.test.ts +625 -0
  389. package/tests/unit/compiler/parser.test.ts +508 -0
  390. package/tests/unit/compiler/runtime-error-cleanup.test.ts +426 -0
  391. package/tests/unit/compiler/runtime-validation.test.ts +303 -0
  392. package/tests/unit/compiler/runtime.test.ts +221 -0
  393. package/tests/unit/compiler/schema/schema.test.ts +248 -0
  394. package/tests/unit/compiler/unary-ast-transforms.test.ts +245 -0
  395. package/tsconfig.json +27 -0
  396. package/tsup.config.ts +11 -0
  397. package/vitest.config.ts +12 -0
@@ -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 };