@serwist/sw 9.0.0-preview.17 → 9.0.0-preview.18
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.
- package/dist/{Serwist.d.ts → abstractions/Serwist.d.ts} +6 -15
- package/dist/abstractions/Serwist.d.ts.map +1 -0
- package/dist/abstractions/disableDevLogs.d.ts.map +1 -0
- package/dist/{fallbacks.d.ts → abstractions/fallbacks.d.ts} +2 -2
- package/dist/abstractions/fallbacks.d.ts.map +1 -0
- package/dist/{handlePrecaching.d.ts → abstractions/handlePrecaching.d.ts} +1 -1
- package/dist/abstractions/handlePrecaching.d.ts.map +1 -0
- package/dist/abstractions/installSerwist.d.ts.map +1 -0
- package/dist/abstractions/registerRuntimeCaching.d.ts.map +1 -0
- package/dist/{types.d.ts → abstractions/types.d.ts} +1 -1
- package/dist/abstractions/types.d.ts.map +1 -0
- package/dist/chunks/NavigationRoute.js +54 -0
- package/dist/chunks/NetworkOnly.js +193 -0
- package/dist/chunks/PrecacheFallbackPlugin.js +573 -0
- package/dist/chunks/Strategy.js +410 -0
- package/dist/chunks/getOrCreatePrecacheController.js +429 -0
- package/dist/chunks/precacheAndRoute.js +112 -0
- package/dist/chunks/registerRoute.js +408 -0
- package/dist/index.d.ts +8 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -9
- package/dist/index.plugins.d.ts +40 -11
- package/dist/index.plugins.d.ts.map +1 -1
- package/dist/index.plugins.js +671 -5
- package/dist/index.precaching.d.ts +24 -0
- package/dist/index.precaching.d.ts.map +1 -0
- package/dist/index.precaching.js +24 -0
- package/dist/index.routing.d.ts +13 -0
- package/dist/index.routing.d.ts.map +1 -0
- package/dist/index.routing.js +21 -0
- package/dist/index.strategies.d.ts +19 -2
- package/dist/index.strategies.d.ts.map +1 -1
- package/dist/index.strategies.js +146 -1
- package/dist/plugins/backgroundSync/BackgroundSyncPlugin.d.ts +23 -0
- package/dist/plugins/backgroundSync/BackgroundSyncPlugin.d.ts.map +1 -0
- package/dist/plugins/backgroundSync/Queue.d.ts +166 -0
- package/dist/plugins/backgroundSync/Queue.d.ts.map +1 -0
- package/dist/plugins/backgroundSync/QueueDb.d.ts +90 -0
- package/dist/plugins/backgroundSync/QueueDb.d.ts.map +1 -0
- package/dist/plugins/backgroundSync/QueueStore.d.ts +75 -0
- package/dist/plugins/backgroundSync/QueueStore.d.ts.map +1 -0
- package/dist/plugins/backgroundSync/StorableRequest.d.ts +51 -0
- package/dist/plugins/backgroundSync/StorableRequest.d.ts.map +1 -0
- package/dist/plugins/broadcastUpdate/BroadcastCacheUpdate.d.ts +45 -0
- package/dist/plugins/broadcastUpdate/BroadcastCacheUpdate.d.ts.map +1 -0
- package/dist/plugins/broadcastUpdate/BroadcastUpdatePlugin.d.ts +27 -0
- package/dist/plugins/broadcastUpdate/BroadcastUpdatePlugin.d.ts.map +1 -0
- package/dist/plugins/broadcastUpdate/constants.d.ts +5 -0
- package/dist/plugins/broadcastUpdate/constants.d.ts.map +1 -0
- package/dist/plugins/broadcastUpdate/responsesAreSame.d.ts +11 -0
- package/dist/plugins/broadcastUpdate/responsesAreSame.d.ts.map +1 -0
- package/dist/plugins/broadcastUpdate/types.d.ts +34 -0
- package/dist/plugins/broadcastUpdate/types.d.ts.map +1 -0
- package/dist/plugins/cacheableResponse/CacheableResponse.d.ts +40 -0
- package/dist/plugins/cacheableResponse/CacheableResponse.d.ts.map +1 -0
- package/dist/plugins/cacheableResponse/CacheableResponsePlugin.d.ts +27 -0
- package/dist/plugins/cacheableResponse/CacheableResponsePlugin.d.ts.map +1 -0
- package/dist/plugins/expiration/CacheExpiration.d.ts +66 -0
- package/dist/plugins/expiration/CacheExpiration.d.ts.map +1 -0
- package/dist/plugins/expiration/ExpirationPlugin.d.ts +116 -0
- package/dist/plugins/expiration/ExpirationPlugin.d.ts.map +1 -0
- package/dist/plugins/expiration/models/CacheTimestampsModel.d.ts +73 -0
- package/dist/plugins/expiration/models/CacheTimestampsModel.d.ts.map +1 -0
- package/dist/plugins/googleAnalytics/constants.d.ts +10 -0
- package/dist/plugins/googleAnalytics/constants.d.ts.map +1 -0
- package/dist/plugins/googleAnalytics/initialize.d.ts +26 -0
- package/dist/plugins/googleAnalytics/initialize.d.ts.map +1 -0
- package/dist/plugins/precaching/PrecacheFallbackPlugin.d.ts +54 -0
- package/dist/plugins/precaching/PrecacheFallbackPlugin.d.ts.map +1 -0
- package/dist/plugins/rangeRequests/RangeRequestsPlugin.d.ts +19 -0
- package/dist/plugins/rangeRequests/RangeRequestsPlugin.d.ts.map +1 -0
- package/dist/plugins/rangeRequests/createPartialResponse.d.ts +18 -0
- package/dist/plugins/rangeRequests/createPartialResponse.d.ts.map +1 -0
- package/dist/plugins/rangeRequests/utils/calculateEffectiveBoundaries.d.ts +14 -0
- package/dist/plugins/rangeRequests/utils/calculateEffectiveBoundaries.d.ts.map +1 -0
- package/dist/plugins/rangeRequests/utils/parseRangeHeader.d.ts +12 -0
- package/dist/plugins/rangeRequests/utils/parseRangeHeader.d.ts.map +1 -0
- package/dist/precaching/PrecacheController.d.ts +145 -0
- package/dist/precaching/PrecacheController.d.ts.map +1 -0
- package/dist/precaching/PrecacheRoute.d.ts +20 -0
- package/dist/precaching/PrecacheRoute.d.ts.map +1 -0
- package/dist/precaching/PrecacheStrategy.d.ts +68 -0
- package/dist/precaching/PrecacheStrategy.d.ts.map +1 -0
- package/dist/precaching/addPlugins.d.ts +8 -0
- package/dist/precaching/addPlugins.d.ts.map +1 -0
- package/dist/precaching/addRoute.d.ts +15 -0
- package/dist/precaching/addRoute.d.ts.map +1 -0
- package/dist/precaching/cleanupOutdatedCaches.d.ts +6 -0
- package/dist/precaching/cleanupOutdatedCaches.d.ts.map +1 -0
- package/dist/precaching/createHandlerBoundToURL.d.ts +17 -0
- package/dist/precaching/createHandlerBoundToURL.d.ts.map +1 -0
- package/dist/precaching/getCacheKeyForURL.d.ts +20 -0
- package/dist/precaching/getCacheKeyForURL.d.ts.map +1 -0
- package/dist/precaching/matchPrecache.d.ts +14 -0
- package/dist/precaching/matchPrecache.d.ts.map +1 -0
- package/dist/precaching/precache.d.ts +19 -0
- package/dist/precaching/precache.d.ts.map +1 -0
- package/dist/precaching/precacheAndRoute.d.ts +14 -0
- package/dist/precaching/precacheAndRoute.d.ts.map +1 -0
- package/dist/precaching/types.d.ts +37 -0
- package/dist/precaching/types.d.ts.map +1 -0
- package/dist/precaching/utils/PrecacheCacheKeyPlugin.d.ts +17 -0
- package/dist/precaching/utils/PrecacheCacheKeyPlugin.d.ts.map +1 -0
- package/dist/precaching/utils/PrecacheInstallReportPlugin.d.ts +15 -0
- package/dist/precaching/utils/PrecacheInstallReportPlugin.d.ts.map +1 -0
- package/dist/precaching/utils/createCacheKey.d.ts +16 -0
- package/dist/precaching/utils/createCacheKey.d.ts.map +1 -0
- package/dist/precaching/utils/deleteOutdatedCaches.d.ts +18 -0
- package/dist/precaching/utils/deleteOutdatedCaches.d.ts.map +1 -0
- package/dist/precaching/utils/generateURLVariations.d.ts +12 -0
- package/dist/precaching/utils/generateURLVariations.d.ts.map +1 -0
- package/dist/precaching/utils/getCacheKeyForURL.d.ts +14 -0
- package/dist/precaching/utils/getCacheKeyForURL.d.ts.map +1 -0
- package/dist/precaching/utils/getOrCreatePrecacheController.d.ts +7 -0
- package/dist/precaching/utils/getOrCreatePrecacheController.d.ts.map +1 -0
- package/dist/precaching/utils/printCleanupDetails.d.ts +6 -0
- package/dist/precaching/utils/printCleanupDetails.d.ts.map +1 -0
- package/dist/precaching/utils/printInstallDetails.d.ts +7 -0
- package/dist/precaching/utils/printInstallDetails.d.ts.map +1 -0
- package/dist/precaching/utils/removeIgnoredSearchParams.d.ts +12 -0
- package/dist/precaching/utils/removeIgnoredSearchParams.d.ts.map +1 -0
- package/dist/routing/NavigationRoute.d.ts +57 -0
- package/dist/routing/NavigationRoute.d.ts.map +1 -0
- package/dist/routing/RegExpRoute.d.ts +24 -0
- package/dist/routing/RegExpRoute.d.ts.map +1 -0
- package/dist/routing/Route.d.ts +33 -0
- package/dist/routing/Route.d.ts.map +1 -0
- package/dist/routing/Router.d.ts +124 -0
- package/dist/routing/Router.d.ts.map +1 -0
- package/dist/routing/registerRoute.d.ts +15 -0
- package/dist/routing/registerRoute.d.ts.map +1 -0
- package/dist/routing/setCatchHandler.d.ts +9 -0
- package/dist/routing/setCatchHandler.d.ts.map +1 -0
- package/dist/routing/setDefaultHandler.d.ts +12 -0
- package/dist/routing/setDefaultHandler.d.ts.map +1 -0
- package/dist/routing/unregisterRoute.d.ts +8 -0
- package/dist/routing/unregisterRoute.d.ts.map +1 -0
- package/dist/routing/utils/constants.d.ts +15 -0
- package/dist/routing/utils/constants.d.ts.map +1 -0
- package/dist/routing/utils/getOrCreateDefaultRouter.d.ts +10 -0
- package/dist/routing/utils/getOrCreateDefaultRouter.d.ts.map +1 -0
- package/dist/routing/utils/normalizeHandler.d.ts +10 -0
- package/dist/routing/utils/normalizeHandler.d.ts.map +1 -0
- package/dist/routing/utils/parseRoute.d.ts +5 -0
- package/dist/routing/utils/parseRoute.d.ts.map +1 -0
- package/dist/strategies/CacheFirst.d.ts +23 -0
- package/dist/strategies/CacheFirst.d.ts.map +1 -0
- package/dist/strategies/CacheOnly.d.ts +20 -0
- package/dist/strategies/CacheOnly.d.ts.map +1 -0
- package/dist/strategies/NetworkFirst.d.ts +61 -0
- package/dist/strategies/NetworkFirst.d.ts.map +1 -0
- package/dist/strategies/NetworkOnly.d.ts +32 -0
- package/dist/strategies/NetworkOnly.d.ts.map +1 -0
- package/dist/strategies/StaleWhileRevalidate.d.ts +35 -0
- package/dist/strategies/StaleWhileRevalidate.d.ts.map +1 -0
- package/dist/strategies/Strategy.d.ts +83 -0
- package/dist/strategies/Strategy.d.ts.map +1 -0
- package/dist/strategies/StrategyHandler.d.ts +189 -0
- package/dist/strategies/StrategyHandler.d.ts.map +1 -0
- package/dist/strategies/plugins/cacheOkAndOpaquePlugin.d.ts +3 -0
- package/dist/strategies/plugins/cacheOkAndOpaquePlugin.d.ts.map +1 -0
- package/dist/strategies/utils/messages.d.ts +5 -0
- package/dist/strategies/utils/messages.d.ts.map +1 -0
- package/package.json +20 -14
- package/src/{Serwist.ts → abstractions/Serwist.ts} +16 -19
- package/src/{fallbacks.ts → abstractions/fallbacks.ts} +5 -5
- package/src/{handlePrecaching.ts → abstractions/handlePrecaching.ts} +6 -3
- package/src/{installSerwist.ts → abstractions/installSerwist.ts} +2 -2
- package/src/{registerRuntimeCaching.ts → abstractions/registerRuntimeCaching.ts} +1 -1
- package/src/{types.ts → abstractions/types.ts} +1 -1
- package/src/index.plugins.ts +65 -16
- package/src/index.precaching.ts +38 -0
- package/src/index.routing.ts +14 -0
- package/src/index.strategies.ts +22 -2
- package/src/index.ts +8 -8
- package/src/plugins/backgroundSync/BackgroundSyncPlugin.ts +39 -0
- package/src/plugins/backgroundSync/Queue.ts +438 -0
- package/src/plugins/backgroundSync/QueueDb.ts +176 -0
- package/src/plugins/backgroundSync/QueueStore.ts +161 -0
- package/src/plugins/backgroundSync/StorableRequest.ts +142 -0
- package/src/plugins/broadcastUpdate/BroadcastCacheUpdate.ts +159 -0
- package/src/plugins/broadcastUpdate/BroadcastUpdatePlugin.ts +43 -0
- package/src/plugins/broadcastUpdate/constants.ts +12 -0
- package/src/plugins/broadcastUpdate/responsesAreSame.ts +48 -0
- package/src/plugins/broadcastUpdate/types.ts +37 -0
- package/src/plugins/cacheableResponse/CacheableResponse.ts +141 -0
- package/src/plugins/cacheableResponse/CacheableResponsePlugin.ts +46 -0
- package/src/plugins/expiration/CacheExpiration.ts +192 -0
- package/src/plugins/expiration/ExpirationPlugin.ts +297 -0
- package/src/plugins/expiration/models/CacheTimestampsModel.ts +184 -0
- package/src/plugins/googleAnalytics/constants.ts +22 -0
- package/src/plugins/googleAnalytics/initialize.ts +200 -0
- package/src/plugins/precaching/PrecacheFallbackPlugin.ts +86 -0
- package/src/plugins/rangeRequests/RangeRequestsPlugin.ts +39 -0
- package/src/plugins/rangeRequests/createPartialResponse.ts +92 -0
- package/src/plugins/rangeRequests/utils/calculateEffectiveBoundaries.ts +58 -0
- package/src/plugins/rangeRequests/utils/parseRangeHeader.ts +54 -0
- package/src/precaching/PrecacheController.ts +332 -0
- package/src/precaching/PrecacheRoute.ts +50 -0
- package/src/precaching/PrecacheStrategy.ts +238 -0
- package/src/precaching/addPlugins.ts +21 -0
- package/src/precaching/addRoute.ts +30 -0
- package/src/precaching/cleanupOutdatedCaches.ts +33 -0
- package/src/precaching/createHandlerBoundToURL.ts +30 -0
- package/src/precaching/getCacheKeyForURL.ts +33 -0
- package/src/precaching/matchPrecache.ts +26 -0
- package/src/precaching/precache.ts +31 -0
- package/src/precaching/precacheAndRoute.ts +27 -0
- package/src/precaching/types.ts +46 -0
- package/src/precaching/utils/PrecacheCacheKeyPlugin.ts +36 -0
- package/src/precaching/utils/PrecacheInstallReportPlugin.ts +49 -0
- package/src/precaching/utils/createCacheKey.ts +68 -0
- package/src/precaching/utils/deleteOutdatedCaches.ts +40 -0
- package/src/precaching/utils/generateURLVariations.ts +55 -0
- package/src/precaching/utils/getCacheKeyForURL.ts +36 -0
- package/src/precaching/utils/getOrCreatePrecacheController.ts +22 -0
- package/src/precaching/utils/printCleanupDetails.ts +38 -0
- package/src/precaching/utils/printInstallDetails.ts +53 -0
- package/src/precaching/utils/removeIgnoredSearchParams.ts +29 -0
- package/src/routing/NavigationRoute.ts +119 -0
- package/src/routing/RegExpRoute.ts +74 -0
- package/src/routing/Route.ts +68 -0
- package/src/routing/Router.ts +432 -0
- package/src/routing/registerRoute.ts +33 -0
- package/src/routing/setCatchHandler.ts +22 -0
- package/src/routing/setDefaultHandler.ts +25 -0
- package/src/routing/unregisterRoute.ts +12 -0
- package/src/routing/utils/constants.ts +24 -0
- package/src/routing/utils/getOrCreateDefaultRouter.ts +29 -0
- package/src/routing/utils/normalizeHandler.ts +40 -0
- package/src/routing/utils/parseRoute.ts +67 -0
- package/src/strategies/CacheFirst.ts +87 -0
- package/src/strategies/CacheOnly.ts +58 -0
- package/src/strategies/NetworkFirst.ts +228 -0
- package/src/strategies/NetworkOnly.ts +96 -0
- package/src/strategies/StaleWhileRevalidate.ts +109 -0
- package/src/strategies/Strategy.ts +202 -0
- package/src/strategies/StrategyHandler.ts +557 -0
- package/src/strategies/plugins/cacheOkAndOpaquePlugin.ts +26 -0
- package/src/strategies/utils/messages.ts +20 -0
- package/dist/Serwist.d.ts.map +0 -1
- package/dist/disableDevLogs.d.ts.map +0 -1
- package/dist/fallbacks.d.ts.map +0 -1
- package/dist/handlePrecaching.d.ts.map +0 -1
- package/dist/installSerwist.d.ts.map +0 -1
- package/dist/registerRuntimeCaching.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- /package/dist/{disableDevLogs.d.ts → abstractions/disableDevLogs.d.ts} +0 -0
- /package/dist/{installSerwist.d.ts → abstractions/installSerwist.d.ts} +0 -0
- /package/dist/{registerRuntimeCaching.d.ts → abstractions/registerRuntimeCaching.d.ts} +0 -0
- /package/src/{disableDevLogs.ts → abstractions/disableDevLogs.ts} +0 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2018 Google LLC
|
|
3
|
+
|
|
4
|
+
Use of this source code is governed by an MIT-style
|
|
5
|
+
license that can be found in the LICENSE file or at
|
|
6
|
+
https://opensource.org/licenses/MIT.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { SerwistError } from "@serwist/core/internal";
|
|
10
|
+
|
|
11
|
+
import type { PrecacheEntry } from "../types.js";
|
|
12
|
+
|
|
13
|
+
interface CacheKey {
|
|
14
|
+
cacheKey: string;
|
|
15
|
+
url: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Name of the search parameter used to store revision info.
|
|
19
|
+
const REVISION_SEARCH_PARAM = "__WB_REVISION__";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Converts a manifest entry into a versioned URL suitable for precaching.
|
|
23
|
+
*
|
|
24
|
+
* @param entry
|
|
25
|
+
* @returns A URL with versioning info.
|
|
26
|
+
*
|
|
27
|
+
* @private
|
|
28
|
+
*/
|
|
29
|
+
export function createCacheKey(entry: PrecacheEntry | string): CacheKey {
|
|
30
|
+
if (!entry) {
|
|
31
|
+
throw new SerwistError("add-to-cache-list-unexpected-type", { entry });
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// If a precache manifest entry is a string, it's assumed to be a versioned
|
|
35
|
+
// URL, like '/app.abcd1234.js'. Return as-is.
|
|
36
|
+
if (typeof entry === "string") {
|
|
37
|
+
const urlObject = new URL(entry, location.href);
|
|
38
|
+
return {
|
|
39
|
+
cacheKey: urlObject.href,
|
|
40
|
+
url: urlObject.href,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const { revision, url } = entry;
|
|
45
|
+
if (!url) {
|
|
46
|
+
throw new SerwistError("add-to-cache-list-unexpected-type", { entry });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// If there's just a URL and no revision, then it's also assumed to be a
|
|
50
|
+
// versioned URL.
|
|
51
|
+
if (!revision) {
|
|
52
|
+
const urlObject = new URL(url, location.href);
|
|
53
|
+
return {
|
|
54
|
+
cacheKey: urlObject.href,
|
|
55
|
+
url: urlObject.href,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Otherwise, construct a properly versioned URL using the custom Serwist
|
|
60
|
+
// search parameter along with the revision info.
|
|
61
|
+
const cacheKeyURL = new URL(url, location.href);
|
|
62
|
+
const originalURL = new URL(url, location.href);
|
|
63
|
+
cacheKeyURL.searchParams.set(REVISION_SEARCH_PARAM, revision);
|
|
64
|
+
return {
|
|
65
|
+
cacheKey: cacheKeyURL.href,
|
|
66
|
+
url: originalURL.href,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2018 Google LLC
|
|
3
|
+
|
|
4
|
+
Use of this source code is governed by an MIT-style
|
|
5
|
+
license that can be found in the LICENSE file or at
|
|
6
|
+
https://opensource.org/licenses/MIT.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
// Give TypeScript the correct global.
|
|
10
|
+
declare let self: ServiceWorkerGlobalScope;
|
|
11
|
+
|
|
12
|
+
const SUBSTRING_TO_FIND = "-precache-";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Cleans up incompatible precaches that were created by older versions of
|
|
16
|
+
* Serwist, by a service worker registered under the current scope.
|
|
17
|
+
*
|
|
18
|
+
* This is meant to be called as part of the `activate` event.
|
|
19
|
+
*
|
|
20
|
+
* This should be safe to use as long as you don't include `substringToFind`
|
|
21
|
+
* (defaulting to `-precache-`) in your non-precache cache names.
|
|
22
|
+
*
|
|
23
|
+
* @param currentPrecacheName The cache name currently in use for
|
|
24
|
+
* precaching. This cache won't be deleted.
|
|
25
|
+
* @param substringToFind Cache names which include this
|
|
26
|
+
* substring will be deleted (excluding `currentPrecacheName`).
|
|
27
|
+
* @returns A list of all the cache names that were deleted.
|
|
28
|
+
* @private
|
|
29
|
+
*/
|
|
30
|
+
export const deleteOutdatedCaches = async (currentPrecacheName: string, substringToFind: string = SUBSTRING_TO_FIND): Promise<string[]> => {
|
|
31
|
+
const cacheNames = await self.caches.keys();
|
|
32
|
+
|
|
33
|
+
const cacheNamesToDelete = cacheNames.filter((cacheName) => {
|
|
34
|
+
return cacheName.includes(substringToFind) && cacheName.includes(self.registration.scope) && cacheName !== currentPrecacheName;
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
await Promise.all(cacheNamesToDelete.map((cacheName) => self.caches.delete(cacheName)));
|
|
38
|
+
|
|
39
|
+
return cacheNamesToDelete;
|
|
40
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2019 Google LLC
|
|
3
|
+
|
|
4
|
+
Use of this source code is governed by an MIT-style
|
|
5
|
+
license that can be found in the LICENSE file or at
|
|
6
|
+
https://opensource.org/licenses/MIT.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { PrecacheRouteOptions } from "../types.js";
|
|
10
|
+
import { removeIgnoredSearchParams } from "./removeIgnoredSearchParams.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Generator function that yields possible variations on the original URL to
|
|
14
|
+
* check, one at a time.
|
|
15
|
+
*
|
|
16
|
+
* @param url
|
|
17
|
+
* @param options
|
|
18
|
+
*
|
|
19
|
+
* @private
|
|
20
|
+
*/
|
|
21
|
+
export function* generateURLVariations(
|
|
22
|
+
url: string,
|
|
23
|
+
{
|
|
24
|
+
ignoreURLParametersMatching = [/^utm_/, /^fbclid$/],
|
|
25
|
+
directoryIndex = "index.html",
|
|
26
|
+
cleanURLs = true,
|
|
27
|
+
urlManipulation,
|
|
28
|
+
}: PrecacheRouteOptions = {},
|
|
29
|
+
): Generator<string, void, unknown> {
|
|
30
|
+
const urlObject = new URL(url, location.href);
|
|
31
|
+
urlObject.hash = "";
|
|
32
|
+
yield urlObject.href;
|
|
33
|
+
|
|
34
|
+
const urlWithoutIgnoredParams = removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching);
|
|
35
|
+
yield urlWithoutIgnoredParams.href;
|
|
36
|
+
|
|
37
|
+
if (directoryIndex && urlWithoutIgnoredParams.pathname.endsWith("/")) {
|
|
38
|
+
const directoryURL = new URL(urlWithoutIgnoredParams.href);
|
|
39
|
+
directoryURL.pathname += directoryIndex;
|
|
40
|
+
yield directoryURL.href;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (cleanURLs) {
|
|
44
|
+
const cleanURL = new URL(urlWithoutIgnoredParams.href);
|
|
45
|
+
cleanURL.pathname += ".html";
|
|
46
|
+
yield cleanURL.href;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (urlManipulation) {
|
|
50
|
+
const additionalURLs = urlManipulation({ url: urlObject });
|
|
51
|
+
for (const urlToAttempt of additionalURLs) {
|
|
52
|
+
yield urlToAttempt.href;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2019 Google LLC
|
|
3
|
+
|
|
4
|
+
Use of this source code is governed by an MIT-style
|
|
5
|
+
license that can be found in the LICENSE file or at
|
|
6
|
+
https://opensource.org/licenses/MIT.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { PrecacheRouteOptions } from "../types.js";
|
|
10
|
+
import { generateURLVariations } from "./generateURLVariations.js";
|
|
11
|
+
import { getOrCreatePrecacheController } from "./getOrCreatePrecacheController.js";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* This function will take the request URL and manipulate it based on the
|
|
15
|
+
* configuration options.
|
|
16
|
+
*
|
|
17
|
+
* @param url
|
|
18
|
+
* @param options
|
|
19
|
+
* @returns Returns the URL in the cache that matches the request,
|
|
20
|
+
* if possible.
|
|
21
|
+
*
|
|
22
|
+
* @private
|
|
23
|
+
*/
|
|
24
|
+
export const getCacheKeyForURL = (url: string, options: PrecacheRouteOptions): string | undefined => {
|
|
25
|
+
const precacheController = getOrCreatePrecacheController();
|
|
26
|
+
|
|
27
|
+
const urlsToCacheKeys = precacheController.getURLsToCacheKeys();
|
|
28
|
+
for (const possibleURL of generateURLVariations(url, options)) {
|
|
29
|
+
const possibleCacheKey = urlsToCacheKeys.get(possibleURL);
|
|
30
|
+
if (possibleCacheKey) {
|
|
31
|
+
return possibleCacheKey;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return undefined;
|
|
36
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2019 Google LLC
|
|
3
|
+
|
|
4
|
+
Use of this source code is governed by an MIT-style
|
|
5
|
+
license that can be found in the LICENSE file or at
|
|
6
|
+
https://opensource.org/licenses/MIT.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { PrecacheController } from "../PrecacheController.js";
|
|
10
|
+
|
|
11
|
+
let precacheController: PrecacheController | undefined;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @returns
|
|
15
|
+
* @private
|
|
16
|
+
*/
|
|
17
|
+
export const getOrCreatePrecacheController = (): PrecacheController => {
|
|
18
|
+
if (!precacheController) {
|
|
19
|
+
precacheController = new PrecacheController();
|
|
20
|
+
}
|
|
21
|
+
return precacheController;
|
|
22
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2018 Google LLC
|
|
3
|
+
|
|
4
|
+
Use of this source code is governed by an MIT-style
|
|
5
|
+
license that can be found in the LICENSE file or at
|
|
6
|
+
https://opensource.org/licenses/MIT.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { logger } from "@serwist/core/internal";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @param groupTitle
|
|
13
|
+
* @param deletedURLs
|
|
14
|
+
*
|
|
15
|
+
* @private
|
|
16
|
+
*/
|
|
17
|
+
const logGroup = (groupTitle: string, deletedURLs: string[]) => {
|
|
18
|
+
logger.groupCollapsed(groupTitle);
|
|
19
|
+
|
|
20
|
+
for (const url of deletedURLs) {
|
|
21
|
+
logger.log(url);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
logger.groupEnd();
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @param deletedURLs
|
|
29
|
+
* @private
|
|
30
|
+
*/
|
|
31
|
+
export function printCleanupDetails(deletedURLs: string[]): void {
|
|
32
|
+
const deletionCount = deletedURLs.length;
|
|
33
|
+
if (deletionCount > 0) {
|
|
34
|
+
logger.groupCollapsed(`During precaching cleanup, ${deletionCount} cached request${deletionCount === 1 ? " was" : "s were"} deleted.`);
|
|
35
|
+
logGroup("Deleted Cache Requests", deletedURLs);
|
|
36
|
+
logger.groupEnd();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2018 Google LLC
|
|
3
|
+
|
|
4
|
+
Use of this source code is governed by an MIT-style
|
|
5
|
+
license that can be found in the LICENSE file or at
|
|
6
|
+
https://opensource.org/licenses/MIT.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { logger } from "@serwist/core/internal";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @param groupTitle
|
|
13
|
+
* @param urls
|
|
14
|
+
*
|
|
15
|
+
* @private
|
|
16
|
+
*/
|
|
17
|
+
function _nestedGroup(groupTitle: string, urls: string[]): void {
|
|
18
|
+
if (urls.length === 0) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
logger.groupCollapsed(groupTitle);
|
|
23
|
+
|
|
24
|
+
for (const url of urls) {
|
|
25
|
+
logger.log(url);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
logger.groupEnd();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @param urlsToPrecache
|
|
33
|
+
* @param urlsAlreadyPrecached
|
|
34
|
+
* @private
|
|
35
|
+
*/
|
|
36
|
+
export function printInstallDetails(urlsToPrecache: string[], urlsAlreadyPrecached: string[]): void {
|
|
37
|
+
const precachedCount = urlsToPrecache.length;
|
|
38
|
+
const alreadyPrecachedCount = urlsAlreadyPrecached.length;
|
|
39
|
+
|
|
40
|
+
if (precachedCount || alreadyPrecachedCount) {
|
|
41
|
+
let message = `Precaching ${precachedCount} file${precachedCount === 1 ? "" : "s"}.`;
|
|
42
|
+
|
|
43
|
+
if (alreadyPrecachedCount > 0) {
|
|
44
|
+
message += ` ${alreadyPrecachedCount} ` + `file${alreadyPrecachedCount === 1 ? " is" : "s are"} already cached.`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
logger.groupCollapsed(message);
|
|
48
|
+
|
|
49
|
+
_nestedGroup("View newly precached URLs.", urlsToPrecache);
|
|
50
|
+
_nestedGroup("View previously precached URLs.", urlsAlreadyPrecached);
|
|
51
|
+
logger.groupEnd();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2018 Google LLC
|
|
3
|
+
|
|
4
|
+
Use of this source code is governed by an MIT-style
|
|
5
|
+
license that can be found in the LICENSE file or at
|
|
6
|
+
https://opensource.org/licenses/MIT.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Removes any URL search parameters that should be ignored.
|
|
11
|
+
*
|
|
12
|
+
* @param urlObject The original URL.
|
|
13
|
+
* @param ignoreURLParametersMatching RegExps to test against
|
|
14
|
+
* each search parameter name. Matches mean that the search parameter should be
|
|
15
|
+
* ignored.
|
|
16
|
+
* @returns The URL with any ignored search parameters removed.
|
|
17
|
+
* @private
|
|
18
|
+
*/
|
|
19
|
+
export function removeIgnoredSearchParams(urlObject: URL, ignoreURLParametersMatching: RegExp[] = []): URL {
|
|
20
|
+
// Convert the iterable into an array at the start of the loop to make sure
|
|
21
|
+
// deletion doesn't mess up iteration.
|
|
22
|
+
for (const paramName of [...urlObject.searchParams.keys()]) {
|
|
23
|
+
if (ignoreURLParametersMatching.some((regExp) => regExp.test(paramName))) {
|
|
24
|
+
urlObject.searchParams.delete(paramName);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return urlObject;
|
|
29
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2018 Google LLC
|
|
3
|
+
|
|
4
|
+
Use of this source code is governed by an MIT-style
|
|
5
|
+
license that can be found in the LICENSE file or at
|
|
6
|
+
https://opensource.org/licenses/MIT.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { RouteHandler, RouteMatchCallbackOptions } from "@serwist/core";
|
|
10
|
+
import { assert, logger } from "@serwist/core/internal";
|
|
11
|
+
|
|
12
|
+
import { Route } from "./Route.js";
|
|
13
|
+
|
|
14
|
+
export interface NavigationRouteMatchOptions {
|
|
15
|
+
/**
|
|
16
|
+
* If any of these patterns
|
|
17
|
+
* match the URL's pathname and search parameter, the route will handle the
|
|
18
|
+
* request (assuming the denylist doesn't match).
|
|
19
|
+
*
|
|
20
|
+
* @default [/./]
|
|
21
|
+
*/
|
|
22
|
+
allowlist?: RegExp[];
|
|
23
|
+
/**
|
|
24
|
+
* If any of these patterns match, the route will not handle the request (even if a allowlist RegExp matches).
|
|
25
|
+
*/
|
|
26
|
+
denylist?: RegExp[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* NavigationRoute makes it easy to create a `@serwist/routing` Route that matches for browser
|
|
31
|
+
* [navigation requests](https://developers.google.com/web/fundamentals/primers/service-workers/high-performance-loading#first_what_are_navigation_requests).
|
|
32
|
+
*
|
|
33
|
+
* It will only match incoming Requests whose [mode](https://fetch.spec.whatwg.org/#concept-request-mode) is set to `navigate`.
|
|
34
|
+
*
|
|
35
|
+
* You can optionally only apply this route to a subset of navigation requests
|
|
36
|
+
* by using one or both of the `denylist` and `allowlist` parameters.
|
|
37
|
+
*/
|
|
38
|
+
export class NavigationRoute extends Route {
|
|
39
|
+
private readonly _allowlist: RegExp[];
|
|
40
|
+
private readonly _denylist: RegExp[];
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* If both `denylist` and `allowlist` are provided, the `denylist` will
|
|
44
|
+
* take precedence and the request will not match this route.
|
|
45
|
+
*
|
|
46
|
+
* The regular expressions in `allowlist` and `denylist`
|
|
47
|
+
* are matched against the concatenated
|
|
48
|
+
* [`pathname`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/pathname)
|
|
49
|
+
* and [`search`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/search)
|
|
50
|
+
* portions of the requested URL.
|
|
51
|
+
*
|
|
52
|
+
* *Note*: These RegExps may be evaluated against every destination URL during
|
|
53
|
+
* a navigation. Avoid using
|
|
54
|
+
* [complex RegExps](https://github.com/GoogleChrome/workbox/issues/3077),
|
|
55
|
+
* or else your users may see delays when navigating your site.
|
|
56
|
+
*
|
|
57
|
+
* @param handler A callback function that returns a Promise resulting in a Response.
|
|
58
|
+
* @param options
|
|
59
|
+
*/
|
|
60
|
+
constructor(handler: RouteHandler, { allowlist = [/./], denylist = [] }: NavigationRouteMatchOptions = {}) {
|
|
61
|
+
if (process.env.NODE_ENV !== "production") {
|
|
62
|
+
assert!.isArrayOfClass(allowlist, RegExp, {
|
|
63
|
+
moduleName: "@serwist/routing",
|
|
64
|
+
className: "NavigationRoute",
|
|
65
|
+
funcName: "constructor",
|
|
66
|
+
paramName: "options.allowlist",
|
|
67
|
+
});
|
|
68
|
+
assert!.isArrayOfClass(denylist, RegExp, {
|
|
69
|
+
moduleName: "@serwist/routing",
|
|
70
|
+
className: "NavigationRoute",
|
|
71
|
+
funcName: "constructor",
|
|
72
|
+
paramName: "options.denylist",
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
super((options: RouteMatchCallbackOptions) => this._match(options), handler);
|
|
77
|
+
|
|
78
|
+
this._allowlist = allowlist;
|
|
79
|
+
this._denylist = denylist;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Routes match handler.
|
|
84
|
+
*
|
|
85
|
+
* @param options
|
|
86
|
+
* @returns
|
|
87
|
+
* @private
|
|
88
|
+
*/
|
|
89
|
+
private _match({ url, request }: RouteMatchCallbackOptions): boolean {
|
|
90
|
+
if (request && request.mode !== "navigate") {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const pathnameAndSearch = url.pathname + url.search;
|
|
95
|
+
|
|
96
|
+
for (const regExp of this._denylist) {
|
|
97
|
+
if (regExp.test(pathnameAndSearch)) {
|
|
98
|
+
if (process.env.NODE_ENV !== "production") {
|
|
99
|
+
logger.log(
|
|
100
|
+
`The navigation route ${pathnameAndSearch} is not being used, since the URL matches this denylist pattern: ${regExp.toString()}`,
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (this._allowlist.some((regExp) => regExp.test(pathnameAndSearch))) {
|
|
108
|
+
if (process.env.NODE_ENV !== "production") {
|
|
109
|
+
logger.debug(`The navigation route ${pathnameAndSearch} is being used.`);
|
|
110
|
+
}
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (process.env.NODE_ENV !== "production") {
|
|
115
|
+
logger.log(`The navigation route ${pathnameAndSearch} is not being used, since the URL being navigated to doesn't match the allowlist.`);
|
|
116
|
+
}
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2018 Google LLC
|
|
3
|
+
|
|
4
|
+
Use of this source code is governed by an MIT-style
|
|
5
|
+
license that can be found in the LICENSE file or at
|
|
6
|
+
https://opensource.org/licenses/MIT.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { RouteHandler, RouteMatchCallback, RouteMatchCallbackOptions } from "@serwist/core";
|
|
10
|
+
import { assert, logger } from "@serwist/core/internal";
|
|
11
|
+
|
|
12
|
+
import { Route } from "./Route.js";
|
|
13
|
+
import type { HTTPMethod } from "./utils/constants.js";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* RegExpRoute makes it easy to create a regular expression based on a `@serwist/routing` Route.
|
|
17
|
+
*
|
|
18
|
+
* For same-origin requests the RegExp only needs to match part of the URL. For
|
|
19
|
+
* requests against third-party servers, you must define a RegExp that matches
|
|
20
|
+
* the start of the URL.
|
|
21
|
+
*/
|
|
22
|
+
export class RegExpRoute extends Route {
|
|
23
|
+
/**
|
|
24
|
+
* If the regular expression contains
|
|
25
|
+
* [capture groups](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references),
|
|
26
|
+
* the captured values will be passed to the `params` argument.
|
|
27
|
+
*
|
|
28
|
+
* @param regExp The regular expression to match against URLs.
|
|
29
|
+
* @param handler A callback function that returns a Promise resulting in a Response.
|
|
30
|
+
* @param method The HTTP method to match the Route, defaults to GET.
|
|
31
|
+
* against.
|
|
32
|
+
*/
|
|
33
|
+
constructor(regExp: RegExp, handler: RouteHandler, method?: HTTPMethod) {
|
|
34
|
+
if (process.env.NODE_ENV !== "production") {
|
|
35
|
+
assert!.isInstance(regExp, RegExp, {
|
|
36
|
+
moduleName: "@serwist/routing",
|
|
37
|
+
className: "RegExpRoute",
|
|
38
|
+
funcName: "constructor",
|
|
39
|
+
paramName: "pattern",
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const match: RouteMatchCallback = ({ url }: RouteMatchCallbackOptions) => {
|
|
44
|
+
const result = regExp.exec(url.href);
|
|
45
|
+
|
|
46
|
+
// Return immediately if there's no match.
|
|
47
|
+
if (!result) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Require that the match start at the first character in the URL string
|
|
52
|
+
// if it's a cross-origin request.
|
|
53
|
+
// See https://github.com/GoogleChrome/workbox/issues/281 for the context
|
|
54
|
+
// behind this behavior.
|
|
55
|
+
if (url.origin !== location.origin && result.index !== 0) {
|
|
56
|
+
if (process.env.NODE_ENV !== "production") {
|
|
57
|
+
logger.debug(
|
|
58
|
+
`The regular expression '${regExp.toString()}' only partially matched against the cross-origin URL '${url.toString()}'. RegExpRoute's will only handle cross-origin requests if they match the entire URL.`,
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// If the route matches, but there aren't any capture groups defined, then
|
|
66
|
+
// this will return [], which is truthy and therefore sufficient to
|
|
67
|
+
// indicate a match.
|
|
68
|
+
// If there are capture groups, then it will return their values.
|
|
69
|
+
return result.slice(1);
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
super(match, handler, method);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2018 Google LLC
|
|
3
|
+
|
|
4
|
+
Use of this source code is governed by an MIT-style
|
|
5
|
+
license that can be found in the LICENSE file or at
|
|
6
|
+
https://opensource.org/licenses/MIT.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { RouteHandler, RouteHandlerObject, RouteMatchCallback } from "@serwist/core";
|
|
10
|
+
import { assert } from "@serwist/core/internal";
|
|
11
|
+
|
|
12
|
+
import type { HTTPMethod } from "./utils/constants.js";
|
|
13
|
+
import { defaultMethod, validMethods } from "./utils/constants.js";
|
|
14
|
+
import { normalizeHandler } from "./utils/normalizeHandler.js";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* A `Route` consists of a pair of callback functions, "match" and "handler".
|
|
18
|
+
* The "match" callback determine if a route should be used to "handle" a
|
|
19
|
+
* request by returning a non-falsy value if it can. The "handler" callback
|
|
20
|
+
* is called when there is a match and should return a Promise that resolves
|
|
21
|
+
* to a `Response`.
|
|
22
|
+
*/
|
|
23
|
+
export class Route {
|
|
24
|
+
handler: RouteHandlerObject;
|
|
25
|
+
match: RouteMatchCallback;
|
|
26
|
+
method: HTTPMethod;
|
|
27
|
+
catchHandler?: RouteHandlerObject;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Constructor for Route class.
|
|
31
|
+
*
|
|
32
|
+
* @param match A callback function that determines whether the
|
|
33
|
+
* route matches a given `fetch` event by returning a non-falsy value.
|
|
34
|
+
* @param handler A callback function that returns a Promise resolving
|
|
35
|
+
* to a Response.
|
|
36
|
+
* @param method The HTTP method to match the Route against. Defaults
|
|
37
|
+
* to GET.
|
|
38
|
+
*/
|
|
39
|
+
constructor(match: RouteMatchCallback, handler: RouteHandler, method: HTTPMethod = defaultMethod) {
|
|
40
|
+
if (process.env.NODE_ENV !== "production") {
|
|
41
|
+
assert!.isType(match, "function", {
|
|
42
|
+
moduleName: "@serwist/routing",
|
|
43
|
+
className: "Route",
|
|
44
|
+
funcName: "constructor",
|
|
45
|
+
paramName: "match",
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
if (method) {
|
|
49
|
+
assert!.isOneOf(method, validMethods, { paramName: "method" });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// These values are referenced directly by Router so cannot be
|
|
54
|
+
// altered by minificaton.
|
|
55
|
+
this.handler = normalizeHandler(handler);
|
|
56
|
+
this.match = match;
|
|
57
|
+
this.method = method;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
*
|
|
62
|
+
* @param handler A callback function that returns a Promise resolving
|
|
63
|
+
* to a Response.
|
|
64
|
+
*/
|
|
65
|
+
setCatchHandler(handler: RouteHandler): void {
|
|
66
|
+
this.catchHandler = normalizeHandler(handler);
|
|
67
|
+
}
|
|
68
|
+
}
|