mirror of
https://github.com/hanzoai/unrs-resolver.git
synced 2026-09-24 17:03:52 +00:00
- Move dot/, abnormal-relative-* into fixtures/resolve/ (used by resolve.rs) - Move global-pnp/ into fixtures/pnp/ (used by pnp.rs) - Move pnpm-workspace/ into fixtures/pnpm/ (used by napi tests) - Move bench-tsconfig-paths/ into fixtures/tsconfig/ (used by benches) - Delete unused fixtures/prefer-file-over-dir/ Co-authored-by: Hanzo Dev <[email protected]>
247 lines
7.0 KiB
JavaScript
247 lines
7.0 KiB
JavaScript
import { join } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
import { assert, test } from "vite-plus/test";
|
|
|
|
let ResolverFactory;
|
|
|
|
if (process.env.WASI_TEST) {
|
|
const wasi = await import("../resolver.wasi.cjs");
|
|
ResolverFactory = wasi.ResolverFactory;
|
|
} else {
|
|
const napi = await import("../index.js");
|
|
ResolverFactory = napi.ResolverFactory;
|
|
}
|
|
|
|
const currentDir = join(fileURLToPath(import.meta.url), "..");
|
|
|
|
const rootDir = join(currentDir, "..", "..");
|
|
|
|
const fixturesDir = join(rootDir, "fixtures");
|
|
|
|
const enhancedResolveRoot = join(fixturesDir, "enhanced-resolve", "test", "fixtures");
|
|
|
|
// https://github.com/webpack/enhanced-resolve/blob/main/test/resolve.test.js
|
|
|
|
for (const [title, context, request, expected] of [
|
|
[
|
|
"absolute path",
|
|
enhancedResolveRoot,
|
|
join(enhancedResolveRoot, "main1.js"),
|
|
join(enhancedResolveRoot, "main1.js"),
|
|
],
|
|
["file with .js", enhancedResolveRoot, "./main1.js", join(enhancedResolveRoot, "main1.js")],
|
|
["file without extension", enhancedResolveRoot, "./main1", join(enhancedResolveRoot, "main1.js")],
|
|
["another file with .js", enhancedResolveRoot, "./a.js", join(enhancedResolveRoot, "a.js")],
|
|
["another file without extension", enhancedResolveRoot, "./a", join(enhancedResolveRoot, "a.js")],
|
|
[
|
|
"file in module with .js",
|
|
enhancedResolveRoot,
|
|
"m1/a.js",
|
|
join(enhancedResolveRoot, "node_modules/m1/a.js"),
|
|
],
|
|
[
|
|
"file in module without extension",
|
|
enhancedResolveRoot,
|
|
"m1/a",
|
|
join(enhancedResolveRoot, "node_modules/m1/a.js"),
|
|
],
|
|
[
|
|
"another file in module without extension",
|
|
enhancedResolveRoot,
|
|
"complexm/step1",
|
|
join(enhancedResolveRoot, "node_modules/complexm/step1.js"),
|
|
],
|
|
[
|
|
"from submodule to file in sibling module",
|
|
join(enhancedResolveRoot, "node_modules/complexm"),
|
|
"m2/b.js",
|
|
join(enhancedResolveRoot, "node_modules/m2/b.js"),
|
|
],
|
|
[
|
|
"from nested directory to overwritten file in module",
|
|
join(enhancedResolveRoot, "multiple-modules"),
|
|
"m1/a.js",
|
|
join(enhancedResolveRoot, "multiple-modules/node_modules/m1/a.js"),
|
|
],
|
|
[
|
|
"from nested directory to not overwritten file in module",
|
|
join(enhancedResolveRoot, "multiple-modules"),
|
|
"m1/b.js",
|
|
join(enhancedResolveRoot, "node_modules/m1/b.js"),
|
|
],
|
|
[
|
|
"file with query",
|
|
enhancedResolveRoot,
|
|
"./main1.js?query",
|
|
join(enhancedResolveRoot, "main1.js?query"),
|
|
],
|
|
[
|
|
"file with fragment",
|
|
enhancedResolveRoot,
|
|
"./main1.js#fragment",
|
|
join(enhancedResolveRoot, "main1.js#fragment"),
|
|
],
|
|
[
|
|
"file with fragment and query",
|
|
enhancedResolveRoot,
|
|
"./main1.js#fragment?query",
|
|
join(enhancedResolveRoot, "main1.js#fragment?query"),
|
|
],
|
|
[
|
|
"file with query and fragment",
|
|
enhancedResolveRoot,
|
|
"./main1.js?#fragment",
|
|
join(enhancedResolveRoot, "main1.js?#fragment"),
|
|
],
|
|
|
|
[
|
|
"file with query (unicode)",
|
|
enhancedResolveRoot,
|
|
"./测试.js?query",
|
|
join(enhancedResolveRoot, "测试.js?query"),
|
|
],
|
|
[
|
|
"file with fragment (unicode)",
|
|
enhancedResolveRoot,
|
|
"./测试.js#fragment",
|
|
join(enhancedResolveRoot, "测试.js#fragment"),
|
|
],
|
|
[
|
|
"file with fragment and query (unicode)",
|
|
enhancedResolveRoot,
|
|
"./测试.js#fragment?query",
|
|
join(enhancedResolveRoot, "测试.js#fragment?query"),
|
|
],
|
|
[
|
|
"file with query and fragment (unicode)",
|
|
enhancedResolveRoot,
|
|
"./测试.js?#fragment",
|
|
join(enhancedResolveRoot, "测试.js?#fragment"),
|
|
],
|
|
|
|
[
|
|
"file in module with query",
|
|
enhancedResolveRoot,
|
|
"m1/a?query",
|
|
join(enhancedResolveRoot, "node_modules/m1/a.js?query"),
|
|
],
|
|
[
|
|
"file in module with fragment",
|
|
enhancedResolveRoot,
|
|
"m1/a#fragment",
|
|
join(enhancedResolveRoot, "node_modules/m1/a.js#fragment"),
|
|
],
|
|
[
|
|
"file in module with fragment and query",
|
|
enhancedResolveRoot,
|
|
"m1/a#fragment?query",
|
|
join(enhancedResolveRoot, "node_modules/m1/a.js#fragment?query"),
|
|
],
|
|
[
|
|
"file in module with query and fragment",
|
|
enhancedResolveRoot,
|
|
"m1/a?#fragment",
|
|
join(enhancedResolveRoot, "node_modules/m1/a.js?#fragment"),
|
|
],
|
|
[
|
|
"differ between directory and file, resolve file",
|
|
enhancedResolveRoot,
|
|
"./dirOrFile",
|
|
join(enhancedResolveRoot, "dirOrFile.js"),
|
|
],
|
|
[
|
|
"differ between directory and file, resolve directory",
|
|
enhancedResolveRoot,
|
|
"./dirOrFile/",
|
|
join(enhancedResolveRoot, "dirOrFile/index.js"),
|
|
],
|
|
[
|
|
"find node_modules outside of node_modules",
|
|
join(enhancedResolveRoot, "browser-module/node_modules"),
|
|
"m1/a",
|
|
join(enhancedResolveRoot, "node_modules/m1/a.js"),
|
|
],
|
|
[
|
|
"don't crash on main field pointing to self",
|
|
enhancedResolveRoot,
|
|
"./main-field-self",
|
|
join(enhancedResolveRoot, "./main-field-self/index.js"),
|
|
],
|
|
[
|
|
"don't crash on main field pointing to self (2)",
|
|
enhancedResolveRoot,
|
|
"./main-field-self2",
|
|
join(enhancedResolveRoot, "./main-field-self2/index.js"),
|
|
],
|
|
// enhanced-resolve has `#` prepended with a `\0`, they are removed from the
|
|
// following 3 expected test results.
|
|
// See https://github.com/webpack/enhanced-resolve#escaping
|
|
[
|
|
"handle fragment edge case (no fragment)",
|
|
enhancedResolveRoot,
|
|
"./no#fragment/#/#",
|
|
join(enhancedResolveRoot, "no#fragment", "#", "#.js"),
|
|
],
|
|
[
|
|
"handle fragment edge case (fragment)",
|
|
enhancedResolveRoot,
|
|
"./no#fragment/#/",
|
|
join(enhancedResolveRoot, "no.js#fragment") + "/#/",
|
|
],
|
|
[
|
|
"handle fragment escaping",
|
|
enhancedResolveRoot,
|
|
"./no\0#fragment/\0#/\0##fragment",
|
|
join(enhancedResolveRoot, "no#fragment", "#", "#.js#fragment"),
|
|
],
|
|
]) {
|
|
test(title, () => {
|
|
const resolver = new ResolverFactory({
|
|
modules: ["src/a", "src/b", "src/common", "node_modules"],
|
|
extensions: [".js", ".jsx", ".ts", ".tsx"],
|
|
});
|
|
|
|
assert.equal(resolver.sync(context, request).path, expected);
|
|
});
|
|
}
|
|
|
|
const pnpmDir = join(rootDir, "node_modules", ".pnpm");
|
|
|
|
test("resolve pnpm package", () => {
|
|
const pnpmProjectPath = join(fixturesDir, "pnpm");
|
|
const resolver = new ResolverFactory({
|
|
aliasFields: ["browser"],
|
|
});
|
|
|
|
const styledComponents = resolver.sync(pnpmProjectPath, "styled-components");
|
|
assert.deepEqual(
|
|
styledComponents.path,
|
|
join(
|
|
pnpmDir,
|
|
"[email protected][email protected][email protected][email protected]/node_modules/styled-components/dist/styled-components.browser.cjs.js",
|
|
),
|
|
);
|
|
|
|
const react = resolver.sync(
|
|
join(
|
|
pnpmDir,
|
|
"[email protected][email protected][email protected][email protected]/node_modules/styled-components",
|
|
),
|
|
"react",
|
|
);
|
|
assert.deepEqual(react.path, join(pnpmDir, "[email protected]/node_modules/react/index.js"));
|
|
});
|
|
|
|
test("resolve recursive symbol link", () => {
|
|
const workspaceProjectPath = join(fixturesDir, "pnpm/pnpm-workspace");
|
|
const resolver = new ResolverFactory({});
|
|
|
|
const react = resolver.sync(
|
|
join(workspaceProjectPath, "./packages/app"),
|
|
"./node_modules/@monorepo/lib/node_modules/react/package.json",
|
|
);
|
|
|
|
assert.deepEqual(react.path, join(pnpmDir, "[email protected]/node_modules/react/package.json"));
|
|
});
|