@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,161 @@
1
+ /**
2
+ * Unary expression transformation utilities for decision table compilation.
3
+ *
4
+ * In decision tables, expressions are evaluated in a "unary" context where
5
+ * the $ symbol is automatically bound to the input field's value. Since
6
+ * AssemblyScript doesn't support closures, we transform the AST to replace
7
+ * DollarRef nodes with pre-compiled code.
8
+ *
9
+ * This module provides:
10
+ * - InlineCode: A marker type for pre-compiled code in ASTs
11
+ * - replaceDollarRefWithCode: AST transformer for dollar reference substitution
12
+ * - compileExpressionWithInlineCode: Compiler that handles InlineCode nodes
13
+ */
14
+
15
+ import type { CompilationContext } from './types';
16
+ import { compileExpression, compileBinaryOpWithValues } from './nodes/expression';
17
+
18
+ /**
19
+ * Special marker type for inline code that should be inserted directly.
20
+ *
21
+ * Used when AST transformation requires embedding already-compiled code.
22
+ * For example, when compiling "$ > 100" where $ refers to a field value,
23
+ * we replace the DollarRef node with an InlineCode node containing the
24
+ * pre-compiled field access code.
25
+ */
26
+ export interface InlineCode {
27
+ type: 'InlineCode';
28
+ code: string;
29
+ }
30
+
31
+ /**
32
+ * Recursively replace DollarRef nodes in an AST with InlineCode nodes
33
+ * containing the pre-compiled field expression.
34
+ *
35
+ * This transformation enables unary expression compilation in AssemblyScript
36
+ * by substituting $ references with actual field access code at compile time.
37
+ *
38
+ * @param ast - The AST node to transform
39
+ * @param compiledField - The pre-compiled code for the field value
40
+ * @returns The transformed AST with InlineCode nodes instead of DollarRef
41
+ *
42
+ * @example
43
+ * // Original AST for "$ > 100":
44
+ * // { type: "BinaryOp", op: ">", left: { type: "DollarRef" }, right: { type: "NumberLiteral", value: 100 } }
45
+ * //
46
+ * // After transformation with compiledField = 'ctx.get("creditScore")':
47
+ * // { type: "BinaryOp", op: ">", left: { type: "InlineCode", code: 'ctx.get("creditScore")' }, right: { type: "NumberLiteral", value: 100 } }
48
+ */
49
+ export function replaceDollarRefWithCode(ast: any, compiledField: string): any {
50
+ if (!ast || typeof ast !== 'object') {
51
+ return ast;
52
+ }
53
+
54
+ // If this is a DollarRef, replace it with InlineCode containing the compiled field
55
+ if (ast.type === 'DollarRef') {
56
+ return { type: 'InlineCode', code: compiledField } as InlineCode;
57
+ }
58
+
59
+ // Recursively transform child nodes
60
+ const result: any = { type: ast.type };
61
+
62
+ for (const key of Object.keys(ast)) {
63
+ if (key === 'type') {
64
+ continue;
65
+ }
66
+
67
+ const value = ast[key];
68
+ if (Array.isArray(value)) {
69
+ result[key] = value.map((item) => replaceDollarRefWithCode(item, compiledField));
70
+ } else if (value && typeof value === 'object') {
71
+ result[key] = replaceDollarRefWithCode(value, compiledField);
72
+ } else {
73
+ result[key] = value;
74
+ }
75
+ }
76
+
77
+ return result;
78
+ }
79
+
80
+ /**
81
+ * Compile an AST that may contain InlineCode nodes.
82
+ *
83
+ * This compiler extends the standard expression compiler to handle InlineCode
84
+ * nodes, which contain pre-compiled code that should be inserted directly.
85
+ * It's used after replaceDollarRefWithCode to compile the transformed AST.
86
+ *
87
+ * @param ast - The AST node to compile (may contain InlineCode nodes)
88
+ * @param context - The compilation context
89
+ * @returns Compiled AssemblyScript code string
90
+ */
91
+ export function compileExpressionWithInlineCode(ast: any, context: CompilationContext): string {
92
+ // Handle InlineCode nodes specially - just return the pre-compiled code
93
+ if (ast.type === 'InlineCode') {
94
+ return (ast as InlineCode).code;
95
+ }
96
+
97
+ // For nodes with binary operations
98
+ if (ast.type === 'BinaryOp') {
99
+ const left = compileExpressionWithInlineCode(ast.left, context);
100
+ const right = compileExpressionWithInlineCode(ast.right, context);
101
+ return compileBinaryOpWithValues(ast.op, left, right);
102
+ }
103
+
104
+ // For unary operations
105
+ if (ast.type === 'UnaryOp') {
106
+ const operand = compileExpressionWithInlineCode(ast.operand, context);
107
+ switch (ast.op) {
108
+ case 'not':
109
+ return `Value.Bool(!(${operand}).asBool())`;
110
+ case '-':
111
+ return `negateValue(${operand})`;
112
+ default:
113
+ throw new Error(`Unknown unary operator: ${ast.op}`);
114
+ }
115
+ }
116
+
117
+ // For function calls, compile args recursively to handle InlineCode
118
+ if (ast.type === 'FunctionCall') {
119
+ const callee = ast.callee;
120
+ if (callee.type === 'Identifier') {
121
+ const args = ast.args.map((arg: any) => compileExpressionWithInlineCode(arg, context));
122
+ const numArgs = args.length;
123
+
124
+ // Use helper functions to create argument arrays
125
+ if (numArgs === 1) {
126
+ return `evaluateFunction("${callee.name}", makeArgs1(${args[0]}))`;
127
+ } else if (numArgs === 2) {
128
+ return `evaluateFunction("${callee.name}", makeArgs2(${args[0]}, ${args[1]}))`;
129
+ } else if (numArgs === 3) {
130
+ return `evaluateFunction("${callee.name}", makeArgs3(${args[0]}, ${args[1]}, ${args[2]}))`;
131
+ } else {
132
+ return `evaluateFunction("${callee.name}", [${args.join(', ')}])`;
133
+ }
134
+ }
135
+ throw new Error('Only direct function calls are supported');
136
+ }
137
+
138
+ // For member access
139
+ if (ast.type === 'MemberAccess') {
140
+ const obj = compileExpressionWithInlineCode(ast.object, context);
141
+ return `getProperty(${obj}, "${ast.property}")`;
142
+ }
143
+
144
+ // For index access
145
+ if (ast.type === 'IndexAccess') {
146
+ const obj = compileExpressionWithInlineCode(ast.object, context);
147
+ const idx = compileExpressionWithInlineCode(ast.index, context);
148
+ return `getIndex(${obj}, ${idx})`;
149
+ }
150
+
151
+ // For ternary operations
152
+ if (ast.type === 'TernaryOp') {
153
+ const cond = compileExpressionWithInlineCode(ast.condition, context);
154
+ const cons = compileExpressionWithInlineCode(ast.consequent, context);
155
+ const alt = compileExpressionWithInlineCode(ast.alternate, context);
156
+ return `(${cond}.asBool() ? ${cons} : ${alt})`;
157
+ }
158
+
159
+ // For other node types, delegate to standard compileExpression
160
+ return compileExpression(ast, context);
161
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Sanitize an ID for use as an AssemblyScript identifier.
3
+ * Replaces hyphens and other special characters with underscores.
4
+ *
5
+ * @param id - The ID to sanitize
6
+ * @returns A valid AssemblyScript identifier
7
+ */
8
+ export function sanitizeId(id: string): string {
9
+ // Replace hyphens and other non-alphanumeric characters (except underscores) with underscores
10
+ return id.replace(/[^a-zA-Z0-9_]/g, '_');
11
+ }
12
+
13
+ /**
14
+ * Convert a node name to a camelCase key.
15
+ * Used for wrapping decision table outputs with the node name.
16
+ * Example: "RiskFactors" -> "riskFactors", "DiscountRules" -> "discountRules"
17
+ *
18
+ * @param name - The node name to convert
19
+ * @returns A camelCase key
20
+ */
21
+ export function nodeNameToKey(name: string): string {
22
+ if (!name || name.length === 0) {
23
+ return name;
24
+ }
25
+ // Lowercase the first character
26
+ return name.charAt(0).toLowerCase() + name.slice(1);
27
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Virtual filesystem for in-memory AssemblyScript compilation.
3
+ * Manages file mappings for the ASC compiler.
4
+ */
5
+
6
+ import {
7
+ RUNTIME_VALUES,
8
+ RUNTIME_CONTEXT,
9
+ RUNTIME_EXPRESSIONS,
10
+ RUNTIME_TABLES,
11
+ RUNTIME_MEMORY,
12
+ RUNTIME_STRINGS,
13
+ RUNTIME_ARRAYS,
14
+ } from './runtime/index';
15
+
16
+ /** VirtualFS stores files as string or Uint8Array content */
17
+ export type VirtualFS = Map<string, string | Uint8Array>;
18
+
19
+ /**
20
+ * Create a virtual filesystem with runtime libraries and user code.
21
+ * @param code - User's AssemblyScript code to compile
22
+ * @returns Configured virtual filesystem
23
+ */
24
+ export function createVirtualFS(code: string): VirtualFS {
25
+ const virtualFS: VirtualFS = new Map();
26
+ virtualFS.set('src/runtime/index.ts', code);
27
+ virtualFS.set('src/runtime/values.ts', RUNTIME_VALUES);
28
+ virtualFS.set('src/runtime/context.ts', RUNTIME_CONTEXT);
29
+ virtualFS.set('src/runtime/expressions.ts', RUNTIME_EXPRESSIONS);
30
+ virtualFS.set('src/runtime/tables.ts', RUNTIME_TABLES);
31
+ virtualFS.set('src/runtime/memory.ts', RUNTIME_MEMORY);
32
+ virtualFS.set('src/runtime/strings.ts', RUNTIME_STRINGS);
33
+ virtualFS.set('src/runtime/arrays.ts', RUNTIME_ARRAYS);
34
+ return virtualFS;
35
+ }
36
+
37
+ /**
38
+ * Create ASC-compatible file system callbacks.
39
+ * @param virtualFS - The virtual filesystem to use
40
+ * @returns Object with readFile, writeFile, listFiles functions for ASC compiler
41
+ */
42
+ export function createASCFileSystemCallbacks(virtualFS: VirtualFS) {
43
+ return {
44
+ readFile(name: string, baseDir: string): string | null {
45
+ // Try multiple path variations to find the file
46
+ const possibleKeys = [
47
+ // 'src/runtime/index.ts'
48
+ name,
49
+ // './src/runtime/index.ts' or 'src/runtime/index.ts'
50
+ baseDir ? `${baseDir}/${name}` : name,
51
+ // Remove leading ./
52
+ name.startsWith('./') ? name.slice(2) : name,
53
+ ];
54
+
55
+ for (const key of possibleKeys) {
56
+ const content = virtualFS.get(key);
57
+ if (typeof content === 'string') {
58
+ return content;
59
+ }
60
+ }
61
+ return null;
62
+ },
63
+ writeFile(name: string, data: Uint8Array | string, baseDir: string): void {
64
+ const key = baseDir ? `${baseDir}/${name}` : name;
65
+ virtualFS.set(key, data);
66
+ },
67
+ listFiles(dirname: string, baseDir: string): string[] | null {
68
+ const prefix = baseDir ? `${baseDir}/${dirname}` : dirname;
69
+ return [...virtualFS.keys()].filter((f) => f.startsWith(prefix));
70
+ },
71
+ };
72
+ }
73
+
74
+ /**
75
+ * Get output files from virtual filesystem after compilation.
76
+ * @param virtualFS - The virtual filesystem
77
+ * @returns Object with binary and wat files (may be undefined if not present)
78
+ */
79
+ export function getCompilationOutput(virtualFS: VirtualFS): {
80
+ binary: Uint8Array | undefined;
81
+ wat: string | undefined;
82
+ } {
83
+ // The compiler writes to ./output.wasm (with ./ prefix)
84
+ const binary = virtualFS.get('output.wasm') || virtualFS.get('./output.wasm');
85
+ const wat = virtualFS.get('output.wat') || virtualFS.get('./output.wat');
86
+ return {
87
+ binary: binary instanceof Uint8Array ? binary : undefined,
88
+ wat: typeof wat === 'string' ? wat : undefined,
89
+ };
90
+ }
@@ -0,0 +1,127 @@
1
+ /**
2
+ * WebAssembly module instantiation and runtime support.
3
+ * Handles loading compiled WASM and setting up the host environment.
4
+ */
5
+
6
+ import { CompilationError, ErrorCode } from './errors';
7
+ import { RuntimeError } from './runtime';
8
+
9
+ /**
10
+ * Type for WebAssembly exports from compiled AssemblyScript module.
11
+ */
12
+ export interface WasmExports {
13
+ /** Main evaluation function - takes input pointer, returns output pointer */
14
+ evaluate: (inputPtr: number) => number;
15
+ /** Allocate memory for a new object */
16
+ __new: (size: number, id: number) => number;
17
+ /** Pin an object to prevent garbage collection */
18
+ __pin: (ptr: number) => number;
19
+ /** Unpin a previously pinned object */
20
+ __unpin: (ptr: number) => void;
21
+ /** WebAssembly linear memory */
22
+ memory?: WebAssembly.Memory;
23
+ }
24
+
25
+ /**
26
+ * Create the host environment imports for WASM instantiation.
27
+ *
28
+ * This sets up the abort handler and any other host functions
29
+ * required by the AssemblyScript runtime.
30
+ *
31
+ * @returns WebAssembly imports object
32
+ */
33
+ export function createHostImports(): WebAssembly.Imports {
34
+ return {
35
+ env: {
36
+ abort: (msg: number, file: number, line: number, col: number) => {
37
+ // Log to stderr for debugging (useful for runtime errors in production)
38
+ console.error(`WASM abort at ${file}:${line}:${col}, msg: ${msg}`);
39
+ throw new RuntimeError(`WASM abort at ${file}:${line}:${col}`);
40
+ },
41
+ },
42
+ };
43
+ }
44
+
45
+ /**
46
+ * Validate that required exports exist on the WASM module.
47
+ *
48
+ * @param exports - Raw exports from WebAssembly instance
49
+ * @returns Typed WasmExports object
50
+ * @throws CompilationError if required exports are missing
51
+ */
52
+ export function validateWasmExports(exports: unknown): WasmExports {
53
+ if (!exports || typeof exports !== 'object') {
54
+ throw new CompilationError(
55
+ 'Compiled WASM module has no exports',
56
+ ErrorCode.INVALID_NODE_STRUCTURE,
57
+ { field: 'wasm.exports' },
58
+ );
59
+ }
60
+
61
+ const wasmExports = exports as WasmExports;
62
+
63
+ if (!wasmExports.evaluate) {
64
+ throw new CompilationError(
65
+ 'Compiled WASM module does not export required function: evaluate',
66
+ ErrorCode.INVALID_NODE_STRUCTURE,
67
+ { field: 'wasm.exports.evaluate' },
68
+ );
69
+ }
70
+
71
+ if (!wasmExports.__new) {
72
+ throw new CompilationError(
73
+ 'Compiled WASM module does not export required function: __new',
74
+ ErrorCode.INVALID_NODE_STRUCTURE,
75
+ { field: 'wasm.exports.__new' },
76
+ );
77
+ }
78
+
79
+ if (!wasmExports.memory) {
80
+ throw new CompilationError(
81
+ 'Compiled WASM module does not export required function: memory',
82
+ ErrorCode.INVALID_NODE_STRUCTURE,
83
+ { field: 'wasm.exports.memory' },
84
+ );
85
+ }
86
+
87
+ return wasmExports;
88
+ }
89
+
90
+ /**
91
+ * Instantiate compiled WASM and return evaluation function.
92
+ *
93
+ * Note: JS <-> WASM serialization is handled by the marshal/unmarshal functions
94
+ * generated by marshal-gen.ts. This function is maintained for backward compatibility.
95
+ *
96
+ * @param binary - Compiled WASM binary
97
+ * @returns Object with an evaluate function (not yet implemented)
98
+ */
99
+ export async function instantiateWasm(
100
+ binary: Uint8Array,
101
+ ): Promise<{ evaluate: (input: object) => object }> {
102
+ // Compile the WASM binary
103
+ const module = await WebAssembly.compile(binary.buffer as ArrayBuffer);
104
+
105
+ // Define the host environment
106
+ const imports = createHostImports();
107
+
108
+ // Instantiate with host environment
109
+ const instance = await WebAssembly.instantiate(module, imports);
110
+
111
+ // Validate exports
112
+ validateWasmExports(instance.exports);
113
+
114
+ return {
115
+ evaluate(_input: object): object {
116
+ // TODO: Implement JS <-> WASM serialization
117
+ // This will use wasmExports.__new to allocate memory, serialize the input object,
118
+ // call evaluate, and deserialize the result back to JavaScript.
119
+ // This functionality will be implemented with schema-driven typed serialization.
120
+
121
+ throw new RuntimeError(
122
+ 'JS <-> WASM serialization not yet implemented. ' +
123
+ 'This will be implemented with schema-driven typed serialization.',
124
+ );
125
+ },
126
+ };
127
+ }
package/src/index.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './compiler/index';