@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,303 @@
1
+ /**
2
+ * Runtime Schema Validation Tests
3
+ *
4
+ * Tests for runtime schema validation:
5
+ * - Loading generated validation code
6
+ * - Validating input data
7
+ * - Error messages with field paths
8
+ */
9
+
10
+ import { describe, it, expect } from 'vitest';
11
+ import { generateValidationCode } from '../../../src/compiler/marshal-gen';
12
+ import { Type } from '@sinclair/typebox';
13
+ import { loadGeneratedValidation } from '../../../src/compiler/runtime';
14
+
15
+ describe('Runtime Schema Validation', () => {
16
+ it('should load generated validation code as executable function', async () => {
17
+ const schema = Type.Object({
18
+ name: Type.String(),
19
+ age: Type.Number(),
20
+ active: Type.Boolean(),
21
+ });
22
+
23
+ const validationCode = generateValidationCode(schema);
24
+ const validate = await loadGeneratedValidation(validationCode);
25
+
26
+ expect(typeof validate).toBe('function');
27
+ });
28
+
29
+ it('should accept valid data that matches schema', async () => {
30
+ const schema = Type.Object({
31
+ name: Type.String(),
32
+ age: Type.Number(),
33
+ active: Type.Boolean(),
34
+ });
35
+
36
+ const validationCode = generateValidationCode(schema);
37
+ const validate = await loadGeneratedValidation(validationCode);
38
+
39
+ const validData = {
40
+ name: 'Alice',
41
+ age: 30,
42
+ active: true,
43
+ };
44
+
45
+ // Should not throw
46
+ expect(() => validate(validData)).not.toThrow();
47
+ });
48
+
49
+ it('should reject data with wrong type', async () => {
50
+ const schema = Type.Object({
51
+ name: Type.String(),
52
+ age: Type.Number(),
53
+ active: Type.Boolean(),
54
+ });
55
+
56
+ const validationCode = generateValidationCode(schema);
57
+ const validate = await loadGeneratedValidation(validationCode);
58
+
59
+ const invalidData = {
60
+ name: 'Alice',
61
+ age: '30', // Should be number
62
+ active: true,
63
+ };
64
+
65
+ expect(() => validate(invalidData)).toThrow();
66
+ });
67
+
68
+ it('should reject data with missing required field', async () => {
69
+ const schema = Type.Object({
70
+ name: Type.String(),
71
+ age: Type.Number(),
72
+ active: Type.Boolean(),
73
+ });
74
+
75
+ const validationCode = generateValidationCode(schema);
76
+ const validate = await loadGeneratedValidation(validationCode);
77
+
78
+ const invalidData = {
79
+ name: 'Alice',
80
+ // age is missing
81
+ active: true,
82
+ };
83
+
84
+ expect(() => validate(invalidData)).toThrow();
85
+ });
86
+
87
+ it('should provide detailed error messages with field paths', async () => {
88
+ const schema = Type.Object({
89
+ user: Type.Object({
90
+ name: Type.String(),
91
+ age: Type.Number(),
92
+ }),
93
+ tags: Type.Array(Type.String()),
94
+ });
95
+
96
+ const validationCode = generateValidationCode(schema);
97
+ const validate = await loadGeneratedValidation(validationCode);
98
+
99
+ const invalidData = {
100
+ user: {
101
+ name: 'Alice',
102
+ age: '30', // Should be number
103
+ },
104
+ tags: ['tag1', 123], // Second element should be string
105
+ };
106
+
107
+ try {
108
+ validate(invalidData);
109
+ throw new Error('Expected validation to fail');
110
+ } catch (error) {
111
+ expect(error).toBeInstanceOf(Error);
112
+ const message = (error as Error).message;
113
+ // Error should include field paths
114
+ expect(message).toMatch(/Invalid input data/);
115
+ expect(message).toMatch(/user\.age|tags\/1/);
116
+ }
117
+ });
118
+
119
+ it('should handle nested object validation', async () => {
120
+ const schema = Type.Object({
121
+ customer: Type.Object({
122
+ name: Type.String(),
123
+ contact: Type.Object({
124
+ email: Type.String(),
125
+ phone: Type.Optional(Type.String()),
126
+ }),
127
+ }),
128
+ });
129
+
130
+ const validationCode = generateValidationCode(schema);
131
+ const validate = await loadGeneratedValidation(validationCode);
132
+
133
+ const validData = {
134
+ customer: {
135
+ name: 'Alice',
136
+ contact: {
137
+ email: 'alice@example.com',
138
+ },
139
+ },
140
+ };
141
+
142
+ const invalidData = {
143
+ customer: {
144
+ name: 'Alice',
145
+ contact: {
146
+ email: 123, // Should be string
147
+ },
148
+ },
149
+ };
150
+
151
+ expect(() => validate(validData)).not.toThrow();
152
+ expect(() => validate(invalidData)).toThrow();
153
+ });
154
+
155
+ it('should handle array validation', async () => {
156
+ const schema = Type.Object({
157
+ items: Type.Array(Type.Number()),
158
+ });
159
+
160
+ const validationCode = generateValidationCode(schema);
161
+ const validate = await loadGeneratedValidation(validationCode);
162
+
163
+ const validData = {
164
+ items: [1, 2, 3, 4],
165
+ };
166
+
167
+ const invalidData = {
168
+ items: [1, '2', 3, 4], // Second element should be number
169
+ };
170
+
171
+ expect(() => validate(validData)).not.toThrow();
172
+ expect(() => validate(invalidData)).toThrow();
173
+ });
174
+
175
+ it('should handle optional fields', async () => {
176
+ const schema = Type.Object({
177
+ name: Type.String(),
178
+ age: Type.Optional(Type.Number()),
179
+ email: Type.Optional(Type.String()),
180
+ });
181
+
182
+ const validationCode = generateValidationCode(schema);
183
+ const validate = await loadGeneratedValidation(validationCode);
184
+
185
+ const data1 = {
186
+ name: 'Alice',
187
+ };
188
+
189
+ const data2 = {
190
+ name: 'Bob',
191
+ age: 30,
192
+ };
193
+
194
+ const data3 = {
195
+ name: 'Carol',
196
+ email: 'carol@example.com',
197
+ };
198
+
199
+ expect(() => validate(data1)).not.toThrow();
200
+ expect(() => validate(data2)).not.toThrow();
201
+ expect(() => validate(data3)).not.toThrow();
202
+ });
203
+
204
+ it('should provide clear error messages for multiple validation errors', async () => {
205
+ const schema = Type.Object({
206
+ name: Type.String(),
207
+ age: Type.Number(),
208
+ email: Type.String(),
209
+ });
210
+
211
+ const validationCode = generateValidationCode(schema);
212
+ const validate = await loadGeneratedValidation(validationCode);
213
+
214
+ const invalidData = {
215
+ name: 123, // Should be string
216
+ age: '30', // Should be number
217
+ email: 456, // Should be string
218
+ };
219
+
220
+ try {
221
+ validate(invalidData);
222
+ throw new Error('Expected validation to fail');
223
+ } catch (error) {
224
+ expect(error).toBeInstanceOf(Error);
225
+ const message = (error as Error).message;
226
+ // Error should include multiple field paths
227
+ expect(message).toMatch(/Invalid input data/);
228
+ expect(message).toMatch(/name/);
229
+ expect(message).toMatch(/age/);
230
+ expect(message).toMatch(/email/);
231
+ }
232
+ });
233
+
234
+ describe('Acceptance Criteria for Ticket ja-fff6', () => {
235
+ it('AC1: Input type mismatches are caught', async () => {
236
+ const schema = Type.Object({
237
+ age: Type.Number(),
238
+ name: Type.String(),
239
+ });
240
+
241
+ const validationCode = generateValidationCode(schema);
242
+ const validate = await loadGeneratedValidation(validationCode);
243
+
244
+ const validInput = { age: 30, name: 'Alice' };
245
+ const invalidInput = { age: 'not a number', name: 'Alice' };
246
+
247
+ expect(() => validate(validInput)).not.toThrow();
248
+ expect(() => validate(invalidInput)).toThrow(/age/);
249
+ });
250
+
251
+ it('AC2: Missing required fields are reported', async () => {
252
+ const schema = Type.Object({
253
+ age: Type.Number(),
254
+ name: Type.String(),
255
+ email: Type.String(),
256
+ });
257
+
258
+ const validationCode = generateValidationCode(schema);
259
+ const validate = await loadGeneratedValidation(validationCode);
260
+
261
+ const invalidInput = { age: 30, name: 'Alice' }; // Missing email
262
+
263
+ try {
264
+ validate(invalidInput);
265
+ throw new Error('Expected validation to fail');
266
+ } catch (error) {
267
+ const message = (error as Error).message;
268
+ expect(message).toMatch(/Invalid input data/);
269
+ expect(message).toMatch(/email/);
270
+ }
271
+ });
272
+
273
+ it('AC3: Validation errors include field paths', async () => {
274
+ const schema = Type.Object({
275
+ level1: Type.Object({
276
+ level2: Type.Object({
277
+ value: Type.Number(),
278
+ }),
279
+ }),
280
+ });
281
+
282
+ const validationCode = generateValidationCode(schema);
283
+ const validate = await loadGeneratedValidation(validationCode);
284
+
285
+ const invalidInput = {
286
+ level1: {
287
+ level2: {
288
+ value: 'not a number',
289
+ },
290
+ },
291
+ };
292
+
293
+ try {
294
+ validate(invalidInput);
295
+ throw new Error('Expected validation to fail');
296
+ } catch (error) {
297
+ const message = (error as Error).message;
298
+ // Error should include the full field path
299
+ expect(message).toMatch(/level1/);
300
+ }
301
+ });
302
+ });
303
+ });
@@ -0,0 +1,221 @@
1
+ // src/compiler/__tests__/runtime.test.ts
2
+ // Tests for the CompiledDecision class and runtime support
3
+
4
+ import { describe, it, expect, vi } from 'vitest';
5
+ import { CompiledDecision, RuntimeError, ensureMemory } from '../../../src/compiler/runtime';
6
+
7
+ describe('CompiledDecision', () => {
8
+ const mockWasm = new Uint8Array([
9
+ 0x00,
10
+ 0x61,
11
+ 0x73,
12
+ 0x6d,
13
+ 0x01,
14
+ 0x00,
15
+ 0x00,
16
+ 0x00, // WASM magic + version
17
+ ]);
18
+
19
+ const mockMarshal = vi.fn(() => 4);
20
+ const mockUnmarshal = vi.fn(() => ({ result: 'test' }));
21
+ const mockValidate = vi.fn();
22
+
23
+ it('should create a CompiledDecision instance', () => {
24
+ const decision = new CompiledDecision({
25
+ wasm: mockWasm,
26
+ schemaHash: 123n,
27
+ marshal: mockMarshal,
28
+ unmarshal: mockUnmarshal,
29
+ validate: mockValidate,
30
+ });
31
+
32
+ expect(decision).toBeInstanceOf(CompiledDecision);
33
+ // Memory is null before first evaluation (lazy initialization)
34
+ expect(decision.getMemory()).toBeNull();
35
+ });
36
+
37
+ it('should throw RuntimeError if MARSHAL returns invalid pointer', async () => {
38
+ const invalidMarshal = vi.fn(() => 0); // Invalid pointer (must be >= 4)
39
+
40
+ const decision = new CompiledDecision({
41
+ wasm: mockWasm,
42
+ schemaHash: 123n,
43
+ marshal: invalidMarshal,
44
+ unmarshal: mockUnmarshal,
45
+ });
46
+
47
+ await expect(decision.evaluate({ test: 'value' })).rejects.toThrow(RuntimeError);
48
+ });
49
+
50
+ it('should fail on invalid mock WASM during evaluation', async () => {
51
+ const mockValidate = vi.fn((data) => {
52
+ if (!data || typeof data !== 'object') {
53
+ throw new Error('Invalid input');
54
+ }
55
+ });
56
+
57
+ const decision = new CompiledDecision({
58
+ wasm: mockWasm,
59
+ schemaHash: 123n,
60
+ marshal: mockMarshal,
61
+ unmarshal: mockUnmarshal,
62
+ validate: mockValidate,
63
+ });
64
+
65
+ // The mock WASM module doesn't export 'memory', so instantiation succeeds
66
+ // but the memory will be undefined, causing the instance check to fail.
67
+ // Note: Real validation testing requires a valid WASM module.
68
+ await expect(decision.evaluate({ test: 'value' })).rejects.toThrow();
69
+ });
70
+
71
+ it('should get memory stats', () => {
72
+ const decision = new CompiledDecision({
73
+ wasm: mockWasm,
74
+ schemaHash: 123n,
75
+ marshal: mockMarshal,
76
+ unmarshal: mockUnmarshal,
77
+ initialMemoryPages: 2,
78
+ maximumMemoryPages: 10,
79
+ });
80
+
81
+ // Before initialization, current/used are 0
82
+ const stats = decision.getMemoryStats();
83
+ expect(stats.current).toBe(0); // Not initialized yet
84
+ expect(stats.maximum).toBe(65536 * 10); // 10 pages * 64KB
85
+ expect(stats.used).toBe(0);
86
+ });
87
+
88
+ it('should dispose of the instance', () => {
89
+ const decision = new CompiledDecision({
90
+ wasm: mockWasm,
91
+ schemaHash: 123n,
92
+ marshal: mockMarshal,
93
+ unmarshal: mockUnmarshal,
94
+ });
95
+
96
+ decision.dispose();
97
+ expect(decision.getInstance()).toBe(null);
98
+ });
99
+
100
+ it('should throw RuntimeError when getInputBuffer called before initialization', () => {
101
+ const decision = new CompiledDecision({
102
+ wasm: mockWasm,
103
+ schemaHash: 123n,
104
+ marshal: mockMarshal,
105
+ unmarshal: mockUnmarshal,
106
+ });
107
+
108
+ // Memory is not initialized until evaluate() is called
109
+ expect(() => {
110
+ decision.getInputBuffer(1024);
111
+ }).toThrow(RuntimeError);
112
+ });
113
+
114
+ it('should throw RuntimeError with correct error code when buffer cannot be obtained', () => {
115
+ const decision = new CompiledDecision({
116
+ wasm: mockWasm,
117
+ schemaHash: 123n,
118
+ marshal: mockMarshal,
119
+ unmarshal: mockUnmarshal,
120
+ initialMemoryPages: 1,
121
+ maximumMemoryPages: 1,
122
+ });
123
+
124
+ try {
125
+ decision.getInputBuffer(100000);
126
+ throw new Error('Should have thrown RuntimeError');
127
+ } catch (error) {
128
+ if (error instanceof RuntimeError) {
129
+ expect(error.code).toBe(5); // OUT_OF_MEMORY
130
+ } else {
131
+ throw error;
132
+ }
133
+ }
134
+ });
135
+ });
136
+
137
+ describe('RuntimeError', () => {
138
+ it('should create a RuntimeError with message and code', () => {
139
+ const error = new RuntimeError('Test error', 1, { context: 'data' });
140
+
141
+ expect(error).toBeInstanceOf(Error);
142
+ expect(error.name).toBe('RuntimeError');
143
+ expect(error.message).toBe('Test error');
144
+ expect(error.code).toBe(1);
145
+ expect(error.context).toEqual({ context: 'data' });
146
+ });
147
+
148
+ it('should have default code -1 if not specified', () => {
149
+ const error = new RuntimeError('Test error');
150
+ expect(error.code).toBe(-1);
151
+ expect(error.context).toBeUndefined();
152
+ });
153
+ });
154
+
155
+ describe('ensureMemory', () => {
156
+ it('should not grow memory if required size is within current buffer', () => {
157
+ const memory = new WebAssembly.Memory({ initial: 1 }); // 64KB
158
+ const initialSize = memory.buffer.byteLength;
159
+
160
+ ensureMemory(memory, 60000); // Less than current size
161
+
162
+ expect(memory.buffer.byteLength).toBe(initialSize);
163
+ });
164
+
165
+ it('should grow memory when required size exceeds current buffer', () => {
166
+ const memory = new WebAssembly.Memory({ initial: 1, maximum: 10 }); // 64KB initial, max 640KB
167
+ const initialSize = memory.buffer.byteLength;
168
+
169
+ ensureMemory(memory, 80000); // More than 64KB, need 2 pages = 128KB
170
+
171
+ expect(memory.buffer.byteLength).toBeGreaterThan(initialSize);
172
+ expect(memory.buffer.byteLength).toBe(131072); // 2 pages * 64KB
173
+ });
174
+
175
+ it('should grow memory by exact required pages', () => {
176
+ const memory = new WebAssembly.Memory({ initial: 1, maximum: 10 });
177
+
178
+ // Request 200KB - initial 64KB = 136KB needed, rounds up to 3 pages = 192KB added
179
+ // Total should be 256KB (4 pages)
180
+ ensureMemory(memory, 200000);
181
+
182
+ expect(memory.buffer.byteLength).toBe(262144); // 4 pages * 64KB
183
+ });
184
+
185
+ it('should handle large memory growth requests', () => {
186
+ const memory = new WebAssembly.Memory({ initial: 1, maximum: 10 });
187
+
188
+ ensureMemory(memory, 500000); // 500KB request
189
+
190
+ expect(memory.buffer.byteLength).toBe(524288); // 8 pages * 64KB = 512KB
191
+ });
192
+
193
+ it('should throw error when memory cannot be grown beyond maximum', () => {
194
+ const memory = new WebAssembly.Memory({ initial: 1, maximum: 2 }); // Max 128KB
195
+
196
+ expect(() => {
197
+ ensureMemory(memory, 500000); // Request 500KB, but max is 128KB
198
+ }).toThrow(/Cannot grow WASM memory/);
199
+ });
200
+
201
+ it('should handle exact page boundary requests', () => {
202
+ const memory = new WebAssembly.Memory({ initial: 1, maximum: 5 });
203
+
204
+ // Request exactly 128KB (2 pages)
205
+ ensureMemory(memory, 131072);
206
+
207
+ expect(memory.buffer.byteLength).toBe(131072);
208
+ });
209
+
210
+ it('should not grow memory when required size equals current size', () => {
211
+ const memory = new WebAssembly.Memory({ initial: 2 }); // 128KB
212
+ const initialSize = memory.buffer.byteLength;
213
+
214
+ ensureMemory(memory, initialSize);
215
+
216
+ expect(memory.buffer.byteLength).toBe(initialSize);
217
+ });
218
+ });
219
+
220
+ // Note: Full integration tests for createCompiledDecision would be added
221
+ // in future tickets when we have actual functional WASM modules