Skip to content

Commit 531fafa

Browse files
committed
refactor(cjs): move implicitResolver outside of closure
1 parent 2a7deea commit 531fafa

File tree

3 files changed

+58
-53
lines changed

3 files changed

+58
-53
lines changed

src/cjs/api/module-resolve-filename.ts

+44-42
Original file line numberDiff line numberDiff line change
@@ -148,19 +148,7 @@ const resolveRequest = (
148148
export const createResolveFilename = (
149149
nextResolve: ResolveFilename,
150150
namespace?: string,
151-
): ResolveFilename => (
152-
request,
153-
parent,
154-
isMain,
155-
options,
156-
) => {
157-
let resolve: SimpleResolve = request_ => nextResolve(
158-
request_,
159-
parent,
160-
isMain,
161-
options,
162-
);
163-
151+
): ResolveFilename => {
164152
if (namespace) {
165153
/**
166154
* When namespaced, the loaders are registered to the extensions in a hidden way
@@ -169,41 +157,55 @@ export const createResolveFilename = (
169157
* To support implicit extensions, we need to wrap the resolver with our own
170158
* re-implementation of the implicit extension resolution
171159
*/
172-
resolve = createImplicitResolver(resolve);
160+
nextResolve = createImplicitResolver(nextResolve);
173161
}
174162

175-
request = interopCjsExports(request);
176-
177-
// Strip query string
178-
const requestAndQuery = request.split('?');
179-
const searchParams = new URLSearchParams(requestAndQuery[1]);
180-
181-
// Inherit parent namespace if it exists
182-
if (parent?.filename) {
183-
const parentQuery = new URLSearchParams(parent.filename.split('?')[1]);
184-
const parentNamespace = parentQuery.get('namespace');
185-
if (parentNamespace) {
186-
searchParams.append('namespace', parentNamespace);
163+
return (
164+
request,
165+
parent,
166+
isMain,
167+
options,
168+
) => {
169+
const resolve: SimpleResolve = request_ => nextResolve(
170+
request_,
171+
parent,
172+
isMain,
173+
options,
174+
);
175+
176+
request = interopCjsExports(request);
177+
178+
// Strip query string
179+
const requestAndQuery = request.split('?');
180+
const searchParams = new URLSearchParams(requestAndQuery[1]);
181+
182+
// Inherit parent namespace if it exists
183+
if (parent?.filename) {
184+
const parentQuery = new URLSearchParams(parent.filename.split('?')[1]);
185+
const parentNamespace = parentQuery.get('namespace');
186+
if (parentNamespace) {
187+
searchParams.append('namespace', parentNamespace);
188+
}
187189
}
188-
}
189190

190-
// If request namespace doesnt match the namespace, ignore
191-
if ((searchParams.get('namespace') ?? undefined) !== namespace) {
192-
return resolve(request);
193-
}
191+
// If request namespace doesnt match the namespace, ignore
192+
if ((searchParams.get('namespace') ?? undefined) !== namespace) {
193+
return resolve(request);
194+
}
194195

195-
let resolved = resolveRequest(requestAndQuery[0], parent, resolve);
196+
let resolved = resolveRequest(requestAndQuery[0], parent, resolve);
196197

197-
// Only add query back if it's a file path (not a core Node module)
198-
if (
199-
path.isAbsolute(resolved)
198+
// Only add query back if it's a file path (not a core Node module)
199+
if (
200+
path.isAbsolute(resolved)
200201

201-
// These two have native loaders which don't support queries
202-
&& !resolved.endsWith('.json')
203-
&& !resolved.endsWith('.node')
204-
) {
205-
resolved += urlSearchParamsStringify(searchParams);
206-
}
202+
// These two have native loaders which don't support queries
203+
&& !resolved.endsWith('.json')
204+
&& !resolved.endsWith('.node')
205+
) {
206+
resolved += urlSearchParamsStringify(searchParams);
207+
}
207208

208-
return resolved;
209+
return resolved;
210+
};
209211
};

src/cjs/api/resolve-implicit-extensions.ts

+13-9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import path from 'node:path';
22
import type { NodeError } from '../../types.js';
3-
import type { SimpleResolve } from './types.js';
3+
import type { ResolveFilename } from './types.js';
44

55
export const implicitlyResolvableExtensions = [
66
'.ts',
@@ -9,31 +9,35 @@ export const implicitlyResolvableExtensions = [
99
] as const;
1010

1111
const tryExtensions = (
12-
resolve: SimpleResolve,
13-
request: string,
12+
resolve: ResolveFilename,
13+
...args: Parameters<ResolveFilename>
1414
) => {
1515
for (const extension of implicitlyResolvableExtensions) {
1616
try {
17-
return resolve(request + extension);
17+
args[0] += extension;
18+
return resolve(...args);
1819
} catch {}
1920
}
2021
};
2122

2223
export const createImplicitResolver = (
23-
resolve: SimpleResolve,
24-
): SimpleResolve => (request) => {
24+
resolve: ResolveFilename,
25+
): ResolveFilename => (
26+
request,
27+
...args
28+
) => {
2529
try {
26-
return resolve(request);
30+
return resolve(request, ...args);
2731
} catch (_error) {
2832
const nodeError = _error as NodeError;
2933
if (
3034
nodeError.code === 'MODULE_NOT_FOUND'
3135
) {
3236
const resolved = (
33-
tryExtensions(resolve, request)
37+
tryExtensions(resolve, request, ...args)
3438

3539
// Default resolve handles resovling paths relative to the parent
36-
|| tryExtensions(resolve, `${request}${path.sep}index`)
40+
|| tryExtensions(resolve, `${request}${path.sep}index`, ...args)
3741
);
3842
if (resolved) {
3943
return resolved;

tests/specs/api.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ export default testSuite(({ describe }, node: NodeApis) => {
111111

112112
describe('tsx.require()', ({ test }) => {
113113
test('loads', async () => {
114-
const fixture = await createFixture({
114+
await using fixture = await createFixture({
115115
'require.cjs': `
116116
const path = require('node:path');
117117
const tsx = require(${JSON.stringify(tsxCjsApiPath)});
@@ -137,7 +137,6 @@ export default testSuite(({ describe }, node: NodeApis) => {
137137
`,
138138
...tsFiles,
139139
});
140-
console.log(fixture.path);
141140

142141
const { stdout } = await execaNode(fixture.getPath('require.cjs'), [], {
143142
nodePath: node.path,

0 commit comments

Comments
 (0)