mirror of
https://github.com/nodejs/node.git
synced 2025-05-05 21:04:16 +00:00

The HTML spec has officially landed JSON Modules and as such I think we can move them out of the "experimental" status. They will still be behind the `--experimental-modules` flag until the entire esm implementation moves out of experimental. Refs: https://html.spec.whatwg.org/#creating-a-json-module-script PR-URL: https://github.com/nodejs/node/pull/27752 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Bradley Farias <bradley.meck@gmail.com> Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Guy Bedford <guybedford@gmail.com> Reviewed-By: Yuta Hiroto <hello@hiroppy.me> Reviewed-By: Yongsheng Zhang <zyszys98@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Сковорода Никита Андреевич <chalkerx@gmail.com> Reviewed-By: Jan Krems <jan.krems@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
97 lines
2.8 KiB
JavaScript
97 lines
2.8 KiB
JavaScript
'use strict';
|
|
|
|
const internalFS = require('internal/fs/utils');
|
|
const { NativeModule } = require('internal/bootstrap/loaders');
|
|
const { extname } = require('path');
|
|
const { realpathSync } = require('fs');
|
|
const { getOptionValue } = require('internal/options');
|
|
|
|
const preserveSymlinks = getOptionValue('--preserve-symlinks');
|
|
const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main');
|
|
const typeFlag = getOptionValue('--input-type');
|
|
const experimentalWasmModules = getOptionValue('--experimental-wasm-modules');
|
|
const { resolve: moduleWrapResolve,
|
|
getPackageType } = internalBinding('module_wrap');
|
|
const { pathToFileURL, fileURLToPath } = require('internal/url');
|
|
const { ERR_INPUT_TYPE_NOT_ALLOWED,
|
|
ERR_UNKNOWN_FILE_EXTENSION } = require('internal/errors').codes;
|
|
|
|
const { SafeMap } = primordials;
|
|
|
|
const realpathCache = new SafeMap();
|
|
|
|
// const TYPE_NONE = 0;
|
|
// const TYPE_COMMONJS = 1;
|
|
const TYPE_MODULE = 2;
|
|
|
|
const extensionFormatMap = {
|
|
'__proto__': null,
|
|
'.cjs': 'commonjs',
|
|
'.js': 'module',
|
|
'.json': 'json',
|
|
'.mjs': 'module'
|
|
};
|
|
|
|
const legacyExtensionFormatMap = {
|
|
'__proto__': null,
|
|
'.cjs': 'commonjs',
|
|
'.js': 'commonjs',
|
|
'.json': 'json',
|
|
'.mjs': 'module',
|
|
'.node': 'commonjs'
|
|
};
|
|
|
|
if (experimentalWasmModules)
|
|
extensionFormatMap['.wasm'] = legacyExtensionFormatMap['.wasm'] = 'wasm';
|
|
|
|
function resolve(specifier, parentURL) {
|
|
if (NativeModule.canBeRequiredByUsers(specifier)) {
|
|
return {
|
|
url: specifier,
|
|
format: 'builtin'
|
|
};
|
|
}
|
|
|
|
const isMain = parentURL === undefined;
|
|
if (isMain)
|
|
parentURL = pathToFileURL(`${process.cwd()}/`).href;
|
|
|
|
let url = moduleWrapResolve(specifier, parentURL);
|
|
|
|
if (isMain ? !preserveSymlinksMain : !preserveSymlinks) {
|
|
const real = realpathSync(fileURLToPath(url), {
|
|
[internalFS.realpathCacheKey]: realpathCache
|
|
});
|
|
const old = url;
|
|
url = pathToFileURL(real);
|
|
url.search = old.search;
|
|
url.hash = old.hash;
|
|
}
|
|
|
|
const type = getPackageType(url.href);
|
|
|
|
const ext = extname(url.pathname);
|
|
const extMap =
|
|
type !== TYPE_MODULE ? legacyExtensionFormatMap : extensionFormatMap;
|
|
let format = extMap[ext];
|
|
|
|
if (isMain && typeFlag) {
|
|
// This is the initial entry point to the program, and --input-type has
|
|
// been passed as an option; but --input-type can only be used with
|
|
// --eval, --print or STDIN string input. It is not allowed with file
|
|
// input, to avoid user confusion over how expansive the effect of the
|
|
// flag should be (i.e. entry point only, package scope surrounding the
|
|
// entry point, etc.).
|
|
throw new ERR_INPUT_TYPE_NOT_ALLOWED();
|
|
}
|
|
if (!format) {
|
|
if (isMain)
|
|
format = type === TYPE_MODULE ? 'module' : 'commonjs';
|
|
else
|
|
throw new ERR_UNKNOWN_FILE_EXTENSION(fileURLToPath(url));
|
|
}
|
|
return { url: `${url}`, format };
|
|
}
|
|
|
|
module.exports = resolve;
|