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;
 | |
|   }, {}),
 | |
| };
 |