@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.
- package/dist/scripts/aster.js +11 -26
- package/dist/scripts/aster.js.map +1 -1
- package/dist/scripts/corpus-loader.d.ts +17 -0
- package/dist/scripts/corpus-loader.d.ts.map +1 -0
- package/dist/scripts/corpus-loader.js +60 -0
- package/dist/scripts/corpus-loader.js.map +1 -0
- package/dist/scripts/emit-classfiles-core.js +5 -13
- package/dist/scripts/emit-classfiles-core.js.map +1 -1
- package/dist/scripts/emit-classfiles.js +7 -12
- package/dist/scripts/emit-classfiles.js.map +1 -1
- package/dist/scripts/generate_error_codes.js +2 -0
- package/dist/scripts/generate_error_codes.js.map +1 -1
- package/dist/scripts/golden.js +4 -1
- package/dist/scripts/golden.js.map +1 -1
- package/dist/scripts/test-lossless-golden.js +2 -1
- package/dist/scripts/test-lossless-golden.js.map +1 -1
- package/dist/scripts/validate_error_codes.js +1 -0
- package/dist/scripts/validate_error_codes.js.map +1 -1
- package/dist/scripts/verify-lexicon-sync.js +5 -1
- package/dist/scripts/verify-lexicon-sync.js.map +1 -1
- package/dist/src/ast/ast.d.ts +1 -1
- package/dist/src/ast/ast.d.ts.map +1 -1
- package/dist/src/ast/ast.js +2 -1
- package/dist/src/ast/ast.js.map +1 -1
- package/dist/src/browser.d.ts +7 -0
- package/dist/src/browser.d.ts.map +1 -1
- package/dist/src/browser.js +4 -0
- package/dist/src/browser.js.map +1 -1
- package/dist/src/cli/utils/gradle-env.d.ts +9 -0
- package/dist/src/cli/utils/gradle-env.d.ts.map +1 -0
- package/dist/src/cli/utils/gradle-env.js +18 -0
- package/dist/src/cli/utils/gradle-env.js.map +1 -0
- package/dist/src/cli/utils/out-dir.d.ts +18 -0
- package/dist/src/cli/utils/out-dir.d.ts.map +1 -0
- package/dist/src/cli/utils/out-dir.js +49 -0
- package/dist/src/cli/utils/out-dir.js.map +1 -0
- package/dist/src/cnl-printer.d.ts +10 -0
- package/dist/src/cnl-printer.d.ts.map +1 -0
- package/dist/src/cnl-printer.js +360 -0
- package/dist/src/cnl-printer.js.map +1 -0
- package/dist/src/config/lexicons/de-DE.d.ts.map +1 -1
- package/dist/src/config/lexicons/de-DE.js +8 -2
- package/dist/src/config/lexicons/de-DE.js.map +1 -1
- package/dist/src/config/lexicons/en-US.d.ts.map +1 -1
- package/dist/src/config/lexicons/en-US.js +8 -4
- package/dist/src/config/lexicons/en-US.js.map +1 -1
- package/dist/src/config/lexicons/hi-IN.d.ts.map +1 -1
- package/dist/src/config/lexicons/hi-IN.js +8 -2
- package/dist/src/config/lexicons/hi-IN.js.map +1 -1
- package/dist/src/config/lexicons/template.d.ts.map +1 -1
- package/dist/src/config/lexicons/template.js +12 -0
- package/dist/src/config/lexicons/template.js.map +1 -1
- package/dist/src/config/lexicons/zh-CN.d.ts.map +1 -1
- package/dist/src/config/lexicons/zh-CN.js +9 -3
- package/dist/src/config/lexicons/zh-CN.js.map +1 -1
- package/dist/src/config/semantic.d.ts +6 -0
- package/dist/src/config/semantic.d.ts.map +1 -1
- package/dist/src/config/semantic.js +8 -0
- package/dist/src/config/semantic.js.map +1 -1
- package/dist/src/config/token-kind.d.ts +12 -0
- package/dist/src/config/token-kind.d.ts.map +1 -1
- package/dist/src/config/token-kind.js +18 -0
- package/dist/src/config/token-kind.js.map +1 -1
- package/dist/src/core/core_ir.d.ts +1 -1
- package/dist/src/core/core_ir.d.ts.map +1 -1
- package/dist/src/core/core_ir.js +3 -1
- package/dist/src/core/core_ir.js.map +1 -1
- package/dist/src/core/interpreter.d.ts.map +1 -1
- package/dist/src/core/interpreter.js +222 -18
- package/dist/src/core/interpreter.js.map +1 -1
- package/dist/src/cst/cst_printer.d.ts.map +1 -1
- package/dist/src/cst/cst_printer.js +66 -32
- package/dist/src/cst/cst_printer.js.map +1 -1
- package/dist/src/diagnostics/diagnostics.d.ts +1 -0
- package/dist/src/diagnostics/diagnostics.d.ts.map +1 -1
- package/dist/src/diagnostics/diagnostics.js +1 -0
- package/dist/src/diagnostics/diagnostics.js.map +1 -1
- package/dist/src/diagnostics/error_codes.d.ts +10 -2
- package/dist/src/diagnostics/error_codes.d.ts.map +1 -1
- package/dist/src/diagnostics/error_codes.js +64 -0
- package/dist/src/diagnostics/error_codes.js.map +1 -1
- package/dist/src/effects/effect_inference.js +1 -1
- package/dist/src/effects/effect_inference.js.map +1 -1
- package/dist/src/formatter.d.ts +3 -0
- package/dist/src/formatter.d.ts.map +1 -1
- package/dist/src/formatter.js +8 -261
- package/dist/src/formatter.js.map +1 -1
- package/dist/src/frontend/transformers.d.ts.map +1 -1
- package/dist/src/frontend/transformers.js +10 -2
- package/dist/src/frontend/transformers.js.map +1 -1
- package/dist/src/governance/controls-registry.data.d.ts +40 -0
- package/dist/src/governance/controls-registry.data.d.ts.map +1 -0
- package/dist/src/governance/controls-registry.data.js +35 -0
- package/dist/src/governance/controls-registry.data.js.map +1 -0
- package/dist/src/governance/controls.d.ts +23 -0
- package/dist/src/governance/controls.d.ts.map +1 -0
- package/dist/src/governance/controls.js +77 -0
- package/dist/src/governance/controls.js.map +1 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/lower_to_core.js +1 -1
- package/dist/src/lower_to_core.js.map +1 -1
- package/dist/src/lsp/completion.d.ts +22 -1
- package/dist/src/lsp/completion.d.ts.map +1 -1
- package/dist/src/lsp/completion.js +42 -1
- package/dist/src/lsp/completion.js.map +1 -1
- package/dist/src/lsp/debounce-map.d.ts +16 -0
- package/dist/src/lsp/debounce-map.d.ts.map +1 -0
- package/dist/src/lsp/debounce-map.js +32 -0
- package/dist/src/lsp/debounce-map.js.map +1 -0
- package/dist/src/lsp/server.js +6 -8
- package/dist/src/lsp/server.js.map +1 -1
- package/dist/src/lsp/utils.d.ts.map +1 -1
- package/dist/src/lsp/utils.js +2 -0
- package/dist/src/lsp/utils.js.map +1 -1
- package/dist/src/lsp/workspace/file-watcher.d.ts +1 -0
- package/dist/src/lsp/workspace/file-watcher.d.ts.map +1 -1
- package/dist/src/lsp/workspace/file-watcher.js +24 -14
- package/dist/src/lsp/workspace/file-watcher.js.map +1 -1
- package/dist/src/manifest.d.ts +2 -0
- package/dist/src/manifest.d.ts.map +1 -1
- package/dist/src/manifest.js.map +1 -1
- package/dist/src/package/manifest-parser.d.ts +10 -0
- package/dist/src/package/manifest-parser.d.ts.map +1 -1
- package/dist/src/package/manifest-parser.js +27 -28
- package/dist/src/package/manifest-parser.js.map +1 -1
- package/dist/src/package/manifest-schema.d.ts +15 -0
- package/dist/src/package/manifest-schema.d.ts.map +1 -0
- package/dist/src/package/manifest-schema.js +116 -0
- package/dist/src/package/manifest-schema.js.map +1 -0
- package/dist/src/parser/context.d.ts +2 -0
- package/dist/src/parser/context.d.ts.map +1 -1
- package/dist/src/parser/context.js +1 -0
- package/dist/src/parser/context.js.map +1 -1
- package/dist/src/parser/decl-parser.d.ts.map +1 -1
- package/dist/src/parser/decl-parser.js +26 -10
- package/dist/src/parser/decl-parser.js.map +1 -1
- package/dist/src/parser/expr-stmt-parser.d.ts +4 -1
- package/dist/src/parser/expr-stmt-parser.d.ts.map +1 -1
- package/dist/src/parser/expr-stmt-parser.js +147 -6
- package/dist/src/parser/expr-stmt-parser.js.map +1 -1
- package/dist/src/parser/import-parser.d.ts +12 -0
- package/dist/src/parser/import-parser.d.ts.map +1 -1
- package/dist/src/parser/import-parser.js +28 -0
- package/dist/src/parser/import-parser.js.map +1 -1
- package/dist/src/parser.js +1 -1
- package/dist/src/parser.js.map +1 -1
- package/dist/src/typecheck/browser.d.ts +3 -0
- package/dist/src/typecheck/browser.d.ts.map +1 -1
- package/dist/src/typecheck/browser.js +10 -1
- package/dist/src/typecheck/browser.js.map +1 -1
- package/dist/src/typecheck/context.d.ts +3 -0
- package/dist/src/typecheck/context.d.ts.map +1 -1
- package/dist/src/typecheck/context.js.map +1 -1
- package/dist/src/typecheck/expression.d.ts +6 -0
- package/dist/src/typecheck/expression.d.ts.map +1 -1
- package/dist/src/typecheck/expression.js +54 -2
- package/dist/src/typecheck/expression.js.map +1 -1
- package/dist/src/typecheck/generics.d.ts.map +1 -1
- package/dist/src/typecheck/generics.js +3 -0
- package/dist/src/typecheck/generics.js.map +1 -1
- package/dist/src/typecheck/governance.d.ts +43 -0
- package/dist/src/typecheck/governance.d.ts.map +1 -0
- package/dist/src/typecheck/governance.js +162 -0
- package/dist/src/typecheck/governance.js.map +1 -0
- package/dist/src/typecheck/module.d.ts.map +1 -1
- package/dist/src/typecheck/module.js +10 -1
- package/dist/src/typecheck/module.js.map +1 -1
- package/dist/src/typecheck/statement.d.ts.map +1 -1
- package/dist/src/typecheck/statement.js +2 -2
- package/dist/src/typecheck/statement.js.map +1 -1
- package/dist/src/typecheck/type_system.d.ts.map +1 -1
- package/dist/src/typecheck/type_system.js +4 -0
- package/dist/src/typecheck/type_system.js.map +1 -1
- package/dist/src/typecheck/verdict_signatures.d.ts +19 -0
- package/dist/src/typecheck/verdict_signatures.d.ts.map +1 -0
- package/dist/src/typecheck/verdict_signatures.js +23 -0
- package/dist/src/typecheck/verdict_signatures.js.map +1 -0
- package/dist/src/types/base.d.ts +2 -0
- package/dist/src/types/base.d.ts.map +1 -1
- package/dist/test/helpers/sibling-source.d.ts +10 -0
- package/dist/test/helpers/sibling-source.d.ts.map +1 -0
- package/dist/test/helpers/sibling-source.js +20 -0
- package/dist/test/helpers/sibling-source.js.map +1 -0
- package/dist/test/unit/allocation-budget.test.d.ts +2 -0
- package/dist/test/unit/allocation-budget.test.d.ts.map +1 -0
- package/dist/test/unit/allocation-budget.test.js +160 -0
- package/dist/test/unit/allocation-budget.test.js.map +1 -0
- package/dist/test/unit/apply-call.test.js +5 -0
- package/dist/test/unit/apply-call.test.js.map +1 -1
- package/dist/test/unit/canonicalizer/possessive-anchor.test.js +10 -0
- package/dist/test/unit/canonicalizer/possessive-anchor.test.js.map +1 -1
- package/dist/test/unit/cli/gradle-env-guard.test.d.ts +2 -0
- package/dist/test/unit/cli/gradle-env-guard.test.d.ts.map +1 -0
- package/dist/test/unit/cli/gradle-env-guard.test.js +53 -0
- package/dist/test/unit/cli/gradle-env-guard.test.js.map +1 -0
- package/dist/test/unit/cli/gradle-env.test.d.ts +2 -0
- package/dist/test/unit/cli/gradle-env.test.d.ts.map +1 -0
- package/dist/test/unit/cli/gradle-env.test.js +31 -0
- package/dist/test/unit/cli/gradle-env.test.js.map +1 -0
- package/dist/test/unit/cli/out-dir.test.d.ts +2 -0
- package/dist/test/unit/cli/out-dir.test.d.ts.map +1 -0
- package/dist/test/unit/cli/out-dir.test.js +96 -0
- package/dist/test/unit/cli/out-dir.test.js.map +1 -0
- package/dist/test/unit/formatter-corpus-roundtrip.test.d.ts +2 -0
- package/dist/test/unit/formatter-corpus-roundtrip.test.d.ts.map +1 -0
- package/dist/test/unit/formatter-corpus-roundtrip.test.js +190 -0
- package/dist/test/unit/formatter-corpus-roundtrip.test.js.map +1 -0
- package/dist/test/unit/formatter-roundtrip.test.d.ts +2 -0
- package/dist/test/unit/formatter-roundtrip.test.d.ts.map +1 -0
- package/dist/test/unit/formatter-roundtrip.test.js +125 -0
- package/dist/test/unit/formatter-roundtrip.test.js.map +1 -0
- package/dist/test/unit/governance/controls-registry-parity.test.d.ts +2 -0
- package/dist/test/unit/governance/controls-registry-parity.test.d.ts.map +1 -0
- package/dist/test/unit/governance/controls-registry-parity.test.js +28 -0
- package/dist/test/unit/governance/controls-registry-parity.test.js.map +1 -0
- package/dist/test/unit/governance/controls-registry-profiles.test.d.ts +2 -0
- package/dist/test/unit/governance/controls-registry-profiles.test.d.ts.map +1 -0
- package/dist/test/unit/governance/controls-registry-profiles.test.js +106 -0
- package/dist/test/unit/governance/controls-registry-profiles.test.js.map +1 -0
- package/dist/test/unit/governance/governance-check.test.d.ts +2 -0
- package/dist/test/unit/governance/governance-check.test.d.ts.map +1 -0
- package/dist/test/unit/governance/governance-check.test.js +169 -0
- package/dist/test/unit/governance/governance-check.test.js.map +1 -0
- package/dist/test/unit/governance/profile-check.test.d.ts +2 -0
- package/dist/test/unit/governance/profile-check.test.d.ts.map +1 -0
- package/dist/test/unit/governance/profile-check.test.js +139 -0
- package/dist/test/unit/governance/profile-check.test.js.map +1 -0
- package/dist/test/unit/governance/verdict-typecheck.test.d.ts +2 -0
- package/dist/test/unit/governance/verdict-typecheck.test.d.ts.map +1 -0
- package/dist/test/unit/governance/verdict-typecheck.test.js +80 -0
- package/dist/test/unit/governance/verdict-typecheck.test.js.map +1 -0
- package/dist/test/unit/interpreter/verdict-builtins.test.d.ts +2 -0
- package/dist/test/unit/interpreter/verdict-builtins.test.d.ts.map +1 -0
- package/dist/test/unit/interpreter/verdict-builtins.test.js +72 -0
- package/dist/test/unit/interpreter/verdict-builtins.test.js.map +1 -0
- package/dist/test/unit/list-numeric-fail-loud.test.d.ts +2 -0
- package/dist/test/unit/list-numeric-fail-loud.test.d.ts.map +1 -0
- package/dist/test/unit/list-numeric-fail-loud.test.js +83 -0
- package/dist/test/unit/list-numeric-fail-loud.test.js.map +1 -0
- package/dist/test/unit/lossless-mirror.test.d.ts +2 -0
- package/dist/test/unit/lossless-mirror.test.d.ts.map +1 -0
- package/dist/test/unit/lossless-mirror.test.js +41 -0
- package/dist/test/unit/lossless-mirror.test.js.map +1 -0
- package/dist/test/unit/lossless-reflow.test.d.ts +2 -0
- package/dist/test/unit/lossless-reflow.test.d.ts.map +1 -0
- package/dist/test/unit/lossless-reflow.test.js +84 -0
- package/dist/test/unit/lossless-reflow.test.js.map +1 -0
- package/dist/test/unit/lowering/lowering.test.js +35 -35
- package/dist/test/unit/lowering/lowering.test.js.map +1 -1
- package/dist/test/unit/lsp/control-completion.test.d.ts +2 -0
- package/dist/test/unit/lsp/control-completion.test.d.ts.map +1 -0
- package/dist/test/unit/lsp/control-completion.test.js +46 -0
- package/dist/test/unit/lsp/control-completion.test.js.map +1 -0
- package/dist/test/unit/lsp/debounce-map.test.d.ts +2 -0
- package/dist/test/unit/lsp/debounce-map.test.d.ts.map +1 -0
- package/dist/test/unit/lsp/debounce-map.test.js +47 -0
- package/dist/test/unit/lsp/debounce-map.test.js.map +1 -0
- package/dist/test/unit/lsp/file-watcher-restart.test.d.ts +2 -0
- package/dist/test/unit/lsp/file-watcher-restart.test.d.ts.map +1 -0
- package/dist/test/unit/lsp/file-watcher-restart.test.js +40 -0
- package/dist/test/unit/lsp/file-watcher-restart.test.js.map +1 -0
- package/dist/test/unit/manifest-parser.test.js +8 -0
- package/dist/test/unit/manifest-parser.test.js.map +1 -1
- package/dist/test/unit/manifest-schema.test.d.ts +7 -5
- package/dist/test/unit/manifest-schema.test.d.ts.map +1 -1
- package/dist/test/unit/manifest-schema.test.js +48 -10
- package/dist/test/unit/manifest-schema.test.js.map +1 -1
- package/dist/test/unit/parser/governance-sugar.test.d.ts +2 -0
- package/dist/test/unit/parser/governance-sugar.test.d.ts.map +1 -0
- package/dist/test/unit/parser/governance-sugar.test.js +258 -0
- package/dist/test/unit/parser/governance-sugar.test.js.map +1 -0
- package/dist/test/unit/parser/module-header.test.d.ts +2 -0
- package/dist/test/unit/parser/module-header.test.d.ts.map +1 -0
- package/dist/test/unit/parser/module-header.test.js +25 -0
- package/dist/test/unit/parser/module-header.test.js.map +1 -0
- package/dist/test/unit/parser/positional-annotation-args.test.d.ts +2 -0
- package/dist/test/unit/parser/positional-annotation-args.test.d.ts.map +1 -0
- package/dist/test/unit/parser/positional-annotation-args.test.js +26 -0
- package/dist/test/unit/parser/positional-annotation-args.test.js.map +1 -0
- package/dist/test/unit/parser/prefix-operator-call.test.d.ts +2 -0
- package/dist/test/unit/parser/prefix-operator-call.test.d.ts.map +1 -0
- package/dist/test/unit/parser/prefix-operator-call.test.js +69 -0
- package/dist/test/unit/parser/prefix-operator-call.test.js.map +1 -0
- package/dist/test/unit/scripts/corpus-loader.test.d.ts +2 -0
- package/dist/test/unit/scripts/corpus-loader.test.d.ts.map +1 -0
- package/dist/test/unit/scripts/corpus-loader.test.js +85 -0
- package/dist/test/unit/scripts/corpus-loader.test.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"formatter-corpus-roundtrip.test.d.ts","sourceRoot":"","sources":["../../../test/unit/formatter-corpus-roundtrip.test.ts"],"names":[],"mappings":""}
|