import { writeFile } from "node:fs/promises"; import { join } from "node:path"; import { expect, it } from "vitest"; import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js"; import { importReferenceSource } from "../../support/referenceSourceResourceScope.js"; const constructorSources = { ".MJS": 'import {join} from "node:path"; require("./dep.cjs");', ".TS": 'import {join} from "node:path"; require("./dep.cjs");', "child-call.cjs": 'require.call.extra=1; require.call(null,"./dep.cjs");', "child-apply.cjs": 'require.apply.extra=1; require.apply(null,["./dep.cjs"]);', "child-resolve.cjs": 'require.resolve.extra=1; require.resolve("./dep.cjs");', "direct.cjs": 'new require("./dep.cjs");', "wrapped.cts": 'new (require as any)("./dep.cjs");', "wrapped-call.cts": '(require as any)("./dep.cjs");', "alias-direct.cjs": 'const box={load:require};box.load("./dep.cjs");', "alias-direct-replaced.cjs": 'const box={load:require};box.load=()=>0;box.load("./dep.cjs");', "alias-direct-deferred.cjs": 'const box={load:require};function replace(){box.load=()=>0} replace();box.load("./dep.cjs");', "nested-call.cjs": 'const box={load:require};box.load.call(null,"./dep.cjs");', "nested-mutated.cjs": 'const box={load:require};box.load.call=()=>0;box.load.call(null,"./dep.cjs");', "nested-parent.cjs": 'const box={load:require};box.load=()=>0;box.load.call(null,"./dep.cjs");', "nested-child.cjs": 'const box={load:require};box.load.call.extra=1;box.load.call(null,"./dep.cjs");', "nested-apply.cjs": 'const box={load:require};box.load.apply(null,["./dep.cjs"]);', "nested-unknown.MJS": 'const box={load:require};box.load.call(null,"./dep.cjs");', "wrapped-receiver.TS": '(require as any).resolve("./dep.cjs");', "wrapped-resolve.cts": '(require as any).resolve("./dep.cjs");', "wrapped-mutated.cts": 'require.call=()=>0; (require.call as any)(null,"./dep.cjs");', "alias.MJS": 'const load=require; new load("./dep.cjs");', "shadow.MJS": 'const require=function() {}; new require("./dep.cjs");', "dep.cjs": "module.exports = {};", }; it("retains constructor loader requests without inventing host authority", async () => { const root = await createTestTempDirectory("rea-reference-loader-new-"); await Promise.all( Object.entries(constructorSources).map(([name, source]) => writeFile(join(root, name), source), ), ); const result = await importReferenceSource({ root, caller: "reference-loader-constructor-test", policy: { secretPatterns: [] }, }); if (!result.ok) throw result.error; expect(result.value.parse_failures).toEqual([]); expect(result.value.entries).toEqual( expect.arrayContaining([ expect.objectContaining({ path: ".MJS", language: "JavaScript", classifications: ["source"], }), expect.objectContaining({ path: ".TS", language: "TypeScript", classifications: ["source"], }), ]), ); for (const from_path of [ "direct.cjs", "child-call.cjs", "child-apply.cjs", "child-resolve.cjs", "wrapped.cts", "wrapped-call.cts", "nested-call.cjs", "alias-direct.cjs", "nested-child.cjs", "nested-apply.cjs", "wrapped-resolve.cts", ]) { expect(result.value.relationships).toContainEqual({ from_path, to: "dep.cjs", kind: "requires", resolution: "internal", parse_state: "parsed", }); } for (const from_path of [ "nested-unknown.MJS", "alias.MJS", ".MJS", ".TS", "wrapped-receiver.TS", "alias-direct-replaced.cjs", "alias-direct-deferred.cjs", ]) { expect(result.value.relationships).toContainEqual({ from_path, to: "./dep.cjs", kind: "requires", resolution: "unknown", parse_state: "partial", }); } expect( result.value.relationships.some(({ from_path }) => [ "shadow.MJS", "wrapped-mutated.cts", "nested-mutated.cjs", "nested-parent.cjs", ].includes(from_path), ), ).toBe(false); }); it("indexes returned loader reads before publishing dependency edges", async () => { const root = await createTestTempDirectory("rea-returned-loader-reads-"); const sources = { "unchanged.cjs": 'const box={load:require};(()=>box.load)()("./dep.cjs");', "child-only.cjs": 'const box={load:require};box.load.extra=1;(()=>box.load)()("./dep.cjs");', "captured-before.cjs": 'const box={load:require};const load=box.load;box.load=()=>{};(()=>load)()("./dep.cjs");', "nested-unchanged.cjs": 'const box={api:{load:require}};(()=>box.api.load)()("./dep.cjs");', "overwritten.cjs": 'const box={load:require};box.load=()=>{};(()=>box.load)()("./dep.cjs");', "conditional.cjs": 'const box={load:require};box.load=()=>{};(()=>(true?box.load:box.load))()("./dep.cjs");', "sequence.cjs": 'const box={load:require};box.load=()=>{};(()=>(0,box.load))()("./dep.cjs");', "deleted.cjs": 'const box={load:require};delete box.load;(()=>box.load)()("./dep.cjs");', "nested-replaced.cjs": 'const box={api:{load:require}};box.api.load=()=>{};(()=>box.api.load)()("./dep.cjs");', "own-write.cjs": 'const box={load:require};(()=>(box.load=()=>{},box.load))()("./dep.cjs");', "local.cjs": 'const box={load:()=>{}};(()=>box.load)()("./dep.cjs");', "direct-overwritten.cjs": 'const box={load:require};box.load=()=>{};box.load("./dep.cjs");', "dep.cjs": "module.exports={};", }; await Promise.all( Object.entries(sources).map(([name, source]) => writeFile(join(root, name), source), ), ); const result = await importReferenceSource({ root, caller: "returned-loader-reads", policy: { secretPatterns: [] }, }); if (!result.ok) throw result.error; expect(result.value.parse_failures).toEqual([]); expect(result.value.relationships).toEqual([ ...["captured-before.cjs", "child-only.cjs"].map((from_path) => ({ from_path, to: "dep.cjs", kind: "requires", resolution: "internal", parse_state: "parsed", })), { from_path: "direct-overwritten.cjs", to: "./dep.cjs", kind: "requires", resolution: "unknown", parse_state: "partial", }, ...["nested-unchanged.cjs", "unchanged.cjs"].map((from_path) => ({ from_path, to: "dep.cjs", kind: "requires", resolution: "internal", parse_state: "parsed", })), ]); });