• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1import { URL } from 'url';
2import path from 'path';
3import process from 'process';
4import { builtinModules } from 'module';
5
6const JS_EXTENSIONS = new Set(['.js', '.mjs']);
7
8const baseURL = new URL('file://');
9baseURL.pathname = process.cwd() + '/';
10
11export function resolve(specifier, { parentURL = baseURL }, defaultResolve) {
12  if (builtinModules.includes(specifier)) {
13    return {
14      url: 'node:' + specifier
15    };
16  }
17  if (/^\.{1,2}[/]/.test(specifier) !== true && !specifier.startsWith('file:')) {
18    // For node_modules support:
19    // return defaultResolve(specifier, {parentURL}, defaultResolve);
20    throw new Error(
21      `imports must be URLs or begin with './', or '../'; '${specifier}' does not`);
22  }
23  const resolved = new URL(specifier, parentURL);
24  return {
25    url: resolved.href
26  };
27}
28
29export function getFormat(url, context, defaultGetFormat) {
30  if (url.startsWith('node:') && builtinModules.includes(url.slice(5))) {
31    return {
32      format: 'builtin'
33    };
34  }
35  const { pathname } = new URL(url);
36  const ext = path.extname(pathname);
37  if (!JS_EXTENSIONS.has(ext)) {
38    throw new Error(
39      `Cannot load file with non-JavaScript file extension ${ext}.`);
40  }
41  return {
42    format: 'module'
43  };
44}
45