@aster-cloud/aster-lang-ts 1.6.0 → 2.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 (345) hide show
  1. package/CHANGELOG.md +37 -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/golden.js +1 -1
  11. package/dist/scripts/golden.js.map +1 -1
  12. package/dist/src/ast/ast_visitor.d.ts +27 -27
  13. package/dist/src/ast/ast_visitor.d.ts.map +1 -1
  14. package/dist/src/ast/ast_visitor.js.map +1 -1
  15. package/dist/src/browser.d.ts +7 -0
  16. package/dist/src/browser.d.ts.map +1 -1
  17. package/dist/src/browser.js +6 -1
  18. package/dist/src/browser.js.map +1 -1
  19. package/dist/src/cli/policy-converter.js +6 -10
  20. package/dist/src/cli/policy-converter.js.map +1 -1
  21. package/dist/src/cli/utils/core-ir-file.d.ts +8 -0
  22. package/dist/src/cli/utils/core-ir-file.d.ts.map +1 -0
  23. package/dist/src/cli/utils/core-ir-file.js +29 -0
  24. package/dist/src/cli/utils/core-ir-file.js.map +1 -0
  25. package/dist/src/cnl-printer.d.ts.map +1 -1
  26. package/dist/src/cnl-printer.js +13 -3
  27. package/dist/src/cnl-printer.js.map +1 -1
  28. package/dist/src/compile-pipeline.js +1 -1
  29. package/dist/src/compile-pipeline.js.map +1 -1
  30. package/dist/src/config/lexicons/diagnostic-overlays.generated.d.ts.map +1 -1
  31. package/dist/src/config/lexicons/diagnostic-overlays.generated.js +18 -6
  32. package/dist/src/config/lexicons/diagnostic-overlays.generated.js.map +1 -1
  33. package/dist/src/core/canonical-decimal.d.ts +3 -0
  34. package/dist/src/core/canonical-decimal.d.ts.map +1 -0
  35. package/dist/src/core/canonical-decimal.js +19 -0
  36. package/dist/src/core/canonical-decimal.js.map +1 -0
  37. package/dist/src/core/canonical-json.d.ts +59 -0
  38. package/dist/src/core/canonical-json.d.ts.map +1 -0
  39. package/dist/src/core/canonical-json.js +250 -0
  40. package/dist/src/core/canonical-json.js.map +1 -0
  41. package/dist/src/core/core-ir-v2.generated.d.ts +807 -0
  42. package/dist/src/core/core-ir-v2.generated.d.ts.map +1 -0
  43. package/dist/src/core/core-ir-v2.generated.js +6 -0
  44. package/dist/src/core/core-ir-v2.generated.js.map +1 -0
  45. package/dist/src/core/core-ir-v2.schema.generated.d.ts +6 -0
  46. package/dist/src/core/core-ir-v2.schema.generated.d.ts.map +1 -0
  47. package/dist/src/core/core-ir-v2.schema.generated.js +2636 -0
  48. package/dist/src/core/core-ir-v2.schema.generated.js.map +1 -0
  49. package/dist/src/core/core_ir.d.ts +27 -11
  50. package/dist/src/core/core_ir.d.ts.map +1 -1
  51. package/dist/src/core/core_ir.js +118 -63
  52. package/dist/src/core/core_ir.js.map +1 -1
  53. package/dist/src/core/index.d.ts +4 -3
  54. package/dist/src/core/index.d.ts.map +1 -1
  55. package/dist/src/core/index.js +3 -2
  56. package/dist/src/core/index.js.map +1 -1
  57. package/dist/src/core/inferred_fields.d.ts +9 -11
  58. package/dist/src/core/inferred_fields.d.ts.map +1 -1
  59. package/dist/src/core/inferred_fields.js +7 -28
  60. package/dist/src/core/inferred_fields.js.map +1 -1
  61. package/dist/src/core/interpreter.js +16 -35
  62. package/dist/src/core/interpreter.js.map +1 -1
  63. package/dist/src/core/pretty_core.d.ts.map +1 -1
  64. package/dist/src/core/pretty_core.js +6 -10
  65. package/dist/src/core/pretty_core.js.map +1 -1
  66. package/dist/src/core/read-core-ir.d.ts +15 -0
  67. package/dist/src/core/read-core-ir.d.ts.map +1 -0
  68. package/dist/src/core/read-core-ir.js +69 -0
  69. package/dist/src/core/read-core-ir.js.map +1 -0
  70. package/dist/src/core/resolution-mark.d.ts +3 -4
  71. package/dist/src/core/resolution-mark.d.ts.map +1 -1
  72. package/dist/src/core/resolution-mark.js +2 -3
  73. package/dist/src/core/resolution-mark.js.map +1 -1
  74. package/dist/src/core/resolve-typed-references.d.ts.map +1 -1
  75. package/dist/src/core/resolve-typed-references.js +11 -27
  76. package/dist/src/core/resolve-typed-references.js.map +1 -1
  77. package/dist/src/core/serialize-core-ir.d.ts +13 -0
  78. package/dist/src/core/serialize-core-ir.d.ts.map +1 -0
  79. package/dist/src/core/serialize-core-ir.js +125 -0
  80. package/dist/src/core/serialize-core-ir.js.map +1 -0
  81. package/dist/src/core/visitor.d.ts.map +1 -1
  82. package/dist/src/core/visitor.js +4 -1
  83. package/dist/src/core/visitor.js.map +1 -1
  84. package/dist/src/diagnostics/error_codes.d.ts +2 -0
  85. package/dist/src/diagnostics/error_codes.d.ts.map +1 -1
  86. package/dist/src/diagnostics/error_codes.js +16 -0
  87. package/dist/src/diagnostics/error_codes.js.map +1 -1
  88. package/dist/src/effects/declared-effects.d.ts +17 -0
  89. package/dist/src/effects/declared-effects.d.ts.map +1 -0
  90. package/dist/src/effects/declared-effects.js +27 -0
  91. package/dist/src/effects/declared-effects.js.map +1 -0
  92. package/dist/src/effects/effect_inference.d.ts.map +1 -1
  93. package/dist/src/effects/effect_inference.js +14 -10
  94. package/dist/src/effects/effect_inference.js.map +1 -1
  95. package/dist/src/effects/effect_inference_browser.d.ts.map +1 -1
  96. package/dist/src/effects/effect_inference_browser.js +14 -9
  97. package/dist/src/effects/effect_inference_browser.js.map +1 -1
  98. package/dist/src/frontend/keyword-translator.d.ts.map +1 -1
  99. package/dist/src/frontend/keyword-translator.js +3 -0
  100. package/dist/src/frontend/keyword-translator.js.map +1 -1
  101. package/dist/src/frontend/lexer.d.ts.map +1 -1
  102. package/dist/src/frontend/lexer.js +7 -3
  103. package/dist/src/frontend/lexer.js.map +1 -1
  104. package/dist/src/frontend/resolve-declarations.d.ts.map +1 -1
  105. package/dist/src/frontend/resolve-declarations.js +3 -23
  106. package/dist/src/frontend/resolve-declarations.js.map +1 -1
  107. package/dist/src/governance/input-refs.js +5 -8
  108. package/dist/src/governance/input-refs.js.map +1 -1
  109. package/dist/src/index.d.ts +5 -0
  110. package/dist/src/index.d.ts.map +1 -1
  111. package/dist/src/index.js +4 -0
  112. package/dist/src/index.js.map +1 -1
  113. package/dist/src/jvm/emitter.d.ts.map +1 -1
  114. package/dist/src/jvm/emitter.js +20 -29
  115. package/dist/src/jvm/emitter.js.map +1 -1
  116. package/dist/src/lower_to_core.d.ts +2 -1
  117. package/dist/src/lower_to_core.d.ts.map +1 -1
  118. package/dist/src/lower_to_core.js +150 -300
  119. package/dist/src/lower_to_core.js.map +1 -1
  120. package/dist/src/lsp/pii_diagnostics.d.ts.map +1 -1
  121. package/dist/src/lsp/pii_diagnostics.js +3 -8
  122. package/dist/src/lsp/pii_diagnostics.js.map +1 -1
  123. package/dist/src/mapping/mapping-ir.d.ts +3 -3
  124. package/dist/src/mapping/mapping-ir.js +3 -3
  125. package/dist/src/nodeid/node-id-map.d.ts +6 -15
  126. package/dist/src/nodeid/node-id-map.d.ts.map +1 -1
  127. package/dist/src/nodeid/node-id-map.js +6 -15
  128. package/dist/src/nodeid/node-id-map.js.map +1 -1
  129. package/dist/src/parser/constraint-parser.js +25 -6
  130. package/dist/src/parser/constraint-parser.js.map +1 -1
  131. package/dist/src/parser/decl-parser.d.ts.map +1 -1
  132. package/dist/src/parser/decl-parser.js +30 -59
  133. package/dist/src/parser/decl-parser.js.map +1 -1
  134. package/dist/src/parser/expr-stmt-parser.d.ts.map +1 -1
  135. package/dist/src/parser/expr-stmt-parser.js +3 -2
  136. package/dist/src/parser/expr-stmt-parser.js.map +1 -1
  137. package/dist/src/parser/field-variant-parser.d.ts.map +1 -1
  138. package/dist/src/parser/field-variant-parser.js +6 -0
  139. package/dist/src/parser/field-variant-parser.js.map +1 -1
  140. package/dist/src/parser/parse-issue.d.ts +2 -0
  141. package/dist/src/parser/parse-issue.d.ts.map +1 -1
  142. package/dist/src/parser/parse-issue.js +2 -0
  143. package/dist/src/parser/parse-issue.js.map +1 -1
  144. package/dist/src/parser/type-parser.d.ts +1 -1
  145. package/dist/src/parser/type-parser.d.ts.map +1 -1
  146. package/dist/src/parser/type-parser.js +19 -2
  147. package/dist/src/parser/type-parser.js.map +1 -1
  148. package/dist/src/stability/stability_gate.d.ts +1 -1
  149. package/dist/src/stability/stability_gate.d.ts.map +1 -1
  150. package/dist/src/stability/stability_gate.js +2 -26
  151. package/dist/src/stability/stability_gate.js.map +1 -1
  152. package/dist/src/typecheck/async.d.ts.map +1 -1
  153. package/dist/src/typecheck/async.js +4 -1
  154. package/dist/src/typecheck/async.js.map +1 -1
  155. package/dist/src/typecheck/browser.d.ts.map +1 -1
  156. package/dist/src/typecheck/browser.js +4 -3
  157. package/dist/src/typecheck/browser.js.map +1 -1
  158. package/dist/src/typecheck/capabilities.d.ts.map +1 -1
  159. package/dist/src/typecheck/capabilities.js +3 -2
  160. package/dist/src/typecheck/capabilities.js.map +1 -1
  161. package/dist/src/typecheck/context.d.ts +5 -5
  162. package/dist/src/typecheck/context.d.ts.map +1 -1
  163. package/dist/src/typecheck/context.js.map +1 -1
  164. package/dist/src/typecheck/diagnostics.d.ts +2 -2
  165. package/dist/src/typecheck/diagnostics.d.ts.map +1 -1
  166. package/dist/src/typecheck/diagnostics.js.map +1 -1
  167. package/dist/src/typecheck/effects.js +7 -7
  168. package/dist/src/typecheck/effects.js.map +1 -1
  169. package/dist/src/typecheck/expression.d.ts +4 -4
  170. package/dist/src/typecheck/expression.d.ts.map +1 -1
  171. package/dist/src/typecheck/expression.js +1 -1
  172. package/dist/src/typecheck/expression.js.map +1 -1
  173. package/dist/src/typecheck/generics.d.ts +2 -2
  174. package/dist/src/typecheck/generics.d.ts.map +1 -1
  175. package/dist/src/typecheck/generics.js +23 -12
  176. package/dist/src/typecheck/generics.js.map +1 -1
  177. package/dist/src/typecheck/governance.d.ts +1 -1
  178. package/dist/src/typecheck/governance.d.ts.map +1 -1
  179. package/dist/src/typecheck/governance.js +1 -1
  180. package/dist/src/typecheck/governance.js.map +1 -1
  181. package/dist/src/typecheck/module.d.ts.map +1 -1
  182. package/dist/src/typecheck/module.js +7 -6
  183. package/dist/src/typecheck/module.js.map +1 -1
  184. package/dist/src/typecheck/pattern.d.ts +2 -2
  185. package/dist/src/typecheck/pattern.d.ts.map +1 -1
  186. package/dist/src/typecheck/pattern.js +12 -46
  187. package/dist/src/typecheck/pattern.js.map +1 -1
  188. package/dist/src/typecheck/pure.d.ts +19 -19
  189. package/dist/src/typecheck/pure.d.ts.map +1 -1
  190. package/dist/src/typecheck/pure.js.map +1 -1
  191. package/dist/src/typecheck/statement.d.ts +6 -6
  192. package/dist/src/typecheck/statement.d.ts.map +1 -1
  193. package/dist/src/typecheck/statement.js +17 -20
  194. package/dist/src/typecheck/statement.js.map +1 -1
  195. package/dist/src/typecheck/symbol_table.d.ts +2 -2
  196. package/dist/src/typecheck/symbol_table.d.ts.map +1 -1
  197. package/dist/src/typecheck/symbol_table.js.map +1 -1
  198. package/dist/src/typecheck/type_system.d.ts +4 -4
  199. package/dist/src/typecheck/type_system.d.ts.map +1 -1
  200. package/dist/src/typecheck/type_system.js +1 -1
  201. package/dist/src/typecheck/type_system.js.map +1 -1
  202. package/dist/src/typecheck/workflow.d.ts +3 -3
  203. package/dist/src/typecheck/workflow.d.ts.map +1 -1
  204. package/dist/src/typecheck/workflow.js.map +1 -1
  205. package/dist/src/typecheck-pii.d.ts.map +1 -1
  206. package/dist/src/typecheck-pii.js +2 -13
  207. package/dist/src/typecheck-pii.js.map +1 -1
  208. package/dist/src/types.d.ts +160 -172
  209. package/dist/src/types.d.ts.map +1 -1
  210. package/dist/src/types.js.map +1 -1
  211. package/dist/src/version.d.ts +3 -3
  212. package/dist/src/version.js +3 -3
  213. package/dist/test/helpers/core-ir-v2.d.ts +5 -0
  214. package/dist/test/helpers/core-ir-v2.d.ts.map +1 -0
  215. package/dist/test/helpers/core-ir-v2.js +123 -0
  216. package/dist/test/helpers/core-ir-v2.js.map +1 -0
  217. package/dist/test/helpers/locales-core-ir.d.ts +7 -0
  218. package/dist/test/helpers/locales-core-ir.d.ts.map +1 -0
  219. package/dist/test/helpers/locales-core-ir.js +15 -0
  220. package/dist/test/helpers/locales-core-ir.js.map +1 -0
  221. package/dist/test/helpers/test-factories.d.ts +5 -5
  222. package/dist/test/helpers/test-factories.d.ts.map +1 -1
  223. package/dist/test/helpers/test-factories.js +9 -8
  224. package/dist/test/helpers/test-factories.js.map +1 -1
  225. package/dist/test/integration/pipeline/pipeline.test.js +1 -1
  226. package/dist/test/integration/pipeline/pipeline.test.js.map +1 -1
  227. package/dist/test/integration/vocabulary-resolution.test.js +1 -1
  228. package/dist/test/integration/vocabulary-resolution.test.js.map +1 -1
  229. package/dist/test/regression/type-checker-golden.test.js +1 -1
  230. package/dist/test/regression/type-checker-golden.test.js.map +1 -1
  231. package/dist/test/type-checker/pii-propagation.test.js +7 -6
  232. package/dist/test/type-checker/pii-propagation.test.js.map +1 -1
  233. package/dist/test/types/core-ir-v2.test-d.d.ts +28 -0
  234. package/dist/test/types/core-ir-v2.test-d.d.ts.map +1 -0
  235. package/dist/test/types/core-ir-v2.test-d.js +5 -0
  236. package/dist/test/types/core-ir-v2.test-d.js.map +1 -0
  237. package/dist/test/unit/browser/typecheck-browser-pii-failure.test.js +4 -3
  238. package/dist/test/unit/browser/typecheck-browser-pii-failure.test.js.map +1 -1
  239. package/dist/test/unit/canonicalizer/article-declaration-names.test.js +1 -1
  240. package/dist/test/unit/canonicalizer/article-declaration-names.test.js.map +1 -1
  241. package/dist/test/unit/canonicalizer/chinese-function-syntax.test.js +2 -1
  242. package/dist/test/unit/canonicalizer/chinese-function-syntax.test.js.map +1 -1
  243. package/dist/test/unit/core/canonical-json.test.d.ts +2 -0
  244. package/dist/test/unit/core/canonical-json.test.d.ts.map +1 -0
  245. package/dist/test/unit/core/canonical-json.test.js +38 -0
  246. package/dist/test/unit/core/canonical-json.test.js.map +1 -0
  247. package/dist/test/unit/core/caseless-pattern-name.test.js +6 -8
  248. package/dist/test/unit/core/caseless-pattern-name.test.js.map +1 -1
  249. package/dist/test/unit/core/core-ir-conformance.test.d.ts +2 -0
  250. package/dist/test/unit/core/core-ir-conformance.test.d.ts.map +1 -0
  251. package/dist/test/unit/core/core-ir-conformance.test.js +39 -0
  252. package/dist/test/unit/core/core-ir-conformance.test.js.map +1 -0
  253. package/dist/test/unit/core/core-ir-schema-parity.test.d.ts +2 -0
  254. package/dist/test/unit/core/core-ir-schema-parity.test.d.ts.map +1 -0
  255. package/dist/test/unit/core/core-ir-schema-parity.test.js +25 -0
  256. package/dist/test/unit/core/core-ir-schema-parity.test.js.map +1 -0
  257. package/dist/test/unit/core/core-ir-v2-outputs.test.d.ts +2 -0
  258. package/dist/test/unit/core/core-ir-v2-outputs.test.d.ts.map +1 -0
  259. package/dist/test/unit/core/core-ir-v2-outputs.test.js +128 -0
  260. package/dist/test/unit/core/core-ir-v2-outputs.test.js.map +1 -0
  261. package/dist/test/unit/core/read-core-ir.test.d.ts +2 -0
  262. package/dist/test/unit/core/read-core-ir.test.d.ts.map +1 -0
  263. package/dist/test/unit/core/read-core-ir.test.js +129 -0
  264. package/dist/test/unit/core/read-core-ir.test.js.map +1 -0
  265. package/dist/test/unit/core/resolve-typed-references.test.js +19 -16
  266. package/dist/test/unit/core/resolve-typed-references.test.js.map +1 -1
  267. package/dist/test/unit/diagnostics/lowering-diagnostics-parity.test.js +5 -5
  268. package/dist/test/unit/diagnostics/lowering-diagnostics-parity.test.js.map +1 -1
  269. package/dist/test/unit/diagnostics/parse-diagnostics-parity.test.js +3 -2
  270. package/dist/test/unit/diagnostics/parse-diagnostics-parity.test.js.map +1 -1
  271. package/dist/test/unit/effect/effect-inference.test.js +17 -13
  272. package/dist/test/unit/effect/effect-inference.test.js.map +1 -1
  273. package/dist/test/unit/emitter/emitter.test.js +47 -46
  274. package/dist/test/unit/emitter/emitter.test.js.map +1 -1
  275. package/dist/test/unit/formatter-corpus-roundtrip.test.js +5 -1
  276. package/dist/test/unit/formatter-corpus-roundtrip.test.js.map +1 -1
  277. package/dist/test/unit/formatter-roundtrip.test.js +5 -4
  278. package/dist/test/unit/formatter-roundtrip.test.js.map +1 -1
  279. package/dist/test/unit/frontend/resolve-declarations.test.js +13 -14
  280. package/dist/test/unit/frontend/resolve-declarations.test.js.map +1 -1
  281. package/dist/test/unit/governance/governance-check.test.js +1 -1
  282. package/dist/test/unit/governance/governance-check.test.js.map +1 -1
  283. package/dist/test/unit/governance/input-refs-parity.test.js +1 -1
  284. package/dist/test/unit/governance/input-refs-parity.test.js.map +1 -1
  285. package/dist/test/unit/governance/input-refs.test.js +2 -2
  286. package/dist/test/unit/governance/input-refs.test.js.map +1 -1
  287. package/dist/test/unit/governance/no-profile-ir-unchanged.test.js +6 -6
  288. package/dist/test/unit/governance/no-profile-ir-unchanged.test.js.map +1 -1
  289. package/dist/test/unit/interpreter/interpreter.test.js +23 -21
  290. package/dist/test/unit/interpreter/interpreter.test.js.map +1 -1
  291. package/dist/test/unit/interpreter/scope-writeback.test.js +28 -27
  292. package/dist/test/unit/interpreter/scope-writeback.test.js.map +1 -1
  293. package/dist/test/unit/keyword-aliases.test.js +1 -1
  294. package/dist/test/unit/lowering/core-ir-v2.test.d.ts +2 -0
  295. package/dist/test/unit/lowering/core-ir-v2.test.d.ts.map +1 -0
  296. package/dist/test/unit/lowering/core-ir-v2.test.js +253 -0
  297. package/dist/test/unit/lowering/core-ir-v2.test.js.map +1 -0
  298. package/dist/test/unit/lowering/lowering.test.js +19 -14
  299. package/dist/test/unit/lowering/lowering.test.js.map +1 -1
  300. package/dist/test/unit/lsp/pii-diagnostics.test.js +33 -30
  301. package/dist/test/unit/lsp/pii-diagnostics.test.js.map +1 -1
  302. package/dist/test/unit/lsp/utils.test.js +5 -4
  303. package/dist/test/unit/lsp/utils.test.js.map +1 -1
  304. package/dist/test/unit/parser/effect-unknown-name.test.js +7 -7
  305. package/dist/test/unit/parser/effect-unknown-name.test.js.map +1 -1
  306. package/dist/test/unit/parser/entry-annotations.test.js +2 -1
  307. package/dist/test/unit/parser/entry-annotations.test.js.map +1 -1
  308. package/dist/test/unit/parser/func-type.test.js +3 -3
  309. package/dist/test/unit/parser/func-type.test.js.map +1 -1
  310. package/dist/test/unit/parser/governance-sugar.test.js +4 -4
  311. package/dist/test/unit/parser/governance-sugar.test.js.map +1 -1
  312. package/dist/test/unit/parser/parser.test.js +5 -4
  313. package/dist/test/unit/parser/parser.test.js.map +1 -1
  314. package/dist/test/unit/rule-call-checks.test.js +2 -1
  315. package/dist/test/unit/rule-call-checks.test.js.map +1 -1
  316. package/dist/test/unit/typecheck/async-discipline-extended.test.js +11 -10
  317. package/dist/test/unit/typecheck/async-discipline-extended.test.js.map +1 -1
  318. package/dist/test/unit/typecheck/effect-prefix-injection.test.js +3 -2
  319. package/dist/test/unit/typecheck/effect-prefix-injection.test.js.map +1 -1
  320. package/dist/test/unit/typecheck/function-return-inference.test.js +33 -32
  321. package/dist/test/unit/typecheck/function-return-inference.test.js.map +1 -1
  322. package/dist/test/unit/typecheck/pii-cross-runtime-conformance.test.js +5 -4
  323. package/dist/test/unit/typecheck/pii-cross-runtime-conformance.test.js.map +1 -1
  324. package/dist/test/unit/typecheck/regression-fixes.test.js +110 -112
  325. package/dist/test/unit/typecheck/regression-fixes.test.js.map +1 -1
  326. package/dist/test/unit/typecheck/symbol-table.test.js +3 -2
  327. package/dist/test/unit/typecheck/symbol-table.test.js.map +1 -1
  328. package/dist/test/unit/typecheck/type-system-extended.test.js +6 -5
  329. package/dist/test/unit/typecheck/type-system-extended.test.js.map +1 -1
  330. package/dist/test/unit/typecheck/type-system.test.js +20 -19
  331. package/dist/test/unit/typecheck/type-system.test.js.map +1 -1
  332. package/dist/test/unit/typecheck/typecheck-advanced.test.js +19 -18
  333. package/dist/test/unit/typecheck/typecheck-advanced.test.js.map +1 -1
  334. package/dist/test/unit/typecheck/untyped-field-dynamic.test.js +6 -4
  335. package/dist/test/unit/typecheck/untyped-field-dynamic.test.js.map +1 -1
  336. package/dist/test/unit/version.test.js +3 -3
  337. package/package.json +4 -3
  338. package/dist/src/core/core_ir_json.d.ts +0 -62
  339. package/dist/src/core/core_ir_json.d.ts.map +0 -1
  340. package/dist/src/core/core_ir_json.js +0 -81
  341. package/dist/src/core/core_ir_json.js.map +0 -1
  342. package/dist/test/unit/core_ir_json/core_ir_json.test.d.ts +0 -2
  343. package/dist/test/unit/core_ir_json/core_ir_json.test.d.ts.map +0 -1
  344. package/dist/test/unit/core_ir_json/core_ir_json.test.js +0 -218
  345. package/dist/test/unit/core_ir_json/core_ir_json.test.js.map +0 -1
@@ -0,0 +1,3 @@
1
+ /** 把字面量原文(可带符号与指数,如 `-0.0`、`1e-7`、`1E3`)转成规范十进制串。 */
2
+ export declare function canonicalDecimalFromLiteral(raw: string): string;
3
+ //# sourceMappingURL=canonical-decimal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-decimal.d.ts","sourceRoot":"","sources":["../../../src/core/canonical-decimal.ts"],"names":[],"mappings":"AAUA,qDAAqD;AACrD,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO/D"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 源码数值字面量 → 规范十进制串(ADR 0055 §5),用于 `Double.value` 与 `Range.min/max`。
3
+ *
4
+ * 规则:无指数、无前导零、无尾随零,小数部分全零时省略小数点,`-0` 归一为 `"0"`。
5
+ * 结果满足 schema `$defs/CanonicalDecimal` 的 pattern。值取自字面量**原文**,经 decimal.js
6
+ * 任意精度十进制求出,不经二进制浮点:`123456789012345678901.5` 原样保留,经 double 则会变成
7
+ * `123456789012345680000`。与 Java 侧 `BigDecimal.stripTrailingZeros().toPlainString()` 对应。
8
+ */
9
+ import Decimal from 'decimal.js';
10
+ /** 把字面量原文(可带符号与指数,如 `-0.0`、`1e-7`、`1E3`)转成规范十进制串。 */
11
+ export function canonicalDecimalFromLiteral(raw) {
12
+ const value = new Decimal(raw);
13
+ if (!value.isFinite()) {
14
+ throw new RangeError(`数值字面量不是有限值:${raw}`);
15
+ }
16
+ // decimal.js 的 toFixed() 不带参数时按普通记数法输出全部有效位且不舍入,已去尾随零。
17
+ return value.isZero() ? '0' : value.toFixed();
18
+ }
19
+ //# sourceMappingURL=canonical-decimal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-decimal.js","sourceRoot":"","sources":["../../../src/core/canonical-decimal.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,OAAO,MAAM,YAAY,CAAC;AAEjC,qDAAqD;AACrD,MAAM,UAAU,2BAA2B,CAAC,GAAW;IACrD,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,UAAU,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,uDAAuD;IACvD,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;AAChD,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Canonical JSON 序列化(ADR 0030 附录 A.2;Core IR v2 规范字节,ADR 0055 §5)。
3
+ *
4
+ * 从 aster-cloud `src/lib/canonical-json.ts` 移植,与 core `aster.core.canonical.CanonicalJson`
5
+ * 字节一致,由 test/unit/core/canonical-json.test.ts 用 core `CanonicalJsonParityTest` 的同一份
6
+ * golden 夹具守护。与 cloud 原件的唯一差别:不含 `canonicalHash`(它依赖 `node:crypto`,
7
+ * 本模块要进浏览器入口);需要哈希的调用方按 `sha256(CANONICALIZATION_VERSION + "\n" + canonicalJson(v))` 自行计算。
8
+ *
9
+ * 以下为 cloud 原件的说明——
10
+ *
11
+ * 决策级持久层的 `canonicalInputHash` / `canonicalOutputHash` / `traceHash` 都基于本模块:
12
+ * 只有在**确定性的** canonical 形式下逐字节比对才有意义(否则 key 顺序 / Decimal 表示 /
13
+ * null 处理的差异会污染 old↔new toolchain 的漂移判定,把无害差异误报成 regression)。
14
+ *
15
+ * 设计铁律(ADR 附录 A.2):
16
+ * - object key 按 Unicode code point 升序;array 保序。
17
+ * - `null` 显式输出;**missing ≠ null**;不丢空对象 / 空数组 / false / 0 / ""。
18
+ * - string 原值不做 trim / case-fold。
19
+ * - number 须 finite;NaN / Infinity 拒绝(NON_CANONICAL_NUMBER)。
20
+ * - Decimal **类型感知**:仅当 typeCtx 声明某路径为 Decimal 时才做 decimal canonical
21
+ * (无 exponent / 无前导 + / 无无意义前导零 / 无 trailing zero / `-0`→`0` / 整数无 `.0`)。
22
+ * - JSON `1` ≠ string `"1"`(不全局转换数字字符串)。
23
+ *
24
+ * 纯模块:无 Node-only API 依赖,无 DB / 网络 / 环境读取。
25
+ */
26
+ /** 当前 canonical 算法版本,写进 hash 前缀 + Execution.canonicalizationVersion。变更算法必 bump。 */
27
+ export declare const CANONICALIZATION_VERSION = "aster-canonical-json/v1";
28
+ /** canonical 化失败原因(对齐 Execution.replayabilityReasons 的 NON_REPLAYABLE 语义)。 */
29
+ export type CanonicalErrorReason = 'NON_CANONICAL_NUMBER' | 'NON_INTEGER_NUMBER' | 'UNSUPPORTED_VALUE' | 'DECIMAL_TOO_LARGE';
30
+ export declare class CanonicalJsonError extends Error {
31
+ readonly reason: CanonicalErrorReason;
32
+ /** 出错值所在的 JSON 路径(如 `input.amount`),便于诊断。 */
33
+ readonly path: string;
34
+ constructor(reason: CanonicalErrorReason, message: string,
35
+ /** 出错值所在的 JSON 路径(如 `input.amount`),便于诊断。 */
36
+ path: string);
37
+ }
38
+ /**
39
+ * 类型上下文:声明哪些字段路径是 Decimal,须做 decimal canonical。
40
+ *
41
+ * 路径用点号连接(array 元素用 `[]` 通配,如 `applicants[].income`)。M1 只支持
42
+ * 精确路径 + `[]` 通配;无 typeCtx 时所有 number 按 JSON number 处理(IEEE-754 规范化)。
43
+ * Decimal 值在 JSON 里应以 **string** 承载(避免 IEEE-754 精度损失),typeCtx 标注后
44
+ * 按 decimal 规范化;若声明为 Decimal 的路径出现 number,也接受并规范化其字符串形式。
45
+ */
46
+ export interface CanonicalTypeContext {
47
+ /** 声明为 Decimal 的字段路径集合(`[]` 表示任意 array 下标)。 */
48
+ decimalPaths: ReadonlySet<string>;
49
+ }
50
+ /** 按 Unicode code point 比较(正确处理代理对,避免 code unit 序在补充平面字符上的偏差)。 */
51
+ export declare function compareByCodePoint(a: string, b: string): number;
52
+ /**
53
+ * 把任意 JSON 值序列化为 canonical 字符串(确定性、跨实现可复现)。
54
+ * @throws CanonicalJsonError 遇到 NaN/Infinity/非法 Decimal/非 JSON 值。
55
+ */
56
+ export declare function canonicalJson(value: unknown, ctx?: CanonicalTypeContext): string;
57
+ /** 便捷构造 typeCtx(从 Decimal 路径数组)。 */
58
+ export declare function decimalTypeContext(decimalPaths: readonly string[]): CanonicalTypeContext;
59
+ //# sourceMappingURL=canonical-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-json.d.ts","sourceRoot":"","sources":["../../../src/core/canonical-json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,mFAAmF;AACnF,eAAO,MAAM,wBAAwB,4BAA4B,CAAC;AAElE,8EAA8E;AAC9E,MAAM,MAAM,oBAAoB,GAC5B,sBAAsB,GACtB,oBAAoB,GACpB,mBAAmB,GACnB,mBAAmB,CAAC;AASxB,qBAAa,kBAAmB,SAAQ,KAAK;aAEzB,MAAM,EAAE,oBAAoB;IAE5C,6CAA6C;aAC7B,IAAI,EAAE,MAAM;gBAHZ,MAAM,EAAE,oBAAoB,EAC5C,OAAO,EAAE,MAAM;IACf,6CAA6C;IAC7B,IAAI,EAAE,MAAM;CAK/B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACnC;AAuND,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAU/D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAEhF;AAED,oCAAoC;AACpC,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,oBAAoB,CAExF"}
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Canonical JSON 序列化(ADR 0030 附录 A.2;Core IR v2 规范字节,ADR 0055 §5)。
3
+ *
4
+ * 从 aster-cloud `src/lib/canonical-json.ts` 移植,与 core `aster.core.canonical.CanonicalJson`
5
+ * 字节一致,由 test/unit/core/canonical-json.test.ts 用 core `CanonicalJsonParityTest` 的同一份
6
+ * golden 夹具守护。与 cloud 原件的唯一差别:不含 `canonicalHash`(它依赖 `node:crypto`,
7
+ * 本模块要进浏览器入口);需要哈希的调用方按 `sha256(CANONICALIZATION_VERSION + "\n" + canonicalJson(v))` 自行计算。
8
+ *
9
+ * 以下为 cloud 原件的说明——
10
+ *
11
+ * 决策级持久层的 `canonicalInputHash` / `canonicalOutputHash` / `traceHash` 都基于本模块:
12
+ * 只有在**确定性的** canonical 形式下逐字节比对才有意义(否则 key 顺序 / Decimal 表示 /
13
+ * null 处理的差异会污染 old↔new toolchain 的漂移判定,把无害差异误报成 regression)。
14
+ *
15
+ * 设计铁律(ADR 附录 A.2):
16
+ * - object key 按 Unicode code point 升序;array 保序。
17
+ * - `null` 显式输出;**missing ≠ null**;不丢空对象 / 空数组 / false / 0 / ""。
18
+ * - string 原值不做 trim / case-fold。
19
+ * - number 须 finite;NaN / Infinity 拒绝(NON_CANONICAL_NUMBER)。
20
+ * - Decimal **类型感知**:仅当 typeCtx 声明某路径为 Decimal 时才做 decimal canonical
21
+ * (无 exponent / 无前导 + / 无无意义前导零 / 无 trailing zero / `-0`→`0` / 整数无 `.0`)。
22
+ * - JSON `1` ≠ string `"1"`(不全局转换数字字符串)。
23
+ *
24
+ * 纯模块:无 Node-only API 依赖,无 DB / 网络 / 环境读取。
25
+ */
26
+ /** 当前 canonical 算法版本,写进 hash 前缀 + Execution.canonicalizationVersion。变更算法必 bump。 */
27
+ export const CANONICALIZATION_VERSION = 'aster-canonical-json/v1';
28
+ /**
29
+ * Decimal 展开的资源上限(防大指数 DoS / RangeError)。金融金额远在此范围内,
30
+ * 超限统一报 DECIMAL_TOO_LARGE 而非非受控异常(Codex 审查 L1#3)。
31
+ */
32
+ const MAX_DECIMAL_DIGITS = 4096;
33
+ const MAX_DECIMAL_EXPONENT = 4096;
34
+ export class CanonicalJsonError extends Error {
35
+ reason;
36
+ path;
37
+ constructor(reason, message,
38
+ /** 出错值所在的 JSON 路径(如 `input.amount`),便于诊断。 */
39
+ path) {
40
+ super(`${reason} at ${path}: ${message}`);
41
+ this.reason = reason;
42
+ this.path = path;
43
+ this.name = 'CanonicalJsonError';
44
+ }
45
+ }
46
+ /** 把具体 array 下标路径归一为 `[]` 通配,用于 typeCtx 匹配。 */
47
+ function normalizePathForMatch(path) {
48
+ return path.replace(/\[\d+\]/g, '[]');
49
+ }
50
+ function isDecimalPath(path, ctx) {
51
+ if (!ctx)
52
+ return false;
53
+ return ctx.decimalPaths.has(normalizePathForMatch(path));
54
+ }
55
+ /**
56
+ * 规范化 JSON string(TS 侧用 JSON.stringify 转义;code point 保序,不做业务变换)。
57
+ *
58
+ * ★Java parity 注意(Codex L1#2):本实现的转义策略 = JS `JSON.stringify`(短转义 \n\t 等 /
59
+ * U+0000..001F / 不转义 `/` / 不转义 U+2028 U+2029 / lone surrogate 输出 \udxxx)。Java 权威
60
+ * 侧**不能**依赖 Jackson/Gson 默认转义自动对齐——须实现逐 code point 的 canonical string writer
61
+ * 复刻此策略,并由 TS↔Java golden fixture 固化(发布前 parity gate,见 ADR 0030 附录 A)。
62
+ * 此处不声明「已跨实现保证」,只声明「TS 侧策略确定」。
63
+ */
64
+ function canonicalString(value) {
65
+ return JSON.stringify(value);
66
+ }
67
+ /**
68
+ * 规范化普通 JSON number(非 Decimal 路径)——★双引擎地基铁律:**只允许 safe integer**。
69
+ *
70
+ * 原因(Codex 审查 L1#1/L4):JS `Number#toString()` 与 Java `Double.toString()` 对同一
71
+ * IEEE-754 浮点(如 `1e21`/`0.1`/`1e-7`)产生**不同字符串表示** → 双引擎 hash 不一致,
72
+ * 直接打穿「回放不误报漂移」的地基。金融决策里所有小数/金额本就应走 Decimal(string 承载 +
73
+ * typeCtx),用 IEEE-754 float 表示金额是错误姿势。故非 Decimal number 强制 safe integer,
74
+ * 小数一律要求走 Decimal 路径(否则报 NON_INTEGER_NUMBER,调用方须补 typeCtx 声明)。
75
+ */
76
+ function canonicalNumber(value, path) {
77
+ if (!Number.isFinite(value)) {
78
+ throw new CanonicalJsonError('NON_CANONICAL_NUMBER', `number 非 finite: ${value}`, path);
79
+ }
80
+ // -0 归一为 0(ADR:-0→0)。safe integer 范围内 -0 === 0,toString 即 "0"。
81
+ const normalized = value === 0 ? 0 : value;
82
+ if (!Number.isSafeInteger(normalized)) {
83
+ throw new CanonicalJsonError('NON_INTEGER_NUMBER', `非 Decimal number 只允许 safe integer(小数/超范围须走 Decimal string + typeCtx 声明): ${value}`, path);
84
+ }
85
+ // safe integer 的 toString 跨引擎一致(十进制整数无表示歧义)。
86
+ return normalized.toString();
87
+ }
88
+ /**
89
+ * 规范化 Decimal 值(decimal canonical form):
90
+ * 无 exponent / 无前导 `+` / 无无意义前导零 / 无 trailing zero / `-0`→`0` / 整数无 `.0`。
91
+ * 接受 string(推荐,避免精度损失)或 number(会先转 string)。
92
+ */
93
+ function canonicalDecimal(raw, path) {
94
+ // Decimal number 入参先转其整数字符串(number 已受 safe-integer 约束时才可能到这;
95
+ // 但 Decimal 路径的 number 允许非整数——用 JS 表示转字符串后再规范化)。
96
+ // string 入参:★不 trim(与「string 不 trim」铁律一致,Codex L1#4)——含空白即非法。
97
+ let s;
98
+ if (typeof raw === 'number') {
99
+ // ★Decimal 路径也只接受 safe integer number(Codex 复审 #1 闭环):非整数 JS number
100
+ // 走 Number#toString() 会重新引入跨引擎表示/精度隐患。精确 Decimal 必须以 string 承载。
101
+ if (!Number.isFinite(raw)) {
102
+ throw new CanonicalJsonError('NON_CANONICAL_NUMBER', `Decimal number 非 finite: ${raw}`, path);
103
+ }
104
+ if (!Number.isSafeInteger(raw === 0 ? 0 : raw)) {
105
+ throw new CanonicalJsonError('NON_INTEGER_NUMBER', `Decimal 路径的 number 只允许 safe integer;精确小数须以 string 承载(避免 IEEE-754 精度损失): ${raw}`, path);
106
+ }
107
+ s = (raw === 0 ? 0 : raw).toString();
108
+ }
109
+ else {
110
+ s = raw;
111
+ }
112
+ // 允许可选符号 + 整数部分 + 可选小数部分 + 可选指数(无前后空白)。
113
+ const m = /^([+-]?)(\d+)(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/.exec(s);
114
+ if (!m) {
115
+ throw new CanonicalJsonError('NON_CANONICAL_NUMBER', `Decimal 格式非法: ${JSON.stringify(raw)}`, path);
116
+ }
117
+ const sign = m[1] === '-' ? '-' : '';
118
+ let intPart = m[2] ?? '0';
119
+ let fracPart = m[3] ?? '';
120
+ const expStr = m[4] ?? '0';
121
+ // 资源上限:拒绝大指数 / 超长数字串(防 DoS / RangeError,Codex L1#3)。
122
+ if (expStr.length > 10) {
123
+ throw new CanonicalJsonError('DECIMAL_TOO_LARGE', `Decimal 指数过大: ${expStr}`, path);
124
+ }
125
+ const exp = parseInt(expStr, 10);
126
+ if (Math.abs(exp) > MAX_DECIMAL_EXPONENT) {
127
+ throw new CanonicalJsonError('DECIMAL_TOO_LARGE', `Decimal 指数超限(${exp} > ±${MAX_DECIMAL_EXPONENT})`, path);
128
+ }
129
+ // 展开指数:把 int.frac 视为无小数点的数字串,用 exp 决定小数点位置。
130
+ let digits = intPart + fracPart;
131
+ let pointPos = intPart.length + exp; // 小数点在 digits 中的位置(从左数)。
132
+ // 展开后总位数上限(防 1e4096 类构造出超长串)。
133
+ const expandedLen = pointPos <= 0
134
+ ? (1 - pointPos) + digits.length
135
+ : Math.max(pointPos, digits.length);
136
+ if (expandedLen > MAX_DECIMAL_DIGITS) {
137
+ throw new CanonicalJsonError('DECIMAL_TOO_LARGE', `Decimal 展开位数超限(${expandedLen} > ${MAX_DECIMAL_DIGITS})`, path);
138
+ }
139
+ if (pointPos <= 0) {
140
+ digits = '0'.repeat(1 - pointPos) + digits;
141
+ pointPos = 1;
142
+ }
143
+ if (pointPos >= digits.length) {
144
+ digits = digits + '0'.repeat(pointPos - digits.length);
145
+ }
146
+ intPart = digits.slice(0, pointPos);
147
+ fracPart = digits.slice(pointPos);
148
+ // 去无意义前导零(保留至少一位)。
149
+ intPart = intPart.replace(/^0+(?=\d)/, '');
150
+ // 去 trailing zero。
151
+ fracPart = fracPart.replace(/0+$/, '');
152
+ const body = fracPart.length > 0 ? `${intPart}.${fracPart}` : intPart;
153
+ // -0 归一为 0。
154
+ if (sign === '-' && /^0(?:\.0*)?$/.test(body)) {
155
+ return intPart; // "0"
156
+ }
157
+ return sign + body;
158
+ }
159
+ function canonicalizeValue(value, path, ctx) {
160
+ if (value === null)
161
+ return 'null';
162
+ const t = typeof value;
163
+ if (t === 'boolean')
164
+ return value ? 'true' : 'false';
165
+ if (t === 'number') {
166
+ if (isDecimalPath(path, ctx)) {
167
+ return canonicalDecimal(value, path);
168
+ }
169
+ return canonicalNumber(value, path);
170
+ }
171
+ if (t === 'string') {
172
+ if (isDecimalPath(path, ctx)) {
173
+ // Decimal 路径上的 string 承载精确值 → decimal canonical。
174
+ return canonicalDecimal(value, path);
175
+ }
176
+ return canonicalString(value);
177
+ }
178
+ if (Array.isArray(value)) {
179
+ // array 保序;元素路径用 `[i]`(typeCtx 匹配时归一为 `[]`)。
180
+ // ★拒绝 sparse array holes(Codex L2):map 会跳过 hole 产生非法/歧义 canonical,
181
+ // 用显式 `i in value` 检测,hole 直接 UNSUPPORTED_VALUE。
182
+ const parts = [];
183
+ for (let i = 0; i < value.length; i++) {
184
+ // own-property 检测(非 `i in value`,后者会把原型链索引当存在,Codex 复审 #3)。
185
+ if (!Object.prototype.hasOwnProperty.call(value, i)) {
186
+ throw new CanonicalJsonError('UNSUPPORTED_VALUE', `sparse array hole at index ${i}`, `${path}[${i}]`);
187
+ }
188
+ parts.push(canonicalizeValue(value[i], `${path}[${i}]`, ctx));
189
+ }
190
+ return `[${parts.join(',')}]`;
191
+ }
192
+ if (t === 'object') {
193
+ // ★只接受 plain object(Codex L2):Date/Map/Set/RegExp 等 typeof 也是 object,
194
+ // Object.keys 为空会被静默 canonical 成 `{}`,吞掉语义差异 → 显式拒绝非 plain object。
195
+ if (!isPlainObject(value)) {
196
+ throw new CanonicalJsonError('UNSUPPORTED_VALUE', `非 plain object(Date/Map/Set/RegExp/class 实例等不支持,须先转纯 JSON): ${Object.prototype.toString.call(value)}`, path);
197
+ }
198
+ // object key 按 Unicode code point 升序(含代理对,见 compareByCodePoint)。
199
+ const obj = value;
200
+ const keys = Object.keys(obj).sort(compareByCodePoint);
201
+ const parts = keys.map((k) => {
202
+ // 路径用 `.` 连接(与 typeCtx decimalPaths 写法一致,如 `applicants[].income`)。
203
+ // ★已知限制(Codex L3):JSON key 含 `.` 或 `[` 时路径会与 typeCtx 语法歧义。
204
+ // M1 缓解:Decimal 字段路径应从 schema/typed 模型自动导出(非手写散落),金融 input
205
+ // 字段名不含 `.`/`[`。含特殊字符 key 的子孙退化为普通处理——普通 number 走 safe-integer
206
+ // 铁律、string 保原值,不会静默精度漂移。M2 改 tokenized path array 彻底消歧义。
207
+ const childPath = path === '' ? k : `${path}.${k}`;
208
+ // value 显式输出(missing≠null:只有实际存在的 key 才输出)。
209
+ return `${canonicalString(k)}:${canonicalizeValue(obj[k], childPath, ctx)}`;
210
+ });
211
+ return `{${parts.join(',')}}`;
212
+ }
213
+ // undefined / function / symbol / bigint 等非 JSON 值。
214
+ throw new CanonicalJsonError('UNSUPPORTED_VALUE', `不支持的值类型: ${t}`, path);
215
+ }
216
+ /**
217
+ * 判断是否 plain object(对象字面量 / `Object.create(null)`),排除 Date/Map/Set/RegExp/
218
+ * class 实例等——它们 typeof 也是 'object' 但非纯 JSON 容器(Codex L2)。
219
+ */
220
+ function isPlainObject(value) {
221
+ if (value === null || typeof value !== 'object')
222
+ return false;
223
+ const proto = Object.getPrototypeOf(value);
224
+ return proto === Object.prototype || proto === null;
225
+ }
226
+ /** 按 Unicode code point 比较(正确处理代理对,避免 code unit 序在补充平面字符上的偏差)。 */
227
+ export function compareByCodePoint(a, b) {
228
+ const ai = Array.from(a);
229
+ const bi = Array.from(b);
230
+ const n = Math.min(ai.length, bi.length);
231
+ for (let i = 0; i < n; i++) {
232
+ const ca = ai[i].codePointAt(0);
233
+ const cb = bi[i].codePointAt(0);
234
+ if (ca !== cb)
235
+ return ca - cb;
236
+ }
237
+ return ai.length - bi.length;
238
+ }
239
+ /**
240
+ * 把任意 JSON 值序列化为 canonical 字符串(确定性、跨实现可复现)。
241
+ * @throws CanonicalJsonError 遇到 NaN/Infinity/非法 Decimal/非 JSON 值。
242
+ */
243
+ export function canonicalJson(value, ctx) {
244
+ return canonicalizeValue(value, '', ctx);
245
+ }
246
+ /** 便捷构造 typeCtx(从 Decimal 路径数组)。 */
247
+ export function decimalTypeContext(decimalPaths) {
248
+ return { decimalPaths: new Set(decimalPaths.map(normalizePathForMatch)) };
249
+ }
250
+ //# sourceMappingURL=canonical-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-json.js","sourceRoot":"","sources":["../../../src/core/canonical-json.ts"],"names":[],"mappings":"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"}