diff --git a/packages/docusaurus/src/webpack/__tests__/base.test.ts b/packages/docusaurus/src/webpack/__tests__/base.test.ts new file mode 100644 index 0000000000..0796b53b01 --- /dev/null +++ b/packages/docusaurus/src/webpack/__tests__/base.test.ts @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2017-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import path from 'path'; + +import {excludeJS, clientDir} from '../base'; + +describe('babel transpilation exclude logic', () => { + test('always transpile client dir files', () => { + const clientFiles = [ + 'App.js', + 'clientEntry.js', + 'serverEntry.js', + path.join('exports', 'Link.js'), + ]; + clientFiles.forEach(file => { + expect(excludeJS(path.join(clientDir, file))).toEqual(false); + }); + }); + + test('always transpile non node_module files', () => { + const moduleFiles = [ + '/pages/user/App.jsx', + '/website/src/components/foo.js', + '/src/theme/SearchBar/index.js', + ]; + moduleFiles.forEach(file => { + expect(excludeJS(file)).toEqual(false); + }); + }); + + test('transpile docusaurus npm packages even in node_modules', () => { + const moduleFiles = [ + '/website/node_modules/docusaurus-theme-search/theme/Navbar/index.js', + 'node_modules/@docusaurus/theme-classic/theme/Layout.js', + '/docusaurus/website/node_modules/@docusaurus/theme-search-algolia/theme/SearchBar.js', + ]; + moduleFiles.forEach(file => { + expect(excludeJS(file)).toEqual(false); + }); + }); + + test('does not transpile node_modules', () => { + const moduleFiles = [ + 'node_modules/react-toggle.js', + '/website/node_modules/react-trend/index.js', + '/docusaurus/website/node_modules/react-super.js', + '/docusaurus/website/node_modules/@docusaurus/core/node_modules/core-js/modules/_descriptors.js', + 'node_modules/docusaurus-theme-classic/node_modules/react-daypicker/index.js', + ]; + moduleFiles.forEach(file => { + expect(excludeJS(file)).toEqual(true); + }); + }); +}); diff --git a/packages/docusaurus/src/webpack/base.ts b/packages/docusaurus/src/webpack/base.ts index 3a67ad1e8a..a91404d38b 100644 --- a/packages/docusaurus/src/webpack/base.ts +++ b/packages/docusaurus/src/webpack/base.ts @@ -17,6 +17,19 @@ import {getBabelLoader, getCacheLoader, getStyleLoaders} from './utils'; const CSS_REGEX = /\.css$/; const CSS_MODULE_REGEX = /\.module\.css$/; +export const clientDir = path.join(__dirname, '..', 'client'); + +export function excludeJS(modulePath: string) { + // always transpile client dir + if (modulePath.startsWith(clientDir)) { + return false; + } + // Don't transpile node_modules except any docusaurus npm package + return ( + /node_modules/.test(modulePath) && + !/(docusaurus)((?!node_modules).)*\.jsx?$/.test(modulePath) + ); +} export function createBaseConfig( props: Props, @@ -24,7 +37,6 @@ export function createBaseConfig( ): Configuration { const {outDir, siteDir, baseUrl, generatedFilesDir, routesPaths} = props; - const clientDir = path.join(__dirname, '..', 'client'); const totalPages = routesPaths.length; const isProd = process.env.NODE_ENV === 'production'; return { @@ -133,17 +145,7 @@ export function createBaseConfig( rules: [ { test: /\.jsx?$/, - exclude: modulePath => { - // always transpile client dir - if (modulePath.startsWith(clientDir)) { - return false; - } - // Don't transpile node_modules except any docusaurus npm package - return ( - /node_modules/.test(modulePath) && - !/(docusaurus)((?!node_modules).)*\.jsx?$/.test(modulePath) - ); - }, + exclude: excludeJS, use: [getCacheLoader(isServer), getBabelLoader(isServer)].filter( Boolean, ) as Loader[],