@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,426 @@
1
+ // tests/unit/compiler/runtime-error-cleanup.test.ts
2
+ // Tests for error state cleanup in CompiledDecision to ensure error state
3
+ // does not persist between evaluations (ERR-2592)
4
+
5
+ import { describe, it, expect, vi } from 'vitest';
6
+ import { CompiledDecision } from '../../../src/compiler/runtime';
7
+
8
+ describe('CompiledDecision Error State Cleanup', () => {
9
+ // Shared memory for mock instances (768KB to match real requirements)
10
+ const mockMemory = new WebAssembly.Memory({ initial: 12, maximum: 256 });
11
+
12
+ // Helper to create a mock WebAssembly instance with full exports
13
+ const createMockInstance = (
14
+ options: {
15
+ clearLastErrorFn?: () => void;
16
+ getLastErrorFn?: () => number;
17
+ resetHeapFn?: () => void;
18
+ evaluateFn?: (ptr: number) => number;
19
+ } = {},
20
+ ) => {
21
+ return {
22
+ exports: {
23
+ memory: mockMemory,
24
+ clearLastError: options.clearLastErrorFn ?? (() => {}),
25
+ getLastError: options.getLastErrorFn ?? (() => 0),
26
+ resetHeap: options.resetHeapFn ?? (() => {}),
27
+ evaluate: options.evaluateFn ?? ((_ptr: number) => 100),
28
+ },
29
+ } as unknown as WebAssembly.Instance;
30
+ };
31
+
32
+ // Helper to create a minimal valid WASM module
33
+ const createMockWasm = () =>
34
+ new Uint8Array([
35
+ 0x00,
36
+ 0x61,
37
+ 0x73,
38
+ 0x6d, // WASM magic
39
+ 0x01,
40
+ 0x00,
41
+ 0x00,
42
+ 0x00, // version
43
+ ]);
44
+
45
+ describe('Error State Isolation Between Evaluations', () => {
46
+ it('should call clearLastError at start and end of evaluation', async () => {
47
+ let clearLastErrorCallCount = 0;
48
+ const mockMarshal = vi.fn(() => 4);
49
+ const mockUnmarshal = vi.fn(() => ({ result: 'success' }));
50
+
51
+ const decision = new CompiledDecision({
52
+ wasm: createMockWasm(),
53
+ schemaHash: 123n,
54
+ marshal: mockMarshal,
55
+ unmarshal: mockUnmarshal,
56
+ });
57
+
58
+ // Mock the WebAssembly.instantiate to return our mock instance
59
+ vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
60
+ return createMockInstance({
61
+ clearLastErrorFn: () => {
62
+ clearLastErrorCallCount++;
63
+ },
64
+ });
65
+ });
66
+
67
+ try {
68
+ await decision.evaluate({ test: 'value' });
69
+
70
+ // clearLastError should be called twice: once at start, once in finally
71
+ expect(clearLastErrorCallCount).toBe(2);
72
+ } finally {
73
+ // Restore original
74
+ vi.spyOn(WebAssembly, 'instantiate').mockRestore();
75
+ }
76
+ });
77
+
78
+ it('should clear error state even when marshal throws', async () => {
79
+ let clearLastErrorCallCount = 0;
80
+ const mockMarshal = vi.fn(() => {
81
+ throw new Error('Marshal failed');
82
+ });
83
+ const mockUnmarshal = vi.fn(() => ({ result: 'success' }));
84
+
85
+ const decision = new CompiledDecision({
86
+ wasm: createMockWasm(),
87
+ schemaHash: 123n,
88
+ marshal: mockMarshal,
89
+ unmarshal: mockUnmarshal,
90
+ });
91
+
92
+ // Mock the WebAssembly.instantiate
93
+ vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
94
+ return createMockInstance({
95
+ clearLastErrorFn: () => {
96
+ clearLastErrorCallCount++;
97
+ },
98
+ });
99
+ });
100
+
101
+ try {
102
+ await expect(decision.evaluate({ test: 'value' })).rejects.toThrow('Marshal failed');
103
+
104
+ // clearLastError should still be called: once at start, once in finally
105
+ expect(clearLastErrorCallCount).toBe(2);
106
+ } finally {
107
+ vi.spyOn(WebAssembly, 'instantiate').mockRestore();
108
+ }
109
+ });
110
+
111
+ it('should clear error state when evaluation fails with error code', async () => {
112
+ const mockMarshal = vi.fn(() => 4);
113
+ const mockUnmarshal = vi.fn(() => ({ result: 'success' }));
114
+ let clearLastErrorCallCount = 0;
115
+ let lastErrorCode = 0;
116
+ let evaluationCount = 0;
117
+
118
+ const decision = new CompiledDecision({
119
+ wasm: createMockWasm(),
120
+ schemaHash: 123n,
121
+ marshal: mockMarshal,
122
+ unmarshal: mockUnmarshal,
123
+ });
124
+
125
+ // Mock the WebAssembly.instantiate
126
+ vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
127
+ return createMockInstance({
128
+ clearLastErrorFn: () => {
129
+ clearLastErrorCallCount++;
130
+ lastErrorCode = 0; // Simulate clearing
131
+ },
132
+ getLastErrorFn: () => lastErrorCode,
133
+ evaluateFn: () => {
134
+ evaluationCount++;
135
+ // First evaluation sets error, second doesn't
136
+ if (evaluationCount === 1) {
137
+ lastErrorCode = 1; // SCHEMA_MISMATCH
138
+ }
139
+ return 100;
140
+ },
141
+ });
142
+ });
143
+
144
+ try {
145
+ // First evaluation: simulate WASM error (schema mismatch)
146
+ await expect(decision.evaluate({ test: 'value' })).rejects.toThrow('Schema mismatch');
147
+
148
+ // Verify error was cleared in finally block
149
+ expect(lastErrorCode).toBe(0); // Should be cleared by clearLastError
150
+ expect(clearLastErrorCallCount).toBe(2); // Start + finally
151
+
152
+ // Second evaluation: should succeed without seeing old error
153
+ const result = await decision.evaluate({ test: 'value' });
154
+
155
+ // Should succeed
156
+ expect(result).toEqual({ result: 'success' });
157
+ expect(clearLastErrorCallCount).toBe(4); // 2 more calls for second evaluation
158
+ } finally {
159
+ vi.spyOn(WebAssembly, 'instantiate').mockRestore();
160
+ }
161
+ });
162
+
163
+ it('should clear error state even when unmarshal throws', async () => {
164
+ const mockMarshal = vi.fn(() => 4);
165
+ const mockUnmarshal = vi.fn(() => {
166
+ throw new Error('Unmarshal failed');
167
+ });
168
+ let clearLastErrorCallCount = 0;
169
+
170
+ const decision = new CompiledDecision({
171
+ wasm: createMockWasm(),
172
+ schemaHash: 123n,
173
+ marshal: mockMarshal,
174
+ unmarshal: mockUnmarshal,
175
+ });
176
+
177
+ // Mock the WebAssembly.instantiate
178
+ vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
179
+ return createMockInstance({
180
+ clearLastErrorFn: () => {
181
+ clearLastErrorCallCount++;
182
+ },
183
+ });
184
+ });
185
+
186
+ try {
187
+ // Evaluation: unmarshal throws
188
+ await expect(decision.evaluate({ test: 'value' })).rejects.toThrow('Unmarshal failed');
189
+
190
+ // clearLastError should still be called in finally block
191
+ expect(clearLastErrorCallCount).toBe(2); // Start + finally
192
+ } finally {
193
+ vi.spyOn(WebAssembly, 'instantiate').mockRestore();
194
+ }
195
+ });
196
+
197
+ it('should handle clearLastError not being exported gracefully', async () => {
198
+ const mockMarshal = vi.fn(() => 4);
199
+ const mockUnmarshal = vi.fn(() => ({ result: 'success' }));
200
+
201
+ const decision = new CompiledDecision({
202
+ wasm: createMockWasm(),
203
+ schemaHash: 123n,
204
+ marshal: mockMarshal,
205
+ unmarshal: mockUnmarshal,
206
+ });
207
+
208
+ // Mock the WebAssembly.instantiate WITHOUT clearLastError export (older WASM modules)
209
+ vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
210
+ return {
211
+ exports: {
212
+ memory: mockMemory,
213
+ getLastError: () => 0,
214
+ resetHeap: () => {},
215
+ evaluate: () => 100,
216
+ // Note: clearLastError is NOT exported
217
+ },
218
+ } as unknown as WebAssembly.Instance;
219
+ });
220
+
221
+ try {
222
+ // Should not throw even though clearLastError is missing
223
+ const result = await decision.evaluate({ test: 'value' });
224
+ expect(result).toEqual({ result: 'success' });
225
+ } finally {
226
+ vi.spyOn(WebAssembly, 'instantiate').mockRestore();
227
+ }
228
+ });
229
+ });
230
+
231
+ describe('Multiple Consecutive Evaluations', () => {
232
+ it('should maintain clean error state across multiple successful evaluations', async () => {
233
+ const mockMarshal = vi.fn(() => 4);
234
+ const mockUnmarshal = vi.fn(() => ({ result: 'success' }));
235
+ let clearLastErrorCallCount = 0;
236
+
237
+ const decision = new CompiledDecision({
238
+ wasm: createMockWasm(),
239
+ schemaHash: 123n,
240
+ marshal: mockMarshal,
241
+ unmarshal: mockUnmarshal,
242
+ });
243
+
244
+ // Mock the WebAssembly.instantiate
245
+ vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
246
+ return createMockInstance({
247
+ clearLastErrorFn: () => {
248
+ clearLastErrorCallCount++;
249
+ },
250
+ });
251
+ });
252
+
253
+ try {
254
+ // Run multiple evaluations
255
+ for (let i = 0; i < 5; i++) {
256
+ const result = await decision.evaluate({ iteration: i });
257
+ expect(result).toEqual({ result: 'success' });
258
+ }
259
+
260
+ // clearLastError should be called for each evaluation (start + finally)
261
+ expect(clearLastErrorCallCount).toBe(10); // 2 calls per evaluation * 5 evaluations
262
+ } finally {
263
+ vi.spyOn(WebAssembly, 'instantiate').mockRestore();
264
+ }
265
+ });
266
+
267
+ it('should recover after multiple consecutive errors', async () => {
268
+ const mockMarshal = vi.fn(() => 4);
269
+ const mockUnmarshal = vi.fn(() => ({ result: 'success' }));
270
+ let clearLastErrorCallCount = 0;
271
+ let evaluationCount = 0;
272
+ let lastErrorCode = 0;
273
+
274
+ const decision = new CompiledDecision({
275
+ wasm: createMockWasm(),
276
+ schemaHash: 123n,
277
+ marshal: mockMarshal,
278
+ unmarshal: mockUnmarshal,
279
+ });
280
+
281
+ // Mock the WebAssembly.instantiate
282
+ vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
283
+ return createMockInstance({
284
+ clearLastErrorFn: () => {
285
+ clearLastErrorCallCount++;
286
+ lastErrorCode = 0; // Clear error
287
+ },
288
+ getLastErrorFn: () => lastErrorCode,
289
+ evaluateFn: () => {
290
+ evaluationCount++;
291
+ // First 3 evaluations set error, 4th doesn't
292
+ if (evaluationCount <= 3) {
293
+ lastErrorCode = 4; // EVALUATION_ERROR
294
+ }
295
+ return 100;
296
+ },
297
+ });
298
+ });
299
+
300
+ try {
301
+ // Multiple failing evaluations
302
+ for (let i = 0; i < 3; i++) {
303
+ await expect(decision.evaluate({ iteration: i })).rejects.toThrow('Evaluation error');
304
+ }
305
+
306
+ // Then a successful evaluation
307
+ const result = await decision.evaluate({ final: true });
308
+ expect(result).toEqual({ result: 'success' });
309
+
310
+ // clearLastError should be called for all evaluations
311
+ expect(clearLastErrorCallCount).toBe(8); // 2 calls * 4 evaluations
312
+ } finally {
313
+ vi.spyOn(WebAssembly, 'instantiate').mockRestore();
314
+ }
315
+ });
316
+
317
+ it('should alternate between success and failure cleanly', async () => {
318
+ const mockMarshal = vi.fn(() => 4);
319
+ const mockUnmarshal = vi.fn(() => ({ result: 'success' }));
320
+ let clearLastErrorCallCount = 0;
321
+ let evaluationCount = 0;
322
+ let lastErrorCode = 0;
323
+
324
+ const decision = new CompiledDecision({
325
+ wasm: createMockWasm(),
326
+ schemaHash: 123n,
327
+ marshal: mockMarshal,
328
+ unmarshal: mockUnmarshal,
329
+ });
330
+
331
+ // Mock the WebAssembly.instantiate
332
+ vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
333
+ return createMockInstance({
334
+ clearLastErrorFn: () => {
335
+ clearLastErrorCallCount++;
336
+ lastErrorCode = 0; // Clear error
337
+ },
338
+ getLastErrorFn: () => lastErrorCode,
339
+ evaluateFn: () => {
340
+ evaluationCount++;
341
+ // Alternate: even evaluations (1st, 3rd, 5th...) fail, odd succeed
342
+ if (evaluationCount % 2 === 1) {
343
+ lastErrorCode = 1; // SCHEMA_MISMATCH
344
+ }
345
+ return 100;
346
+ },
347
+ });
348
+ });
349
+
350
+ try {
351
+ // Alternate between success and failure
352
+ for (let i = 0; i < 10; i++) {
353
+ const shouldFail = i % 2 === 0;
354
+
355
+ if (shouldFail) {
356
+ await expect(decision.evaluate({ iteration: i })).rejects.toThrow();
357
+ } else {
358
+ const result = await decision.evaluate({ iteration: i });
359
+ expect(result).toEqual({ result: 'success' });
360
+ }
361
+ }
362
+
363
+ // clearLastError should be called for all evaluations
364
+ expect(clearLastErrorCallCount).toBe(20); // 2 calls * 10 evaluations
365
+ } finally {
366
+ vi.spyOn(WebAssembly, 'instantiate').mockRestore();
367
+ }
368
+ });
369
+ });
370
+
371
+ describe('Error State Documentation', () => {
372
+ it('demonstrates that error state is local to each evaluation', async () => {
373
+ // This test serves as documentation for the fix to ERR-2592
374
+ const mockMarshal = vi.fn(() => 4);
375
+ const mockUnmarshal = vi.fn(() => ({ result: 'success' }));
376
+ const errorStates: number[] = [];
377
+ let currentError = 0;
378
+ let evaluationCount = 0;
379
+
380
+ const decision = new CompiledDecision({
381
+ wasm: createMockWasm(),
382
+ schemaHash: 123n,
383
+ marshal: mockMarshal,
384
+ unmarshal: mockUnmarshal,
385
+ });
386
+
387
+ // Mock the WebAssembly.instantiate
388
+ vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
389
+ return createMockInstance({
390
+ clearLastErrorFn: () => {
391
+ currentError = 0; // Clear error
392
+ },
393
+ getLastErrorFn: () => {
394
+ errorStates.push(currentError);
395
+ return currentError;
396
+ },
397
+ evaluateFn: () => {
398
+ evaluationCount++;
399
+ // Simulate an error on first evaluation only
400
+ if (evaluationCount === 1) {
401
+ currentError = 1; // SCHEMA_MISMATCH
402
+ }
403
+ return 100;
404
+ },
405
+ });
406
+ });
407
+
408
+ try {
409
+ // First evaluation fails with error
410
+ await expect(decision.evaluate({ test: 1 })).rejects.toThrow();
411
+
412
+ // Second evaluation should see clean error state (0)
413
+ // This is the key fix: error state is cleared after first evaluation
414
+ await decision.evaluate({ test: 2 });
415
+
416
+ // Verify error state was cleared between evaluations
417
+ // errorStates[0] = first evaluation's error check (= 1)
418
+ // errorStates[1] = second evaluation's error check (should be 0)
419
+ expect(errorStates[0]).toBe(1); // First evaluation had error
420
+ expect(errorStates[1]).toBe(0); // Second evaluation sees clean state
421
+ } finally {
422
+ vi.spyOn(WebAssembly, 'instantiate').mockRestore();
423
+ }
424
+ });
425
+ });
426
+ });