From 11e9aad80060e4b72c5f8369feca5af8fb05a93b Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 12 May 2021 11:53:41 -0400 Subject: [PATCH] Change API --- packages/docusaurus-types/src/index.d.ts | 4 +++- packages/docusaurus/src/commands/build.ts | 4 ++-- packages/docusaurus/src/commands/start.ts | 2 +- packages/docusaurus/src/server/configValidation.ts | 6 +++++- .../docusaurus/src/webpack/__tests__/utils.test.ts | 9 +++++++++ packages/docusaurus/src/webpack/base.ts | 2 +- packages/docusaurus/src/webpack/utils.ts | 13 +++++++------ 7 files changed, 28 insertions(+), 12 deletions(-) diff --git a/packages/docusaurus-types/src/index.d.ts b/packages/docusaurus-types/src/index.d.ts index 9c09b7957d..0ab274f42c 100644 --- a/packages/docusaurus-types/src/index.d.ts +++ b/packages/docusaurus-types/src/index.d.ts @@ -63,7 +63,9 @@ export interface DocusaurusConfig { } )[]; titleDelimiter?: string; - getCustomJSLoader?: (isServer: boolean) => RuleSetRule; + webpack?: { + jsLoader: 'babel' | ((isServer: boolean) => RuleSetRule); + }; } /** diff --git a/packages/docusaurus/src/commands/build.ts b/packages/docusaurus/src/commands/build.ts index 1df4f7ec9f..60ad1c2725 100644 --- a/packages/docusaurus/src/commands/build.ts +++ b/packages/docusaurus/src/commands/build.ts @@ -187,14 +187,14 @@ async function buildLocale({ configureWebpack.bind(plugin), // The plugin lifecycle may reference `this`. clientConfig, false, - props.siteConfig.getCustomJSLoader, + props.siteConfig.webpack?.jsLoader, ); serverConfig = applyConfigureWebpack( configureWebpack.bind(plugin), // The plugin lifecycle may reference `this`. serverConfig, true, - props.siteConfig.getCustomJSLoader, + props.siteConfig.webpack?.jsLoader, ); } }); diff --git a/packages/docusaurus/src/commands/start.ts b/packages/docusaurus/src/commands/start.ts index a6b95ed923..cd025bd6d5 100644 --- a/packages/docusaurus/src/commands/start.ts +++ b/packages/docusaurus/src/commands/start.ts @@ -153,7 +153,7 @@ export default async function start( configureWebpack.bind(plugin), // The plugin lifecycle may reference `this`. config, false, - props.siteConfig.getCustomJSLoader, + props.siteConfig.webpack?.jsLoader, ); } }); diff --git a/packages/docusaurus/src/server/configValidation.ts b/packages/docusaurus/src/server/configValidation.ts index c56908b1c3..60de610671 100644 --- a/packages/docusaurus/src/server/configValidation.ts +++ b/packages/docusaurus/src/server/configValidation.ts @@ -134,7 +134,11 @@ const ConfigSchema = Joi.object({ tagline: Joi.string().allow(''), titleDelimiter: Joi.string().default('|'), noIndex: Joi.bool().default(false), - getCustomJSLoader: Joi.function(), + webpack: Joi.object({ + jsLoader: Joi.alternatives() + .try(Joi.string().equal('babel'), Joi.function()) + .optional(), + }).optional(), }); // TODO move to @docusaurus/utils-validation diff --git a/packages/docusaurus/src/webpack/__tests__/utils.test.ts b/packages/docusaurus/src/webpack/__tests__/utils.test.ts index 6de535a2da..1dbde42171 100644 --- a/packages/docusaurus/src/webpack/__tests__/utils.test.ts +++ b/packages/docusaurus/src/webpack/__tests__/utils.test.ts @@ -29,6 +29,15 @@ describe('customize JS loader', () => { ); }); + test('getCustomizableJSLoader accepts loaders with preset', () => { + expect(getCustomizableJSLoader('babel')({isServer: true}).loader).toBe( + require.resolve('babel-loader'), + ); + expect(getCustomizableJSLoader('babel')({isServer: false}).loader).toBe( + require.resolve('babel-loader'), + ); + }); + test('getCustomizableJSLoader allows customization', () => { const customJSLoader = (isServer: boolean): RuleSetRule => ({ loader: 'my-fast-js-loader', diff --git a/packages/docusaurus/src/webpack/base.ts b/packages/docusaurus/src/webpack/base.ts index fca0eadff3..a85087a1ee 100644 --- a/packages/docusaurus/src/webpack/base.ts +++ b/packages/docusaurus/src/webpack/base.ts @@ -197,7 +197,7 @@ export function createBaseConfig( test: /\.(j|t)sx?$/, exclude: excludeJS, use: [ - getCustomizableJSLoader(siteConfig.getCustomJSLoader)({ + getCustomizableJSLoader(siteConfig.webpack?.jsLoader)({ isServer, babelOptions: getCustomBabelConfigFilePath(siteDir), }), diff --git a/packages/docusaurus/src/webpack/utils.ts b/packages/docusaurus/src/webpack/utils.ts index 849142fd6c..0ecf28f45b 100644 --- a/packages/docusaurus/src/webpack/utils.ts +++ b/packages/docusaurus/src/webpack/utils.ts @@ -151,7 +151,7 @@ function getDefaultBabelLoader({ } export const getCustomizableJSLoader = ( - getCustomJSLoader?: (isServer: boolean) => RuleSetRule, + jsLoader: 'babel' | ((isServer: boolean) => RuleSetRule) = 'babel', ) => ({ isServer, babelOptions, @@ -159,9 +159,9 @@ export const getCustomizableJSLoader = ( isServer: boolean; babelOptions?: TransformOptions | string; }): RuleSetRule => - getCustomJSLoader - ? getCustomJSLoader(isServer) - : getDefaultBabelLoader({isServer, babelOptions}); + jsLoader === 'babel' + ? getDefaultBabelLoader({isServer, babelOptions}) + : jsLoader(isServer); // TODO remove this before end of 2021? const warnBabelLoaderOnce = memoize(function () { @@ -197,18 +197,19 @@ function getCacheLoaderDeprecated() { * @param configureWebpack a webpack config or a function to modify config * @param config initial webpack config * @param isServer indicates if this is a server webpack configuration + * @param jsLoader custom js loader config * @returns final/ modified webpack config */ export function applyConfigureWebpack( configureWebpack: ConfigureWebpackFn, config: Configuration, isServer: boolean, - getCustomJSLoader?: (isServer: boolean) => RuleSetRule, + jsLoader?: 'babel' | ((isServer: boolean) => RuleSetRule), ): Configuration { // Export some utility functions const utils: ConfigureWebpackUtils = { getStyleLoaders, - getJSLoader: getCustomizableJSLoader(getCustomJSLoader), + getJSLoader: getCustomizableJSLoader(jsLoader), getBabelLoader: getBabelLoaderDeprecated, getCacheLoader: getCacheLoaderDeprecated, };