@aster-cloud/aster-lang-ts 1.6.0 → 3.0.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 (424) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/dist/scripts/aster.js +5 -12
  3. package/dist/scripts/aster.js.map +1 -1
  4. package/dist/scripts/emit-classfiles.js +3 -1
  5. package/dist/scripts/emit-classfiles.js.map +1 -1
  6. package/dist/scripts/generate-core-ir-types.d.ts +16 -0
  7. package/dist/scripts/generate-core-ir-types.d.ts.map +1 -0
  8. package/dist/scripts/generate-core-ir-types.js +116 -0
  9. package/dist/scripts/generate-core-ir-types.js.map +1 -0
  10. package/dist/scripts/generate-naming-rules.d.ts +5 -0
  11. package/dist/scripts/generate-naming-rules.d.ts.map +1 -0
  12. package/dist/scripts/generate-naming-rules.js +35 -0
  13. package/dist/scripts/generate-naming-rules.js.map +1 -0
  14. package/dist/scripts/golden.js +1 -1
  15. package/dist/scripts/golden.js.map +1 -1
  16. package/dist/src/ast/ast_visitor.d.ts +27 -27
  17. package/dist/src/ast/ast_visitor.d.ts.map +1 -1
  18. package/dist/src/ast/ast_visitor.js.map +1 -1
  19. package/dist/src/browser/schema.d.ts.map +1 -1
  20. package/dist/src/browser/schema.js +1 -3
  21. package/dist/src/browser/schema.js.map +1 -1
  22. package/dist/src/browser.d.ts +7 -0
  23. package/dist/src/browser.d.ts.map +1 -1
  24. package/dist/src/browser.js +7 -4
  25. package/dist/src/browser.js.map +1 -1
  26. package/dist/src/cli/policy-converter.js +6 -10
  27. package/dist/src/cli/policy-converter.js.map +1 -1
  28. package/dist/src/cli/utils/core-ir-file.d.ts +8 -0
  29. package/dist/src/cli/utils/core-ir-file.d.ts.map +1 -0
  30. package/dist/src/cli/utils/core-ir-file.js +29 -0
  31. package/dist/src/cli/utils/core-ir-file.js.map +1 -0
  32. package/dist/src/cnl-printer.d.ts.map +1 -1
  33. package/dist/src/cnl-printer.js +13 -3
  34. package/dist/src/cnl-printer.js.map +1 -1
  35. package/dist/src/compile-pipeline.d.ts.map +1 -1
  36. package/dist/src/compile-pipeline.js +2 -3
  37. package/dist/src/compile-pipeline.js.map +1 -1
  38. package/dist/src/config/lexicons/diagnostic-overlays.generated.d.ts.map +1 -1
  39. package/dist/src/config/lexicons/diagnostic-overlays.generated.js +18 -6
  40. package/dist/src/config/lexicons/diagnostic-overlays.generated.js.map +1 -1
  41. package/dist/src/config/lexicons/fallback-lexicon.d.ts +1 -1
  42. package/dist/src/config/lexicons/fallback-lexicon.d.ts.map +1 -1
  43. package/dist/src/config/lexicons/fallback-lexicon.js +1 -4
  44. package/dist/src/config/lexicons/fallback-lexicon.js.map +1 -1
  45. package/dist/src/config/lexicons/overlay-loader.d.ts +0 -13
  46. package/dist/src/config/lexicons/overlay-loader.d.ts.map +1 -1
  47. package/dist/src/config/lexicons/overlay-loader.js +0 -18
  48. package/dist/src/config/lexicons/overlay-loader.js.map +1 -1
  49. package/dist/src/config/lexicons/types.d.ts +0 -3
  50. package/dist/src/config/lexicons/types.d.ts.map +1 -1
  51. package/dist/src/config/lexicons/types.js.map +1 -1
  52. package/dist/src/core/canonical-decimal.d.ts +3 -0
  53. package/dist/src/core/canonical-decimal.d.ts.map +1 -0
  54. package/dist/src/core/canonical-decimal.js +19 -0
  55. package/dist/src/core/canonical-decimal.js.map +1 -0
  56. package/dist/src/core/canonical-json.d.ts +59 -0
  57. package/dist/src/core/canonical-json.d.ts.map +1 -0
  58. package/dist/src/core/canonical-json.js +250 -0
  59. package/dist/src/core/canonical-json.js.map +1 -0
  60. package/dist/src/core/core-ir-v2.generated.d.ts +807 -0
  61. package/dist/src/core/core-ir-v2.generated.d.ts.map +1 -0
  62. package/dist/src/core/core-ir-v2.generated.js +6 -0
  63. package/dist/src/core/core-ir-v2.generated.js.map +1 -0
  64. package/dist/src/core/core-ir-v2.schema.generated.d.ts +6 -0
  65. package/dist/src/core/core-ir-v2.schema.generated.d.ts.map +1 -0
  66. package/dist/src/core/core-ir-v2.schema.generated.js +2636 -0
  67. package/dist/src/core/core-ir-v2.schema.generated.js.map +1 -0
  68. package/dist/src/core/core_ir.d.ts +27 -11
  69. package/dist/src/core/core_ir.d.ts.map +1 -1
  70. package/dist/src/core/core_ir.js +118 -63
  71. package/dist/src/core/core_ir.js.map +1 -1
  72. package/dist/src/core/index.d.ts +4 -3
  73. package/dist/src/core/index.d.ts.map +1 -1
  74. package/dist/src/core/index.js +3 -2
  75. package/dist/src/core/index.js.map +1 -1
  76. package/dist/src/core/inferred_fields.d.ts +9 -11
  77. package/dist/src/core/inferred_fields.d.ts.map +1 -1
  78. package/dist/src/core/inferred_fields.js +7 -28
  79. package/dist/src/core/inferred_fields.js.map +1 -1
  80. package/dist/src/core/interpreter.js +16 -35
  81. package/dist/src/core/interpreter.js.map +1 -1
  82. package/dist/src/core/lambda-captures.d.ts +14 -0
  83. package/dist/src/core/lambda-captures.d.ts.map +1 -0
  84. package/dist/src/core/lambda-captures.js +128 -0
  85. package/dist/src/core/lambda-captures.js.map +1 -0
  86. package/dist/src/core/pretty_core.d.ts.map +1 -1
  87. package/dist/src/core/pretty_core.js +6 -10
  88. package/dist/src/core/pretty_core.js.map +1 -1
  89. package/dist/src/core/read-core-ir.d.ts +15 -0
  90. package/dist/src/core/read-core-ir.d.ts.map +1 -0
  91. package/dist/src/core/read-core-ir.js +69 -0
  92. package/dist/src/core/read-core-ir.js.map +1 -0
  93. package/dist/src/core/resolution-mark.d.ts +3 -4
  94. package/dist/src/core/resolution-mark.d.ts.map +1 -1
  95. package/dist/src/core/resolution-mark.js +2 -3
  96. package/dist/src/core/resolution-mark.js.map +1 -1
  97. package/dist/src/core/resolve-typed-references.d.ts.map +1 -1
  98. package/dist/src/core/resolve-typed-references.js +11 -27
  99. package/dist/src/core/resolve-typed-references.js.map +1 -1
  100. package/dist/src/core/serialize-core-ir.d.ts +13 -0
  101. package/dist/src/core/serialize-core-ir.d.ts.map +1 -0
  102. package/dist/src/core/serialize-core-ir.js +125 -0
  103. package/dist/src/core/serialize-core-ir.js.map +1 -0
  104. package/dist/src/core/visitor.d.ts.map +1 -1
  105. package/dist/src/core/visitor.js +4 -1
  106. package/dist/src/core/visitor.js.map +1 -1
  107. package/dist/src/diagnostics/error_codes.d.ts +2 -0
  108. package/dist/src/diagnostics/error_codes.d.ts.map +1 -1
  109. package/dist/src/diagnostics/error_codes.js +16 -0
  110. package/dist/src/diagnostics/error_codes.js.map +1 -1
  111. package/dist/src/effects/declared-effects.d.ts +17 -0
  112. package/dist/src/effects/declared-effects.d.ts.map +1 -0
  113. package/dist/src/effects/declared-effects.js +27 -0
  114. package/dist/src/effects/declared-effects.js.map +1 -0
  115. package/dist/src/effects/effect_inference.d.ts.map +1 -1
  116. package/dist/src/effects/effect_inference.js +14 -10
  117. package/dist/src/effects/effect_inference.js.map +1 -1
  118. package/dist/src/effects/effect_inference_browser.d.ts.map +1 -1
  119. package/dist/src/effects/effect_inference_browser.js +14 -9
  120. package/dist/src/effects/effect_inference_browser.js.map +1 -1
  121. package/dist/src/frontend/keyword-translator.d.ts.map +1 -1
  122. package/dist/src/frontend/keyword-translator.js +3 -0
  123. package/dist/src/frontend/keyword-translator.js.map +1 -1
  124. package/dist/src/frontend/lexer.d.ts.map +1 -1
  125. package/dist/src/frontend/lexer.js +7 -3
  126. package/dist/src/frontend/lexer.js.map +1 -1
  127. package/dist/src/frontend/resolve-declarations.d.ts.map +1 -1
  128. package/dist/src/frontend/resolve-declarations.js +3 -23
  129. package/dist/src/frontend/resolve-declarations.js.map +1 -1
  130. package/dist/src/governance/input-refs.js +5 -8
  131. package/dist/src/governance/input-refs.js.map +1 -1
  132. package/dist/src/index.d.ts +5 -0
  133. package/dist/src/index.d.ts.map +1 -1
  134. package/dist/src/index.js +4 -0
  135. package/dist/src/index.js.map +1 -1
  136. package/dist/src/jvm/emitter.d.ts.map +1 -1
  137. package/dist/src/jvm/emitter.js +20 -29
  138. package/dist/src/jvm/emitter.js.map +1 -1
  139. package/dist/src/lower_to_core.d.ts +2 -19
  140. package/dist/src/lower_to_core.d.ts.map +1 -1
  141. package/dist/src/lower_to_core.js +194 -384
  142. package/dist/src/lower_to_core.js.map +1 -1
  143. package/dist/src/lsp/pii_diagnostics.d.ts.map +1 -1
  144. package/dist/src/lsp/pii_diagnostics.js +3 -8
  145. package/dist/src/lsp/pii_diagnostics.js.map +1 -1
  146. package/dist/src/mapping/mapping-ir.d.ts +3 -3
  147. package/dist/src/mapping/mapping-ir.js +3 -3
  148. package/dist/src/nodeid/node-id-map.d.ts +6 -15
  149. package/dist/src/nodeid/node-id-map.d.ts.map +1 -1
  150. package/dist/src/nodeid/node-id-map.js +6 -15
  151. package/dist/src/nodeid/node-id-map.js.map +1 -1
  152. package/dist/src/parser/constraint-parser.js +25 -6
  153. package/dist/src/parser/constraint-parser.js.map +1 -1
  154. package/dist/src/parser/decl-parser.d.ts.map +1 -1
  155. package/dist/src/parser/decl-parser.js +30 -59
  156. package/dist/src/parser/decl-parser.js.map +1 -1
  157. package/dist/src/parser/expr-stmt-parser.d.ts.map +1 -1
  158. package/dist/src/parser/expr-stmt-parser.js +17 -10
  159. package/dist/src/parser/expr-stmt-parser.js.map +1 -1
  160. package/dist/src/parser/field-variant-parser.d.ts.map +1 -1
  161. package/dist/src/parser/field-variant-parser.js +9 -3
  162. package/dist/src/parser/field-variant-parser.js.map +1 -1
  163. package/dist/src/parser/naming-rules.d.ts +19 -0
  164. package/dist/src/parser/naming-rules.d.ts.map +1 -0
  165. package/dist/src/parser/naming-rules.generated.d.ts +7 -0
  166. package/dist/src/parser/naming-rules.generated.d.ts.map +1 -0
  167. package/dist/src/parser/naming-rules.generated.js +392 -0
  168. package/dist/src/parser/naming-rules.generated.js.map +1 -0
  169. package/dist/src/parser/naming-rules.js +2 -0
  170. package/dist/src/parser/naming-rules.js.map +1 -0
  171. package/dist/src/parser/parse-issue.d.ts +2 -0
  172. package/dist/src/parser/parse-issue.d.ts.map +1 -1
  173. package/dist/src/parser/parse-issue.js +2 -0
  174. package/dist/src/parser/parse-issue.js.map +1 -1
  175. package/dist/src/parser/type-inference.d.ts +29 -70
  176. package/dist/src/parser/type-inference.d.ts.map +1 -1
  177. package/dist/src/parser/type-inference.js +82 -212
  178. package/dist/src/parser/type-inference.js.map +1 -1
  179. package/dist/src/parser/type-parser.d.ts +1 -1
  180. package/dist/src/parser/type-parser.d.ts.map +1 -1
  181. package/dist/src/parser/type-parser.js +31 -21
  182. package/dist/src/parser/type-parser.js.map +1 -1
  183. package/dist/src/parser.d.ts.map +1 -1
  184. package/dist/src/parser.js +2 -5
  185. package/dist/src/parser.js.map +1 -1
  186. package/dist/src/stability/stability_gate.d.ts +1 -1
  187. package/dist/src/stability/stability_gate.d.ts.map +1 -1
  188. package/dist/src/stability/stability_gate.js +2 -26
  189. package/dist/src/stability/stability_gate.js.map +1 -1
  190. package/dist/src/typecheck/async.d.ts.map +1 -1
  191. package/dist/src/typecheck/async.js +4 -1
  192. package/dist/src/typecheck/async.js.map +1 -1
  193. package/dist/src/typecheck/browser.d.ts.map +1 -1
  194. package/dist/src/typecheck/browser.js +4 -3
  195. package/dist/src/typecheck/browser.js.map +1 -1
  196. package/dist/src/typecheck/capabilities.d.ts.map +1 -1
  197. package/dist/src/typecheck/capabilities.js +3 -2
  198. package/dist/src/typecheck/capabilities.js.map +1 -1
  199. package/dist/src/typecheck/context.d.ts +5 -5
  200. package/dist/src/typecheck/context.d.ts.map +1 -1
  201. package/dist/src/typecheck/context.js.map +1 -1
  202. package/dist/src/typecheck/diagnostics.d.ts +2 -2
  203. package/dist/src/typecheck/diagnostics.d.ts.map +1 -1
  204. package/dist/src/typecheck/diagnostics.js.map +1 -1
  205. package/dist/src/typecheck/effects.js +18 -11
  206. package/dist/src/typecheck/effects.js.map +1 -1
  207. package/dist/src/typecheck/expression.d.ts +4 -4
  208. package/dist/src/typecheck/expression.d.ts.map +1 -1
  209. package/dist/src/typecheck/expression.js +1 -1
  210. package/dist/src/typecheck/expression.js.map +1 -1
  211. package/dist/src/typecheck/generics.d.ts +2 -2
  212. package/dist/src/typecheck/generics.d.ts.map +1 -1
  213. package/dist/src/typecheck/generics.js +23 -12
  214. package/dist/src/typecheck/generics.js.map +1 -1
  215. package/dist/src/typecheck/governance.d.ts +1 -1
  216. package/dist/src/typecheck/governance.d.ts.map +1 -1
  217. package/dist/src/typecheck/governance.js +1 -1
  218. package/dist/src/typecheck/governance.js.map +1 -1
  219. package/dist/src/typecheck/module.d.ts.map +1 -1
  220. package/dist/src/typecheck/module.js +7 -6
  221. package/dist/src/typecheck/module.js.map +1 -1
  222. package/dist/src/typecheck/pattern.d.ts +2 -2
  223. package/dist/src/typecheck/pattern.d.ts.map +1 -1
  224. package/dist/src/typecheck/pattern.js +12 -46
  225. package/dist/src/typecheck/pattern.js.map +1 -1
  226. package/dist/src/typecheck/pure.d.ts +19 -19
  227. package/dist/src/typecheck/pure.d.ts.map +1 -1
  228. package/dist/src/typecheck/pure.js.map +1 -1
  229. package/dist/src/typecheck/statement.d.ts +6 -6
  230. package/dist/src/typecheck/statement.d.ts.map +1 -1
  231. package/dist/src/typecheck/statement.js +17 -20
  232. package/dist/src/typecheck/statement.js.map +1 -1
  233. package/dist/src/typecheck/symbol_table.d.ts +2 -2
  234. package/dist/src/typecheck/symbol_table.d.ts.map +1 -1
  235. package/dist/src/typecheck/symbol_table.js.map +1 -1
  236. package/dist/src/typecheck/type_system.d.ts +4 -4
  237. package/dist/src/typecheck/type_system.d.ts.map +1 -1
  238. package/dist/src/typecheck/type_system.js +1 -1
  239. package/dist/src/typecheck/type_system.js.map +1 -1
  240. package/dist/src/typecheck/workflow.d.ts +3 -3
  241. package/dist/src/typecheck/workflow.d.ts.map +1 -1
  242. package/dist/src/typecheck/workflow.js.map +1 -1
  243. package/dist/src/typecheck-pii.d.ts.map +1 -1
  244. package/dist/src/typecheck-pii.js +2 -13
  245. package/dist/src/typecheck-pii.js.map +1 -1
  246. package/dist/src/types/type-inference.d.ts +1 -13
  247. package/dist/src/types/type-inference.d.ts.map +1 -1
  248. package/dist/src/types/type-inference.js +1 -2
  249. package/dist/src/types/type-inference.js.map +1 -1
  250. package/dist/src/types.d.ts +160 -172
  251. package/dist/src/types.d.ts.map +1 -1
  252. package/dist/src/types.js.map +1 -1
  253. package/dist/src/version.d.ts +3 -3
  254. package/dist/src/version.js +3 -3
  255. package/dist/test/helpers/core-ir-v2.d.ts +5 -0
  256. package/dist/test/helpers/core-ir-v2.d.ts.map +1 -0
  257. package/dist/test/helpers/core-ir-v2.js +123 -0
  258. package/dist/test/helpers/core-ir-v2.js.map +1 -0
  259. package/dist/test/helpers/locales-core-ir.d.ts +7 -0
  260. package/dist/test/helpers/locales-core-ir.d.ts.map +1 -0
  261. package/dist/test/helpers/locales-core-ir.js +15 -0
  262. package/dist/test/helpers/locales-core-ir.js.map +1 -0
  263. package/dist/test/helpers/locales-type-inference.d.ts +6 -0
  264. package/dist/test/helpers/locales-type-inference.d.ts.map +1 -0
  265. package/dist/test/helpers/locales-type-inference.js +14 -0
  266. package/dist/test/helpers/locales-type-inference.js.map +1 -0
  267. package/dist/test/helpers/test-factories.d.ts +5 -5
  268. package/dist/test/helpers/test-factories.d.ts.map +1 -1
  269. package/dist/test/helpers/test-factories.js +9 -8
  270. package/dist/test/helpers/test-factories.js.map +1 -1
  271. package/dist/test/integration/compliance/compliance-smoke.test.js +1 -2
  272. package/dist/test/integration/compliance/compliance-smoke.test.js.map +1 -1
  273. package/dist/test/integration/pipeline/pipeline.test.js +1 -1
  274. package/dist/test/integration/pipeline/pipeline.test.js.map +1 -1
  275. package/dist/test/integration/vocabulary-resolution.test.js +1 -1
  276. package/dist/test/integration/vocabulary-resolution.test.js.map +1 -1
  277. package/dist/test/regression/type-checker-golden.test.js +1 -1
  278. package/dist/test/regression/type-checker-golden.test.js.map +1 -1
  279. package/dist/test/type-checker/pii-propagation.test.js +7 -6
  280. package/dist/test/type-checker/pii-propagation.test.js.map +1 -1
  281. package/dist/test/types/core-ir-v2.test-d.d.ts +28 -0
  282. package/dist/test/types/core-ir-v2.test-d.d.ts.map +1 -0
  283. package/dist/test/types/core-ir-v2.test-d.js +5 -0
  284. package/dist/test/types/core-ir-v2.test-d.js.map +1 -0
  285. package/dist/test/unit/browser/typecheck-browser-pii-failure.test.js +4 -3
  286. package/dist/test/unit/browser/typecheck-browser-pii-failure.test.js.map +1 -1
  287. package/dist/test/unit/canonicalizer/article-declaration-names.test.js +1 -1
  288. package/dist/test/unit/canonicalizer/article-declaration-names.test.js.map +1 -1
  289. package/dist/test/unit/canonicalizer/chinese-function-syntax.test.js +2 -1
  290. package/dist/test/unit/canonicalizer/chinese-function-syntax.test.js.map +1 -1
  291. package/dist/test/unit/core/canonical-json.test.d.ts +2 -0
  292. package/dist/test/unit/core/canonical-json.test.d.ts.map +1 -0
  293. package/dist/test/unit/core/canonical-json.test.js +38 -0
  294. package/dist/test/unit/core/canonical-json.test.js.map +1 -0
  295. package/dist/test/unit/core/caseless-pattern-name.test.js +6 -8
  296. package/dist/test/unit/core/caseless-pattern-name.test.js.map +1 -1
  297. package/dist/test/unit/core/core-ir-conformance.test.d.ts +2 -0
  298. package/dist/test/unit/core/core-ir-conformance.test.d.ts.map +1 -0
  299. package/dist/test/unit/core/core-ir-conformance.test.js +39 -0
  300. package/dist/test/unit/core/core-ir-conformance.test.js.map +1 -0
  301. package/dist/test/unit/core/core-ir-schema-parity.test.d.ts +2 -0
  302. package/dist/test/unit/core/core-ir-schema-parity.test.d.ts.map +1 -0
  303. package/dist/test/unit/core/core-ir-schema-parity.test.js +25 -0
  304. package/dist/test/unit/core/core-ir-schema-parity.test.js.map +1 -0
  305. package/dist/test/unit/core/core-ir-v2-outputs.test.d.ts +2 -0
  306. package/dist/test/unit/core/core-ir-v2-outputs.test.d.ts.map +1 -0
  307. package/dist/test/unit/core/core-ir-v2-outputs.test.js +128 -0
  308. package/dist/test/unit/core/core-ir-v2-outputs.test.js.map +1 -0
  309. package/dist/test/unit/core/read-core-ir.test.d.ts +2 -0
  310. package/dist/test/unit/core/read-core-ir.test.d.ts.map +1 -0
  311. package/dist/test/unit/core/read-core-ir.test.js +129 -0
  312. package/dist/test/unit/core/read-core-ir.test.js.map +1 -0
  313. package/dist/test/unit/core/resolve-typed-references.test.js +22 -18
  314. package/dist/test/unit/core/resolve-typed-references.test.js.map +1 -1
  315. package/dist/test/unit/diagnostics/lowering-diagnostics-parity.test.js +5 -5
  316. package/dist/test/unit/diagnostics/lowering-diagnostics-parity.test.js.map +1 -1
  317. package/dist/test/unit/diagnostics/parse-diagnostics-parity.test.js +3 -2
  318. package/dist/test/unit/diagnostics/parse-diagnostics-parity.test.js.map +1 -1
  319. package/dist/test/unit/effect/effect-caps-explicit-only.test.d.ts +2 -0
  320. package/dist/test/unit/effect/effect-caps-explicit-only.test.d.ts.map +1 -0
  321. package/dist/test/unit/effect/effect-caps-explicit-only.test.js +73 -0
  322. package/dist/test/unit/effect/effect-caps-explicit-only.test.js.map +1 -0
  323. package/dist/test/unit/effect/effect-inference.test.js +17 -13
  324. package/dist/test/unit/effect/effect-inference.test.js.map +1 -1
  325. package/dist/test/unit/emitter/emitter.test.js +47 -46
  326. package/dist/test/unit/emitter/emitter.test.js.map +1 -1
  327. package/dist/test/unit/formatter-corpus-roundtrip.test.js +5 -1
  328. package/dist/test/unit/formatter-corpus-roundtrip.test.js.map +1 -1
  329. package/dist/test/unit/formatter-roundtrip.test.js +5 -4
  330. package/dist/test/unit/formatter-roundtrip.test.js.map +1 -1
  331. package/dist/test/unit/frontend/resolve-declarations.test.js +13 -14
  332. package/dist/test/unit/frontend/resolve-declarations.test.js.map +1 -1
  333. package/dist/test/unit/governance/governance-check.test.js +1 -1
  334. package/dist/test/unit/governance/governance-check.test.js.map +1 -1
  335. package/dist/test/unit/governance/input-refs-parity.test.js +1 -1
  336. package/dist/test/unit/governance/input-refs-parity.test.js.map +1 -1
  337. package/dist/test/unit/governance/input-refs.test.js +2 -2
  338. package/dist/test/unit/governance/input-refs.test.js.map +1 -1
  339. package/dist/test/unit/governance/no-profile-ir-unchanged.test.js +6 -6
  340. package/dist/test/unit/governance/no-profile-ir-unchanged.test.js.map +1 -1
  341. package/dist/test/unit/interpreter/interpreter.test.js +23 -21
  342. package/dist/test/unit/interpreter/interpreter.test.js.map +1 -1
  343. package/dist/test/unit/interpreter/scope-writeback.test.js +28 -27
  344. package/dist/test/unit/interpreter/scope-writeback.test.js.map +1 -1
  345. package/dist/test/unit/keyword-aliases.test.js +1 -1
  346. package/dist/test/unit/lambda-capture-parity.test.js +43 -14
  347. package/dist/test/unit/lambda-capture-parity.test.js.map +1 -1
  348. package/dist/test/unit/lexicons/fallback-lexicon.test.d.ts +1 -1
  349. package/dist/test/unit/lexicons/fallback-lexicon.test.js +2 -4
  350. package/dist/test/unit/lexicons/fallback-lexicon.test.js.map +1 -1
  351. package/dist/test/unit/lowering/core-ir-v2.test.d.ts +2 -0
  352. package/dist/test/unit/lowering/core-ir-v2.test.d.ts.map +1 -0
  353. package/dist/test/unit/lowering/core-ir-v2.test.js +253 -0
  354. package/dist/test/unit/lowering/core-ir-v2.test.js.map +1 -0
  355. package/dist/test/unit/lowering/lowering.test.js +19 -14
  356. package/dist/test/unit/lowering/lowering.test.js.map +1 -1
  357. package/dist/test/unit/lsp/pii-diagnostics.test.js +33 -30
  358. package/dist/test/unit/lsp/pii-diagnostics.test.js.map +1 -1
  359. package/dist/test/unit/lsp/utils.test.js +5 -4
  360. package/dist/test/unit/lsp/utils.test.js.map +1 -1
  361. package/dist/test/unit/parser/effect-unknown-name.test.js +7 -7
  362. package/dist/test/unit/parser/effect-unknown-name.test.js.map +1 -1
  363. package/dist/test/unit/parser/entry-annotations.test.js +2 -1
  364. package/dist/test/unit/parser/entry-annotations.test.js.map +1 -1
  365. package/dist/test/unit/parser/func-type.test.js +3 -3
  366. package/dist/test/unit/parser/func-type.test.js.map +1 -1
  367. package/dist/test/unit/parser/governance-sugar.test.js +4 -4
  368. package/dist/test/unit/parser/governance-sugar.test.js.map +1 -1
  369. package/dist/test/unit/parser/inferred-type-anchor.test.d.ts +2 -0
  370. package/dist/test/unit/parser/inferred-type-anchor.test.d.ts.map +1 -0
  371. package/dist/test/unit/parser/inferred-type-anchor.test.js +83 -0
  372. package/dist/test/unit/parser/inferred-type-anchor.test.js.map +1 -0
  373. package/dist/test/unit/parser/naming-rules-parity.test.d.ts +2 -0
  374. package/dist/test/unit/parser/naming-rules-parity.test.d.ts.map +1 -0
  375. package/dist/test/unit/parser/naming-rules-parity.test.js +26 -0
  376. package/dist/test/unit/parser/naming-rules-parity.test.js.map +1 -0
  377. package/dist/test/unit/parser/parser.test.js +11 -32
  378. package/dist/test/unit/parser/parser.test.js.map +1 -1
  379. package/dist/test/unit/parser/type-inference-vectors.test.d.ts +2 -0
  380. package/dist/test/unit/parser/type-inference-vectors.test.d.ts.map +1 -0
  381. package/dist/test/unit/parser/type-inference-vectors.test.js +40 -0
  382. package/dist/test/unit/parser/type-inference-vectors.test.js.map +1 -0
  383. package/dist/test/unit/parser/type-inference.test.d.ts +2 -1
  384. package/dist/test/unit/parser/type-inference.test.d.ts.map +1 -1
  385. package/dist/test/unit/parser/type-inference.test.js +93 -159
  386. package/dist/test/unit/parser/type-inference.test.js.map +1 -1
  387. package/dist/test/unit/regex-guard.test.js +6 -6
  388. package/dist/test/unit/regex-guard.test.js.map +1 -1
  389. package/dist/test/unit/rule-call-checks.test.js +2 -1
  390. package/dist/test/unit/rule-call-checks.test.js.map +1 -1
  391. package/dist/test/unit/typecheck/async-discipline-extended.test.js +11 -10
  392. package/dist/test/unit/typecheck/async-discipline-extended.test.js.map +1 -1
  393. package/dist/test/unit/typecheck/effect-prefix-injection.test.js +3 -2
  394. package/dist/test/unit/typecheck/effect-prefix-injection.test.js.map +1 -1
  395. package/dist/test/unit/typecheck/function-return-inference.test.js +33 -32
  396. package/dist/test/unit/typecheck/function-return-inference.test.js.map +1 -1
  397. package/dist/test/unit/typecheck/pii-cross-runtime-conformance.test.js +5 -4
  398. package/dist/test/unit/typecheck/pii-cross-runtime-conformance.test.js.map +1 -1
  399. package/dist/test/unit/typecheck/regression-fixes.test.js +110 -112
  400. package/dist/test/unit/typecheck/regression-fixes.test.js.map +1 -1
  401. package/dist/test/unit/typecheck/symbol-table.test.js +3 -2
  402. package/dist/test/unit/typecheck/symbol-table.test.js.map +1 -1
  403. package/dist/test/unit/typecheck/type-system-extended.test.js +6 -5
  404. package/dist/test/unit/typecheck/type-system-extended.test.js.map +1 -1
  405. package/dist/test/unit/typecheck/type-system.test.js +20 -19
  406. package/dist/test/unit/typecheck/type-system.test.js.map +1 -1
  407. package/dist/test/unit/typecheck/typecheck-advanced.test.js +19 -18
  408. package/dist/test/unit/typecheck/typecheck-advanced.test.js.map +1 -1
  409. package/dist/test/unit/typecheck/untyped-field-dynamic.test.js +6 -4
  410. package/dist/test/unit/typecheck/untyped-field-dynamic.test.js.map +1 -1
  411. package/dist/test/unit/version.test.js +3 -3
  412. package/package.json +4 -3
  413. package/dist/src/config/lexicons/type-inference-rules.d.ts +0 -19
  414. package/dist/src/config/lexicons/type-inference-rules.d.ts.map +0 -1
  415. package/dist/src/config/lexicons/type-inference-rules.js +0 -63
  416. package/dist/src/config/lexicons/type-inference-rules.js.map +0 -1
  417. package/dist/src/core/core_ir_json.d.ts +0 -62
  418. package/dist/src/core/core_ir_json.d.ts.map +0 -1
  419. package/dist/src/core/core_ir_json.js +0 -81
  420. package/dist/src/core/core_ir_json.js.map +0 -1
  421. package/dist/test/unit/core_ir_json/core_ir_json.test.d.ts +0 -2
  422. package/dist/test/unit/core_ir_json/core_ir_json.test.d.ts.map +0 -1
  423. package/dist/test/unit/core_ir_json/core_ir_json.test.js +0 -218
  424. package/dist/test/unit/core_ir_json/core_ir_json.test.js.map +0 -1
@@ -0,0 +1,39 @@
1
+ import { test } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { compile } from '../../../src/browser.js';
4
+ import { EN_US } from '../../../src/config/lexicons/en-US.js';
5
+ import { ZH_CN } from '../../../src/config/lexicons/zh-CN.js';
6
+ import { DE_DE } from '../../../src/config/lexicons/de-DE.js';
7
+ import { HI_IN } from '../../../src/config/lexicons/hi-IN.js';
8
+ import { CoreIrFormatError, readCoreIr } from '../../../src/core/read-core-ir.js';
9
+ import { serializeCoreIr } from '../../../src/core/serialize-core-ir.js';
10
+ import { loadCorpus } from '../../../scripts/corpus-loader.js';
11
+ // ADR 0055 §3:ts 对语料的全部输出都必须通过 v2 schema 与不变式(与 core CoreIrSchemaConformanceTest 对应)。
12
+ // 语料取自 aster-lang-test(兄弟 checkout,缺失时退回 npm 快照,见 scripts/corpus-loader.ts)。
13
+ const LEXICONS = { 'en-US': EN_US, 'zh-CN': ZH_CN, 'de-DE': DE_DE, 'hi-IN': HI_IN };
14
+ test('corpus output conforms to Core IR v2 schema and invariants', async () => {
15
+ const { listSamples } = await loadCorpus();
16
+ const failures = [];
17
+ let checked = 0;
18
+ for (const sample of listSamples()) {
19
+ if (sample.path.startsWith('tier1-reject/'))
20
+ continue;
21
+ const lexicon = LEXICONS[sample.meta.lexicon ?? 'en-US'];
22
+ if (!lexicon)
23
+ continue;
24
+ const result = compile(sample.readSource(), { lexicon });
25
+ if (!result.success || !result.core)
26
+ continue;
27
+ checked++;
28
+ try {
29
+ readCoreIr(serializeCoreIr(result.core));
30
+ }
31
+ catch (e) {
32
+ const detail = e instanceof CoreIrFormatError ? JSON.stringify(e.problems.slice(0, 3)) : String(e);
33
+ failures.push(`${sample.path}: ${e instanceof Error ? e.message : String(e)} ${detail}`);
34
+ }
35
+ }
36
+ assert.ok(checked >= 300, `可编译样本异常偏少(${checked})`);
37
+ assert.deepEqual(failures, []);
38
+ });
39
+ //# sourceMappingURL=core-ir-conformance.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-ir-conformance.test.js","sourceRoot":"","sources":["../../../../test/unit/core/core-ir-conformance.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAE/D,sFAAsF;AACtF,6EAA6E;AAC7E,MAAM,QAAQ,GAAsC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAEvH,IAAI,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;IAC5E,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;YAAE,SAAS;QACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI;YAAE,SAAS;QAC9C,OAAO,EAAE,CAAC;QACV,IAAI,CAAC;YACH,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,CAAC,YAAY,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACnG,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IACD,MAAM,CAAC,EAAE,CAAC,OAAO,IAAI,GAAG,EAAE,aAAa,OAAO,GAAG,CAAC,CAAC;IACnD,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=core-ir-schema-parity.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-ir-schema-parity.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/core/core-ir-schema-parity.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import { test } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { readFileSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { CORE_IR_SCHEMA_MODULE_PATH, CORE_IR_SCHEMA_PATH, CORE_IR_TYPES_PATH, renderCoreIrSchemaModule, renderCoreIrTypes, } from '../../../scripts/generate-core-ir-types.js';
6
+ import { CORE_IR_V2_SCHEMA } from '../../../src/core/core-ir-v2.schema.generated.js';
7
+ import { locateLocalesCoreIr } from '../../helpers/locales-core-ir.js';
8
+ // ADR 0055 §3:shared/ 副本与 aster-lang-locales 真相源深度相等,生成物与副本同步。
9
+ const root = process.cwd();
10
+ const readRepo = (p) => readFileSync(join(root, p), 'utf8');
11
+ const sharedSchema = () => JSON.parse(readRepo(CORE_IR_SCHEMA_PATH));
12
+ test('schema copy equals locales source', (t) => {
13
+ const source = locateLocalesCoreIr('core-ir.v2.schema.json');
14
+ if (source === undefined)
15
+ return t.skip('本地未并列 checkout aster-lang-locales');
16
+ assert.deepEqual(sharedSchema(), JSON.parse(readFileSync(source, 'utf8')));
17
+ });
18
+ test('generated types are fresh', async () => {
19
+ assert.equal(readRepo(CORE_IR_TYPES_PATH), await renderCoreIrTypes(sharedSchema()), '重新运行 node dist/scripts/generate-core-ir-types.js 并提交生成物');
20
+ });
21
+ test('generated schema module is fresh and equals the shared copy', () => {
22
+ assert.equal(readRepo(CORE_IR_SCHEMA_MODULE_PATH), renderCoreIrSchemaModule(sharedSchema()), '重新运行 node dist/scripts/generate-core-ir-types.js 并提交生成物');
23
+ assert.deepEqual(CORE_IR_V2_SCHEMA, sharedSchema());
24
+ });
25
+ //# sourceMappingURL=core-ir-schema-parity.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-ir-schema-parity.test.js","sourceRoot":"","sources":["../../../../test/unit/core/core-ir-schema-parity.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEvE,+DAA+D;AAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAC3B,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC5E,MAAM,YAAY,GAAG,GAA4B,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAA4B,CAAC;AAEzH,IAAI,CAAC,mCAAmC,EAAE,CAAC,CAAC,EAAE,EAAE;IAC9C,MAAM,MAAM,GAAG,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;IAC7D,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC7E,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAC7E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;IAC3C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,iBAAiB,CAAC,YAAY,EAAE,CAAC,EAChF,yDAAyD,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,GAAG,EAAE;IACvE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,wBAAwB,CAAC,YAAY,EAAE,CAAC,EACzF,yDAAyD,CAAC,CAAC;IAC7D,MAAM,CAAC,SAAS,CAAC,iBAAiB,EAAE,YAAY,EAAE,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=core-ir-v2-outputs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-ir-v2-outputs.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/core/core-ir-v2-outputs.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Core IR v2 的读写出口与消费方(ADR 0055 §5;实施计划 Task T3):
3
+ * compile().coreJson、CLI 写出的 IR 文件、解释器与治理检查读 v2 IR。
4
+ */
5
+ import { describe, it } from 'node:test';
6
+ import assert from 'node:assert/strict';
7
+ import { spawnSync } from 'node:child_process';
8
+ import fs from 'node:fs';
9
+ import os from 'node:os';
10
+ import path from 'node:path';
11
+ import { compile, compileAndTypecheck } from '../../../src/browser.js';
12
+ import { prepareTruffleCoreJson } from '../../../src/cli/utils/core-ir-file.js';
13
+ import { Core as CoreIR } from '../../../src/core/core_ir.js';
14
+ import { evaluate } from '../../../src/core/interpreter.js';
15
+ import { CoreIrFormatError, readCoreIr } from '../../../src/core/read-core-ir.js';
16
+ import { serializeCoreIr } from '../../../src/core/serialize-core-ir.js';
17
+ import { ZH_CN } from '../../../src/config/lexicons/zh-CN.js';
18
+ import { checkGovernance, controls, ruleId } from '../../../src/typecheck/governance.js';
19
+ const COLOR = 'Module m.\n\nDefine Color as one of Red, Green.\n\n'
20
+ + 'Rule f given c as Color, produce Int:\n Match c:\n When Red, Return 1.\n When Green, Return 2.\n';
21
+ function core(source) {
22
+ const r = compile(source, {});
23
+ assert.equal(r.success, true, JSON.stringify(r.parseErrors ?? r.resolutionDiagnostics));
24
+ return r.core;
25
+ }
26
+ describe('compile().coreJson', () => {
27
+ it('compile returns coreJson equal to serializeCoreIr(core)', () => {
28
+ const r = compile(COLOR, {});
29
+ assert.equal(r.success, true);
30
+ assert.equal(r.coreJson, serializeCoreIr(r.core));
31
+ assert.deepEqual(readCoreIr(r.coreJson), r.core);
32
+ const t = compileAndTypecheck(COLOR, {});
33
+ assert.equal(t.coreJson, serializeCoreIr(t.core));
34
+ });
35
+ it('编译失败时不产出 coreJson', () => {
36
+ const r = compile('Module m.\n\nRule f given x as Int, produce Int:\n Return y.\n', {});
37
+ assert.equal(r.success, false);
38
+ assert.equal(r.coreJson, undefined);
39
+ });
40
+ });
41
+ describe('解释器读 v2 IR', () => {
42
+ it('interpreter evaluates v2 PatCtor zero-arg variant', () => {
43
+ const m = core(COLOR);
44
+ assert.equal(evaluate(m, 'f', { c: 'Green' }).value, 2);
45
+ // 读回的 JSON IR(无任何旁路表)同样可求值
46
+ const fromJson = readCoreIr(serializeCoreIr(m));
47
+ assert.equal(evaluate(fromJson, 'f', { c: 'Red' }).value, 1);
48
+ });
49
+ it('中文枚举成员(无大小写)经 0 参 PatCtor 正确匹配', () => {
50
+ const src = '模块 探针.样例。\n\n定义 状态 为以下之一 待处理、进行中。\n\n'
51
+ + '规则 描述 给定 s 作为 状态,产出 整数:\n 匹配于 s:\n 当 待处理,返回 1。\n 当 进行中,返回 2。\n';
52
+ const r = compile(src, { lexicon: ZH_CN });
53
+ assert.equal(r.success, true);
54
+ assert.equal(evaluate(readCoreIr(r.coreJson), '描述', { s: '进行中' }).value, 2);
55
+ });
56
+ it('PatName 只绑定:手写 IR 中的大写 PatName 也是绑定,不再当作变体', () => {
57
+ const body = CoreIR.Block([CoreIR.Match(CoreIR.Name('c'), [
58
+ CoreIR.Case(CoreIR.PatName('Red'), CoreIR.Return(CoreIR.Int(1))),
59
+ ])]);
60
+ const fn = CoreIR.Func('f', [], [CoreIR.Param('c', CoreIR.TypeName('Text'))], CoreIR.TypeName('Int'), [], body);
61
+ const m = CoreIR.Module('m', [fn]);
62
+ assert.equal(evaluate(m, 'f', { c: 'anything' }).value, 1);
63
+ });
64
+ it('Double 字面量的规范十进制串在运行时解析为浮点数', () => {
65
+ assert.equal(evaluate(core('Module m.\n\nRule f, produce Double:\n Return 0.25.\n'), 'f', {}).value, 0.25);
66
+ });
67
+ });
68
+ describe('治理检查读 v2 注解', () => {
69
+ it('governance reads $0 from args', () => {
70
+ const m = core('Module m.\n\n@id("R1")\n@control("EU_AI_ACT:ART14")\nRule decide given x as Int, produce Verdict:\n Return Verdict.allow().\n');
71
+ const f = m.decls.find((d) => d.kind === 'Func');
72
+ assert.deepEqual(f.annotations.map((a) => a.args), [[{ name: '$0', value: 'R1' }], [{ name: '$0', value: 'EU_AI_ACT:ART14' }]]);
73
+ assert.equal(ruleId(f), 'R1');
74
+ assert.deepEqual(controls(f), ['EU_AI_ACT:ART14']);
75
+ const codes = checkGovernance(m).map((d) => d.code);
76
+ assert.equal(codes.includes("W700" /* ErrorCode.GOV_VERDICT_RULE_MISSING_ID */), false);
77
+ });
78
+ it('$0 不是字符串时报 E702', () => {
79
+ const m = core('Module m.\n\n@id(42)\nRule decide given x as Int, produce Verdict:\n Return Verdict.allow().\n');
80
+ assert.ok(checkGovernance(m).some((d) => d.code === "E702" /* ErrorCode.GOV_ANNOTATION_ARG_INVALID */));
81
+ });
82
+ });
83
+ describe('与 Java 解析面的对照(T3 审查复核)', () => {
84
+ it('重复的效应名在 IR 中按首次出现去重(与 Java LinkedHashSet 一致),输出能被严格读回', () => {
85
+ const r = compile('Module m.\n\nRule f given x as Int, produce Int. It performs io and io and cpu:\n Return x.\n', {});
86
+ assert.equal(r.success, true);
87
+ assert.deepEqual(r.core.decls[0].effects, ['io', 'cpu']);
88
+ readCoreIr(r.coreJson);
89
+ });
90
+ it('注解参数名与值可以是软关键词(与 Java structKeywordName 一致)', () => {
91
+ const m = core('Module m.\n\n@x(return: "a", to)\nRule f given x as Int, produce Int:\n Return x.\n');
92
+ const f = m.decls[0];
93
+ assert.deepEqual(f.annotations[0].args, [{ name: 'return', value: 'a' }, { name: '$0', value: 'to' }]);
94
+ });
95
+ });
96
+ describe('CLI 的 IR 文件', () => {
97
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'aster-core-ir-v2-'));
98
+ it('cli truffle writes canonical v2', () => {
99
+ const input = path.join(dir, 'color.aster');
100
+ fs.writeFileSync(input, COLOR);
101
+ const out = prepareTruffleCoreJson(input, path.join(dir, 'build'));
102
+ const bytes = fs.readFileSync(out, 'utf8');
103
+ assert.equal(bytes, compile(COLOR, {}).coreJson);
104
+ assert.equal(serializeCoreIr(readCoreIr(bytes)), bytes);
105
+ });
106
+ it('truffle 的 .json 输入先严格读入:v1 形状(无 schemaVersion)被拒收', () => {
107
+ const v1 = path.join(dir, 'old.json');
108
+ fs.writeFileSync(v1, JSON.stringify({ kind: 'Module', name: 'm', decls: [] }));
109
+ assert.throws(() => prepareTruffleCoreJson(v1), (e) => e instanceof CoreIrFormatError && e.code === 'unsupported_schema_version');
110
+ const ok = path.join(dir, 'ok.json');
111
+ fs.writeFileSync(ok, compile(COLOR, {}).coreJson);
112
+ assert.equal(prepareTruffleCoreJson(ok), ok);
113
+ });
114
+ it('aster-convert compile-to-json 输出规范字节,json-to-cnl 拒收 v1 IR', () => {
115
+ const input = path.join(dir, 'conv.aster');
116
+ fs.writeFileSync(input, COLOR);
117
+ const cli = path.join(process.cwd(), 'dist', 'src', 'cli', 'policy-converter.js');
118
+ const compiled = spawnSync(process.execPath, [cli, 'compile-to-json', input], { encoding: 'utf8' });
119
+ assert.equal(compiled.status, 0, compiled.stderr);
120
+ assert.equal(compiled.stdout.trim(), compile(COLOR, {}).coreJson);
121
+ const v1 = path.join(dir, 'conv-old.json');
122
+ fs.writeFileSync(v1, JSON.stringify({ version: '1.0', module: { kind: 'Module', name: 'm', decls: [] } }));
123
+ const back = spawnSync(process.execPath, [cli, 'json-to-cnl', v1], { encoding: 'utf8' });
124
+ assert.notEqual(back.status, 0);
125
+ assert.match(back.stderr, /schemaVersion/);
126
+ });
127
+ });
128
+ //# sourceMappingURL=core-ir-v2-outputs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-ir-v2-outputs.test.js","sourceRoot":"","sources":["../../../../test/unit/core/core-ir-v2-outputs.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=read-core-ir.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-core-ir.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/core/read-core-ir.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,129 @@
1
+ import { describe, test } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { readFileSync, readdirSync } from 'node:fs';
4
+ import { dirname, join } from 'node:path';
5
+ import { canonicalDecimalFromLiteral } from '../../../src/core/canonical-decimal.js';
6
+ import { CoreIrFormatError, readCoreIr } from '../../../src/core/read-core-ir.js';
7
+ import { serializeCoreIr, validateCoreIrInvariants } from '../../../src/core/serialize-core-ir.js';
8
+ import { locateLocalesCoreIr } from '../../helpers/locales-core-ir.js';
9
+ const VERSION_FIXTURES = new Set([
10
+ 'bad-missing-schema-version.json',
11
+ 'bad-schema-version-1.json',
12
+ 'bad-schema-version-string.json',
13
+ ]);
14
+ const expectedPath = locateLocalesCoreIr(join('test-fixtures', 'expected-problems.json'));
15
+ const fixtureDir = expectedPath === undefined ? undefined : dirname(expectedPath);
16
+ const expected = expectedPath === undefined
17
+ ? []
18
+ : JSON.parse(readFileSync(expectedPath, 'utf8'));
19
+ /** 与 validateCoreIrInvariants 相同的排序:先 path、再 code(码元序)。 */
20
+ function byPathThenCode(a, b) {
21
+ if (a.path !== b.path)
22
+ return a.path < b.path ? -1 : 1;
23
+ return a.code === b.code ? 0 : a.code < b.code ? -1 : 1;
24
+ }
25
+ function readError(json) {
26
+ try {
27
+ readCoreIr(json);
28
+ }
29
+ catch (e) {
30
+ if (e instanceof CoreIrFormatError)
31
+ return e;
32
+ throw e;
33
+ }
34
+ assert.fail('readCoreIr 应当拒收');
35
+ }
36
+ describe('readCoreIr rejects every locales bad fixture with expected problems', () => {
37
+ test('夹具目录存在且 expected-problems.json 覆盖目录中的每个夹具', (t) => {
38
+ if (fixtureDir === undefined)
39
+ return t.skip('本地未并列 checkout aster-lang-locales');
40
+ const onDisk = readdirSync(fixtureDir).filter(f => /^(bad|ok)-.*\.json$/.test(f)).sort();
41
+ assert.deepEqual(expected.map(e => e.file).sort(), onDisk);
42
+ assert.ok(onDisk.filter(f => f.startsWith('bad-')).length >= 24, '负例数异常偏少');
43
+ });
44
+ for (const { file, problems } of expected) {
45
+ test(file, () => {
46
+ const json = readFileSync(join(fixtureDir, file), 'utf8');
47
+ if (problems.length === 0) {
48
+ assert.doesNotThrow(() => readCoreIr(json));
49
+ return;
50
+ }
51
+ const err = readError(json);
52
+ if (VERSION_FIXTURES.has(file)) {
53
+ assert.equal(err.code, 'unsupported_schema_version');
54
+ return;
55
+ }
56
+ assert.equal(err.code, 'invalid_request');
57
+ if (problems.every(p => p.code === 'schema')) {
58
+ assert.ok(err.problems.length > 0);
59
+ assert.deepEqual([...new Set(err.problems.map(p => p.code))], ['schema']);
60
+ }
61
+ else {
62
+ // 不变式夹具必须先通过 schema,问题列表只含不变式问题
63
+ assert.deepEqual(err.problems, [...problems].sort(byPathThenCode));
64
+ }
65
+ });
66
+ }
67
+ });
68
+ describe('readCoreIr 版本预检查与解析错误', () => {
69
+ test('非 JSON 报 invalid_request', () => {
70
+ assert.equal(readError('{').code, 'invalid_request');
71
+ });
72
+ test('数组、null 与缺失 schemaVersion 都报 unsupported_schema_version', () => {
73
+ for (const json of ['[]', 'null', '{"kind":"Module"}', '{"schemaVersion":"2"}', '{"schemaVersion":1}']) {
74
+ assert.equal(readError(json).code, 'unsupported_schema_version', json);
75
+ }
76
+ });
77
+ test('版本正确但形状不对报 invalid_request 且问题 code 为 schema', () => {
78
+ const err = readError('{"schemaVersion":2}');
79
+ assert.equal(err.code, 'invalid_request');
80
+ assert.ok(err.problems.length > 0 && err.problems.every(p => p.code === 'schema'));
81
+ });
82
+ });
83
+ describe('double literals match locales fixture', () => {
84
+ test('每条源码字面量的规范十进制串都与夹具一致', (t) => {
85
+ const path = locateLocalesCoreIr(join('test-fixtures', 'double-literals.json'));
86
+ if (path === undefined)
87
+ return t.skip('本地未并列 checkout aster-lang-locales');
88
+ const rows = JSON.parse(readFileSync(path, 'utf8'));
89
+ assert.ok(rows.length >= 8);
90
+ for (const { source, canonical } of rows) {
91
+ assert.equal(canonicalDecimalFromLiteral(source), canonical, source);
92
+ }
93
+ });
94
+ test('不经 double:超出双精度有效位的字面量原样保留', () => {
95
+ assert.equal(canonicalDecimalFromLiteral('123456789012345678901.5'), '123456789012345678901.5');
96
+ assert.equal(canonicalDecimalFromLiteral('-0'), '0');
97
+ assert.equal(canonicalDecimalFromLiteral('-1.50'), '-1.5');
98
+ assert.equal(canonicalDecimalFromLiteral('007.0'), '7');
99
+ });
100
+ test('输出满足 schema 的 CanonicalDecimal pattern', () => {
101
+ const pattern = /^(0|-?[1-9][0-9]*(\.[0-9]*[1-9])?|-?0\.[0-9]*[1-9])$/;
102
+ for (const raw of ['0.1', '1.0', '-0.0', '1E3', '0.000', '-0.25', '100']) {
103
+ assert.match(canonicalDecimalFromLiteral(raw), pattern, raw);
104
+ }
105
+ });
106
+ });
107
+ describe('serializeCoreIr', () => {
108
+ test('ok 夹具读入后规范输出:键按码点升序,null 与空数组显式输出,读回仍通过', (t) => {
109
+ if (fixtureDir === undefined)
110
+ return t.skip('本地未并列 checkout aster-lang-locales');
111
+ for (const file of expected.filter(e => e.problems.length === 0).map(e => e.file)) {
112
+ const module = readCoreIr(readFileSync(join(fixtureDir, file), 'utf8'));
113
+ const bytes = serializeCoreIr(module);
114
+ assert.ok(bytes.startsWith('{"decls":['), file);
115
+ assert.ok(bytes.includes('"written":null'), file);
116
+ assert.deepEqual(readCoreIr(bytes), module, file);
117
+ assert.equal(serializeCoreIr(readCoreIr(bytes)), bytes, `${file} 规范输出应当幂等`);
118
+ }
119
+ });
120
+ test('validateCoreIrInvariants 对 ok 夹具无问题', (t) => {
121
+ if (fixtureDir === undefined)
122
+ return t.skip('本地未并列 checkout aster-lang-locales');
123
+ for (const file of expected.filter(e => e.problems.length === 0).map(e => e.file)) {
124
+ const module = JSON.parse(readFileSync(join(fixtureDir, file), 'utf8'));
125
+ assert.deepEqual(validateCoreIrInvariants(module), [], file);
126
+ }
127
+ });
128
+ });
129
+ //# sourceMappingURL=read-core-ir.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-core-ir.test.js","sourceRoot":"","sources":["../../../../test/unit/core/read-core-ir.test.ts"],"names":[],"mappings":"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"}
@@ -287,8 +287,9 @@ describe('resolveTypedReferences(R2)', () => {
287
287
  'Regel f gegeben s als Stufe, liefert Ganzzahl:\n pruefe s:\n bei Hoch, gib zurueck 1.\n bei andere, gib zurueck 2.\n', LEVEL);
288
288
  assert.deepEqual(codes(r2), []);
289
289
  const cases = stmt(func(module, 'f'), 0, 'Match').cases;
290
+ // ADR 0055 #16:解析为成员的裸名产出 0 参 PatCtor
290
291
  const first = cases[0].pattern;
291
- assert.equal(first.name, 'High');
292
+ assert.deepEqual([first.kind, first.typeName, first.args], ['PatCtor', 'High', []]);
292
293
  assert.equal(first.origin?.written, 'Hoch');
293
294
  assert.equal(first.origin?.role, 'MEMBER_REF');
294
295
  assert.equal(cases[1].pattern.name, 'andere');
@@ -300,7 +301,7 @@ describe('resolveTypedReferences(R2)', () => {
300
301
  assert.deepEqual(codes(r2), []);
301
302
  const pat = stmt(func(module, 'f'), 1, 'Match').cases[0].pattern;
302
303
  assert.equal(pat.typeName, 'Driver');
303
- assert.deepEqual(pat.names, ['a']);
304
+ assert.deepEqual(pat.args.map((a) => a.name), ['a']);
304
305
  });
305
306
  it('主语未知、全部枚举成员与构造器中唯一 → 采用 + W801', () => {
306
307
  const { module, r2 } = run(MODULE + LEVEL_DECL +
@@ -309,7 +310,7 @@ describe('resolveTypedReferences(R2)', () => {
309
310
  assert.deepEqual(codes(r2), ["W801" /* ErrorCode.RESOLVED_WITHOUT_TYPE */, "W801" /* ErrorCode.RESOLVED_WITHOUT_TYPE */]);
310
311
  const cases = stmt(func(module, 'f'), 1, 'Match').cases;
311
312
  assert.equal(cases[0].pattern.typeName, 'High');
312
- assert.equal(cases[1].pattern.name, 'Low');
313
+ assert.equal(cases[1].pattern.typeName, 'Low');
313
314
  });
314
315
  it('主语未知、多个候选 → E806', () => {
315
316
  const { r2 } = run(MODULE + LEVEL_DECL + 'Definiere Rang als eines von Hoch, Mittel.\n\n' +
@@ -344,7 +345,7 @@ describe('resolveTypedReferences(R2)', () => {
344
345
  const ufcs = stmt(func(module, 'f'), 0, 'Let').expr;
345
346
  assert.deepEqual([nameOf(ufcs.target).name, nameOf(ufcs.args[0]).name], ['get', 'io']);
346
347
  });
347
- it('lambda:期望类型取 lambda 声明返回类型,捕获列表随解析结果改写', () => {
348
+ it('lambda:期望类型取 lambda 声明返回类型,枚举成员不进捕获列表', () => {
348
349
  const { module, r2 } = run('Module m.\n\nDefine Stufe as one of Hoch, Niedrig.\n\n' +
349
350
  'Rule f given outer as Int, produce Int:\n' +
350
351
  ' Let g be function with x as Int, produce Stufe:\n' +
@@ -355,7 +356,8 @@ describe('resolveTypedReferences(R2)', () => {
355
356
  const lambda = stmt(func(module, 'f'), 0, 'Let').expr;
356
357
  const ret = lambda.body.statements[1];
357
358
  assert.equal(nameOf(ret.expr).name, 'High');
358
- assert.deepEqual(lambda.captures, ['outer', 'High']);
359
+ // 枚举成员不是外层局部,lowering 就不把它放进 captures(ADR 0056 §4.2),R2 无须改写
360
+ assert.deepEqual(lambda.captures, ['outer']);
359
361
  });
360
362
  });
361
363
  describe('裁决 R19:未知调用目标交由类型检查', () => {
@@ -398,11 +400,11 @@ describe('resolveTypedReferences(R2)', () => {
398
400
  collect(module, names, origins);
399
401
  assert.deepEqual(names.filter((n) => LOCALIZED.includes(n)), []);
400
402
  for (const o of origins) {
401
- if (o?.written === undefined && o?.role === undefined)
403
+ if (o.written === null && o.role === null)
402
404
  continue;
403
- assert.ok(o.written !== undefined && o.role !== undefined, '两者同时出现');
405
+ assert.ok(o.written !== null && o.role !== null, '两者同时出现');
404
406
  }
405
- const withWritten = origins.filter((o) => o?.written !== undefined).map((o) => o.written);
407
+ const withWritten = origins.filter((o) => o.written !== null).map((o) => o.written);
406
408
  assert.ok(withWritten.includes('fahrer.alter'));
407
409
  assert.ok(withWritten.includes('Hoch'));
408
410
  const f = func(module, 'check');
@@ -410,7 +412,7 @@ describe('resolveTypedReferences(R2)', () => {
410
412
  assert.equal(f.origin?.role, 'FUNC_DECL');
411
413
  // 局部名 fahrer 未改写:其节点 origin 不带 written
412
414
  const let0 = stmt(f, 0, 'Let');
413
- assert.equal(let0.origin?.written, undefined);
415
+ assert.equal(let0.origin.written, null);
414
416
  });
415
417
  it('函数签名的参数 / 返回类型名记录 written/role(与 Java 对齐)', () => {
416
418
  const { module, r1, r2 } = run(SOURCE, VOCAB);
@@ -425,18 +427,20 @@ describe('resolveTypedReferences(R2)', () => {
425
427
  assert.equal(ret.origin?.written, 'Stufe');
426
428
  assert.equal(ret.origin?.role, 'TYPE');
427
429
  });
428
- it('函数签名中未改写的类型名不新增 origin(无词汇 IR 不变)', () => {
430
+ it('函数签名中未改写的类型名:origin 恒输出,written / role 为 null(ADR 0055 #17)', () => {
429
431
  const { module } = run('Module m.\n\nDefine Driver has age as Int.\n\nRule f given d as Driver, produce Int:\n Return d.age.\n', DRIVER, EN_US);
430
432
  const f = func(module, 'f');
431
- assert.equal(f.params[0].type.origin, undefined);
432
- assert.equal(f.ret.origin, undefined);
433
+ for (const t of [f.params[0].type, f.ret]) {
434
+ assert.ok(t.origin.start.line > 0);
435
+ assert.deepEqual([t.origin.written, t.origin.role], [null, null]);
436
+ }
433
437
  });
434
438
  it('规范名直写的源码:origin 不带 written/role', () => {
435
439
  const { module, r2 } = run('Module m.\n\nDefine Driver has age as Int.\n\nRule f given d as Driver, produce Int:\n Return d.age.\n', DRIVER, EN_US);
436
440
  assert.deepEqual(codes(r2), []);
437
441
  const origins = [];
438
442
  collect(module, [], origins);
439
- assert.deepEqual(origins.filter((o) => o?.written !== undefined || o?.role !== undefined), []);
443
+ assert.deepEqual(origins.filter((o) => o.written !== null || o.role !== null), []);
440
444
  });
441
445
  it('任一 E8xx 时 diagnostics 非空(调用方据此不发出 IR)', () => {
442
446
  const { r2 } = run(MODULE + DRIVER_DECL + 'Regel f gegeben x als Fahrer, liefert Ganzzahl:\n gib zurueck x.gewicht.\n', DRIVER);
@@ -463,7 +467,7 @@ describe('resolveTypedReferences(R2)', () => {
463
467
  assert.deepEqual([...codes(r1), ...codes(r2)], []);
464
468
  assert.equal(nameOf(stmt(func(module, 'f'), 1, 'Let').expr).name, 'y.age');
465
469
  const cases = stmt(func(module, 'f'), 2, 'Match').cases;
466
- assert.equal(cases[0].pattern.name, 'Gold');
470
+ assert.equal(cases[0].pattern.typeName, 'Gold');
467
471
  assert.equal(cases[1].pattern.typeName, 'Silver');
468
472
  });
469
473
  it('2. 无期望类型的裸成员规范名 → 原样接受;期望枚举下写法即规范名不改写', () => {
@@ -475,7 +479,7 @@ describe('resolveTypedReferences(R2)', () => {
475
479
  assert.equal(nameOf(returned(func(module, 'g'), 0).args[1]).name, 'Silver');
476
480
  const h = nameOf(returned(func(module, 'h'), 0));
477
481
  assert.equal(h.name, 'Gold');
478
- assert.equal(h.origin?.written, undefined);
482
+ assert.equal(h.origin.written, null);
479
483
  });
480
484
  it('2. 成员规范名属于多个枚举且无期望类型 → E804', () => {
481
485
  const { r2 } = run(TIER + 'Define Medal as one of Gold, Bronze.\n\nRule f given t as Text:\n Return Gold.\n', [], EN_US);
@@ -566,7 +570,7 @@ describe('resolveTypedReferences(R2)', () => {
566
570
  it('未注解主语上的裸成员模式 → 采用 + W801', () => {
567
571
  const { module, r2 } = run(MODULE + LEVEL_DECL + 'Regel f gegeben s, liefert Ganzzahl:\n pruefe s:\n bei Hoch, gib zurueck 1.\n bei andere, gib zurueck 2.\n', LEVEL);
568
572
  assert.deepEqual(codes(r2), ["W801" /* ErrorCode.RESOLVED_WITHOUT_TYPE */]);
569
- assert.equal(stmt(func(module, 'f'), 0, 'Match').cases[0].pattern.name, 'High');
573
+ assert.equal(stmt(func(module, 'f'), 0, 'Match').cases[0].pattern.typeName, 'High');
570
574
  });
571
575
  it('未注解 lambda 参数上的路径 → 全局候选采用 + W801(裁决 R31)', () => {
572
576
  const { module, r2 } = run('Module m.\n\nDefine Fahrer has alter as Int.\n\n' +
@@ -590,8 +594,8 @@ describe('resolveTypedReferences(R2)', () => {
590
594
  const ast = parse(MODULE + DRIVER_DECL + 'Regel f gegeben x als Fahrer, liefert Ganzzahl:\n gib zurueck x.alter.\n');
591
595
  const core = lowerModule(ast);
592
596
  const json = JSON.stringify(core);
593
- assert.ok(!json.includes('"written"'));
594
- assert.ok(!json.includes('"role"'));
597
+ assert.ok(!json.includes('"written":"'));
598
+ assert.ok(!json.includes('"role":"'));
595
599
  assert.equal(nameOf(returned(func(core, 'f'), 0)).name, 'x.alter');
596
600
  assert.equal(core.decls[0].name, 'Fahrer');
597
601
  });