mirror of
https://github.com/morluto/rea.git
synced 2026-11-10 00:36:35 +00:00
121 lines
4.0 KiB
TypeScript
121 lines
4.0 KiB
TypeScript
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);
|
|
});
|