@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,398 @@
1
+ /**
2
+ * Round-trip testing utilities for marshaling/unmarshaling.
3
+ *
4
+ * These helpers verify that data can be marshaled to WASM memory format
5
+ * and unmarshaled back to the original JavaScript value without data loss.
6
+ *
7
+ * @module tests/helpers/round-trip
8
+ */
9
+
10
+ import type { TSchema } from '@sinclair/typebox';
11
+ import { expect } from 'vitest';
12
+ import { flattenSchema, computeSchemaHash } from '../../src/compiler/schema';
13
+ import { generateMarshalCode } from '../../src/compiler/marshal-gen';
14
+
15
+ /**
16
+ * Type for the marshal function generated by generateMarshalCode.
17
+ *
18
+ * Generated code uses 3-arg signature (data, memory, allocate) for flexibility, while the
19
+ * exported runtime wrapper uses 2-arg signature (data, memory) with internal allocator.
20
+ * This separation allows testing the raw generated code without wrapper overhead.
21
+ */
22
+ type GeneratedMarshalFn = (
23
+ data: Record<string, unknown>,
24
+ memory: WebAssembly.Memory,
25
+ allocate: (size: number) => number,
26
+ ) => number;
27
+
28
+ type GeneratedUnmarshalFn = (ptr: number, memory: WebAssembly.Memory) => Record<string, unknown>;
29
+
30
+ /**
31
+ * Load marshal and unmarshal functions from generated code string.
32
+ *
33
+ * This is a simplified version of loadGeneratedMarshaling from runtime.ts
34
+ * that correctly handles the 3-argument marshal function signature.
35
+ */
36
+ function loadMarshalFunctions(code: string): {
37
+ marshal: GeneratedMarshalFn;
38
+ unmarshal: GeneratedUnmarshalFn;
39
+ } {
40
+ // Generated code has exports for bundler usage, but we need plain functions for eval() in
41
+ // tests. We rename to avoid naming conflicts and preserve test isolation.
42
+ const cleanedCode = code
43
+ .replace(/^export function marshalInput/gm, 'function marshalInputHelper')
44
+ .replace(/^export function unmarshalOutput/gm, 'function unmarshalOutputHelper')
45
+ .replace(/^export const SCHEMA_HASH/gm, 'const SCHEMA_HASH')
46
+ .replace(/^export const INPUT_FIXED_SIZE/gm, 'const INPUT_FIXED_SIZE')
47
+ .replace(/^export const OUTPUT_FIXED_SIZE/gm, 'const OUTPUT_FIXED_SIZE')
48
+ .replace(/^export function writeString/gm, 'function writeStringHelper')
49
+ .replace(/^export function readString/gm, 'function readStringHelper')
50
+ .replace(/^export function writeArray/gm, 'function writeArrayHelper')
51
+ .replace(/^export function readArray/gm, 'function readArrayHelper')
52
+ .replace(/^export function calculateInputSize/gm, 'function calculateInputSizeHelper');
53
+
54
+ // Helper function to extract nested values
55
+ const helperCode = `
56
+ function getNestedValue(obj, path) {
57
+ const parts = path.split('.');
58
+ let current = obj;
59
+ for (const part of parts) {
60
+ if (current == null) return undefined;
61
+ if (typeof current !== 'object') return undefined;
62
+ current = current[part];
63
+ }
64
+ return current;
65
+ }
66
+ `;
67
+
68
+ const module: { marshalInput?: GeneratedMarshalFn; unmarshalOutput?: GeneratedUnmarshalFn } = {};
69
+
70
+ const setupFn = new Function(
71
+ 'module',
72
+ helperCode +
73
+ cleanedCode +
74
+ `
75
+ module.marshalInput = marshalInputHelper;
76
+ module.unmarshalOutput = unmarshalOutputHelper;
77
+ `,
78
+ );
79
+
80
+ setupFn(module);
81
+
82
+ if (!module.marshalInput || !module.unmarshalOutput) {
83
+ throw new Error('Generated marshaling code did not export required functions');
84
+ }
85
+
86
+ return {
87
+ marshal: module.marshalInput,
88
+ unmarshal: module.unmarshalOutput,
89
+ };
90
+ }
91
+
92
+ /**
93
+ * Options for round-trip testing.
94
+ */
95
+ export interface RoundTripOptions {
96
+ /**
97
+ * Custom equality comparison function.
98
+ * By default uses deep equality with floating point tolerance.
99
+ */
100
+ compare?: (expected: unknown, actual: unknown) => boolean;
101
+
102
+ /**
103
+ * Whether to log debug information on failure.
104
+ * @default false
105
+ */
106
+ debug?: boolean;
107
+
108
+ /**
109
+ * Custom memory size in bytes.
110
+ * @default 65536 (64KB)
111
+ */
112
+ memorySize?: number;
113
+ }
114
+
115
+ /**
116
+ * Result of a round-trip test.
117
+ */
118
+ export interface RoundTripResult<T> {
119
+ /** The original value that was marshaled */
120
+ original: T;
121
+ /** The value after unmarshaling */
122
+ recovered: unknown;
123
+ /** Whether the round-trip was successful (values match) */
124
+ success: boolean;
125
+ /** Time taken to marshal in milliseconds */
126
+ marshalTime: number;
127
+ /** Time taken to unmarshal in milliseconds */
128
+ unmarshalTime: number;
129
+ /** Total bytes used in memory */
130
+ bytesUsed: number;
131
+ }
132
+
133
+ /**
134
+ * Test that a value can be marshaled and unmarshaled without data loss.
135
+ *
136
+ * This function marshals a value to WASM memory format using the generated
137
+ * marshaling code for the given schema, then unmarshals it back and verifies
138
+ * the result matches the original value.
139
+ *
140
+ * @param schema - TypeBox schema describing the value structure
141
+ * @param value - The value to test
142
+ * @param options - Optional configuration
143
+ * @throws AssertionError if the round-trip fails
144
+ *
145
+ * @example
146
+ * ```typescript
147
+ * import { Type } from '@sinclair/typebox';
148
+ * import { testMarshalRoundTrip } from './round-trip';
149
+ *
150
+ * // Test a simple object
151
+ * await testMarshalRoundTrip(
152
+ * Type.Object({ name: Type.String(), age: Type.Number() }),
153
+ * { name: 'Alice', age: 30 }
154
+ * );
155
+ *
156
+ * // Test with custom comparison
157
+ * await testMarshalRoundTrip(schema, value, {
158
+ * compare: (a, b) => JSON.stringify(a) === JSON.stringify(b)
159
+ * });
160
+ * ```
161
+ */
162
+ export async function testMarshalRoundTrip<T>(
163
+ schema: TSchema,
164
+ value: T,
165
+ options: RoundTripOptions = {},
166
+ ): Promise<void> {
167
+ const result = await executeRoundTrip(schema, value, options);
168
+
169
+ if (!result.success) {
170
+ const message = [
171
+ 'Round-trip test failed:',
172
+ ` Original: ${JSON.stringify(result.original, null, 2)}`,
173
+ ` Recovered: ${JSON.stringify(result.recovered, null, 2)}`,
174
+ ].join('\n');
175
+
176
+ if (options.debug) {
177
+ console.error(message);
178
+ }
179
+
180
+ expect(result.recovered).toEqual(result.original);
181
+ }
182
+ }
183
+
184
+ /**
185
+ * Execute a round-trip test and return detailed results.
186
+ *
187
+ * Unlike `testMarshalRoundTrip`, this function does not throw on failure.
188
+ * Instead, it returns detailed results that can be used for debugging
189
+ * or custom assertions.
190
+ *
191
+ * @param schema - TypeBox schema describing the value structure
192
+ * @param value - The value to test
193
+ * @param options - Optional configuration
194
+ * @returns Detailed round-trip test results
195
+ *
196
+ * @example
197
+ * ```typescript
198
+ * const result = await executeRoundTrip(schema, complexValue);
199
+ * console.log(`Marshal time: ${result.marshalTime}ms`);
200
+ * console.log(`Memory used: ${result.bytesUsed} bytes`);
201
+ * if (!result.success) {
202
+ * console.error('Mismatch:', result.original, result.recovered);
203
+ * }
204
+ * ```
205
+ */
206
+ export async function executeRoundTrip<T>(
207
+ schema: TSchema,
208
+ value: T,
209
+ options: RoundTripOptions = {},
210
+ ): Promise<RoundTripResult<T>> {
211
+ const { memorySize = 65536 } = options;
212
+
213
+ // Generate marshaling code from schema
214
+ const layout = flattenSchema(schema);
215
+ const hash = computeSchemaHash(schema, schema);
216
+ const marshalCode = generateMarshalCode(layout, layout, hash);
217
+
218
+ // Load the generated functions
219
+ const { marshal, unmarshal } = loadMarshalFunctions(marshalCode);
220
+
221
+ // Create WASM memory
222
+ const memory = new WebAssembly.Memory({
223
+ initial: Math.ceil(memorySize / 65536),
224
+ maximum: 256,
225
+ });
226
+
227
+ // Simple bump allocator
228
+ // The 1024 offset reserves space for potential WASM static data (globals, tables, etc.)
229
+ // which typically occupy low memory addresses. Starting at 1KB provides safe separation.
230
+ let heapOffset = 1024; // Start after static data area
231
+ const allocate = (size: number): number => {
232
+ const ptr = heapOffset;
233
+ heapOffset += size;
234
+ return ptr;
235
+ };
236
+
237
+ // Marshal
238
+ const marshalStart = performance.now();
239
+ const ptr = marshal(value as Record<string, unknown>, memory, allocate);
240
+ const marshalTime = performance.now() - marshalStart;
241
+
242
+ // Unmarshal
243
+ const unmarshalStart = performance.now();
244
+ const recovered = unmarshal(ptr, memory);
245
+ const unmarshalTime = performance.now() - unmarshalStart;
246
+
247
+ // Compare
248
+ const compare = options.compare ?? deepEqual;
249
+ const success = compare(value, recovered);
250
+
251
+ return {
252
+ original: value,
253
+ recovered,
254
+ success,
255
+ marshalTime,
256
+ unmarshalTime,
257
+ bytesUsed: heapOffset,
258
+ };
259
+ }
260
+
261
+ /**
262
+ * Test multiple values with the same schema.
263
+ *
264
+ * Useful for testing various edge cases or data shapes with a single schema.
265
+ *
266
+ * @param schema - TypeBox schema describing the value structure
267
+ * @param values - Array of values to test
268
+ * @param options - Optional configuration
269
+ * @throws AssertionError if any round-trip fails
270
+ *
271
+ * @example
272
+ * ```typescript
273
+ * await testMarshalRoundTripBatch(
274
+ * Type.Object({ x: Type.Number() }),
275
+ * [
276
+ * { x: 0 },
277
+ * { x: -1 },
278
+ * { x: Number.MAX_SAFE_INTEGER },
279
+ * { x: 0.1 + 0.2 }, // floating point
280
+ * ]
281
+ * );
282
+ * ```
283
+ */
284
+ export async function testMarshalRoundTripBatch<T>(
285
+ schema: TSchema,
286
+ values: T[],
287
+ options: RoundTripOptions = {},
288
+ ): Promise<void> {
289
+ for (let i = 0; i < values.length; i++) {
290
+ try {
291
+ await testMarshalRoundTrip(schema, values[i], options);
292
+ } catch (error) {
293
+ throw new Error(
294
+ `Round-trip failed for value at index ${i}: ${JSON.stringify(values[i])}\n` +
295
+ (error instanceof Error ? error.message : String(error)),
296
+ );
297
+ }
298
+ }
299
+ }
300
+
301
+ /**
302
+ * Deep equality comparison with floating point tolerance.
303
+ *
304
+ * Handles:
305
+ * - Null/undefined
306
+ * - Primitives (with floating point tolerance for numbers)
307
+ * - Arrays (recursive comparison)
308
+ * - Objects (recursive comparison)
309
+ *
310
+ * @param a - First value
311
+ * @param b - Second value
312
+ * @returns true if values are equal
313
+ */
314
+ export function deepEqual(a: unknown, b: unknown): boolean {
315
+ // Handle null/undefined
316
+ if (a === b) {
317
+ return true;
318
+ }
319
+ if (a === null || b === null) {
320
+ return false;
321
+ }
322
+ if (a === undefined || b === undefined) {
323
+ return false;
324
+ }
325
+
326
+ // Handle different types
327
+ if (typeof a !== typeof b) {
328
+ return false;
329
+ }
330
+
331
+ // Handle numbers with floating point tolerance
332
+ if (typeof a === 'number' && typeof b === 'number') {
333
+ if (Number.isNaN(a) && Number.isNaN(b)) {
334
+ return true;
335
+ }
336
+ if (!Number.isFinite(a) || !Number.isFinite(b)) {
337
+ return a === b;
338
+ }
339
+
340
+ // Use relative tolerance for large numbers, absolute for small
341
+ const tolerance = 1e-14;
342
+ const diff = Math.abs(a - b);
343
+ const maxAbs = Math.max(Math.abs(a), Math.abs(b), 1);
344
+ return diff / maxAbs < tolerance || diff < Number.EPSILON;
345
+ }
346
+
347
+ // Handle arrays
348
+ if (Array.isArray(a)) {
349
+ if (!Array.isArray(b)) {
350
+ return false;
351
+ }
352
+ if (a.length !== b.length) {
353
+ return false;
354
+ }
355
+ return a.every((val, i) => deepEqual(val, b[i]));
356
+ }
357
+
358
+ // Handle objects
359
+ if (typeof a === 'object' && typeof b === 'object') {
360
+ const aObj = a as Record<string, unknown>;
361
+ const bObj = b as Record<string, unknown>;
362
+ const aKeys = Object.keys(aObj);
363
+ const bKeys = Object.keys(bObj);
364
+
365
+ if (aKeys.length !== bKeys.length) {
366
+ return false;
367
+ }
368
+
369
+ return aKeys.every((key) => deepEqual(aObj[key], bObj[key]));
370
+ }
371
+
372
+ // Primitive comparison
373
+ return a === b;
374
+ }
375
+
376
+ /**
377
+ * Create a custom round-trip tester with preset options.
378
+ *
379
+ * Useful for creating test-specific testers with consistent configuration.
380
+ *
381
+ * @param defaultOptions - Default options for all tests
382
+ * @returns A tester function with preset options
383
+ *
384
+ * @example
385
+ * ```typescript
386
+ * const debugTester = createRoundTripTester({ debug: true });
387
+ *
388
+ * // Now all tests will log debug info
389
+ * await debugTester(schema, value);
390
+ * ```
391
+ */
392
+ export function createRoundTripTester(
393
+ defaultOptions: RoundTripOptions = {},
394
+ ): <T>(schema: TSchema, value: T, options?: RoundTripOptions) => Promise<void> {
395
+ return async <T>(schema: TSchema, value: T, options: RoundTripOptions = {}): Promise<void> => {
396
+ return testMarshalRoundTrip(schema, value, { ...defaultOptions, ...options });
397
+ };
398
+ }