Require a caller-owned artifact resource scope for source traversal and Git metadata reads. Preserve cancellation, filesystem reasons, partial entries and bytes, and cleanup observations through import and the CLI. Transfer exact failed file owners at regular-file admission and close boundaries, including multiple failures encountered by Git reference resolution. Validation: 169 focused tests passed across 26 files; two Windows-only cases skipped. Build, typecheck, lint, formatting, knip, architecture guards, discovery and docs checks passed. BREAKING CHANGE: Reference source readers and imports require an ArtifactResourceScope. VCS metadata reads return Result, and CLI import failures include observed details and partial evidence.
66 lines
2.0 KiB
TypeScript
66 lines
2.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";
|
|
|
|
it("resolves dynamic source imports while retaining computed targets as unknown", async () => {
|
|
const root = await createTestTempDirectory("rea-reference-dynamic-import-");
|
|
await Promise.all([
|
|
writeFile(
|
|
join(root, "main.ts"),
|
|
[
|
|
'import "./static";',
|
|
'require("./common");',
|
|
'const lazy = import("./lazy");',
|
|
'async function load() { return await import("./data.json", { with: { type: "json" } }); }',
|
|
'const name = "./not-guessed.js"; import(name);',
|
|
"import(`./${name}.js`);",
|
|
'import("node:fs");',
|
|
].join("\n"),
|
|
),
|
|
...["static.ts", "common.js", "lazy.ts"].map((path) =>
|
|
writeFile(join(root, path), "export {};\n"),
|
|
),
|
|
writeFile(join(root, "data.json"), '{"value":1}\n'),
|
|
]);
|
|
|
|
const result = await importReferenceSource({
|
|
root,
|
|
caller: "reference-dynamic-import-test",
|
|
policy: { secretPatterns: [] },
|
|
});
|
|
if (!result.ok) throw result.error;
|
|
expect(result.value.parse_failures).toEqual([]);
|
|
expect(result.value.relationships).toHaveLength(6);
|
|
for (const [to, kind] of [
|
|
["static.ts", "imports"],
|
|
["common.js", "requires"],
|
|
["lazy.ts", "imports"],
|
|
["data.json", "imports"],
|
|
])
|
|
expect(result.value.relationships).toContainEqual({
|
|
from_path: "main.ts",
|
|
to,
|
|
kind,
|
|
resolution: "internal",
|
|
parse_state: "parsed",
|
|
});
|
|
expect(result.value.relationships).toContainEqual({
|
|
from_path: "main.ts",
|
|
to: "<dynamic-import>",
|
|
kind: "imports",
|
|
resolution: "unknown",
|
|
parse_state: "partial",
|
|
});
|
|
expect(result.value.relationships).toContainEqual({
|
|
from_path: "main.ts",
|
|
to: "node:fs",
|
|
kind: "imports",
|
|
resolution: "external",
|
|
parse_state: "parsed",
|
|
});
|
|
});
|