71 lines
2.1 KiB
TypeScript
71 lines
2.1 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 { javascriptApplicationAnalysisResultSchema } from "../../../../src/domain/javascript/javascriptApplicationAnalysis.js";
|
|
import { analyzeJavaScriptApplication } from "../../../support/javascriptApplicationScope.js";
|
|
|
|
it.each([
|
|
{
|
|
expression:
|
|
'flag ? require("./dependency.js").value : require("./dependency.js").value',
|
|
resolved: true,
|
|
},
|
|
{
|
|
expression:
|
|
'require("./dependency.js").value || require("./dependency.js").value',
|
|
resolved: true,
|
|
},
|
|
{
|
|
expression: 'flag ? require("./dependency.js").value : localValue',
|
|
resolved: false,
|
|
},
|
|
{
|
|
expression: 'require("./dependency.js").value ?? localValue',
|
|
resolved: false,
|
|
},
|
|
])(
|
|
"preserves export provenance for $expression",
|
|
async ({ expression, resolved }) => {
|
|
const root = await createTestTempDirectory("rea-js-module-provenance-");
|
|
await Promise.all([
|
|
writeFile(
|
|
join(root, "app.js"),
|
|
`const selected = ${expression};\nexport { selected };\n`,
|
|
),
|
|
writeFile(join(root, "dependency.js"), "exports.value = 1;\n"),
|
|
]);
|
|
|
|
const result = await analyzeJavaScriptApplication({
|
|
input_path: root,
|
|
format: "directory",
|
|
});
|
|
if (!result.ok) throw result.error;
|
|
const analysis = javascriptApplicationAnalysisResultSchema.parse(
|
|
JSON.parse(JSON.stringify(result.value.normalized_result)),
|
|
);
|
|
|
|
const exportImports = analysis.graph.edges.filter(
|
|
({ relation, properties }) =>
|
|
relation === "imports" && properties.exported_name === "selected",
|
|
);
|
|
if (!resolved) {
|
|
expect(exportImports).toEqual([]);
|
|
return;
|
|
}
|
|
expect(exportImports).toContainEqual(
|
|
expect.objectContaining({
|
|
relation: "imports",
|
|
properties: expect.objectContaining({
|
|
specifier: "./dependency.js",
|
|
imported_path: ["value"],
|
|
resolved_path: "dependency.js",
|
|
resolution_status: "resolved",
|
|
}),
|
|
}),
|
|
);
|
|
},
|
|
);
|