mirror of
https://github.com/morluto/rea.git
synced 2026-10-29 10:55:57 +00:00
* fix(javascript): preserve literal percent runtime paths * fix(javascript): ignore resolve prefixes before the final anchor * fix(electron): retain application roots for loadFile declarations * fix(electron): resolve loadFile from enclosing application package * fix(electron): retain outer application root across package scopes * fix(electron): derive application ownership from inventoried packages * fix(electron): retain resolved package entrypoint ownership * fix(electron): preserve competing application ownership * fix(electron): retain invalid and omitted runtime ownership * fix(electron): preserve omitted module ownership and runtime paths * fix(electron): preserve proven roots before confining page paths * fix(electron): retain possible owners behind missing imports * fix(electron): distinguish absent imports and owned page candidates * fix(electron): keep unavailable JSON out of owner gaps * fix(electron): retain exact loader formats and default entry status * fix(electron): retain unavailable entrypoint ownership candidates * test(ghidra): preserve Windows Node probe prerequisites * test(ghidra): assert cancellation during profile shutdown * fix(electron): separate examined imports from frontend ownership * fix(electron): retain unavailable directory entrypoint owners * test(jeb): retain Linux ownership prerequisite in isolation * fix(javascript): retain unchecked loader ownership and literal main paths * fix(javascript): preserve runtime paths and call-site module aliases * fix(javascript): bound module alias traversal and preserve projections * fix(javascript): retain host module and nested artifact path boundaries * fix(javascript): preserve ESM and archive module loader provenance * test(javascript): distinguish unmapped containers from missing exports * fix: retain default module aliases and Electron builtin imports * fix: preserve host file URL and inward ASAR ownership * fix: preserve CommonJS file URL classification in CI fixtures * fix: retain bound module loaders and Windows entrypoint uncertainty * fix: retain ASAR uncertainty and invalidate changed Electron app roots * fix(javascript): retain ownership uncertainty across loader boundaries * fix(javascript): preserve loader sources and bound alias queries * fix(javascript): retain destructured loader sources * fix(javascript): preserve loader uncertainty at resolution boundaries * fix(javascript): preserve callable and package launch ownership * fix(javascript): preserve captured values across member reads * test(process): assert tagged filesystem cancellation failures * fix(javascript): preserve inventory bases and invocation read timing * fix(javascript): preserve ownership across indirect and unread loads * test(javascript): order fixture directory creation on Windows * test(javascript): share ordered filesystem fixture writer * fix(javascript): unify loader provenance and package validation * fix(javascript): preserve captured Node require loader values * fix(javascript): preserve loader invocation authority * fix(javascript): verify generic loader invocation authority * fix(javascript): preserve conditional loader method alternatives * fix(javascript): require proven factories for source association * fix(javascript): honor replaced Electron app path setters * fix(javascript): prove path and assignment source ownership * fix(javascript): retain native delegate eligibility through shared writes * fix(process): settle stale baseline errors after confirmed absence * fix(javascript): preserve assignment and path boundary evidence * fix(javascript): prove source-directory resolve anchors * fix: preserve application path provenance and portable schemas * fix(javascript): retain CommonJS exported setter effects * fix: isolate Linux identity observations and retain native module exports * fix(javascript): preserve published app and helper provenance * fix(javascript): normalize typed stores and native path fixtures
190 lines
5.1 KiB
TypeScript
190 lines
5.1 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import {
|
|
classifyPackageImportSpecifier,
|
|
classifyPackageImportTargetString,
|
|
lookupExactPackageImport,
|
|
} from "./javascriptPackageImportAliases.js";
|
|
|
|
describe("package import specifier classification", () => {
|
|
it("treats an exact hash alias as an exact key", () => {
|
|
expect(classifyPackageImportSpecifier("#config")).toEqual({
|
|
kind: "exact",
|
|
key: "#config",
|
|
});
|
|
});
|
|
|
|
it.each(["#internal/env", "#/hidden"])(
|
|
"treats %j as an exact key",
|
|
(specifier) => {
|
|
expect(classifyPackageImportSpecifier(specifier)).toEqual({
|
|
kind: "exact",
|
|
key: specifier,
|
|
});
|
|
},
|
|
);
|
|
|
|
it.each(["#", "#/", "#utils/"])(
|
|
"rejects reserved specifier %j",
|
|
(specifier) => {
|
|
expect(classifyPackageImportSpecifier(specifier)).toEqual({
|
|
kind: "invalid",
|
|
});
|
|
},
|
|
);
|
|
|
|
it.each(["#internal/*", "#*"])(
|
|
"leaves pattern specifier %j unresolved",
|
|
(specifier) => {
|
|
expect(classifyPackageImportSpecifier(specifier)).toEqual({
|
|
kind: "pattern",
|
|
});
|
|
},
|
|
);
|
|
});
|
|
|
|
describe("exact package import lookup", () => {
|
|
it("returns the exact target without falling through to another key", () => {
|
|
expect(
|
|
lookupExactPackageImport(
|
|
{ "#config": "./config.cjs", "#other": "./other.cjs" },
|
|
"#config",
|
|
),
|
|
).toEqual({
|
|
kind: "found",
|
|
target: "./config.cjs",
|
|
declared: ["#config", "#other"],
|
|
});
|
|
});
|
|
|
|
it("names declared exact keys when the requested alias is absent", () => {
|
|
expect(
|
|
lookupExactPackageImport({ "#config": "./config.cjs" }, "#missing"),
|
|
).toEqual({
|
|
kind: "missing-key",
|
|
declared: ["#config"],
|
|
});
|
|
});
|
|
|
|
it("does not claim a miss when the map only has pattern keys", () => {
|
|
expect(
|
|
lookupExactPackageImport({ "#internal/*": "./src/*.js" }, "#internal/a"),
|
|
).toEqual({
|
|
kind: "pattern-unresolved",
|
|
declared: ["#internal/*"],
|
|
});
|
|
});
|
|
|
|
it.each([
|
|
["#bar/*", "#foo", "missing-key"],
|
|
["#internal/*.js", "#internal/file.cjs", "missing-key"],
|
|
["#internal/*.js", "#internal/.js", "missing-key"],
|
|
["#internal/*end", "#internal/end", "missing-key"],
|
|
["#internal/*/*", "#internal/a/b", "missing-key"],
|
|
["#internal/", "#internal/a", "missing-key"],
|
|
["#internal/*.js", "#internal/a.js", "pattern-unresolved"],
|
|
["#internal/*.js", "#internal/deep/a.js", "pattern-unresolved"],
|
|
["#internal/*end", "#internal/aend", "pattern-unresolved"],
|
|
] as const)(
|
|
"matches only a single nonempty wildcard between its prefix and suffix: %s, %s",
|
|
(pattern, specifier, kind) => {
|
|
expect(
|
|
lookupExactPackageImport(
|
|
{ [pattern]: "./unsupported/*.js" },
|
|
specifier,
|
|
),
|
|
).toEqual({ kind, declared: [pattern] });
|
|
},
|
|
);
|
|
|
|
it.each(
|
|
[null, { require: "./config.cjs" }, ["./config.cjs"]].map((target) => ({
|
|
target,
|
|
})),
|
|
)(
|
|
"preserves an exact target $target ahead of a matching wildcard",
|
|
({ target }) => {
|
|
expect(
|
|
lookupExactPackageImport(
|
|
{ "#config": target, "#*": "./unsupported/*.js" },
|
|
"#config",
|
|
),
|
|
).toEqual({
|
|
kind: "found",
|
|
target,
|
|
declared: ["#config", "#*"],
|
|
});
|
|
},
|
|
);
|
|
|
|
it("still selects an exact key when the same map also has patterns", () => {
|
|
expect(
|
|
lookupExactPackageImport(
|
|
{ "#config": "./config.cjs", "#internal/*": "./src/*.js" },
|
|
"#config",
|
|
),
|
|
).toEqual({
|
|
kind: "found",
|
|
target: "./config.cjs",
|
|
declared: ["#config", "#internal/*"],
|
|
});
|
|
});
|
|
|
|
it.each([undefined, null, "./config.cjs", ["#config"], 7] as const)(
|
|
"treats non-object imports value %j as an undefined map",
|
|
(imports) => {
|
|
expect(lookupExactPackageImport(imports, "#config")).toEqual({
|
|
kind: "undefined-map",
|
|
});
|
|
},
|
|
);
|
|
|
|
it("does not treat a pattern key as an exact match for itself", () => {
|
|
expect(
|
|
lookupExactPackageImport({ "#internal/*": "./src/*.js" }, "#internal/*"),
|
|
).toEqual({
|
|
kind: "pattern-unresolved",
|
|
declared: ["#internal/*"],
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("package import target string classification", () => {
|
|
it("keeps package-local relative targets", () => {
|
|
expect(classifyPackageImportTargetString("./config.cjs")).toEqual({
|
|
kind: "relative",
|
|
target: "./config.cjs",
|
|
});
|
|
});
|
|
|
|
it("marks recursive hash aliases as recursive", () => {
|
|
expect(classifyPackageImportTargetString("#other")).toEqual({
|
|
kind: "recursive",
|
|
target: "#other",
|
|
});
|
|
});
|
|
|
|
it.each(["lodash", "pkg/subpath"])(
|
|
"marks %j as an external-package target",
|
|
(target) => {
|
|
expect(classifyPackageImportTargetString(target)).toEqual({
|
|
kind: "external-package",
|
|
target,
|
|
});
|
|
},
|
|
);
|
|
|
|
it.each([
|
|
"../outside.js",
|
|
"/outside.js",
|
|
"https://example.invalid/mod.js",
|
|
"file:///outside.js",
|
|
"node:fs",
|
|
])("marks %j as an invalid import target", (target) => {
|
|
expect(classifyPackageImportTargetString(target)).toEqual({
|
|
kind: "invalid",
|
|
target,
|
|
});
|
|
});
|
|
});
|