From 49100e922c6e969b32fd4cba3fede449684e49ed Mon Sep 17 00:00:00 2001 From: Alexander Nanberg Date: Thu, 29 Nov 2018 01:14:44 +0100 Subject: [PATCH] fix(gatsby-plugin-netlify-cms): dynamically import netlify-identity-widget (#9565) --- .../__tests__/index.js | 12 +++++++ packages/babel-preset-gatsby-package/index.js | 1 + .../babel-preset-gatsby-package/package.json | 1 + .../src/gatsby-browser.js | 31 ++++++++++++++----- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/packages/babel-preset-gatsby-package/__tests__/index.js b/packages/babel-preset-gatsby-package/__tests__/index.js index 85383b585352a..e16070b720152 100644 --- a/packages/babel-preset-gatsby-package/__tests__/index.js +++ b/packages/babel-preset-gatsby-package/__tests__/index.js @@ -32,6 +32,9 @@ it(`Specifies proper presets and plugins in Node mode`, () => { path.join(`@babel`, `plugin-proposal-optional-chaining`) ), expect.stringContaining(path.join(`@babel`, `plugin-transform-runtime`)), + expect.stringContaining( + path.join(`@babel`, `plugin-syntax-dynamic-import`) + ), ]) }) @@ -66,6 +69,9 @@ it(`Specifies proper presets and plugins in debug Node mode`, () => { path.join(`@babel`, `plugin-proposal-optional-chaining`) ), expect.stringContaining(path.join(`@babel`, `plugin-transform-runtime`)), + expect.stringContaining( + path.join(`@babel`, `plugin-syntax-dynamic-import`) + ), ]) }) @@ -100,6 +106,9 @@ it(`Specifies proper presets and plugins in browser mode`, () => { path.join(`@babel`, `plugin-proposal-optional-chaining`) ), expect.stringContaining(path.join(`@babel`, `plugin-transform-runtime`)), + expect.stringContaining( + path.join(`@babel`, `plugin-syntax-dynamic-import`) + ), ]) }) @@ -134,5 +143,8 @@ it(`Specifies proper presets and plugins in debug browser mode`, () => { path.join(`@babel`, `plugin-proposal-optional-chaining`) ), expect.stringContaining(path.join(`@babel`, `plugin-transform-runtime`)), + expect.stringContaining( + path.join(`@babel`, `plugin-syntax-dynamic-import`) + ), ]) }) diff --git a/packages/babel-preset-gatsby-package/index.js b/packages/babel-preset-gatsby-package/index.js index e99090ca18cf5..c4c27f282d0a2 100644 --- a/packages/babel-preset-gatsby-package/index.js +++ b/packages/babel-preset-gatsby-package/index.js @@ -43,6 +43,7 @@ function preset(context, options = {}) { r(`@babel/plugin-proposal-class-properties`), r(`@babel/plugin-proposal-optional-chaining`), r(`@babel/plugin-transform-runtime`), + r(`@babel/plugin-syntax-dynamic-import`), ], } } diff --git a/packages/babel-preset-gatsby-package/package.json b/packages/babel-preset-gatsby-package/package.json index 4568973fe64e2..393196df1f09d 100644 --- a/packages/babel-preset-gatsby-package/package.json +++ b/packages/babel-preset-gatsby-package/package.json @@ -5,6 +5,7 @@ "dependencies": { "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", "@babel/plugin-transform-runtime": "^7.0.0", "@babel/preset-env": "^7.0.0", "@babel/preset-flow": "^7.0.0", diff --git a/packages/gatsby-plugin-netlify-cms/src/gatsby-browser.js b/packages/gatsby-plugin-netlify-cms/src/gatsby-browser.js index 238515dcaca43..28e8e3ed1c96c 100644 --- a/packages/gatsby-plugin-netlify-cms/src/gatsby-browser.js +++ b/packages/gatsby-plugin-netlify-cms/src/gatsby-browser.js @@ -1,18 +1,33 @@ /* global __PATH_PREFIX__ */ -import netlifyIdentityWidget from "netlify-identity-widget" + +// Taken from https://github.com/netlify/netlify-identity-widget +const routes = /(confirmation|invite|recovery|email_change)_token=([^&]+)/ +const errorRoute = /error=access_denied&error_description=403/ +const accessTokenRoute = /access_token=/ exports.onInitialClientRender = ( _, { enableIdentityWidget = true, publicPath = `admin` } ) => { - if (enableIdentityWidget) { - netlifyIdentityWidget.on(`init`, user => { - if (!user) { - netlifyIdentityWidget.on(`login`, () => { - document.location.href = `${__PATH_PREFIX__}/${publicPath}/` + const hash = (document.location.hash || ``).replace(/^#\/?/, ``) + + if ( + enableIdentityWidget && + (hash.match(routes) || + hash.match(errorRoute) || + hash.match(accessTokenRoute)) + ) { + import(`netlify-identity-widget`).then( + ({ default: netlifyIdentityWidget }) => { + netlifyIdentityWidget.on(`init`, user => { + if (!user) { + netlifyIdentityWidget.on(`login`, () => { + document.location.href = `${__PATH_PREFIX__}/${publicPath}/` + }) + } }) + netlifyIdentityWidget.init() } - }) - netlifyIdentityWidget.init() + ) } }