@aster-cloud/aster-lang-ts 1.0.29 → 1.0.31

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 (291) hide show
  1. package/dist/scripts/aster.js +11 -26
  2. package/dist/scripts/aster.js.map +1 -1
  3. package/dist/scripts/corpus-loader.d.ts +17 -0
  4. package/dist/scripts/corpus-loader.d.ts.map +1 -0
  5. package/dist/scripts/corpus-loader.js +60 -0
  6. package/dist/scripts/corpus-loader.js.map +1 -0
  7. package/dist/scripts/emit-classfiles-core.js +5 -13
  8. package/dist/scripts/emit-classfiles-core.js.map +1 -1
  9. package/dist/scripts/emit-classfiles.js +7 -12
  10. package/dist/scripts/emit-classfiles.js.map +1 -1
  11. package/dist/scripts/generate_error_codes.js +2 -0
  12. package/dist/scripts/generate_error_codes.js.map +1 -1
  13. package/dist/scripts/golden.js +4 -1
  14. package/dist/scripts/golden.js.map +1 -1
  15. package/dist/scripts/test-lossless-golden.js +2 -1
  16. package/dist/scripts/test-lossless-golden.js.map +1 -1
  17. package/dist/scripts/validate_error_codes.js +1 -0
  18. package/dist/scripts/validate_error_codes.js.map +1 -1
  19. package/dist/scripts/verify-lexicon-sync.js +5 -1
  20. package/dist/scripts/verify-lexicon-sync.js.map +1 -1
  21. package/dist/src/ast/ast.d.ts +1 -1
  22. package/dist/src/ast/ast.d.ts.map +1 -1
  23. package/dist/src/ast/ast.js +2 -1
  24. package/dist/src/ast/ast.js.map +1 -1
  25. package/dist/src/browser.d.ts +7 -0
  26. package/dist/src/browser.d.ts.map +1 -1
  27. package/dist/src/browser.js +4 -0
  28. package/dist/src/browser.js.map +1 -1
  29. package/dist/src/cli/utils/gradle-env.d.ts +9 -0
  30. package/dist/src/cli/utils/gradle-env.d.ts.map +1 -0
  31. package/dist/src/cli/utils/gradle-env.js +18 -0
  32. package/dist/src/cli/utils/gradle-env.js.map +1 -0
  33. package/dist/src/cli/utils/out-dir.d.ts +18 -0
  34. package/dist/src/cli/utils/out-dir.d.ts.map +1 -0
  35. package/dist/src/cli/utils/out-dir.js +49 -0
  36. package/dist/src/cli/utils/out-dir.js.map +1 -0
  37. package/dist/src/cnl-printer.d.ts +10 -0
  38. package/dist/src/cnl-printer.d.ts.map +1 -0
  39. package/dist/src/cnl-printer.js +360 -0
  40. package/dist/src/cnl-printer.js.map +1 -0
  41. package/dist/src/config/lexicons/de-DE.d.ts.map +1 -1
  42. package/dist/src/config/lexicons/de-DE.js +8 -2
  43. package/dist/src/config/lexicons/de-DE.js.map +1 -1
  44. package/dist/src/config/lexicons/en-US.d.ts.map +1 -1
  45. package/dist/src/config/lexicons/en-US.js +8 -4
  46. package/dist/src/config/lexicons/en-US.js.map +1 -1
  47. package/dist/src/config/lexicons/hi-IN.d.ts.map +1 -1
  48. package/dist/src/config/lexicons/hi-IN.js +8 -2
  49. package/dist/src/config/lexicons/hi-IN.js.map +1 -1
  50. package/dist/src/config/lexicons/template.d.ts.map +1 -1
  51. package/dist/src/config/lexicons/template.js +12 -0
  52. package/dist/src/config/lexicons/template.js.map +1 -1
  53. package/dist/src/config/lexicons/zh-CN.d.ts.map +1 -1
  54. package/dist/src/config/lexicons/zh-CN.js +9 -3
  55. package/dist/src/config/lexicons/zh-CN.js.map +1 -1
  56. package/dist/src/config/semantic.d.ts +6 -0
  57. package/dist/src/config/semantic.d.ts.map +1 -1
  58. package/dist/src/config/semantic.js +8 -0
  59. package/dist/src/config/semantic.js.map +1 -1
  60. package/dist/src/config/token-kind.d.ts +12 -0
  61. package/dist/src/config/token-kind.d.ts.map +1 -1
  62. package/dist/src/config/token-kind.js +18 -0
  63. package/dist/src/config/token-kind.js.map +1 -1
  64. package/dist/src/core/core_ir.d.ts +1 -1
  65. package/dist/src/core/core_ir.d.ts.map +1 -1
  66. package/dist/src/core/core_ir.js +3 -1
  67. package/dist/src/core/core_ir.js.map +1 -1
  68. package/dist/src/core/interpreter.d.ts.map +1 -1
  69. package/dist/src/core/interpreter.js +222 -18
  70. package/dist/src/core/interpreter.js.map +1 -1
  71. package/dist/src/cst/cst_printer.d.ts.map +1 -1
  72. package/dist/src/cst/cst_printer.js +66 -32
  73. package/dist/src/cst/cst_printer.js.map +1 -1
  74. package/dist/src/diagnostics/diagnostics.d.ts +1 -0
  75. package/dist/src/diagnostics/diagnostics.d.ts.map +1 -1
  76. package/dist/src/diagnostics/diagnostics.js +1 -0
  77. package/dist/src/diagnostics/diagnostics.js.map +1 -1
  78. package/dist/src/diagnostics/error_codes.d.ts +10 -2
  79. package/dist/src/diagnostics/error_codes.d.ts.map +1 -1
  80. package/dist/src/diagnostics/error_codes.js +64 -0
  81. package/dist/src/diagnostics/error_codes.js.map +1 -1
  82. package/dist/src/effects/effect_inference.js +1 -1
  83. package/dist/src/effects/effect_inference.js.map +1 -1
  84. package/dist/src/formatter.d.ts +3 -0
  85. package/dist/src/formatter.d.ts.map +1 -1
  86. package/dist/src/formatter.js +8 -261
  87. package/dist/src/formatter.js.map +1 -1
  88. package/dist/src/frontend/transformers.d.ts.map +1 -1
  89. package/dist/src/frontend/transformers.js +10 -2
  90. package/dist/src/frontend/transformers.js.map +1 -1
  91. package/dist/src/governance/controls-registry.data.d.ts +40 -0
  92. package/dist/src/governance/controls-registry.data.d.ts.map +1 -0
  93. package/dist/src/governance/controls-registry.data.js +35 -0
  94. package/dist/src/governance/controls-registry.data.js.map +1 -0
  95. package/dist/src/governance/controls.d.ts +23 -0
  96. package/dist/src/governance/controls.d.ts.map +1 -0
  97. package/dist/src/governance/controls.js +77 -0
  98. package/dist/src/governance/controls.js.map +1 -0
  99. package/dist/src/index.d.ts +4 -0
  100. package/dist/src/index.d.ts.map +1 -1
  101. package/dist/src/index.js +2 -0
  102. package/dist/src/index.js.map +1 -1
  103. package/dist/src/lower_to_core.js +1 -1
  104. package/dist/src/lower_to_core.js.map +1 -1
  105. package/dist/src/lsp/completion.d.ts +22 -1
  106. package/dist/src/lsp/completion.d.ts.map +1 -1
  107. package/dist/src/lsp/completion.js +42 -1
  108. package/dist/src/lsp/completion.js.map +1 -1
  109. package/dist/src/lsp/debounce-map.d.ts +16 -0
  110. package/dist/src/lsp/debounce-map.d.ts.map +1 -0
  111. package/dist/src/lsp/debounce-map.js +32 -0
  112. package/dist/src/lsp/debounce-map.js.map +1 -0
  113. package/dist/src/lsp/server.js +6 -8
  114. package/dist/src/lsp/server.js.map +1 -1
  115. package/dist/src/lsp/utils.d.ts.map +1 -1
  116. package/dist/src/lsp/utils.js +2 -0
  117. package/dist/src/lsp/utils.js.map +1 -1
  118. package/dist/src/lsp/workspace/file-watcher.d.ts +1 -0
  119. package/dist/src/lsp/workspace/file-watcher.d.ts.map +1 -1
  120. package/dist/src/lsp/workspace/file-watcher.js +24 -14
  121. package/dist/src/lsp/workspace/file-watcher.js.map +1 -1
  122. package/dist/src/manifest.d.ts +2 -0
  123. package/dist/src/manifest.d.ts.map +1 -1
  124. package/dist/src/manifest.js.map +1 -1
  125. package/dist/src/package/manifest-parser.d.ts +10 -0
  126. package/dist/src/package/manifest-parser.d.ts.map +1 -1
  127. package/dist/src/package/manifest-parser.js +27 -28
  128. package/dist/src/package/manifest-parser.js.map +1 -1
  129. package/dist/src/package/manifest-schema.d.ts +15 -0
  130. package/dist/src/package/manifest-schema.d.ts.map +1 -0
  131. package/dist/src/package/manifest-schema.js +116 -0
  132. package/dist/src/package/manifest-schema.js.map +1 -0
  133. package/dist/src/parser/context.d.ts +2 -0
  134. package/dist/src/parser/context.d.ts.map +1 -1
  135. package/dist/src/parser/context.js +1 -0
  136. package/dist/src/parser/context.js.map +1 -1
  137. package/dist/src/parser/decl-parser.d.ts.map +1 -1
  138. package/dist/src/parser/decl-parser.js +26 -10
  139. package/dist/src/parser/decl-parser.js.map +1 -1
  140. package/dist/src/parser/expr-stmt-parser.d.ts +4 -1
  141. package/dist/src/parser/expr-stmt-parser.d.ts.map +1 -1
  142. package/dist/src/parser/expr-stmt-parser.js +147 -6
  143. package/dist/src/parser/expr-stmt-parser.js.map +1 -1
  144. package/dist/src/parser/import-parser.d.ts +12 -0
  145. package/dist/src/parser/import-parser.d.ts.map +1 -1
  146. package/dist/src/parser/import-parser.js +28 -0
  147. package/dist/src/parser/import-parser.js.map +1 -1
  148. package/dist/src/parser.js +1 -1
  149. package/dist/src/parser.js.map +1 -1
  150. package/dist/src/typecheck/browser.d.ts +3 -0
  151. package/dist/src/typecheck/browser.d.ts.map +1 -1
  152. package/dist/src/typecheck/browser.js +10 -1
  153. package/dist/src/typecheck/browser.js.map +1 -1
  154. package/dist/src/typecheck/context.d.ts +3 -0
  155. package/dist/src/typecheck/context.d.ts.map +1 -1
  156. package/dist/src/typecheck/context.js.map +1 -1
  157. package/dist/src/typecheck/expression.d.ts +6 -0
  158. package/dist/src/typecheck/expression.d.ts.map +1 -1
  159. package/dist/src/typecheck/expression.js +54 -2
  160. package/dist/src/typecheck/expression.js.map +1 -1
  161. package/dist/src/typecheck/generics.d.ts.map +1 -1
  162. package/dist/src/typecheck/generics.js +3 -0
  163. package/dist/src/typecheck/generics.js.map +1 -1
  164. package/dist/src/typecheck/governance.d.ts +43 -0
  165. package/dist/src/typecheck/governance.d.ts.map +1 -0
  166. package/dist/src/typecheck/governance.js +162 -0
  167. package/dist/src/typecheck/governance.js.map +1 -0
  168. package/dist/src/typecheck/module.d.ts.map +1 -1
  169. package/dist/src/typecheck/module.js +10 -1
  170. package/dist/src/typecheck/module.js.map +1 -1
  171. package/dist/src/typecheck/statement.d.ts.map +1 -1
  172. package/dist/src/typecheck/statement.js +2 -2
  173. package/dist/src/typecheck/statement.js.map +1 -1
  174. package/dist/src/typecheck/type_system.d.ts.map +1 -1
  175. package/dist/src/typecheck/type_system.js +4 -0
  176. package/dist/src/typecheck/type_system.js.map +1 -1
  177. package/dist/src/typecheck/verdict_signatures.d.ts +19 -0
  178. package/dist/src/typecheck/verdict_signatures.d.ts.map +1 -0
  179. package/dist/src/typecheck/verdict_signatures.js +23 -0
  180. package/dist/src/typecheck/verdict_signatures.js.map +1 -0
  181. package/dist/src/types/base.d.ts +2 -0
  182. package/dist/src/types/base.d.ts.map +1 -1
  183. package/dist/test/helpers/sibling-source.d.ts +10 -0
  184. package/dist/test/helpers/sibling-source.d.ts.map +1 -0
  185. package/dist/test/helpers/sibling-source.js +20 -0
  186. package/dist/test/helpers/sibling-source.js.map +1 -0
  187. package/dist/test/unit/allocation-budget.test.d.ts +2 -0
  188. package/dist/test/unit/allocation-budget.test.d.ts.map +1 -0
  189. package/dist/test/unit/allocation-budget.test.js +160 -0
  190. package/dist/test/unit/allocation-budget.test.js.map +1 -0
  191. package/dist/test/unit/apply-call.test.js +5 -0
  192. package/dist/test/unit/apply-call.test.js.map +1 -1
  193. package/dist/test/unit/canonicalizer/possessive-anchor.test.js +10 -0
  194. package/dist/test/unit/canonicalizer/possessive-anchor.test.js.map +1 -1
  195. package/dist/test/unit/cli/gradle-env-guard.test.d.ts +2 -0
  196. package/dist/test/unit/cli/gradle-env-guard.test.d.ts.map +1 -0
  197. package/dist/test/unit/cli/gradle-env-guard.test.js +53 -0
  198. package/dist/test/unit/cli/gradle-env-guard.test.js.map +1 -0
  199. package/dist/test/unit/cli/gradle-env.test.d.ts +2 -0
  200. package/dist/test/unit/cli/gradle-env.test.d.ts.map +1 -0
  201. package/dist/test/unit/cli/gradle-env.test.js +31 -0
  202. package/dist/test/unit/cli/gradle-env.test.js.map +1 -0
  203. package/dist/test/unit/cli/out-dir.test.d.ts +2 -0
  204. package/dist/test/unit/cli/out-dir.test.d.ts.map +1 -0
  205. package/dist/test/unit/cli/out-dir.test.js +96 -0
  206. package/dist/test/unit/cli/out-dir.test.js.map +1 -0
  207. package/dist/test/unit/formatter-corpus-roundtrip.test.d.ts +2 -0
  208. package/dist/test/unit/formatter-corpus-roundtrip.test.d.ts.map +1 -0
  209. package/dist/test/unit/formatter-corpus-roundtrip.test.js +190 -0
  210. package/dist/test/unit/formatter-corpus-roundtrip.test.js.map +1 -0
  211. package/dist/test/unit/formatter-roundtrip.test.d.ts +2 -0
  212. package/dist/test/unit/formatter-roundtrip.test.d.ts.map +1 -0
  213. package/dist/test/unit/formatter-roundtrip.test.js +125 -0
  214. package/dist/test/unit/formatter-roundtrip.test.js.map +1 -0
  215. package/dist/test/unit/governance/controls-registry-parity.test.d.ts +2 -0
  216. package/dist/test/unit/governance/controls-registry-parity.test.d.ts.map +1 -0
  217. package/dist/test/unit/governance/controls-registry-parity.test.js +28 -0
  218. package/dist/test/unit/governance/controls-registry-parity.test.js.map +1 -0
  219. package/dist/test/unit/governance/controls-registry-profiles.test.d.ts +2 -0
  220. package/dist/test/unit/governance/controls-registry-profiles.test.d.ts.map +1 -0
  221. package/dist/test/unit/governance/controls-registry-profiles.test.js +106 -0
  222. package/dist/test/unit/governance/controls-registry-profiles.test.js.map +1 -0
  223. package/dist/test/unit/governance/governance-check.test.d.ts +2 -0
  224. package/dist/test/unit/governance/governance-check.test.d.ts.map +1 -0
  225. package/dist/test/unit/governance/governance-check.test.js +169 -0
  226. package/dist/test/unit/governance/governance-check.test.js.map +1 -0
  227. package/dist/test/unit/governance/profile-check.test.d.ts +2 -0
  228. package/dist/test/unit/governance/profile-check.test.d.ts.map +1 -0
  229. package/dist/test/unit/governance/profile-check.test.js +139 -0
  230. package/dist/test/unit/governance/profile-check.test.js.map +1 -0
  231. package/dist/test/unit/governance/verdict-typecheck.test.d.ts +2 -0
  232. package/dist/test/unit/governance/verdict-typecheck.test.d.ts.map +1 -0
  233. package/dist/test/unit/governance/verdict-typecheck.test.js +80 -0
  234. package/dist/test/unit/governance/verdict-typecheck.test.js.map +1 -0
  235. package/dist/test/unit/interpreter/verdict-builtins.test.d.ts +2 -0
  236. package/dist/test/unit/interpreter/verdict-builtins.test.d.ts.map +1 -0
  237. package/dist/test/unit/interpreter/verdict-builtins.test.js +72 -0
  238. package/dist/test/unit/interpreter/verdict-builtins.test.js.map +1 -0
  239. package/dist/test/unit/list-numeric-fail-loud.test.d.ts +2 -0
  240. package/dist/test/unit/list-numeric-fail-loud.test.d.ts.map +1 -0
  241. package/dist/test/unit/list-numeric-fail-loud.test.js +83 -0
  242. package/dist/test/unit/list-numeric-fail-loud.test.js.map +1 -0
  243. package/dist/test/unit/lossless-mirror.test.d.ts +2 -0
  244. package/dist/test/unit/lossless-mirror.test.d.ts.map +1 -0
  245. package/dist/test/unit/lossless-mirror.test.js +41 -0
  246. package/dist/test/unit/lossless-mirror.test.js.map +1 -0
  247. package/dist/test/unit/lossless-reflow.test.d.ts +2 -0
  248. package/dist/test/unit/lossless-reflow.test.d.ts.map +1 -0
  249. package/dist/test/unit/lossless-reflow.test.js +84 -0
  250. package/dist/test/unit/lossless-reflow.test.js.map +1 -0
  251. package/dist/test/unit/lowering/lowering.test.js +35 -35
  252. package/dist/test/unit/lowering/lowering.test.js.map +1 -1
  253. package/dist/test/unit/lsp/control-completion.test.d.ts +2 -0
  254. package/dist/test/unit/lsp/control-completion.test.d.ts.map +1 -0
  255. package/dist/test/unit/lsp/control-completion.test.js +46 -0
  256. package/dist/test/unit/lsp/control-completion.test.js.map +1 -0
  257. package/dist/test/unit/lsp/debounce-map.test.d.ts +2 -0
  258. package/dist/test/unit/lsp/debounce-map.test.d.ts.map +1 -0
  259. package/dist/test/unit/lsp/debounce-map.test.js +47 -0
  260. package/dist/test/unit/lsp/debounce-map.test.js.map +1 -0
  261. package/dist/test/unit/lsp/file-watcher-restart.test.d.ts +2 -0
  262. package/dist/test/unit/lsp/file-watcher-restart.test.d.ts.map +1 -0
  263. package/dist/test/unit/lsp/file-watcher-restart.test.js +40 -0
  264. package/dist/test/unit/lsp/file-watcher-restart.test.js.map +1 -0
  265. package/dist/test/unit/manifest-parser.test.js +8 -0
  266. package/dist/test/unit/manifest-parser.test.js.map +1 -1
  267. package/dist/test/unit/manifest-schema.test.d.ts +7 -5
  268. package/dist/test/unit/manifest-schema.test.d.ts.map +1 -1
  269. package/dist/test/unit/manifest-schema.test.js +48 -10
  270. package/dist/test/unit/manifest-schema.test.js.map +1 -1
  271. package/dist/test/unit/parser/governance-sugar.test.d.ts +2 -0
  272. package/dist/test/unit/parser/governance-sugar.test.d.ts.map +1 -0
  273. package/dist/test/unit/parser/governance-sugar.test.js +258 -0
  274. package/dist/test/unit/parser/governance-sugar.test.js.map +1 -0
  275. package/dist/test/unit/parser/module-header.test.d.ts +2 -0
  276. package/dist/test/unit/parser/module-header.test.d.ts.map +1 -0
  277. package/dist/test/unit/parser/module-header.test.js +25 -0
  278. package/dist/test/unit/parser/module-header.test.js.map +1 -0
  279. package/dist/test/unit/parser/positional-annotation-args.test.d.ts +2 -0
  280. package/dist/test/unit/parser/positional-annotation-args.test.d.ts.map +1 -0
  281. package/dist/test/unit/parser/positional-annotation-args.test.js +26 -0
  282. package/dist/test/unit/parser/positional-annotation-args.test.js.map +1 -0
  283. package/dist/test/unit/parser/prefix-operator-call.test.d.ts +2 -0
  284. package/dist/test/unit/parser/prefix-operator-call.test.d.ts.map +1 -0
  285. package/dist/test/unit/parser/prefix-operator-call.test.js +69 -0
  286. package/dist/test/unit/parser/prefix-operator-call.test.js.map +1 -0
  287. package/dist/test/unit/scripts/corpus-loader.test.d.ts +2 -0
  288. package/dist/test/unit/scripts/corpus-loader.test.d.ts.map +1 -0
  289. package/dist/test/unit/scripts/corpus-loader.test.js +85 -0
  290. package/dist/test/unit/scripts/corpus-loader.test.js.map +1 -0
  291. package/package.json +1 -1
@@ -0,0 +1,20 @@
1
+ import { existsSync } from 'node:fs';
2
+ /**
3
+ * 跨仓门禁的兄弟仓文件定位:按序返回首个存在的候选路径。
4
+ * 本地开发为兄弟目录 ../<repo>;CI 只能 checkout 到工作区子目录 ./<repo>。
5
+ * CI 中全部缺失即失败——跳过与通过不可区分的门禁不是门禁;仅本地允许返回 undefined 以跳过。
6
+ * 参照 test/unit/diagnostics/error-codes-parity.test.ts 的 2026-08-17 审计结论。
7
+ */
8
+ export function locateSiblingSource(candidates, what, env = process.env) {
9
+ const found = candidates.find((c) => existsSync(c));
10
+ if (found !== undefined || !isCi(env))
11
+ return found;
12
+ throw new Error(`CI 中必须 checkout ${what},但以下路径均不存在:\n` +
13
+ candidates.map((c) => ` - ${c}`).join('\n') +
14
+ '\n请检查 .github/workflows/ci.yml 的 checkout 步骤。');
15
+ }
16
+ /** CI 判定:CI 非空(GitHub Actions 置为 true)或 GITHUB_ACTIONS=true。 */
17
+ export function isCi(env) {
18
+ return (env.CI ?? '').trim() !== '' || env.GITHUB_ACTIONS === 'true';
19
+ }
20
+ //# sourceMappingURL=sibling-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sibling-source.js","sourceRoot":"","sources":["../../../test/helpers/sibling-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAA6B,EAC7B,IAAY,EACZ,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,IAAI,KAAK,CACb,mBAAmB,IAAI,eAAe;QACpC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5C,+CAA+C,CAClD,CAAC;AACJ,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,IAAI,CAAC,GAAsB;IACzC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,cAAc,KAAK,MAAM,CAAC;AACvE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=allocation-budget.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allocation-budget.test.d.ts","sourceRoot":"","sources":["../../../test/unit/allocation-budget.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,160 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { compile } from '../../src/browser.js';
4
+ import { evaluate } from '../../src/core/interpreter.js';
5
+ /**
6
+ * 累计分配预算(MAX_ALLOCATION_BUDGET)的行为锁定。
7
+ *
8
+ * ★**守的是什么**:单个 builtin 各自有上限(List.range 1e6、List.combinations
9
+ * C(n,k)≤5000),但**组合起来**此前没有任何约束——List.concat 反复翻倍可用不到
10
+ * 200 字节源码把规模推到约 1.3 亿元素。
11
+ *
12
+ * 修复前实测:本引擎 1.28 亿元素吃掉 3.3GB 堆且**返回 success**(静默通过,最坏形态);
13
+ * truffle 侧 1403ms 抛 `Java heap space`。既有防护全部失效:
14
+ * - MAX_STEPS 只数解释器步进,concat 在它眼里是 1 步、底层却是几千万次数组拷贝;
15
+ * - 宿主侧 5 秒 wall-clock 看门狗**来不及**(OOM 在 1.4 秒)。
16
+ *
17
+ * 与 aster-lang-truffle `AllocationBudgetTest` **同形同 fixture 语义**,
18
+ * 保证两引擎在同一输入上给出同一判定。
19
+ */
20
+ describe('allocation budget (内存放大 DoS 防护)', () => {
21
+ // 攻击:concat 每行翻倍,1e6 → 2.56e8。
22
+ const amplify = (rounds) => {
23
+ let s = `Module p.
24
+ Rule main given seed as Int, produce Int:
25
+ Let v0 be List.range(0, 1000000).\n`;
26
+ for (let i = 1; i <= rounds; i++) {
27
+ s += ` Let v${i} be List.concat(v${i - 1}, v${i - 1}).\n`;
28
+ }
29
+ return s + ` Return List.length(v${rounds}).`;
30
+ };
31
+ it('concat 翻倍放大被拒绝(而非 OOM 或静默成功)', () => {
32
+ // ★用 7 轮(1.28 亿)而非 8 轮:7 轮正是修复前**静默返回 success**的那一档
33
+ // (实测 heapDelta 3345MB、success=true)。8 轮会撞 V8 的 Array.concat 2^27
34
+ // 上限报 `Invalid array length`——那是 V8 的硬限、不是我们的防护,
35
+ // 拿它当用例会让「修复前会怎样」的论证站不住。
36
+ const m = compile(amplify(7));
37
+ assert.ok(m.core);
38
+ const ev = evaluate(m.core, 'main', { seed: 0 }, { maxSteps: 5_000_000 });
39
+ assert.equal(ev.success, false, '放大攻击必须被拒绝');
40
+ // 断言消息内容而非只断言 success=false:修复前这一档是 success=**true**(静默错答案)。
41
+ // 且若将来退化成别的错误(V8 的 Invalid array length / 步数超限),
42
+ // 只断言 false 会让这个测试在缺陷以另一形态回归时**依然是绿的**。
43
+ assert.match(String(ev.error), /分配预算耗尽/);
44
+ });
45
+ it('★攻击藏在 lambda 回调里也必须被拦住', () => {
46
+ // 预算重置点若做成「每次 lambda 调用都清零」,List.map 的每次回调都会把额度
47
+ // 清空 → 守护形同虚设,而上一个用例**依然全绿**(它不经过 lambda)。
48
+ // 故必须单独钉住这一形态。20 次回调 × 2e6 = 4e7 ≫ 1e7 预算。
49
+ const src = `Module p.
50
+ Rule blow given x, produce Int:
51
+ Let a be List.range(0, 1000000).
52
+ Let b be List.concat(a, a).
53
+ Return List.length(b).
54
+ Rule main given seed as Int, produce Int:
55
+ Let xs be List.range(0, 20).
56
+ Let ys be List.map(xs, blow).
57
+ Return List.length(ys).`;
58
+ const m = compile(src);
59
+ assert.ok(m.core);
60
+ const ev = evaluate(m.core, 'main', { seed: 0 }, { maxSteps: 5_000_000 });
61
+ assert.equal(ev.success, false);
62
+ assert.match(String(ev.error), /分配预算耗尽/);
63
+ });
64
+ it('★Text.concat 字符串翻倍同样被拦住', () => {
65
+ // 与集合向量同构但类型不同:返回 string,若计量只认 Array/Map 就扣 0 通过。
66
+ // 实测修复前两引擎都 success:truffle 509ms 物化 268MB;本引擎因 V8 rope 更隐蔽
67
+ // (concat 近乎零成本,直到 toUpper 之类强制扁平化才吃满内存,实测 +128MB)。
68
+ let s = `Module p.
69
+ Rule main given seed as Int, produce Int:
70
+ Let s0 be "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".\n`;
71
+ for (let i = 1; i <= 22; i++) {
72
+ s += ` Let s${i} be Text.concat(s${i - 1}, s${i - 1}).\n`;
73
+ }
74
+ s += ` Return Text.length(s22).`;
75
+ const m = compile(s);
76
+ assert.ok(m.core);
77
+ const ev = evaluate(m.core, 'main', { seed: 0 }, { maxSteps: 5_000_000 });
78
+ assert.equal(ev.success, false, '字符串放大必须被拒绝');
79
+ assert.match(String(ev.error), /分配预算耗尽/);
80
+ });
81
+ it('★嵌套容器不得靠「顶层小」逃过计量(groupBy 复用绕过)', () => {
82
+ // 「只计顶层」那版设计的 Critical 漏洞:groupBy 把 1e6 元素全归进同一组,
83
+ // 返回 Map 顶层 size=1 → 只扣 1 点、实际物化 1e6。重复 20 次 = 840 字节源码
84
+ // 物化 2000 万元素只扣 20 点。实测修复前:Java 1972ms/+210MB SUCCESS;
85
+ // 本引擎抬高 maxSteps 后同样 success、+396MB。
86
+ //
87
+ // 需要抬高 maxSteps 才能隔离出预算维度——默认 10000 步会先拦住(25ms),
88
+ // 那是另一道防线在起作用,不能用它来证明预算有效。
89
+ let s = `Module p.
90
+ Rule one given x, produce:
91
+ Return 1.
92
+ Rule main given seed as Int, produce Int:
93
+ Let a be List.range(0, 1000000).\n`;
94
+ for (let i = 1; i <= 20; i++)
95
+ s += ` Let g${i} be List.groupBy(a, one).\n`;
96
+ s += ` Return Map.size(g20).`;
97
+ const m = compile(s);
98
+ assert.ok(m.core);
99
+ const ev = evaluate(m.core, 'main', { seed: 0 }, { maxSteps: 5_000_000_000 });
100
+ assert.equal(ev.success, false, 'groupBy 反复重新物化入参必须被计量');
101
+ assert.match(String(ev.error), /分配预算耗尽/);
102
+ });
103
+ it('★`plus` 运算符的字符串拼接也必须计量(曾是双引擎判定分叉)', () => {
104
+ // `+` 走 evalBinary 而非 evalStdlibCall,chargeAllocation 的唯一调用点在后者
105
+ // → 用 `plus` 代替 `Text.concat` 翻倍即可完全绕过预算。
106
+ // 实测修复前:20 轮 = 3355 万字符 success=true;而同一份 IR 在 truffle 侧
107
+ // (`+`→`add` builtin 经 Builtins.call 计量)是 REJECTED。同规则两引擎判定相反。
108
+ let s = `Module p.
109
+ Rule main given seed as Int, produce Int:
110
+ Let s0 be "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".\n`;
111
+ for (let i = 1; i <= 20; i++)
112
+ s += ` Let s${i} be s${i - 1} plus s${i - 1}.\n`;
113
+ s += ` Return Text.length(s20).`;
114
+ const m = compile(s);
115
+ assert.ok(m.core);
116
+ const ev = evaluate(m.core, 'main', { seed: 0 }, { maxSteps: 5_000_000 });
117
+ assert.equal(ev.success, false, 'plus 拼接必须同样受预算约束');
118
+ assert.match(String(ev.error), /分配预算耗尽/);
119
+ });
120
+ it('★数值序转换不得对嵌套列表 toString(曾物化巨串且不计账)', () => {
121
+ // 裸 `Number([...])` 会对数组调 toString() 把整个嵌套结构物化成巨串再返回 NaN,
122
+ // 那份巨串不经过 chargeAllocation。实测修复前:9 层嵌套 + List.sort
123
+ // → 10787ms / +707MB / success=true,源码仅 405 字节。
124
+ // truffle 侧有类型闸门(toDouble 抛「期望 Number」),故这里同时是分叉。
125
+ let s = `Module p.
126
+ Rule main given seed as Int, produce Int:
127
+ Let base be List.range(0, 1000).
128
+ Let n1 be [base, base, base, base].\n`;
129
+ for (let i = 2; i <= 9; i++)
130
+ s += ` Let n${i} be [n${i - 1}, n${i - 1}, n${i - 1}, n${i - 1}].\n`;
131
+ s += ` Let srt be List.sort(n9).
132
+ Return List.length(srt).`;
133
+ const m = compile(s);
134
+ assert.ok(m.core);
135
+ const ev = evaluate(m.core, 'main', { seed: 0 }, { maxSteps: 50_000_000 });
136
+ assert.equal(ev.success, false, '对嵌套列表做数值序转换应报类型错,而非静默物化巨串');
137
+ // 与 truffle 同口径:报类型错(不是预算错)——两引擎都在类型闸门处拒绝。
138
+ assert.match(String(ev.error), /expected Number/);
139
+ });
140
+ it('预算内的大批量运算不被误拒', () => {
141
+ const m = compile(amplify(1)); // 1e6 → 2e6,远低于 1e7
142
+ assert.ok(m.core);
143
+ const ev = evaluate(m.core, 'main', { seed: 0 }, { maxSteps: 5_000_000 });
144
+ assert.ok(ev.success, `合法用例不应被拒: ${ev.error ?? ''}`);
145
+ assert.equal(ev.value, 2_000_000);
146
+ });
147
+ it('预算不跨执行残留(连续三次同一程序结果一致)', () => {
148
+ // evaluate 每次新建 Interpreter,预算是实例字段故天然隔离;本用例锁住这一性质,
149
+ // 防止将来有人把计数器提成模块级变量(那会让合法规则随机失败,
150
+ // 且失败与否取决于此前跑过什么——最难查的一类缺陷)。
151
+ const m = compile(amplify(2)); // 4e6,单次通过、累计三次会超
152
+ assert.ok(m.core);
153
+ for (let i = 1; i <= 3; i++) {
154
+ const ev = evaluate(m.core, 'main', { seed: 0 }, { maxSteps: 5_000_000 });
155
+ assert.ok(ev.success, `第 ${i} 次执行应与第 1 次一致(预算残留?): ${ev.error ?? ''}`);
156
+ assert.equal(ev.value, 4_000_000);
157
+ }
158
+ });
159
+ });
160
+ //# sourceMappingURL=allocation-budget.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allocation-budget.test.js","sourceRoot":"","sources":["../../../test/unit/allocation-budget.test.ts"],"names":[],"mappings":"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"}
@@ -52,6 +52,11 @@ describe('apply <fn> to <arg> — 无括号单参调用(ADR 0027)', () => {
52
52
  assert.ok(compiles('Rule r given x:\n Return apply if to x.'), '`apply if to x` 应接受');
53
53
  assert.ok(compiles('Rule r given x:\n Return apply return to x.'), '`apply return to x` 应接受');
54
54
  });
55
+ it('ADR 0046 新词作 target:`apply profile/allow/deny/escalate/because to x` ≡ 同名调用', () => {
56
+ for (const word of ['profile', 'allow', 'deny', 'escalate', 'because']) {
57
+ assert.equal(fingerprint(`Rule r given x:\n Return apply ${word} to x.`), fingerprint(`Rule r given x:\n Return ${word}(x).`), `\`apply ${word} to x\` 应仍是调用目标段`);
58
+ }
59
+ });
55
60
  it('硬关键词作 target 拒绝:`apply and/or/with/given/set to x` 报错(对齐 Java,避免双引擎分歧)', () => {
56
61
  for (const kw of ['and', 'or', 'not', 'with', 'given', 'produce', 'set', 'to']) {
57
62
  assert.ok(!compiles(`Rule r given x:\n Return apply ${kw} to x.`), `\`apply ${kw} to x\`(硬关键词作目标)应报错`);
@@ -1 +1 @@
1
- {"version":3,"file":"apply-call.test.js","sourceRoot":"","sources":["../../../test/unit/apply-call.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apply-call.test.js","sourceRoot":"","sources":["../../../test/unit/apply-call.test.ts"],"names":[],"mappings":"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"}
@@ -73,6 +73,16 @@ describe('english-possessive — 左锚宽度', () => {
73
73
  const out = apply('english-possessive', "Xdriver's age");
74
74
  assert.strictEqual(out, 'Xdriver.age', `应整词匹配得 Xdriver.age;出现别的结果说明起跑位置不对。实际:${out}`);
75
75
  });
76
+ // ★对齐 aster-lang-core#190/#191:后续标识符只前瞻不消费,空白限定行内。
77
+ it('★链式所有格一次改写到位(后续标识符不得被上一次匹配消费)', () => {
78
+ assert.strictEqual(apply('english-possessive', "driver's car's color"), 'driver.car.color');
79
+ assert.strictEqual(apply('english-possessive', "a's b's c's d"), 'a.b.c.d');
80
+ });
81
+ it('★行尾所有格不得跨行吞掉下一行行首标识符', () => {
82
+ assert.strictEqual(apply('english-possessive', "driver's\ncar"), "driver's\ncar");
83
+ assert.strictEqual(apply('english-possessive', "driver's \n car"), "driver's \n car");
84
+ assert.strictEqual(apply('english-possessive', "driver's\tage"), 'driver.age');
85
+ });
76
86
  it('★长标识符 + 不闭合 \'s 不得触发二次回溯', () => {
77
87
  // 无左锚时 40000 长度需 2552ms。
78
88
  assertSubQuadratic('english-possessive', n => 'a'.repeat(n) + "'s ", s => apply('english-possessive', s), 10000);
@@ -1 +1 @@
1
- {"version":3,"file":"possessive-anchor.test.js","sourceRoot":"","sources":["../../../../test/unit/canonicalizer/possessive-anchor.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAEvE;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,GAAW,EAAU,EAAE;IAClD,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,EAAE,UAAU,IAAI,mBAAmB,CAAC,CAAC;IAC9D,OAAO,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEF,4CAA4C;AAC5C,SAAS,kBAAkB,CAAC,KAAa,EAAE,KAA4B,EAC3C,EAA0B,EAAE,IAAY;IAClE,EAAE,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE;QACjC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,IAAI,GAAG,QAAQ,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,EAAE,CAAC,CAAC,CAAC,CAAC;YACN,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAE7B,mCAAmC;IACnC,8DAA8D;IAC9D,gDAAgD;IAChD,MAAM,cAAc,GAAG,GAAG,CAAC;IAC3B,IAAI,KAAK,GAAG,cAAc,EAAE,CAAC;QAC3B,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,cAAc,EAC9B,GAAG,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,cAAc,KAAK,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,GAAG,EACnB,GAAG,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;UAC5E,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC;AACpE,CAAC;AAED,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,qDAAqD;QACrD,eAAe;QACf,uDAAuD;QACvD,wCAAwC;QACxC,wCAAwC;QACxC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,oBAAoB,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,oBAAoB,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,oBAAoB,EAAE,cAAc,CAAC,EAAE,YAAY,CAAC,CAAC;QAC9E,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,oBAAoB,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,oCAAoC;QACpC,uCAAuC;QACvC,wCAAwC;QACxC,oBAAoB;QACpB,MAAM,GAAG,GAAG,KAAK,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAC;QACzD,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,aAAa,EACnC,wCAAwC,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,yBAAyB;QACzB,kBAAkB,CAAC,oBAAoB,EACrC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,EAC1B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,cAAc,CAAC,CAAC;QACpE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,cAAc,CAAC,CAAC;QACpE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,mBAAmB,CAAC,EAAE,YAAY,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,WAAW,CAChB,KAAK,CAAC,QAAQ,EAAE,0BAA0B,CAAC,EAC3C,0BAA0B,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,mCAAmC;QACnC,qCAAqC;QACrC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,iDAAiD;QACjD,kBAAkB,CAAC,cAAc,EAC/B,CAAC,CAAC,EAAE,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,EACxC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAClC,kBAAkB,CAAC,iBAAiB,EAClC,CAAC,CAAC,EAAE,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,EACxC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"possessive-anchor.test.js","sourceRoot":"","sources":["../../../../test/unit/canonicalizer/possessive-anchor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gradle-env-guard.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradle-env-guard.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/cli/gradle-env-guard.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,53 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import fs from 'node:fs';
4
+ import * as path from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ // ★issue #195 / #201:`...process.env` 放在 GRADLE_USER_HOME 之后,宿主导出的
7
+ // GRADLE_USER_HOME / GRADLE_OPTS / JAVA_OPTS 就把沙箱目录与 IPv4 偏好静默冲掉。
8
+ // #195 只修了 scripts/aster.ts,#201 发现 emit-classfiles* 三处原样残留。
9
+ // 构造 Gradle 环境只允许经 gradleEnv()。这里不再用手写括号匹配器识别「错误形态」,
10
+ // 而是守一条更强的单一不变量:scripts/ 与 src/ 之下,除 gradle-env.ts 外任何源码
11
+ // 都不得出现字面量 GRADLE_USER_HOME——Object.assign、改名后的展开、任何重新实现
12
+ // 一律被抓住,且没有解析器会被字符串里的花括号带偏。
13
+ const REPO_ROOT = fileURLToPath(new URL('../../../../', import.meta.url));
14
+ const SCAN_DIRS = ['scripts', 'src'];
15
+ const SOURCE_EXT = new Set(['.ts', '.js', '.mjs', '.cjs']);
16
+ const ONLY_ALLOWED = path.join('src', 'cli', 'utils', 'gradle-env.ts');
17
+ const LITERAL = 'GRADLE_USER_HOME';
18
+ function listSources(dir, out = []) {
19
+ for (const ent of fs.readdirSync(dir, { withFileTypes: true })) {
20
+ const p = path.join(dir, ent.name);
21
+ if (ent.isDirectory()) {
22
+ if (ent.name !== 'node_modules')
23
+ listSources(p, out);
24
+ }
25
+ else if (SOURCE_EXT.has(path.extname(ent.name))) {
26
+ out.push(p);
27
+ }
28
+ }
29
+ return out;
30
+ }
31
+ /** 返回 scripts/ 与 src/ 下含 GRADLE_USER_HOME 字面量、且不是 gradle-env.ts 的源文件(仓库相对路径)。 */
32
+ function findOffenders() {
33
+ return SCAN_DIRS.flatMap(d => listSources(path.join(REPO_ROOT, d)))
34
+ .map(f => path.relative(REPO_ROOT, f))
35
+ .filter(rel => rel !== ONLY_ALLOWED && fs.readFileSync(path.join(REPO_ROOT, rel), 'utf8').includes(LITERAL));
36
+ }
37
+ describe('gradleEnv 守卫:GRADLE_USER_HOME 只许出现在 gradle-env.ts', () => {
38
+ it('探测器能抓住 scripts/ 下新出现的 GRADLE_USER_HOME(自检)', () => {
39
+ const tmp = path.join(REPO_ROOT, 'scripts', `.gradle-env-guard-selfcheck-${process.pid}.ts`);
40
+ fs.writeFileSync(tmp, `// ${LITERAL}\n`);
41
+ try {
42
+ assert.ok(findOffenders().includes(path.relative(REPO_ROOT, tmp)), '探测器未能识别新增的违规文件');
43
+ }
44
+ finally {
45
+ fs.rmSync(tmp, { force: true });
46
+ }
47
+ });
48
+ it('★scripts/ 与 src/ 中 GRADLE_USER_HOME 仅存在于 gradle-env.ts', () => {
49
+ assert.ok(fs.existsSync(path.join(REPO_ROOT, ONLY_ALLOWED)), '扫描根目录定位错误');
50
+ assert.deepEqual(findOffenders(), [], '这些文件须改用 gradleEnv():Gradle 环境只允许在 gradle-env.ts 内构造');
51
+ });
52
+ });
53
+ //# sourceMappingURL=gradle-env-guard.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradle-env-guard.test.js","sourceRoot":"","sources":["../../../../test/unit/cli/gradle-env-guard.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gradle-env.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradle-env.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/cli/gradle-env.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import * as path from 'node:path';
4
+ import { gradleEnv } from '../../../src/cli/utils/gradle-env.js';
5
+ // ★issue #195:`...process.env` 原本放在展开末尾,宿主设了 GRADLE_USER_HOME /
6
+ // GRADLE_OPTS / JAVA_OPTS 就把刻意配置的值静默冲掉。
7
+ describe('gradleEnv:显式配置必须覆盖宿主环境', () => {
8
+ const host = {
9
+ PATH: '/usr/bin',
10
+ GRADLE_USER_HOME: '/home/user/.gradle',
11
+ GRADLE_OPTS: '-Xmx1g',
12
+ JAVA_OPTS: '-Dfoo=bar',
13
+ };
14
+ const env = gradleEnv(host);
15
+ it('GRADLE_USER_HOME 指向项目内 build/.gradle,而不是宿主值', () => {
16
+ assert.equal(env.GRADLE_USER_HOME, path.resolve('build/.gradle'));
17
+ });
18
+ it('GRADLE_OPTS / JAVA_OPTS 在宿主值之后追加 IPv4 优先参数', () => {
19
+ assert.equal(env.GRADLE_OPTS, '-Xmx1g -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Stack=false');
20
+ assert.equal(env.JAVA_OPTS, '-Dfoo=bar -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Stack=false');
21
+ });
22
+ it('宿主其余变量原样透传', () => {
23
+ assert.equal(env.PATH, '/usr/bin');
24
+ });
25
+ it('宿主未设 OPTS 时不留前导空格', () => {
26
+ const bare = gradleEnv({});
27
+ assert.equal(bare.GRADLE_OPTS, '-Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Stack=false');
28
+ assert.equal(bare.JAVA_OPTS, '-Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Stack=false');
29
+ });
30
+ });
31
+ //# sourceMappingURL=gradle-env.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradle-env.test.js","sourceRoot":"","sources":["../../../../test/unit/cli/gradle-env.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAEjE,gEAAgE;AAChE,0CAA0C;AAC1C,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,MAAM,IAAI,GAAG;QACX,IAAI,EAAE,UAAU;QAChB,gBAAgB,EAAE,oBAAoB;QACtC,WAAW,EAAE,QAAQ;QACrB,SAAS,EAAE,WAAW;KACvB,CAAC;IACF,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE5B,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,yEAAyE,CAAC,CAAC;QACzG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,4EAA4E,CAAC,CAAC;IAC5G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;QACpB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,kEAAkE,CAAC,CAAC;QACnG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,kEAAkE,CAAC,CAAC;IACnG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=out-dir.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"out-dir.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/cli/out-dir.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,96 @@
1
+ import { describe, it, beforeEach, afterEach } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import fs from 'node:fs';
4
+ import os from 'node:os';
5
+ import * as path from 'node:path';
6
+ import { prepareOutDir, GENERATED_MARKER } from '../../../src/cli/utils/out-dir.js';
7
+ // ★issue #196:`aster jvm --out <dir>` 对用户给的任意目录 rmSync(recursive, force)。
8
+ // 只有「cwd 之内 + 空目录或带生成标记」才可静默重建,其余必须 --force。
9
+ describe('prepareOutDir:只清空可证明为生成产物的目录', () => {
10
+ let cwd;
11
+ beforeEach(() => { cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'aster-outdir-')); });
12
+ afterEach(() => { fs.rmSync(cwd, { recursive: true, force: true }); });
13
+ it('不存在的目录:创建并写入标记', () => {
14
+ const abs = prepareOutDir('build/jvm-src', false, cwd);
15
+ assert.equal(abs, path.join(cwd, 'build', 'jvm-src'));
16
+ assert.ok(fs.existsSync(path.join(abs, GENERATED_MARKER)));
17
+ });
18
+ it('带标记的目录:静默清空重建', () => {
19
+ const abs = prepareOutDir('out', false, cwd);
20
+ fs.writeFileSync(path.join(abs, 'Old.java'), '');
21
+ prepareOutDir('out', false, cwd);
22
+ assert.deepEqual(fs.readdirSync(abs), [GENERATED_MARKER]);
23
+ });
24
+ it('空目录:静默重建', () => {
25
+ fs.mkdirSync(path.join(cwd, 'empty'));
26
+ assert.doesNotThrow(() => prepareOutDir('empty', false, cwd));
27
+ });
28
+ it('★cwd 内含用户文件且无标记:拒绝,文件必须原封不动', () => {
29
+ const dir = path.join(cwd, 'data');
30
+ fs.mkdirSync(dir);
31
+ fs.writeFileSync(path.join(dir, 'important.txt'), 'keep');
32
+ assert.throws(() => prepareOutDir('data', false, cwd), /--force/);
33
+ assert.equal(fs.readFileSync(path.join(dir, 'important.txt'), 'utf8'), 'keep');
34
+ });
35
+ it('★cwd 之外的目录:即使为空也拒绝', () => {
36
+ const outside = fs.mkdtempSync(path.join(os.tmpdir(), 'aster-outside-'));
37
+ try {
38
+ assert.throws(() => prepareOutDir(outside, false, cwd), /--force/);
39
+ assert.ok(fs.existsSync(outside));
40
+ }
41
+ finally {
42
+ fs.rmSync(outside, { recursive: true, force: true });
43
+ }
44
+ });
45
+ it('★cwd 本身:拒绝', () => {
46
+ assert.throws(() => prepareOutDir('.', false, cwd), /--force/);
47
+ });
48
+ it('同名前缀的兄弟目录不算「在 cwd 内」', () => {
49
+ const sibling = `${cwd}-sibling`;
50
+ fs.mkdirSync(sibling);
51
+ try {
52
+ assert.throws(() => prepareOutDir(sibling, false, cwd), /--force/);
53
+ }
54
+ finally {
55
+ fs.rmSync(sibling, { recursive: true, force: true });
56
+ }
57
+ });
58
+ // ★issue #202:标记只由 prepareOutDir 写入,升级前的 aster jvm 与 emit-classfiles 都在
59
+ // build/jvm-src 生成过源码却没有标记;build/ 之下一律视为产物,否则默认目录首跑即失败。
60
+ it('★build/ 之下无标记但有内容(升级前或其它脚本的产物):静默重建', () => {
61
+ const dir = path.join(cwd, 'build', 'jvm-src', 'com');
62
+ fs.mkdirSync(dir, { recursive: true });
63
+ fs.writeFileSync(path.join(dir, 'A.java'), 'class A{}');
64
+ const abs = prepareOutDir('build/jvm-src', false, cwd);
65
+ assert.deepEqual(fs.readdirSync(abs), [GENERATED_MARKER]);
66
+ });
67
+ it('build 本身与同名前缀目录(build-x)不享受 build/ 之下的豁免', () => {
68
+ for (const rel of ['build', 'build-x']) {
69
+ fs.mkdirSync(path.join(cwd, rel), { recursive: true });
70
+ fs.writeFileSync(path.join(cwd, rel, 'keep.txt'), 'keep');
71
+ assert.throws(() => prepareOutDir(rel, false, cwd), /缺少生成标记/);
72
+ assert.equal(fs.readFileSync(path.join(cwd, rel, 'keep.txt'), 'utf8'), 'keep');
73
+ }
74
+ });
75
+ it('错误信息区分「不在 cwd 之下」与「缺少标记」', () => {
76
+ const outside = fs.mkdtempSync(path.join(os.tmpdir(), 'aster-outside-'));
77
+ try {
78
+ assert.throws(() => prepareOutDir(outside, false, cwd), (e) => /不在当前工作目录之下/.test(e.message) && !/标记/.test(e.message));
79
+ }
80
+ finally {
81
+ fs.rmSync(outside, { recursive: true, force: true });
82
+ }
83
+ const dir = path.join(cwd, 'data');
84
+ fs.mkdirSync(dir);
85
+ fs.writeFileSync(path.join(dir, 'important.txt'), 'keep');
86
+ assert.throws(() => prepareOutDir('data', false, cwd), (e) => /缺少生成标记 \.aster-generated/.test(e.message) && !/不在当前工作目录/.test(e.message));
87
+ });
88
+ it('--force 时按用户意愿清空', () => {
89
+ const dir = path.join(cwd, 'data');
90
+ fs.mkdirSync(dir);
91
+ fs.writeFileSync(path.join(dir, 'important.txt'), 'gone');
92
+ prepareOutDir('data', true, cwd);
93
+ assert.deepEqual(fs.readdirSync(dir), [GENERATED_MARKER]);
94
+ });
95
+ });
96
+ //# sourceMappingURL=out-dir.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"out-dir.test.js","sourceRoot":"","sources":["../../../../test/unit/cli/out-dir.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=formatter-corpus-roundtrip.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter-corpus-roundtrip.test.d.ts","sourceRoot":"","sources":["../../../test/unit/formatter-corpus-roundtrip.test.ts"],"names":[],"mappings":""}