|
| 1 | +import Module from 'node:module'; |
| 2 | +import { fileURLToPath } from 'node:url'; |
| 3 | +import { |
| 4 | + isFilePath, |
| 5 | + fileUrlPrefix, |
| 6 | + tsExtensionsPattern, |
| 7 | + nodeModulesPath, |
| 8 | +} from '../../../utils/path-utils.js'; |
| 9 | +import { tsconfigPathsMatcher } from '../../../utils/tsconfig.js'; |
| 10 | +import type { ResolveFilename, SimpleResolve, LoaderState } from '../types.js'; |
| 11 | +import { createImplicitResolver } from './resolve-implicit-extensions.js'; |
| 12 | +import { interopCjsExports } from './interop-cjs-exports.js'; |
| 13 | +import { createTsExtensionResolver } from './resolve-ts-extensions.js'; |
| 14 | +import { preserveQuery } from './preserve-query.js'; |
| 15 | + |
| 16 | +const resolveTsPaths = ( |
| 17 | + request: string, |
| 18 | + parent: Module.Parent | undefined, |
| 19 | + nextResolve: SimpleResolve, |
| 20 | +) => { |
| 21 | + // Support file protocol |
| 22 | + if (request.startsWith(fileUrlPrefix)) { |
| 23 | + request = fileURLToPath(request); |
| 24 | + } |
| 25 | + |
| 26 | + // Resolve TS path alias |
| 27 | + if ( |
| 28 | + tsconfigPathsMatcher |
| 29 | + |
| 30 | + // bare specifier |
| 31 | + && !isFilePath(request) |
| 32 | + |
| 33 | + // Dependency paths should not be resolved using tsconfig.json |
| 34 | + && !parent?.filename?.includes(nodeModulesPath) |
| 35 | + ) { |
| 36 | + const possiblePaths = tsconfigPathsMatcher(request); |
| 37 | + for (const possiblePath of possiblePaths) { |
| 38 | + try { |
| 39 | + return nextResolve(possiblePath); |
| 40 | + } catch {} |
| 41 | + } |
| 42 | + } |
| 43 | + |
| 44 | + return nextResolve(request); |
| 45 | +}; |
| 46 | + |
| 47 | +export const createResolveFilename = ( |
| 48 | + state: LoaderState, |
| 49 | + nextResolve: ResolveFilename, |
| 50 | + namespace?: string, |
| 51 | +): ResolveFilename => ( |
| 52 | + request, |
| 53 | + parent, |
| 54 | + ...restOfArgs |
| 55 | +) => { |
| 56 | + if (state.enabled === false) { |
| 57 | + return nextResolve(request, parent, ...restOfArgs); |
| 58 | + } |
| 59 | + |
| 60 | + request = interopCjsExports(request); |
| 61 | + |
| 62 | + const [ |
| 63 | + cleanRequest, |
| 64 | + searchParams, |
| 65 | + appendQuery, |
| 66 | + ] = preserveQuery(request, parent); |
| 67 | + |
| 68 | + // If request namespace doesnt match the namespace, ignore |
| 69 | + if ((searchParams.get('namespace') ?? undefined) !== namespace) { |
| 70 | + return nextResolve(request, parent, ...restOfArgs); |
| 71 | + } |
| 72 | + |
| 73 | + let nextResolveSimple: SimpleResolve = request_ => nextResolve( |
| 74 | + request_, |
| 75 | + parent, |
| 76 | + ...restOfArgs, |
| 77 | + ); |
| 78 | + |
| 79 | + nextResolveSimple = createTsExtensionResolver( |
| 80 | + nextResolveSimple, |
| 81 | + Boolean(parent?.filename && tsExtensionsPattern.test(parent.filename)), |
| 82 | + ); |
| 83 | + |
| 84 | + nextResolveSimple = createImplicitResolver(nextResolveSimple); |
| 85 | + |
| 86 | + const resolved = resolveTsPaths(cleanRequest, parent, nextResolveSimple); |
| 87 | + |
| 88 | + return appendQuery( |
| 89 | + resolved, |
| 90 | + restOfArgs.length, |
| 91 | + ); |
| 92 | +}; |
0 commit comments