mirror of
https://github.com/nodejs/node.git
synced 2025-05-15 10:01:49 +00:00

There is no reason for this to be in C++. Using JavaScript means that the code is more accessible to more developers, which is important for any Node.js feature. This also simplifies the code significantly in some areas. On the technical side, this potentially also enables making some of the file system operations that are involved asynchronous. PR-URL: https://github.com/nodejs/node/pull/32201 Reviewed-By: Bradley Farias <bradley.meck@gmail.com> Reviewed-By: Guy Bedford <guybedford@gmail.com>
73 lines
2.4 KiB
JavaScript
73 lines
2.4 KiB
JavaScript
'use strict';
|
|
const { StringPrototypeStartsWith } = primordials;
|
|
const { extname } = require('path');
|
|
const { getOptionValue } = require('internal/options');
|
|
|
|
const experimentalJsonModules = getOptionValue('--experimental-json-modules');
|
|
const experimentalSpeciferResolution =
|
|
getOptionValue('--experimental-specifier-resolution');
|
|
const experimentalWasmModules = getOptionValue('--experimental-wasm-modules');
|
|
const { getPackageType } = require('internal/modules/esm/resolve');
|
|
const { URL, fileURLToPath } = require('internal/url');
|
|
const { ERR_UNKNOWN_FILE_EXTENSION } = require('internal/errors').codes;
|
|
|
|
const extensionFormatMap = {
|
|
'__proto__': null,
|
|
'.cjs': 'commonjs',
|
|
'.js': 'module',
|
|
'.mjs': 'module'
|
|
};
|
|
|
|
const legacyExtensionFormatMap = {
|
|
'__proto__': null,
|
|
'.cjs': 'commonjs',
|
|
'.js': 'commonjs',
|
|
'.json': 'commonjs',
|
|
'.mjs': 'module',
|
|
'.node': 'commonjs'
|
|
};
|
|
|
|
if (experimentalWasmModules)
|
|
extensionFormatMap['.wasm'] = legacyExtensionFormatMap['.wasm'] = 'wasm';
|
|
|
|
if (experimentalJsonModules)
|
|
extensionFormatMap['.json'] = legacyExtensionFormatMap['.json'] = 'json';
|
|
|
|
function defaultGetFormat(url, context, defaultGetFormatUnused) {
|
|
if (StringPrototypeStartsWith(url, 'nodejs:')) {
|
|
return { format: 'builtin' };
|
|
}
|
|
const parsed = new URL(url);
|
|
if (parsed.protocol === 'data:') {
|
|
const [ , mime ] = /^([^/]+\/[^;,]+)(?:[^,]*?)(;base64)?,/.exec(parsed.pathname) || [ null, null, null ];
|
|
const format = ({
|
|
'__proto__': null,
|
|
'text/javascript': 'module',
|
|
'application/json': experimentalJsonModules ? 'json' : null,
|
|
'application/wasm': experimentalWasmModules ? 'wasm' : null
|
|
})[mime] || null;
|
|
return { format };
|
|
} else if (parsed.protocol === 'file:') {
|
|
const ext = extname(parsed.pathname);
|
|
let format;
|
|
if (ext === '.js') {
|
|
format = getPackageType(parsed.href) === 'module' ? 'module' : 'commonjs';
|
|
} else {
|
|
format = extensionFormatMap[ext];
|
|
}
|
|
if (!format) {
|
|
if (experimentalSpeciferResolution === 'node') {
|
|
process.emitWarning(
|
|
'The Node.js specifier resolution in ESM is experimental.',
|
|
'ExperimentalWarning');
|
|
format = legacyExtensionFormatMap[ext];
|
|
} else {
|
|
throw new ERR_UNKNOWN_FILE_EXTENSION(ext, fileURLToPath(url));
|
|
}
|
|
}
|
|
return { format: format || null };
|
|
}
|
|
return { format: null };
|
|
}
|
|
exports.defaultGetFormat = defaultGetFormat;
|