diff --git a/packages/gatsby-plugin-offline/README.md b/packages/gatsby-plugin-offline/README.md index 7edfd7135c44f..96a84b8455036 100644 --- a/packages/gatsby-plugin-offline/README.md +++ b/packages/gatsby-plugin-offline/README.md @@ -19,20 +19,98 @@ in the service worker. plugins: [`gatsby-plugin-offline`] ``` -## Overriding options +## Available options -When adding this plugin to your `gatsby-config.js`, you can pass in options (via the `options` key) to -override the default [Workbox](https://developers.google.com/web/tools/workbox/modules/workbox-build) config. +As of `gatsby-plugin-offline` 3.0.0, the following options are available: -The default config is as follows. Warning: You can break the offline support by -changing these options, so tread carefully. +- `appendScript` lets you specify a file to be appended at the end of the generated service worker (`sw.js`). For example: + + ```javascript:title=gatsby-config.js + plugins: [ + { + resolve: `gatsby-plugin-offline`, + options: { + appendScript: `src/custom-sw-code.js`, + }, + }, + ] + ``` + + ```javascript:title=src/custom-sw-code.js + // show a notification after 15 seconds (the notification + // permission must be granted first) + setTimeout(() => { + self.registration.showNotification("Hello, world!") + }, 15000) + + // register a custom navigation route + const customRoute = new workbox.routing.NavigationRoute(({ event }) => { + // ... + }) + workbox.routing.registerRoute(customRoute) + ``` + +- `workboxConfig` allows you to override the default Workbox options - see [Overriding Workbox configuration](#overriding-workbox-configuration). For example: + + ```javascript:title=gatsby-config.js + plugins: [ + { + resolve: `gatsby-plugin-offline`, + options: { + workboxConfig: { + importWorkboxFrom: `cdn`, + }, + }, + }, + ] + ``` + +## Upgrading from 2.x + +To upgrade from 2.x to 3.x, move any existing options into the `workboxConfig` option. If you haven't specified any options, you have nothing to do. + +For example, here is a 2.x config: + +```javascript +plugins: [ + { + resolve: `gatsby-plugin-offline`, + options: { + importWorkboxFrom: `cdn`, + }, + }, +] +``` + +Here is the equivalent 3.x config: + +```javascript +plugins: [ + { + resolve: `gatsby-plugin-offline`, + options: { + workboxConfig: { + importWorkboxFrom: `cdn`, + }, + }, + }, +] +``` + +In version 3, Workbox is also upgraded to version 4 so you may need to update your `workboxConfig` if any of those changes apply to you. Please see the [docs on Google Developers](https://developers.google.com/web/tools/workbox/guides/migrations/migrate-from-v3) for more information. + +## Overriding Workbox configuration + +When adding this plugin to your `gatsby-config.js`, you can use the option `workboxConfig` to override the default Workbox config. To see the full list of options, see [this article on Google Developers](https://developers.google.com/web/tools/workbox/modules/workbox-build#full_generatesw_config). + +The default `workboxConfig` is as follows. Note that some of these options are configured automatically, e.g. `globPatterns`. If you're not sure about what all of these options mean, it's best to leave them as-is - otherwise, you may end up causing errors on your site, causing old files to be remain cached, or even breaking offline support. ```javascript const options = { importWorkboxFrom: `local`, globDirectory: rootDir, globPatterns, - modifyUrlPrefix: { + modifyURLPrefix: { // If `pathPrefix` is configured by user, we should replace // the default prefix with `pathPrefix`. "/": `${pathPrefix}/`, @@ -40,23 +118,28 @@ const options = { cacheId: `gatsby-plugin-offline`, // Don't cache-bust JS or CSS files, and anything in the static directory, // since these files have unique URLs and their contents will never change - dontCacheBustUrlsMatching: /(\.js$|\.css$|static\/)/, + dontCacheBustURLsMatching: /(\.js$|\.css$|static\/)/, runtimeCaching: [ { // Use cacheFirst since these don't need to be revalidated (same RegExp // and same reason as above) urlPattern: /(\.js$|\.css$|static\/)/, - handler: `cacheFirst`, + handler: `CacheFirst`, + }, + { + // page-data.json files are not content hashed + urlPattern: /^https?:.*\page-data\/.*\/page-data\.json/, + handler: `NetworkFirst`, }, { // Add runtime caching of various other page resources urlPattern: /^https?:.*\.(png|jpg|jpeg|webp|svg|gif|tiff|js|woff|woff2|json|css)$/, - handler: `staleWhileRevalidate`, + handler: `StaleWhileRevalidate`, }, { // Google Fonts CSS (doesn't end in .css so we need to specify it) urlPattern: /^https?:\/\/fonts\.googleapis\.com\/css/, - handler: `staleWhileRevalidate`, + handler: `StaleWhileRevalidate`, }, ], skipWaiting: true, diff --git a/packages/gatsby-plugin-offline/package.json b/packages/gatsby-plugin-offline/package.json index 33e1c4b15cb00..4d79e8b5f783f 100644 --- a/packages/gatsby-plugin-offline/package.json +++ b/packages/gatsby-plugin-offline/package.json @@ -12,7 +12,7 @@ "idb-keyval": "^3.2.0", "lodash": "^4.17.15", "slash": "^3.0.0", - "workbox-build": "^3.6.3" + "workbox-build": "^4.3.1" }, "devDependencies": { "@babel/cli": "^7.5.5", diff --git a/packages/gatsby-plugin-offline/src/__tests__/fixtures/custom-sw-code.js b/packages/gatsby-plugin-offline/src/__tests__/fixtures/custom-sw-code.js new file mode 100644 index 0000000000000..3fa5eec6a3d5b --- /dev/null +++ b/packages/gatsby-plugin-offline/src/__tests__/fixtures/custom-sw-code.js @@ -0,0 +1 @@ +console.log(`Hello, world!`) diff --git a/packages/gatsby-plugin-offline/src/__tests__/gatsby-node.js b/packages/gatsby-plugin-offline/src/__tests__/gatsby-node.js new file mode 100644 index 0000000000000..263722001f4e6 --- /dev/null +++ b/packages/gatsby-plugin-offline/src/__tests__/gatsby-node.js @@ -0,0 +1,59 @@ +const { onPostBuild } = require(`../gatsby-node`) +const fs = require(`fs`) + +jest.mock(`fs`) +jest.mock(`../get-resources-from-html`, () => () => []) + +let swText = `` + +jest.mock(`workbox-build`, () => { + return { + generateSW() { + return Promise.resolve({ count: 1, size: 1, warnings: [] }) + }, + } +}) + +describe(`onPostBuild`, () => { + const componentChunkName = `chunkName` + const chunks = [`chunk1`, `chunk2`] + + // Mock webpack.stats.json + const stats = { + assetsByChunkName: { + [componentChunkName]: chunks, + }, + } + + // Mock out filesystem functions + fs.readFileSync.mockImplementation(file => { + if (file === `${process.cwd()}/public/webpack.stats.json`) { + return JSON.stringify(stats) + } else if (file === `public/sw.js`) { + return swText + } else if (file.match(/\/sw-append\.js/)) { + return `` + } else { + return jest.requireActual(`fs`).readFileSync(file) + } + }) + + fs.appendFileSync.mockImplementation((file, text) => { + swText += text + }) + + fs.createReadStream.mockImplementation(() => { + return { pipe() {} } + }) + + fs.createWriteStream.mockImplementation(() => {}) + + it(`appends to sw.js`, async () => { + await onPostBuild( + { pathPrefix: `` }, + { appendScript: `${__dirname}/fixtures/custom-sw-code.js` } + ) + + expect(swText).toContain(`console.log(\`Hello, world!\`)`) + }) +}) diff --git a/packages/gatsby-plugin-offline/src/gatsby-node.js b/packages/gatsby-plugin-offline/src/gatsby-node.js index e412525029acc..25ebf0d23b8d9 100644 --- a/packages/gatsby-plugin-offline/src/gatsby-node.js +++ b/packages/gatsby-plugin-offline/src/gatsby-node.js @@ -70,7 +70,7 @@ exports.onPostBuild = (args, pluginOptions) => { importWorkboxFrom: `local`, globDirectory: rootDir, globPatterns, - modifyUrlPrefix: { + modifyURLPrefix: { // If `pathPrefix` is configured by user, we should replace // the default prefix with `pathPrefix`. "/": `${pathPrefix}/`, @@ -78,39 +78,38 @@ exports.onPostBuild = (args, pluginOptions) => { cacheId: `gatsby-plugin-offline`, // Don't cache-bust JS or CSS files, and anything in the static directory, // since these files have unique URLs and their contents will never change - dontCacheBustUrlsMatching: /(\.js$|\.css$|static\/)/, + dontCacheBustURLsMatching: /(\.js$|\.css$|static\/)/, runtimeCaching: [ { // Use cacheFirst since these don't need to be revalidated (same RegExp // and same reason as above) urlPattern: /(\.js$|\.css$|static\/)/, - handler: `cacheFirst`, + handler: `CacheFirst`, }, { // page-data.json files are not content hashed urlPattern: /^https?:.*\page-data\/.*\/page-data\.json/, - handler: `networkFirst`, + handler: `NetworkFirst`, }, { // Add runtime caching of various other page resources urlPattern: /^https?:.*\.(png|jpg|jpeg|webp|svg|gif|tiff|js|woff|woff2|json|css)$/, - handler: `staleWhileRevalidate`, + handler: `StaleWhileRevalidate`, }, { // Google Fonts CSS (doesn't end in .css so we need to specify it) urlPattern: /^https?:\/\/fonts\.googleapis\.com\/css/, - handler: `staleWhileRevalidate`, + handler: `StaleWhileRevalidate`, }, ], skipWaiting: true, clientsClaim: true, } - // pluginOptions.plugins is assigned automatically when the user hasn't - // specified custom options - Workbox throws an error with unsupported - // parameters, so delete it. - delete pluginOptions.plugins - const combinedOptions = _.defaults(pluginOptions, options) + const combinedOptions = { + ...options, + ...pluginOptions.workboxConfig, + } const idbKeyvalFile = `idb-keyval-iife.min.js` const idbKeyvalSource = require.resolve(`idb-keyval/dist/${idbKeyvalFile}`) @@ -129,6 +128,17 @@ exports.onPostBuild = (args, pluginOptions) => { .replace(/%appFile%/g, appFile) fs.appendFileSync(`public/sw.js`, `\n` + swAppend) + + if (pluginOptions.appendScript) { + let userAppend + try { + userAppend = fs.readFileSync(pluginOptions.appendScript, `utf8`) + } catch (e) { + throw new Error(`Couldn't find the specified offline inject script`) + } + fs.appendFileSync(`public/sw.js`, `\n` + userAppend) + } + console.log( `Generated ${swDest}, which will precache ${count} files, totaling ${size} bytes.` ) diff --git a/packages/gatsby-plugin-offline/src/sw-append.js b/packages/gatsby-plugin-offline/src/sw-append.js index 650737713949a..8f4a25f649134 100644 --- a/packages/gatsby-plugin-offline/src/sw-append.js +++ b/packages/gatsby-plugin-offline/src/sw-append.js @@ -25,7 +25,8 @@ const navigationRoute = new NavigationRoute(async ({ event }) => { } const offlineShell = `%pathPrefix%/offline-plugin-app-shell-fallback/index.html` - return await caches.match(offlineShell) + const offlineShellWithKey = workbox.precaching.getCacheKeyForURL(offlineShell) + return await caches.match(offlineShellWithKey) }) workbox.routing.registerRoute(navigationRoute) diff --git a/yarn.lock b/yarn.lock index 0cbf0b1551272..496a475aea9b2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -944,7 +944,7 @@ pirates "^4.0.0" source-map-support "^0.5.9" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.3", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.3", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ== @@ -1168,7 +1168,7 @@ resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.2.1.tgz#924af04cbb22e17359c620d2a9c946e63f58eb77" integrity sha512-JPiBy+oSmsq3St7XlipfN5pNA6bDJ1kpa73PrK/zR29CVClDVqy04AanM/M/qx5bSF+I61DdCfAvRrujau+zRg== -"@hapi/joi@^15.1.1": +"@hapi/joi@^15.0.0", "@hapi/joi@^15.1.1": version "15.1.1" resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== @@ -5271,7 +5271,7 @@ common-path-prefix@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-1.0.0.tgz#cd52f6f0712e0baab97d6f9732874f22f47752c0" -common-tags@^1.4.0, common-tags@^1.8.0: +common-tags@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" @@ -8532,6 +8532,11 @@ get-own-enumerable-property-symbols@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz#5c4ad87f2834c4b9b4e84549dc1e0650fb38c24b" +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz#b877b49a5c16aefac3655f2ed2ea5b684df8d203" + integrity sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg== + get-pkg-repo@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" @@ -9574,10 +9579,6 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoek@4.x.x: - version "4.2.1" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" - hoek@6.x.x: version "6.1.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.3.tgz#73b7d33952e01fe27a38b0457294b79dd8da242c" @@ -11416,14 +11417,6 @@ jimp@^0.6.4: "@jimp/types" "^0.6.4" core-js "^2.5.7" -joi@^11.1.1: - version "11.4.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-11.4.0.tgz#f674897537b625e9ac3d0b7e1604c828ad913ccb" - dependencies: - hoek "4.x.x" - isemail "3.x.x" - topo "2.x.x" - joi@^14.3.1: version "14.3.1" resolved "https://registry.yarnpkg.com/joi/-/joi-14.3.1.tgz#164a262ec0b855466e0c35eea2a885ae8b6c703c" @@ -17856,6 +17849,15 @@ stringify-object@^3.2.2: is-obj "^1.0.1" is-regexp "^1.0.0" +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + strip-ansi@3.0.1, strip-ansi@^3, strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -18510,12 +18512,6 @@ toml@^2.3.2, toml@^2.3.6: resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.6.tgz#25b0866483a9722474895559088b436fd11f861b" integrity sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ== -topo@2.x.x: - version "2.0.2" - resolved "https://registry.yarnpkg.com/topo/-/topo-2.0.2.tgz#cd5615752539057c0dc0491a621c3bc6fbe1d182" - dependencies: - hoek "4.x.x" - topo@3.x.x: version "3.0.3" resolved "https://registry.yarnpkg.com/topo/-/topo-3.0.3.tgz#d5a67fb2e69307ebeeb08402ec2a2a6f5f7ad95c" @@ -19850,109 +19846,131 @@ wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" -workbox-background-sync@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-3.6.3.tgz#6609a0fac9eda336a7c52e6aa227ba2ae532ad94" +workbox-background-sync@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950" + integrity sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg== dependencies: - workbox-core "^3.6.3" + workbox-core "^4.3.1" -workbox-broadcast-cache-update@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-broadcast-cache-update/-/workbox-broadcast-cache-update-3.6.3.tgz#3f5dff22ada8c93e397fb38c1dc100606a7b92da" +workbox-broadcast-update@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz#e2c0280b149e3a504983b757606ad041f332c35b" + integrity sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA== dependencies: - workbox-core "^3.6.3" + workbox-core "^4.3.1" -workbox-build@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-3.6.3.tgz#77110f9f52dc5d82fa6c1c384c6f5e2225adcbd8" +workbox-build@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-4.3.1.tgz#414f70fb4d6de47f6538608b80ec52412d233e64" + integrity sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw== dependencies: - babel-runtime "^6.26.0" - common-tags "^1.4.0" + "@babel/runtime" "^7.3.4" + "@hapi/joi" "^15.0.0" + common-tags "^1.8.0" fs-extra "^4.0.2" - glob "^7.1.2" - joi "^11.1.1" + glob "^7.1.3" lodash.template "^4.4.0" - pretty-bytes "^4.0.2" - stringify-object "^3.2.2" + pretty-bytes "^5.1.0" + stringify-object "^3.3.0" strip-comments "^1.0.2" - workbox-background-sync "^3.6.3" - workbox-broadcast-cache-update "^3.6.3" - workbox-cache-expiration "^3.6.3" - workbox-cacheable-response "^3.6.3" - workbox-core "^3.6.3" - workbox-google-analytics "^3.6.3" - workbox-navigation-preload "^3.6.3" - workbox-precaching "^3.6.3" - workbox-range-requests "^3.6.3" - workbox-routing "^3.6.3" - workbox-strategies "^3.6.3" - workbox-streams "^3.6.3" - workbox-sw "^3.6.3" - -workbox-cache-expiration@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-cache-expiration/-/workbox-cache-expiration-3.6.3.tgz#4819697254a72098a13f94b594325a28a1e90372" + workbox-background-sync "^4.3.1" + workbox-broadcast-update "^4.3.1" + workbox-cacheable-response "^4.3.1" + workbox-core "^4.3.1" + workbox-expiration "^4.3.1" + workbox-google-analytics "^4.3.1" + workbox-navigation-preload "^4.3.1" + workbox-precaching "^4.3.1" + workbox-range-requests "^4.3.1" + workbox-routing "^4.3.1" + workbox-strategies "^4.3.1" + workbox-streams "^4.3.1" + workbox-sw "^4.3.1" + workbox-window "^4.3.1" + +workbox-cacheable-response@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz#f53e079179c095a3f19e5313b284975c91428c91" + integrity sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw== dependencies: - workbox-core "^3.6.3" + workbox-core "^4.3.1" -workbox-cacheable-response@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-3.6.3.tgz#869f1a68fce9063f6869ddbf7fa0a2e0a868b3aa" - dependencies: - workbox-core "^3.6.3" +workbox-core@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-4.3.1.tgz#005d2c6a06a171437afd6ca2904a5727ecd73be6" + integrity sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg== -workbox-core@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-3.6.3.tgz#69abba70a4f3f2a5c059295a6f3b7c62bd00e15c" +workbox-expiration@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-4.3.1.tgz#d790433562029e56837f341d7f553c4a78ebe921" + integrity sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw== + dependencies: + workbox-core "^4.3.1" -workbox-google-analytics@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-3.6.3.tgz#99df2a3d70d6e91961e18a6752bac12e91fbf727" +workbox-google-analytics@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz#9eda0183b103890b5c256e6f4ea15a1f1548519a" + integrity sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg== dependencies: - workbox-background-sync "^3.6.3" - workbox-core "^3.6.3" - workbox-routing "^3.6.3" - workbox-strategies "^3.6.3" + workbox-background-sync "^4.3.1" + workbox-core "^4.3.1" + workbox-routing "^4.3.1" + workbox-strategies "^4.3.1" -workbox-navigation-preload@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-3.6.3.tgz#a2c34eb7c17e7485b795125091215f757b3c4964" +workbox-navigation-preload@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz#29c8e4db5843803b34cd96dc155f9ebd9afa453d" + integrity sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw== dependencies: - workbox-core "^3.6.3" + workbox-core "^4.3.1" -workbox-precaching@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-3.6.3.tgz#5341515e9d5872c58ede026a31e19bafafa4e1c1" +workbox-precaching@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-4.3.1.tgz#9fc45ed122d94bbe1f0ea9584ff5940960771cba" + integrity sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ== dependencies: - workbox-core "^3.6.3" + workbox-core "^4.3.1" -workbox-range-requests@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-3.6.3.tgz#3cc21cba31f2dd8c43c52a196bcc8f6cdbcde803" +workbox-range-requests@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz#f8a470188922145cbf0c09a9a2d5e35645244e74" + integrity sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA== dependencies: - workbox-core "^3.6.3" + workbox-core "^4.3.1" -workbox-routing@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-3.6.3.tgz#659cd8f9274986cfa98fda0d050de6422075acf7" +workbox-routing@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-4.3.1.tgz#a675841af623e0bb0c67ce4ed8e724ac0bed0cda" + integrity sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g== dependencies: - workbox-core "^3.6.3" + workbox-core "^4.3.1" -workbox-strategies@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-3.6.3.tgz#11a0dc249a7bc23d3465ec1322d28fa6643d64a0" +workbox-strategies@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-4.3.1.tgz#d2be03c4ef214c115e1ab29c9c759c9fe3e9e646" + integrity sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw== dependencies: - workbox-core "^3.6.3" + workbox-core "^4.3.1" -workbox-streams@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-3.6.3.tgz#beaea5d5b230239836cc327b07d471aa6101955a" +workbox-streams@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-4.3.1.tgz#0b57da70e982572de09c8742dd0cb40a6b7c2cc3" + integrity sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA== dependencies: - workbox-core "^3.6.3" + workbox-core "^4.3.1" + +workbox-sw@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-4.3.1.tgz#df69e395c479ef4d14499372bcd84c0f5e246164" + integrity sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w== -workbox-sw@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-3.6.3.tgz#278ea4c1831b92bbe2d420da8399176c4b2789ff" +workbox-window@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-4.3.1.tgz#ee6051bf10f06afa5483c9b8dfa0531994ede0f3" + integrity sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg== + dependencies: + workbox-core "^4.3.1" worker-farm@^1.7.0: version "1.7.0"