Skip to content

Commit

Permalink
fix(cjs): make resolver chainable
Browse files Browse the repository at this point in the history
  • Loading branch information
privatenumber committed Jun 5, 2024
1 parent 48dd7ab commit 585f117
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 17 deletions.
25 changes: 13 additions & 12 deletions src/cjs/api/module-resolve-filename.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,11 @@ const nodeModulesPath = `${path.sep}node_modules${path.sep}`;

type ResolveFilename = typeof Module._resolveFilename;

const defaultResolver = Module._resolveFilename.bind(Module);

/**
* Typescript gives .ts, .cts, or .mts priority over actual .js, .cjs, or .mjs extensions
*/
const resolveTsFilename = (
nextResolve: ResolveFilename,
request: string,
parent: Module.Parent,
isMain: boolean,
Expand All @@ -35,7 +34,7 @@ const resolveTsFilename = (

for (const tryTsPath of tsPath) {
try {
return defaultResolver(
return nextResolve(
tryTsPath,
parent,
isMain,
Expand All @@ -53,7 +52,9 @@ const resolveTsFilename = (
}
};

export const resolveFilename: ResolveFilename = (
export const createResolveFilename = (
nextResolve: ResolveFilename,
): ResolveFilename => (
request,
parent,
isMain,
Expand All @@ -74,22 +75,22 @@ export const resolveFilename: ResolveFilename = (
if (
tsconfigPathsMatcher

// bare specifier
&& !isRelativePath(request)
// bare specifier
&& !isRelativePath(request)

// Dependency paths should not be resolved using tsconfig.json
&& !parent?.filename?.includes(nodeModulesPath)
// Dependency paths should not be resolved using tsconfig.json
&& !parent?.filename?.includes(nodeModulesPath)
) {
const possiblePaths = tsconfigPathsMatcher(request);

for (const possiblePath of possiblePaths) {
const tsFilename = resolveTsFilename(possiblePath, parent, isMain, options);
const tsFilename = resolveTsFilename(nextResolve, possiblePath, parent, isMain, options);
if (tsFilename) {
return tsFilename;
}

try {
return defaultResolver(
return nextResolve(
possiblePath,
parent,
isMain,
Expand All @@ -99,10 +100,10 @@ export const resolveFilename: ResolveFilename = (
}
}

const tsFilename = resolveTsFilename(request, parent, isMain, options);
const tsFilename = resolveTsFilename(nextResolve, request, parent, isMain, options);
if (tsFilename) {
return tsFilename;
}

return defaultResolver(request, parent, isMain, options);
return nextResolve(request, parent, isMain, options);
};
10 changes: 6 additions & 4 deletions src/cjs/api/register.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import Module from 'node:module';
import { loadTsconfig } from '../../utils/tsconfig.js';
import { extensions } from './module-extensions.js';
import { resolveFilename } from './module-resolve-filename.js';
import { createResolveFilename } from './module-resolve-filename.js';

export const register = () => {
const { sourceMapsEnabled } = process;
Expand All @@ -11,12 +11,12 @@ export const register = () => {

// register
process.setSourceMapsEnabled(true);
const resolveFilename = createResolveFilename(_resolveFilename);
Module._resolveFilename = resolveFilename;
// @ts-expect-error overwriting read-only property
Module._extensions = extensions;
Module._resolveFilename = resolveFilename;

// unregister
return () => {
const unregister = () => {
if (sourceMapsEnabled === false) {
process.setSourceMapsEnabled(false);
}
Expand All @@ -25,4 +25,6 @@ export const register = () => {
Module._extensions = _extensions;
Module._resolveFilename = _resolveFilename;
};

return unregister;
};
5 changes: 4 additions & 1 deletion src/cjs/api/require.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import Module from 'node:module';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { register } from './register.js';
import { resolveFilename } from './module-resolve-filename.js';
import { createResolveFilename } from './module-resolve-filename.js';

const getRequestContext = (
id: string,
Expand Down Expand Up @@ -35,6 +36,8 @@ const tsxRequire = (
}
};

const resolveFilename = createResolveFilename(Module._resolveFilename);

const resolve = (
id: string,
fromFile: string | URL,
Expand Down

0 comments on commit 585f117

Please sign in to comment.