diff --git a/e2e-tests/development-runtime/cypress/integration/functionality/babelrc.js b/e2e-tests/development-runtime/cypress/integration/functionality/babelrc.js new file mode 100644 index 0000000000000..364022fa0c048 --- /dev/null +++ b/e2e-tests/development-runtime/cypress/integration/functionality/babelrc.js @@ -0,0 +1,91 @@ +const TEST_ELEMENT = `test-element` + +before(() => { + cy.exec(`npm run reset`) +}) + +after(() => { + cy.exec(`npm run reset`) +}) + +describe(`babelrc`, () => { + it(`Applies .babelrc`, () => { + cy.visit(`/babelrc/base/`).waitForRouteChange() + + cy.getTestElement(TEST_ELEMENT) + .invoke(`text`) + .should(`eq`, `babel-rc-is-used`) + }) + + describe(`hot reload`, () => { + it(`editing .babelrc`, () => { + cy.visit(`/babelrc/edit/`).waitForRouteChange() + + cy.getTestElement(TEST_ELEMENT) + .invoke(`text`) + .should(`eq`, `babel-rc-initial`) + + cy.exec( + `npm run update -- --file src/pages/babelrc/edit/.babelrc --replacements "babel-rc-initial:babel-rc-edited" --exact` + ) + + cy.waitForHmr() + + cy.getTestElement(TEST_ELEMENT) + .invoke(`text`) + .should(`eq`, `babel-rc-edited`) + }) + + it(`adding .babelrc`, () => { + cy.visit(`/babelrc/add/`).waitForRouteChange() + + cy.getTestElement(TEST_ELEMENT) + .invoke(`text`) + .should(`eq`, `babel-rc-test`) + + cy.exec( + `npm run update -- --file src/pages/babelrc/add/.babelrc --file-source src/pages/babelrc/add/.babelrc-fixture` + ) + + // babel-loader doesn't actually hot reloads itself when new .babelrc file is added + // this is because it registers dependency only if file already exists + // ( https://github.com/babel/babel-loader/blob/1669ac07ee1eed28a8e6fcacbf1c07ceb06fe053/src/index.js#L214-L216 ) + // so to test hot-reloading here we actually have to invalidate js file, which would recompile it and discover + // new babelrc file + cy.exec( + `npm run update -- --file src/pages/babelrc/add/index.js --replacements "foo-bar:foo-bar" --exact` + ) + + cy.waitForHmr() + + cy.getTestElement(TEST_ELEMENT) + .invoke(`text`) + .should(`eq`, `babel-rc-added`) + }) + + it(`removing .babelrc`, () => { + cy.visit(`/babelrc/remove/`).waitForRouteChange() + + cy.getTestElement(TEST_ELEMENT) + .invoke(`text`) + .should(`eq`, `babel-rc-will-be-deleted`) + + cy.exec( + `npm run update -- --file src/pages/babelrc/remove/.babelrc --delete` + ) + + // babel-loader doesn't actually hot reloads itself when .babelrc file is deleted + // so to test hot-reloading here we actually have to invalidate js file, which would recompile it and discover + // new babelrc file + cy.exec( + `npm run update -- --file src/pages/babelrc/remove/index.js --replacements "foo-bar:foo-bar" --exact` + ) + + cy.waitForHmr() + + cy.getTestElement(TEST_ELEMENT) + .invoke(`text`) + .should(`eq`, `babel-rc-test`) + }) + }) +}) diff --git a/e2e-tests/development-runtime/package.json b/e2e-tests/development-runtime/package.json index eb02de8879393..79864439a909a 100644 --- a/e2e-tests/development-runtime/package.json +++ b/e2e-tests/development-runtime/package.json @@ -4,6 +4,7 @@ "version": "1.0.0", "author": "Dustin Schau ", "dependencies": { + "babel-plugin-search-and-replace": "^1.1.0", "gatsby": "^3.0.0-next.6", "gatsby-image": "^3.0.0-next.0", "gatsby-plugin-image": "^1.0.0-next.5", diff --git a/e2e-tests/development-runtime/scripts/update.js b/e2e-tests/development-runtime/scripts/update.js index 5d314714832ba..094fc0c111ee0 100644 --- a/e2e-tests/development-runtime/scripts/update.js +++ b/e2e-tests/development-runtime/scripts/update.js @@ -17,6 +17,10 @@ const args = yargs default: false, type: `boolean`, }) + .option(`delete`, { + default: false, + type: `boolean`, + }) .option(`fileContent`, { default: JSON.stringify( ` @@ -35,6 +39,9 @@ const args = yargs ).trim(), type: `string`, }) + .option(`fileSource`, { + type: `string`, + }) .option(`restore`, { default: false, type: `boolean`, @@ -60,11 +67,13 @@ async function update() { let exists = true if (!fs.existsSync(filePath)) { exists = false - await fs.writeFile( - filePath, - JSON.parse(args.fileContent).replace(/\+n/g, `\n`), - `utf8` - ) + let fileContent + if (args.fileSource) { + fileContent = await fs.readFile(args.fileSource, `utf8`) + } else if (args.fileContent) { + fileContent = JSON.parse(args.fileContent).replace(/\+n/g, `\n`) + } + await fs.writeFile(filePath, fileContent, `utf8`) } const file = await fs.readFile(filePath, `utf8`) @@ -72,15 +81,21 @@ async function update() { history.set(filePath, exists ? file : false) } - const contents = replacements.reduce((replaced, pair) => { - const [key, value] = pair.split(`:`) - return replaced.replace( - args.exact ? key : new RegExp(`%${key}%`, `g`), - value - ) - }, file) + if (args.delete) { + if (exists) { + await fs.remove(filePath) + } + } else { + const contents = replacements.reduce((replaced, pair) => { + const [key, value] = pair.split(`:`) + return replaced.replace( + args.exact ? key : new RegExp(`%${key}%`, `g`), + value + ) + }, file) - await fs.writeFile(filePath, contents, `utf8`) + await fs.writeFile(filePath, contents, `utf8`) + } await writeHistory(history) } diff --git a/e2e-tests/development-runtime/src/pages/babelrc/add/.babelrc-fixture b/e2e-tests/development-runtime/src/pages/babelrc/add/.babelrc-fixture new file mode 100644 index 0000000000000..39b37323c6e35 --- /dev/null +++ b/e2e-tests/development-runtime/src/pages/babelrc/add/.babelrc-fixture @@ -0,0 +1,20 @@ +{ + "plugins": [ + [ + "babel-plugin-search-and-replace", + { + "rules": [ + { + "search": "babel-rc-test", + "replace": "babel-rc-added", + "searchTemplateStrings": true + } + + ] + } + ] + ], + "presets": [ + "babel-preset-gatsby" + ] +} \ No newline at end of file diff --git a/e2e-tests/development-runtime/src/pages/babelrc/add/index.js b/e2e-tests/development-runtime/src/pages/babelrc/add/index.js new file mode 100644 index 0000000000000..6caaa52a3a806 --- /dev/null +++ b/e2e-tests/development-runtime/src/pages/babelrc/add/index.js @@ -0,0 +1,13 @@ +import React from "react" + +export default function BabelrcAdd() { + return ( + <> +

+ Code block below should contain babel-rc-test first and + after .babelrc addition it should contain babel-rc-added +

+
babel-rc-test
+ + ) +} diff --git a/e2e-tests/development-runtime/src/pages/babelrc/base/.babelrc b/e2e-tests/development-runtime/src/pages/babelrc/base/.babelrc new file mode 100644 index 0000000000000..a5613b93f2bd8 --- /dev/null +++ b/e2e-tests/development-runtime/src/pages/babelrc/base/.babelrc @@ -0,0 +1,20 @@ +{ + "plugins": [ + [ + "babel-plugin-search-and-replace", + { + "rules": [ + { + "search": "babel-rc-test", + "replace": "babel-rc-is-used", + "searchTemplateStrings": true + } + + ] + } + ] + ], + "presets": [ + "babel-preset-gatsby" + ] +} \ No newline at end of file diff --git a/e2e-tests/development-runtime/src/pages/babelrc/base/index.js b/e2e-tests/development-runtime/src/pages/babelrc/base/index.js new file mode 100644 index 0000000000000..182c8af062362 --- /dev/null +++ b/e2e-tests/development-runtime/src/pages/babelrc/base/index.js @@ -0,0 +1,13 @@ +import React from "react" + +export default function BabelrcBase() { + return ( + <> +

+ Code block below should contain babel-rc-is-used when + compiled +

+
babel-rc-test
+ + ) +} diff --git a/e2e-tests/development-runtime/src/pages/babelrc/edit/.babelrc b/e2e-tests/development-runtime/src/pages/babelrc/edit/.babelrc new file mode 100644 index 0000000000000..dc4473061a74e --- /dev/null +++ b/e2e-tests/development-runtime/src/pages/babelrc/edit/.babelrc @@ -0,0 +1,20 @@ +{ + "plugins": [ + [ + "babel-plugin-search-and-replace", + { + "rules": [ + { + "search": "babel-rc-test", + "replace": "babel-rc-initial", + "searchTemplateStrings": true + } + + ] + } + ] + ], + "presets": [ + "babel-preset-gatsby" + ] +} \ No newline at end of file diff --git a/e2e-tests/development-runtime/src/pages/babelrc/edit/index.js b/e2e-tests/development-runtime/src/pages/babelrc/edit/index.js new file mode 100644 index 0000000000000..34968e33f4c89 --- /dev/null +++ b/e2e-tests/development-runtime/src/pages/babelrc/edit/index.js @@ -0,0 +1,13 @@ +import React from "react" + +export default function BabelrcEdit() { + return ( + <> +

+ Code block below should contain babel-rc-initial first and + after edit it should contain babel-rc-edited +

+
babel-rc-test
+ + ) +} diff --git a/e2e-tests/development-runtime/src/pages/babelrc/remove/.babelrc b/e2e-tests/development-runtime/src/pages/babelrc/remove/.babelrc new file mode 100644 index 0000000000000..8a8be5f54fdbc --- /dev/null +++ b/e2e-tests/development-runtime/src/pages/babelrc/remove/.babelrc @@ -0,0 +1,20 @@ +{ + "plugins": [ + [ + "babel-plugin-search-and-replace", + { + "rules": [ + { + "search": "babel-rc-test", + "replace": "babel-rc-will-be-deleted", + "searchTemplateStrings": true + } + + ] + } + ] + ], + "presets": [ + "babel-preset-gatsby" + ] +} \ No newline at end of file diff --git a/e2e-tests/development-runtime/src/pages/babelrc/remove/index.js b/e2e-tests/development-runtime/src/pages/babelrc/remove/index.js new file mode 100644 index 0000000000000..addb5899f2907 --- /dev/null +++ b/e2e-tests/development-runtime/src/pages/babelrc/remove/index.js @@ -0,0 +1,13 @@ +import React from "react" + +export default function BabelrcRemove() { + return ( + <> +

+ Code block below should contain babel-rc-will-be-deleted{" "} + first and after removal it should contain babel-rc-test +

+
babel-rc-test
+ + ) +} diff --git a/e2e-tests/production-runtime/cypress/integration/babelrc.js b/e2e-tests/production-runtime/cypress/integration/babelrc.js new file mode 100644 index 0000000000000..2634b009ba7cb --- /dev/null +++ b/e2e-tests/production-runtime/cypress/integration/babelrc.js @@ -0,0 +1,11 @@ +const TEST_ELEMENT = `test-element` + +describe(`babelrc`, () => { + it(`Applies .babelrc`, () => { + cy.visit(`/babelrc/base/`).waitForRouteChange() + + cy.getTestElement(TEST_ELEMENT) + .invoke(`text`) + .should(`eq`, `babel-rc-is-used`) + }) +}) diff --git a/e2e-tests/production-runtime/package.json b/e2e-tests/production-runtime/package.json index c0c165cb770fb..0b18fb7e55520 100644 --- a/e2e-tests/production-runtime/package.json +++ b/e2e-tests/production-runtime/package.json @@ -4,6 +4,7 @@ "version": "1.0.0", "author": "Kyle Mathews ", "dependencies": { + "babel-plugin-search-and-replace": "^1.1.0", "cypress": "^6.5.0", "gatsby": "^3.0.0-next.6", "gatsby-plugin-image": "^1.0.0-next.5", diff --git a/e2e-tests/production-runtime/src/pages/babelrc/base/.babelrc b/e2e-tests/production-runtime/src/pages/babelrc/base/.babelrc new file mode 100644 index 0000000000000..a5613b93f2bd8 --- /dev/null +++ b/e2e-tests/production-runtime/src/pages/babelrc/base/.babelrc @@ -0,0 +1,20 @@ +{ + "plugins": [ + [ + "babel-plugin-search-and-replace", + { + "rules": [ + { + "search": "babel-rc-test", + "replace": "babel-rc-is-used", + "searchTemplateStrings": true + } + + ] + } + ] + ], + "presets": [ + "babel-preset-gatsby" + ] +} \ No newline at end of file diff --git a/e2e-tests/production-runtime/src/pages/babelrc/base/index.js b/e2e-tests/production-runtime/src/pages/babelrc/base/index.js new file mode 100644 index 0000000000000..182c8af062362 --- /dev/null +++ b/e2e-tests/production-runtime/src/pages/babelrc/base/index.js @@ -0,0 +1,13 @@ +import React from "react" + +export default function BabelrcBase() { + return ( + <> +

+ Code block below should contain babel-rc-is-used when + compiled +

+
babel-rc-test
+ + ) +}