543 lines
12 KiB
JavaScript
543 lines
12 KiB
JavaScript
|
var path = require('path');
|
||
|
|
||
|
// We only register on the final extension (like `.js`) due to https://github.com/joyent/node/blob/v0.12.0/lib/module.js#L353
|
||
|
// However, we use these matchers to apply the transform only if the full extension matches
|
||
|
function endsInJsx(filename) {
|
||
|
return filename.endsWith('.jsx');
|
||
|
}
|
||
|
function endsInTs(filename) {
|
||
|
return filename.endsWith('.ts');
|
||
|
}
|
||
|
function endsInTsx(filename) {
|
||
|
return filename.endsWith('.tsx');
|
||
|
}
|
||
|
function endsInBabelJs(filename) {
|
||
|
return filename.endsWith('.babel.js');
|
||
|
}
|
||
|
function endsInBabelJsx(filename) {
|
||
|
return filename.endsWith('.babel.jsx');
|
||
|
}
|
||
|
function endsInBabelTs(filename) {
|
||
|
return filename.endsWith('.babel.ts');
|
||
|
}
|
||
|
function endsInBabelTsx(filename) {
|
||
|
return filename.endsWith('.babel.tsx');
|
||
|
}
|
||
|
function endsInEsbuildJs(filename) {
|
||
|
return filename.endsWith('.esbuild.js');
|
||
|
}
|
||
|
function endsInEsbuildJsx(filename) {
|
||
|
return filename.endsWith('.esbuild.jsx');
|
||
|
}
|
||
|
function endsInEsbuildTs(filename) {
|
||
|
return filename.endsWith('.esbuild.ts');
|
||
|
}
|
||
|
function endsInEsbuildTsx(filename) {
|
||
|
return filename.endsWith('.esbuild.tsx');
|
||
|
}
|
||
|
function endsInSucraseJs(filename) {
|
||
|
return filename.endsWith('.sucrase.js');
|
||
|
}
|
||
|
function endsInSucraseJsx(filename) {
|
||
|
return filename.endsWith('.sucrase.jsx');
|
||
|
}
|
||
|
function endsInSucraseTs(filename) {
|
||
|
return filename.endsWith('.sucrase.ts');
|
||
|
}
|
||
|
function endsInSucraseTsx(filename) {
|
||
|
return filename.endsWith('.sucrase.tsx');
|
||
|
}
|
||
|
function endsInSwcJs(filename) {
|
||
|
return filename.endsWith('.swc.js');
|
||
|
}
|
||
|
function endsInSwcJsx(filename) {
|
||
|
return filename.endsWith('.swc.jsx');
|
||
|
}
|
||
|
function endsInSwcTs(filename) {
|
||
|
return filename.endsWith('.swc.ts');
|
||
|
}
|
||
|
function endsInSwcTsx(filename) {
|
||
|
return filename.endsWith('.swc.tsx');
|
||
|
}
|
||
|
|
||
|
var cjsStub = path.join(__dirname, 'cjs-stub');
|
||
|
var mjsStub = path.join(__dirname, 'mjs-stub');
|
||
|
|
||
|
function isNodeModules(file) {
|
||
|
return path.relative(process.cwd(), file).includes('node_modules');
|
||
|
}
|
||
|
|
||
|
var extensions = {
|
||
|
'.babel.js': {
|
||
|
module: '@babel/register',
|
||
|
register: function (hook, config) {
|
||
|
config = config || {
|
||
|
rootMode: 'upward-optional',
|
||
|
overrides: [{ only: [endsInBabelJs], presets: ['@babel/preset-env'] }],
|
||
|
};
|
||
|
|
||
|
hook(Object.assign({}, config, { extensions: '.js' }));
|
||
|
},
|
||
|
},
|
||
|
'.babel.jsx': {
|
||
|
module: '@babel/register',
|
||
|
register: function (hook, config) {
|
||
|
config = config || {
|
||
|
rootMode: 'upward-optional',
|
||
|
overrides: [
|
||
|
{
|
||
|
only: [endsInBabelJsx],
|
||
|
presets: ['@babel/preset-env', '@babel/preset-react'],
|
||
|
},
|
||
|
],
|
||
|
};
|
||
|
|
||
|
hook(Object.assign({}, config, { extensions: '.jsx' }));
|
||
|
},
|
||
|
},
|
||
|
'.babel.ts': [
|
||
|
{
|
||
|
module: '@babel/register',
|
||
|
register: function (hook, config) {
|
||
|
config = config || {
|
||
|
rootMode: 'upward-optional',
|
||
|
overrides: [
|
||
|
{
|
||
|
only: [endsInBabelTs],
|
||
|
presets: ['@babel/preset-env', '@babel/preset-typescript'],
|
||
|
},
|
||
|
],
|
||
|
};
|
||
|
|
||
|
hook(Object.assign({}, config, { extensions: '.ts' }));
|
||
|
},
|
||
|
},
|
||
|
],
|
||
|
'.babel.tsx': {
|
||
|
module: '@babel/register',
|
||
|
register: function (hook, config) {
|
||
|
config = config || {
|
||
|
rootMode: 'upward-optional',
|
||
|
overrides: [
|
||
|
{
|
||
|
only: [endsInBabelTsx],
|
||
|
presets: [
|
||
|
'@babel/preset-env',
|
||
|
'@babel/preset-react',
|
||
|
[
|
||
|
'@babel/preset-typescript',
|
||
|
{
|
||
|
isTSX: true,
|
||
|
allExtensions: true,
|
||
|
},
|
||
|
],
|
||
|
],
|
||
|
},
|
||
|
],
|
||
|
};
|
||
|
|
||
|
hook(Object.assign({}, config, { extensions: '.tsx' }));
|
||
|
},
|
||
|
},
|
||
|
'.cjs': cjsStub,
|
||
|
'.coffee': 'coffeescript/register',
|
||
|
'.coffee.md': 'coffeescript/register',
|
||
|
'.esbuild.js': {
|
||
|
module: 'esbuild-register/dist/node',
|
||
|
register: function (mod, config) {
|
||
|
config = config || {
|
||
|
target: 'node' + process.version.slice(1),
|
||
|
hookMatcher: endsInEsbuildJs,
|
||
|
};
|
||
|
|
||
|
mod.register(Object.assign({}, config, { extensions: ['.js'] }));
|
||
|
},
|
||
|
},
|
||
|
'.esbuild.jsx': {
|
||
|
module: 'esbuild-register/dist/node',
|
||
|
register: function (mod, config) {
|
||
|
config = config || {
|
||
|
target: 'node' + process.version.slice(1),
|
||
|
hookMatcher: endsInEsbuildJsx,
|
||
|
};
|
||
|
|
||
|
mod.register(Object.assign({}, config, { extensions: ['.jsx'] }));
|
||
|
},
|
||
|
},
|
||
|
'.esbuild.ts': {
|
||
|
module: 'esbuild-register/dist/node',
|
||
|
register: function (mod, config) {
|
||
|
config = config || {
|
||
|
target: 'node' + process.version.slice(1),
|
||
|
hookMatcher: endsInEsbuildTs,
|
||
|
};
|
||
|
|
||
|
mod.register(Object.assign({}, config, { extensions: ['.ts'] }));
|
||
|
},
|
||
|
},
|
||
|
'.esbuild.tsx': {
|
||
|
module: 'esbuild-register/dist/node',
|
||
|
register: function (mod, config) {
|
||
|
config = config || {
|
||
|
target: 'node' + process.version.slice(1),
|
||
|
hookMatcher: endsInEsbuildTsx,
|
||
|
};
|
||
|
|
||
|
mod.register(Object.assign({}, config, { extensions: ['.tsx'] }));
|
||
|
},
|
||
|
},
|
||
|
'.esm.js': {
|
||
|
module: 'esm',
|
||
|
register: function (hook) {
|
||
|
// register on .js extension due to https://github.com/joyent/node/blob/v0.12.0/lib/module.js#L353
|
||
|
// which only captures the final extension (.esm.js -> .js)
|
||
|
var esmLoader = hook(module);
|
||
|
require.extensions['.js'] = esmLoader('module')._extensions['.js'];
|
||
|
},
|
||
|
},
|
||
|
'.js': null,
|
||
|
'.json': null,
|
||
|
'.json5': 'json5/lib/register',
|
||
|
'.jsx': [
|
||
|
{
|
||
|
module: '@babel/register',
|
||
|
register: function (hook, config) {
|
||
|
config = config || {
|
||
|
rootMode: 'upward-optional',
|
||
|
overrides: [
|
||
|
{
|
||
|
only: [endsInJsx],
|
||
|
presets: ['@babel/preset-env', '@babel/preset-react'],
|
||
|
},
|
||
|
],
|
||
|
};
|
||
|
|
||
|
hook(Object.assign({}, config, { extensions: '.jsx' }));
|
||
|
},
|
||
|
},
|
||
|
'sucrase/register/jsx',
|
||
|
],
|
||
|
'.litcoffee': 'coffeescript/register',
|
||
|
// The mdx loader hooks both `.md` and `.mdx` when it is imported
|
||
|
// but we only install the hook if `.mdx` is the first file
|
||
|
'.mdx': '@mdx-js/register',
|
||
|
'.mjs': mjsStub,
|
||
|
'.node': null,
|
||
|
'.sucrase.js': {
|
||
|
module: 'sucrase/dist/register',
|
||
|
register: function (hook, config) {
|
||
|
config = config || {
|
||
|
matcher: endsInSucraseJs,
|
||
|
};
|
||
|
|
||
|
hook.registerJS(config);
|
||
|
},
|
||
|
},
|
||
|
'.sucrase.jsx': {
|
||
|
module: 'sucrase/dist/register',
|
||
|
register: function (hook, config) {
|
||
|
config = config || {
|
||
|
matcher: endsInSucraseJsx,
|
||
|
};
|
||
|
|
||
|
hook.registerJSX(config);
|
||
|
},
|
||
|
},
|
||
|
'.sucrase.ts': {
|
||
|
module: 'sucrase/dist/register',
|
||
|
register: function (hook, config) {
|
||
|
config = config || {
|
||
|
matcher: endsInSucraseTs,
|
||
|
};
|
||
|
|
||
|
hook.registerTS(config);
|
||
|
},
|
||
|
},
|
||
|
'.sucrase.tsx': {
|
||
|
module: 'sucrase/dist/register',
|
||
|
register: function (hook, config) {
|
||
|
config = config || {
|
||
|
matcher: endsInSucraseTsx,
|
||
|
};
|
||
|
|
||
|
hook.registerTSX(config);
|
||
|
},
|
||
|
},
|
||
|
'.swc.js': {
|
||
|
module: '@swc/register',
|
||
|
register: function (hook, config) {
|
||
|
config = config || {
|
||
|
only: [endsInSwcJs],
|
||
|
ignore: [isNodeModules],
|
||
|
jsc: {
|
||
|
parser: {
|
||
|
syntax: 'ecmascript',
|
||
|
},
|
||
|
},
|
||
|
module: {
|
||
|
type: 'commonjs',
|
||
|
},
|
||
|
};
|
||
|
|
||
|
hook(
|
||
|
Object.assign({}, config, {
|
||
|
extensions: '.js',
|
||
|
})
|
||
|
);
|
||
|
},
|
||
|
},
|
||
|
'.swc.jsx': {
|
||
|
module: '@swc/register',
|
||
|
register: function (hook, config) {
|
||
|
config = config || {
|
||
|
only: [endsInSwcJsx],
|
||
|
ignore: [isNodeModules],
|
||
|
jsc: {
|
||
|
parser: {
|
||
|
syntax: 'ecmascript',
|
||
|
jsx: true,
|
||
|
},
|
||
|
},
|
||
|
module: {
|
||
|
type: 'commonjs',
|
||
|
},
|
||
|
};
|
||
|
|
||
|
hook(
|
||
|
Object.assign({}, config, {
|
||
|
extensions: '.jsx',
|
||
|
})
|
||
|
);
|
||
|
},
|
||
|
},
|
||
|
'.swc.ts': {
|
||
|
module: '@swc/register',
|
||
|
register: function (hook, config) {
|
||
|
config = config || {
|
||
|
only: [endsInSwcTs],
|
||
|
ignore: [isNodeModules],
|
||
|
jsc: {
|
||
|
parser: {
|
||
|
syntax: 'typescript',
|
||
|
},
|
||
|
},
|
||
|
module: {
|
||
|
type: 'commonjs',
|
||
|
},
|
||
|
};
|
||
|
|
||
|
hook(
|
||
|
Object.assign({}, config, {
|
||
|
extensions: '.ts',
|
||
|
})
|
||
|
);
|
||
|
},
|
||
|
},
|
||
|
'.swc.tsx': {
|
||
|
module: '@swc/register',
|
||
|
register: function (hook, config) {
|
||
|
config = config || {
|
||
|
only: [endsInSwcTsx],
|
||
|
ignore: [isNodeModules],
|
||
|
jsc: {
|
||
|
parser: {
|
||
|
syntax: 'typescript',
|
||
|
tsx: true,
|
||
|
},
|
||
|
},
|
||
|
module: {
|
||
|
type: 'commonjs',
|
||
|
},
|
||
|
};
|
||
|
|
||
|
hook(
|
||
|
Object.assign({}, config, {
|
||
|
extensions: '.tsx',
|
||
|
})
|
||
|
);
|
||
|
},
|
||
|
},
|
||
|
'.toml': {
|
||
|
module: 'toml-require',
|
||
|
register: function (hook, config) {
|
||
|
hook.install(config);
|
||
|
},
|
||
|
},
|
||
|
'.ts': [
|
||
|
'ts-node/register',
|
||
|
'sucrase/register/ts',
|
||
|
{
|
||
|
module: '@babel/register',
|
||
|
register: function (hook, config) {
|
||
|
config = config || {
|
||
|
rootMode: 'upward-optional',
|
||
|
overrides: [
|
||
|
{
|
||
|
only: [endsInTs],
|
||
|
presets: ['@babel/preset-env', '@babel/preset-typescript'],
|
||
|
},
|
||
|
],
|
||
|
};
|
||
|
|
||
|
hook(
|
||
|
Object.assign({}, config, {
|
||
|
extensions: '.ts',
|
||
|
})
|
||
|
);
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
module: 'esbuild-register/dist/node',
|
||
|
register: function (mod, config) {
|
||
|
config = config || {
|
||
|
target: 'node' + process.version.slice(1),
|
||
|
hookMatcher: endsInTs,
|
||
|
};
|
||
|
|
||
|
mod.register(
|
||
|
Object.assign({}, config, {
|
||
|
extensions: ['.ts'],
|
||
|
})
|
||
|
);
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
module: '@swc/register',
|
||
|
register: function (hook, config) {
|
||
|
config = config || {
|
||
|
only: [endsInTs],
|
||
|
ignore: [isNodeModules],
|
||
|
jsc: {
|
||
|
parser: {
|
||
|
syntax: 'typescript',
|
||
|
},
|
||
|
},
|
||
|
module: {
|
||
|
type: 'commonjs',
|
||
|
},
|
||
|
};
|
||
|
|
||
|
hook(
|
||
|
Object.assign({}, config, {
|
||
|
extensions: '.ts',
|
||
|
})
|
||
|
);
|
||
|
},
|
||
|
},
|
||
|
],
|
||
|
'.cts': ['ts-node/register'],
|
||
|
'.tsx': [
|
||
|
'ts-node/register',
|
||
|
'sucrase/register/tsx',
|
||
|
{
|
||
|
module: '@babel/register',
|
||
|
register: function (hook, config) {
|
||
|
config = config || {
|
||
|
rootMode: 'upward-optional',
|
||
|
overrides: [
|
||
|
{
|
||
|
only: [endsInTsx],
|
||
|
presets: [
|
||
|
'@babel/preset-env',
|
||
|
'@babel/preset-react',
|
||
|
[
|
||
|
'@babel/preset-typescript',
|
||
|
{
|
||
|
isTSX: true,
|
||
|
allExtensions: true,
|
||
|
},
|
||
|
],
|
||
|
],
|
||
|
},
|
||
|
],
|
||
|
};
|
||
|
|
||
|
hook(
|
||
|
Object.assign({}, config, {
|
||
|
extensions: '.tsx',
|
||
|
})
|
||
|
);
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
module: 'esbuild-register/dist/node',
|
||
|
register: function (mod, config) {
|
||
|
config = config || {
|
||
|
target: 'node' + process.version.slice(1),
|
||
|
hookMatcher: endsInTsx,
|
||
|
};
|
||
|
|
||
|
mod.register(
|
||
|
Object.assign({}, config, {
|
||
|
extensions: ['.tsx'],
|
||
|
})
|
||
|
);
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
module: '@swc/register',
|
||
|
register: function (hook, config) {
|
||
|
config = config || {
|
||
|
only: [endsInTsx],
|
||
|
ignore: [isNodeModules],
|
||
|
jsc: {
|
||
|
parser: {
|
||
|
syntax: 'typescript',
|
||
|
tsx: true,
|
||
|
},
|
||
|
},
|
||
|
module: {
|
||
|
type: 'commonjs',
|
||
|
},
|
||
|
};
|
||
|
|
||
|
hook(
|
||
|
Object.assign({}, config, {
|
||
|
extensions: '.tsx',
|
||
|
})
|
||
|
);
|
||
|
},
|
||
|
},
|
||
|
],
|
||
|
'.yaml': 'yaml-hook/register',
|
||
|
'.yml': 'yaml-hook/register',
|
||
|
};
|
||
|
|
||
|
var jsVariantExtensions = [
|
||
|
'.js',
|
||
|
'.babel.js',
|
||
|
'.babel.jsx',
|
||
|
'.babel.ts',
|
||
|
'.babel.tsx',
|
||
|
'.esbuild.js',
|
||
|
'.esbuild.jsx',
|
||
|
'.esbuild.ts',
|
||
|
'.esbuild.tsx',
|
||
|
'.cjs',
|
||
|
'.coffee',
|
||
|
'.coffee.md',
|
||
|
'.esm.js',
|
||
|
'.jsx',
|
||
|
'.litcoffee',
|
||
|
'.mdx',
|
||
|
'.mjs',
|
||
|
'.sucrase.js',
|
||
|
'.sucrase.jsx',
|
||
|
'.sucrase.ts',
|
||
|
'.sucrase.tsx',
|
||
|
'.swc.js',
|
||
|
'.swc.jsx',
|
||
|
'.swc.ts',
|
||
|
'.swc.tsx',
|
||
|
'.ts',
|
||
|
'.tsx',
|
||
|
];
|
||
|
|
||
|
module.exports = {
|
||
|
extensions: extensions,
|
||
|
jsVariants: jsVariantExtensions.reduce(function (result, ext) {
|
||
|
result[ext] = extensions[ext];
|
||
|
return result;
|
||
|
}, {}),
|
||
|
};
|