From 1fa55f5d276de051d489a19da2ee7e44d83d1d6d Mon Sep 17 00:00:00 2001 From: Michal Piechowiak Date: Fri, 4 Jun 2021 17:08:42 +0200 Subject: [PATCH] refactor(gatsby): single function to load config and plugins --- .../src/bootstrap/load-config-and-plugins.ts | 53 +++++++++++++++++++ packages/gatsby/src/services/initialize.ts | 53 ++++--------------- 2 files changed, 64 insertions(+), 42 deletions(-) create mode 100644 packages/gatsby/src/bootstrap/load-config-and-plugins.ts diff --git a/packages/gatsby/src/bootstrap/load-config-and-plugins.ts b/packages/gatsby/src/bootstrap/load-config-and-plugins.ts new file mode 100644 index 0000000000000..d6a6d463ed71e --- /dev/null +++ b/packages/gatsby/src/bootstrap/load-config-and-plugins.ts @@ -0,0 +1,53 @@ +import reporter from "gatsby-cli/lib/reporter" + +import { IProgram } from "../commands/types" +import { IFlattenedPlugin } from "./load-plugins/types" + +import { preferDefault } from "../bootstrap/prefer-default" +import { getConfigFile } from "../bootstrap/get-config-file" +import { loadPlugins } from "../bootstrap/load-plugins" +import { internalActions } from "../redux/actions" +import loadThemes from "../bootstrap/load-themes" +import { store } from "../redux" + +export async function loadConfigAndPlugins({ + siteDirectory, +}: { + siteDirectory: string +}): Promise<{ + config: any + flattenedPlugins: Array +}> { + // Try opening the site's gatsby-config.js file. + const { configModule, configFilePath } = await getConfigFile( + siteDirectory, + `gatsby-config` + ) + let config = preferDefault(configModule) + + // The root config cannot be exported as a function, only theme configs + if (typeof config === `function`) { + reporter.panic({ + id: `10126`, + context: { + configName: `gatsby-config`, + siteDirectory, + }, + }) + } + + // theme gatsby configs can be functions or objects + if (config) { + const plugins = await loadThemes(config, { + configFilePath, + rootDir: siteDirectory, + }) + config = plugins.config + } + + store.dispatch(internalActions.setSiteConfig(config)) + + const flattenedPlugins = await loadPlugins(config, siteDirectory) + + return { config, flattenedPlugins } +} diff --git a/packages/gatsby/src/services/initialize.ts b/packages/gatsby/src/services/initialize.ts index 8b2cb42d09729..8d1a3e036d849 100644 --- a/packages/gatsby/src/services/initialize.ts +++ b/packages/gatsby/src/services/initialize.ts @@ -11,21 +11,17 @@ import apiRunnerNode from "../utils/api-runner-node" import handleFlags from "../utils/handle-flags" import { getBrowsersList } from "../utils/browserslist" import { Store, AnyAction } from "redux" -import { preferDefault } from "../bootstrap/prefer-default" import * as WorkerPool from "../utils/worker/pool" import { startPluginRunner } from "../redux/plugin-runner" -import { loadPlugins } from "../bootstrap/load-plugins" import { store, emitter } from "../redux" -import loadThemes from "../bootstrap/load-themes" import reporter from "gatsby-cli/lib/reporter" -import { getConfigFile } from "../bootstrap/get-config-file" import { removeStaleJobs } from "../bootstrap/remove-stale-jobs" import { IPluginInfoOptions } from "../bootstrap/load-plugins/types" -import { internalActions } from "../redux/actions" import { IGatsbyState } from "../redux/types" import { IBuildContext } from "./types" import availableFlags from "../utils/flags" import { detectLmdbStore } from "../datastore" +import { loadConfigAndPlugins } from "../bootstrap/load-config-and-plugins" interface IPluginResolution { resolve: string @@ -137,26 +133,17 @@ export async function initialize({ emitter.on(`END_JOB`, onEndJob) // Try opening the site's gatsby-config.js file. - let activity = reporter.activityTimer(`open and validate gatsby-configs`, { - parentSpan, - }) - activity.start() - const { configModule, configFilePath } = await getConfigFile( - program.directory, - `gatsby-config` + let activity = reporter.activityTimer( + `open and validate gatsby-configs, load plugins`, + { + parentSpan, + } ) - let config = preferDefault(configModule) - - // The root config cannot be exported as a function, only theme configs - if (typeof config === `function`) { - reporter.panic({ - id: `10126`, - context: { - configName: `gatsby-config`, - path: program.directory, - }, - }) - } + activity.start() + + const { config, flattenedPlugins } = await loadConfigAndPlugins({ + siteDirectory: program.directory, + }) // Setup flags if (config) { @@ -206,23 +193,12 @@ export async function initialize({ } detectLmdbStore() - // theme gatsby configs can be functions or objects - if (config) { - const plugins = await loadThemes(config, { - configFilePath, - rootDir: program.directory, - }) - config = plugins.config - } - if (config && config.polyfill) { reporter.warn( `Support for custom Promise polyfills has been removed in Gatsby v2. We only support Babel 7's new automatic polyfilling behavior.` ) } - store.dispatch(internalActions.setSiteConfig(config)) - activity.end() if (process.env.GATSBY_EXPERIMENTAL_QUERY_ON_DEMAND) { @@ -241,13 +217,6 @@ export async function initialize({ // run stale jobs store.dispatch(removeStaleJobs(store.getState())) - activity = reporter.activityTimer(`load plugins`, { - parentSpan, - }) - activity.start() - const flattenedPlugins = await loadPlugins(config, program.directory) - activity.end() - // Multiple occurrences of the same name-version-pair can occur, // so we report an array of unique pairs const pluginsStr = _.uniq(flattenedPlugins.map(p => `${p.name}@${p.version}`))