@nudojs/cli 0.3.0 → 0.3.1
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/chunk-YDM4HHQ4.js +5648 -0
- package/dist/evaluator-api.d.ts +162 -0
- package/dist/evaluator-api.js +264 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +829 -0
- package/package.json +20 -13
- package/src/abs-route.ts +0 -273
- package/src/builtins/builtin-intl.ts +0 -17
- package/src/builtins/builtin-map.ts +0 -174
- package/src/builtins/builtin-promise.ts +0 -116
- package/src/builtins/builtin-prototype.ts +0 -279
- package/src/builtins/builtin-reflect.ts +0 -30
- package/src/builtins/builtin-regexp.ts +0 -34
- package/src/builtins/builtin-set.ts +0 -131
- package/src/builtins/builtin-static.ts +0 -260
- package/src/builtins/builtin-symbol.ts +0 -16
- package/src/builtins/builtin-url.ts +0 -58
- package/src/builtins/builtin-weak.ts +0 -22
- package/src/builtins/builtin-web.ts +0 -111
- package/src/config.ts +0 -32
- package/src/env-loader.ts +0 -174
- package/src/eval-binary.ts +0 -113
- package/src/evaluator-api.ts +0 -39
- package/src/evaluator.ts +0 -5164
- package/src/index.ts +0 -1034
- package/src/narrowing.ts +0 -544
- package/src/phi-from-test.ts +0 -42
- package/src/resolve-npm.ts +0 -63
- package/src/run-test.ts +0 -92
- package/src/term-registry.ts +0 -96
package/src/eval-binary.ts
DELETED
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 二元运算统一入口:代数优先,语言表面回落 Ops。
|
|
3
|
-
* TypeValue 是 IR;+ - * / % 比较与数值相等走 Abs,其余外延。
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
type TypeValue,
|
|
8
|
-
T,
|
|
9
|
-
simplifyUnion,
|
|
10
|
-
dispatchBinaryOp,
|
|
11
|
-
} from "@nudojs/core";
|
|
12
|
-
import { tryAbsBinary } from "./abs-route.ts";
|
|
13
|
-
|
|
14
|
-
const MAX_UNION_PRODUCT = 64;
|
|
15
|
-
|
|
16
|
-
export function looseLiteralValue(
|
|
17
|
-
tv: TypeValue,
|
|
18
|
-
): { hit: boolean; v: number | string | boolean | null | undefined } {
|
|
19
|
-
if (tv.kind === "literal") {
|
|
20
|
-
const v = tv.value;
|
|
21
|
-
if (
|
|
22
|
-
typeof v === "number" ||
|
|
23
|
-
typeof v === "string" ||
|
|
24
|
-
typeof v === "boolean" ||
|
|
25
|
-
v === null ||
|
|
26
|
-
v === undefined
|
|
27
|
-
) {
|
|
28
|
-
return { hit: true, v };
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return { hit: false, v: undefined };
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function distributeBinaryOverUnion(
|
|
35
|
-
left: TypeValue,
|
|
36
|
-
right: TypeValue,
|
|
37
|
-
fn: (l: TypeValue, r: TypeValue) => TypeValue,
|
|
38
|
-
): TypeValue {
|
|
39
|
-
if (left.kind === "union" && right.kind === "union") {
|
|
40
|
-
if (left.members.length * right.members.length > MAX_UNION_PRODUCT) {
|
|
41
|
-
return T.unknown;
|
|
42
|
-
}
|
|
43
|
-
return simplifyUnion(
|
|
44
|
-
left.members.flatMap((l) => right.members.map((r) => fn(l, r))),
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
if (left.kind === "union") {
|
|
48
|
-
return simplifyUnion(left.members.map((l) => fn(l, right)));
|
|
49
|
-
}
|
|
50
|
-
if (right.kind === "union") {
|
|
51
|
-
return simplifyUnion(right.members.map((r) => fn(left, r)));
|
|
52
|
-
}
|
|
53
|
-
return fn(left, right);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const ALGEBRA_OPS = new Set([
|
|
57
|
-
"+", "-", "*", "/", "%",
|
|
58
|
-
"<", "<=", ">", ">=",
|
|
59
|
-
"===", "!==",
|
|
60
|
-
]);
|
|
61
|
-
|
|
62
|
-
/** 数值运算形状:任一侧 number/unknown 时,`- * / %` 结果至少是 number */
|
|
63
|
-
function numberish(tv: TypeValue): boolean {
|
|
64
|
-
if (!tv) return false;
|
|
65
|
-
if (tv.kind === "unknown") return true;
|
|
66
|
-
if (tv.kind === "literal") return typeof tv.value === "number";
|
|
67
|
-
if (tv.kind === "primitive") return tv.type === "number";
|
|
68
|
-
if (tv.kind === "refined") return numberish(tv.base);
|
|
69
|
-
return false;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* 纯值级二元运算(不需要 AST/env)。
|
|
74
|
-
* 返回 undefined 表示调用方需处理 node 特例(instanceof / in / builtin identity)。
|
|
75
|
-
*/
|
|
76
|
-
export function evalBinaryValue(
|
|
77
|
-
operator: string,
|
|
78
|
-
left: TypeValue,
|
|
79
|
-
right: TypeValue,
|
|
80
|
-
): TypeValue | undefined {
|
|
81
|
-
if (operator === "instanceof" || operator === "in") return undefined;
|
|
82
|
-
|
|
83
|
-
if (ALGEBRA_OPS.has(operator)) {
|
|
84
|
-
const absResult = tryAbsBinary(operator, left, right);
|
|
85
|
-
if (absResult !== undefined) return absResult;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
if (operator === "==" || operator === "!=") {
|
|
89
|
-
const eq = operator === "==";
|
|
90
|
-
return distributeBinaryOverUnion(left, right, (l, r) => {
|
|
91
|
-
const lv = looseLiteralValue(l);
|
|
92
|
-
const rv = looseLiteralValue(r);
|
|
93
|
-
if (lv.hit && rv.hit) return T.literal(eq ? lv.v == rv.v : lv.v != rv.v);
|
|
94
|
-
return T.boolean;
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// refined 自定义 ops / Ops.add·比较 / nullish ===
|
|
99
|
-
const viaDispatch = distributeBinaryOverUnion(left, right, (l, r) =>
|
|
100
|
-
dispatchBinaryOp(operator, l, r),
|
|
101
|
-
);
|
|
102
|
-
|
|
103
|
-
// 代数与 refinement 都未接住时的数值形状:`unknown * 2` → number
|
|
104
|
-
if (
|
|
105
|
-
viaDispatch.kind === "unknown" &&
|
|
106
|
-
(operator === "-" || operator === "*" || operator === "/" || operator === "%") &&
|
|
107
|
-
(numberish(left) || numberish(right))
|
|
108
|
-
) {
|
|
109
|
-
return T.number;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
return viaDispatch;
|
|
113
|
-
}
|
package/src/evaluator-api.ts
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
export {
|
|
2
|
-
evaluate,
|
|
3
|
-
evaluateFunction,
|
|
4
|
-
evaluateFunctionFull,
|
|
5
|
-
evaluateProgram,
|
|
6
|
-
setModuleResolver,
|
|
7
|
-
setCurrentFileDir,
|
|
8
|
-
resetMemo,
|
|
9
|
-
getUnreachableRanges,
|
|
10
|
-
resetUnreachableRanges,
|
|
11
|
-
setNodeTypeCollector,
|
|
12
|
-
setCallCollector,
|
|
13
|
-
type CallRecord,
|
|
14
|
-
setUnknownCollector,
|
|
15
|
-
setProvenanceTracking,
|
|
16
|
-
type UnknownRecord,
|
|
17
|
-
setSampleCount,
|
|
18
|
-
setMaxConcreteIter,
|
|
19
|
-
setUnknownBuiltinHandler,
|
|
20
|
-
setEnvModules,
|
|
21
|
-
resetEnvModules,
|
|
22
|
-
setMockModules,
|
|
23
|
-
resetMockModules,
|
|
24
|
-
setCurrentSource,
|
|
25
|
-
memberMayExistOn,
|
|
26
|
-
setUsageSiteTag,
|
|
27
|
-
USAGE_SITE_MODULE,
|
|
28
|
-
} from "./evaluator.ts";
|
|
29
|
-
|
|
30
|
-
export { narrow } from "./narrowing.ts";
|
|
31
|
-
|
|
32
|
-
// 补全成员派生的唯一真值(service/analyzer 经 @nudojs/cli/evaluator 取用)
|
|
33
|
-
export { BUILTIN_PROTOTYPE_METHOD_APPROXIMATIONS } from "./builtins/builtin-prototype.ts";
|
|
34
|
-
|
|
35
|
-
export { loadEnvs, loadEnvsAsync, preloadPathEnvs, type LoadedEnv } from "./env-loader.ts";
|
|
36
|
-
|
|
37
|
-
export { findProjectConfig, type NudoConfig } from "./config.ts";
|
|
38
|
-
|
|
39
|
-
export { resolveNpmNudo } from "./resolve-npm.ts";
|