@aster-cloud/aster-lang-ts 1.0.30 → 1.0.32
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 +199 -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/eval-regression-poker-straight-high.test.d.ts +2 -0
- package/dist/test/unit/eval-regression-poker-straight-high.test.d.ts.map +1 -0
- package/dist/test/unit/eval-regression-poker-straight-high.test.js +61 -0
- package/dist/test/unit/eval-regression-poker-straight-high.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/mapping/redos-budget.test.js +60 -23
- package/dist/test/unit/mapping/redos-budget.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 +185 -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,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 前缀运算符调用 `<op>(a, b)`:与 Java AsterParser.operatorCall 对齐。
|
|
3
|
+
* 降为与中缀写法相同的 Call(Name(规范符号), [a, b]),`=` 与中缀一样规范为 `==`;恰好 2 个参数。
|
|
4
|
+
*/
|
|
5
|
+
import { describe, test } from 'node:test';
|
|
6
|
+
import assert from 'node:assert/strict';
|
|
7
|
+
import { canonicalize } from '../../../src/frontend/canonicalizer.js';
|
|
8
|
+
import { lex } from '../../../src/frontend/lexer.js';
|
|
9
|
+
import { parse, parseWithLexicon } from '../../../src/parser.js';
|
|
10
|
+
import { ZH_CN } from '../../../src/config/lexicons/zh-CN.js';
|
|
11
|
+
import { lowerModule } from '../../../src/lower_to_core.js';
|
|
12
|
+
import { typecheckModule } from '../../../src/typecheck.js';
|
|
13
|
+
function toCore(source) {
|
|
14
|
+
const result = parse(lex(canonicalize(source)));
|
|
15
|
+
const errors = result.diagnostics.filter((d) => d.severity === 'error');
|
|
16
|
+
if (errors.length > 0)
|
|
17
|
+
throw new Error(errors.map((d) => `${d.code} ${d.message}`).join('\n'));
|
|
18
|
+
return lowerModule(result.ast);
|
|
19
|
+
}
|
|
20
|
+
function zhToCore(source) {
|
|
21
|
+
const result = parseWithLexicon(lex(canonicalize(source, ZH_CN), ZH_CN), ZH_CN);
|
|
22
|
+
const errors = result.diagnostics.filter((d) => d.severity === 'error');
|
|
23
|
+
if (errors.length > 0)
|
|
24
|
+
throw new Error(errors.map((d) => `${d.code} ${d.message}`).join('\n'));
|
|
25
|
+
return lowerModule(result.ast);
|
|
26
|
+
}
|
|
27
|
+
function stripOrigins(o) {
|
|
28
|
+
if (Array.isArray(o))
|
|
29
|
+
return o.map(stripOrigins);
|
|
30
|
+
if (!o || typeof o !== 'object')
|
|
31
|
+
return o;
|
|
32
|
+
const out = {};
|
|
33
|
+
for (const [k, v] of Object.entries(o)) {
|
|
34
|
+
if (k !== 'origin')
|
|
35
|
+
out[k] = stripOrigins(v);
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
function ruleReturning(expr, ret) {
|
|
40
|
+
return `Module m.\n\nRule r given x as Int, y as Int, produce ${ret}:\n Return ${expr}.\n`;
|
|
41
|
+
}
|
|
42
|
+
// [前缀运算符, 等价中缀写法, 返回类型]
|
|
43
|
+
const CASES = [
|
|
44
|
+
['<', 'x < y', 'Bool'],
|
|
45
|
+
['>', 'x > y', 'Bool'],
|
|
46
|
+
['<=', 'x <= y', 'Bool'],
|
|
47
|
+
['>=', 'x >= y', 'Bool'],
|
|
48
|
+
['!=', 'x != y', 'Bool'],
|
|
49
|
+
['==', 'x == y', 'Bool'],
|
|
50
|
+
['=', 'x = y', 'Bool'],
|
|
51
|
+
['+', 'x + y', 'Int'],
|
|
52
|
+
['-', 'x - y', 'Int'],
|
|
53
|
+
['*', 'x * y', 'Int'],
|
|
54
|
+
['/', 'x / y', 'Int'],
|
|
55
|
+
];
|
|
56
|
+
describe('前缀运算符调用', () => {
|
|
57
|
+
for (const [op, infix, ret] of CASES) {
|
|
58
|
+
test(`${op}(x, y) 与 ${infix} 的 Core IR 相同`, () => {
|
|
59
|
+
const prefix = toCore(ruleReturning(`${op}(x, y)`, ret));
|
|
60
|
+
assert.deepEqual(stripOrigins(prefix), stripOrigins(toCore(ruleReturning(infix, ret))));
|
|
61
|
+
assert.deepEqual(typecheckModule(prefix).filter((d) => d.severity === 'error'), []);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
test('= 规范为 ==', () => {
|
|
65
|
+
const func = toCore(ruleReturning('=(x, y)', 'Bool')).decls[0];
|
|
66
|
+
const ret = func.body.statements[0];
|
|
67
|
+
assert.equal(ret.expr.target.name, '==');
|
|
68
|
+
});
|
|
69
|
+
test('实参可为任意表达式,且前缀调用可作中缀操作数', () => {
|
|
70
|
+
assert.deepEqual(stripOrigins(toCore(ruleReturning('>=(x plus 1, y) and =(x, 2)', 'Bool'))), stripOrigins(toCore(ruleReturning('x plus 1 at least y and x = 2', 'Bool'))));
|
|
71
|
+
});
|
|
72
|
+
test('参数个数不是 2 时报错(与 Java 同一消息)', () => {
|
|
73
|
+
assert.throws(() => toCore(ruleReturning('+(x, y, x)', 'Int')), /前缀操作符调用需要 2 个参数,但实际为 3/);
|
|
74
|
+
assert.throws(() => toCore(ruleReturning('>=(x)', 'Bool')), /前缀操作符调用需要 2 个参数,但实际为 1/);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
// 以下各组与 aster-lang-core 实测一致(Canonicalizer + AsterParser + AstBuilder)。
|
|
78
|
+
function boolRule(expr) {
|
|
79
|
+
return `Module m.\n\nRule r given a as Bool, b as Bool, x as Int, y as Int, produce Bool:\n Return ${expr}.\n`;
|
|
80
|
+
}
|
|
81
|
+
function zhRule(expr) {
|
|
82
|
+
return `模块 m。\n\n规则 评估 给定 甲,乙,产出:\n 返回 ${expr}。\n`;
|
|
83
|
+
}
|
|
84
|
+
const WORD_CALL_REJECTED = /运算符词 '([a-z ]+)' 不能用作前缀调用/;
|
|
85
|
+
describe('运算符词前缀调用(en-US):Java operatorCall 只认符号', () => {
|
|
86
|
+
// [源码表达式, 报错中的运算符词]
|
|
87
|
+
const REJECTED = [
|
|
88
|
+
['and(a, b)', 'and'],
|
|
89
|
+
['or(a, b)', 'or'],
|
|
90
|
+
['and(a)', 'and'],
|
|
91
|
+
['plus(x, y) > 0', 'plus'],
|
|
92
|
+
['minus(x, y) > 0', 'minus'],
|
|
93
|
+
['times(x, y) > 0', 'times'],
|
|
94
|
+
['modulo(x, y) > 0', 'modulo'],
|
|
95
|
+
];
|
|
96
|
+
for (const [expr, word] of REJECTED) {
|
|
97
|
+
test(`${expr} 被拒绝`, () => {
|
|
98
|
+
assert.throws(() => toCore(boolRule(expr)), new RegExp(`运算符词 '${word}' 不能用作前缀调用;只有符号运算符 < > <= >= != == = \\+ - \\* / 可以写成 op\\(a, b\\)`));
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
// 多词运算符原本就被两引擎拒绝(TS 报通用语法错误),锁定现状
|
|
102
|
+
const MULTI_WORD_REJECTED = [
|
|
103
|
+
['divided by(x, y) > 0', WORD_CALL_REJECTED],
|
|
104
|
+
['integer divided by(x, y) > 0', WORD_CALL_REJECTED],
|
|
105
|
+
['less than(x, y)', WORD_CALL_REJECTED],
|
|
106
|
+
['greater than(x, y)', WORD_CALL_REJECTED],
|
|
107
|
+
['more than(x, y)', WORD_CALL_REJECTED],
|
|
108
|
+
['at least(x, y)', WORD_CALL_REJECTED],
|
|
109
|
+
['at most(x, y)', WORD_CALL_REJECTED],
|
|
110
|
+
['equals to(x, y)', WORD_CALL_REJECTED],
|
|
111
|
+
['not equal to(x, y)', /Expected '\.' at end of statement/],
|
|
112
|
+
['less than or equal to(x, y)', /Expected '\.' at end of statement/],
|
|
113
|
+
['is less than(x, y)', /Expected '\)' after expression/],
|
|
114
|
+
['not(a, b)', /Expected '\)' after expression/],
|
|
115
|
+
];
|
|
116
|
+
for (const [expr, message] of MULTI_WORD_REJECTED) {
|
|
117
|
+
test(`${expr} 被拒绝`, () => {
|
|
118
|
+
assert.throws(() => toCore(boolRule(expr)), message);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
test('中缀 and/or 不受影响', () => {
|
|
122
|
+
assert.doesNotThrow(() => toCore(boolRule('a and b or a')));
|
|
123
|
+
});
|
|
124
|
+
test('not(a) 是一元 not 作用于括号表达式,与 not a 相同', () => {
|
|
125
|
+
assert.deepEqual(stripOrigins(toCore(boolRule('not(a)'))), stripOrigins(toCore(boolRule('not a'))));
|
|
126
|
+
});
|
|
127
|
+
test('en-US 下 under/over 是软关键词:under(x, y) 是普通函数调用', () => {
|
|
128
|
+
for (const word of ['under', 'over']) {
|
|
129
|
+
const func = toCore(boolRule(`${word}(x, y)`)).decls[0];
|
|
130
|
+
const call = func.body.statements[0].expr;
|
|
131
|
+
assert.equal(call.target.name, word);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
test('大小写不同的同名标识符是普通函数调用(Java lexer 区分大小写)', () => {
|
|
135
|
+
for (const name of ['Plus', 'pLus', 'And']) {
|
|
136
|
+
const func = toCore(boolRule(`${name}(x, y)`)).decls[0];
|
|
137
|
+
const call = func.body.statements[0].expr;
|
|
138
|
+
assert.equal(call.target.name, name);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
describe('运算符词前缀调用(非英语词法表):Java Canonicalizer 把可映射的运算符词翻成符号', () => {
|
|
143
|
+
// [中文运算符词或英文关键词, 对应符号]
|
|
144
|
+
const ACCEPTED = [
|
|
145
|
+
['加上', '+'],
|
|
146
|
+
['减去', '-'],
|
|
147
|
+
['乘以', '*'],
|
|
148
|
+
['除以', '/'],
|
|
149
|
+
['小于', '<'],
|
|
150
|
+
['大于', '>'],
|
|
151
|
+
['多于', '>'],
|
|
152
|
+
['等于', '=='],
|
|
153
|
+
['至少', '>='],
|
|
154
|
+
['至多', '<='],
|
|
155
|
+
['不足', '<'],
|
|
156
|
+
['超过', '>'],
|
|
157
|
+
['plus', '+'],
|
|
158
|
+
['under', '<'],
|
|
159
|
+
];
|
|
160
|
+
for (const [word, symbol] of ACCEPTED) {
|
|
161
|
+
test(`${word}(甲,乙) 与 ${symbol}(甲,乙) 的 Core IR 相同`, () => {
|
|
162
|
+
assert.deepEqual(stripOrigins(zhToCore(zhRule(`${word}(甲,乙)`))), stripOrigins(zhToCore(zhRule(`${symbol}(甲,乙)`))));
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
const REJECTED = [
|
|
166
|
+
['并且(真值,假值)', 'and'],
|
|
167
|
+
['或者(真值,假值)', 'or'],
|
|
168
|
+
['取模(甲,乙)', 'modulo'],
|
|
169
|
+
['整除(甲,乙)', 'integer divided by'],
|
|
170
|
+
['and(真值,假值)', 'and'],
|
|
171
|
+
['modulo(甲,乙)', 'modulo'],
|
|
172
|
+
];
|
|
173
|
+
for (const [expr, word] of REJECTED) {
|
|
174
|
+
test(`${expr} 被拒绝`, () => {
|
|
175
|
+
assert.throws(() => zhToCore(zhRule(expr)), new RegExp(`运算符词 '${word}' 不能用作前缀调用`));
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
test('参数个数不是 2 时报与符号前缀调用相同的错误', () => {
|
|
179
|
+
assert.throws(() => zhToCore(zhRule('加上(甲)')), /前缀操作符调用需要 2 个参数,但实际为 1/);
|
|
180
|
+
});
|
|
181
|
+
test('不是(真值) 仍是一元 not', () => {
|
|
182
|
+
assert.deepEqual(stripOrigins(zhToCore(zhRule('不是(真值)'))), stripOrigins(zhToCore(zhRule('不是 真值'))));
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
//# sourceMappingURL=prefix-operator-call.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefix-operator-call.test.js","sourceRoot":"","sources":["../../../../test/unit/parser/prefix-operator-call.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corpus-loader.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/scripts/corpus-loader.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import { assertCorpusFrom, loadCorpus, corpusLoaderPath, CORPUS_PATH_ENV } from '../../../scripts/corpus-loader.js';
|
|
8
|
+
// ★issue #194:corpus-regression 工作流设置 ASTER_LANG_TEST_PATH,golden.ts 却静态
|
|
9
|
+
// import npm 包,变量零读取。这里守住两件事:变量生效、生效与否可被察觉。
|
|
10
|
+
describe('corpus-loader:ASTER_LANG_TEST_PATH 必须生效且可验证', () => {
|
|
11
|
+
const sample = (absPath) => ({ absPath, meta: { tier: 1 } });
|
|
12
|
+
it('样本全部位于 checkout 之下 → 通过', () => {
|
|
13
|
+
const root = path.join(os.tmpdir(), 'aster-lang-test');
|
|
14
|
+
const mod = { listSamples: () => [sample(path.join(root, 'corpus', 'a.aster'))] };
|
|
15
|
+
assert.doesNotThrow(() => assertCorpusFrom(mod, root));
|
|
16
|
+
});
|
|
17
|
+
it('★样本来自别处(例如 node_modules 里的 npm 版本)→ 失败并指出来源', () => {
|
|
18
|
+
const root = path.join(os.tmpdir(), 'aster-lang-test');
|
|
19
|
+
const stray = path.join(os.tmpdir(), 'node_modules', 'pkg', 'corpus', 'a.aster');
|
|
20
|
+
const mod = { listSamples: () => [sample(stray)] };
|
|
21
|
+
assert.throws(() => assertCorpusFrom(mod, root), new RegExp(`未生效.*${stray.replace(/[/\\]/g, '.')}`));
|
|
22
|
+
});
|
|
23
|
+
it('同名前缀目录不算「位于其下」', () => {
|
|
24
|
+
const root = path.join(os.tmpdir(), 'aster-lang-test');
|
|
25
|
+
const mod = { listSamples: () => [sample(`${root}-other${path.sep}a.aster`)] };
|
|
26
|
+
assert.throws(() => assertCorpusFrom(mod, root), /未生效/);
|
|
27
|
+
});
|
|
28
|
+
it('空样本集也视为未生效', () => {
|
|
29
|
+
assert.throws(() => assertCorpusFrom({ listSamples: () => [] }, '/x'), /未生效/);
|
|
30
|
+
});
|
|
31
|
+
// ★issue #203:ESM loader 对模块路径 realpath,样本 absPath 是真实路径;root 若只
|
|
32
|
+
// path.resolve,经过任意一层符号链接就被误判「未生效」。两侧都按真实路径比较。
|
|
33
|
+
it('★root 经符号链接、样本为真实路径(或反之)→ 通过', () => {
|
|
34
|
+
const base = fs.mkdtempSync(path.join(os.tmpdir(), 'aster-corpus-link-'));
|
|
35
|
+
try {
|
|
36
|
+
const real = path.join(base, 'real');
|
|
37
|
+
fs.mkdirSync(path.join(real, 'corpus'), { recursive: true });
|
|
38
|
+
const file = path.join(real, 'corpus', 'a.aster');
|
|
39
|
+
fs.writeFileSync(file, '');
|
|
40
|
+
const link = path.join(base, 'link');
|
|
41
|
+
fs.symlinkSync(real, link);
|
|
42
|
+
const viaReal = { listSamples: () => [sample(fs.realpathSync.native(file))] };
|
|
43
|
+
assert.doesNotThrow(() => assertCorpusFrom(viaReal, link));
|
|
44
|
+
const viaLink = { listSamples: () => [sample(path.join(link, 'corpus', 'a.aster'))] };
|
|
45
|
+
assert.doesNotThrow(() => assertCorpusFrom(viaLink, real));
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
fs.rmSync(base, { recursive: true, force: true });
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
it('★loadCorpus:变量指向符号链接的 checkout → 生效,样本来自该 checkout', async () => {
|
|
52
|
+
// 按 issue 复现步骤:把 npm 包的 loader 与语料复制成 checkout 布局,再经软链加载。
|
|
53
|
+
const pkgRoot = path.resolve(path.dirname(fileURLToPath(import.meta.resolve('@aster-cloud/aster-lang-test'))), '..');
|
|
54
|
+
const base = fs.mkdtempSync(path.join(os.tmpdir(), 'aster-corpus-checkout-'));
|
|
55
|
+
try {
|
|
56
|
+
const real = path.join(base, 'real');
|
|
57
|
+
fs.cpSync(path.join(pkgRoot, 'corpus'), path.join(real, 'corpus'), { recursive: true });
|
|
58
|
+
fs.mkdirSync(path.dirname(corpusLoaderPath(real)), { recursive: true });
|
|
59
|
+
fs.copyFileSync(path.join(pkgRoot, 'dist', 'loader.js'), corpusLoaderPath(real));
|
|
60
|
+
const link = path.join(base, 'link');
|
|
61
|
+
fs.symlinkSync(real, link);
|
|
62
|
+
const mod = await loadCorpus({ [CORPUS_PATH_ENV]: link });
|
|
63
|
+
const samples = mod.listSamples();
|
|
64
|
+
assert.ok(samples.length > 0);
|
|
65
|
+
assert.ok(samples[0].absPath.startsWith(fs.realpathSync.native(real) + path.sep));
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
fs.rmSync(base, { recursive: true, force: true });
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
it('未设置变量 → 回退到 npm 依赖', async () => {
|
|
72
|
+
const mod = await loadCorpus({});
|
|
73
|
+
assert.equal(typeof mod.listSamples, 'function');
|
|
74
|
+
});
|
|
75
|
+
it('★变量指向没有 loader 产物的目录 → 失败并提示构建', async () => {
|
|
76
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'aster-corpus-missing-'));
|
|
77
|
+
try {
|
|
78
|
+
await assert.rejects(loadCorpus({ [CORPUS_PATH_ENV]: dir }), /pnpm run build/);
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=corpus-loader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corpus-loader.test.js","sourceRoot":"","sources":["../../../../test/unit/scripts/corpus-loader.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpH,yEAAyE;AACzE,8CAA8C;AAC9C,QAAQ,CAAC,6CAA6C,EAAE,GAAG,EAAE;IAC3D,MAAM,MAAM,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAErE,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,EAAW,CAAC;QAC3F,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACjF,MAAM,GAAG,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAW,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACvG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,SAAS,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,EAAW,CAAC;QACxF,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;QACpB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAW,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,iEAAiE;IACjE,iDAAiD;IACjD,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC1E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACrC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAClD,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACrC,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC3B,MAAM,OAAO,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAW,CAAC;YACvF,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,EAAW,CAAC;YAC/F,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7D,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,0DAA0D;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACrH,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAC;QAC9E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACrC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;YACjF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACrC,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC3B,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YAClC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrF,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACjF,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED