Skip to content

Commit d224e84

Browse files
committed
fix(resolve): make sure parentURL is a dir
1 parent 3298489 commit d224e84

5 files changed

Lines changed: 32 additions & 15 deletions

File tree

lib/types.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,6 @@ export interface TransformResult {
164164

165165
export interface JitiResolveOptions {
166166
conditions?: string[];
167-
parentURL?: string;
167+
parentURL?: string | URL;
168168
try?: boolean;
169169
}

src/jiti.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export default function createJiti(
6464
filename = process.cwd();
6565
}
6666
if (!isNested && isDir(filename)) {
67-
filename = join(filename, "index.js");
67+
filename = join(filename, "_index.js");
6868
}
6969

7070
const url = pathToFileURL(filename);

src/require.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export function jitiRequire(
7070
// Check for .json modules
7171
if (ext === ".json") {
7272
debug(ctx, "[json]", filename);
73-
const jsonModule = ctx.nativeRequire(id);
73+
const jsonModule = ctx.nativeRequire(filename);
7474
if (jsonModule && !("default" in jsonModule)) {
7575
Object.defineProperty(jsonModule, "default", {
7676
value: jsonModule,
@@ -89,13 +89,13 @@ export function jitiRequire(
8989
opts.async ? "[import]" : "[require]",
9090
filename,
9191
);
92-
return nativeImportOrRequire(ctx, id, opts.async);
92+
return nativeImportOrRequire(ctx, filename, opts.async);
9393
}
9494

9595
// Force native modules
9696
if (ctx.isNativeRe.test(filename)) {
9797
debug(ctx, "[native]", opts.async ? "[import]" : "[require]", filename);
98-
return nativeImportOrRequire(ctx, id, opts.async);
98+
return nativeImportOrRequire(ctx, filename, opts.async);
9999
}
100100

101101
// Check for runtime cache

src/resolve.ts

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { resolveAlias } from "pathe/utils";
2-
import { resolvePathSync } from "mlly";
2+
import { fileURLToPath, resolvePathSync } from "mlly";
3+
import { join, dirname } from "pathe";
34
import type { Context, JitiResolveOptions } from "./types";
5+
import { isDir } from "./utils";
46

57
const JS_EXT_RE = /\.(c|m)?j(sx?)$/;
68
const TS_EXT_RE = /\.(c|m)?t(sx?)$/;
@@ -10,7 +12,7 @@ export function jitiResolve(
1012
id: string,
1113
options: JitiResolveOptions & { async?: boolean; paths?: string[] },
1214
) {
13-
let resolved, err;
15+
let resolved, lastError;
1416

1517
if (ctx.isNativeRe.test(id)) {
1618
return id;
@@ -21,6 +23,12 @@ export function jitiResolve(
2123
id = resolveAlias(id, ctx.alias);
2224
}
2325

26+
// Resolve parent URL
27+
let parentURL = options?.parentURL || ctx.url;
28+
if (isDir(parentURL)) {
29+
parentURL = join(parentURL as string, "_index.js");
30+
}
31+
2432
// Try resolving with ESM compatible Node.js resolution in async context
2533
const conditionSets = (
2634
options?.async
@@ -30,12 +38,12 @@ export function jitiResolve(
3038
for (const conditions of conditionSets) {
3139
try {
3240
resolved = resolvePathSync(id, {
33-
url: options?.parentURL || ctx.url,
41+
url: parentURL,
3442
conditions,
3543
extensions: ctx.opts.extensions,
3644
});
3745
} catch (error) {
38-
err = error;
46+
lastError = error;
3947
}
4048
if (resolved) {
4149
return resolved;
@@ -46,12 +54,12 @@ export function jitiResolve(
4654
try {
4755
return ctx.nativeRequire.resolve(id, options);
4856
} catch (error) {
49-
err = error;
57+
lastError = error;
5058
}
5159
for (const ext of ctx.additionalExts) {
5260
resolved =
53-
tryNativeRequireResolve(ctx, id + ext, options) ||
54-
tryNativeRequireResolve(ctx, id + "/index" + ext, options);
61+
tryNativeRequireResolve(ctx, id + ext, parentURL, options) ||
62+
tryNativeRequireResolve(ctx, id + "/index" + ext, parentURL, options);
5563
if (resolved) {
5664
return resolved;
5765
}
@@ -63,6 +71,7 @@ export function jitiResolve(
6371
resolved = tryNativeRequireResolve(
6472
ctx,
6573
id.replace(JS_EXT_RE, ".$1t$2"),
74+
parentURL,
6675
options,
6776
);
6877
if (resolved) {
@@ -76,16 +85,20 @@ export function jitiResolve(
7685
return undefined as unknown as string;
7786
}
7887

79-
throw err;
88+
throw lastError;
8089
}
8190

8291
export function tryNativeRequireResolve(
8392
ctx: Context,
8493
id: string,
94+
parentURL: URL | string,
8595
options?: { paths?: string[] },
8696
) {
8797
try {
88-
return ctx.nativeRequire.resolve(id, options);
98+
return ctx.nativeRequire.resolve(id, {
99+
...options,
100+
paths: [dirname(fileURLToPath(parentURL)), ...(options?.paths || [])],
101+
});
89102
} catch {
90103
// Ignore errors
91104
}

src/utils.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import { isWindows } from "std-env";
77
import { Context } from "./types";
88
import { gray, green, blue, yellow, cyan, red } from "yoctocolors";
99

10-
export function isDir(filename: string): boolean {
10+
export function isDir(filename: string | URL): boolean {
11+
if (filename instanceof URL || filename.startsWith("file://")) {
12+
return false;
13+
}
1114
try {
1215
const stat = lstatSync(filename);
1316
return stat.isDirectory();
@@ -68,6 +71,7 @@ const debugMap = {
6871
"[unknown]": red("[unknown]"),
6972
"[hit]": green("[hit]"),
7073
"[miss]": yellow("[miss]"),
74+
"[json]": green("[json]"),
7175
};
7276

7377
export function debug(ctx: Context, ...args: unknown[]) {

0 commit comments

Comments
 (0)