Skip to content

Commit

Permalink
fix(gatsby-recipes): Properly remove plugins from gatsby config (#24554)
Browse files Browse the repository at this point in the history
  • Loading branch information
johno authored May 28, 2020
1 parent 794812a commit 746c823
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 15 deletions.
36 changes: 22 additions & 14 deletions packages/gatsby-recipes/src/providers/gatsby/plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,21 @@ const addPluginToConfig = (src, { name, options, key }) => {
return code
}

const removePluginFromConfig = (src, { id, name, key }) => {
const addPlugins = new BabelPluginAddPluginsToGatsbyConfig({
pluginOrThemeName: name || id,
key,
shouldAdd: false,
})

const { code } = babel.transform(src, {
plugins: [addPlugins.plugin],
configFile: false,
})

return code
}

const getPluginsFromConfig = src => {
const getPlugins = new BabelPluginGetPluginsFromGatsbyConfig()

Expand Down Expand Up @@ -175,21 +190,12 @@ const read = async ({ root }, id) => {
}
}

const destroy = async ({ root }, { id, name }) => {
const destroy = async ({ root }, resource) => {
const configSrc = await readConfigFile(root)

const addPlugins = new BabelPluginAddPluginsToGatsbyConfig({
pluginOrThemeName: name,
key: id,
shouldAdd: false,
})

const { code } = babel.transform(configSrc, {
plugins: [addPlugins.plugin],
configFile: false,
})
const newSrc = removePluginFromConfig(configSrc, resource)

await fs.writeFile(getConfigPath(root), code)
await fs.writeFile(getConfigPath(root), newSrc)
}

class BabelPluginAddPluginsToGatsbyConfig {
Expand Down Expand Up @@ -254,11 +260,12 @@ class BabelPluginAddPluginsToGatsbyConfig {
pluginNodes.value.elements = pluginNodes.value.elements.filter(
node => {
const plugin = getPlugin(node)

if (key) {
return plugin.key === key
return plugin.key !== key
}

return plugin.name === pluginOrThemeName
return plugin.name !== pluginOrThemeName
}
)
}
Expand Down Expand Up @@ -302,6 +309,7 @@ class BabelPluginGetPluginsFromGatsbyConfig {

module.exports.addPluginToConfig = addPluginToConfig
module.exports.getPluginsFromConfig = getPluginsFromConfig
module.exports.removePluginFromConfig = removePluginFromConfig

module.exports.create = create
module.exports.update = create
Expand Down
37 changes: 36 additions & 1 deletion packages/gatsby-recipes/src/providers/gatsby/plugin.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@ const path = require(`path`)
const tmp = require(`tmp-promise`)

const plugin = require(`./plugin`)
const { addPluginToConfig, getPluginsFromConfig } = require(`./plugin`)
const {
addPluginToConfig,
getPluginsFromConfig,
removePluginFromConfig,
} = require(`./plugin`)
const resourceTestHelper = require(`../resource-test-helper`)

const STARTER_BLOG_FIXTURE = path.join(
Expand Down Expand Up @@ -91,6 +95,37 @@ describe(`gatsby-plugin resource`, () => {
expect(plugins1).toEqual(plugins2)
})

test(`removes plugins by name and key`, async () => {
let configSrc = await fs.readFile(configPath, `utf8`)
configSrc = addPluginToConfig(configSrc, { name: `gatsby-plugin-foo` })
configSrc = addPluginToConfig(configSrc, {
name: `gatsby-plugin-bar`,
options: { hello: `world` },
})
configSrc = addPluginToConfig(configSrc, {
name: `gatsby-plugin-baz`,
key: `special-key`,
})

configSrc = removePluginFromConfig(configSrc, { key: `special-key` })

let plugins = await getPluginsFromConfig(configSrc)

let pluginNames = plugins.map(p => p.name)
expect(pluginNames).toContain(`gatsby-plugin-foo`)
expect(pluginNames).toContain(`gatsby-plugin-bar`)
expect(pluginNames).not.toContain(`gatsby-plugin-baz`)

configSrc = removePluginFromConfig(configSrc, { id: `gatsby-plugin-bar` })

plugins = await getPluginsFromConfig(configSrc)

pluginNames = plugins.map(p => p.name)
expect(pluginNames).not.toContain(`gatsby-plugin-baz`)
expect(pluginNames).not.toContain(`gatsby-plugin-bar`)
expect(pluginNames).toContain(`gatsby-plugin-foo`)
})

// A key isn't required for gatsby plugin, but when you want to distinguish
// between multiple of the same plugin, you can specify it to target config changes.
test(`validates the gatsby-source-filesystem specifies a key`, async () => {
Expand Down

0 comments on commit 746c823

Please sign in to comment.