Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[1.0] During bootstrap, detect if plugins have changed and delete the cache #927

Merged
merged 8 commits into from
May 6, 2017
Prev Previous commit
Next Next commit
Extract plugin loading logic to its own module
  • Loading branch information
KyleAMathews committed May 5, 2017
commit 42fe9983a3369e1ade7634047bd9ee9dc20548de
84 changes: 1 addition & 83 deletions packages/gatsby/lib/bootstrap/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -100,89 +100,7 @@ module.exports = async (program: any) => {

console.timeEnd(`open and validate gatsby-config.js`)

// Instantiate plugins.
const plugins = []
// Create fake little site with a plugin for testing this
// w/ snapshots. Move plugin processing to its own module.
// Also test adding to redux store.
const processPlugin = plugin => {
if (_.isString(plugin)) {
const resolvedPath = slash(path.dirname(require.resolve(plugin)))
const packageJSON = JSON.parse(
fs.readFileSync(`${resolvedPath}/package.json`, `utf-8`)
)
return {
resolve: resolvedPath,
name: packageJSON.name,
version: packageJSON.version,
pluginOptions: {
plugins: [],
},
}
} else {
// Plugins can have plugins.
const subplugins = []
if (plugin.options && plugin.options.plugins) {
plugin.options.plugins.forEach(p => {
subplugins.push(processPlugin(p))
})
}
plugin.options.plugins = subplugins

const resolvedPath = slash(path.dirname(require.resolve(plugin.resolve)))
const packageJSON = JSON.parse(
fs.readFileSync(`${resolvedPath}/package.json`, `utf-8`)
)
return {
resolve: resolvedPath,
name: packageJSON.name,
version: packageJSON.version,
pluginOptions: _.merge({ plugins: [] }, plugin.options),
}
}
}

if (config.plugins) {
config.plugins.forEach(plugin => {
plugins.push(processPlugin(plugin))
})
}

// Add the site's default "plugin" i.e. gatsby-x files in root of site.
plugins.push({
resolve: slash(process.cwd()),
name: `defaultSitePlugin`,
version: `n/a`,
pluginOptions: {
plugins: [],
},
})

// Create a "flattened" array of plugins with all subplugins
// brought to the top-level. This simplifies running gatsby-* files
// for subplugins.
const flattenedPlugins = []
const extractPlugins = plugin => {
plugin.pluginOptions.plugins.forEach(subPlugin => {
flattenedPlugins.push(subPlugin)
extractPlugins(subPlugin)
})
}

plugins.forEach(plugin => {
flattenedPlugins.push(plugin)
extractPlugins(plugin)
})

store.dispatch({
type: `SET_SITE_PLUGINS`,
payload: plugins,
})

store.dispatch({
type: `SET_SITE_FLATTENED_PLUGINS`,
payload: flattenedPlugins,
})
const flattenedPlugins = await loadPlugins(config)

// Ensure the public directory is created.
await mkdirs(`${program.directory}/public`)
Expand Down
94 changes: 94 additions & 0 deletions packages/gatsby/lib/bootstrap/load-plugins.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
const _ = require(`lodash`)
const slash = require(`slash`)
const fs = require(`fs`)
const path = require(`path`)

import { store } from "../redux"

module.exports = async config => {
// Instantiate plugins.
const plugins = []
// Create fake little site with a plugin for testing this
// w/ snapshots. Move plugin processing to its own module.
// Also test adding to redux store.
const processPlugin = plugin => {
if (_.isString(plugin)) {
const resolvedPath = slash(path.dirname(require.resolve(plugin)))
const packageJSON = JSON.parse(
fs.readFileSync(`${resolvedPath}/package.json`, `utf-8`)
)
return {
resolve: resolvedPath,
name: packageJSON.name,
version: packageJSON.version,
pluginOptions: {
plugins: [],
},
}
} else {
// Plugins can have plugins.
const subplugins = []
if (plugin.options && plugin.options.plugins) {
plugin.options.plugins.forEach(p => {
subplugins.push(processPlugin(p))
})
}
plugin.options.plugins = subplugins

const resolvedPath = slash(path.dirname(require.resolve(plugin.resolve)))
const packageJSON = JSON.parse(
fs.readFileSync(`${resolvedPath}/package.json`, `utf-8`)
)
return {
resolve: resolvedPath,
name: packageJSON.name,
version: packageJSON.version,
pluginOptions: _.merge({ plugins: [] }, plugin.options),
}
}
}

if (config.plugins) {
config.plugins.forEach(plugin => {
plugins.push(processPlugin(plugin))
})
}

// Add the site's default "plugin" i.e. gatsby-x files in root of site.
plugins.push({
resolve: slash(process.cwd()),
name: `defaultSitePlugin`,
version: `n/a`,
pluginOptions: {
plugins: [],
},
})

// Create a "flattened" array of plugins with all subplugins
// brought to the top-level. This simplifies running gatsby-* files
// for subplugins.
const flattenedPlugins = []
const extractPlugins = plugin => {
plugin.pluginOptions.plugins.forEach(subPlugin => {
flattenedPlugins.push(subPlugin)
extractPlugins(subPlugin)
})
}

plugins.forEach(plugin => {
flattenedPlugins.push(plugin)
extractPlugins(plugin)
})

store.dispatch({
type: `SET_SITE_PLUGINS`,
payload: plugins,
})

store.dispatch({
type: `SET_SITE_FLATTENED_PLUGINS`,
payload: flattenedPlugins,
})

return flattenedPlugins
}