@intentius/chant 0.70.0 → 0.70.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/discovery/fold-import.d.ts +61 -1
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/discovery/fold-import.ts +115 -3
- package/src/discovery/index.ts +13 -5
- package/src/index.ts +12 -0
|
@@ -458,6 +458,66 @@ export declare function tryFoldFile(file: string, intrinsics?: readonly Intrinsi
|
|
|
458
458
|
* the same edge an ordinary named import already gets.
|
|
459
459
|
*/
|
|
460
460
|
export declare function buildProjectImportEdges(files: readonly string[]): Promise<Map<string, Set<string>>>;
|
|
461
|
-
export declare function planFoldTaint(files: readonly string[], wouldFold: ReadonlyMap<string, boolean>, liveSources?: ReadonlyMap<string, ReadonlySet<string>>): Promise<
|
|
461
|
+
export declare function planFoldTaint(files: readonly string[], wouldFold: ReadonlyMap<string, boolean>, liveSources?: ReadonlyMap<string, ReadonlySet<string>>): Promise<ReadonlySet<string>>;
|
|
462
|
+
/** Which of the two rules put a file on the run path. */
|
|
463
|
+
export type TaintEdgeKind =
|
|
464
|
+
/** A file this one imports, directly or transitively, falls back to run (#1023). */
|
|
465
|
+
"importer"
|
|
466
|
+
/** This file captured the objects of a file that falls back to run (#1044). */
|
|
467
|
+
| "capture";
|
|
468
|
+
export interface TaintPlan {
|
|
469
|
+
/** Every file that must run: the seed, plus everything reachable from it. */
|
|
470
|
+
readonly tainted: ReadonlySet<string>;
|
|
471
|
+
/**
|
|
472
|
+
* For a file the walk reached (never for a seed file), the file whose taint
|
|
473
|
+
* reached it and by which rule. chant#2406: the fallback reason has to name
|
|
474
|
+
* the actual edge — a reverse-tainted file is not imported by anything that
|
|
475
|
+
* runs, and saying it is sends a reader looking for an importer that does
|
|
476
|
+
* not exist.
|
|
477
|
+
*/
|
|
478
|
+
readonly reachedBy: ReadonlyMap<string, {
|
|
479
|
+
from: string;
|
|
480
|
+
kind: TaintEdgeKind;
|
|
481
|
+
}>;
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* {@link planFoldTaint}'s walk, keeping the edge that fired for each file it
|
|
485
|
+
* reaches. Split out for two consumers that need to say *why*: the fallback
|
|
486
|
+
* reason in `discover()`, and {@link foldProject}'s verdicts.
|
|
487
|
+
*/
|
|
488
|
+
export declare function planFoldTaintWithEdges(files: readonly string[], wouldFold: ReadonlyMap<string, boolean>, liveSources?: ReadonlyMap<string, ReadonlySet<string>>): Promise<TaintPlan>;
|
|
489
|
+
/** One file's place in a whole-build fold, as {@link foldProject} reports it. */
|
|
490
|
+
export interface FoldProjectVerdict {
|
|
491
|
+
/** What the build does with this file. */
|
|
492
|
+
readonly verdict: "fold" | "run";
|
|
493
|
+
/** What the file's own fold attempt concluded, before the taint walk. */
|
|
494
|
+
readonly tentative: "fold" | "run";
|
|
495
|
+
/** Present when `tentative` is "run": the located reason its own fold gave. */
|
|
496
|
+
readonly reason?: string;
|
|
497
|
+
/** Present when the file would have folded and taint overruled it. */
|
|
498
|
+
readonly taintedBy?: {
|
|
499
|
+
from: string;
|
|
500
|
+
kind: TaintEdgeKind;
|
|
501
|
+
};
|
|
502
|
+
/** The file's complete export namespace, present only when `verdict` is "fold". */
|
|
503
|
+
readonly exports?: ReadonlyMap<string, unknown>;
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* Fold a whole set of project files and report every file's verdict
|
|
507
|
+
* (chant#2408).
|
|
508
|
+
*
|
|
509
|
+
* `discover()` does this as part of building, and its per-file decisions are
|
|
510
|
+
* not addressable from outside. Anything that wants to *check* the
|
|
511
|
+
* cross-file rules needs the whole picture: the forward rule (#1023) needs an
|
|
512
|
+
* importer, the reverse rule (#1044) needs a capturing sibling, and the
|
|
513
|
+
* fixpoint needs the whole set, so none of the three is observable one file at
|
|
514
|
+
* a time. The conformance suite of the specification is the first such caller
|
|
515
|
+
* (INTENTIUS/typescript-as-data#62).
|
|
516
|
+
*
|
|
517
|
+
* Same session, same memo, same taint walk as a real build — this is not a
|
|
518
|
+
* second implementation of the rules, it is the existing one with its
|
|
519
|
+
* intermediate results kept instead of consumed.
|
|
520
|
+
*/
|
|
521
|
+
export declare function foldProject(files: readonly string[], intrinsics?: readonly IntrinsicDef[]): Promise<Map<string, FoldProjectVerdict>>;
|
|
462
522
|
export {};
|
|
463
523
|
//# sourceMappingURL=fold-import.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fold-import.d.ts","sourceRoot":"","sources":["../../src/discovery/fold-import.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAMjC,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAkC,KAAK,iBAAiB,EAAyB,MAAM,cAAc,CAAC;AAuC7G,OAAO,EAA6B,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AAEH,mGAAmG;AACnG,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,iBAAiB,CAAC,CAAC;AAElF,MAAM,MAAM,cAAc,GACtB;IACE,EAAE,EAAE,IAAI,CAAC;IACT;;;;;;;;OAQG;IACH,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB;;;;;;;;;;;;;OAaG;IACH,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC;;;;;;;;;;;;OAYG;IACH,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAClC,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,SAAS,YAAY,EAAE,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IACzB;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpE;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IACjE;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC,CAAC;CAC/E;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,GAAE,SAAS,YAAY,EAAO,EACxC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,EACvD,QAAQ,GAAE,SAAS,MAAM,EAAO,EAChC,OAAO,UAAQ,GACd,WAAW,CAYb;AA2ID;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;;;;;OAMG;IACH,yBAAyB,EAAE,MAAM,CAAC;IAClC;;;OAGG;IACH,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAQD,gKAAgK;AAChK,wBAAgB,mBAAmB,IAAI,QAAQ,CAAC,mBAAmB,CAAC,CAEnE;AAED,0EAA0E;AAC1E,wBAAgB,wBAAwB,IAAI,IAAI,CAI/C;AAsTD,oDAAoD;AACpD,UAAU,aAAa;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;yEAGqE;IACrE,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC;CACjC;AAED,4FAA4F;AAC5F,UAAU,sBAAsB;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC;CACjC;AA28BD;;;;;;;;;;GAUG;AACH,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC;IAC1B;;;;;;;;;;;;;OAaG;IACH,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;IACnC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACpC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACtD;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;CACxF;AA0LD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,GAAG,MAAM,GAAG,SAAS,CA0D3G;AAiqDD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,SAAS,YAAY,EAAO,EACxC,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,cAAc,CAAC,CAEzB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AACH;;;;;;;;;;;;GAYG;AACH,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAwCzG;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,GACrD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"fold-import.d.ts","sourceRoot":"","sources":["../../src/discovery/fold-import.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQ/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AA8D1D;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,uFAAuF;IACvF,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,gGAAgG;IAChG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;;;;;;;;OAaG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAE5B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAE7B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,8DAA8D;IAC9D,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,qDAAqD;IACrD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,mDAAmD;IACnD,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB;;;OAGG;IACH,aAAa,EAAE,YAAY,EAAE,CAAC;CAC/B;AAED;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAiSjG"}
|
package/dist/index.d.ts
CHANGED
|
@@ -39,6 +39,7 @@ export * from "./graph-lens.js";
|
|
|
39
39
|
export * from "./detectLexicon.js";
|
|
40
40
|
export * from "./fold/fold.js";
|
|
41
41
|
export { findSubsetViolation, checkObjectMember, type SubsetViolation, type SubsetRuleId } from "./fold/subset.js";
|
|
42
|
+
export { foldProject, planFoldTaintWithEdges, type FoldProjectVerdict, type TaintPlan, type TaintEdgeKind, } from "./discovery/fold-import.js";
|
|
42
43
|
export * from "./lint/parser.js";
|
|
43
44
|
export * from "./lint/rule.js";
|
|
44
45
|
export * from "./lint/rules/index.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,QAAQ,CAAC;AACvB,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAK5B,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -3949,7 +3949,40 @@ export async function planFoldTaint(
|
|
|
3949
3949
|
files: readonly string[],
|
|
3950
3950
|
wouldFold: ReadonlyMap<string, boolean>,
|
|
3951
3951
|
liveSources?: ReadonlyMap<string, ReadonlySet<string>>,
|
|
3952
|
-
): Promise<
|
|
3952
|
+
): Promise<ReadonlySet<string>> {
|
|
3953
|
+
return (await planFoldTaintWithEdges(files, wouldFold, liveSources)).tainted;
|
|
3954
|
+
}
|
|
3955
|
+
|
|
3956
|
+
/** Which of the two rules put a file on the run path. */
|
|
3957
|
+
export type TaintEdgeKind =
|
|
3958
|
+
/** A file this one imports, directly or transitively, falls back to run (#1023). */
|
|
3959
|
+
| "importer"
|
|
3960
|
+
/** This file captured the objects of a file that falls back to run (#1044). */
|
|
3961
|
+
| "capture";
|
|
3962
|
+
|
|
3963
|
+
export interface TaintPlan {
|
|
3964
|
+
/** Every file that must run: the seed, plus everything reachable from it. */
|
|
3965
|
+
readonly tainted: ReadonlySet<string>;
|
|
3966
|
+
/**
|
|
3967
|
+
* For a file the walk reached (never for a seed file), the file whose taint
|
|
3968
|
+
* reached it and by which rule. chant#2406: the fallback reason has to name
|
|
3969
|
+
* the actual edge — a reverse-tainted file is not imported by anything that
|
|
3970
|
+
* runs, and saying it is sends a reader looking for an importer that does
|
|
3971
|
+
* not exist.
|
|
3972
|
+
*/
|
|
3973
|
+
readonly reachedBy: ReadonlyMap<string, { from: string; kind: TaintEdgeKind }>;
|
|
3974
|
+
}
|
|
3975
|
+
|
|
3976
|
+
/**
|
|
3977
|
+
* {@link planFoldTaint}'s walk, keeping the edge that fired for each file it
|
|
3978
|
+
* reaches. Split out for two consumers that need to say *why*: the fallback
|
|
3979
|
+
* reason in `discover()`, and {@link foldProject}'s verdicts.
|
|
3980
|
+
*/
|
|
3981
|
+
export async function planFoldTaintWithEdges(
|
|
3982
|
+
files: readonly string[],
|
|
3983
|
+
wouldFold: ReadonlyMap<string, boolean>,
|
|
3984
|
+
liveSources?: ReadonlyMap<string, ReadonlySet<string>>,
|
|
3985
|
+
): Promise<TaintPlan> {
|
|
3953
3986
|
const fileSet = new Set(files);
|
|
3954
3987
|
|
|
3955
3988
|
// file -> set of OTHER discovered files it relatively imports OR re-exports
|
|
@@ -3958,7 +3991,9 @@ export async function planFoldTaint(
|
|
|
3958
3991
|
|
|
3959
3992
|
// chant #1044 — reverse edges: consumed-file -> the folded files that
|
|
3960
3993
|
// captured its objects. Same taint set, same fixpoint walk; see this
|
|
3961
|
-
// function's doc for the crash this closes.
|
|
3994
|
+
// function's doc for the crash this closes. Kept in their own map as well,
|
|
3995
|
+
// so the walk below can tell which rule an edge belongs to.
|
|
3996
|
+
const reverse = new Map<string, Set<string>>();
|
|
3962
3997
|
for (const [consumer, sources] of liveSources ?? []) {
|
|
3963
3998
|
if (!fileSet.has(consumer)) continue;
|
|
3964
3999
|
for (const source of sources) {
|
|
@@ -3969,20 +4004,97 @@ export async function planFoldTaint(
|
|
|
3969
4004
|
edges.set(source, back);
|
|
3970
4005
|
}
|
|
3971
4006
|
back.add(consumer);
|
|
4007
|
+
let mine = reverse.get(source);
|
|
4008
|
+
if (!mine) {
|
|
4009
|
+
mine = new Set<string>();
|
|
4010
|
+
reverse.set(source, mine);
|
|
4011
|
+
}
|
|
4012
|
+
mine.add(consumer);
|
|
3972
4013
|
}
|
|
3973
4014
|
}
|
|
3974
4015
|
|
|
3975
4016
|
const tainted = new Set<string>(files.filter((f) => wouldFold.get(f) !== true));
|
|
4017
|
+
const reachedBy = new Map<string, { from: string; kind: TaintEdgeKind }>();
|
|
3976
4018
|
const queue = [...tainted];
|
|
3977
4019
|
while (queue.length > 0) {
|
|
3978
4020
|
const current = queue.shift()!;
|
|
3979
4021
|
for (const target of edges.get(current) ?? []) {
|
|
3980
4022
|
if (!tainted.has(target)) {
|
|
3981
4023
|
tainted.add(target);
|
|
4024
|
+
// A forward edge means `current` imports `target`; the reverse map is
|
|
4025
|
+
// consulted second so a file reachable both ways is reported as the
|
|
4026
|
+
// importer case, the one a reader can see in its own source.
|
|
4027
|
+
const forward = !reverse.get(current)?.has(target);
|
|
4028
|
+
reachedBy.set(target, { from: current, kind: forward ? "importer" : "capture" });
|
|
3982
4029
|
queue.push(target);
|
|
3983
4030
|
}
|
|
3984
4031
|
}
|
|
3985
4032
|
}
|
|
3986
4033
|
|
|
3987
|
-
return tainted;
|
|
4034
|
+
return { tainted, reachedBy };
|
|
4035
|
+
}
|
|
4036
|
+
|
|
4037
|
+
/** One file's place in a whole-build fold, as {@link foldProject} reports it. */
|
|
4038
|
+
export interface FoldProjectVerdict {
|
|
4039
|
+
/** What the build does with this file. */
|
|
4040
|
+
readonly verdict: "fold" | "run";
|
|
4041
|
+
/** What the file's own fold attempt concluded, before the taint walk. */
|
|
4042
|
+
readonly tentative: "fold" | "run";
|
|
4043
|
+
/** Present when `tentative` is "run": the located reason its own fold gave. */
|
|
4044
|
+
readonly reason?: string;
|
|
4045
|
+
/** Present when the file would have folded and taint overruled it. */
|
|
4046
|
+
readonly taintedBy?: { from: string; kind: TaintEdgeKind };
|
|
4047
|
+
/** The file's complete export namespace, present only when `verdict` is "fold". */
|
|
4048
|
+
readonly exports?: ReadonlyMap<string, unknown>;
|
|
4049
|
+
}
|
|
4050
|
+
|
|
4051
|
+
/**
|
|
4052
|
+
* Fold a whole set of project files and report every file's verdict
|
|
4053
|
+
* (chant#2408).
|
|
4054
|
+
*
|
|
4055
|
+
* `discover()` does this as part of building, and its per-file decisions are
|
|
4056
|
+
* not addressable from outside. Anything that wants to *check* the
|
|
4057
|
+
* cross-file rules needs the whole picture: the forward rule (#1023) needs an
|
|
4058
|
+
* importer, the reverse rule (#1044) needs a capturing sibling, and the
|
|
4059
|
+
* fixpoint needs the whole set, so none of the three is observable one file at
|
|
4060
|
+
* a time. The conformance suite of the specification is the first such caller
|
|
4061
|
+
* (INTENTIUS/typescript-as-data#62).
|
|
4062
|
+
*
|
|
4063
|
+
* Same session, same memo, same taint walk as a real build — this is not a
|
|
4064
|
+
* second implementation of the rules, it is the existing one with its
|
|
4065
|
+
* intermediate results kept instead of consumed.
|
|
4066
|
+
*/
|
|
4067
|
+
export async function foldProject(
|
|
4068
|
+
files: readonly string[],
|
|
4069
|
+
intrinsics: readonly IntrinsicDef[] = [],
|
|
4070
|
+
): Promise<Map<string, FoldProjectVerdict>> {
|
|
4071
|
+
const session = createFoldSession(intrinsics);
|
|
4072
|
+
const attempts = new Map<string, FoldFileResult>();
|
|
4073
|
+
for (const file of files) attempts.set(file, await tryFoldFile(file, intrinsics, session));
|
|
4074
|
+
|
|
4075
|
+
const plan = await planFoldTaintWithEdges(
|
|
4076
|
+
files,
|
|
4077
|
+
new Map(files.map((file) => [file, attempts.get(file)?.ok === true])),
|
|
4078
|
+
new Map(files.flatMap((file) => {
|
|
4079
|
+
const attempt = attempts.get(file);
|
|
4080
|
+
return attempt?.ok === true ? [[file, attempt.liveSources] as const] : [];
|
|
4081
|
+
})),
|
|
4082
|
+
);
|
|
4083
|
+
|
|
4084
|
+
const out = new Map<string, FoldProjectVerdict>();
|
|
4085
|
+
for (const file of files) {
|
|
4086
|
+
const attempt = attempts.get(file)!;
|
|
4087
|
+
const tentative = attempt.ok ? "fold" : "run";
|
|
4088
|
+
if (attempt.ok && !plan.tainted.has(file)) {
|
|
4089
|
+
out.set(file, { verdict: "fold", tentative, exports: attempt.exportedValues });
|
|
4090
|
+
continue;
|
|
4091
|
+
}
|
|
4092
|
+
out.set(file, {
|
|
4093
|
+
verdict: "run",
|
|
4094
|
+
tentative,
|
|
4095
|
+
reason: attempt.ok ? undefined : attempt.reason,
|
|
4096
|
+
taintedBy: attempt.ok ? plan.reachedBy.get(file) : undefined,
|
|
4097
|
+
});
|
|
4098
|
+
}
|
|
4099
|
+
return out;
|
|
3988
4100
|
}
|
package/src/discovery/index.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { relative } from "node:path";
|
|
1
2
|
import type { Declarable } from "../declarable";
|
|
2
3
|
import type { DiscoveryError } from "../errors";
|
|
3
4
|
import type { IntrinsicDef } from "../lexicon";
|
|
@@ -6,7 +7,7 @@ import { importModule } from "./import";
|
|
|
6
7
|
import { collectEntities } from "./collect";
|
|
7
8
|
import { resolveAttrRefs } from "./resolve";
|
|
8
9
|
import { buildDependencyGraph } from "./graph";
|
|
9
|
-
import { tryFoldFile,
|
|
10
|
+
import { tryFoldFile, planFoldTaintWithEdges, createFoldSession } from "./fold-import";
|
|
10
11
|
import { getProvenance } from "../provenance";
|
|
11
12
|
import type { BuildParamProvenance } from "../provenance";
|
|
12
13
|
import { buildParamValues } from "../build-params";
|
|
@@ -270,8 +271,8 @@ export async function discover(path: string, options?: DiscoveryOptions): Promis
|
|
|
270
271
|
foldAttempts.set(file, await tryFoldFile(file, options.intrinsics, foldSession));
|
|
271
272
|
}
|
|
272
273
|
}
|
|
273
|
-
const
|
|
274
|
-
? await
|
|
274
|
+
const taintPlan = options?.fold
|
|
275
|
+
? await planFoldTaintWithEdges(
|
|
275
276
|
files,
|
|
276
277
|
new Map(files.map((file) => [file, foldAttempts.get(file)?.ok === true])),
|
|
277
278
|
// chant #1044 — which files' OBJECTS each successful fold captured,
|
|
@@ -284,7 +285,8 @@ export async function discover(path: string, options?: DiscoveryOptions): Promis
|
|
|
284
285
|
}),
|
|
285
286
|
),
|
|
286
287
|
)
|
|
287
|
-
: new Set<string>();
|
|
288
|
+
: { tainted: new Set<string>(), reachedBy: new Map() };
|
|
289
|
+
const taintedFiles = taintPlan.tainted;
|
|
288
290
|
|
|
289
291
|
for (const file of files) {
|
|
290
292
|
if (options?.fold) {
|
|
@@ -307,9 +309,15 @@ export async function discover(path: string, options?: DiscoveryOptions): Promis
|
|
|
307
309
|
foldDecisions.push({ file, mode: "fold", resourceCount: folded.entities.length });
|
|
308
310
|
continue;
|
|
309
311
|
}
|
|
312
|
+
// chant#2406 — name the edge that actually fired. A reverse-tainted file
|
|
313
|
+
// is not imported by anything that falls back; saying so sends a reader
|
|
314
|
+
// looking for an importer that does not exist.
|
|
315
|
+
const edge = taintPlan.reachedBy.get(file);
|
|
310
316
|
const reason = !folded.ok
|
|
311
317
|
? folded.reason
|
|
312
|
-
:
|
|
318
|
+
: edge?.kind === "capture"
|
|
319
|
+
? `would fold in isolation, but it captured objects from ${relative(process.cwd(), edge.from)}, which falls back to run — folding independently would hold an instance the build never collects`
|
|
320
|
+
: `would fold in isolation, but a file that imports it (directly or transitively) falls back to run — folding independently would create a duplicate, non-identical instance`;
|
|
313
321
|
foldDecisions.push({ file, mode: "run", reason, reverseTainted: folded.ok });
|
|
314
322
|
}
|
|
315
323
|
|
package/src/index.ts
CHANGED
|
@@ -44,6 +44,18 @@ export * from "./fold/fold";
|
|
|
44
44
|
// half of the fold subset a conformance adapter needs that `fold()` alone
|
|
45
45
|
// does not expose. INTENTIUS/typescript-as-data#11.
|
|
46
46
|
export { findSubsetViolation, checkObjectMember, type SubsetViolation, type SubsetRuleId } from "./fold/subset";
|
|
47
|
+
// The whole-build fold. `fold()` and `foldModule()` answer one expression and
|
|
48
|
+
// one file; neither cross-file rule is observable at that granularity — the
|
|
49
|
+
// forward rule needs an importer, the reverse rule needs a capturing sibling,
|
|
50
|
+
// and the fixpoint needs the whole set. chant#2408,
|
|
51
|
+
// INTENTIUS/typescript-as-data#62.
|
|
52
|
+
export {
|
|
53
|
+
foldProject,
|
|
54
|
+
planFoldTaintWithEdges,
|
|
55
|
+
type FoldProjectVerdict,
|
|
56
|
+
type TaintPlan,
|
|
57
|
+
type TaintEdgeKind,
|
|
58
|
+
} from "./discovery/fold-import";
|
|
47
59
|
export * from "./lint/parser";
|
|
48
60
|
export * from "./lint/rule";
|
|
49
61
|
export * from "./lint/rules";
|