/** | |
* @typedef {import('./lib/errors.js').ErrnoException} ErrnoException | |
*/ | |
import {defaultResolve} from './lib/resolve.js' | |
export {moduleResolve} from './lib/resolve.js' | |
/** | |
* Match `import.meta.resolve` except that `parent` is required (you can pass | |
* `import.meta.url`). | |
* | |
* @param {string} specifier | |
* The module specifier to resolve relative to parent | |
* (`/example.js`, `./example.js`, `../example.js`, `some-package`, `fs`, | |
* etc). | |
* @param {string} parent | |
* The absolute parent module URL to resolve from. | |
* You must pass `import.meta.url` or something else. | |
* @returns {string} | |
* Returns a string to a full `file:`, `data:`, or `node:` URL | |
* to the found thing. | |
*/ | |
export function resolve(specifier, parent) { | |
if (!parent) { | |
throw new Error( | |
'Please pass `parent`: `import-meta-resolve` cannot ponyfill that' | |
) | |
} | |
try { | |
return defaultResolve(specifier, {parentURL: parent}).url | |
} catch (error) { | |
// See: <https://github.com/nodejs/node/blob/45f5c9b/lib/internal/modules/esm/initialize_import_meta.js#L34> | |
const exception = /** @type {ErrnoException} */ (error) | |
if ( | |
(exception.code === 'ERR_UNSUPPORTED_DIR_IMPORT' || | |
exception.code === 'ERR_MODULE_NOT_FOUND') && | |
typeof exception.url === 'string' | |
) { | |
return exception.url | |
} | |
throw error | |
} | |
} | |