diff --git a/README.md b/README.md index 7a58f52..146d8a5 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Consumers should use the exported `extensions` or `jsVariants` object to determi 1. If the value is null, do nothing. 2. If the value is a string, try to require it. -3. If the value is an object, try to require the `module` property. If successful, the `register` property (a function) should be called with the module passed as the first argument. +3. If the value is an object, try to require the `module` property. If successful, the `register` property (a function) should be called with the module passed as the first argument. **Advanced:** An optional second argument can be provided to replace the default configuration for a hook. 4. If the value is an array, iterate over it, attempting step #2 or #3 until one of the attempts does not throw. ## API diff --git a/index.js b/index.js index 4cb8083..8c79279 100644 --- a/index.js +++ b/index.js @@ -70,44 +70,73 @@ function isNodeModules(file) { var extensions = { '.babel.js': { module: '@babel/register', - register: function (hook) { - hook({ - extensions: '.js', + register: function (hook, config) { + config = config || { rootMode: 'upward-optional', - overrides: [{ only: [endsInBabelJs] }], - }); + overrides: [{ only: [endsInBabelJs], presets: ['@babel/preset-env'] }], + }; + + hook(Object.assign({}, config, { extensions: '.js' })); }, }, '.babel.jsx': { module: '@babel/register', - register: function (hook) { - hook({ - extensions: '.jsx', + register: function (hook, config) { + config = config || { rootMode: 'upward-optional', - overrides: [{ only: [endsInBabelJsx] }], - }); + overrides: [ + { + only: [endsInBabelJsx], + presets: ['@babel/preset-env', '@babel/preset-react'], + }, + ], + }; + + hook(Object.assign({}, config, { extensions: '.jsx' })); }, }, '.babel.ts': [ { module: '@babel/register', - register: function (hook) { - hook({ - extensions: '.ts', + register: function (hook, config) { + config = config || { rootMode: 'upward-optional', - overrides: [{ only: [endsInBabelTs] }], - }); + overrides: [ + { + only: [endsInBabelTs], + presets: ['@babel/preset-env', '@babel/preset-typescript'], + }, + ], + }; + + hook(Object.assign({}, config, { extensions: '.ts' })); }, }, ], '.babel.tsx': { module: '@babel/register', - register: function (hook) { - hook({ - extensions: '.tsx', + register: function (hook, config) { + config = config || { rootMode: 'upward-optional', - overrides: [{ only: [endsInBabelTsx] }], - }); + 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, @@ -115,42 +144,46 @@ var extensions = { '.coffee.md': 'coffeescript/register', '.esbuild.js': { module: 'esbuild-register/dist/node', - register: function (mod) { - mod.register({ - extensions: ['.js'], + 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) { - mod.register({ - extensions: ['.jsx'], + 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) { - mod.register({ - extensions: ['.ts'], + 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) { - mod.register({ - extensions: ['.tsx'], + register: function (mod, config) { + config = config || { target: 'node' + process.version.slice(1), hookMatcher: endsInEsbuildTsx, - }); + }; + + mod.register(Object.assign({}, config, { extensions: ['.tsx'] })); }, }, '.esm.js': { @@ -168,12 +201,18 @@ var extensions = { '.jsx': [ { module: '@babel/register', - register: function (hook) { - hook({ - extensions: '.jsx', + register: function (hook, config) { + config = config || { rootMode: 'upward-optional', - overrides: [{ only: [endsInJsx] }], - }); + overrides: [ + { + only: [endsInJsx], + presets: ['@babel/preset-env', '@babel/preset-react'], + }, + ], + }; + + hook(Object.assign({}, config, { extensions: '.jsx' })); }, }, 'sucrase/register/jsx', @@ -186,80 +225,142 @@ var extensions = { '.node': null, '.sucrase.js': { module: 'sucrase/dist/register', - register: function (hook) { - hook.registerJS({ + register: function (hook, config) { + config = config || { matcher: endsInSucraseJs, - }); + }; + + hook.registerJS(config); }, }, '.sucrase.jsx': { module: 'sucrase/dist/register', - register: function (hook) { - hook.registerJSX({ + register: function (hook, config) { + config = config || { matcher: endsInSucraseJsx, - }); + }; + + hook.registerJSX(config); }, }, '.sucrase.ts': { module: 'sucrase/dist/register', - register: function (hook) { - hook.registerTS({ + register: function (hook, config) { + config = config || { matcher: endsInSucraseTs, - }); + }; + + hook.registerTS(config); }, }, '.sucrase.tsx': { module: 'sucrase/dist/register', - register: function (hook) { - hook.registerTSX({ + register: function (hook, config) { + config = config || { matcher: endsInSucraseTsx, - }); + }; + + hook.registerTSX(config); }, }, '.swc.js': { module: '@swc/register', - register: function (hook) { - hook({ - extensions: '.js', + 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) { - hook({ - extensions: '.jsx', + 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) { - hook({ - extensions: '.ts', + 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) { - hook({ - extensions: '.tsx', + 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) { - hook.install(); + register: function (hook, config) { + hook.install(config); }, }, '.ts': [ @@ -267,32 +368,60 @@ var extensions = { 'sucrase/register/ts', { module: '@babel/register', - register: function (hook) { - hook({ - extensions: '.ts', + register: function (hook, config) { + config = config || { rootMode: 'upward-optional', - overrides: [{ only: [endsInTs] }], - }); + overrides: [ + { + only: [endsInTs], + presets: ['@babel/preset-env', '@babel/preset-typescript'], + }, + ], + }; + + hook( + Object.assign({}, config, { + extensions: '.ts', + }) + ); }, }, { module: 'esbuild-register/dist/node', - register: function (mod) { - mod.register({ - extensions: ['.ts'], + 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) { - hook({ - extensions: '.ts', + register: function (hook, config) { + config = config || { only: [endsInTs], ignore: [isNodeModules], - }); + jsc: { + parser: { + syntax: 'typescript', + }, + }, + module: { + type: 'commonjs', + }, + }; + + hook( + Object.assign({}, config, { + extensions: '.ts', + }) + ); }, }, ], @@ -301,32 +430,71 @@ var extensions = { 'sucrase/register/tsx', { module: '@babel/register', - register: function (hook) { - hook({ - extensions: '.tsx', + register: function (hook, config) { + config = config || { rootMode: 'upward-optional', - overrides: [{ only: [endsInTsx] }], - }); + 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) { - mod.register({ - extensions: ['.tsx'], + 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) { - hook({ - extensions: '.tsx', + 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', + }) + ); }, }, ], diff --git a/test/fixtures/babel.js/0/.babelrc b/test/fixtures/babel.js/0/.babelrc deleted file mode 100644 index 7dd5e9d..0000000 --- a/test/fixtures/babel.js/0/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["@babel/preset-react"] -} diff --git a/test/fixtures/babel.js/0/package.json b/test/fixtures/babel.js/0/package.json index 3d1a2a6..c98805b 100644 --- a/test/fixtures/babel.js/0/package.json +++ b/test/fixtures/babel.js/0/package.json @@ -1,7 +1,7 @@ { "dependencies": { "@babel/core": "^7.2.2", - "@babel/preset-react": "^7.0.0", + "@babel/preset-env": "^7.0.0", "@babel/register": "^7.0.0" } } diff --git a/test/fixtures/babel.jsx/0/.babelrc b/test/fixtures/babel.jsx/0/.babelrc deleted file mode 100644 index 7dd5e9d..0000000 --- a/test/fixtures/babel.jsx/0/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["@babel/preset-react"] -} diff --git a/test/fixtures/babel.jsx/0/package.json b/test/fixtures/babel.jsx/0/package.json index 3d1a2a6..cec293f 100644 --- a/test/fixtures/babel.jsx/0/package.json +++ b/test/fixtures/babel.jsx/0/package.json @@ -1,6 +1,7 @@ { "dependencies": { "@babel/core": "^7.2.2", + "@babel/preset-env": "^7.0.0", "@babel/preset-react": "^7.0.0", "@babel/register": "^7.0.0" } diff --git a/test/fixtures/babel.ts/0/.babelrc b/test/fixtures/babel.ts/0/.babelrc deleted file mode 100644 index e15ac01..0000000 --- a/test/fixtures/babel.ts/0/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["@babel/preset-typescript"] -} diff --git a/test/fixtures/babel.ts/0/package.json b/test/fixtures/babel.ts/0/package.json index 6298ebf..71c22d5 100644 --- a/test/fixtures/babel.ts/0/package.json +++ b/test/fixtures/babel.ts/0/package.json @@ -1,6 +1,7 @@ { "dependencies": { "@babel/core": "^7.2.2", + "@babel/preset-env": "^7.0.0", "@babel/preset-typescript": "^7.1.0", "@babel/register": "^7.0.0" } diff --git a/test/fixtures/babel.tsx/0/.babelrc b/test/fixtures/babel.tsx/0/.babelrc deleted file mode 100644 index 5bcced6..0000000 --- a/test/fixtures/babel.tsx/0/.babelrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "presets": [ - "@babel/preset-env", - "@babel/preset-react", - [ - "@babel/preset-typescript", - { - "isTSX": true, - "allExtensions": true - } - ] - ] -} diff --git a/test/fixtures/jsx/0/.babelrc b/test/fixtures/jsx/0/.babelrc deleted file mode 100644 index 7dd5e9d..0000000 --- a/test/fixtures/jsx/0/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["@babel/preset-react"] -} diff --git a/test/fixtures/jsx/0/package.json b/test/fixtures/jsx/0/package.json index 3d1a2a6..cec293f 100644 --- a/test/fixtures/jsx/0/package.json +++ b/test/fixtures/jsx/0/package.json @@ -1,6 +1,7 @@ { "dependencies": { "@babel/core": "^7.2.2", + "@babel/preset-env": "^7.0.0", "@babel/preset-react": "^7.0.0", "@babel/register": "^7.0.0" } diff --git a/test/fixtures/swc.js/0/.swcrc b/test/fixtures/swc.js/0/.swcrc deleted file mode 100644 index a38ca9b..0000000 --- a/test/fixtures/swc.js/0/.swcrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "jsc": { - "parser": { - "syntax": "ecmascript" - } - }, - "module": { - "type": "commonjs" - } -} diff --git a/test/fixtures/swc.jsx/0/.swcrc b/test/fixtures/swc.jsx/0/.swcrc deleted file mode 100644 index 89600e0..0000000 --- a/test/fixtures/swc.jsx/0/.swcrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "jsc": { - "parser": { - "syntax": "ecmascript", - "jsx": true - } - }, - "module": { - "type": "commonjs" - } -} diff --git a/test/fixtures/swc.ts/0/.swcrc b/test/fixtures/swc.ts/0/.swcrc deleted file mode 100644 index a9c9497..0000000 --- a/test/fixtures/swc.ts/0/.swcrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "jsc": { - "parser": { - "syntax": "typescript" - } - }, - "module": { - "type": "commonjs" - } -} diff --git a/test/fixtures/swc.tsx/0/.swcrc b/test/fixtures/swc.tsx/0/.swcrc deleted file mode 100644 index 98f536d..0000000 --- a/test/fixtures/swc.tsx/0/.swcrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "jsc": { - "parser": { - "syntax": "typescript", - "tsx": true - } - }, - "module": { - "type": "commonjs" - } -} diff --git a/test/fixtures/ts/2/.babelrc b/test/fixtures/ts/2/.babelrc deleted file mode 100644 index 5bcced6..0000000 --- a/test/fixtures/ts/2/.babelrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "presets": [ - "@babel/preset-env", - "@babel/preset-react", - [ - "@babel/preset-typescript", - { - "isTSX": true, - "allExtensions": true - } - ] - ] -} diff --git a/test/fixtures/ts/2/component.ts b/test/fixtures/ts/2/component.ts deleted file mode 100644 index d26bcf1..0000000 --- a/test/fixtures/ts/2/component.ts +++ /dev/null @@ -1,18 +0,0 @@ -const React = { - createElement(Component: () => any) { - return Component(); - }, -}; - -// Test harmony arrow functions. -const Component = () => { - var trueKey: boolean = true; - var falseKey: boolean = false; - var subKey = { subProp: 1 }; - - // Test harmony object short notation. - return { data: { trueKey, falseKey, subKey } }; -}; - -// Test TSX syntax. -export default ; diff --git a/test/fixtures/ts/2/package.json b/test/fixtures/ts/2/package.json index 5fa8c33..cc3213f 100644 --- a/test/fixtures/ts/2/package.json +++ b/test/fixtures/ts/2/package.json @@ -2,7 +2,6 @@ "dependencies": { "@babel/core": "^7.2.2", "@babel/preset-env": "^7.2.3", - "@babel/preset-react": "^7.0.0", "@babel/preset-typescript": "^7.1.0", "@babel/register": "^7.0.0" } diff --git a/test/fixtures/ts/2/test.ts b/test/fixtures/ts/2/test.ts index 28103e5..3fa0969 100644 --- a/test/fixtures/ts/2/test.ts +++ b/test/fixtures/ts/2/test.ts @@ -1,5 +1,19 @@ -import Component from './component'; - -var test: typeof Component = { ...Component }; +var test: { + data: { + trueKey: boolean; + falseKey: boolean; + subKey: { + subProp: number; + }; + }; +} = { + data: { + trueKey: true, + falseKey: false, + subKey: { + subProp: 1, + }, + }, +}; export default test; diff --git a/test/fixtures/ts/4/.swcrc b/test/fixtures/ts/4/.swcrc deleted file mode 100644 index a9c9497..0000000 --- a/test/fixtures/ts/4/.swcrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "jsc": { - "parser": { - "syntax": "typescript" - } - }, - "module": { - "type": "commonjs" - } -} diff --git a/test/fixtures/tsx/2/.babelrc b/test/fixtures/tsx/2/.babelrc deleted file mode 100644 index 5bcced6..0000000 --- a/test/fixtures/tsx/2/.babelrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "presets": [ - "@babel/preset-env", - "@babel/preset-react", - [ - "@babel/preset-typescript", - { - "isTSX": true, - "allExtensions": true - } - ] - ] -} diff --git a/test/fixtures/tsx/4/.swcrc b/test/fixtures/tsx/4/.swcrc deleted file mode 100644 index 98f536d..0000000 --- a/test/fixtures/tsx/4/.swcrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "jsc": { - "parser": { - "syntax": "typescript", - "tsx": true - } - }, - "module": { - "type": "commonjs" - } -}