@nudojs/core 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/chunk-N7E2A7IK.js +7216 -0
  2. package/dist/exec.d.ts +2 -0
  3. package/dist/exec.js +174 -0
  4. package/dist/index-DgyudAkw.d.ts +911 -0
  5. package/dist/index.d.ts +64 -710
  6. package/dist/index.js +3269 -8426
  7. package/package.json +18 -5
  8. package/CHANGELOG.md +0 -34
  9. package/src/__tests__/environment.test.ts +0 -48
  10. package/src/__tests__/fn-sig-impl.test.ts +0 -57
  11. package/src/__tests__/ops-refined.test.ts +0 -196
  12. package/src/__tests__/ops.test.ts +0 -84
  13. package/src/__tests__/type-value-phase2.test.ts +0 -117
  14. package/src/__tests__/type-value-phase3.test.ts +0 -94
  15. package/src/__tests__/type-value-refined.test.ts +0 -210
  16. package/src/__tests__/type-value.test.ts +0 -319
  17. package/src/algebra/__tests__/abs-native.test.ts +0 -176
  18. package/src/algebra/__tests__/arithmetic.test.ts +0 -170
  19. package/src/algebra/__tests__/ast-eval.test.ts +0 -154
  20. package/src/algebra/__tests__/bridge.test.ts +0 -160
  21. package/src/algebra/__tests__/call-budget.test.ts +0 -117
  22. package/src/algebra/__tests__/check-case-consistency.test.ts +0 -69
  23. package/src/algebra/__tests__/check-gold.test.ts +0 -290
  24. package/src/algebra/__tests__/check-json.test.ts +0 -57
  25. package/src/algebra/__tests__/check-mini-repo.test.ts +0 -49
  26. package/src/algebra/__tests__/check-real-commander.test.ts +0 -43
  27. package/src/algebra/__tests__/check-real-packages.test.ts +0 -165
  28. package/src/algebra/__tests__/check-recall-gold.test.ts +0 -1024
  29. package/src/algebra/__tests__/check-require-dep-memo.test.ts +0 -45
  30. package/src/algebra/__tests__/check-return-contract.test.ts +0 -90
  31. package/src/algebra/__tests__/check-shape-gold.test.ts +0 -303
  32. package/src/algebra/__tests__/check-source-memo.test.ts +0 -204
  33. package/src/algebra/__tests__/check.test.ts +0 -69
  34. package/src/algebra/__tests__/denote.test.ts +0 -77
  35. package/src/algebra/__tests__/diagnostics.test.ts +0 -64
  36. package/src/algebra/__tests__/differential.test.ts +0 -124
  37. package/src/algebra/__tests__/div-mod.test.ts +0 -38
  38. package/src/algebra/__tests__/example0.test.ts +0 -103
  39. package/src/algebra/__tests__/exec-analyze-throws.test.ts +0 -60
  40. package/src/algebra/__tests__/exec-async.test.ts +0 -46
  41. package/src/algebra/__tests__/exec-bpath.test.ts +0 -193
  42. package/src/algebra/__tests__/exec-class.test.ts +0 -56
  43. package/src/algebra/__tests__/exec-e2e.test.ts +0 -97
  44. package/src/algebra/__tests__/exec-generator.test.ts +0 -53
  45. package/src/algebra/__tests__/exec-inherit-default.test.ts +0 -111
  46. package/src/algebra/__tests__/exec-optional-nested.test.ts +0 -87
  47. package/src/algebra/__tests__/exec-rest.test.ts +0 -55
  48. package/src/algebra/__tests__/exec-spread-forof.test.ts +0 -85
  49. package/src/algebra/__tests__/exec-static-computed.test.ts +0 -61
  50. package/src/algebra/__tests__/exec-switch.test.ts +0 -74
  51. package/src/algebra/__tests__/exec-trycatch.test.ts +0 -71
  52. package/src/algebra/__tests__/fn-fp-memo.test.ts +0 -166
  53. package/src/algebra/__tests__/fn-fp-multidecl.test.ts +0 -49
  54. package/src/algebra/__tests__/format.test.ts +0 -34
  55. package/src/algebra/__tests__/generalize-memo.test.ts +0 -285
  56. package/src/algebra/__tests__/generalize.test.ts +0 -113
  57. package/src/algebra/__tests__/hash-source.test.ts +0 -19
  58. package/src/algebra/__tests__/hof.test.ts +0 -80
  59. package/src/algebra/__tests__/inlay.test.ts +0 -30
  60. package/src/algebra/__tests__/language.test.ts +0 -77
  61. package/src/algebra/__tests__/leq.test.ts +0 -109
  62. package/src/algebra/__tests__/load-deps-fp-memo.test.ts +0 -132
  63. package/src/algebra/__tests__/methods.test.ts +0 -37
  64. package/src/algebra/__tests__/node-types.test.ts +0 -26
  65. package/src/algebra/__tests__/nudo-constraints.ts +0 -46
  66. package/src/algebra/__tests__/objects.test.ts +0 -117
  67. package/src/algebra/__tests__/parse-source-cache.test.ts +0 -42
  68. package/src/algebra/__tests__/refine-import.test.ts +0 -109
  69. package/src/algebra/__tests__/stable-source-key-block.test.ts +0 -23
  70. package/src/algebra/__tests__/stable-source-key.test.ts +0 -31
  71. package/src/algebra/__tests__/surface.test.ts +0 -41
  72. package/src/algebra/__tests__/this-inherit.test.ts +0 -130
  73. package/src/algebra/abs-fn.ts +0 -49
  74. package/src/algebra/abs-modules.ts +0 -139
  75. package/src/algebra/abs.ts +0 -206
  76. package/src/algebra/arithmetic.ts +0 -691
  77. package/src/algebra/ast-eval.ts +0 -1763
  78. package/src/algebra/bridge.ts +0 -350
  79. package/src/algebra/builtins.ts +0 -373
  80. package/src/algebra/check-report.ts +0 -150
  81. package/src/algebra/check.ts +0 -1867
  82. package/src/algebra/constraint.ts +0 -304
  83. package/src/algebra/denote.ts +0 -166
  84. package/src/algebra/diagnostics.ts +0 -210
  85. package/src/algebra/exec/call.ts +0 -29
  86. package/src/algebra/exec/calls.ts +0 -96
  87. package/src/algebra/exec/class-registry.ts +0 -29
  88. package/src/algebra/exec/class.ts +0 -329
  89. package/src/algebra/exec/index.ts +0 -6
  90. package/src/algebra/exec/member-diag.ts +0 -141
  91. package/src/algebra/exec/run.ts +0 -341
  92. package/src/algebra/exec/runtime.ts +0 -583
  93. package/src/algebra/exec/transpile.ts +0 -993
  94. package/src/algebra/fn-fp.ts +0 -294
  95. package/src/algebra/format.ts +0 -91
  96. package/src/algebra/generalize.ts +0 -776
  97. package/src/algebra/hash-source.ts +0 -27
  98. package/src/algebra/index.ts +0 -34
  99. package/src/algebra/inlay.ts +0 -198
  100. package/src/algebra/language.ts +0 -289
  101. package/src/algebra/leak.ts +0 -68
  102. package/src/algebra/leq.ts +0 -301
  103. package/src/algebra/load-deps-fp.ts +0 -97
  104. package/src/algebra/methods.ts +0 -128
  105. package/src/algebra/objects.ts +0 -251
  106. package/src/algebra/parse-source.ts +0 -64
  107. package/src/algebra/phi.ts +0 -42
  108. package/src/algebra/pred.ts +0 -395
  109. package/src/algebra/refine.ts +0 -227
  110. package/src/algebra/stable-source-key.ts +0 -81
  111. package/src/algebra/surface.ts +0 -206
  112. package/src/algebra/template.ts +0 -143
  113. package/src/algebra/term.ts +0 -119
  114. package/src/environment.ts +0 -74
  115. package/src/index.ts +0 -73
  116. package/src/mock-helpers.ts +0 -166
  117. package/src/ops.ts +0 -191
  118. package/src/refinements/range.ts +0 -86
  119. package/src/refinements/template-predicates.ts +0 -11
  120. package/src/refinements/template.ts +0 -176
  121. package/src/strip-types.ts +0 -236
  122. package/src/type-value.ts +0 -513
  123. package/tsconfig.json +0 -8
@@ -1,350 +0,0 @@
1
- /**
2
- * Abs ⇄ TypeValue 桥。
3
- *
4
- * 纪律:
5
- * - absToTypeValue 有损:丢 term/pred 时 conf 降为 widened,禁止假装 exact
6
- * - typeValueToAbs 尽量恢复 term=lit
7
- * - 下游(dts/lsp/service)吃 TypeValue;代数运算吃 Abs
8
- */
9
-
10
- import type { TypeValue, LiteralValue as CoreLit } from "../type-value.ts";
11
- import { T, typeValueToString } from "../type-value.ts";
12
- import { createTemplate, getTemplateParts } from "../refinements/template.ts";
13
-
14
- import type { Abs, Shape, Confidence } from "./abs.ts";
15
- import { abs, confJoin, litValue } from "./abs.ts";
16
- import type { Term } from "./term.ts";
17
- import { lit, v as termVar, termToString } from "./term.ts";
18
- import type { Pred } from "./pred.ts";
19
- import { pTrue, predToString, gt, ge, lt, le } from "./pred.ts";
20
- import { isTemplateLike, templatePartsOf, createTemplateAbs } from "./template.ts";
21
-
22
- /** TypeValue 上的置信度旁路(零侵入 core) */
23
- const confByTv = new WeakMap<object, Confidence>();
24
-
25
- export function setTvConfidence(tv: TypeValue, conf: Confidence): void {
26
- if (tv && typeof tv === "object") confByTv.set(tv as object, conf);
27
- }
28
-
29
- export function getTvConfidence(tv: TypeValue): Confidence | undefined {
30
- if (tv && typeof tv === "object") return confByTv.get(tv as object);
31
- return undefined;
32
- }
33
-
34
- /**
35
- * Abs → TypeValue(给下游)。
36
- * 有损:非 lit term 丢弃;pred 尽量 encode 成 refined,否则丢。
37
- */
38
- export function absToTypeValue(a: Abs): TypeValue {
39
- let conf = a.conf;
40
- let result: TypeValue;
41
-
42
- switch (a.shape.k) {
43
- case "never":
44
- result = T.never;
45
- break;
46
- case "unknown":
47
- result = T.unknown;
48
- break;
49
- case "any":
50
- // any ≠ unknown:任意 JS 值,不是分析失败。conf 保留(通常 path)
51
- result = T.unknown;
52
- break;
53
- case "prim": {
54
- const lv = litValue(a);
55
- if (lv !== undefined) {
56
- result = T.literal(lv as CoreLit);
57
- break;
58
- }
59
- // template string:parts → core createTemplate
60
- if (isTemplateLike(a) && a.shape.k === "prim" && a.shape.type === "string") {
61
- const parts = templatePartsOf(a).map(absToTypeValue);
62
- result = createTemplate(parts);
63
- break;
64
- }
65
- // 有 pred 无 lit → refined 尽力,否则 primitive
66
- const prim = primToT(a.shape.type);
67
- if (a.pred && a.pred.op !== "true") {
68
- const refined = tryEncodeRefined(prim, a);
69
- if (refined) {
70
- result = refined;
71
- } else {
72
- result = prim;
73
- conf = confJoin(conf, "widened");
74
- }
75
- } else {
76
- result = prim;
77
- if (a.term && a.term.op !== "lit") conf = confJoin(conf, "widened");
78
- }
79
- break;
80
- }
81
- case "obj": {
82
- const props: Record<string, TypeValue> = {};
83
- for (const [k, slot] of Object.entries(a.shape.slots)) {
84
- let v = absToTypeValue(slot.value);
85
- if (slot.optional) {
86
- v = T.union(v, T.undefined);
87
- }
88
- props[k] = v;
89
- }
90
- result = T.object(props);
91
- if (a.shape.open) conf = confJoin(conf, "widened");
92
- break;
93
- }
94
- case "arr":
95
- result = T.array(absToTypeValue(a.shape.element));
96
- break;
97
- case "tuple":
98
- result = T.tuple(a.shape.elements.map(absToTypeValue));
99
- break;
100
- case "fn": {
101
- // 无 body 闭包:造 dummy function
102
- const body = { type: "BlockStatement", body: [], directives: [] } as any;
103
- result = T.fn(a.shape.params, body, null as any);
104
- break;
105
- }
106
- case "brand":
107
- result = T.instanceOf(a.shape.name, brandProps(a.shape.shape));
108
- break;
109
- case "eff":
110
- result = T.promise(absToTypeValue(a.shape.inner));
111
- break;
112
- case "sum":
113
- result = T.union(...a.shape.members.map(absToTypeValue));
114
- break;
115
- default:
116
- result = T.unknown;
117
- conf = confJoin(conf, "partial");
118
- }
119
-
120
- setTvConfidence(result, conf);
121
- return result;
122
- }
123
-
124
- function primToT(type: string): TypeValue {
125
- switch (type) {
126
- case "number":
127
- return T.number;
128
- case "string":
129
- return T.string;
130
- case "boolean":
131
- return T.boolean;
132
- case "bigint":
133
- return T.bigint;
134
- case "symbol":
135
- return T.symbol;
136
- default:
137
- return T.unknown;
138
- }
139
- }
140
-
141
- function brandProps(shape: Abs): Record<string, TypeValue> {
142
- if (shape.shape.k === "obj") {
143
- const out: Record<string, TypeValue> = {};
144
- for (const [k, slot] of Object.entries(shape.shape.slots)) {
145
- out[k] = absToTypeValue(slot.value);
146
- }
147
- return out;
148
- }
149
- return {};
150
- }
151
-
152
- /**
153
- * 尝试把简单数值 pred 编码为 refined。
154
- * 仅支持:term > n / >= n / < n / <= n,且 term 是 var 或相对自身。
155
- * 返回 undefined 表示无法编码。
156
- */
157
- function tryEncodeRefined(base: TypeValue, a: Abs): TypeValue | undefined {
158
- // 比较结果等 boolean 上的 pred 是路径事实,不是数值 refine
159
- if (base.kind !== "primitive" || base.type !== "number") return undefined;
160
- const p = a.pred;
161
- if (!p) return undefined;
162
- // 仅处理原子比较,且右侧字面量
163
- if (
164
- (p.op === "gt" || p.op === "ge" || p.op === "lt" || p.op === "le") &&
165
- p.b.op === "lit" &&
166
- typeof p.b.value === "number"
167
- ) {
168
- const n = p.b.value;
169
- const op = p.op;
170
- const check = (value: unknown): boolean => {
171
- if (typeof value !== "number") return false;
172
- switch (op) {
173
- case "gt":
174
- return value > n;
175
- case "ge":
176
- return value >= n;
177
- case "lt":
178
- return value < n;
179
- case "le":
180
- return value <= n;
181
- }
182
- };
183
- const opSym = op === "gt" ? ">" : op === "ge" ? ">=" : op === "lt" ? "<" : "<=";
184
- return T.refine(base, {
185
- name: `number (${opSym} ${n})`,
186
- meta: { op, n, pred: predToString(p) },
187
- check,
188
- });
189
- }
190
- return undefined;
191
- }
192
-
193
- /**
194
- * TypeValue → Abs(给代数运算)。
195
- * 置信度:优先读 abs→tv 时挂上的 conf 旁路,避免 #widened 回升 #exact。
196
- */
197
- export function typeValueToAbs(tv: TypeValue): Abs {
198
- if (!tv) return abs({ k: "unknown" }, undefined, undefined, "partial");
199
-
200
- /** abs→tv 时挂的 conf;无则用 fallback */
201
- const confOr = (fallback: Confidence): Confidence => getTvConfidence(tv) ?? fallback;
202
-
203
- switch (tv.kind) {
204
- case "never":
205
- return abs({ k: "never" }, undefined, undefined, confOr("exact"));
206
- case "unknown":
207
- // TypeValue 无 any kind:unknown+path 约定为「任意值」投影
208
- return abs(
209
- { k: "unknown" },
210
- undefined,
211
- undefined,
212
- confOr("partial"),
213
- );
214
- case "literal":
215
- if (typeof tv.value === "bigint") {
216
- // Abs term 不建模 bigint 字面量:只保留 prim 形状,放弃 literal identity
217
- return abs(
218
- { k: "prim", type: "bigint" },
219
- undefined,
220
- undefined,
221
- confOr("exact"),
222
- );
223
- }
224
- return abs(
225
- shapeOfLit(tv.value),
226
- lit(tv.value),
227
- pTrue,
228
- confOr("exact"),
229
- );
230
- case "primitive":
231
- return abs({ k: "prim", type: tv.type }, undefined, undefined, confOr("exact"));
232
- case "refined": {
233
- // template refined → 恢复 parts,便于链式拼接
234
- const tplParts = getTemplateParts(tv);
235
- if (tplParts) {
236
- return createTemplateAbs(tplParts.map(typeValueToAbs));
237
- }
238
- const base = typeValueToAbs(tv.base);
239
- const decoded = tryDecodeRefinedPred(tv, base.term);
240
- return abs(
241
- base.shape,
242
- base.term ?? (decoded ? termVar("_r") : undefined),
243
- decoded ?? base.pred,
244
- confOr(confJoin(base.conf, "path")),
245
- );
246
- }
247
- case "object": {
248
- const slots: Record<string, { value: Abs }> = {};
249
- for (const [k, v] of Object.entries(tv.properties)) {
250
- slots[k] = { value: typeValueToAbs(v) };
251
- }
252
- return abs({ k: "obj", slots }, undefined, undefined, confOr("exact"));
253
- }
254
- case "array":
255
- return abs(
256
- { k: "arr", element: typeValueToAbs(tv.element) },
257
- undefined,
258
- undefined,
259
- confOr("exact"),
260
- );
261
- case "tuple":
262
- return abs(
263
- { k: "tuple", elements: tv.elements.map(typeValueToAbs) },
264
- undefined,
265
- undefined,
266
- confOr("exact"),
267
- );
268
- case "function": {
269
- const params = tv.params ?? [];
270
- return abs({ k: "fn", params }, undefined, undefined, confOr("exact"));
271
- }
272
- case "promise":
273
- return abs(
274
- { k: "eff", eff: "promise", inner: typeValueToAbs(tv.value) },
275
- undefined,
276
- undefined,
277
- confOr("exact"),
278
- );
279
- case "instance": {
280
- const slots: Record<string, { value: Abs }> = {};
281
- for (const [k, v] of Object.entries(tv.properties ?? {})) {
282
- slots[k] = { value: typeValueToAbs(v) };
283
- }
284
- const inner = abs({ k: "obj", slots }, undefined, undefined, confOr("exact"));
285
- return abs(
286
- { k: "brand", name: tv.className, shape: inner },
287
- undefined,
288
- undefined,
289
- confOr("exact"),
290
- );
291
- }
292
- case "union":
293
- return abs(
294
- { k: "sum", members: tv.members.map(typeValueToAbs) },
295
- undefined,
296
- undefined,
297
- confOr("path"),
298
- );
299
- default:
300
- return abs({ k: "unknown" }, undefined, undefined, confOr("partial"));
301
- }
302
- }
303
-
304
- /** 从 refined.meta 反 encode 数值比较 pred(tryEncodeRefined 的逆) */
305
- function tryDecodeRefinedPred(tv: TypeValue, term: Term | undefined): Pred | undefined {
306
- if (tv.kind !== "refined") return undefined;
307
- const meta = tv.refinement.meta as { op?: unknown; n?: unknown };
308
- const op = meta?.op;
309
- const n = meta?.n;
310
- if (typeof n !== "number") return undefined;
311
- if (op !== "gt" && op !== "ge" && op !== "lt" && op !== "le") return undefined;
312
- const t = term ?? termVar("_r");
313
- const b = lit(n);
314
- switch (op) {
315
- case "gt":
316
- return gt(t, b);
317
- case "ge":
318
- return ge(t, b);
319
- case "lt":
320
- return lt(t, b);
321
- case "le":
322
- return le(t, b);
323
- }
324
- }
325
-
326
- function shapeOfLit(v: CoreLit): Shape {
327
- if (typeof v === "number") return { k: "prim", type: "number" };
328
- if (typeof v === "string") return { k: "prim", type: "string" };
329
- if (typeof v === "boolean") return { k: "prim", type: "boolean" };
330
- if (typeof v === "bigint") return { k: "prim", type: "bigint" };
331
- return { k: "unknown" };
332
- }
333
-
334
- /**
335
- * 有损检查:Abs 转 TypeValue 后是否丢了 term/pred。
336
- * 用于金标与调试。
337
- */
338
- export function bridgeIsLossy(a: Abs): { lossy: boolean; reasons: string[] } {
339
- const reasons: string[] = [];
340
- if (a.term && a.term.op !== "lit") {
341
- reasons.push(`dropped term ${termToString(a.term)}`);
342
- }
343
- if (a.pred && a.pred.op !== "true") {
344
- const tv = absToTypeValue(a);
345
- if (tv.kind !== "refined") {
346
- reasons.push(`dropped pred ${predToString(a.pred)}`);
347
- }
348
- }
349
- return { lossy: reasons.length > 0, reasons };
350
- }