@divmain/jdm-asm 0.2.0 → 0.2.3

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 (395) hide show
  1. package/dist/index.js +2227 -29
  2. package/dist/index.js.map +1 -1
  3. package/package.json +8 -2
  4. package/.github/workflows/ci.yml +0 -53
  5. package/.oxfmtrc.json +0 -16
  6. package/.oxlintrc.json +0 -183
  7. package/AGENTS.md +0 -81
  8. package/asconfig.json +0 -23
  9. package/benchmarks/fixtures.ts +0 -111
  10. package/benchmarks/input-fixtures.ts +0 -80
  11. package/benchmarks/run.ts +0 -913
  12. package/benchmarks/worker-pool.ts +0 -223
  13. package/benchmarks/worker.ts +0 -374
  14. package/scripts/run-all-tests.ts +0 -220
  15. package/src/compiler/EXPRESSION_SUBSETS.md +0 -228
  16. package/src/compiler/asc-compiler.ts +0 -315
  17. package/src/compiler/ast-types.ts +0 -215
  18. package/src/compiler/build.ts +0 -56
  19. package/src/compiler/cache.ts +0 -414
  20. package/src/compiler/code-generators.ts +0 -211
  21. package/src/compiler/codegen/index.ts +0 -15
  22. package/src/compiler/codegen/js-marshal.ts +0 -999
  23. package/src/compiler/codegen/js-validation.ts +0 -243
  24. package/src/compiler/codegen.ts +0 -19
  25. package/src/compiler/compile-time-validation.ts +0 -507
  26. package/src/compiler/cst-visitor.ts +0 -434
  27. package/src/compiler/errors.ts +0 -227
  28. package/src/compiler/expression-parser.ts +0 -536
  29. package/src/compiler/graph.ts +0 -197
  30. package/src/compiler/index.ts +0 -199
  31. package/src/compiler/input-validation.ts +0 -33
  32. package/src/compiler/marshal-gen.ts +0 -21
  33. package/src/compiler/nodes/context-resolvers.ts +0 -197
  34. package/src/compiler/nodes/decision-table.ts +0 -507
  35. package/src/compiler/nodes/decision.ts +0 -292
  36. package/src/compiler/nodes/expression-compiler.ts +0 -526
  37. package/src/compiler/nodes/expression.ts +0 -425
  38. package/src/compiler/nodes/function.ts +0 -316
  39. package/src/compiler/nodes/input.ts +0 -60
  40. package/src/compiler/nodes/switch.ts +0 -547
  41. package/src/compiler/optimizer.ts +0 -948
  42. package/src/compiler/orchestrator.ts +0 -352
  43. package/src/compiler/parser.ts +0 -115
  44. package/src/compiler/result-selection.ts +0 -161
  45. package/src/compiler/runtime/index.ts +0 -26
  46. package/src/compiler/runtime-codegen.ts +0 -211
  47. package/src/compiler/runtime-validation-codegen.ts +0 -294
  48. package/src/compiler/runtime.ts +0 -452
  49. package/src/compiler/schema.ts +0 -245
  50. package/src/compiler/switch-branch-detection.ts +0 -92
  51. package/src/compiler/types.ts +0 -136
  52. package/src/compiler/unary-ast-transforms.ts +0 -148
  53. package/src/compiler/unary-parser.ts +0 -301
  54. package/src/compiler/unary-transform.ts +0 -161
  55. package/src/compiler/utils.ts +0 -27
  56. package/src/compiler/virtual-fs.ts +0 -90
  57. package/src/compiler/wasm-instantiate.ts +0 -127
  58. package/src/index.ts +0 -1
  59. package/src/runtime/arrays.ts +0 -579
  60. package/src/runtime/context.ts +0 -189
  61. package/src/runtime/expressions.ts +0 -1811
  62. package/src/runtime/index.ts +0 -8
  63. package/src/runtime/memory.ts +0 -607
  64. package/src/runtime/strings.ts +0 -260
  65. package/src/runtime/tables.ts +0 -96
  66. package/src/runtime/tsconfig.json +0 -4
  67. package/src/runtime/values.ts +0 -209
  68. package/test-data/README.md +0 -83
  69. package/test-data/decision-tables/basic/8k.json +0 -87992
  70. package/test-data/decision-tables/basic/affiliate-commission-calculator.json +0 -228
  71. package/test-data/decision-tables/basic/airline-loyalty-points-calculations.json +0 -285
  72. package/test-data/decision-tables/basic/airline-upgrade-eligibility.json +0 -466
  73. package/test-data/decision-tables/basic/auto-insurance-premium-calculator.json +0 -412
  74. package/test-data/decision-tables/basic/booking-personalization-system.json +0 -553
  75. package/test-data/decision-tables/basic/care-team-assignment-system.json +0 -585
  76. package/test-data/decision-tables/basic/claim-validation-system.json +0 -307
  77. package/test-data/decision-tables/basic/clinical-lab-result-interpreter.json +0 -433
  78. package/test-data/decision-tables/basic/clinical-treatment-protocol.json +0 -474
  79. package/test-data/decision-tables/basic/credit-limit-adjustment.json +0 -479
  80. package/test-data/decision-tables/basic/customer-eligibility-engine.json +0 -551
  81. package/test-data/decision-tables/basic/customer-lifetime-value.json +0 -200
  82. package/test-data/decision-tables/basic/customer-onboarding-kyc-verification.json +0 -611
  83. package/test-data/decision-tables/basic/customer-service-escalation.json +0 -191
  84. package/test-data/decision-tables/basic/decision-table-discounts.json +0 -168
  85. package/test-data/decision-tables/basic/decision-table-shipping.json +0 -398
  86. package/test-data/decision-tables/basic/delivery-route-optimizer.json +0 -271
  87. package/test-data/decision-tables/basic/device-compatibility-checker.json +0 -303
  88. package/test-data/decision-tables/basic/disaster-relief-fund-allocation.json +0 -296
  89. package/test-data/decision-tables/basic/dynamic-fx-rate-pricing-system.json +0 -237
  90. package/test-data/decision-tables/basic/dynamic-marketplace-comission-calculator.json +0 -242
  91. package/test-data/decision-tables/basic/dynamic-shipping-cost-calculator.json +0 -378
  92. package/test-data/decision-tables/basic/dynamic-tarrif-engine.json +0 -289
  93. package/test-data/decision-tables/basic/dynamic-ticket-pricing.json +0 -325
  94. package/test-data/decision-tables/basic/empty-column-with-space.json +0 -100
  95. package/test-data/decision-tables/basic/empty-column-without-space.json +0 -100
  96. package/test-data/decision-tables/basic/environment-compliance-assessment.json +0 -386
  97. package/test-data/decision-tables/basic/expression-table-map.json +0 -313
  98. package/test-data/decision-tables/basic/flash-sale-eligibility.json +0 -366
  99. package/test-data/decision-tables/basic/flight-dispatch-decision-system.json +0 -455
  100. package/test-data/decision-tables/basic/flight-rebooking-fee-calculator.json +0 -406
  101. package/test-data/decision-tables/basic/government-assistance.json +0 -299
  102. package/test-data/decision-tables/basic/grant-funding-distribution.json +0 -307
  103. package/test-data/decision-tables/basic/hazardous-materials-management-system.json +0 -414
  104. package/test-data/decision-tables/basic/immigration-eligibility-evaluator.json +0 -765
  105. package/test-data/decision-tables/basic/import-duties-calculator.json +0 -318
  106. package/test-data/decision-tables/basic/insurance-agent-commission.json +0 -228
  107. package/test-data/decision-tables/basic/insurance-coverage-calculator.json +0 -362
  108. package/test-data/decision-tables/basic/insurance-underwriting-risk.json +0 -321
  109. package/test-data/decision-tables/basic/international-roaming-policy-manager.json +0 -199
  110. package/test-data/decision-tables/basic/legacy-plan-management.json +0 -434
  111. package/test-data/decision-tables/basic/marketplace-listing-verification-system.json +0 -334
  112. package/test-data/decision-tables/basic/medication-dosage-calculator.json +0 -318
  113. package/test-data/decision-tables/basic/merch-bags.json +0 -171
  114. package/test-data/decision-tables/basic/municipal-permit-evaluation-system.json +0 -364
  115. package/test-data/decision-tables/basic/mvno-partner-enablement.json +0 -313
  116. package/test-data/decision-tables/basic/partner-revenue-sharing.json +0 -244
  117. package/test-data/decision-tables/basic/payment-routing-and-fee-calculator.json +0 -475
  118. package/test-data/decision-tables/basic/policy-discount-calculator.json +0 -307
  119. package/test-data/decision-tables/basic/policy-eligibility-analyzer.json +0 -299
  120. package/test-data/decision-tables/basic/product-listing-scoring.json +0 -358
  121. package/test-data/decision-tables/basic/realtime-fraud-detection.json +0 -235
  122. package/test-data/decision-tables/basic/regional-compliance-manager.json +0 -278
  123. package/test-data/decision-tables/basic/returns-and-refund-policy.json +0 -366
  124. package/test-data/decision-tables/basic/returns-processing-system.json +0 -448
  125. package/test-data/decision-tables/basic/school-district-resource-allocation.json +0 -282
  126. package/test-data/decision-tables/basic/seat-map-optimization.json +0 -325
  127. package/test-data/decision-tables/basic/seller-fee-calculator.json +0 -307
  128. package/test-data/decision-tables/basic/service-level-agreement-enforcement.json +0 -575
  129. package/test-data/decision-tables/basic/smart-financial-product-matcher.json +0 -249
  130. package/test-data/decision-tables/basic/supply-chain-risk.json +0 -316
  131. package/test-data/decision-tables/basic/table-loop.json +0 -93
  132. package/test-data/decision-tables/basic/table.json +0 -76
  133. package/test-data/decision-tables/basic/traffic-violation-penalty-calculator.json +0 -436
  134. package/test-data/decision-tables/basic/transaction-compliance-classifier.json +0 -525
  135. package/test-data/decision-tables/basic/vehicle-claims-resolution.json +0 -310
  136. package/test-data/decision-tables/basic/warehouse-storage-location.json +0 -345
  137. package/test-data/decision-tables/hit-policy-collect/collect-multiple-matches.json +0 -127
  138. package/test-data/decision-tables/hit-policy-collect/collect-no-match.json +0 -95
  139. package/test-data/decision-tables/hit-policy-first/first-match.json +0 -103
  140. package/test-data/decision-tables/hit-policy-first/no-match.json +0 -95
  141. package/test-data/decision-tables/hit-policy-output-order/output-order-respected.json +0 -94
  142. package/test-data/decision-tables/hit-policy-output-order/string-output-order.json +0 -94
  143. package/test-data/decision-tables/hit-policy-priority/priority-respected.json +0 -86
  144. package/test-data/decision-tables/hit-policy-rule-order/rule-order-respected.json +0 -94
  145. package/test-data/decision-tables/hit-policy-unique/all-match-error.json +0 -89
  146. package/test-data/decision-tables/hit-policy-unique/multiple-match-error.json +0 -89
  147. package/test-data/decision-tables/hit-policy-unique/no-match.json +0 -88
  148. package/test-data/decision-tables/hit-policy-unique/unique-match.json +0 -99
  149. package/test-data/expressions/arithmetic/error-cyclic.json +0 -114
  150. package/test-data/expressions/arithmetic/error-missing-input.json +0 -54
  151. package/test-data/expressions/arithmetic/error-missing-output.json +0 -54
  152. package/test-data/expressions/arithmetic/expression-default.json +0 -93
  153. package/test-data/expressions/arithmetic/expression-fields.json +0 -94
  154. package/test-data/expressions/arithmetic/expression-loop.json +0 -94
  155. package/test-data/expressions/arithmetic/expression-passthrough.json +0 -108
  156. package/test-data/expressions/arithmetic/expression.json +0 -69
  157. package/test-data/expressions/arithmetic/nested-request.json +0 -125
  158. package/test-data/expressions/arithmetic/number-function.json +0 -58
  159. package/test-data/expressions/arithmetic/test-number-functions.json +0 -68
  160. package/test-data/expressions/functions/all.json +0 -149
  161. package/test-data/expressions/functions/avg.json +0 -89
  162. package/test-data/expressions/functions/filter.json +0 -109
  163. package/test-data/expressions/functions/flat.json +0 -167
  164. package/test-data/expressions/functions/map-strings.json +0 -65
  165. package/test-data/expressions/functions/map.json +0 -73
  166. package/test-data/expressions/functions/reduce.json +0 -49
  167. package/test-data/expressions/functions/some.json +0 -175
  168. package/test-data/expressions/functions/sort-strings.json +0 -97
  169. package/test-data/expressions/functions/sort.json +0 -97
  170. package/test-data/expressions/logical/logical-and.json +0 -116
  171. package/test-data/expressions/logical/logical-complex.json +0 -260
  172. package/test-data/expressions/logical/logical-not.json +0 -111
  173. package/test-data/expressions/logical/logical-or.json +0 -123
  174. package/test-data/expressions/string/string-comparison.json +0 -128
  175. package/test-data/expressions/string/string-concat.json +0 -106
  176. package/test-data/expressions/string/string-contains.json +0 -125
  177. package/test-data/expressions/string/string-endsWith.json +0 -113
  178. package/test-data/expressions/string/string-indexOf.json +0 -131
  179. package/test-data/expressions/string/string-join.json +0 -92
  180. package/test-data/expressions/string/string-lower.json +0 -94
  181. package/test-data/expressions/string/string-replace.json +0 -130
  182. package/test-data/expressions/string/string-split.json +0 -101
  183. package/test-data/expressions/string/string-startsWith.json +0 -113
  184. package/test-data/expressions/string/string-substring.json +0 -138
  185. package/test-data/expressions/string/string-trim.json +0 -100
  186. package/test-data/expressions/string/string-upper.json +0 -94
  187. package/test-data/other/custom.json +0 -51
  188. package/test-data/other/customer-input-schema.json +0 -34
  189. package/test-data/other/customer-output-schema.json +0 -34
  190. package/test-data/other/passthrough.json +0 -31
  191. package/test-data/sub-decisions/basic/$nodes-child.json +0 -31
  192. package/test-data/sub-decisions/basic/$nodes-parent.json +0 -49
  193. package/test-data/sub-decisions/basic/recursive-table1.json +0 -49
  194. package/test-data/sub-decisions/basic/recursive-table2.json +0 -49
  195. package/test-data/sub-decisions/complex-multi/approval-decision.json +0 -31
  196. package/test-data/sub-decisions/complex-multi/complex-dag.json +0 -175
  197. package/test-data/sub-decisions/complex-multi/credit-check.json +0 -31
  198. package/test-data/sub-decisions/complex-multi/customer-segmentation.json +0 -31
  199. package/test-data/sub-decisions/complex-multi/discount-eligibility.json +0 -31
  200. package/test-data/sub-decisions/complex-multi/eligibility-check.json +0 -31
  201. package/test-data/sub-decisions/complex-multi/final-offer.json +0 -31
  202. package/test-data/sub-decisions/complex-multi/income-verification.json +0 -31
  203. package/test-data/sub-decisions/complex-multi/linear-chain.json +0 -121
  204. package/test-data/sub-decisions/complex-multi/pricing-calculation.json +0 -31
  205. package/test-data/sub-decisions/complex-multi/product-eligibility.json +0 -31
  206. package/test-data/sub-decisions/complex-multi/risk-assessment.json +0 -31
  207. package/test-data/sub-decisions/complex-multi/shared-validation.json +0 -31
  208. package/test-data/sub-decisions/complex-multi/validation.json +0 -31
  209. package/test-data/sub-decisions/diamond/decision-a.json +0 -31
  210. package/test-data/sub-decisions/diamond/decision-b.json +0 -31
  211. package/test-data/sub-decisions/diamond/decision-c.json +0 -31
  212. package/test-data/sub-decisions/diamond/decision-shared.json +0 -31
  213. package/test-data/sub-decisions/diamond/diamond-pattern.json +0 -109
  214. package/test-data/sub-decisions/error-propagation/parent-calls-error.json +0 -44
  215. package/test-data/sub-decisions/error-propagation/sub-decision-with-error.json +0 -60
  216. package/test-data/switch-nodes/basic/account-dormancy-management.json +0 -245
  217. package/test-data/switch-nodes/basic/application-risk-assessment.json +0 -474
  218. package/test-data/switch-nodes/basic/cellular-data-rollover-system.json +0 -281
  219. package/test-data/switch-nodes/basic/clinical-pathway-selection.json +0 -454
  220. package/test-data/switch-nodes/basic/insurance-prior-authorization.json +0 -467
  221. package/test-data/switch-nodes/basic/last-mile-delivery-assignment.json +0 -373
  222. package/test-data/switch-nodes/basic/loan-approval.json +0 -469
  223. package/test-data/switch-nodes/basic/multi-switch.json +0 -498
  224. package/test-data/switch-nodes/basic/online-checkin-eligibility.json +0 -285
  225. package/test-data/switch-nodes/basic/order-consolidation-system.json +0 -493
  226. package/test-data/switch-nodes/basic/seller-approval-workflow.json +0 -383
  227. package/test-data/switch-nodes/basic/set-fee.json +0 -243
  228. package/test-data/switch-nodes/basic/shipping-carrier-selector.json +0 -379
  229. package/test-data/switch-nodes/basic/switch-node.json +0 -167
  230. package/test-data/switch-nodes/basic/switch-performance-2.json +0 -1307
  231. package/test-data/switch-nodes/basic/switch-performance.json +0 -691
  232. package/test-data/switch-nodes/basic/tax-exemption.json +0 -295
  233. package/test-data/switch-nodes/basic/warehouse-cross-docking.json +0 -313
  234. package/test-data/switch-nodes/default-cases/switch-with-default.json +0 -134
  235. package/test-data/zen-reference/$nodes-child.json +0 -69
  236. package/test-data/zen-reference/$nodes-parent.json +0 -34
  237. package/test-data/zen-reference/8k.json +0 -87992
  238. package/test-data/zen-reference/credit-analysis.json +0 -324
  239. package/test-data/zen-reference/custom.json +0 -51
  240. package/test-data/zen-reference/customer-input-schema.json +0 -34
  241. package/test-data/zen-reference/customer-output-schema.json +0 -34
  242. package/test-data/zen-reference/error-cyclic.json +0 -114
  243. package/test-data/zen-reference/error-missing-input.json +0 -54
  244. package/test-data/zen-reference/error-missing-output.json +0 -54
  245. package/test-data/zen-reference/expression.json +0 -69
  246. package/test-data/zen-reference/function-v2.json +0 -48
  247. package/test-data/zen-reference/function.json +0 -46
  248. package/test-data/zen-reference/graphs/account-dormancy-management.json +0 -245
  249. package/test-data/zen-reference/graphs/affiliate-commission-calculator.json +0 -228
  250. package/test-data/zen-reference/graphs/airline-loyalty-points-calculations.json +0 -285
  251. package/test-data/zen-reference/graphs/airline-upgrade-eligibility.json +0 -466
  252. package/test-data/zen-reference/graphs/aml.json +0 -537
  253. package/test-data/zen-reference/graphs/application-risk-assessment.json +0 -474
  254. package/test-data/zen-reference/graphs/auto-insurance-premium-calculator.json +0 -412
  255. package/test-data/zen-reference/graphs/booking-personalization-system.json +0 -553
  256. package/test-data/zen-reference/graphs/care-team-assignment-system.json +0 -585
  257. package/test-data/zen-reference/graphs/cellular-data-rollover-system.json +0 -281
  258. package/test-data/zen-reference/graphs/claim-validation-system.json +0 -307
  259. package/test-data/zen-reference/graphs/clinical-lab-result-interpreter.json +0 -433
  260. package/test-data/zen-reference/graphs/clinical-pathway-selection.json +0 -454
  261. package/test-data/zen-reference/graphs/clinical-treatment-protocol.json +0 -474
  262. package/test-data/zen-reference/graphs/company-analysis.json +0 -390
  263. package/test-data/zen-reference/graphs/credit-limit-adjustment.json +0 -479
  264. package/test-data/zen-reference/graphs/customer-eligibility-engine.json +0 -551
  265. package/test-data/zen-reference/graphs/customer-lifetime-value.json +0 -200
  266. package/test-data/zen-reference/graphs/customer-onboarding-kyc-verification.json +0 -611
  267. package/test-data/zen-reference/graphs/customer-service-escalation.json +0 -191
  268. package/test-data/zen-reference/graphs/decision-table-discounts.json +0 -168
  269. package/test-data/zen-reference/graphs/decision-table-shipping.json +0 -398
  270. package/test-data/zen-reference/graphs/delivery-route-optimizer.json +0 -271
  271. package/test-data/zen-reference/graphs/device-compatibility-checker.json +0 -303
  272. package/test-data/zen-reference/graphs/disaster-relief-fund-allocation.json +0 -296
  273. package/test-data/zen-reference/graphs/dynamic-fx-rate-pricing-system.json +0 -237
  274. package/test-data/zen-reference/graphs/dynamic-marketplace-comission-calculator.json +0 -242
  275. package/test-data/zen-reference/graphs/dynamic-shipping-cost-calculator.json +0 -378
  276. package/test-data/zen-reference/graphs/dynamic-tarrif-engine.json +0 -289
  277. package/test-data/zen-reference/graphs/dynamic-ticket-pricing.json +0 -325
  278. package/test-data/zen-reference/graphs/empty-column-with-space.json +0 -100
  279. package/test-data/zen-reference/graphs/empty-column-without-space.json +0 -100
  280. package/test-data/zen-reference/graphs/environment-compliance-assessment.json +0 -386
  281. package/test-data/zen-reference/graphs/expression-default.json +0 -93
  282. package/test-data/zen-reference/graphs/expression-fields.json +0 -94
  283. package/test-data/zen-reference/graphs/expression-loop.json +0 -94
  284. package/test-data/zen-reference/graphs/expression-passthrough.json +0 -108
  285. package/test-data/zen-reference/graphs/expression-table-map.json +0 -313
  286. package/test-data/zen-reference/graphs/flash-sale-eligibility.json +0 -366
  287. package/test-data/zen-reference/graphs/flight-dispatch-decision-system.json +0 -455
  288. package/test-data/zen-reference/graphs/flight-rebooking-fee-calculator.json +0 -406
  289. package/test-data/zen-reference/graphs/government-assistance.json +0 -299
  290. package/test-data/zen-reference/graphs/grant-funding-distribution.json +0 -307
  291. package/test-data/zen-reference/graphs/hazardous-materials-management-system.json +0 -414
  292. package/test-data/zen-reference/graphs/immigration-eligibility-evaluator.json +0 -765
  293. package/test-data/zen-reference/graphs/import-duties-calculator.json +0 -318
  294. package/test-data/zen-reference/graphs/insurance-agent-commission.json +0 -228
  295. package/test-data/zen-reference/graphs/insurance-breakdown.json +0 -421
  296. package/test-data/zen-reference/graphs/insurance-coverage-calculator.json +0 -362
  297. package/test-data/zen-reference/graphs/insurance-prior-authorization.json +0 -467
  298. package/test-data/zen-reference/graphs/insurance-underwriting-risk.json +0 -321
  299. package/test-data/zen-reference/graphs/international-roaming-policy-manager.json +0 -199
  300. package/test-data/zen-reference/graphs/last-mile-delivery-assignment.json +0 -373
  301. package/test-data/zen-reference/graphs/legacy-plan-management.json +0 -434
  302. package/test-data/zen-reference/graphs/loan-approval.json +0 -469
  303. package/test-data/zen-reference/graphs/marketplace-listing-verification-system.json +0 -334
  304. package/test-data/zen-reference/graphs/medication-dosage-calculator.json +0 -318
  305. package/test-data/zen-reference/graphs/merch-bags.json +0 -171
  306. package/test-data/zen-reference/graphs/multi-switch.json +0 -498
  307. package/test-data/zen-reference/graphs/municipal-permit-evaluation-system.json +0 -364
  308. package/test-data/zen-reference/graphs/mvno-partner-enablement.json +0 -313
  309. package/test-data/zen-reference/graphs/nested-request.json +0 -125
  310. package/test-data/zen-reference/graphs/online-checkin-eligibility.json +0 -285
  311. package/test-data/zen-reference/graphs/order-consolidation-system.json +0 -493
  312. package/test-data/zen-reference/graphs/partner-revenue-sharing.json +0 -244
  313. package/test-data/zen-reference/graphs/payment-routing-and-fee-calculator.json +0 -475
  314. package/test-data/zen-reference/graphs/policy-discount-calculator.json +0 -307
  315. package/test-data/zen-reference/graphs/policy-eligibility-analyzer.json +0 -299
  316. package/test-data/zen-reference/graphs/product-listing-scoring.json +0 -358
  317. package/test-data/zen-reference/graphs/realtime-fraud-detection.json +0 -235
  318. package/test-data/zen-reference/graphs/regional-compliance-manager.json +0 -278
  319. package/test-data/zen-reference/graphs/returns-and-refund-policy.json +0 -366
  320. package/test-data/zen-reference/graphs/returns-processing-system.json +0 -448
  321. package/test-data/zen-reference/graphs/school-district-resource-allocation.json +0 -282
  322. package/test-data/zen-reference/graphs/seat-map-optimization.json +0 -325
  323. package/test-data/zen-reference/graphs/seller-approval-workflow.json +0 -383
  324. package/test-data/zen-reference/graphs/seller-fee-calculator.json +0 -307
  325. package/test-data/zen-reference/graphs/service-level-agreement-enforcement.json +0 -575
  326. package/test-data/zen-reference/graphs/set-fee.json +0 -243
  327. package/test-data/zen-reference/graphs/shipping-carrier-selector.json +0 -379
  328. package/test-data/zen-reference/graphs/smart-financial-product-matcher.json +0 -249
  329. package/test-data/zen-reference/graphs/supply-chain-risk.json +0 -316
  330. package/test-data/zen-reference/graphs/table-loop.json +0 -93
  331. package/test-data/zen-reference/graphs/tax-exemption.json +0 -295
  332. package/test-data/zen-reference/graphs/traffic-violation-penalty-calculator.json +0 -436
  333. package/test-data/zen-reference/graphs/transaction-compliance-classifier.json +0 -525
  334. package/test-data/zen-reference/graphs/vehicle-claims-resolution.json +0 -310
  335. package/test-data/zen-reference/graphs/warehouse-cross-docking.json +0 -313
  336. package/test-data/zen-reference/graphs/warehouse-storage-location.json +0 -345
  337. package/test-data/zen-reference/http-function.json +0 -34
  338. package/test-data/zen-reference/infinite-function.json +0 -46
  339. package/test-data/zen-reference/js/imports.js +0 -25
  340. package/test-data/zen-reference/passthrough.json +0 -31
  341. package/test-data/zen-reference/recursive-table1.json +0 -49
  342. package/test-data/zen-reference/recursive-table2.json +0 -49
  343. package/test-data/zen-reference/sleep-function.json +0 -34
  344. package/test-data/zen-reference/switch-node.json +0 -167
  345. package/test-data/zen-reference/switch-performance-2.json +0 -1307
  346. package/test-data/zen-reference/switch-performance.json +0 -691
  347. package/test-data/zen-reference/table.json +0 -76
  348. package/tests/helpers/index.ts +0 -73
  349. package/tests/helpers/mock-context.ts +0 -231
  350. package/tests/helpers/round-trip.ts +0 -398
  351. package/tests/helpers/test-harness-comparison.ts +0 -325
  352. package/tests/helpers/test-harness-wasm.ts +0 -710
  353. package/tests/helpers/test-harness.ts +0 -28
  354. package/tests/helpers/wasm-test.ts +0 -659
  355. package/tests/integration/compilation-errors.test.ts +0 -864
  356. package/tests/integration/decision-tables.test.ts +0 -531
  357. package/tests/integration/edge-cases.test.ts +0 -787
  358. package/tests/integration/expressions.test.ts +0 -513
  359. package/tests/integration/function-node-integration.test.ts +0 -182
  360. package/tests/integration/sub-decisions.test.ts +0 -108
  361. package/tests/integration/switch-nodes.test.ts +0 -399
  362. package/tests/integration/unary-or-matching.test.ts +0 -53
  363. package/tests/integration/wasm-data-types.test.ts +0 -398
  364. package/tests/integration/wasm-errors.test.ts +0 -199
  365. package/tests/integration/wasm-execution.test.ts +0 -348
  366. package/tests/integration/wasm-memory.test.ts +0 -228
  367. package/tests/scripts/analyze-coverage.ts +0 -166
  368. package/tests/scripts/categorize-tests.ts +0 -396
  369. package/tests/scripts/coverage-analysis.ts +0 -836
  370. package/tests/unit/compiler/cache.test.ts +0 -238
  371. package/tests/unit/compiler/errors.test.ts +0 -316
  372. package/tests/unit/compiler/graph-scalability.test.ts +0 -510
  373. package/tests/unit/compiler/graph.test.ts +0 -878
  374. package/tests/unit/compiler/input-validation.test.ts +0 -447
  375. package/tests/unit/compiler/logical-and-parser.test.ts +0 -143
  376. package/tests/unit/compiler/logical-not-parser.test.ts +0 -107
  377. package/tests/unit/compiler/logical-or-parser.test.ts +0 -236
  378. package/tests/unit/compiler/marshal-gen/marshal-gen.test.ts +0 -97
  379. package/tests/unit/compiler/nodes/decision-table.test.ts +0 -103
  380. package/tests/unit/compiler/nodes/decision.test.ts +0 -182
  381. package/tests/unit/compiler/nodes/function-compile.test.ts +0 -204
  382. package/tests/unit/compiler/nodes/function.test.ts +0 -176
  383. package/tests/unit/compiler/nodes/input.test.ts +0 -30
  384. package/tests/unit/compiler/nodes/switch.test.ts +0 -127
  385. package/tests/unit/compiler/optimizer-cache.test.ts +0 -327
  386. package/tests/unit/compiler/optimizer-implementation.test.ts +0 -625
  387. package/tests/unit/compiler/parser.test.ts +0 -508
  388. package/tests/unit/compiler/runtime-error-cleanup.test.ts +0 -426
  389. package/tests/unit/compiler/runtime-validation.test.ts +0 -303
  390. package/tests/unit/compiler/runtime.test.ts +0 -221
  391. package/tests/unit/compiler/schema/schema.test.ts +0 -248
  392. package/tests/unit/compiler/unary-ast-transforms.test.ts +0 -245
  393. package/tsconfig.json +0 -27
  394. package/tsup.config.ts +0 -11
  395. package/vitest.config.ts +0 -12
@@ -1,414 +0,0 @@
1
- /**
2
- * Caches compiled WASM modules keyed by source code + runtime + compiler options.
3
- * WASM compilation via AssemblyScript is expensive (~250ms per decision), so caching
4
- * identical compilations significantly improves the speed of iterative development
5
- * and testing.
6
- */
7
-
8
- import { createHash } from 'crypto';
9
- import {
10
- existsSync,
11
- mkdirSync,
12
- readFileSync,
13
- writeFileSync,
14
- readdirSync,
15
- statSync,
16
- unlinkSync,
17
- } from 'fs';
18
- import { join, dirname } from 'path';
19
-
20
- // Import runtime source strings to include in cache key
21
- import {
22
- RUNTIME_VALUES,
23
- RUNTIME_CONTEXT,
24
- RUNTIME_EXPRESSIONS,
25
- RUNTIME_TABLES,
26
- RUNTIME_MEMORY,
27
- RUNTIME_STRINGS,
28
- RUNTIME_ARRAYS,
29
- } from './runtime/index';
30
-
31
- // Package version - included in cache key to invalidate cache across compiler versions
32
- let packageVersion: string = '';
33
-
34
- function getPackageVersion(): string {
35
- if (packageVersion === '') {
36
- try {
37
- // Try to find package.json from this file's location
38
- const packagePath = join(dirname(__dirname), '..', 'package.json');
39
- const pkg = JSON.parse(readFileSync(packagePath, 'utf-8'));
40
- packageVersion = pkg.version || 'unknown';
41
- } catch {
42
- packageVersion = 'unknown';
43
- }
44
- }
45
- return packageVersion;
46
- }
47
-
48
- /**
49
- * Cache directory location
50
- */
51
- function getCacheDir(): string {
52
- // Use node_modules/.cache/jdm-asm for caching
53
- // This is a common convention and gets cleaned up with node_modules
54
- const cacheDir = join(process.cwd(), 'node_modules', '.cache', 'jdm-asm');
55
- return cacheDir;
56
- }
57
-
58
- /**
59
- * Ensure the cache directory exists
60
- * @throws Error if directory creation fails
61
- */
62
- function ensureCacheDir(): string {
63
- const cacheDir = getCacheDir();
64
- if (!existsSync(cacheDir)) {
65
- try {
66
- mkdirSync(cacheDir, { recursive: true });
67
- } catch (error) {
68
- const errorMsg = error instanceof Error ? error.message : String(error);
69
- throw new Error(`Failed to create cache directory at ${cacheDir}: ${errorMsg}`);
70
- }
71
- }
72
- return cacheDir;
73
- }
74
-
75
- /**
76
- * Compute a stable hash for cache key.
77
- */
78
- export function computeCacheKey(
79
- assemblyScriptCode: string,
80
- options: { optimize?: boolean; debug?: boolean },
81
- ): string {
82
- const hash = createHash('sha256');
83
-
84
- // Include package version
85
- hash.update(`version:${getPackageVersion()}\n`);
86
-
87
- // Include compiler options
88
- hash.update(`optimize:${options.optimize ?? true}\n`);
89
- hash.update(`debug:${options.debug ?? false}\n`);
90
-
91
- // Include all runtime source files: runtime code changes affect WASM output, so
92
- // must be part of cache key
93
- hash.update('---RUNTIME_VALUES---\n');
94
- hash.update(RUNTIME_VALUES);
95
- hash.update('---RUNTIME_CONTEXT---\n');
96
- hash.update(RUNTIME_CONTEXT);
97
- hash.update('---RUNTIME_EXPRESSIONS---\n');
98
- hash.update(RUNTIME_EXPRESSIONS);
99
- hash.update('---RUNTIME_TABLES---\n');
100
- hash.update(RUNTIME_TABLES);
101
- hash.update('---RUNTIME_MEMORY---\n');
102
- hash.update(RUNTIME_MEMORY);
103
- hash.update('---RUNTIME_STRINGS---\n');
104
- hash.update(RUNTIME_STRINGS);
105
- hash.update('---RUNTIME_ARRAYS---\n');
106
- hash.update(RUNTIME_ARRAYS);
107
-
108
- // Include the generated AssemblyScript code
109
- hash.update('---ASSEMBLYSCRIPT---\n');
110
- hash.update(assemblyScriptCode);
111
-
112
- // Return first 32 characters of hex digest (128 bits - sufficient for cache key)
113
- return hash.digest('hex').slice(0, 32);
114
- }
115
-
116
- /**
117
- * Cache entry format
118
- */
119
- interface CacheEntry {
120
- version: string;
121
- timestamp: number;
122
- binary: string; // Base64 encoded WASM binary
123
- wat: string;
124
- }
125
-
126
- /**
127
- * Read cached WASM compilation result from disk if available
128
- */
129
- export function readCacheFromDisk(cacheKey: string): { binary: Uint8Array; wat: string } | null {
130
- const cacheDir = getCacheDir();
131
- const cachePath = join(cacheDir, `${cacheKey}.json`);
132
-
133
- if (!existsSync(cachePath)) {
134
- return null;
135
- }
136
-
137
- try {
138
- const content = readFileSync(cachePath, 'utf-8');
139
- const entry: CacheEntry = JSON.parse(content);
140
-
141
- // Version changes invalidate cache to prevent incompatible compiled code from being used
142
- // when the compiler implementation changes between releases
143
- if (entry.version !== getPackageVersion()) {
144
- // Version mismatch, invalidate
145
- unlinkSync(cachePath);
146
- return null;
147
- }
148
-
149
- // Decode binary from base64
150
- const binary = new Uint8Array(Buffer.from(entry.binary, 'base64'));
151
- return { binary, wat: entry.wat };
152
- } catch (error) {
153
- // Distinguish between different error types for better diagnostics
154
- if (error && typeof error === 'object' && 'code' in error) {
155
- const code = (error as { code: string }).code;
156
-
157
- // ENOENT (file not found) is benign - cache miss
158
- if (code === 'ENOENT') {
159
- return null;
160
- }
161
-
162
- // EACCES/EPERM (permission denied) should warn the user
163
- if (code === 'EACCES' || code === 'EPERM') {
164
- const errorMsg = error instanceof Error ? error.message : String(error);
165
- console.warn(
166
- `[jdm-asm] Warning: Cache file exists but cannot be read due to permissions: ${cachePath}\n${errorMsg}`,
167
- );
168
- return null;
169
- }
170
- }
171
-
172
- // Cache corruption or other errors are benign since we can regenerate the result.
173
- // Failing fast would hurt UX when cache is just a performance optimization, not critical.
174
- // Try to clean up corrupted cache file
175
- try {
176
- unlinkSync(cachePath);
177
- } catch (cleanupError) {
178
- // If we can't delete it, just warn (might be permission issue)
179
- if (cleanupError && typeof cleanupError === 'object' && 'code' in cleanupError) {
180
- const code = (cleanupError as { code: string }).code;
181
- if (code === 'EACCES' || code === 'EPERM') {
182
- console.warn(
183
- `[jdm-asm] Warning: Cannot clean up corrupted cache file (permission denied): ${cachePath}`,
184
- );
185
- }
186
- }
187
- }
188
- return null;
189
- }
190
- }
191
-
192
- /**
193
- * Write compilation result to disk cache
194
- * Failures are logged as warnings but do not throw since caching is optional
195
- */
196
- export function writeCacheToDisk(
197
- cacheKey: string,
198
- result: { binary: Uint8Array; wat: string },
199
- ): void {
200
- try {
201
- const cacheDir = ensureCacheDir();
202
- const cachePath = join(cacheDir, `${cacheKey}.json`);
203
-
204
- const entry: CacheEntry = {
205
- version: getPackageVersion(),
206
- timestamp: Date.now(),
207
- binary: Buffer.from(result.binary).toString('base64'),
208
- wat: result.wat,
209
- };
210
-
211
- writeFileSync(cachePath, JSON.stringify(entry));
212
- } catch (error) {
213
- // Cache write failures should not break compilation since caching is a performance
214
- // optimization, not a requirement. Warn the user so they know cache isn't working.
215
- const errorMsg = error instanceof Error ? error.message : String(error);
216
-
217
- // Provide more specific guidance for common errors
218
- if (error && typeof error === 'object' && 'code' in error) {
219
- const code = (error as { code: string }).code;
220
-
221
- if (code === 'ENOSPC') {
222
- console.warn(`[jdm-asm] Warning: Failed to write cache (disk full): ${errorMsg}`);
223
- } else if (code === 'EACCES' || code === 'EPERM' || code === 'EROFS') {
224
- console.warn(
225
- `[jdm-asm] Warning: Failed to write cache (permission denied or read-only filesystem): ${errorMsg}`,
226
- );
227
- } else {
228
- console.warn(`[jdm-asm] Warning: Failed to write cache: ${errorMsg}`);
229
- }
230
- } else {
231
- console.warn(`[jdm-asm] Warning: Failed to write cache: ${errorMsg}`);
232
- }
233
- }
234
- }
235
-
236
- /**
237
- * Get the cache directory path
238
- * Exposes where compiled WASM modules are stored on disk
239
- */
240
- export function getCacheDirectory(): string {
241
- return getCacheDir();
242
- }
243
-
244
- /**
245
- * Get cache health diagnostics
246
- * Returns information about cache status, any issues, and recent operations
247
- */
248
- export function getCacheHealth(): {
249
- enabled: boolean;
250
- directory: string;
251
- directoryExists: boolean;
252
- accessible: boolean;
253
- stats: {
254
- entries: number;
255
- totalSize: number;
256
- oldestEntry: number | null;
257
- newestEntry: number | null;
258
- };
259
- issues: string[];
260
- } {
261
- const enabled = isCacheEnabled();
262
- const directory = getCacheDir();
263
- const directoryExists = existsSync(directory);
264
- const issues: string[] = [];
265
-
266
- // Check if cache is disabled
267
- if (!enabled) {
268
- issues.push('Cache is disabled via JDM_ASM_NO_CACHE environment variable');
269
- }
270
-
271
- // Check if directory exists
272
- if (enabled && !directoryExists) {
273
- issues.push('Cache directory does not exist yet (will be created on first write)');
274
- }
275
-
276
- // Check if directory is accessible
277
- let accessible = false;
278
- if (directoryExists) {
279
- try {
280
- // Try to read the directory to check accessibility
281
- readdirSync(directory);
282
- accessible = true;
283
- } catch (error) {
284
- accessible = false;
285
- issues.push(
286
- `Cache directory exists but is not accessible: ${error instanceof Error ? error.message : String(error)}`,
287
- );
288
- }
289
- }
290
-
291
- // Get cache stats if accessible
292
- const stats = accessible
293
- ? getCacheStats()
294
- : {
295
- entries: 0,
296
- totalSize: 0,
297
- oldestEntry: null,
298
- newestEntry: null,
299
- };
300
-
301
- return {
302
- enabled,
303
- directory,
304
- directoryExists,
305
- accessible,
306
- stats,
307
- issues,
308
- };
309
- }
310
-
311
- /**
312
- * Clear the entire cache
313
- */
314
- export function clearCache(): void {
315
- const cacheDir = getCacheDir();
316
- if (!existsSync(cacheDir)) {
317
- return;
318
- }
319
-
320
- const files = readdirSync(cacheDir);
321
- for (const file of files) {
322
- if (file.endsWith('.json')) {
323
- try {
324
- unlinkSync(join(cacheDir, file));
325
- } catch {}
326
- }
327
- }
328
- }
329
-
330
- /**
331
- * Get cache statistics
332
- */
333
- export function getCacheStats(): {
334
- entries: number;
335
- totalSize: number;
336
- oldestEntry: number | null;
337
- newestEntry: number | null;
338
- } {
339
- const cacheDir = getCacheDir();
340
- if (!existsSync(cacheDir)) {
341
- return { entries: 0, totalSize: 0, oldestEntry: null, newestEntry: null };
342
- }
343
-
344
- const files = readdirSync(cacheDir).filter((f) => f.endsWith('.json'));
345
- let totalSize = 0;
346
- let oldestEntry: number | null = null;
347
- let newestEntry: number | null = null;
348
-
349
- for (const file of files) {
350
- const stat = statSync(join(cacheDir, file));
351
- totalSize += stat.size;
352
-
353
- const mtime = stat.mtimeMs;
354
- if (oldestEntry === null || mtime < oldestEntry) {
355
- oldestEntry = mtime;
356
- }
357
- if (newestEntry === null || mtime > newestEntry) {
358
- newestEntry = mtime;
359
- }
360
- }
361
-
362
- return { entries: files.length, totalSize, oldestEntry, newestEntry };
363
- }
364
-
365
- /**
366
- * Prune old cache entries (keep most recent N entries or entries younger than maxAge)
367
- */
368
- export function pruneCache(
369
- options: {
370
- maxEntries?: number;
371
- maxAgeMs?: number;
372
- } = {},
373
- ): number {
374
- const { maxEntries = 100, maxAgeMs = 7 * 24 * 60 * 60 * 1000 } = options; // Default: 100 entries, 7 days
375
- const cacheDir = getCacheDir();
376
-
377
- if (!existsSync(cacheDir)) {
378
- return 0;
379
- }
380
-
381
- const files = readdirSync(cacheDir)
382
- .filter((f) => f.endsWith('.json'))
383
- .map((f) => {
384
- const stat = statSync(join(cacheDir, f));
385
- return { name: f, mtime: stat.mtimeMs };
386
- })
387
- .sort((a, b) => b.mtime - a.mtime); // Sort by newest first
388
-
389
- const now = Date.now();
390
- let removed = 0;
391
-
392
- for (let i = 0; i < files.length; i++) {
393
- const file = files[i];
394
- const age = now - file.mtime;
395
-
396
- // Remove if exceeds max entries or max age
397
- if (i >= maxEntries || age > maxAgeMs) {
398
- try {
399
- unlinkSync(join(cacheDir, file.name));
400
- removed++;
401
- } catch {}
402
- }
403
- }
404
-
405
- return removed;
406
- }
407
-
408
- /**
409
- * Check if caching is enabled
410
- * Can be disabled via JDM_ASM_NO_CACHE=1 environment variable
411
- */
412
- export function isCacheEnabled(): boolean {
413
- return process.env.JDM_ASM_NO_CACHE !== '1';
414
- }
@@ -1,211 +0,0 @@
1
- /**
2
- * Code generation helpers for shared AssemblyScript code patterns.
3
- *
4
- * These helpers generate AssemblyScript code strings that can be used across
5
- * different compiler modules to avoid duplication.
6
- */
7
-
8
- import { sanitizeId } from './utils';
9
-
10
- /**
11
- * Generate AssemblyScript code to assign a value to a nested path in the context.
12
- *
13
- * This handles dotted paths like "cart.items.total" by navigating/creating the
14
- * necessary object hierarchy in the context. The algorithm:
15
- * 1. Splits the path by "."
16
- * 2. Gets or creates the root object from context
17
- * 3. Navigates/creates intermediate objects for each part
18
- * 4. Sets the final value at the leaf
19
- *
20
- * @param path - The dotted path string (e.g., "cart.items.total")
21
- * @param valueExpr - The AssemblyScript expression for the value to assign
22
- * @param prefix - Optional prefix for generated variable names to avoid collisions (default: "__np")
23
- * @returns AssemblyScript code string that performs the nested assignment
24
- */
25
- export function generateNestedPathAssignment(
26
- path: string,
27
- valueExpr: string,
28
- prefix: string = '__np',
29
- ): string {
30
- return `// Store value at nested path: ${path}
31
- {
32
- const ${prefix}_value = ${valueExpr};
33
- const ${prefix}_parts = "${path}".split(".");
34
- const ${prefix}_rootKey = ${prefix}_parts[0];
35
- // Get or create the root object
36
- let ${prefix}_rootObj: Map<string, Value>;
37
- if (ctx.data.has(${prefix}_rootKey) && ctx.data.get(${prefix}_rootKey).isObject()) {
38
- ${prefix}_rootObj = ctx.data.get(${prefix}_rootKey).asObject();
39
- } else {
40
- ${prefix}_rootObj = new Map<string, Value>();
41
- ctx.set(${prefix}_rootKey, Value.Object(${prefix}_rootObj));
42
- }
43
- // Navigate/create nested objects for intermediate parts
44
- let ${prefix}_current = ${prefix}_rootObj;
45
- for (let ${prefix}_j = 1; ${prefix}_j < ${prefix}_parts.length - 1; ${prefix}_j++) {
46
- const ${prefix}_part = ${prefix}_parts[${prefix}_j];
47
- if (${prefix}_current.has(${prefix}_part) && ${prefix}_current.get(${prefix}_part).isObject()) {
48
- ${prefix}_current = ${prefix}_current.get(${prefix}_part).asObject();
49
- } else {
50
- const ${prefix}_newObj = new Map<string, Value>();
51
- ${prefix}_current.set(${prefix}_part, Value.Object(${prefix}_newObj));
52
- ${prefix}_current = ${prefix}_newObj;
53
- }
54
- }
55
- // Set the final value at the leaf of the path
56
- ${prefix}_current.set(${prefix}_parts[${prefix}_parts.length - 1], ${prefix}_value);
57
- }`;
58
- }
59
-
60
- /**
61
- * Generate AssemblyScript code to build a final result from accumulated context.
62
- *
63
- * This extracts all user-facing keys from the context (excluding internal namespaces)
64
- * and builds a Map suitable for returning as a Value.Object result.
65
- *
66
- * The generated code:
67
- * 1. Creates a new Map for the result
68
- * 2. Iterates over all keys in ctx.data
69
- * 3. Filters out internal keys ($*, #, acc)
70
- * 4. Copies remaining keys to the result map
71
- *
72
- * @param resultVarName - The name of the variable to store the result in
73
- * @param prefix - Optional prefix for loop variables to avoid collisions (default: "__bfr")
74
- * @returns AssemblyScript code string that builds the result map
75
- */
76
- export function generateBuildFinalResultCode(
77
- resultVarName: string,
78
- prefix: string = '__bfr',
79
- ): string {
80
- return `// Build final result from accumulated context
81
- let ${resultVarName} = new Map<string, Value>();
82
- const ${prefix}_keys = ctx.data.keys();
83
- for (let ${prefix}_i = 0; ${prefix}_i < ${prefix}_keys.length; ${prefix}_i++) {
84
- const ${prefix}_key = ${prefix}_keys[${prefix}_i];
85
- // $nodes/$ are internal namespaces
86
- // # is iteration variable,
87
- // acc is accumulator
88
- // None should appear in final output, only actual output field names
89
- if (!${prefix}_key.startsWith("$") && ${prefix}_key !== "#" && ${prefix}_key !== "acc") {
90
- ${resultVarName}.set(${prefix}_key, ctx.data.get(${prefix}_key));
91
- }
92
- }`;
93
- }
94
-
95
- /**
96
- * Generate AssemblyScript code to evaluate a single node and handle its outputPath and passThrough settings.
97
- *
98
- * This is the standard node evaluation pattern used across the codebase. It:
99
- * 1. Calls the node's evaluateNode function
100
- * 2. Stores the result in $nodes.<nodeName>
101
- * 3. Handles outputPath if specified (storing result at the given path)
102
- * 4. Handles passThrough merge if the node is configured for it
103
- *
104
- * @param nodeId - The raw node ID
105
- * @param nodeName - The name of the node (for context storage)
106
- * @param node - The JDM node definition (optional, for outputPath/passThrough handling)
107
- * @returns AssemblyScript code string that evaluates the node
108
- */
109
- export function generateNodeEvaluationCode(
110
- nodeId: string,
111
- nodeName: string,
112
- node?: {
113
- type?: string;
114
- content?: { outputPath?: string; passThrough?: boolean; outputs?: Array<{ field?: string }> };
115
- },
116
- ): string {
117
- const sanitizedId = sanitizeId(nodeId);
118
- const statements: string[] = [];
119
-
120
- // Call the node's evaluateNode function and store result
121
- statements.push(`ctx.set("$nodes.${nodeName}", evaluateNode_${sanitizedId}(ctx));`);
122
-
123
- if (!node) {
124
- return statements.join('\n ');
125
- }
126
-
127
- const outputPath = node.content?.outputPath;
128
- if (outputPath) {
129
- if (!outputPath.includes('.')) {
130
- statements.push(`ctx.set("${outputPath}", ctx.get("$nodes.${nodeName}"));`);
131
- } else {
132
- statements.push(generateNestedPathAssignment(outputPath, `ctx.get("$nodes.${nodeName}")`));
133
- }
134
- }
135
-
136
- // Determine if we should merge node results into context
137
- // Expression nodes compute values meant for the output, so their results should flow
138
- // through to the final result regardless of passThrough setting. Decision tables with
139
- // dotted output fields (e.g., "flag.turnover") similarly need merging to build nested
140
- // output structures.
141
- const hasOutputFields =
142
- node.type === 'decisionTableNode' &&
143
- node.content?.outputs?.some((o: { field?: string }) => o.field && o.field.includes('.'));
144
- const shouldMerge =
145
- node.type === 'expressionNode' || node.content?.passThrough === true || hasOutputFields;
146
-
147
- if (shouldMerge) {
148
- statements.push(generatePassThroughMergeCode(nodeName));
149
- }
150
-
151
- return statements.join('\n ');
152
- }
153
-
154
- /**
155
- * Generate AssemblyScript code to merge passThrough node results into the context.
156
- *
157
- * This handles both simple keys (e.g., "status") and nested paths (e.g., "evaluation.score").
158
- * For nested paths, it navigates/creates the necessary object hierarchy in the context.
159
- *
160
- * The generated code:
161
- * 1. Gets the node result from `$nodes.<nodeName>`
162
- * 2. Iterates over all keys in the result
163
- * 3. For simple keys, sets them directly in the context
164
- * 4. For nested paths, navigates/creates intermediate objects and sets the leaf value
165
- *
166
- * @param nodeName - The name of the node whose results should be merged
167
- * @returns AssemblyScript code string that performs the merge
168
- */
169
- export function generatePassThroughMergeCode(nodeName: string): string {
170
- // Generate the nested path assignment code for use inside the loop
171
- // We use a special prefix "__pt" to avoid collisions with other generated code
172
- const nestedPathCode = `const __pt_parts = __key.split(".");
173
- const __pt_rootKey = __pt_parts[0];
174
- let __pt_rootObj: Map<string, Value>;
175
- if (ctx.data.has(__pt_rootKey) && ctx.data.get(__pt_rootKey).isObject()) {
176
- __pt_rootObj = ctx.data.get(__pt_rootKey).asObject();
177
- } else {
178
- __pt_rootObj = new Map<string, Value>();
179
- ctx.set(__pt_rootKey, Value.Object(__pt_rootObj));
180
- }
181
- let __pt_current = __pt_rootObj;
182
- for (let __pt_j = 1; __pt_j < __pt_parts.length - 1; __pt_j++) {
183
- const __pt_part = __pt_parts[__pt_j];
184
- if (__pt_current.has(__pt_part) && __pt_current.get(__pt_part).isObject()) {
185
- __pt_current = __pt_current.get(__pt_part).asObject();
186
- } else {
187
- const __pt_newObj = new Map<string, Value>();
188
- __pt_current.set(__pt_part, Value.Object(__pt_newObj));
189
- __pt_current = __pt_newObj;
190
- }
191
- }
192
- __pt_current.set(__pt_parts[__pt_parts.length - 1], __value);`;
193
-
194
- return `// Merge passThrough results for ${nodeName}
195
- {
196
- const __nodeResult = ctx.get("$nodes.${nodeName}");
197
- if (__nodeResult.isObject()) {
198
- const __resultMap = __nodeResult.asObject();
199
- const __keys = __resultMap.keys();
200
- for (let __i = 0; __i < __keys.length; __i++) {
201
- const __key = __keys[__i];
202
- const __value = __resultMap.get(__key);
203
- if (__key.includes(".")) {
204
- ${nestedPathCode}
205
- } else {
206
- ctx.set(__key, __value);
207
- }
208
- }
209
- }
210
- }`;
211
- }
@@ -1,15 +0,0 @@
1
- /**
2
- * Code Generation Module Index
3
- *
4
- * This module provides code generation utilities for the JDM compiler,
5
- * organized by target language and concern:
6
- *
7
- * - JavaScript marshaling: Generates JS code for WASM memory serialization/deserialization
8
- * - JavaScript validation: Generates JS code for input validation against TypeBox schemas
9
- */
10
-
11
- // JavaScript marshaling code generation
12
- export { generateMarshalCode, _generateUnmarshalBody } from './js-marshal';
13
-
14
- // JavaScript validation code generation
15
- export { generateValidationCode } from './js-validation';