jekyll-pwa-workbox 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/lib/jekyll-pwa-workbox.rb +125 -125
  3. data/lib/vendor/workbox-v4.1.1/workbox-background-sync.dev.js +729 -0
  4. data/lib/vendor/workbox-v4.1.1/workbox-background-sync.dev.js.map +1 -0
  5. data/lib/vendor/workbox-v4.1.1/workbox-background-sync.prod.js +2 -0
  6. data/lib/vendor/workbox-v4.1.1/workbox-background-sync.prod.js.map +1 -0
  7. data/lib/vendor/workbox-v4.1.1/workbox-broadcast-update.dev.js +482 -0
  8. data/lib/vendor/workbox-v4.1.1/workbox-broadcast-update.dev.js.map +1 -0
  9. data/lib/vendor/workbox-v4.1.1/workbox-broadcast-update.prod.js +2 -0
  10. data/lib/vendor/workbox-v4.1.1/workbox-broadcast-update.prod.js.map +1 -0
  11. data/lib/vendor/{workbox-v3.6.3 → workbox-v4.1.1}/workbox-cacheable-response.dev.js +34 -70
  12. data/lib/vendor/workbox-v4.1.1/workbox-cacheable-response.dev.js.map +1 -0
  13. data/lib/vendor/workbox-v4.1.1/workbox-cacheable-response.prod.js +2 -0
  14. data/lib/vendor/workbox-v4.1.1/workbox-cacheable-response.prod.js.map +1 -0
  15. data/lib/vendor/workbox-v4.1.1/workbox-core.dev.js +1584 -0
  16. data/lib/vendor/workbox-v4.1.1/workbox-core.dev.js.map +1 -0
  17. data/lib/vendor/workbox-v4.1.1/workbox-core.prod.js +2 -0
  18. data/lib/vendor/workbox-v4.1.1/workbox-core.prod.js.map +1 -0
  19. data/lib/vendor/workbox-v4.1.1/workbox-expiration.dev.js +633 -0
  20. data/lib/vendor/workbox-v4.1.1/workbox-expiration.dev.js.map +1 -0
  21. data/lib/vendor/workbox-v4.1.1/workbox-expiration.prod.js +2 -0
  22. data/lib/vendor/workbox-v4.1.1/workbox-expiration.prod.js.map +1 -0
  23. data/lib/vendor/workbox-v4.1.1/workbox-navigation-preload.dev.js +110 -0
  24. data/lib/vendor/workbox-v4.1.1/workbox-navigation-preload.dev.js.map +1 -0
  25. data/lib/vendor/workbox-v4.1.1/workbox-navigation-preload.prod.js +2 -0
  26. data/lib/vendor/workbox-v4.1.1/workbox-navigation-preload.prod.js.map +1 -0
  27. data/lib/vendor/workbox-v4.1.1/workbox-offline-ga.dev.js +243 -0
  28. data/lib/vendor/workbox-v4.1.1/workbox-offline-ga.dev.js.map +1 -0
  29. data/lib/vendor/workbox-v4.1.1/workbox-offline-ga.prod.js +2 -0
  30. data/lib/vendor/workbox-v4.1.1/workbox-offline-ga.prod.js.map +1 -0
  31. data/lib/vendor/workbox-v4.1.1/workbox-precaching.dev.js +942 -0
  32. data/lib/vendor/workbox-v4.1.1/workbox-precaching.dev.js.map +1 -0
  33. data/lib/vendor/workbox-v4.1.1/workbox-precaching.prod.js +2 -0
  34. data/lib/vendor/workbox-v4.1.1/workbox-precaching.prod.js.map +1 -0
  35. data/lib/vendor/workbox-v4.1.1/workbox-range-requests.dev.js +268 -0
  36. data/lib/vendor/workbox-v4.1.1/workbox-range-requests.dev.js.map +1 -0
  37. data/lib/vendor/workbox-v4.1.1/workbox-range-requests.prod.js +2 -0
  38. data/lib/vendor/workbox-v4.1.1/workbox-range-requests.prod.js.map +1 -0
  39. data/lib/vendor/workbox-v4.1.1/workbox-routing.dev.js +1020 -0
  40. data/lib/vendor/workbox-v4.1.1/workbox-routing.dev.js.map +1 -0
  41. data/lib/vendor/workbox-v4.1.1/workbox-routing.prod.js +2 -0
  42. data/lib/vendor/workbox-v4.1.1/workbox-routing.prod.js.map +1 -0
  43. data/lib/vendor/workbox-v4.1.1/workbox-strategies.dev.js +1138 -0
  44. data/lib/vendor/workbox-v4.1.1/workbox-strategies.dev.js.map +1 -0
  45. data/lib/vendor/workbox-v4.1.1/workbox-strategies.prod.js +2 -0
  46. data/lib/vendor/workbox-v4.1.1/workbox-strategies.prod.js.map +1 -0
  47. data/lib/vendor/{workbox-v3.6.3 → workbox-v4.1.1}/workbox-streams.dev.js +108 -151
  48. data/lib/vendor/workbox-v4.1.1/workbox-streams.dev.js.map +1 -0
  49. data/lib/vendor/workbox-v4.1.1/workbox-streams.prod.js +2 -0
  50. data/lib/vendor/workbox-v4.1.1/workbox-streams.prod.js.map +1 -0
  51. data/lib/vendor/workbox-v4.1.1/workbox-sw.js +2 -0
  52. data/lib/vendor/workbox-v4.1.1/workbox-sw.js.map +1 -0
  53. data/lib/vendor/workbox-v4.1.1/workbox-window.dev.es5.mjs +879 -0
  54. data/lib/vendor/workbox-v4.1.1/workbox-window.dev.es5.mjs.map +1 -0
  55. data/lib/vendor/workbox-v4.1.1/workbox-window.dev.mjs +745 -0
  56. data/lib/vendor/workbox-v4.1.1/workbox-window.dev.mjs.map +1 -0
  57. data/lib/vendor/workbox-v4.1.1/workbox-window.dev.umd.js +890 -0
  58. data/lib/vendor/workbox-v4.1.1/workbox-window.dev.umd.js.map +1 -0
  59. data/lib/vendor/workbox-v4.1.1/workbox-window.prod.es5.mjs +2 -0
  60. data/lib/vendor/workbox-v4.1.1/workbox-window.prod.es5.mjs.map +1 -0
  61. data/lib/vendor/workbox-v4.1.1/workbox-window.prod.mjs +2 -0
  62. data/lib/vendor/workbox-v4.1.1/workbox-window.prod.mjs.map +1 -0
  63. data/lib/vendor/workbox-v4.1.1/workbox-window.prod.umd.js +2 -0
  64. data/lib/vendor/workbox-v4.1.1/workbox-window.prod.umd.js.map +1 -0
  65. metadata +70 -58
  66. data/lib/vendor/workbox-v3.6.3/workbox-background-sync.dev.js +0 -593
  67. data/lib/vendor/workbox-v3.6.3/workbox-background-sync.dev.js.map +0 -1
  68. data/lib/vendor/workbox-v3.6.3/workbox-background-sync.prod.js +0 -3
  69. data/lib/vendor/workbox-v3.6.3/workbox-background-sync.prod.js.map +0 -1
  70. data/lib/vendor/workbox-v3.6.3/workbox-broadcast-cache-update.dev.js +0 -395
  71. data/lib/vendor/workbox-v3.6.3/workbox-broadcast-cache-update.dev.js.map +0 -1
  72. data/lib/vendor/workbox-v3.6.3/workbox-broadcast-cache-update.prod.js +0 -3
  73. data/lib/vendor/workbox-v3.6.3/workbox-broadcast-cache-update.prod.js.map +0 -1
  74. data/lib/vendor/workbox-v3.6.3/workbox-cache-expiration.dev.js +0 -740
  75. data/lib/vendor/workbox-v3.6.3/workbox-cache-expiration.dev.js.map +0 -1
  76. data/lib/vendor/workbox-v3.6.3/workbox-cache-expiration.prod.js +0 -3
  77. data/lib/vendor/workbox-v3.6.3/workbox-cache-expiration.prod.js.map +0 -1
  78. data/lib/vendor/workbox-v3.6.3/workbox-cacheable-response.dev.js.map +0 -1
  79. data/lib/vendor/workbox-v3.6.3/workbox-cacheable-response.prod.js +0 -3
  80. data/lib/vendor/workbox-v3.6.3/workbox-cacheable-response.prod.js.map +0 -1
  81. data/lib/vendor/workbox-v3.6.3/workbox-core.dev.js +0 -1736
  82. data/lib/vendor/workbox-v3.6.3/workbox-core.dev.js.map +0 -1
  83. data/lib/vendor/workbox-v3.6.3/workbox-core.prod.js +0 -3
  84. data/lib/vendor/workbox-v3.6.3/workbox-core.prod.js.map +0 -1
  85. data/lib/vendor/workbox-v3.6.3/workbox-google-analytics.dev.js +0 -255
  86. data/lib/vendor/workbox-v3.6.3/workbox-google-analytics.dev.js.map +0 -1
  87. data/lib/vendor/workbox-v3.6.3/workbox-google-analytics.prod.js +0 -3
  88. data/lib/vendor/workbox-v3.6.3/workbox-google-analytics.prod.js.map +0 -1
  89. data/lib/vendor/workbox-v3.6.3/workbox-navigation-preload.dev.js +0 -159
  90. data/lib/vendor/workbox-v3.6.3/workbox-navigation-preload.dev.js.map +0 -1
  91. data/lib/vendor/workbox-v3.6.3/workbox-navigation-preload.prod.js +0 -3
  92. data/lib/vendor/workbox-v3.6.3/workbox-navigation-preload.prod.js.map +0 -1
  93. data/lib/vendor/workbox-v3.6.3/workbox-precaching.dev.js +0 -1171
  94. data/lib/vendor/workbox-v3.6.3/workbox-precaching.dev.js.map +0 -1
  95. data/lib/vendor/workbox-v3.6.3/workbox-precaching.prod.js +0 -3
  96. data/lib/vendor/workbox-v3.6.3/workbox-precaching.prod.js.map +0 -1
  97. data/lib/vendor/workbox-v3.6.3/workbox-range-requests.dev.js +0 -299
  98. data/lib/vendor/workbox-v3.6.3/workbox-range-requests.dev.js.map +0 -1
  99. data/lib/vendor/workbox-v3.6.3/workbox-range-requests.prod.js +0 -3
  100. data/lib/vendor/workbox-v3.6.3/workbox-range-requests.prod.js.map +0 -1
  101. data/lib/vendor/workbox-v3.6.3/workbox-routing.dev.js +0 -863
  102. data/lib/vendor/workbox-v3.6.3/workbox-routing.dev.js.map +0 -1
  103. data/lib/vendor/workbox-v3.6.3/workbox-routing.prod.js +0 -3
  104. data/lib/vendor/workbox-v3.6.3/workbox-routing.prod.js.map +0 -1
  105. data/lib/vendor/workbox-v3.6.3/workbox-strategies.dev.js +0 -1172
  106. data/lib/vendor/workbox-v3.6.3/workbox-strategies.dev.js.map +0 -1
  107. data/lib/vendor/workbox-v3.6.3/workbox-strategies.prod.js +0 -3
  108. data/lib/vendor/workbox-v3.6.3/workbox-strategies.prod.js.map +0 -1
  109. data/lib/vendor/workbox-v3.6.3/workbox-streams.dev.js.map +0 -1
  110. data/lib/vendor/workbox-v3.6.3/workbox-streams.prod.js +0 -3
  111. data/lib/vendor/workbox-v3.6.3/workbox-streams.prod.js.map +0 -1
  112. data/lib/vendor/workbox-v3.6.3/workbox-sw.js +0 -3
  113. data/lib/vendor/workbox-v3.6.3/workbox-sw.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbox-broadcast-update.dev.js","sources":["../_version.mjs","../responsesAreSame.mjs","../utils/constants.mjs","../broadcastUpdate.mjs","../BroadcastCacheUpdate.mjs","../Plugin.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:broadcast-update:4.1.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport './_version.mjs';\n\n/**\n * Given two `Response's`, compares several header values to see if they are\n * the same or not.\n *\n * @param {Response} firstResponse\n * @param {Response} secondResponse\n * @param {Array<string>} headersToCheck\n * @return {boolean}\n *\n * @memberof workbox.broadcastUpdate\n * @private\n */\nconst responsesAreSame = (firstResponse, secondResponse, headersToCheck) => {\n if (process.env.NODE_ENV !== 'production') {\n if (!(firstResponse instanceof Response &&\n secondResponse instanceof Response)) {\n throw new WorkboxError('invalid-responses-are-same-args');\n }\n }\n\n const atLeastOneHeaderAvailable = headersToCheck.some((header) => {\n return firstResponse.headers.has(header) &&\n secondResponse.headers.has(header);\n });\n\n if (!atLeastOneHeaderAvailable) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to determine where the response has been updated ` +\n `because none of the headers that would be checked are present.`);\n logger.debug(`Attempting to compare the following: `,\n firstResponse, secondResponse, headersToCheck);\n }\n\n // Just return true, indicating the that responses are the same, since we\n // can't determine otherwise.\n return true;\n }\n\n return headersToCheck.every((header) => {\n const headerStateComparison = firstResponse.headers.has(header) ===\n secondResponse.headers.has(header);\n const headerValueComparison = firstResponse.headers.get(header) ===\n secondResponse.headers.get(header);\n\n return headerStateComparison && headerValueComparison;\n });\n};\n\nexport {responsesAreSame};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\nexport const CACHE_UPDATED_MESSAGE_TYPE = 'CACHE_UPDATED';\nexport const CACHE_UPDATED_MESSAGE_META = 'workbox-broadcast-update';\nexport const DEFAULT_BROADCAST_CHANNEL_NAME = 'workbox';\nexport const DEFAULT_DEFER_NOTIFICATION_TIMEOUT = 10000;\nexport const DEFAULT_HEADERS_TO_CHECK = [\n 'content-length',\n 'etag',\n 'last-modified',\n];\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {CACHE_UPDATED_MESSAGE_TYPE, CACHE_UPDATED_MESSAGE_META}\n from './utils/constants.mjs';\n\nimport './_version.mjs';\n\n/**\n * You would not normally call this method directly; it's called automatically\n * by an instance of the {@link BroadcastCacheUpdate} class. It's exposed here\n * for the benefit of developers who would rather not use the full\n * `BroadcastCacheUpdate` implementation.\n *\n * Calling this will dispatch a message on the provided\n * {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel}\n * to notify interested subscribers about a change to a cached resource.\n *\n * The message that's posted has a formation inspired by the\n * [Flux standard action](https://github.com/acdlite/flux-standard-action#introduction)\n * format like so:\n *\n * ```\n * {\n * type: 'CACHE_UPDATED',\n * meta: 'workbox-broadcast-update',\n * payload: {\n * cacheName: 'the-cache-name',\n * updatedURL: 'https://example.com/'\n * }\n * }\n * ```\n *\n * (Usage of [Flux](https://facebook.github.io/flux/) itself is not at\n * all required.)\n *\n * @param {Object} options\n * @param {string} options.cacheName The name of the cache in which the updated\n * `Response` was stored.\n * @param {string} options.url The URL associated with the updated `Response`.\n * @param {BroadcastChannel} [options.channel] The `BroadcastChannel` to use.\n * If no channel is set or the browser doesn't support the BroadcastChannel\n * api, then an attempt will be made to `postMessage` each window client.\n *\n * @memberof workbox.broadcastUpdate\n */\nconst broadcastUpdate = async ({channel, cacheName, url}) => {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-broadcast-update',\n className: '~',\n funcName: 'broadcastUpdate',\n paramName: 'cacheName',\n });\n assert.isType(url, 'string', {\n moduleName: 'workbox-broadcast-update',\n className: '~',\n funcName: 'broadcastUpdate',\n paramName: 'url',\n });\n }\n\n const data = {\n type: CACHE_UPDATED_MESSAGE_TYPE,\n meta: CACHE_UPDATED_MESSAGE_META,\n payload: {\n cacheName: cacheName,\n updatedURL: url,\n },\n };\n\n if (channel) {\n channel.postMessage(data);\n } else {\n const windows = await clients.matchAll({type: 'window'});\n for (const win of windows) {\n win.postMessage(data);\n }\n }\n};\n\nexport {broadcastUpdate};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {Deferred} from 'workbox-core/_private/Deferred.mjs';\nimport {responsesAreSame} from './responsesAreSame.mjs';\nimport {broadcastUpdate} from './broadcastUpdate.mjs';\n\nimport {DEFAULT_HEADERS_TO_CHECK, DEFAULT_BROADCAST_CHANNEL_NAME,\n DEFAULT_DEFER_NOTIFICATION_TIMEOUT} from './utils/constants.mjs';\n\nimport './_version.mjs';\n\n/**\n * Uses the [Broadcast Channel API]{@link https://developers.google.com/web/updates/2016/09/broadcastchannel}\n * to notify interested parties when a cached response has been updated.\n * In browsers that do not support the Broadcast Channel API, the instance\n * falls back to sending the update via `postMessage()` to all window clients.\n *\n * For efficiency's sake, the underlying response bodies are not compared;\n * only specific response headers are checked.\n *\n * @memberof workbox.broadcastUpdate\n */\nclass BroadcastCacheUpdate {\n /**\n * Construct a BroadcastCacheUpdate instance with a specific `channelName` to\n * broadcast messages on\n *\n * @param {Object} options\n * @param {Array<string>}\n * [options.headersToCheck=['content-length', 'etag', 'last-modified']]\n * A list of headers that will be used to determine whether the responses\n * differ.\n * @param {string} [options.channelName='workbox'] The name that will be used\n *. when creating the `BroadcastChannel`, which defaults to 'workbox' (the\n * channel name used by the `workbox-window` package).\n * @param {string} [options.deferNoticationTimeout=10000] The amount of time\n * to wait for a ready message from the window on navigation requests\n * before sending the update.\n */\n constructor({headersToCheck, channelName, deferNoticationTimeout} = {}) {\n this._headersToCheck = headersToCheck || DEFAULT_HEADERS_TO_CHECK;\n this._channelName = channelName || DEFAULT_BROADCAST_CHANNEL_NAME;\n this._deferNoticationTimeout =\n deferNoticationTimeout || DEFAULT_DEFER_NOTIFICATION_TIMEOUT;\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(this._channelName, 'string', {\n moduleName: 'workbox-broadcast-update',\n className: 'BroadcastCacheUpdate',\n funcName: 'constructor',\n paramName: 'channelName',\n });\n assert.isArray(this._headersToCheck, {\n moduleName: 'workbox-broadcast-update',\n className: 'BroadcastCacheUpdate',\n funcName: 'constructor',\n paramName: 'headersToCheck',\n });\n }\n\n this._initWindowReadyDeferreds();\n }\n\n /**\n * Compare two [Responses](https://developer.mozilla.org/en-US/docs/Web/API/Response)\n * and send a message via the\n * {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel API}\n * if they differ.\n *\n * Neither of the Responses can be {@link http://stackoverflow.com/questions/39109789|opaque}.\n *\n * @param {Object} options\n * @param {Response} options.oldResponse Cached response to compare.\n * @param {Response} options.newResponse Possibly updated response to compare.\n * @param {string} options.url The URL of the request.\n * @param {string} options.cacheName Name of the cache the responses belong\n * to. This is included in the broadcast message.\n * @param {Event} [options.event] event An optional event that triggered\n * this possible cache update.\n * @return {Promise} Resolves once the update is sent.\n */\n notifyIfUpdated({oldResponse, newResponse, url, cacheName, event}) {\n if (!responsesAreSame(oldResponse, newResponse, this._headersToCheck)) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Newer response found (and cached) for:`, url);\n }\n\n const sendUpdate = async () => {\n // In the case of a navigation request, the requesting page will likely\n // not have loaded its JavaScript in time to recevied the update\n // notification, so we defer it until ready (or we timeout waiting).\n if (event && event.request && event.request.mode === 'navigate') {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Original request was a navigation request, ` +\n `waiting for a ready message from the window`, event.request);\n }\n await this._windowReadyOrTimeout(event);\n }\n await broadcastUpdate({channel: this._getChannel(), cacheName, url});\n };\n\n // Send the update and ensure the SW stays alive until it's sent.\n const done = sendUpdate();\n\n if (event) {\n try {\n event.waitUntil(done);\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to ensure service worker stays alive ` +\n `when broadcasting cache update for ` +\n `${getFriendlyURL(event.request.url)}'.`);\n }\n }\n }\n return done;\n }\n }\n\n /**\n * @return {BroadcastChannel|undefined} The BroadcastChannel instance used for\n * broadcasting updates, or undefined if the browser doesn't support the\n * Broadcast Channel API.\n *\n * @private\n */\n _getChannel() {\n if (('BroadcastChannel' in self) && !this._channel) {\n this._channel = new BroadcastChannel(this._channelName);\n }\n return this._channel;\n }\n\n /**\n * Waits for a message from the window indicating that it's capable of\n * receiving broadcasts. By default, this will only wait for the amount of\n * time specified via the `deferNoticationTimeout` option.\n *\n * @param {Event} event The navigation fetch event.\n * @return {Promise}\n * @private\n */\n _windowReadyOrTimeout(event) {\n if (!this._navigationEventsDeferreds.has(event)) {\n const deferred = new Deferred();\n\n // Set the deferred on the `_navigationEventsDeferreds` map so it will\n // be resolved when the next ready message event comes.\n this._navigationEventsDeferreds.set(event, deferred);\n\n // But don't wait too long for the message since it may never come.\n const timeout = setTimeout(() => {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Timed out after ${this._deferNoticationTimeout}` +\n `ms waiting for message from window`);\n }\n deferred.resolve();\n }, this._deferNoticationTimeout);\n\n // Ensure the timeout is cleared if the deferred promise is resolved.\n deferred.promise.then(() => clearTimeout(timeout));\n }\n return this._navigationEventsDeferreds.get(event).promise;\n }\n\n /**\n * Creates a mapping between navigation fetch events and deferreds, and adds\n * a listener for message events from the window. When message events arrive,\n * all deferreds in the mapping are resolved.\n *\n * Note: it would be easier if we could only resolve the deferred of\n * navigation fetch event whose client ID matched the source ID of the\n * message event, but currently client IDs are not exposed on navigation\n * fetch events: https://www.chromestatus.com/feature/4846038800138240\n */\n _initWindowReadyDeferreds() {\n // A mapping between navigation events and their deferreds.\n this._navigationEventsDeferreds = new Map();\n\n // The message listener needs to be added in the initial run of the\n // service worker, but since we don't actually need to be listening for\n // messages until the cache updates, we only invoke the callback if set.\n self.addEventListener('message', (event) => {\n if (event.data.type === 'WINDOW_READY' &&\n event.data.meta === 'workbox-window' &&\n this._navigationEventsDeferreds.size > 0) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Received WINDOW_READY event: `, event);\n }\n // Resolve any pending deferreds.\n for (const deferred of this._navigationEventsDeferreds.values()) {\n deferred.resolve();\n }\n this._navigationEventsDeferreds.clear();\n }\n });\n }\n}\n\nexport {BroadcastCacheUpdate};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {BroadcastCacheUpdate} from './BroadcastCacheUpdate.mjs';\nimport './_version.mjs';\n\n/**\n * This plugin will automatically broadcast a message whenever a cached response\n * is updated.\n *\n * @memberof workbox.broadcastUpdate\n */\nclass Plugin {\n /**\n * Construct a BroadcastCacheUpdate instance with the passed options and\n * calls its `notifyIfUpdated()` method whenever the plugin's\n * `cacheDidUpdate` callback is invoked.\n *\n * @param {Object} options\n * @param {Array<string>}\n * [options.headersToCheck=['content-length', 'etag', 'last-modified']]\n * A list of headers that will be used to determine whether the responses\n * differ.\n * @param {string} [options.channelName='workbox'] The name that will be used\n *. when creating the `BroadcastChannel`, which defaults to 'workbox' (the\n * channel name used by the `workbox-window` package).\n * @param {string} [options.deferNoticationTimeout=10000] The amount of time\n * to wait for a ready message from the window on navigation requests\n * before sending the update.\n */\n constructor(options) {\n this._broadcastUpdate = new BroadcastCacheUpdate(options);\n }\n\n /**\n * A \"lifecycle\" callback that will be triggered automatically by the\n * `workbox-sw` and `workbox-runtime-caching` handlers when an entry is\n * added to a cache.\n *\n * @private\n * @param {Object} options The input object to this function.\n * @param {string} options.cacheName Name of the cache being updated.\n * @param {Response} [options.oldResponse] The previous cached value, if any.\n * @param {Response} options.newResponse The new value in the cache.\n * @param {Request} options.request The request that triggered the udpate.\n * @param {Request} [options.event] The event that triggered the update.\n */\n cacheDidUpdate({cacheName, oldResponse, newResponse, request, event}) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-broadcast-update',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'cacheName',\n });\n assert.isInstance(newResponse, Response, {\n moduleName: 'workbox-broadcast-update',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'newResponse',\n });\n assert.isInstance(request, Request, {\n moduleName: 'workbox-broadcast-update',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'request',\n });\n }\n\n if (!oldResponse) {\n // Without a two responses there is nothing to compare.\n return;\n }\n this._broadcastUpdate.notifyIfUpdated({\n cacheName,\n oldResponse,\n newResponse,\n event,\n url: request.url,\n });\n }\n}\n\nexport {Plugin};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {BroadcastCacheUpdate} from './BroadcastCacheUpdate.mjs';\nimport {Plugin} from './Plugin.mjs';\nimport {broadcastUpdate} from './broadcastUpdate.mjs';\nimport {responsesAreSame} from './responsesAreSame.mjs';\nimport './_version.mjs';\n\n\n/**\n * @namespace workbox.broadcastUpdate\n */\n\nexport {\n BroadcastCacheUpdate,\n Plugin,\n broadcastUpdate,\n responsesAreSame,\n};\n"],"names":["self","_","e","responsesAreSame","firstResponse","secondResponse","headersToCheck","Response","WorkboxError","atLeastOneHeaderAvailable","some","header","headers","has","logger","warn","debug","every","headerStateComparison","headerValueComparison","get","CACHE_UPDATED_MESSAGE_TYPE","CACHE_UPDATED_MESSAGE_META","DEFAULT_BROADCAST_CHANNEL_NAME","DEFAULT_DEFER_NOTIFICATION_TIMEOUT","DEFAULT_HEADERS_TO_CHECK","broadcastUpdate","channel","cacheName","url","assert","isType","moduleName","className","funcName","paramName","data","type","meta","payload","updatedURL","postMessage","windows","clients","matchAll","win","BroadcastCacheUpdate","constructor","channelName","deferNoticationTimeout","_headersToCheck","_channelName","_deferNoticationTimeout","isArray","_initWindowReadyDeferreds","notifyIfUpdated","oldResponse","newResponse","event","log","sendUpdate","request","mode","_windowReadyOrTimeout","_getChannel","done","waitUntil","error","getFriendlyURL","_channel","BroadcastChannel","_navigationEventsDeferreds","deferred","Deferred","set","timeout","setTimeout","resolve","promise","then","clearTimeout","Map","addEventListener","size","values","clear","Plugin","options","_broadcastUpdate","cacheDidUpdate","isInstance","Request"],"mappings":";;;;EAAA,IAAG;EAACA,EAAAA,IAAI,CAAC,gCAAD,CAAJ,IAAwCC,CAAC,EAAzC;EAA4C,CAAhD,CAAgD,OAAMC,CAAN,EAAQ;;ECAxD;;;;;;;AAQA,EAIA;;;;;;;;;;;;;AAYA,QAAMC,gBAAgB,GAAG,CAACC,aAAD,EAAgBC,cAAhB,EAAgCC,cAAhC,KAAmD;EAC1E,EAA2C;EACzC,QAAI,EAAEF,aAAa,YAAYG,QAAzB,IACJF,cAAc,YAAYE,QADxB,CAAJ,EACuC;EACrC,YAAM,IAAIC,6BAAJ,CAAiB,iCAAjB,CAAN;EACD;EACF;;EAED,QAAMC,yBAAyB,GAAGH,cAAc,CAACI,IAAf,CAAqBC,MAAD,IAAY;EAChE,WAAOP,aAAa,CAACQ,OAAd,CAAsBC,GAAtB,CAA0BF,MAA1B,KACLN,cAAc,CAACO,OAAf,CAAuBC,GAAvB,CAA2BF,MAA3B,CADF;EAED,GAHiC,CAAlC;;EAKA,MAAI,CAACF,yBAAL,EAAgC;EAC9B,IAA2C;EACzCK,MAAAA,iBAAM,CAACC,IAAP,CAAa,0DAAD,GACT,gEADH;EAEAD,MAAAA,iBAAM,CAACE,KAAP,CAAc,uCAAd,EACIZ,aADJ,EACmBC,cADnB,EACmCC,cADnC;EAED,KAN6B;EAS9B;;;EACA,WAAO,IAAP;EACD;;EAED,SAAOA,cAAc,CAACW,KAAf,CAAsBN,MAAD,IAAY;EACtC,UAAMO,qBAAqB,GAAGd,aAAa,CAACQ,OAAd,CAAsBC,GAAtB,CAA0BF,MAA1B,MAC5BN,cAAc,CAACO,OAAf,CAAuBC,GAAvB,CAA2BF,MAA3B,CADF;EAEA,UAAMQ,qBAAqB,GAAGf,aAAa,CAACQ,OAAd,CAAsBQ,GAAtB,CAA0BT,MAA1B,MAC5BN,cAAc,CAACO,OAAf,CAAuBQ,GAAvB,CAA2BT,MAA3B,CADF;EAGA,WAAOO,qBAAqB,IAAIC,qBAAhC;EACD,GAPM,CAAP;EAQD,CAlCD;;ECxBA;;;;;;;AAQA,EAEO,MAAME,0BAA0B,GAAG,eAAnC;AACP,EAAO,MAAMC,0BAA0B,GAAG,0BAAnC;AACP,EAAO,MAAMC,8BAA8B,GAAG,SAAvC;AACP,EAAO,MAAMC,kCAAkC,GAAG,KAA3C;AACP,EAAO,MAAMC,wBAAwB,GAAG,CACtC,gBADsC,EAEtC,MAFsC,EAGtC,eAHsC,CAAjC;;ECdP;;;;;;;AAQA,EAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA,QAAMC,eAAe,GAAG,OAAO;EAACC,EAAAA,OAAD;EAAUC,EAAAA,SAAV;EAAqBC,EAAAA;EAArB,CAAP,KAAqC;EAC3D,EAA2C;EACzCC,IAAAA,iBAAM,CAACC,MAAP,CAAcH,SAAd,EAAyB,QAAzB,EAAmC;EACjCI,MAAAA,UAAU,EAAE,0BADqB;EAEjCC,MAAAA,SAAS,EAAE,GAFsB;EAGjCC,MAAAA,QAAQ,EAAE,iBAHuB;EAIjCC,MAAAA,SAAS,EAAE;EAJsB,KAAnC;EAMAL,IAAAA,iBAAM,CAACC,MAAP,CAAcF,GAAd,EAAmB,QAAnB,EAA6B;EAC3BG,MAAAA,UAAU,EAAE,0BADe;EAE3BC,MAAAA,SAAS,EAAE,GAFgB;EAG3BC,MAAAA,QAAQ,EAAE,iBAHiB;EAI3BC,MAAAA,SAAS,EAAE;EAJgB,KAA7B;EAMD;;EAED,QAAMC,IAAI,GAAG;EACXC,IAAAA,IAAI,EAAEhB,0BADK;EAEXiB,IAAAA,IAAI,EAAEhB,0BAFK;EAGXiB,IAAAA,OAAO,EAAE;EACPX,MAAAA,SAAS,EAAEA,SADJ;EAEPY,MAAAA,UAAU,EAAEX;EAFL;EAHE,GAAb;;EASA,MAAIF,OAAJ,EAAa;EACXA,IAAAA,OAAO,CAACc,WAAR,CAAoBL,IAApB;EACD,GAFD,MAEO;EACL,UAAMM,OAAO,GAAG,MAAMC,OAAO,CAACC,QAAR,CAAiB;EAACP,MAAAA,IAAI,EAAE;EAAP,KAAjB,CAAtB;;EACA,SAAK,MAAMQ,GAAX,IAAkBH,OAAlB,EAA2B;EACzBG,MAAAA,GAAG,CAACJ,WAAJ,CAAgBL,IAAhB;EACD;EACF;EACF,CAjCD;;ECpDA;;;;;;;AAQA,EAYA;;;;;;;;;;;;EAWA,MAAMU,oBAAN,CAA2B;EACzB;;;;;;;;;;;;;;;;EAgBAC,EAAAA,WAAW,CAAC;EAACzC,IAAAA,cAAD;EAAiB0C,IAAAA,WAAjB;EAA8BC,IAAAA;EAA9B,MAAwD,EAAzD,EAA6D;EACtE,SAAKC,eAAL,GAAuB5C,cAAc,IAAImB,wBAAzC;EACA,SAAK0B,YAAL,GAAoBH,WAAW,IAAIzB,8BAAnC;EACA,SAAK6B,uBAAL,GACIH,sBAAsB,IAAIzB,kCAD9B;;EAGA,IAA2C;EACzCM,MAAAA,iBAAM,CAACC,MAAP,CAAc,KAAKoB,YAAnB,EAAiC,QAAjC,EAA2C;EACzCnB,QAAAA,UAAU,EAAE,0BAD6B;EAEzCC,QAAAA,SAAS,EAAE,sBAF8B;EAGzCC,QAAAA,QAAQ,EAAE,aAH+B;EAIzCC,QAAAA,SAAS,EAAE;EAJ8B,OAA3C;EAMAL,MAAAA,iBAAM,CAACuB,OAAP,CAAe,KAAKH,eAApB,EAAqC;EACnClB,QAAAA,UAAU,EAAE,0BADuB;EAEnCC,QAAAA,SAAS,EAAE,sBAFwB;EAGnCC,QAAAA,QAAQ,EAAE,aAHyB;EAInCC,QAAAA,SAAS,EAAE;EAJwB,OAArC;EAMD;;EAED,SAAKmB,yBAAL;EACD;EAED;;;;;;;;;;;;;;;;;;;;EAkBAC,EAAAA,eAAe,CAAC;EAACC,IAAAA,WAAD;EAAcC,IAAAA,WAAd;EAA2B5B,IAAAA,GAA3B;EAAgCD,IAAAA,SAAhC;EAA2C8B,IAAAA;EAA3C,GAAD,EAAoD;EACjE,QAAI,CAACvD,gBAAgB,CAACqD,WAAD,EAAcC,WAAd,EAA2B,KAAKP,eAAhC,CAArB,EAAuE;EACrE,MAA2C;EACzCpC,QAAAA,iBAAM,CAAC6C,GAAP,CAAY,wCAAZ,EAAqD9B,GAArD;EACD;;EAED,YAAM+B,UAAU,GAAG,YAAY;EAC7B;EACA;EACA;EACA,YAAIF,KAAK,IAAIA,KAAK,CAACG,OAAf,IAA0BH,KAAK,CAACG,OAAN,CAAcC,IAAd,KAAuB,UAArD,EAAiE;EAC/D,UAA2C;EACzChD,YAAAA,iBAAM,CAACE,KAAP,CAAc,6CAAD,GACR,6CADL,EACmD0C,KAAK,CAACG,OADzD;EAED;;EACD,gBAAM,KAAKE,qBAAL,CAA2BL,KAA3B,CAAN;EACD;;EACD,cAAMhC,eAAe,CAAC;EAACC,UAAAA,OAAO,EAAE,KAAKqC,WAAL,EAAV;EAA8BpC,UAAAA,SAA9B;EAAyCC,UAAAA;EAAzC,SAAD,CAArB;EACD,OAZD,CALqE;;;EAoBrE,YAAMoC,IAAI,GAAGL,UAAU,EAAvB;;EAEA,UAAIF,KAAJ,EAAW;EACT,YAAI;EACFA,UAAAA,KAAK,CAACQ,SAAN,CAAgBD,IAAhB;EACD,SAFD,CAEE,OAAOE,KAAP,EAAc;EACd,UAA2C;EACzCrD,YAAAA,iBAAM,CAACC,IAAP,CAAa,8CAAD,GACP,qCADO,GAEP,GAAEqD,iCAAc,CAACV,KAAK,CAACG,OAAN,CAAchC,GAAf,CAAoB,IAFzC;EAGD;EACF;EACF;;EACD,aAAOoC,IAAP;EACD;EACF;EAED;;;;;;;;;EAOAD,EAAAA,WAAW,GAAG;EACZ,QAAK,sBAAsBhE,IAAvB,IAAgC,CAAC,KAAKqE,QAA1C,EAAoD;EAClD,WAAKA,QAAL,GAAgB,IAAIC,gBAAJ,CAAqB,KAAKnB,YAA1B,CAAhB;EACD;;EACD,WAAO,KAAKkB,QAAZ;EACD;EAED;;;;;;;;;;;EASAN,EAAAA,qBAAqB,CAACL,KAAD,EAAQ;EAC3B,QAAI,CAAC,KAAKa,0BAAL,CAAgC1D,GAAhC,CAAoC6C,KAApC,CAAL,EAAiD;EAC/C,YAAMc,QAAQ,GAAG,IAAIC,qBAAJ,EAAjB,CAD+C;EAI/C;;EACA,WAAKF,0BAAL,CAAgCG,GAAhC,CAAoChB,KAApC,EAA2Cc,QAA3C,EAL+C;;;EAQ/C,YAAMG,OAAO,GAAGC,UAAU,CAAC,MAAM;EAC/B,QAA2C;EACzC9D,UAAAA,iBAAM,CAACE,KAAP,CAAc,mBAAkB,KAAKoC,uBAAwB,EAAhD,GACR,oCADL;EAED;;EACDoB,QAAAA,QAAQ,CAACK,OAAT;EACD,OANyB,EAMvB,KAAKzB,uBANkB,CAA1B,CAR+C;;EAiB/CoB,MAAAA,QAAQ,CAACM,OAAT,CAAiBC,IAAjB,CAAsB,MAAMC,YAAY,CAACL,OAAD,CAAxC;EACD;;EACD,WAAO,KAAKJ,0BAAL,CAAgCnD,GAAhC,CAAoCsC,KAApC,EAA2CoB,OAAlD;EACD;EAED;;;;;;;;;;;;EAUAxB,EAAAA,yBAAyB,GAAG;EAC1B;EACA,SAAKiB,0BAAL,GAAkC,IAAIU,GAAJ,EAAlC,CAF0B;EAK1B;EACA;;EACAjF,IAAAA,IAAI,CAACkF,gBAAL,CAAsB,SAAtB,EAAkCxB,KAAD,IAAW;EAC1C,UAAIA,KAAK,CAACtB,IAAN,CAAWC,IAAX,KAAoB,cAApB,IACAqB,KAAK,CAACtB,IAAN,CAAWE,IAAX,KAAoB,gBADpB,IAEA,KAAKiC,0BAAL,CAAgCY,IAAhC,GAAuC,CAF3C,EAE8C;EAC5C,QAA2C;EACzCrE,UAAAA,iBAAM,CAACE,KAAP,CAAc,+BAAd,EAA8C0C,KAA9C;EACD,SAH2C;;;EAK5C,aAAK,MAAMc,QAAX,IAAuB,KAAKD,0BAAL,CAAgCa,MAAhC,EAAvB,EAAiE;EAC/DZ,UAAAA,QAAQ,CAACK,OAAT;EACD;;EACD,aAAKN,0BAAL,CAAgCc,KAAhC;EACD;EACF,KAbD;EAcD;;EA9KwB;;EC/B3B;;;;;;;AAQA,EAIA;;;;;;;EAMA,MAAMC,MAAN,CAAa;EACX;;;;;;;;;;;;;;;;;EAiBAvC,EAAAA,WAAW,CAACwC,OAAD,EAAU;EACnB,SAAKC,gBAAL,GAAwB,IAAI1C,oBAAJ,CAAyByC,OAAzB,CAAxB;EACD;EAED;;;;;;;;;;;;;;;EAaAE,EAAAA,cAAc,CAAC;EAAC7D,IAAAA,SAAD;EAAY4B,IAAAA,WAAZ;EAAyBC,IAAAA,WAAzB;EAAsCI,IAAAA,OAAtC;EAA+CH,IAAAA;EAA/C,GAAD,EAAwD;EACpE,IAA2C;EACzC5B,MAAAA,iBAAM,CAACC,MAAP,CAAcH,SAAd,EAAyB,QAAzB,EAAmC;EACjCI,QAAAA,UAAU,EAAE,0BADqB;EAEjCC,QAAAA,SAAS,EAAE,QAFsB;EAGjCC,QAAAA,QAAQ,EAAE,gBAHuB;EAIjCC,QAAAA,SAAS,EAAE;EAJsB,OAAnC;EAMAL,MAAAA,iBAAM,CAAC4D,UAAP,CAAkBjC,WAAlB,EAA+BlD,QAA/B,EAAyC;EACvCyB,QAAAA,UAAU,EAAE,0BAD2B;EAEvCC,QAAAA,SAAS,EAAE,QAF4B;EAGvCC,QAAAA,QAAQ,EAAE,gBAH6B;EAIvCC,QAAAA,SAAS,EAAE;EAJ4B,OAAzC;EAMAL,MAAAA,iBAAM,CAAC4D,UAAP,CAAkB7B,OAAlB,EAA2B8B,OAA3B,EAAoC;EAClC3D,QAAAA,UAAU,EAAE,0BADsB;EAElCC,QAAAA,SAAS,EAAE,QAFuB;EAGlCC,QAAAA,QAAQ,EAAE,gBAHwB;EAIlCC,QAAAA,SAAS,EAAE;EAJuB,OAApC;EAMD;;EAED,QAAI,CAACqB,WAAL,EAAkB;EAChB;EACA;EACD;;EACD,SAAKgC,gBAAL,CAAsBjC,eAAtB,CAAsC;EACpC3B,MAAAA,SADoC;EAEpC4B,MAAAA,WAFoC;EAGpCC,MAAAA,WAHoC;EAIpCC,MAAAA,KAJoC;EAKpC7B,MAAAA,GAAG,EAAEgC,OAAO,CAAChC;EALuB,KAAtC;EAOD;;EApEU;;EClBb;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,2 @@
1
+ this.workbox=this.workbox||{},this.workbox.broadcastUpdate=function(e,t){"use strict";try{self["workbox:broadcast-update:4.1.1"]&&_()}catch(e){}const s=(e,t,s)=>{return!s.some(s=>e.headers.has(s)&&t.headers.has(s))||s.every(s=>{const n=e.headers.has(s)===t.headers.has(s),a=e.headers.get(s)===t.headers.get(s);return n&&a})},n="workbox",a=1e4,i=["content-length","etag","last-modified"],o=async({channel:e,cacheName:t,url:s})=>{const n={type:"CACHE_UPDATED",meta:"workbox-broadcast-update",payload:{cacheName:t,updatedURL:s}};if(e)e.postMessage(n);else{const e=await clients.matchAll({type:"window"});for(const t of e)t.postMessage(n)}};class c{constructor({headersToCheck:e,channelName:t,deferNoticationTimeout:s}={}){this.t=e||i,this.s=t||n,this.i=s||a,this.o()}notifyIfUpdated({oldResponse:e,newResponse:t,url:n,cacheName:a,event:i}){if(!s(e,t,this.t)){const e=(async()=>{i&&i.request&&"navigate"===i.request.mode&&await this.h(i),await o({channel:this.l(),cacheName:a,url:n})})();if(i)try{i.waitUntil(e)}catch(e){}return e}}l(){return"BroadcastChannel"in self&&!this.u&&(this.u=new BroadcastChannel(this.s)),this.u}h(e){if(!this.m.has(e)){const s=new t.Deferred;this.m.set(e,s);const n=setTimeout(()=>{s.resolve()},this.i);s.promise.then(()=>clearTimeout(n))}return this.m.get(e).promise}o(){this.m=new Map,self.addEventListener("message",e=>{if("WINDOW_READY"===e.data.type&&"workbox-window"===e.data.meta&&this.m.size>0){for(const e of this.m.values())e.resolve();this.m.clear()}})}}return e.BroadcastCacheUpdate=c,e.Plugin=class{constructor(e){this.p=new c(e)}cacheDidUpdate({cacheName:e,oldResponse:t,newResponse:s,request:n,event:a}){t&&this.p.notifyIfUpdated({cacheName:e,oldResponse:t,newResponse:s,event:a,url:n.url})}},e.broadcastUpdate=o,e.responsesAreSame=s,e}({},workbox.core._private);
2
+ //# sourceMappingURL=workbox-broadcast-update.prod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbox-broadcast-update.prod.js","sources":["../_version.mjs","../responsesAreSame.mjs","../utils/constants.mjs","../broadcastUpdate.mjs","../BroadcastCacheUpdate.mjs","../Plugin.mjs"],"sourcesContent":["try{self['workbox:broadcast-update:4.1.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport './_version.mjs';\n\n/**\n * Given two `Response's`, compares several header values to see if they are\n * the same or not.\n *\n * @param {Response} firstResponse\n * @param {Response} secondResponse\n * @param {Array<string>} headersToCheck\n * @return {boolean}\n *\n * @memberof workbox.broadcastUpdate\n * @private\n */\nconst responsesAreSame = (firstResponse, secondResponse, headersToCheck) => {\n if (process.env.NODE_ENV !== 'production') {\n if (!(firstResponse instanceof Response &&\n secondResponse instanceof Response)) {\n throw new WorkboxError('invalid-responses-are-same-args');\n }\n }\n\n const atLeastOneHeaderAvailable = headersToCheck.some((header) => {\n return firstResponse.headers.has(header) &&\n secondResponse.headers.has(header);\n });\n\n if (!atLeastOneHeaderAvailable) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to determine where the response has been updated ` +\n `because none of the headers that would be checked are present.`);\n logger.debug(`Attempting to compare the following: `,\n firstResponse, secondResponse, headersToCheck);\n }\n\n // Just return true, indicating the that responses are the same, since we\n // can't determine otherwise.\n return true;\n }\n\n return headersToCheck.every((header) => {\n const headerStateComparison = firstResponse.headers.has(header) ===\n secondResponse.headers.has(header);\n const headerValueComparison = firstResponse.headers.get(header) ===\n secondResponse.headers.get(header);\n\n return headerStateComparison && headerValueComparison;\n });\n};\n\nexport {responsesAreSame};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\nexport const CACHE_UPDATED_MESSAGE_TYPE = 'CACHE_UPDATED';\nexport const CACHE_UPDATED_MESSAGE_META = 'workbox-broadcast-update';\nexport const DEFAULT_BROADCAST_CHANNEL_NAME = 'workbox';\nexport const DEFAULT_DEFER_NOTIFICATION_TIMEOUT = 10000;\nexport const DEFAULT_HEADERS_TO_CHECK = [\n 'content-length',\n 'etag',\n 'last-modified',\n];\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {CACHE_UPDATED_MESSAGE_TYPE, CACHE_UPDATED_MESSAGE_META}\n from './utils/constants.mjs';\n\nimport './_version.mjs';\n\n/**\n * You would not normally call this method directly; it's called automatically\n * by an instance of the {@link BroadcastCacheUpdate} class. It's exposed here\n * for the benefit of developers who would rather not use the full\n * `BroadcastCacheUpdate` implementation.\n *\n * Calling this will dispatch a message on the provided\n * {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel}\n * to notify interested subscribers about a change to a cached resource.\n *\n * The message that's posted has a formation inspired by the\n * [Flux standard action](https://github.com/acdlite/flux-standard-action#introduction)\n * format like so:\n *\n * ```\n * {\n * type: 'CACHE_UPDATED',\n * meta: 'workbox-broadcast-update',\n * payload: {\n * cacheName: 'the-cache-name',\n * updatedURL: 'https://example.com/'\n * }\n * }\n * ```\n *\n * (Usage of [Flux](https://facebook.github.io/flux/) itself is not at\n * all required.)\n *\n * @param {Object} options\n * @param {string} options.cacheName The name of the cache in which the updated\n * `Response` was stored.\n * @param {string} options.url The URL associated with the updated `Response`.\n * @param {BroadcastChannel} [options.channel] The `BroadcastChannel` to use.\n * If no channel is set or the browser doesn't support the BroadcastChannel\n * api, then an attempt will be made to `postMessage` each window client.\n *\n * @memberof workbox.broadcastUpdate\n */\nconst broadcastUpdate = async ({channel, cacheName, url}) => {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-broadcast-update',\n className: '~',\n funcName: 'broadcastUpdate',\n paramName: 'cacheName',\n });\n assert.isType(url, 'string', {\n moduleName: 'workbox-broadcast-update',\n className: '~',\n funcName: 'broadcastUpdate',\n paramName: 'url',\n });\n }\n\n const data = {\n type: CACHE_UPDATED_MESSAGE_TYPE,\n meta: CACHE_UPDATED_MESSAGE_META,\n payload: {\n cacheName: cacheName,\n updatedURL: url,\n },\n };\n\n if (channel) {\n channel.postMessage(data);\n } else {\n const windows = await clients.matchAll({type: 'window'});\n for (const win of windows) {\n win.postMessage(data);\n }\n }\n};\n\nexport {broadcastUpdate};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {Deferred} from 'workbox-core/_private/Deferred.mjs';\nimport {responsesAreSame} from './responsesAreSame.mjs';\nimport {broadcastUpdate} from './broadcastUpdate.mjs';\n\nimport {DEFAULT_HEADERS_TO_CHECK, DEFAULT_BROADCAST_CHANNEL_NAME,\n DEFAULT_DEFER_NOTIFICATION_TIMEOUT} from './utils/constants.mjs';\n\nimport './_version.mjs';\n\n/**\n * Uses the [Broadcast Channel API]{@link https://developers.google.com/web/updates/2016/09/broadcastchannel}\n * to notify interested parties when a cached response has been updated.\n * In browsers that do not support the Broadcast Channel API, the instance\n * falls back to sending the update via `postMessage()` to all window clients.\n *\n * For efficiency's sake, the underlying response bodies are not compared;\n * only specific response headers are checked.\n *\n * @memberof workbox.broadcastUpdate\n */\nclass BroadcastCacheUpdate {\n /**\n * Construct a BroadcastCacheUpdate instance with a specific `channelName` to\n * broadcast messages on\n *\n * @param {Object} options\n * @param {Array<string>}\n * [options.headersToCheck=['content-length', 'etag', 'last-modified']]\n * A list of headers that will be used to determine whether the responses\n * differ.\n * @param {string} [options.channelName='workbox'] The name that will be used\n *. when creating the `BroadcastChannel`, which defaults to 'workbox' (the\n * channel name used by the `workbox-window` package).\n * @param {string} [options.deferNoticationTimeout=10000] The amount of time\n * to wait for a ready message from the window on navigation requests\n * before sending the update.\n */\n constructor({headersToCheck, channelName, deferNoticationTimeout} = {}) {\n this._headersToCheck = headersToCheck || DEFAULT_HEADERS_TO_CHECK;\n this._channelName = channelName || DEFAULT_BROADCAST_CHANNEL_NAME;\n this._deferNoticationTimeout =\n deferNoticationTimeout || DEFAULT_DEFER_NOTIFICATION_TIMEOUT;\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(this._channelName, 'string', {\n moduleName: 'workbox-broadcast-update',\n className: 'BroadcastCacheUpdate',\n funcName: 'constructor',\n paramName: 'channelName',\n });\n assert.isArray(this._headersToCheck, {\n moduleName: 'workbox-broadcast-update',\n className: 'BroadcastCacheUpdate',\n funcName: 'constructor',\n paramName: 'headersToCheck',\n });\n }\n\n this._initWindowReadyDeferreds();\n }\n\n /**\n * Compare two [Responses](https://developer.mozilla.org/en-US/docs/Web/API/Response)\n * and send a message via the\n * {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel API}\n * if they differ.\n *\n * Neither of the Responses can be {@link http://stackoverflow.com/questions/39109789|opaque}.\n *\n * @param {Object} options\n * @param {Response} options.oldResponse Cached response to compare.\n * @param {Response} options.newResponse Possibly updated response to compare.\n * @param {string} options.url The URL of the request.\n * @param {string} options.cacheName Name of the cache the responses belong\n * to. This is included in the broadcast message.\n * @param {Event} [options.event] event An optional event that triggered\n * this possible cache update.\n * @return {Promise} Resolves once the update is sent.\n */\n notifyIfUpdated({oldResponse, newResponse, url, cacheName, event}) {\n if (!responsesAreSame(oldResponse, newResponse, this._headersToCheck)) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Newer response found (and cached) for:`, url);\n }\n\n const sendUpdate = async () => {\n // In the case of a navigation request, the requesting page will likely\n // not have loaded its JavaScript in time to recevied the update\n // notification, so we defer it until ready (or we timeout waiting).\n if (event && event.request && event.request.mode === 'navigate') {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Original request was a navigation request, ` +\n `waiting for a ready message from the window`, event.request);\n }\n await this._windowReadyOrTimeout(event);\n }\n await broadcastUpdate({channel: this._getChannel(), cacheName, url});\n };\n\n // Send the update and ensure the SW stays alive until it's sent.\n const done = sendUpdate();\n\n if (event) {\n try {\n event.waitUntil(done);\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to ensure service worker stays alive ` +\n `when broadcasting cache update for ` +\n `${getFriendlyURL(event.request.url)}'.`);\n }\n }\n }\n return done;\n }\n }\n\n /**\n * @return {BroadcastChannel|undefined} The BroadcastChannel instance used for\n * broadcasting updates, or undefined if the browser doesn't support the\n * Broadcast Channel API.\n *\n * @private\n */\n _getChannel() {\n if (('BroadcastChannel' in self) && !this._channel) {\n this._channel = new BroadcastChannel(this._channelName);\n }\n return this._channel;\n }\n\n /**\n * Waits for a message from the window indicating that it's capable of\n * receiving broadcasts. By default, this will only wait for the amount of\n * time specified via the `deferNoticationTimeout` option.\n *\n * @param {Event} event The navigation fetch event.\n * @return {Promise}\n * @private\n */\n _windowReadyOrTimeout(event) {\n if (!this._navigationEventsDeferreds.has(event)) {\n const deferred = new Deferred();\n\n // Set the deferred on the `_navigationEventsDeferreds` map so it will\n // be resolved when the next ready message event comes.\n this._navigationEventsDeferreds.set(event, deferred);\n\n // But don't wait too long for the message since it may never come.\n const timeout = setTimeout(() => {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Timed out after ${this._deferNoticationTimeout}` +\n `ms waiting for message from window`);\n }\n deferred.resolve();\n }, this._deferNoticationTimeout);\n\n // Ensure the timeout is cleared if the deferred promise is resolved.\n deferred.promise.then(() => clearTimeout(timeout));\n }\n return this._navigationEventsDeferreds.get(event).promise;\n }\n\n /**\n * Creates a mapping between navigation fetch events and deferreds, and adds\n * a listener for message events from the window. When message events arrive,\n * all deferreds in the mapping are resolved.\n *\n * Note: it would be easier if we could only resolve the deferred of\n * navigation fetch event whose client ID matched the source ID of the\n * message event, but currently client IDs are not exposed on navigation\n * fetch events: https://www.chromestatus.com/feature/4846038800138240\n */\n _initWindowReadyDeferreds() {\n // A mapping between navigation events and their deferreds.\n this._navigationEventsDeferreds = new Map();\n\n // The message listener needs to be added in the initial run of the\n // service worker, but since we don't actually need to be listening for\n // messages until the cache updates, we only invoke the callback if set.\n self.addEventListener('message', (event) => {\n if (event.data.type === 'WINDOW_READY' &&\n event.data.meta === 'workbox-window' &&\n this._navigationEventsDeferreds.size > 0) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Received WINDOW_READY event: `, event);\n }\n // Resolve any pending deferreds.\n for (const deferred of this._navigationEventsDeferreds.values()) {\n deferred.resolve();\n }\n this._navigationEventsDeferreds.clear();\n }\n });\n }\n}\n\nexport {BroadcastCacheUpdate};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {BroadcastCacheUpdate} from './BroadcastCacheUpdate.mjs';\nimport './_version.mjs';\n\n/**\n * This plugin will automatically broadcast a message whenever a cached response\n * is updated.\n *\n * @memberof workbox.broadcastUpdate\n */\nclass Plugin {\n /**\n * Construct a BroadcastCacheUpdate instance with the passed options and\n * calls its `notifyIfUpdated()` method whenever the plugin's\n * `cacheDidUpdate` callback is invoked.\n *\n * @param {Object} options\n * @param {Array<string>}\n * [options.headersToCheck=['content-length', 'etag', 'last-modified']]\n * A list of headers that will be used to determine whether the responses\n * differ.\n * @param {string} [options.channelName='workbox'] The name that will be used\n *. when creating the `BroadcastChannel`, which defaults to 'workbox' (the\n * channel name used by the `workbox-window` package).\n * @param {string} [options.deferNoticationTimeout=10000] The amount of time\n * to wait for a ready message from the window on navigation requests\n * before sending the update.\n */\n constructor(options) {\n this._broadcastUpdate = new BroadcastCacheUpdate(options);\n }\n\n /**\n * A \"lifecycle\" callback that will be triggered automatically by the\n * `workbox-sw` and `workbox-runtime-caching` handlers when an entry is\n * added to a cache.\n *\n * @private\n * @param {Object} options The input object to this function.\n * @param {string} options.cacheName Name of the cache being updated.\n * @param {Response} [options.oldResponse] The previous cached value, if any.\n * @param {Response} options.newResponse The new value in the cache.\n * @param {Request} options.request The request that triggered the udpate.\n * @param {Request} [options.event] The event that triggered the update.\n */\n cacheDidUpdate({cacheName, oldResponse, newResponse, request, event}) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-broadcast-update',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'cacheName',\n });\n assert.isInstance(newResponse, Response, {\n moduleName: 'workbox-broadcast-update',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'newResponse',\n });\n assert.isInstance(request, Request, {\n moduleName: 'workbox-broadcast-update',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'request',\n });\n }\n\n if (!oldResponse) {\n // Without a two responses there is nothing to compare.\n return;\n }\n this._broadcastUpdate.notifyIfUpdated({\n cacheName,\n oldResponse,\n newResponse,\n event,\n url: request.url,\n });\n }\n}\n\nexport {Plugin};\n"],"names":["self","_","e","responsesAreSame","firstResponse","secondResponse","headersToCheck","some","header","headers","has","every","headerStateComparison","headerValueComparison","get","DEFAULT_BROADCAST_CHANNEL_NAME","DEFAULT_DEFER_NOTIFICATION_TIMEOUT","DEFAULT_HEADERS_TO_CHECK","broadcastUpdate","async","channel","cacheName","url","data","type","meta","payload","updatedURL","postMessage","windows","clients","matchAll","win","BroadcastCacheUpdate","constructor","channelName","deferNoticationTimeout","_headersToCheck","_channelName","_deferNoticationTimeout","_initWindowReadyDeferreds","notifyIfUpdated","oldResponse","newResponse","event","this","done","request","mode","_windowReadyOrTimeout","_getChannel","sendUpdate","waitUntil","error","_channel","BroadcastChannel","_navigationEventsDeferreds","deferred","Deferred","set","timeout","setTimeout","resolve","promise","then","clearTimeout","Map","addEventListener","size","values","clear","options","_broadcastUpdate","cacheDidUpdate"],"mappings":"sFAAA,IAAIA,KAAK,mCAAmCC,IAAI,MAAMC,UCwBhDC,EAAmB,CAACC,EAAeC,EAAgBC,YAQrBA,EAAeC,KAAMC,GAC9CJ,EAAcK,QAAQC,IAAIF,IAC/BH,EAAeI,QAAQC,IAAIF,KAgBxBF,EAAeK,MAAOH,UACrBI,EAAwBR,EAAcK,QAAQC,IAAIF,KACtDH,EAAeI,QAAQC,IAAIF,GACvBK,EAAwBT,EAAcK,QAAQK,IAAIN,KACtDH,EAAeI,QAAQK,IAAIN,UAEtBI,GAAyBC,KC5CvBE,EAAiC,UACjCC,EAAqC,IACrCC,EAA2B,CACtC,iBACA,OACA,iBCmCIC,EAAkBC,OAAQC,QAAAA,EAASC,UAAAA,EAAWC,IAAAA,YAgB5CC,EAAO,CACXC,KD3DsC,gBC4DtCC,KD3DsC,2BC4DtCC,QAAS,CACPL,UAAWA,EACXM,WAAYL,OAIZF,EACFA,EAAQQ,YAAYL,OACf,OACCM,QAAgBC,QAAQC,SAAS,CAACP,KAAM,eACzC,MAAMQ,KAAOH,EAChBG,EAAIJ,YAAYL,KCnDtB,MAAMU,EAiBJC,aAAY5B,eAACA,EAAD6B,YAAiBA,EAAjBC,uBAA8BA,GAA0B,SAC7DC,EAAkB/B,GAAkBW,OACpCqB,EAAeH,GAAepB,OAC9BwB,EACDH,GAA0BpB,OAiBzBwB,IAqBPC,iBAAgBC,YAACA,EAADC,YAAcA,EAAdrB,IAA2BA,EAA3BD,UAAgCA,EAAhCuB,MAA2CA,QACpDzC,EAAiBuC,EAAaC,EAAaE,KAAKR,GAAkB,OAoB/DS,EAfa3B,WAIbyB,GAASA,EAAMG,SAAkC,aAAvBH,EAAMG,QAAQC,YAKpCH,KAAKI,EAAsBL,SAE7B1B,EAAgB,CAACE,QAASyB,KAAKK,IAAe7B,UAAAA,EAAWC,IAAAA,KAIpD6B,MAETP,MAEAA,EAAMQ,UAAUN,GAChB,MAAOO,WAQJP,GAWXI,UACO,qBAAsBlD,OAAU6C,KAAKS,SACnCA,EAAW,IAAIC,iBAAiBV,KAAKP,IAErCO,KAAKS,EAYdL,EAAsBL,OACfC,KAAKW,EAA2B9C,IAAIkC,GAAQ,OACzCa,EAAW,IAAIC,gBAIhBF,EAA2BG,IAAIf,EAAOa,SAGrCG,EAAUC,WAAW,KAKzBJ,EAASK,WACRjB,KAAKN,GAGRkB,EAASM,QAAQC,KAAK,IAAMC,aAAaL,WAEpCf,KAAKW,EAA2B1C,IAAI8B,GAAOmB,QAapDvB,SAEOgB,EAA6B,IAAIU,IAKtClE,KAAKmE,iBAAiB,UAAYvB,OACR,iBAApBA,EAAMrB,KAAKC,MACS,mBAApBoB,EAAMrB,KAAKE,MACXoB,KAAKW,EAA2BY,KAAO,EAAG,KAKvC,MAAMX,KAAYZ,KAAKW,EAA2Ba,SACrDZ,EAASK,eAENN,EAA2Bc,qDCxLxC,MAkBEpC,YAAYqC,QACLC,EAAmB,IAAIvC,EAAqBsC,GAgBnDE,gBAAepD,UAACA,EAADqB,YAAYA,EAAZC,YAAyBA,EAAzBI,QAAsCA,EAAtCH,MAA+CA,IAsBvDF,QAIA8B,EAAiB/B,gBAAgB,CACpCpB,UAAAA,EACAqB,YAAAA,EACAC,YAAAA,EACAC,MAAAA,EACAtB,IAAKyB,EAAQzB"}
@@ -1,27 +1,18 @@
1
1
  this.workbox = this.workbox || {};
2
- this.workbox.cacheableResponse = (function (exports,WorkboxError_mjs,assert_mjs,getFriendlyURL_mjs,logger_mjs) {
2
+ this.workbox.cacheableResponse = (function (exports, WorkboxError_mjs, assert_mjs, getFriendlyURL_mjs, logger_mjs) {
3
3
  'use strict';
4
4
 
5
5
  try {
6
- self.workbox.v['workbox:cacheable-response:3.6.3'] = 1;
6
+ self['workbox:cacheable-response:4.1.1'] && _();
7
7
  } catch (e) {} // eslint-disable-line
8
8
 
9
9
  /*
10
- Copyright 2017 Google Inc.
10
+ Copyright 2018 Google LLC
11
11
 
12
- Licensed under the Apache License, Version 2.0 (the "License");
13
- you may not use this file except in compliance with the License.
14
- You may obtain a copy of the License at
15
-
16
- https://www.apache.org/licenses/LICENSE-2.0
17
-
18
- Unless required by applicable law or agreed to in writing, software
19
- distributed under the License is distributed on an "AS IS" BASIS,
20
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
- See the License for the specific language governing permissions and
22
- limitations under the License.
12
+ Use of this source code is governed by an MIT-style
13
+ license that can be found in the LICENSE file or at
14
+ https://opensource.org/licenses/MIT.
23
15
  */
24
-
25
16
  /**
26
17
  * This class allows you to set up rules determining what
27
18
  * status codes and/or headers need to be present in order for a
@@ -30,6 +21,7 @@ this.workbox.cacheableResponse = (function (exports,WorkboxError_mjs,assert_mjs,
30
21
  *
31
22
  * @memberof workbox.cacheableResponse
32
23
  */
24
+
33
25
  class CacheableResponse {
34
26
  /**
35
27
  * To construct a new CacheableResponse instance you must provide at least
@@ -77,7 +69,6 @@ this.workbox.cacheableResponse = (function (exports,WorkboxError_mjs,assert_mjs,
77
69
  this._statuses = config.statuses;
78
70
  this._headers = config.headers;
79
71
  }
80
-
81
72
  /**
82
73
  * Checks a response to see whether it's cacheable or not, based on this
83
74
  * object's configuration.
@@ -87,6 +78,8 @@ this.workbox.cacheableResponse = (function (exports,WorkboxError_mjs,assert_mjs,
87
78
  * @return {boolean} `true` if the `Response` is cacheable, and `false`
88
79
  * otherwise.
89
80
  */
81
+
82
+
90
83
  isResponseCacheable(response) {
91
84
  {
92
85
  assert_mjs.assert.isInstance(response, Response, {
@@ -112,48 +105,38 @@ this.workbox.cacheableResponse = (function (exports,WorkboxError_mjs,assert_mjs,
112
105
  {
113
106
  if (!cacheable) {
114
107
  logger_mjs.logger.groupCollapsed(`The request for ` + `'${getFriendlyURL_mjs.getFriendlyURL(response.url)}' returned a response that does ` + `not meet the criteria for being cached.`);
115
-
116
108
  logger_mjs.logger.groupCollapsed(`View cacheability criteria here.`);
117
- logger_mjs.logger.unprefixed.log(`Cacheable statuses: ` + JSON.stringify(this._statuses));
118
- logger_mjs.logger.unprefixed.log(`Cacheable headers: ` + JSON.stringify(this._headers, null, 2));
109
+ logger_mjs.logger.log(`Cacheable statuses: ` + JSON.stringify(this._statuses));
110
+ logger_mjs.logger.log(`Cacheable headers: ` + JSON.stringify(this._headers, null, 2));
119
111
  logger_mjs.logger.groupEnd();
120
-
121
112
  const logFriendlyHeaders = {};
122
113
  response.headers.forEach((value, key) => {
123
114
  logFriendlyHeaders[key] = value;
124
115
  });
125
-
126
116
  logger_mjs.logger.groupCollapsed(`View response status and headers here.`);
127
- logger_mjs.logger.unprefixed.log(`Response status: ` + response.status);
128
- logger_mjs.logger.unprefixed.log(`Response headers: ` + JSON.stringify(logFriendlyHeaders, null, 2));
117
+ logger_mjs.logger.log(`Response status: ` + response.status);
118
+ logger_mjs.logger.log(`Response headers: ` + JSON.stringify(logFriendlyHeaders, null, 2));
129
119
  logger_mjs.logger.groupEnd();
130
-
131
120
  logger_mjs.logger.groupCollapsed(`View full response details here.`);
132
- logger_mjs.logger.unprefixed.log(response.headers);
133
- logger_mjs.logger.unprefixed.log(response);
121
+ logger_mjs.logger.log(response.headers);
122
+ logger_mjs.logger.log(response);
134
123
  logger_mjs.logger.groupEnd();
135
-
136
124
  logger_mjs.logger.groupEnd();
137
125
  }
138
126
  }
139
127
 
140
128
  return cacheable;
141
129
  }
130
+
142
131
  }
143
132
 
144
133
  /*
145
- Copyright 2016 Google Inc. All Rights Reserved.
146
- Licensed under the Apache License, Version 2.0 (the "License");
147
- you may not use this file except in compliance with the License.
148
- You may obtain a copy of the License at
149
- http://www.apache.org/licenses/LICENSE-2.0
150
- Unless required by applicable law or agreed to in writing, software
151
- distributed under the License is distributed on an "AS IS" BASIS,
152
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153
- See the License for the specific language governing permissions and
154
- limitations under the License.
155
- */
134
+ Copyright 2018 Google LLC
156
135
 
136
+ Use of this source code is governed by an MIT-style
137
+ license that can be found in the LICENSE file or at
138
+ https://opensource.org/licenses/MIT.
139
+ */
157
140
  /**
158
141
  * A class implementing the `cacheWillUpdate` lifecycle callback. This makes it
159
142
  * easier to add in cacheability checks to requests made via Workbox's built-in
@@ -161,6 +144,7 @@ this.workbox.cacheableResponse = (function (exports,WorkboxError_mjs,assert_mjs,
161
144
  *
162
145
  * @memberof workbox.cacheableResponse
163
146
  */
147
+
164
148
  class Plugin {
165
149
  /**
166
150
  * To construct a new cacheable response Plugin instance you must provide at
@@ -179,51 +163,32 @@ this.workbox.cacheableResponse = (function (exports,WorkboxError_mjs,assert_mjs,
179
163
  constructor(config) {
180
164
  this._cacheableResponse = new CacheableResponse(config);
181
165
  }
182
-
183
166
  /**
184
167
  * @param {Object} options
185
168
  * @param {Response} options.response
186
169
  * @return {boolean}
187
170
  * @private
188
171
  */
189
- cacheWillUpdate({ response }) {
172
+
173
+
174
+ cacheWillUpdate({
175
+ response
176
+ }) {
190
177
  if (this._cacheableResponse.isResponseCacheable(response)) {
191
178
  return response;
192
179
  }
180
+
193
181
  return null;
194
182
  }
195
- }
196
-
197
- /*
198
- Copyright 2017 Google Inc.
199
183
 
200
- Licensed under the Apache License, Version 2.0 (the "License");
201
- you may not use this file except in compliance with the License.
202
- You may obtain a copy of the License at
203
-
204
- https://www.apache.org/licenses/LICENSE-2.0
205
-
206
- Unless required by applicable law or agreed to in writing, software
207
- distributed under the License is distributed on an "AS IS" BASIS,
208
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
209
- See the License for the specific language governing permissions and
210
- limitations under the License.
211
- */
184
+ }
212
185
 
213
186
  /*
214
- Copyright 2017 Google Inc.
187
+ Copyright 2018 Google LLC
215
188
 
216
- Licensed under the Apache License, Version 2.0 (the "License");
217
- you may not use this file except in compliance with the License.
218
- You may obtain a copy of the License at
219
-
220
- https://www.apache.org/licenses/LICENSE-2.0
221
-
222
- Unless required by applicable law or agreed to in writing, software
223
- distributed under the License is distributed on an "AS IS" BASIS,
224
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
225
- See the License for the specific language governing permissions and
226
- limitations under the License.
189
+ Use of this source code is governed by an MIT-style
190
+ license that can be found in the LICENSE file or at
191
+ https://opensource.org/licenses/MIT.
227
192
  */
228
193
 
229
194
  exports.CacheableResponse = CacheableResponse;
@@ -231,6 +196,5 @@ this.workbox.cacheableResponse = (function (exports,WorkboxError_mjs,assert_mjs,
231
196
 
232
197
  return exports;
233
198
 
234
- }({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private));
235
-
199
+ }({}, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private));
236
200
  //# sourceMappingURL=workbox-cacheable-response.dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbox-cacheable-response.dev.js","sources":["../_version.mjs","../CacheableResponse.mjs","../Plugin.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:cacheable-response:4.1.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport './_version.mjs';\n\n/**\n * This class allows you to set up rules determining what\n * status codes and/or headers need to be present in order for a\n * [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)\n * to be considered cacheable.\n *\n * @memberof workbox.cacheableResponse\n */\nclass CacheableResponse {\n /**\n * To construct a new CacheableResponse instance you must provide at least\n * one of the `config` properties.\n *\n * If both `statuses` and `headers` are specified, then both conditions must\n * be met for the `Response` to be considered cacheable.\n *\n * @param {Object} config\n * @param {Array<number>} [config.statuses] One or more status codes that a\n * `Response` can have and be considered cacheable.\n * @param {Object<string,string>} [config.headers] A mapping of header names\n * and expected values that a `Response` can have and be considered cacheable.\n * If multiple headers are provided, only one needs to be present.\n */\n constructor(config = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (!(config.statuses || config.headers)) {\n throw new WorkboxError('statuses-or-headers-required', {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n });\n }\n\n if (config.statuses) {\n assert.isArray(config.statuses, {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n paramName: 'config.statuses',\n });\n }\n\n if (config.headers) {\n assert.isType(config.headers, 'object', {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n paramName: 'config.headers',\n });\n }\n }\n\n this._statuses = config.statuses;\n this._headers = config.headers;\n }\n\n /**\n * Checks a response to see whether it's cacheable or not, based on this\n * object's configuration.\n *\n * @param {Response} response The response whose cacheability is being\n * checked.\n * @return {boolean} `true` if the `Response` is cacheable, and `false`\n * otherwise.\n */\n isResponseCacheable(response) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(response, Response, {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'isResponseCacheable',\n paramName: 'response',\n });\n }\n\n let cacheable = true;\n\n if (this._statuses) {\n cacheable = this._statuses.includes(response.status);\n }\n\n if (this._headers && cacheable) {\n cacheable = Object.keys(this._headers).some((headerName) => {\n return response.headers.get(headerName) === this._headers[headerName];\n });\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (!cacheable) {\n logger.groupCollapsed(`The request for ` +\n `'${getFriendlyURL(response.url)}' returned a response that does ` +\n `not meet the criteria for being cached.`);\n\n logger.groupCollapsed(`View cacheability criteria here.`);\n logger.log(`Cacheable statuses: ` +\n JSON.stringify(this._statuses));\n logger.log(`Cacheable headers: ` +\n JSON.stringify(this._headers, null, 2));\n logger.groupEnd();\n\n const logFriendlyHeaders = {};\n response.headers.forEach((value, key) => {\n logFriendlyHeaders[key] = value;\n });\n\n logger.groupCollapsed(`View response status and headers here.`);\n logger.log(`Response status: ` + response.status);\n logger.log(`Response headers: ` +\n JSON.stringify(logFriendlyHeaders, null, 2));\n logger.groupEnd();\n\n logger.groupCollapsed(`View full response details here.`);\n logger.log(response.headers);\n logger.log(response);\n logger.groupEnd();\n\n logger.groupEnd();\n }\n }\n\n return cacheable;\n }\n}\n\nexport {CacheableResponse};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {CacheableResponse} from './CacheableResponse.mjs';\nimport './_version.mjs';\n\n/**\n * A class implementing the `cacheWillUpdate` lifecycle callback. This makes it\n * easier to add in cacheability checks to requests made via Workbox's built-in\n * strategies.\n *\n * @memberof workbox.cacheableResponse\n */\nclass Plugin {\n /**\n * To construct a new cacheable response Plugin instance you must provide at\n * least one of the `config` properties.\n *\n * If both `statuses` and `headers` are specified, then both conditions must\n * be met for the `Response` to be considered cacheable.\n *\n * @param {Object} config\n * @param {Array<number>} [config.statuses] One or more status codes that a\n * `Response` can have and be considered cacheable.\n * @param {Object<string,string>} [config.headers] A mapping of header names\n * and expected values that a `Response` can have and be considered cacheable.\n * If multiple headers are provided, only one needs to be present.\n */\n constructor(config) {\n this._cacheableResponse = new CacheableResponse(config);\n }\n\n /**\n * @param {Object} options\n * @param {Response} options.response\n * @return {boolean}\n * @private\n */\n cacheWillUpdate({response}) {\n if (this._cacheableResponse.isResponseCacheable(response)) {\n return response;\n }\n return null;\n }\n}\n\nexport {Plugin};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {CacheableResponse} from './CacheableResponse.mjs';\nimport {Plugin} from './Plugin.mjs';\nimport './_version.mjs';\n\n\n/**\n * @namespace workbox.cacheableResponse\n */\n\nexport {\n CacheableResponse,\n Plugin,\n};\n"],"names":["self","_","e","CacheableResponse","constructor","config","statuses","headers","WorkboxError","moduleName","className","funcName","assert","isArray","paramName","isType","_statuses","_headers","isResponseCacheable","response","isInstance","Response","cacheable","includes","status","Object","keys","some","headerName","get","logger","groupCollapsed","getFriendlyURL","url","log","JSON","stringify","groupEnd","logFriendlyHeaders","forEach","value","key","Plugin","_cacheableResponse","cacheWillUpdate"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ this.workbox=this.workbox||{},this.workbox.cacheableResponse=function(t){"use strict";try{self["workbox:cacheable-response:4.1.1"]&&_()}catch(t){}class s{constructor(t={}){this.t=t.statuses,this.s=t.headers}isResponseCacheable(t){let s=!0;return this.t&&(s=this.t.includes(t.status)),this.s&&s&&(s=Object.keys(this.s).some(s=>t.headers.get(s)===this.s[s])),s}}return t.CacheableResponse=s,t.Plugin=class{constructor(t){this.i=new s(t)}cacheWillUpdate({response:t}){return this.i.isResponseCacheable(t)?t:null}},t}({});
2
+ //# sourceMappingURL=workbox-cacheable-response.prod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbox-cacheable-response.prod.js","sources":["../_version.mjs","../CacheableResponse.mjs","../Plugin.mjs"],"sourcesContent":["try{self['workbox:cacheable-response:4.1.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport './_version.mjs';\n\n/**\n * This class allows you to set up rules determining what\n * status codes and/or headers need to be present in order for a\n * [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)\n * to be considered cacheable.\n *\n * @memberof workbox.cacheableResponse\n */\nclass CacheableResponse {\n /**\n * To construct a new CacheableResponse instance you must provide at least\n * one of the `config` properties.\n *\n * If both `statuses` and `headers` are specified, then both conditions must\n * be met for the `Response` to be considered cacheable.\n *\n * @param {Object} config\n * @param {Array<number>} [config.statuses] One or more status codes that a\n * `Response` can have and be considered cacheable.\n * @param {Object<string,string>} [config.headers] A mapping of header names\n * and expected values that a `Response` can have and be considered cacheable.\n * If multiple headers are provided, only one needs to be present.\n */\n constructor(config = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (!(config.statuses || config.headers)) {\n throw new WorkboxError('statuses-or-headers-required', {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n });\n }\n\n if (config.statuses) {\n assert.isArray(config.statuses, {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n paramName: 'config.statuses',\n });\n }\n\n if (config.headers) {\n assert.isType(config.headers, 'object', {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n paramName: 'config.headers',\n });\n }\n }\n\n this._statuses = config.statuses;\n this._headers = config.headers;\n }\n\n /**\n * Checks a response to see whether it's cacheable or not, based on this\n * object's configuration.\n *\n * @param {Response} response The response whose cacheability is being\n * checked.\n * @return {boolean} `true` if the `Response` is cacheable, and `false`\n * otherwise.\n */\n isResponseCacheable(response) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(response, Response, {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'isResponseCacheable',\n paramName: 'response',\n });\n }\n\n let cacheable = true;\n\n if (this._statuses) {\n cacheable = this._statuses.includes(response.status);\n }\n\n if (this._headers && cacheable) {\n cacheable = Object.keys(this._headers).some((headerName) => {\n return response.headers.get(headerName) === this._headers[headerName];\n });\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (!cacheable) {\n logger.groupCollapsed(`The request for ` +\n `'${getFriendlyURL(response.url)}' returned a response that does ` +\n `not meet the criteria for being cached.`);\n\n logger.groupCollapsed(`View cacheability criteria here.`);\n logger.log(`Cacheable statuses: ` +\n JSON.stringify(this._statuses));\n logger.log(`Cacheable headers: ` +\n JSON.stringify(this._headers, null, 2));\n logger.groupEnd();\n\n const logFriendlyHeaders = {};\n response.headers.forEach((value, key) => {\n logFriendlyHeaders[key] = value;\n });\n\n logger.groupCollapsed(`View response status and headers here.`);\n logger.log(`Response status: ` + response.status);\n logger.log(`Response headers: ` +\n JSON.stringify(logFriendlyHeaders, null, 2));\n logger.groupEnd();\n\n logger.groupCollapsed(`View full response details here.`);\n logger.log(response.headers);\n logger.log(response);\n logger.groupEnd();\n\n logger.groupEnd();\n }\n }\n\n return cacheable;\n }\n}\n\nexport {CacheableResponse};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {CacheableResponse} from './CacheableResponse.mjs';\nimport './_version.mjs';\n\n/**\n * A class implementing the `cacheWillUpdate` lifecycle callback. This makes it\n * easier to add in cacheability checks to requests made via Workbox's built-in\n * strategies.\n *\n * @memberof workbox.cacheableResponse\n */\nclass Plugin {\n /**\n * To construct a new cacheable response Plugin instance you must provide at\n * least one of the `config` properties.\n *\n * If both `statuses` and `headers` are specified, then both conditions must\n * be met for the `Response` to be considered cacheable.\n *\n * @param {Object} config\n * @param {Array<number>} [config.statuses] One or more status codes that a\n * `Response` can have and be considered cacheable.\n * @param {Object<string,string>} [config.headers] A mapping of header names\n * and expected values that a `Response` can have and be considered cacheable.\n * If multiple headers are provided, only one needs to be present.\n */\n constructor(config) {\n this._cacheableResponse = new CacheableResponse(config);\n }\n\n /**\n * @param {Object} options\n * @param {Response} options.response\n * @return {boolean}\n * @private\n */\n cacheWillUpdate({response}) {\n if (this._cacheableResponse.isResponseCacheable(response)) {\n return response;\n }\n return null;\n }\n}\n\nexport {Plugin};\n"],"names":["self","_","e","CacheableResponse","constructor","config","_statuses","statuses","_headers","headers","isResponseCacheable","response","cacheable","this","includes","status","Object","keys","some","headerName","get","_cacheableResponse","cacheWillUpdate"],"mappings":"sFAAA,IAAIA,KAAK,qCAAqCC,IAAI,MAAMC,ICsBxD,MAAMC,EAeJC,YAAYC,EAAS,SA6BdC,EAAYD,EAAOE,cACnBC,EAAWH,EAAOI,QAYzBC,oBAAoBC,OAUdC,GAAY,SAEZC,KAAKP,IACPM,EAAYC,KAAKP,EAAUQ,SAASH,EAASI,SAG3CF,KAAKL,GAAYI,IACnBA,EAAYI,OAAOC,KAAKJ,KAAKL,GAAUU,KAAMC,GACpCR,EAASF,QAAQW,IAAID,KAAgBN,KAAKL,EAASW,KAqCvDP,yCCpHX,MAeER,YAAYC,QACLgB,EAAqB,IAAIlB,EAAkBE,GASlDiB,iBAAgBX,SAACA,WACXE,KAAKQ,EAAmBX,oBAAoBC,GACvCA,EAEF"}
@@ -0,0 +1,1584 @@
1
+ this.workbox = this.workbox || {};
2
+ this.workbox.core = (function (exports) {
3
+ 'use strict';
4
+
5
+ try {
6
+ self['workbox:core:4.1.1'] && _();
7
+ } catch (e) {} // eslint-disable-line
8
+
9
+ /*
10
+ Copyright 2019 Google LLC
11
+ Use of this source code is governed by an MIT-style
12
+ license that can be found in the LICENSE file or at
13
+ https://opensource.org/licenses/MIT.
14
+ */
15
+ const logger = (() => {
16
+ let inGroup = false;
17
+ const methodToColorMap = {
18
+ debug: `#7f8c8d`,
19
+ // Gray
20
+ log: `#2ecc71`,
21
+ // Green
22
+ warn: `#f39c12`,
23
+ // Yellow
24
+ error: `#c0392b`,
25
+ // Red
26
+ groupCollapsed: `#3498db`,
27
+ // Blue
28
+ groupEnd: null // No colored prefix on groupEnd
29
+
30
+ };
31
+
32
+ const print = function (method, args) {
33
+ if (method === 'groupCollapsed') {
34
+ // Safari doesn't print all console.groupCollapsed() arguments:
35
+ // https://bugs.webkit.org/show_bug.cgi?id=182754
36
+ if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {
37
+ console[method](...args);
38
+ return;
39
+ }
40
+ }
41
+
42
+ const styles = [`background: ${methodToColorMap[method]}`, `border-radius: 0.5em`, `color: white`, `font-weight: bold`, `padding: 2px 0.5em`]; // When in a group, the workbox prefix is not displayed.
43
+
44
+ const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')];
45
+ console[method](...logPrefix, ...args);
46
+
47
+ if (method === 'groupCollapsed') {
48
+ inGroup = true;
49
+ }
50
+
51
+ if (method === 'groupEnd') {
52
+ inGroup = false;
53
+ }
54
+ };
55
+
56
+ const api = {};
57
+
58
+ for (const method of Object.keys(methodToColorMap)) {
59
+ api[method] = (...args) => {
60
+ print(method, args);
61
+ };
62
+ }
63
+
64
+ return api;
65
+ })();
66
+
67
+ /*
68
+ Copyright 2018 Google LLC
69
+
70
+ Use of this source code is governed by an MIT-style
71
+ license that can be found in the LICENSE file or at
72
+ https://opensource.org/licenses/MIT.
73
+ */
74
+ const messages = {
75
+ 'invalid-value': ({
76
+ paramName,
77
+ validValueDescription,
78
+ value
79
+ }) => {
80
+ if (!paramName || !validValueDescription) {
81
+ throw new Error(`Unexpected input to 'invalid-value' error.`);
82
+ }
83
+
84
+ return `The '${paramName}' parameter was given a value with an ` + `unexpected value. ${validValueDescription} Received a value of ` + `${JSON.stringify(value)}.`;
85
+ },
86
+ 'not-in-sw': ({
87
+ moduleName
88
+ }) => {
89
+ if (!moduleName) {
90
+ throw new Error(`Unexpected input to 'not-in-sw' error.`);
91
+ }
92
+
93
+ return `The '${moduleName}' must be used in a service worker.`;
94
+ },
95
+ 'not-an-array': ({
96
+ moduleName,
97
+ className,
98
+ funcName,
99
+ paramName
100
+ }) => {
101
+ if (!moduleName || !className || !funcName || !paramName) {
102
+ throw new Error(`Unexpected input to 'not-an-array' error.`);
103
+ }
104
+
105
+ return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className}.${funcName}()' must be an array.`;
106
+ },
107
+ 'incorrect-type': ({
108
+ expectedType,
109
+ paramName,
110
+ moduleName,
111
+ className,
112
+ funcName
113
+ }) => {
114
+ if (!expectedType || !paramName || !moduleName || !funcName) {
115
+ throw new Error(`Unexpected input to 'incorrect-type' error.`);
116
+ }
117
+
118
+ return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className ? className + '.' : ''}` + `${funcName}()' must be of type ${expectedType}.`;
119
+ },
120
+ 'incorrect-class': ({
121
+ expectedClass,
122
+ paramName,
123
+ moduleName,
124
+ className,
125
+ funcName,
126
+ isReturnValueProblem
127
+ }) => {
128
+ if (!expectedClass || !moduleName || !funcName) {
129
+ throw new Error(`Unexpected input to 'incorrect-class' error.`);
130
+ }
131
+
132
+ if (isReturnValueProblem) {
133
+ return `The return value from ` + `'${moduleName}.${className ? className + '.' : ''}${funcName}()' ` + `must be an instance of class ${expectedClass.name}.`;
134
+ }
135
+
136
+ return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className ? className + '.' : ''}${funcName}()' ` + `must be an instance of class ${expectedClass.name}.`;
137
+ },
138
+ 'missing-a-method': ({
139
+ expectedMethod,
140
+ paramName,
141
+ moduleName,
142
+ className,
143
+ funcName
144
+ }) => {
145
+ if (!expectedMethod || !paramName || !moduleName || !className || !funcName) {
146
+ throw new Error(`Unexpected input to 'missing-a-method' error.`);
147
+ }
148
+
149
+ return `${moduleName}.${className}.${funcName}() expected the ` + `'${paramName}' parameter to expose a '${expectedMethod}' method.`;
150
+ },
151
+ 'add-to-cache-list-unexpected-type': ({
152
+ entry
153
+ }) => {
154
+ return `An unexpected entry was passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' The entry ` + `'${JSON.stringify(entry)}' isn't supported. You must supply an array of ` + `strings with one or more characters, objects with a url property or ` + `Request objects.`;
155
+ },
156
+ 'add-to-cache-list-conflicting-entries': ({
157
+ firstEntry,
158
+ secondEntry
159
+ }) => {
160
+ if (!firstEntry || !secondEntry) {
161
+ throw new Error(`Unexpected input to ` + `'add-to-cache-list-duplicate-entries' error.`);
162
+ }
163
+
164
+ return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` + `${firstEntry._entryId} but different revision details. Workbox is ` + `is unable to cache and version the asset correctly. Please remove one ` + `of the entries.`;
165
+ },
166
+ 'plugin-error-request-will-fetch': ({
167
+ thrownError
168
+ }) => {
169
+ if (!thrownError) {
170
+ throw new Error(`Unexpected input to ` + `'plugin-error-request-will-fetch', error.`);
171
+ }
172
+
173
+ return `An error was thrown by a plugins 'requestWillFetch()' method. ` + `The thrown error message was: '${thrownError.message}'.`;
174
+ },
175
+ 'invalid-cache-name': ({
176
+ cacheNameId,
177
+ value
178
+ }) => {
179
+ if (!cacheNameId) {
180
+ throw new Error(`Expected a 'cacheNameId' for error 'invalid-cache-name'`);
181
+ }
182
+
183
+ return `You must provide a name containing at least one character for ` + `setCacheDeatils({${cacheNameId}: '...'}). Received a value of ` + `'${JSON.stringify(value)}'`;
184
+ },
185
+ 'unregister-route-but-not-found-with-method': ({
186
+ method
187
+ }) => {
188
+ if (!method) {
189
+ throw new Error(`Unexpected input to ` + `'unregister-route-but-not-found-with-method' error.`);
190
+ }
191
+
192
+ return `The route you're trying to unregister was not previously ` + `registered for the method type '${method}'.`;
193
+ },
194
+ 'unregister-route-route-not-registered': () => {
195
+ return `The route you're trying to unregister was not previously ` + `registered.`;
196
+ },
197
+ 'queue-replay-failed': ({
198
+ name
199
+ }) => {
200
+ return `Replaying the background sync queue '${name}' failed.`;
201
+ },
202
+ 'duplicate-queue-name': ({
203
+ name
204
+ }) => {
205
+ return `The Queue name '${name}' is already being used. ` + `All instances of backgroundSync.Queue must be given unique names.`;
206
+ },
207
+ 'expired-test-without-max-age': ({
208
+ methodName,
209
+ paramName
210
+ }) => {
211
+ return `The '${methodName}()' method can only be used when the ` + `'${paramName}' is used in the constructor.`;
212
+ },
213
+ 'unsupported-route-type': ({
214
+ moduleName,
215
+ className,
216
+ funcName,
217
+ paramName
218
+ }) => {
219
+ return `The supplied '${paramName}' parameter was an unsupported type. ` + `Please check the docs for ${moduleName}.${className}.${funcName} for ` + `valid input types.`;
220
+ },
221
+ 'not-array-of-class': ({
222
+ value,
223
+ expectedClass,
224
+ moduleName,
225
+ className,
226
+ funcName,
227
+ paramName
228
+ }) => {
229
+ return `The supplied '${paramName}' parameter must be an array of ` + `'${expectedClass}' objects. Received '${JSON.stringify(value)},'. ` + `Please check the call to ${moduleName}.${className}.${funcName}() ` + `to fix the issue.`;
230
+ },
231
+ 'max-entries-or-age-required': ({
232
+ moduleName,
233
+ className,
234
+ funcName
235
+ }) => {
236
+ return `You must define either config.maxEntries or config.maxAgeSeconds` + `in ${moduleName}.${className}.${funcName}`;
237
+ },
238
+ 'statuses-or-headers-required': ({
239
+ moduleName,
240
+ className,
241
+ funcName
242
+ }) => {
243
+ return `You must define either config.statuses or config.headers` + `in ${moduleName}.${className}.${funcName}`;
244
+ },
245
+ 'invalid-string': ({
246
+ moduleName,
247
+ className,
248
+ funcName,
249
+ paramName
250
+ }) => {
251
+ if (!paramName || !moduleName || !funcName) {
252
+ throw new Error(`Unexpected input to 'invalid-string' error.`);
253
+ }
254
+
255
+ return `When using strings, the '${paramName}' parameter must start with ` + `'http' (for cross-origin matches) or '/' (for same-origin matches). ` + `Please see the docs for ${moduleName}.${funcName}() for ` + `more info.`;
256
+ },
257
+ 'channel-name-required': () => {
258
+ return `You must provide a channelName to construct a ` + `BroadcastCacheUpdate instance.`;
259
+ },
260
+ 'invalid-responses-are-same-args': () => {
261
+ return `The arguments passed into responsesAreSame() appear to be ` + `invalid. Please ensure valid Responses are used.`;
262
+ },
263
+ 'expire-custom-caches-only': () => {
264
+ return `You must provide a 'cacheName' property when using the ` + `expiration plugin with a runtime caching strategy.`;
265
+ },
266
+ 'unit-must-be-bytes': ({
267
+ normalizedRangeHeader
268
+ }) => {
269
+ if (!normalizedRangeHeader) {
270
+ throw new Error(`Unexpected input to 'unit-must-be-bytes' error.`);
271
+ }
272
+
273
+ return `The 'unit' portion of the Range header must be set to 'bytes'. ` + `The Range header provided was "${normalizedRangeHeader}"`;
274
+ },
275
+ 'single-range-only': ({
276
+ normalizedRangeHeader
277
+ }) => {
278
+ if (!normalizedRangeHeader) {
279
+ throw new Error(`Unexpected input to 'single-range-only' error.`);
280
+ }
281
+
282
+ return `Multiple ranges are not supported. Please use a single start ` + `value, and optional end value. The Range header provided was ` + `"${normalizedRangeHeader}"`;
283
+ },
284
+ 'invalid-range-values': ({
285
+ normalizedRangeHeader
286
+ }) => {
287
+ if (!normalizedRangeHeader) {
288
+ throw new Error(`Unexpected input to 'invalid-range-values' error.`);
289
+ }
290
+
291
+ return `The Range header is missing both start and end values. At least ` + `one of those values is needed. The Range header provided was ` + `"${normalizedRangeHeader}"`;
292
+ },
293
+ 'no-range-header': () => {
294
+ return `No Range header was found in the Request provided.`;
295
+ },
296
+ 'range-not-satisfiable': ({
297
+ size,
298
+ start,
299
+ end
300
+ }) => {
301
+ return `The start (${start}) and end (${end}) values in the Range are ` + `not satisfiable by the cached response, which is ${size} bytes.`;
302
+ },
303
+ 'attempt-to-cache-non-get-request': ({
304
+ url,
305
+ method
306
+ }) => {
307
+ return `Unable to cache '${url}' because it is a '${method}' request and ` + `only 'GET' requests can be cached.`;
308
+ },
309
+ 'cache-put-with-no-response': ({
310
+ url
311
+ }) => {
312
+ return `There was an attempt to cache '${url}' but the response was not ` + `defined.`;
313
+ },
314
+ 'no-response': ({
315
+ url,
316
+ error
317
+ }) => {
318
+ let message = `The strategy could not generate a response for '${url}'.`;
319
+
320
+ if (error) {
321
+ message += ` The underlying error is ${error}.`;
322
+ }
323
+
324
+ return message;
325
+ },
326
+ 'bad-precaching-response': ({
327
+ url,
328
+ status
329
+ }) => {
330
+ return `The precaching request for '${url}' failed with an HTTP ` + `status of ${status}.`;
331
+ }
332
+ };
333
+
334
+ /*
335
+ Copyright 2018 Google LLC
336
+
337
+ Use of this source code is governed by an MIT-style
338
+ license that can be found in the LICENSE file or at
339
+ https://opensource.org/licenses/MIT.
340
+ */
341
+
342
+ const generatorFunction = (code, ...args) => {
343
+ const message = messages[code];
344
+
345
+ if (!message) {
346
+ throw new Error(`Unable to find message for code '${code}'.`);
347
+ }
348
+
349
+ return message(...args);
350
+ };
351
+
352
+ const messageGenerator = generatorFunction;
353
+
354
+ /*
355
+ Copyright 2018 Google LLC
356
+
357
+ Use of this source code is governed by an MIT-style
358
+ license that can be found in the LICENSE file or at
359
+ https://opensource.org/licenses/MIT.
360
+ */
361
+ /**
362
+ * Workbox errors should be thrown with this class.
363
+ * This allows use to ensure the type easily in tests,
364
+ * helps developers identify errors from workbox
365
+ * easily and allows use to optimise error
366
+ * messages correctly.
367
+ *
368
+ * @private
369
+ */
370
+
371
+ class WorkboxError extends Error {
372
+ /**
373
+ *
374
+ * @param {string} errorCode The error code that
375
+ * identifies this particular error.
376
+ * @param {Object=} details Any relevant arguments
377
+ * that will help developers identify issues should
378
+ * be added as a key on the context object.
379
+ */
380
+ constructor(errorCode, details) {
381
+ let message = messageGenerator(errorCode, details);
382
+ super(message);
383
+ this.name = errorCode;
384
+ this.details = details;
385
+ }
386
+
387
+ }
388
+
389
+ /*
390
+ Copyright 2018 Google LLC
391
+
392
+ Use of this source code is governed by an MIT-style
393
+ license that can be found in the LICENSE file or at
394
+ https://opensource.org/licenses/MIT.
395
+ */
396
+ /*
397
+ * This method returns true if the current context is a service worker.
398
+ */
399
+
400
+ const isSWEnv = moduleName => {
401
+ if (!('ServiceWorkerGlobalScope' in self)) {
402
+ throw new WorkboxError('not-in-sw', {
403
+ moduleName
404
+ });
405
+ }
406
+ };
407
+ /*
408
+ * This method throws if the supplied value is not an array.
409
+ * The destructed values are required to produce a meaningful error for users.
410
+ * The destructed and restructured object is so it's clear what is
411
+ * needed.
412
+ */
413
+
414
+
415
+ const isArray = (value, {
416
+ moduleName,
417
+ className,
418
+ funcName,
419
+ paramName
420
+ }) => {
421
+ if (!Array.isArray(value)) {
422
+ throw new WorkboxError('not-an-array', {
423
+ moduleName,
424
+ className,
425
+ funcName,
426
+ paramName
427
+ });
428
+ }
429
+ };
430
+
431
+ const hasMethod = (object, expectedMethod, {
432
+ moduleName,
433
+ className,
434
+ funcName,
435
+ paramName
436
+ }) => {
437
+ const type = typeof object[expectedMethod];
438
+
439
+ if (type !== 'function') {
440
+ throw new WorkboxError('missing-a-method', {
441
+ paramName,
442
+ expectedMethod,
443
+ moduleName,
444
+ className,
445
+ funcName
446
+ });
447
+ }
448
+ };
449
+
450
+ const isType = (object, expectedType, {
451
+ moduleName,
452
+ className,
453
+ funcName,
454
+ paramName
455
+ }) => {
456
+ if (typeof object !== expectedType) {
457
+ throw new WorkboxError('incorrect-type', {
458
+ paramName,
459
+ expectedType,
460
+ moduleName,
461
+ className,
462
+ funcName
463
+ });
464
+ }
465
+ };
466
+
467
+ const isInstance = (object, expectedClass, {
468
+ moduleName,
469
+ className,
470
+ funcName,
471
+ paramName,
472
+ isReturnValueProblem
473
+ }) => {
474
+ if (!(object instanceof expectedClass)) {
475
+ throw new WorkboxError('incorrect-class', {
476
+ paramName,
477
+ expectedClass,
478
+ moduleName,
479
+ className,
480
+ funcName,
481
+ isReturnValueProblem
482
+ });
483
+ }
484
+ };
485
+
486
+ const isOneOf = (value, validValues, {
487
+ paramName
488
+ }) => {
489
+ if (!validValues.includes(value)) {
490
+ throw new WorkboxError('invalid-value', {
491
+ paramName,
492
+ value,
493
+ validValueDescription: `Valid values are ${JSON.stringify(validValues)}.`
494
+ });
495
+ }
496
+ };
497
+
498
+ const isArrayOfClass = (value, expectedClass, {
499
+ moduleName,
500
+ className,
501
+ funcName,
502
+ paramName
503
+ }) => {
504
+ const error = new WorkboxError('not-array-of-class', {
505
+ value,
506
+ expectedClass,
507
+ moduleName,
508
+ className,
509
+ funcName,
510
+ paramName
511
+ });
512
+
513
+ if (!Array.isArray(value)) {
514
+ throw error;
515
+ }
516
+
517
+ for (let item of value) {
518
+ if (!(item instanceof expectedClass)) {
519
+ throw error;
520
+ }
521
+ }
522
+ };
523
+
524
+ const finalAssertExports = {
525
+ hasMethod,
526
+ isArray,
527
+ isInstance,
528
+ isOneOf,
529
+ isSWEnv,
530
+ isType,
531
+ isArrayOfClass
532
+ };
533
+
534
+ /*
535
+ Copyright 2018 Google LLC
536
+
537
+ Use of this source code is governed by an MIT-style
538
+ license that can be found in the LICENSE file or at
539
+ https://opensource.org/licenses/MIT.
540
+ */
541
+ const callbacks = new Set();
542
+ /**
543
+ * Adds a function to the set of callbacks that will be executed when there's
544
+ * a quota error.
545
+ *
546
+ * @param {Function} callback
547
+ * @memberof workbox.core
548
+ */
549
+
550
+ function registerQuotaErrorCallback(callback) {
551
+ {
552
+ finalAssertExports.isType(callback, 'function', {
553
+ moduleName: 'workbox-core',
554
+ funcName: 'register',
555
+ paramName: 'callback'
556
+ });
557
+ }
558
+
559
+ callbacks.add(callback);
560
+
561
+ {
562
+ logger.log('Registered a callback to respond to quota errors.', callback);
563
+ }
564
+ }
565
+ /**
566
+ * Runs all of the callback functions, one at a time sequentially, in the order
567
+ * in which they were registered.
568
+ *
569
+ * @memberof workbox.core
570
+ * @private
571
+ */
572
+
573
+
574
+ async function executeQuotaErrorCallbacks() {
575
+ {
576
+ logger.log(`About to run ${callbacks.size} callbacks to clean up caches.`);
577
+ }
578
+
579
+ for (const callback of callbacks) {
580
+ await callback();
581
+
582
+ {
583
+ logger.log(callback, 'is complete.');
584
+ }
585
+ }
586
+
587
+ {
588
+ logger.log('Finished running callbacks.');
589
+ }
590
+ }
591
+
592
+ /*
593
+ Copyright 2019 Google LLC
594
+
595
+ Use of this source code is governed by an MIT-style
596
+ license that can be found in the LICENSE file or at
597
+ https://opensource.org/licenses/MIT.
598
+ */
599
+
600
+ /*
601
+ Copyright 2018 Google LLC
602
+
603
+ Use of this source code is governed by an MIT-style
604
+ license that can be found in the LICENSE file or at
605
+ https://opensource.org/licenses/MIT.
606
+ */
607
+ /**
608
+ * A class that wraps common IndexedDB functionality in a promise-based API.
609
+ * It exposes all the underlying power and functionality of IndexedDB, but
610
+ * wraps the most commonly used features in a way that's much simpler to use.
611
+ *
612
+ * @private
613
+ */
614
+
615
+ class DBWrapper {
616
+ /**
617
+ * @param {string} name
618
+ * @param {number} version
619
+ * @param {Object=} [callback]
620
+ * @param {!Function} [callbacks.onupgradeneeded]
621
+ * @param {!Function} [callbacks.onversionchange] Defaults to
622
+ * DBWrapper.prototype._onversionchange when not specified.
623
+ */
624
+ constructor(name, version, {
625
+ onupgradeneeded,
626
+ onversionchange = this._onversionchange
627
+ } = {}) {
628
+ this._name = name;
629
+ this._version = version;
630
+ this._onupgradeneeded = onupgradeneeded;
631
+ this._onversionchange = onversionchange; // If this is null, it means the database isn't open.
632
+
633
+ this._db = null;
634
+ }
635
+ /**
636
+ * Returns the IDBDatabase instance (not normally needed).
637
+ */
638
+
639
+
640
+ get db() {
641
+ return this._db;
642
+ }
643
+ /**
644
+ * Opens a connected to an IDBDatabase, invokes any onupgradedneeded
645
+ * callback, and added an onversionchange callback to the database.
646
+ *
647
+ * @return {IDBDatabase}
648
+ */
649
+
650
+
651
+ async open() {
652
+ if (this._db) return;
653
+ this._db = await new Promise((resolve, reject) => {
654
+ // This flag is flipped to true if the timeout callback runs prior
655
+ // to the request failing or succeeding. Note: we use a timeout instead
656
+ // of an onblocked handler since there are cases where onblocked will
657
+ // never never run. A timeout better handles all possible scenarios:
658
+ // https://github.com/w3c/IndexedDB/issues/223
659
+ let openRequestTimedOut = false;
660
+ setTimeout(() => {
661
+ openRequestTimedOut = true;
662
+ reject(new Error('The open request was blocked and timed out'));
663
+ }, this.OPEN_TIMEOUT);
664
+ const openRequest = indexedDB.open(this._name, this._version);
665
+
666
+ openRequest.onerror = () => reject(openRequest.error);
667
+
668
+ openRequest.onupgradeneeded = evt => {
669
+ if (openRequestTimedOut) {
670
+ openRequest.transaction.abort();
671
+ evt.target.result.close();
672
+ } else if (this._onupgradeneeded) {
673
+ this._onupgradeneeded(evt);
674
+ }
675
+ };
676
+
677
+ openRequest.onsuccess = ({
678
+ target
679
+ }) => {
680
+ const db = target.result;
681
+
682
+ if (openRequestTimedOut) {
683
+ db.close();
684
+ } else {
685
+ db.onversionchange = this._onversionchange.bind(this);
686
+ resolve(db);
687
+ }
688
+ };
689
+ });
690
+ return this;
691
+ }
692
+ /**
693
+ * Polyfills the native `getKey()` method. Note, this is overridden at
694
+ * runtime if the browser supports the native method.
695
+ *
696
+ * @param {string} storeName
697
+ * @param {*} query
698
+ * @return {Array}
699
+ */
700
+
701
+
702
+ async getKey(storeName, query) {
703
+ return (await this.getAllKeys(storeName, query, 1))[0];
704
+ }
705
+ /**
706
+ * Polyfills the native `getAll()` method. Note, this is overridden at
707
+ * runtime if the browser supports the native method.
708
+ *
709
+ * @param {string} storeName
710
+ * @param {*} query
711
+ * @param {number} count
712
+ * @return {Array}
713
+ */
714
+
715
+
716
+ async getAll(storeName, query, count) {
717
+ return await this.getAllMatching(storeName, {
718
+ query,
719
+ count
720
+ });
721
+ }
722
+ /**
723
+ * Polyfills the native `getAllKeys()` method. Note, this is overridden at
724
+ * runtime if the browser supports the native method.
725
+ *
726
+ * @param {string} storeName
727
+ * @param {*} query
728
+ * @param {number} count
729
+ * @return {Array}
730
+ */
731
+
732
+
733
+ async getAllKeys(storeName, query, count) {
734
+ return (await this.getAllMatching(storeName, {
735
+ query,
736
+ count,
737
+ includeKeys: true
738
+ })).map(({
739
+ key
740
+ }) => key);
741
+ }
742
+ /**
743
+ * Supports flexible lookup in an object store by specifying an index,
744
+ * query, direction, and count. This method returns an array of objects
745
+ * with the signature .
746
+ *
747
+ * @param {string} storeName
748
+ * @param {Object} [opts]
749
+ * @param {string} [opts.index] The index to use (if specified).
750
+ * @param {*} [opts.query]
751
+ * @param {IDBCursorDirection} [opts.direction]
752
+ * @param {number} [opts.count] The max number of results to return.
753
+ * @param {boolean} [opts.includeKeys] When true, the structure of the
754
+ * returned objects is changed from an array of values to an array of
755
+ * objects in the form {key, primaryKey, value}.
756
+ * @return {Array}
757
+ */
758
+
759
+
760
+ async getAllMatching(storeName, {
761
+ index,
762
+ query = null,
763
+ // IE errors if query === `undefined`.
764
+ direction = 'next',
765
+ count,
766
+ includeKeys
767
+ } = {}) {
768
+ return await this.transaction([storeName], 'readonly', (txn, done) => {
769
+ const store = txn.objectStore(storeName);
770
+ const target = index ? store.index(index) : store;
771
+ const results = [];
772
+
773
+ target.openCursor(query, direction).onsuccess = ({
774
+ target
775
+ }) => {
776
+ const cursor = target.result;
777
+
778
+ if (cursor) {
779
+ const {
780
+ primaryKey,
781
+ key,
782
+ value
783
+ } = cursor;
784
+ results.push(includeKeys ? {
785
+ primaryKey,
786
+ key,
787
+ value
788
+ } : value);
789
+
790
+ if (count && results.length >= count) {
791
+ done(results);
792
+ } else {
793
+ cursor.continue();
794
+ }
795
+ } else {
796
+ done(results);
797
+ }
798
+ };
799
+ });
800
+ }
801
+ /**
802
+ * Accepts a list of stores, a transaction type, and a callback and
803
+ * performs a transaction. A promise is returned that resolves to whatever
804
+ * value the callback chooses. The callback holds all the transaction logic
805
+ * and is invoked with two arguments:
806
+ * 1. The IDBTransaction object
807
+ * 2. A `done` function, that's used to resolve the promise when
808
+ * when the transaction is done, if passed a value, the promise is
809
+ * resolved to that value.
810
+ *
811
+ * @param {Array<string>} storeNames An array of object store names
812
+ * involved in the transaction.
813
+ * @param {string} type Can be `readonly` or `readwrite`.
814
+ * @param {!Function} callback
815
+ * @return {*} The result of the transaction ran by the callback.
816
+ */
817
+
818
+
819
+ async transaction(storeNames, type, callback) {
820
+ await this.open();
821
+ return await new Promise((resolve, reject) => {
822
+ const txn = this._db.transaction(storeNames, type);
823
+
824
+ txn.onabort = ({
825
+ target
826
+ }) => reject(target.error);
827
+
828
+ txn.oncomplete = () => resolve();
829
+
830
+ callback(txn, value => resolve(value));
831
+ });
832
+ }
833
+ /**
834
+ * Delegates async to a native IDBObjectStore method.
835
+ *
836
+ * @param {string} method The method name.
837
+ * @param {string} storeName The object store name.
838
+ * @param {string} type Can be `readonly` or `readwrite`.
839
+ * @param {...*} args The list of args to pass to the native method.
840
+ * @return {*} The result of the transaction.
841
+ */
842
+
843
+
844
+ async _call(method, storeName, type, ...args) {
845
+ const callback = (txn, done) => {
846
+ txn.objectStore(storeName)[method](...args).onsuccess = ({
847
+ target
848
+ }) => {
849
+ done(target.result);
850
+ };
851
+ };
852
+
853
+ return await this.transaction([storeName], type, callback);
854
+ }
855
+ /**
856
+ * The default onversionchange handler, which closes the database so other
857
+ * connections can open without being blocked.
858
+ */
859
+
860
+
861
+ _onversionchange() {
862
+ this.close();
863
+ }
864
+ /**
865
+ * Closes the connection opened by `DBWrapper.open()`. Generally this method
866
+ * doesn't need to be called since:
867
+ * 1. It's usually better to keep a connection open since opening
868
+ * a new connection is somewhat slow.
869
+ * 2. Connections are automatically closed when the reference is
870
+ * garbage collected.
871
+ * The primary use case for needing to close a connection is when another
872
+ * reference (typically in another tab) needs to upgrade it and would be
873
+ * blocked by the current, open connection.
874
+ */
875
+
876
+
877
+ close() {
878
+ if (this._db) {
879
+ this._db.close();
880
+
881
+ this._db = null;
882
+ }
883
+ }
884
+
885
+ } // Exposed to let users modify the default timeout on a per-instance
886
+ // or global basis.
887
+
888
+ DBWrapper.prototype.OPEN_TIMEOUT = 2000; // Wrap native IDBObjectStore methods according to their mode.
889
+
890
+ const methodsToWrap = {
891
+ 'readonly': ['get', 'count', 'getKey', 'getAll', 'getAllKeys'],
892
+ 'readwrite': ['add', 'put', 'clear', 'delete']
893
+ };
894
+
895
+ for (const [mode, methods] of Object.entries(methodsToWrap)) {
896
+ for (const method of methods) {
897
+ if (method in IDBObjectStore.prototype) {
898
+ // Don't use arrow functions here since we're outside of the class.
899
+ DBWrapper.prototype[method] = async function (storeName, ...args) {
900
+ return await this._call(method, storeName, mode, ...args);
901
+ };
902
+ }
903
+ }
904
+ }
905
+
906
+ /*
907
+ Copyright 2018 Google LLC
908
+
909
+ Use of this source code is governed by an MIT-style
910
+ license that can be found in the LICENSE file or at
911
+ https://opensource.org/licenses/MIT.
912
+ */
913
+ /**
914
+ * Deletes the database.
915
+ * Note: this is exported separately from the DBWrapper module because most
916
+ * usages of IndexedDB in workbox dont need deleting, and this way it can be
917
+ * reused in tests to delete databases without creating DBWrapper instances.
918
+ *
919
+ * @param {string} name The database name.
920
+ * @private
921
+ */
922
+
923
+ const deleteDatabase = async name => {
924
+ await new Promise((resolve, reject) => {
925
+ const request = indexedDB.deleteDatabase(name);
926
+
927
+ request.onerror = ({
928
+ target
929
+ }) => {
930
+ reject(target.error);
931
+ };
932
+
933
+ request.onblocked = () => {
934
+ reject(new Error('Delete blocked'));
935
+ };
936
+
937
+ request.onsuccess = () => {
938
+ resolve();
939
+ };
940
+ });
941
+ };
942
+
943
+ /*
944
+ Copyright 2018 Google LLC
945
+
946
+ Use of this source code is governed by an MIT-style
947
+ license that can be found in the LICENSE file or at
948
+ https://opensource.org/licenses/MIT.
949
+ */
950
+ const _cacheNameDetails = {
951
+ googleAnalytics: 'googleAnalytics',
952
+ precache: 'precache-v2',
953
+ prefix: 'workbox',
954
+ runtime: 'runtime',
955
+ suffix: self.registration.scope
956
+ };
957
+
958
+ const _createCacheName = cacheName => {
959
+ return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix].filter(value => value.length > 0).join('-');
960
+ };
961
+
962
+ const cacheNames = {
963
+ updateDetails: details => {
964
+ Object.keys(_cacheNameDetails).forEach(key => {
965
+ if (typeof details[key] !== 'undefined') {
966
+ _cacheNameDetails[key] = details[key];
967
+ }
968
+ });
969
+ },
970
+ getGoogleAnalyticsName: userCacheName => {
971
+ return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics);
972
+ },
973
+ getPrecacheName: userCacheName => {
974
+ return userCacheName || _createCacheName(_cacheNameDetails.precache);
975
+ },
976
+ getRuntimeName: userCacheName => {
977
+ return userCacheName || _createCacheName(_cacheNameDetails.runtime);
978
+ }
979
+ };
980
+
981
+ /*
982
+ Copyright 2018 Google LLC
983
+
984
+ Use of this source code is governed by an MIT-style
985
+ license that can be found in the LICENSE file or at
986
+ https://opensource.org/licenses/MIT.
987
+ */
988
+ const pluginEvents = {
989
+ CACHE_DID_UPDATE: 'cacheDidUpdate',
990
+ CACHE_WILL_UPDATE: 'cacheWillUpdate',
991
+ CACHED_RESPONSE_WILL_BE_USED: 'cachedResponseWillBeUsed',
992
+ FETCH_DID_FAIL: 'fetchDidFail',
993
+ FETCH_DID_SUCCEED: 'fetchDidSucceed',
994
+ REQUEST_WILL_FETCH: 'requestWillFetch'
995
+ };
996
+
997
+ /*
998
+ Copyright 2018 Google LLC
999
+
1000
+ Use of this source code is governed by an MIT-style
1001
+ license that can be found in the LICENSE file or at
1002
+ https://opensource.org/licenses/MIT.
1003
+ */
1004
+ const pluginUtils = {
1005
+ filter: (plugins, callbackName) => {
1006
+ return plugins.filter(plugin => callbackName in plugin);
1007
+ }
1008
+ };
1009
+
1010
+ /*
1011
+ Copyright 2018 Google LLC
1012
+
1013
+ Use of this source code is governed by an MIT-style
1014
+ license that can be found in the LICENSE file or at
1015
+ https://opensource.org/licenses/MIT.
1016
+ */
1017
+
1018
+ const getFriendlyURL = url => {
1019
+ const urlObj = new URL(url, location);
1020
+
1021
+ if (urlObj.origin === location.origin) {
1022
+ return urlObj.pathname;
1023
+ }
1024
+
1025
+ return urlObj.href;
1026
+ };
1027
+
1028
+ /*
1029
+ Copyright 2018 Google LLC
1030
+
1031
+ Use of this source code is governed by an MIT-style
1032
+ license that can be found in the LICENSE file or at
1033
+ https://opensource.org/licenses/MIT.
1034
+ */
1035
+ /**
1036
+ * Wrapper around cache.put().
1037
+ *
1038
+ * Will call `cacheDidUpdate` on plugins if the cache was updated, using
1039
+ * `matchOptions` when determining what the old entry is.
1040
+ *
1041
+ * @param {Object} options
1042
+ * @param {string} options.cacheName
1043
+ * @param {Request} options.request
1044
+ * @param {Response} options.response
1045
+ * @param {Event} [options.event]
1046
+ * @param {Array<Object>} [options.plugins=[]]
1047
+ * @param {Object} [options.matchOptions]
1048
+ *
1049
+ * @private
1050
+ * @memberof module:workbox-core
1051
+ */
1052
+
1053
+ const putWrapper = async ({
1054
+ cacheName,
1055
+ request,
1056
+ response,
1057
+ event,
1058
+ plugins = [],
1059
+ matchOptions
1060
+ } = {}) => {
1061
+ if (!response) {
1062
+ {
1063
+ logger.error(`Cannot cache non-existent response for ` + `'${getFriendlyURL(request.url)}'.`);
1064
+ }
1065
+
1066
+ throw new WorkboxError('cache-put-with-no-response', {
1067
+ url: getFriendlyURL(request.url)
1068
+ });
1069
+ }
1070
+
1071
+ let responseToCache = await _isResponseSafeToCache({
1072
+ request,
1073
+ response,
1074
+ event,
1075
+ plugins
1076
+ });
1077
+
1078
+ if (!responseToCache) {
1079
+ {
1080
+ logger.debug(`Response '${getFriendlyURL(request.url)}' will not be ` + `cached.`, responseToCache);
1081
+ }
1082
+
1083
+ return;
1084
+ }
1085
+
1086
+ {
1087
+ if (responseToCache.method && responseToCache.method !== 'GET') {
1088
+ throw new WorkboxError('attempt-to-cache-non-get-request', {
1089
+ url: getFriendlyURL(request.url),
1090
+ method: responseToCache.method
1091
+ });
1092
+ }
1093
+ }
1094
+
1095
+ const cache = await caches.open(cacheName);
1096
+ const updatePlugins = pluginUtils.filter(plugins, pluginEvents.CACHE_DID_UPDATE);
1097
+ let oldResponse = updatePlugins.length > 0 ? await matchWrapper({
1098
+ cacheName,
1099
+ request,
1100
+ matchOptions
1101
+ }) : null;
1102
+
1103
+ {
1104
+ logger.debug(`Updating the '${cacheName}' cache with a new Response for ` + `${getFriendlyURL(request.url)}.`);
1105
+ }
1106
+
1107
+ try {
1108
+ await cache.put(request, responseToCache);
1109
+ } catch (error) {
1110
+ // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError
1111
+ if (error.name === 'QuotaExceededError') {
1112
+ await executeQuotaErrorCallbacks();
1113
+ }
1114
+
1115
+ throw error;
1116
+ }
1117
+
1118
+ for (let plugin of updatePlugins) {
1119
+ await plugin[pluginEvents.CACHE_DID_UPDATE].call(plugin, {
1120
+ cacheName,
1121
+ request,
1122
+ event,
1123
+ oldResponse,
1124
+ newResponse: responseToCache
1125
+ });
1126
+ }
1127
+ };
1128
+ /**
1129
+ * This is a wrapper around cache.match().
1130
+ *
1131
+ * @param {Object} options
1132
+ * @param {string} options.cacheName Name of the cache to match against.
1133
+ * @param {Request} options.request The Request that will be used to look up
1134
+ * cache entries.
1135
+ * @param {Event} [options.event] The event that propted the action.
1136
+ * @param {Object} [options.matchOptions] Options passed to cache.match().
1137
+ * @param {Array<Object>} [options.plugins=[]] Array of plugins.
1138
+ * @return {Response} A cached response if available.
1139
+ *
1140
+ * @private
1141
+ * @memberof module:workbox-core
1142
+ */
1143
+
1144
+
1145
+ const matchWrapper = async ({
1146
+ cacheName,
1147
+ request,
1148
+ event,
1149
+ matchOptions,
1150
+ plugins = []
1151
+ }) => {
1152
+ const cache = await caches.open(cacheName);
1153
+ let cachedResponse = await cache.match(request, matchOptions);
1154
+
1155
+ {
1156
+ if (cachedResponse) {
1157
+ logger.debug(`Found a cached response in '${cacheName}'.`);
1158
+ } else {
1159
+ logger.debug(`No cached response found in '${cacheName}'.`);
1160
+ }
1161
+ }
1162
+
1163
+ for (const plugin of plugins) {
1164
+ if (pluginEvents.CACHED_RESPONSE_WILL_BE_USED in plugin) {
1165
+ cachedResponse = await plugin[pluginEvents.CACHED_RESPONSE_WILL_BE_USED].call(plugin, {
1166
+ cacheName,
1167
+ request,
1168
+ event,
1169
+ matchOptions,
1170
+ cachedResponse
1171
+ });
1172
+
1173
+ {
1174
+ if (cachedResponse) {
1175
+ finalAssertExports.isInstance(cachedResponse, Response, {
1176
+ moduleName: 'Plugin',
1177
+ funcName: pluginEvents.CACHED_RESPONSE_WILL_BE_USED,
1178
+ isReturnValueProblem: true
1179
+ });
1180
+ }
1181
+ }
1182
+ }
1183
+ }
1184
+
1185
+ return cachedResponse;
1186
+ };
1187
+ /**
1188
+ * This method will call cacheWillUpdate on the available plugins (or use
1189
+ * status === 200) to determine if the Response is safe and valid to cache.
1190
+ *
1191
+ * @param {Object} options
1192
+ * @param {Request} options.request
1193
+ * @param {Response} options.response
1194
+ * @param {Event} [options.event]
1195
+ * @param {Array<Object>} [options.plugins=[]]
1196
+ * @return {Promise<Response>}
1197
+ *
1198
+ * @private
1199
+ * @memberof module:workbox-core
1200
+ */
1201
+
1202
+
1203
+ const _isResponseSafeToCache = async ({
1204
+ request,
1205
+ response,
1206
+ event,
1207
+ plugins
1208
+ }) => {
1209
+ let responseToCache = response;
1210
+ let pluginsUsed = false;
1211
+
1212
+ for (let plugin of plugins) {
1213
+ if (pluginEvents.CACHE_WILL_UPDATE in plugin) {
1214
+ pluginsUsed = true;
1215
+ responseToCache = await plugin[pluginEvents.CACHE_WILL_UPDATE].call(plugin, {
1216
+ request,
1217
+ response: responseToCache,
1218
+ event
1219
+ });
1220
+
1221
+ {
1222
+ if (responseToCache) {
1223
+ finalAssertExports.isInstance(responseToCache, Response, {
1224
+ moduleName: 'Plugin',
1225
+ funcName: pluginEvents.CACHE_WILL_UPDATE,
1226
+ isReturnValueProblem: true
1227
+ });
1228
+ }
1229
+ }
1230
+
1231
+ if (!responseToCache) {
1232
+ break;
1233
+ }
1234
+ }
1235
+ }
1236
+
1237
+ if (!pluginsUsed) {
1238
+ {
1239
+ if (!responseToCache.status === 200) {
1240
+ if (responseToCache.status === 0) {
1241
+ logger.warn(`The response for '${request.url}' is an opaque ` + `response. The caching strategy that you're using will not ` + `cache opaque responses by default.`);
1242
+ } else {
1243
+ logger.debug(`The response for '${request.url}' returned ` + `a status code of '${response.status}' and won't be cached as a ` + `result.`);
1244
+ }
1245
+ }
1246
+ }
1247
+
1248
+ responseToCache = responseToCache.status === 200 ? responseToCache : null;
1249
+ }
1250
+
1251
+ return responseToCache ? responseToCache : null;
1252
+ };
1253
+
1254
+ const cacheWrapper = {
1255
+ put: putWrapper,
1256
+ match: matchWrapper
1257
+ };
1258
+
1259
+ /*
1260
+ Copyright 2018 Google LLC
1261
+
1262
+ Use of this source code is governed by an MIT-style
1263
+ license that can be found in the LICENSE file or at
1264
+ https://opensource.org/licenses/MIT.
1265
+ */
1266
+ /**
1267
+ * Wrapper around the fetch API.
1268
+ *
1269
+ * Will call requestWillFetch on available plugins.
1270
+ *
1271
+ * @param {Object} options
1272
+ * @param {Request|string} options.request
1273
+ * @param {Object} [options.fetchOptions]
1274
+ * @param {Event} [options.event]
1275
+ * @param {Array<Object>} [options.plugins=[]]
1276
+ * @return {Promise<Response>}
1277
+ *
1278
+ * @private
1279
+ * @memberof module:workbox-core
1280
+ */
1281
+
1282
+ const wrappedFetch = async ({
1283
+ request,
1284
+ fetchOptions,
1285
+ event,
1286
+ plugins = []
1287
+ }) => {
1288
+ // We *should* be able to call `await event.preloadResponse` even if it's
1289
+ // undefined, but for some reason, doing so leads to errors in our Node unit
1290
+ // tests. To work around that, explicitly check preloadResponse's value first.
1291
+ if (event && event.preloadResponse) {
1292
+ const possiblePreloadResponse = await event.preloadResponse;
1293
+
1294
+ if (possiblePreloadResponse) {
1295
+ {
1296
+ logger.log(`Using a preloaded navigation response for ` + `'${getFriendlyURL(request.url)}'`);
1297
+ }
1298
+
1299
+ return possiblePreloadResponse;
1300
+ }
1301
+ }
1302
+
1303
+ if (typeof request === 'string') {
1304
+ request = new Request(request);
1305
+ }
1306
+
1307
+ {
1308
+ finalAssertExports.isInstance(request, Request, {
1309
+ paramName: request,
1310
+ expectedClass: 'Request',
1311
+ moduleName: 'workbox-core',
1312
+ className: 'fetchWrapper',
1313
+ funcName: 'wrappedFetch'
1314
+ });
1315
+ }
1316
+
1317
+ const failedFetchPlugins = pluginUtils.filter(plugins, pluginEvents.FETCH_DID_FAIL); // If there is a fetchDidFail plugin, we need to save a clone of the
1318
+ // original request before it's either modified by a requestWillFetch
1319
+ // plugin or before the original request's body is consumed via fetch().
1320
+
1321
+ const originalRequest = failedFetchPlugins.length > 0 ? request.clone() : null;
1322
+
1323
+ try {
1324
+ for (let plugin of plugins) {
1325
+ if (pluginEvents.REQUEST_WILL_FETCH in plugin) {
1326
+ request = await plugin[pluginEvents.REQUEST_WILL_FETCH].call(plugin, {
1327
+ request: request.clone(),
1328
+ event
1329
+ });
1330
+
1331
+ {
1332
+ if (request) {
1333
+ finalAssertExports.isInstance(request, Request, {
1334
+ moduleName: 'Plugin',
1335
+ funcName: pluginEvents.CACHED_RESPONSE_WILL_BE_USED,
1336
+ isReturnValueProblem: true
1337
+ });
1338
+ }
1339
+ }
1340
+ }
1341
+ }
1342
+ } catch (err) {
1343
+ throw new WorkboxError('plugin-error-request-will-fetch', {
1344
+ thrownError: err
1345
+ });
1346
+ } // The request can be altered by plugins with `requestWillFetch` making
1347
+ // the original request (Most likely from a `fetch` event) to be different
1348
+ // to the Request we make. Pass both to `fetchDidFail` to aid debugging.
1349
+
1350
+
1351
+ let pluginFilteredRequest = request.clone();
1352
+
1353
+ try {
1354
+ let fetchResponse; // See https://github.com/GoogleChrome/workbox/issues/1796
1355
+
1356
+ if (request.mode === 'navigate') {
1357
+ fetchResponse = await fetch(request);
1358
+ } else {
1359
+ fetchResponse = await fetch(request, fetchOptions);
1360
+ }
1361
+
1362
+ {
1363
+ logger.debug(`Network request for ` + `'${getFriendlyURL(request.url)}' returned a response with ` + `status '${fetchResponse.status}'.`);
1364
+ }
1365
+
1366
+ for (const plugin of plugins) {
1367
+ if (pluginEvents.FETCH_DID_SUCCEED in plugin) {
1368
+ fetchResponse = await plugin[pluginEvents.FETCH_DID_SUCCEED].call(plugin, {
1369
+ event,
1370
+ request: pluginFilteredRequest,
1371
+ response: fetchResponse
1372
+ });
1373
+
1374
+ {
1375
+ if (fetchResponse) {
1376
+ finalAssertExports.isInstance(fetchResponse, Response, {
1377
+ moduleName: 'Plugin',
1378
+ funcName: pluginEvents.FETCH_DID_SUCCEED,
1379
+ isReturnValueProblem: true
1380
+ });
1381
+ }
1382
+ }
1383
+ }
1384
+ }
1385
+
1386
+ return fetchResponse;
1387
+ } catch (error) {
1388
+ {
1389
+ logger.error(`Network request for ` + `'${getFriendlyURL(request.url)}' threw an error.`, error);
1390
+ }
1391
+
1392
+ for (const plugin of failedFetchPlugins) {
1393
+ await plugin[pluginEvents.FETCH_DID_FAIL].call(plugin, {
1394
+ error,
1395
+ event,
1396
+ originalRequest: originalRequest.clone(),
1397
+ request: pluginFilteredRequest.clone()
1398
+ });
1399
+ }
1400
+
1401
+ throw error;
1402
+ }
1403
+ };
1404
+
1405
+ const fetchWrapper = {
1406
+ fetch: wrappedFetch
1407
+ };
1408
+
1409
+ /*
1410
+ Copyright 2018 Google LLC
1411
+
1412
+ Use of this source code is governed by an MIT-style
1413
+ license that can be found in the LICENSE file or at
1414
+ https://opensource.org/licenses/MIT.
1415
+ */
1416
+
1417
+ var _private = /*#__PURE__*/Object.freeze({
1418
+ DBWrapper: DBWrapper,
1419
+ deleteDatabase: deleteDatabase,
1420
+ WorkboxError: WorkboxError,
1421
+ assert: finalAssertExports,
1422
+ cacheNames: cacheNames,
1423
+ cacheWrapper: cacheWrapper,
1424
+ fetchWrapper: fetchWrapper,
1425
+ getFriendlyURL: getFriendlyURL,
1426
+ logger: logger
1427
+ });
1428
+
1429
+ /*
1430
+ Copyright 2019 Google LLC
1431
+
1432
+ Use of this source code is governed by an MIT-style
1433
+ license that can be found in the LICENSE file or at
1434
+ https://opensource.org/licenses/MIT.
1435
+ */
1436
+ /**
1437
+ * Claim any currently available clients once the service worker
1438
+ * becomes active. This is normally used in conjunction with `skipWaiting()`.
1439
+ *
1440
+ * @alias workbox.core.clientsClaim
1441
+ */
1442
+
1443
+ const clientsClaim = () => {
1444
+ addEventListener('activate', () => clients.claim());
1445
+ };
1446
+
1447
+ /*
1448
+ Copyright 2019 Google LLC
1449
+
1450
+ Use of this source code is governed by an MIT-style
1451
+ license that can be found in the LICENSE file or at
1452
+ https://opensource.org/licenses/MIT.
1453
+ */
1454
+ /**
1455
+ * Get the current cache names used by Workbox.
1456
+ *
1457
+ * `cacheNames.precache` is used for precached assets,
1458
+ * `cacheNames.googleAnalytics` is used by `workbox-google-analytics` to
1459
+ * store `analytics.js`, and `cacheNames.runtime` is used for everything else.
1460
+ *
1461
+ * @return {Object} An object with `precache`, `runtime`, and
1462
+ * `googleAnalytics` cache names.
1463
+ *
1464
+ * @alias workbox.core.cacheNames
1465
+ */
1466
+
1467
+ const cacheNames$1 = {
1468
+ get googleAnalytics() {
1469
+ return cacheNames.getGoogleAnalyticsName();
1470
+ },
1471
+
1472
+ get precache() {
1473
+ return cacheNames.getPrecacheName();
1474
+ },
1475
+
1476
+ get runtime() {
1477
+ return cacheNames.getRuntimeName();
1478
+ }
1479
+
1480
+ };
1481
+
1482
+ /*
1483
+ Copyright 2019 Google LLC
1484
+
1485
+ Use of this source code is governed by an MIT-style
1486
+ license that can be found in the LICENSE file or at
1487
+ https://opensource.org/licenses/MIT.
1488
+ */
1489
+ /**
1490
+ * Modifies the default cache names used by the Workbox packages.
1491
+ * Cache names are generated as `<prefix>-<Cache Name>-<suffix>`.
1492
+ *
1493
+ * @param {Object} details
1494
+ * @param {Object} [details.prefix] The string to add to the beginning of
1495
+ * the precache and runtime cache names.
1496
+ * @param {Object} [details.suffix] The string to add to the end of
1497
+ * the precache and runtime cache names.
1498
+ * @param {Object} [details.precache] The cache name to use for precache
1499
+ * caching.
1500
+ * @param {Object} [details.runtime] The cache name to use for runtime caching.
1501
+ * @param {Object} [details.googleAnalytics] The cache name to use for
1502
+ * `workbox-google-analytics` caching.
1503
+ *
1504
+ * @alias workbox.core.setCacheNameDetails
1505
+ */
1506
+
1507
+ const setCacheNameDetails = details => {
1508
+ {
1509
+ Object.keys(details).forEach(key => {
1510
+ finalAssertExports.isType(details[key], 'string', {
1511
+ moduleName: 'workbox-core',
1512
+ funcName: 'setCacheNameDetails',
1513
+ paramName: `details.${key}`
1514
+ });
1515
+ });
1516
+
1517
+ if ('precache' in details && details.precache.length === 0) {
1518
+ throw new WorkboxError('invalid-cache-name', {
1519
+ cacheNameId: 'precache',
1520
+ value: details.precache
1521
+ });
1522
+ }
1523
+
1524
+ if ('runtime' in details && details.runtime.length === 0) {
1525
+ throw new WorkboxError('invalid-cache-name', {
1526
+ cacheNameId: 'runtime',
1527
+ value: details.runtime
1528
+ });
1529
+ }
1530
+
1531
+ if ('googleAnalytics' in details && details.googleAnalytics.length === 0) {
1532
+ throw new WorkboxError('invalid-cache-name', {
1533
+ cacheNameId: 'googleAnalytics',
1534
+ value: details.googleAnalytics
1535
+ });
1536
+ }
1537
+ }
1538
+
1539
+ cacheNames.updateDetails(details);
1540
+ };
1541
+
1542
+ /*
1543
+ Copyright 2019 Google LLC
1544
+
1545
+ Use of this source code is governed by an MIT-style
1546
+ license that can be found in the LICENSE file or at
1547
+ https://opensource.org/licenses/MIT.
1548
+ */
1549
+ /**
1550
+ * Force a service worker to become active, instead of waiting. This is
1551
+ * normally used in conjunction with `clientsClaim()`.
1552
+ *
1553
+ * @alias workbox.core.skipWaiting
1554
+ */
1555
+
1556
+ const skipWaiting = () => {
1557
+ // We need to explicitly call `self.skipWaiting()` here because we're
1558
+ // shadowing `skipWaiting` with this local function.
1559
+ addEventListener('install', () => self.skipWaiting());
1560
+ };
1561
+
1562
+ /*
1563
+ Copyright 2018 Google LLC
1564
+
1565
+ Use of this source code is governed by an MIT-style
1566
+ license that can be found in the LICENSE file or at
1567
+ https://opensource.org/licenses/MIT.
1568
+ */
1569
+
1570
+ try {
1571
+ self.workbox.v = self.workbox.v || {};
1572
+ } catch (errer) {} // NOOP
1573
+
1574
+ exports._private = _private;
1575
+ exports.clientsClaim = clientsClaim;
1576
+ exports.cacheNames = cacheNames$1;
1577
+ exports.registerQuotaErrorCallback = registerQuotaErrorCallback;
1578
+ exports.setCacheNameDetails = setCacheNameDetails;
1579
+ exports.skipWaiting = skipWaiting;
1580
+
1581
+ return exports;
1582
+
1583
+ }({}));
1584
+ //# sourceMappingURL=workbox-core.dev.js.map