@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,211 @@
1
+ // src/compiler/runtime-codegen.ts
2
+ // Compile-time code generation utilities for loading generated marshaling and validation code
3
+
4
+ import { CompilationError, ErrorCode } from './errors';
5
+
6
+ /**
7
+ * Type definitions for marshal and unmarshal functions.
8
+ */
9
+ export type MarshalFn = (data: Record<string, unknown>, memory: WebAssembly.Memory) => number;
10
+
11
+ export type UnmarshalFn = (ptr: number, memory: WebAssembly.Memory) => Record<string, unknown>;
12
+
13
+ export type ValidateFn = (data: unknown) => void;
14
+
15
+ /**
16
+ * Load generated marshaling code as executable functions.
17
+ *
18
+ * @internal This function uses Function constructor to execute generated code.
19
+ * The code is generated by the compiler and is trusted, but users should be
20
+ * aware that this executes arbitrary JavaScript in the current context.
21
+ *
22
+ * @param code - The generated marshaling code
23
+ * @returns Object with marshal and unmarshal functions
24
+ */
25
+ export function loadGeneratedMarshaling(code: string): {
26
+ marshal: MarshalFn;
27
+ unmarshal: UnmarshalFn;
28
+ } {
29
+ // Create a function from the generated code
30
+
31
+ // We use string replacement instead of ES module loading because: (1) generated code
32
+ // uses ES6 exports which Function() doesn't support, (2) avoiding eval() for security,
33
+ // (3) provides isolated scope for generated code. Convert export syntax to regular functions.
34
+ const cleanedCode = code
35
+ .replace(/^export function marshalInput/gm, 'function marshalInputHelper')
36
+ .replace(/^export function unmarshalOutput/gm, 'function unmarshalOutputHelper')
37
+ .replace(/^export const SCHEMA_HASH/gm, 'const SCHEMA_HASH')
38
+ .replace(/^export const INPUT_FIXED_SIZE/gm, 'const INPUT_FIXED_SIZE')
39
+ .replace(/^export const OUTPUT_FIXED_SIZE/gm, 'const OUTPUT_FIXED_SIZE')
40
+ .replace(/^export function writeString/gm, 'function writeStringHelper')
41
+ .replace(/^export function readString/gm, 'function readStringHelper')
42
+ .replace(/^export function writeArray/gm, 'function writeArrayHelper')
43
+ .replace(/^export function readArray/gm, 'function readArrayHelper')
44
+ .replace(/^export function calculateInputSize/gm, 'function calculateInputSizeHelper');
45
+
46
+ // Helper function to extract nested values
47
+ const helperCode = `
48
+ function getNestedValue(obj, path) {
49
+ const parts = path.split('.');
50
+ let current = obj;
51
+ for (const part of parts) {
52
+ if (current == null) return undefined;
53
+ if (typeof current !== 'object') return undefined;
54
+ current = current[part];
55
+ }
56
+ return current;
57
+ }
58
+ `;
59
+
60
+ // Type for the raw 3-argument marshal function
61
+ type RawMarshalFn = (
62
+ data: Record<string, unknown>,
63
+ memory: WebAssembly.Memory,
64
+ allocate: (size: number) => number,
65
+ ) => number;
66
+
67
+ const module: { marshalInput?: RawMarshalFn; unmarshalOutput?: UnmarshalFn } = {};
68
+
69
+ const setupFn = new Function(
70
+ 'module',
71
+ helperCode +
72
+ cleanedCode +
73
+ `
74
+ module.marshalInput = marshalInputHelper;
75
+ module.unmarshalOutput = unmarshalOutputHelper;
76
+ `,
77
+ );
78
+
79
+ setupFn(module);
80
+
81
+ if (!module.marshalInput || !module.unmarshalOutput) {
82
+ throw new CompilationError(
83
+ 'Generated marshaling code did not export required functions',
84
+ ErrorCode.INVALID_NODE_STRUCTURE,
85
+ { field: 'marshalCode' },
86
+ );
87
+ }
88
+
89
+ // Create a 2-argument wrapper that provides an internal allocator
90
+ // The allocator starts at 192KB to avoid collision with:
91
+ // - AssemblyScript static data (0 - ~50KB)
92
+ // - AssemblyScript runtime heap (~50KB - ~192KB, grows during evaluation)
93
+ // This matches the memory layout expected by the WASM module.
94
+ const rawMarshal = module.marshalInput;
95
+ const INPUT_BUFFER_START = 192 * 1024; // 192KB
96
+ const REQUIRED_MEMORY = 768 * 1024; // 768KB minimum to fit input + output buffers
97
+
98
+ const wrappedMarshal: MarshalFn = (data, memory) => {
99
+ // Ensure memory is large enough for the expected layout
100
+ if (memory.buffer.byteLength < REQUIRED_MEMORY) {
101
+ const pagesNeeded = Math.ceil((REQUIRED_MEMORY - memory.buffer.byteLength) / 65536);
102
+ memory.grow(pagesNeeded);
103
+ }
104
+
105
+ // Simple bump allocator starting at 192KB (after AS runtime heap region)
106
+ let heapOffset = INPUT_BUFFER_START;
107
+ const allocate = (size: number): number => {
108
+ const ptr = heapOffset;
109
+ heapOffset += size;
110
+ // Grow memory if needed
111
+ if (heapOffset > memory.buffer.byteLength) {
112
+ const pagesNeeded = Math.ceil((heapOffset - memory.buffer.byteLength) / 65536);
113
+ memory.grow(pagesNeeded);
114
+ }
115
+ return ptr;
116
+ };
117
+ return rawMarshal(data, memory, allocate);
118
+ };
119
+
120
+ return {
121
+ marshal: wrappedMarshal,
122
+ unmarshal: module.unmarshalOutput,
123
+ };
124
+ }
125
+
126
+ // Cache TypeCompiler to avoid repeated dynamic imports
127
+ let cachedTypeCompiler: unknown = null;
128
+
129
+ /**
130
+ * Load generated validation code as executable function.
131
+ *
132
+ * @param code - The generated validation code
133
+ * @returns Validation function
134
+ */
135
+ export async function loadGeneratedValidation(code: string): Promise<ValidateFn> {
136
+ // The generated validation code uses ES6 import/export syntax and TypeScript syntax
137
+ // We need to:
138
+ // 1. Strip import statements
139
+ // 2. Strip TypeScript type annotations
140
+ // 3. Convert exports to regular function/class definitions
141
+ // 4. Pass TypeCompiler as a dependency
142
+ // 5. Return the validateInput function
143
+
144
+ let cleanedCode = code;
145
+
146
+ // Remove import statements
147
+ const importRegex = /^import\s+.*from\s+['"].*['"];?\s*$/gm;
148
+ cleanedCode = cleanedCode.replace(importRegex, '');
149
+
150
+ // Strip TypeScript parameter type annotations
151
+ // Matches: function foo(param: Type, other: Type)
152
+ cleanedCode = cleanedCode.replace(/(\w+)\s*:\s*\w+(?:<[^>]+>)?(?=[,)])/g, '$1');
153
+
154
+ // Strip TypeScript "asserts" return type annotations
155
+ // Matches: ): asserts data is Type {
156
+ cleanedCode = cleanedCode.replace(/\):\s+asserts\s+\w+\s+is\s+\w+\s*(<[^>]+>)?\s*\{/g, ') {');
157
+
158
+ // Strip TypeScript class property modifiers
159
+ // Matches: public readonly errors: Type {
160
+ cleanedCode = cleanedCode.replace(/public\s+readonly\s+/g, '');
161
+ cleanedCode = cleanedCode.replace(/public\s+/g, '');
162
+
163
+ // Strip generic type annotations from Array
164
+ // Matches: Array<{...}> and Array<Type>
165
+ cleanedCode = cleanedCode.replace(/Array<([^>]+)>/g, 'Array');
166
+
167
+ // Strip TSchema type reference (from @sinclair/typebox)
168
+ cleanedCode = cleanedCode.replace(/:\s*TSchema/g, '');
169
+
170
+ // Convert exports to regular definitions
171
+ cleanedCode = cleanedCode
172
+ .replace(/^export function validateInput/gm, 'function validateInput')
173
+ .replace(/^export class ValidationError/gm, 'class ValidationError')
174
+ .replace(/^export function checkInput/gm, 'function checkInput');
175
+
176
+ // Import TypeCompiler dynamically (cached for performance)
177
+ if (!cachedTypeCompiler) {
178
+ const module = await import('@sinclair/typebox/compiler');
179
+ cachedTypeCompiler = module.TypeCompiler;
180
+ }
181
+ const TypeCompiler = cachedTypeCompiler;
182
+
183
+ // Create a module object to hold the validator (no type annotation for Function context)
184
+ const module: any = {};
185
+
186
+ const setupFn = new Function(
187
+ 'TypeCompiler',
188
+ 'module',
189
+ `
190
+ ${cleanedCode}
191
+ module.validateInput = validateInput;
192
+ `,
193
+ );
194
+
195
+ setupFn(TypeCompiler, module);
196
+
197
+ if (!module.validateInput) {
198
+ throw new CompilationError(
199
+ 'Generated validation code did not export validateInput function',
200
+ ErrorCode.INVALID_NODE_STRUCTURE,
201
+ { field: 'validationCode' },
202
+ );
203
+ }
204
+
205
+ return module.validateInput;
206
+ }
207
+
208
+ /**
209
+ * Re-export validation code generation functions from marshal-gen
210
+ */
211
+ export { generateValidationCode } from './marshal-gen';
@@ -0,0 +1,294 @@
1
+ /**
2
+ * Runtime validation code generation for decision models.
3
+ *
4
+ * This module provides functions that generate or perform validation code
5
+ * that executes at runtime. These functions validate actual data against
6
+ * schemas when the decision is evaluated.
7
+ *
8
+ * For compile-time static analysis (checking references exist, etc.),
9
+ * see compile-time-validation.ts.
10
+ */
11
+
12
+ import type { FlattenedLayout } from './types';
13
+
14
+ /**
15
+ * Validation error containing field path, expected type, and actual value.
16
+ */
17
+ export interface ValidationError {
18
+ /** The field path (e.g., "customer.age") */
19
+ path: string;
20
+ /** Error message describing the issue */
21
+ message: string;
22
+ /** The expected type */
23
+ expected?: string;
24
+ /** The actual value that failed validation */
25
+ actual?: unknown;
26
+ }
27
+
28
+ /**
29
+ * Result of runtime validation.
30
+ */
31
+ export interface ValidationResult {
32
+ /** Whether validation passed */
33
+ valid: boolean;
34
+ /** Array of validation errors (empty if valid) */
35
+ errors: ValidationError[];
36
+ }
37
+
38
+ /**
39
+ * Validate runtime input data against the input schema.
40
+ *
41
+ * This function checks that all required input fields from the schema
42
+ * are present in the provided input data AND that they have correct types.
43
+ * It returns a list of validation errors including missing fields and
44
+ * type mismatches.
45
+ *
46
+ * Security note: This validation prevents malformed input with wrong types
47
+ * (string instead of number, object instead of array) from being marshaled
48
+ * to WASM, which could cause runtime errors or unexpected behavior.
49
+ *
50
+ * @param inputData - Runtime input data as a JavaScript object
51
+ * @param inputLayout - Flattened layout from the input schema
52
+ * @returns Array of missing/invalid input field paths (empty if all valid)
53
+ */
54
+ export function validateRuntimeInputs(
55
+ inputData: Record<string, any>,
56
+ inputLayout: FlattenedLayout,
57
+ ): string[] {
58
+ const result = validateRuntimeInputsDetailed(inputData, inputLayout);
59
+ // Return just the paths for backwards compatibility
60
+ return result.errors.map((e) => e.path);
61
+ }
62
+
63
+ /**
64
+ * Validate runtime input data with detailed error information.
65
+ *
66
+ * This function performs comprehensive validation including:
67
+ * - Presence checking: All required fields must be present
68
+ * - Type checking: Values must match expected types
69
+ * - Range checking: Numbers must be finite (not NaN/Infinity unless intended)
70
+ *
71
+ * @param inputData - Runtime input data as a JavaScript object
72
+ * @param inputLayout - Flattened layout from the input schema
73
+ * @returns Detailed validation result with errors
74
+ */
75
+ export function validateRuntimeInputsDetailed(
76
+ inputData: Record<string, any>,
77
+ inputLayout: FlattenedLayout,
78
+ ): ValidationResult {
79
+ const errors: ValidationError[] = [];
80
+
81
+ for (const field of inputLayout.fields) {
82
+ const path = field.path;
83
+ const parts = path.split('.');
84
+
85
+ let current: any = inputData;
86
+ let exists = true;
87
+
88
+ // Navigate to the nested value
89
+ for (const part of parts) {
90
+ if (current === null || current === undefined || current[part] === undefined) {
91
+ exists = false;
92
+ break;
93
+ }
94
+ current = current[part];
95
+ }
96
+
97
+ if (!exists) {
98
+ errors.push({
99
+ path,
100
+ message: 'Required field is missing',
101
+ expected: field.type,
102
+ actual: undefined,
103
+ });
104
+ continue;
105
+ }
106
+
107
+ // Now check type
108
+ const typeError = validateFieldType(current, field.type, path);
109
+ if (typeError) {
110
+ errors.push(typeError);
111
+ }
112
+ }
113
+
114
+ return {
115
+ valid: errors.length === 0,
116
+ errors,
117
+ };
118
+ }
119
+
120
+ /**
121
+ * Validate that a value matches the expected field type.
122
+ *
123
+ * @param value - The actual value to validate
124
+ * @param expectedType - The expected type from the schema
125
+ * @param path - The field path for error reporting
126
+ * @returns ValidationError if type mismatch, null if valid
127
+ */
128
+ function validateFieldType(
129
+ value: unknown,
130
+ expectedType: 'f64' | 'i32' | 'i64' | 'bool' | 'string' | 'array',
131
+ path: string,
132
+ ): ValidationError | null {
133
+ const actualType = typeof value;
134
+
135
+ switch (expectedType) {
136
+ case 'f64':
137
+ case 'i32':
138
+ case 'i64': {
139
+ // Check for number type
140
+ if (actualType !== 'number' && actualType !== 'bigint') {
141
+ return {
142
+ path,
143
+ message: `Expected ${expectedType} (number), got ${actualType}`,
144
+ expected: expectedType,
145
+ actual: value,
146
+ };
147
+ }
148
+
149
+ // For number types, also check for NaN
150
+ if (actualType === 'number' && Number.isNaN(value)) {
151
+ return {
152
+ path,
153
+ message: `Invalid number: NaN is not allowed`,
154
+ expected: expectedType,
155
+ actual: value,
156
+ };
157
+ }
158
+
159
+ // For integer types, check that the value is actually an integer
160
+ if (expectedType === 'i32' || expectedType === 'i64') {
161
+ if (actualType === 'number' && !Number.isInteger(value)) {
162
+ return {
163
+ path,
164
+ message: `Expected integer, got floating-point number`,
165
+ expected: expectedType,
166
+ actual: value,
167
+ };
168
+ }
169
+ }
170
+ break;
171
+ }
172
+
173
+ case 'bool': {
174
+ if (actualType !== 'boolean') {
175
+ return {
176
+ path,
177
+ message: `Expected boolean, got ${actualType}`,
178
+ expected: 'boolean',
179
+ actual: value,
180
+ };
181
+ }
182
+ break;
183
+ }
184
+
185
+ case 'string': {
186
+ if (actualType !== 'string') {
187
+ return {
188
+ path,
189
+ message: `Expected string, got ${actualType}`,
190
+ expected: 'string',
191
+ actual: value,
192
+ };
193
+ }
194
+ break;
195
+ }
196
+
197
+ case 'array': {
198
+ if (!Array.isArray(value)) {
199
+ return {
200
+ path,
201
+ message: `Expected array, got ${actualType}`,
202
+ expected: 'array',
203
+ actual: value,
204
+ };
205
+ }
206
+ break;
207
+ }
208
+
209
+ default: {
210
+ // Unknown type - this shouldn't happen with a valid schema
211
+ // but we'll accept any value for forward compatibility
212
+ break;
213
+ }
214
+ }
215
+
216
+ return null;
217
+ }
218
+
219
+ /**
220
+ * Validate runtime output data against the output schema.
221
+ *
222
+ * This function checks that all required output fields from the schema
223
+ * are present in the provided output data AND that they have correct types.
224
+ * It returns a list of validation errors including missing fields and
225
+ * type mismatches.
226
+ *
227
+ * @param outputData - Runtime output data as a JavaScript object
228
+ * @param outputLayout - Flattened layout from the output schema
229
+ * @returns Array of missing/invalid output field paths (empty if all valid)
230
+ */
231
+ export function validateRuntimeOutputs(
232
+ outputData: Record<string, any>,
233
+ outputLayout: FlattenedLayout,
234
+ ): string[] {
235
+ const result = validateRuntimeOutputsDetailed(outputData, outputLayout);
236
+ return result.errors.map((e) => e.path);
237
+ }
238
+
239
+ /**
240
+ * Validate runtime output data with detailed error information.
241
+ *
242
+ * This function performs comprehensive validation including:
243
+ * - Presence checking: All required output fields must be present
244
+ * - Type checking: Values must match expected types
245
+ *
246
+ * @param outputData - Runtime output data as a JavaScript object
247
+ * @param outputLayout - Flattened layout from the output schema
248
+ * @returns Detailed validation result with errors
249
+ */
250
+ export function validateRuntimeOutputsDetailed(
251
+ outputData: Record<string, any>,
252
+ outputLayout: FlattenedLayout,
253
+ ): ValidationResult {
254
+ const errors: ValidationError[] = [];
255
+
256
+ for (const field of outputLayout.fields) {
257
+ const path = field.path;
258
+ const parts = path.split('.');
259
+
260
+ // Allows objects to be built incrementally (e.g., output.customer.name and
261
+ // output.customer.age) instead of requiring the entire object at once.
262
+ let current: any = outputData;
263
+ let exists = true;
264
+
265
+ for (const part of parts) {
266
+ if (current === null || current === undefined || current[part] === undefined) {
267
+ exists = false;
268
+ break;
269
+ }
270
+ current = current[part];
271
+ }
272
+
273
+ if (!exists) {
274
+ errors.push({
275
+ path,
276
+ message: 'Required output field is missing',
277
+ expected: field.type,
278
+ actual: undefined,
279
+ });
280
+ continue;
281
+ }
282
+
283
+ // Now check type
284
+ const typeError = validateFieldType(current, field.type, path);
285
+ if (typeError) {
286
+ errors.push(typeError);
287
+ }
288
+ }
289
+
290
+ return {
291
+ valid: errors.length === 0,
292
+ errors,
293
+ };
294
+ }