@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
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@divmain/jdm-asm",
3
+ "version": "0.2.0",
4
+ "description": "JDM to AssemblyScript WASM Compiler - Transforms JSON Decision Models into efficient WebAssembly",
5
+ "license": "MIT",
6
+ "author": "Dale Bustad <git@dale.link>",
7
+ "type": "module",
8
+ "main": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/index.js",
13
+ "types": "./dist/index.d.ts"
14
+ }
15
+ },
16
+ "scripts": {
17
+ "test": "vitest run",
18
+ "test:watch": "vitest",
19
+ "test:coverage": "node scripts/run-all-tests.ts",
20
+ "build": "tsup src/index.ts --format esm --dts",
21
+ "lint": "oxlint src tests",
22
+ "format": "oxfmt --write src tests",
23
+ "format:check": "oxfmt --check src tests",
24
+ "bench": "node --stack-size=65536 --import tsx benchmarks/run.ts",
25
+ "bench:compare": "node --stack-size=65536 --import tsx benchmarks/compare.ts",
26
+ "bench:optimization": "node --stack-size=65536 --import tsx benchmarks/optimization-bench.ts",
27
+ "asbuild": "asc src/runtime/index.ts --target release",
28
+ "asbuild:debug": "asc src/runtime/index.ts --target debug"
29
+ },
30
+ "dependencies": {
31
+ "@sinclair/typebox": "^0.34.0",
32
+ "assemblyscript": "^0.28.9",
33
+ "chevrotain": "^11.0.3",
34
+ "graphology": "^0.26.0",
35
+ "graphology-dag": "^0.4.1"
36
+ },
37
+ "devDependencies": {
38
+ "@gorules/zen-engine": "^0.51.5",
39
+ "@types/estree": "^1.0.8",
40
+ "@types/node": "^22.10.2",
41
+ "mitata": "^1.0.10",
42
+ "oxfmt": "^0.24.0",
43
+ "oxlint": "^1.39.0",
44
+ "tsup": "^8.0.0",
45
+ "tsx": "^4.7.0",
46
+ "typescript": "^5.7.3",
47
+ "vitest": "^2.1.8"
48
+ }
49
+ }
@@ -0,0 +1,220 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Full Test Runner
5
+ *
6
+ * Executes all compatibility tests and generates a summary report.
7
+ *
8
+ * Usage:
9
+ * node scripts/run-all-tests.ts [options]
10
+ *
11
+ * Options:
12
+ * --watch Run tests in watch mode
13
+ * --verbose Show detailed output
14
+ * --json Output results as JSON
15
+ */
16
+
17
+ import { spawn } from 'child_process';
18
+ import * as path from 'path';
19
+ import * as fs from 'fs';
20
+
21
+ interface TestSummary {
22
+ total: number;
23
+ passed: number;
24
+ failed: number;
25
+ skipped: number;
26
+ duration: number;
27
+ }
28
+
29
+ interface TestRunnerOptions {
30
+ watch?: boolean;
31
+ verbose?: boolean;
32
+ json?: boolean;
33
+ }
34
+
35
+ /**
36
+ * Parse command line arguments
37
+ */
38
+ function parseArgs(args: string[]): TestRunnerOptions {
39
+ const options: TestRunnerOptions = {};
40
+
41
+ for (let i = 0; i < args.length; i++) {
42
+ const arg = args[i];
43
+ switch (arg) {
44
+ case '--watch':
45
+ options.watch = true;
46
+ break;
47
+ case '--verbose':
48
+ options.verbose = true;
49
+ break;
50
+ case '--json':
51
+ options.json = true;
52
+ break;
53
+ }
54
+ }
55
+
56
+ return options;
57
+ }
58
+
59
+ /**
60
+ * Run vitest command and capture output
61
+ */
62
+ async function runVitest(options: TestRunnerOptions): Promise<TestSummary> {
63
+ return new Promise((resolve) => {
64
+ const args = options.watch ? ['watch'] : ['run'];
65
+
66
+ const vitest = spawn('npx', ['vitest', ...args], {
67
+ stdio: ['inherit', 'pipe', 'pipe'],
68
+ shell: true
69
+ });
70
+
71
+ let output = '';
72
+ let failedCount = 0;
73
+ let skippedCount = 0;
74
+ let passedCount = 0;
75
+ let totalCount = 0;
76
+
77
+ vitest.stdout.on('data', (data) => {
78
+ const text = data.toString();
79
+ output += text;
80
+
81
+ // Parse test results from output
82
+ // Look for patterns like "Test Files ... (X)"
83
+ const testFilesMatch = text.match(/Test Files\s+(.*)\s+\((\d+)\)/);
84
+ if (testFilesMatch && !totalCount) {
85
+ totalCount = parseInt(testFilesMatch[2], 10);
86
+ }
87
+
88
+ // Look for pass/fail counts
89
+ const passMatch = text.match(/\b(\d+)\s+passed/);
90
+ if (passMatch) {
91
+ passedCount = parseInt(passMatch[1], 10) || passedCount;
92
+ }
93
+
94
+ const failMatch = text.match(/\b(\d+)\s+failed/);
95
+ if (failMatch) {
96
+ failedCount = parseInt(failMatch[1], 10) || failedCount;
97
+ }
98
+
99
+ const skipMatch = text.match(/\b(\d+)\s+skipped/);
100
+ if (skipMatch) {
101
+ skippedCount = parseInt(skipMatch[1], 10) || skippedCount;
102
+ }
103
+
104
+ if (options.verbose) {
105
+ process.stdout.write(text);
106
+ }
107
+ });
108
+
109
+ vitest.stderr.on('data', (data) => {
110
+ const text = data.toString();
111
+ output += text;
112
+ if (options.verbose) {
113
+ process.stderr.write(text);
114
+ }
115
+ });
116
+
117
+ const startTime = Date.now();
118
+
119
+ vitest.on('close', (code) => {
120
+ const duration = Date.now() - startTime;
121
+
122
+ const summary: TestSummary = {
123
+ total: totalCount,
124
+ passed: passedCount,
125
+ failed: failedCount,
126
+ skipped: skippedCount,
127
+ duration,
128
+ };
129
+
130
+ // If we couldn't parse the output, count based on exit code
131
+ if (totalCount === 0) {
132
+ summary.failed = code === 0 ? 0 : (summary.failed || 1);
133
+ }
134
+
135
+ resolve(summary);
136
+ });
137
+
138
+ vitest.on('error', (err) => {
139
+ console.error('Error running vitest:', err);
140
+ resolve({
141
+ total: 0,
142
+ passed: 0,
143
+ failed: 1,
144
+ skipped: 0,
145
+ duration: 0,
146
+ });
147
+ });
148
+ });
149
+ }
150
+
151
+ /**
152
+ * Print summary report
153
+ */
154
+ function printSummary(summary: TestSummary): void {
155
+ console.log('\n' + '='.repeat(60));
156
+ console.log('📊 Test Results Summary');
157
+ console.log('='.repeat(60));
158
+ console.log(`Total Tests: ${summary.total}`);
159
+ console.log(`✅ Passed: ${summary.passed}`);
160
+ console.log(`❌ Failed: ${summary.failed}`);
161
+ console.log(`⏭️ Skipped: ${summary.skipped}`);
162
+ console.log(`⏱️ Duration: ${summary.duration}ms`);
163
+ console.log('='.repeat(60));
164
+
165
+ if (summary.total > 0) {
166
+ const successRate = Math.round((summary.passed / summary.total) * 100);
167
+ console.log(`Success Rate: ${successRate}%`);
168
+ }
169
+
170
+ console.log('='.repeat(60));
171
+
172
+ if (summary.failed === 0) {
173
+ console.log('🎉 All tests passed!');
174
+ } else {
175
+ console.log(`⚠️ ${summary.failed} test(s) failed or had issues`);
176
+ console.log('💡 Run with --verbose for detailed error messages');
177
+ }
178
+ }
179
+
180
+ /**
181
+ * Save summary as JSON
182
+ */
183
+ function saveJsonSummary(summary: TestSummary, outputDir: string): void {
184
+ const outputPath = path.join(outputDir, 'test-results.json');
185
+ fs.mkdirSync(outputDir, { recursive: true });
186
+ fs.writeFileSync(outputPath, JSON.stringify(summary, null, 2));
187
+ console.log(`\n📄 Results saved to: ${outputPath}`);
188
+ }
189
+
190
+ /**
191
+ * Main entry point
192
+ */
193
+ async function main(): Promise<void> {
194
+ const args = process.argv.slice(2);
195
+ const options = parseArgs(args);
196
+
197
+ console.log('🧪 Running Full Test Suite\n');
198
+
199
+ try {
200
+ const summary = await runVitest(options);
201
+
202
+ if (options.json) {
203
+ console.log(JSON.stringify(summary, null, 2));
204
+ } else {
205
+ printSummary(summary);
206
+ saveJsonSummary(summary, path.join(process.cwd(), 'dist', 'test-results'));
207
+ }
208
+
209
+ // Exit with appropriate code
210
+ process.exit(summary.failed > 0 ? 1 : 0);
211
+ } catch (error) {
212
+ console.error('❌ Test runner failed:', error);
213
+ process.exit(1);
214
+ }
215
+ }
216
+
217
+ // Run if executed directly
218
+ if (import.meta.url === `file://${process.argv[1]}`) {
219
+ main();
220
+ }
@@ -0,0 +1,228 @@
1
+ # Expression Language Subsets - Implementation Plan
2
+
3
+ This document defines the incremental implementation plan for expression subsets in the ZEN expression language.
4
+
5
+ ## Overview
6
+
7
+ The expression language will be implemented in stages, going from basic functionality to advanced features. Each subset builds upon the previous ones.
8
+
9
+ ## Subset 1: Basic Arithmetic & Comparisons
10
+
11
+ **Supported Features:**
12
+
13
+ - Numeric literals: `42`, `3.14`, `1_000_000` (underscore separators)
14
+ - String literals: `"hello"`, `'world'`
15
+ - Boolean literals: `true`, `false`
16
+ - Null literal: `null`
17
+ - Identifiers: `variableName`, `_private`
18
+ - Arithmetic operators: `+`, `-`, `*`, `/`, `%` (modulo), `^` (power)
19
+ - Comparison operators: `==`, `!=`, `<`, `>`, `<=`, `>=`
20
+
21
+ **Example Expressions:**
22
+
23
+ ```javascript
24
+ age + 1;
25
+ (price * quantity) / 100;
26
+ score >= 80;
27
+ name == 'admin';
28
+ ```
29
+
30
+ **Implementation Status:** Implemented in Phase 3
31
+
32
+ ---
33
+
34
+ ## Subset 2: Logical Operators
35
+
36
+ **Supported Features:**
37
+
38
+ - Logical AND: `and`
39
+ - Logical OR: `or`
40
+ - Logical NOT: `not`
41
+ - Parenthesized expressions: `(a + b) * c`
42
+
43
+ **Operator Precedence:**
44
+
45
+ 1. Parentheses
46
+ 2. NOT (unary)
47
+ 3. Arithmetic (`*`, `/`, `%`)
48
+ 4. Arithmetic (`+`, `-`)
49
+ 5. Power (`^`) - right-associative
50
+ 6. Comparisons (`==`, `!=`, `<`, `>`, `<=`, `>=`)
51
+ 7. AND
52
+ 8. OR
53
+
54
+ **Example Expressions:**
55
+
56
+ ```javascript
57
+ age >= 18 and hasLicense
58
+ (score > 90 or grade == 'A') and not suspended
59
+ not (a and b) == (not a or not b)
60
+ ```
61
+
62
+ **Implementation Status:** Implemented in Phase 3
63
+
64
+ ---
65
+
66
+ ## Subset 3: String Operations
67
+
68
+ **Supported Features:**
69
+
70
+ - String concatenation with `+` operator
71
+ - Template literals: `` `Hello ${name}` ``, `` `Value: ${x}, Total: ${y}` ``
72
+ - Template literals with multiple interpolations
73
+ - Escaped characters in strings
74
+
75
+ **Example Expressions:**
76
+
77
+ ```javascript
78
+ firstName +
79
+ ' ' +
80
+ lastName`Hello, ${name}!``Order ${orderId}: ${items.length} items (${total})``Quote: "Hello\nWorld"`;
81
+ ```
82
+
83
+ **Implementation Status:** Implemented in Phase 3
84
+
85
+ ---
86
+
87
+ ## Subset 4: Object & Array Access
88
+
89
+ **Supported Features:**
90
+
91
+ - Member access with dot notation: `object.property`
92
+ - Nested member access: `user.profile.age`
93
+ - Array/tuple access with brackets: `items[0]`
94
+ - Dynamic index access: `entries[index]`
95
+ - Nested access combinations: `users[i].name`
96
+
97
+ **Example Expressions:**
98
+
99
+ ```javascript
100
+ customer.name;
101
+ order.items[i].price;
102
+ settings.features.enabled;
103
+ data[offset + 2];
104
+ ```
105
+
106
+ **Implementation Status:** Implemented in Phase 3
107
+
108
+ ---
109
+
110
+ ## Subset 5: Built-in Functions
111
+
112
+ **Supported Features:**
113
+
114
+ - Function call syntax: `functionName(arg1, arg2)`
115
+ - Standard library functions (to be implemented in Phase 5):
116
+ - Mathematical: `abs()`, `min()`, `max()`, `round()`, `floor()`, `ceil()`
117
+ - String: `length()`, `substring()`, `toUpperCase()`, `toLowerCase()`, `trim()`
118
+ - Array: `size()`, `includes()`, `indexOf()`
119
+ - Type conversion: `string()`, `number()`, `bool()`
120
+
121
+ **Example Expressions:**
122
+
123
+ ```javascript
124
+ min(score, 0);
125
+ max(a, b, c);
126
+ substring(name, 0, 3);
127
+ length(items);
128
+ string(age);
129
+ ```
130
+
131
+ **Implementation Status:** Parser implemented, function evaluation runtime in Phase 5
132
+
133
+ ---
134
+
135
+ ## Subset 6: Membership & Range Operators
136
+
137
+ **Supported Features:**
138
+
139
+ - Membership operator: `value in array`
140
+ - Negated membership: `value not in array`
141
+ - Interval notation: `[1..10]`, `(5..15)`, `[1..10)`, `(5..10]`
142
+ - Open/closed interval semantics:
143
+ - `[` inclusive start, `(` exclusive start
144
+ - `]` inclusive end, `)` exclusive end
145
+
146
+ **Example Expressions:**
147
+
148
+ ```javascript
149
+ status in ["active", "pending", "review"]
150
+ score not in [0, 59]
151
+ age in [18..120] // inclusive: 18 <= age <= 120
152
+ level in (0..100] // exclusive start, inclusive end: 0 < level <= 100
153
+ ```
154
+
155
+ **Implementation Status:** Implemented in Phase 3
156
+
157
+ ---
158
+
159
+ ## Subset 7: Ternary & Advanced
160
+
161
+ **Supported Features:**
162
+
163
+ - Ternary operator: `condition ? trueValue : falseValue`
164
+ - Special references:
165
+ - `$` - Dollar reference (current value in unary mode)
166
+ - `#` - Hash reference (current element in higher-order functions)
167
+
168
+ **Example Expressions:**
169
+
170
+ ```javascript
171
+ age >= 18 ? "adult" : "minor"
172
+ score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : "F"
173
+ items.filter(# > 5) // # refers to each item
174
+ map(items, # * 2) // # refers to each item
175
+ ```
176
+
177
+ **Implementation Status:** Implemented in Phase 3
178
+
179
+ ---
180
+
181
+ ## Unary Mode Syntax
182
+
183
+ Unary mode is used in decision table cells and has special syntax transformations:
184
+
185
+ | Unary Expression | Transformed To |
186
+ | ---------------- | ---------------------------------- |
187
+ | `"admin"` | `$ == "admin"` |
188
+ | `> 100` | `$ > 100` |
189
+ | `[1..10]` | `$ in [1..10]` |
190
+ | `"a", "b", "c"` | `$ == "a" or $ == "b" or $ == "c"` |
191
+ | `$ > 100` | `$ > 100` (unchanged) |
192
+ | `` (empty) | `true` |
193
+
194
+ Empty cells or `-` match everything (always return `true`).
195
+
196
+ **Implementation Status:** Implemented in Phase 3
197
+
198
+ ---
199
+
200
+ ## Priority of Operators (Lowest to Highest)
201
+
202
+ 7. Ternary (`? :`)
203
+ 8. Logical OR (`or`)
204
+ 9. Logical AND (`and`)
205
+ 10. Comparison (`==`, `!=`, `<`, `>`, `<=`, `>=`, `in`, `not in`)
206
+ 11. Additive (`+`, `-`)
207
+ 12. Multiplicative (`*`, `/`, `%`)
208
+ 13. Power (`^`) - right-associative
209
+ 14. Unary (`not`, `-`)
210
+ -1. Postfix (`.property`, `[index]`, `(call)`)
211
+
212
+ ## Phase 3 Implementation Coverage
213
+
214
+ Phase 3 implements:
215
+
216
+ - ✅ Subset 1: Basic Arithmetic & Comparisons
217
+ - ✅ Subset 2: Logical Operators
218
+ - ✅ Subset 3: String Operations (template literals)
219
+ - ✅ Subset 4: Object & Array Access
220
+ - ✅ Subset 5: Built-in Functions (parsing only)
221
+ - ✅ Subset 6: Membership & Range Operators
222
+ - ✅ Subset 7: Ternary & Advanced
223
+ - ✅ Unary Mode syntax transformations
224
+
225
+ Future phases will add:
226
+
227
+ - Phase 5: Built-in function evaluation runtime
228
+ - Phase 7: Full code generation for AssemblyScript