@serwist/sw 9.0.0-preview.19 → 9.0.0-preview.20

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 (70) hide show
  1. package/dist/abstractions/Serwist.d.ts +5 -7
  2. package/dist/abstractions/Serwist.d.ts.map +1 -1
  3. package/dist/chunks/NavigationRoute.js +1 -1
  4. package/dist/chunks/PrecacheFallbackPlugin.js +9 -9
  5. package/dist/chunks/precacheAndRoute.js +6 -5
  6. package/dist/chunks/registerRoute.js +3 -404
  7. package/dist/chunks/{getOrCreatePrecacheController.js → singletonPrecacheController.js} +10 -6
  8. package/dist/chunks/singletonRouter.js +435 -0
  9. package/dist/index.js +8 -7
  10. package/dist/index.plugins.js +2 -2
  11. package/dist/index.precaching.d.ts +2 -1
  12. package/dist/index.precaching.d.ts.map +1 -1
  13. package/dist/index.precaching.js +7 -7
  14. package/dist/index.routing.d.ts +3 -1
  15. package/dist/index.routing.d.ts.map +1 -1
  16. package/dist/index.routing.js +7 -9
  17. package/dist/plugins/googleAnalytics/initialize.d.ts +9 -1
  18. package/dist/plugins/googleAnalytics/initialize.d.ts.map +1 -1
  19. package/dist/precaching/addRoute.d.ts.map +1 -1
  20. package/dist/precaching/matchPrecache.d.ts.map +1 -1
  21. package/dist/precaching/precache.d.ts.map +1 -1
  22. package/dist/precaching/singletonPrecacheController.d.ts +38 -0
  23. package/dist/precaching/singletonPrecacheController.d.ts.map +1 -0
  24. package/dist/precaching/utils/getCacheKeyForURL.d.ts.map +1 -1
  25. package/dist/routing/RegExpRoute.d.ts +3 -3
  26. package/dist/routing/Router.d.ts +49 -23
  27. package/dist/routing/Router.d.ts.map +1 -1
  28. package/dist/routing/parseRoute.d.ts +16 -0
  29. package/dist/routing/parseRoute.d.ts.map +1 -0
  30. package/dist/routing/registerRoute.d.ts +5 -5
  31. package/dist/routing/registerRoute.d.ts.map +1 -1
  32. package/dist/routing/setCatchHandler.d.ts +1 -1
  33. package/dist/routing/setCatchHandler.d.ts.map +1 -1
  34. package/dist/routing/setDefaultHandler.d.ts +1 -1
  35. package/dist/routing/setDefaultHandler.d.ts.map +1 -1
  36. package/dist/routing/singletonRouter.d.ts +47 -0
  37. package/dist/routing/singletonRouter.d.ts.map +1 -0
  38. package/dist/routing/unregisterRoute.d.ts +1 -1
  39. package/dist/routing/unregisterRoute.d.ts.map +1 -1
  40. package/package.json +4 -4
  41. package/src/abstractions/Serwist.ts +10 -12
  42. package/src/abstractions/installSerwist.ts +4 -4
  43. package/src/index.precaching.ts +3 -0
  44. package/src/index.routing.ts +15 -1
  45. package/src/plugins/googleAnalytics/initialize.ts +19 -6
  46. package/src/plugins/precaching/PrecacheFallbackPlugin.ts +2 -2
  47. package/src/precaching/addPlugins.ts +2 -2
  48. package/src/precaching/addRoute.ts +2 -2
  49. package/src/precaching/createHandlerBoundToURL.ts +2 -2
  50. package/src/precaching/getCacheKeyForURL.ts +2 -2
  51. package/src/precaching/matchPrecache.ts +2 -3
  52. package/src/precaching/precache.ts +2 -2
  53. package/src/precaching/singletonPrecacheController.ts +57 -0
  54. package/src/precaching/utils/getCacheKeyForURL.ts +2 -2
  55. package/src/routing/RegExpRoute.ts +3 -3
  56. package/src/routing/Router.ts +101 -52
  57. package/src/routing/{utils/parseRoute.ts → parseRoute.ts} +14 -3
  58. package/src/routing/registerRoute.ts +7 -13
  59. package/src/routing/setCatchHandler.ts +3 -4
  60. package/src/routing/setDefaultHandler.ts +3 -4
  61. package/src/routing/singletonRouter.ts +76 -0
  62. package/src/routing/unregisterRoute.ts +3 -4
  63. package/dist/precaching/utils/getOrCreatePrecacheController.d.ts +0 -7
  64. package/dist/precaching/utils/getOrCreatePrecacheController.d.ts.map +0 -1
  65. package/dist/routing/utils/getOrCreateDefaultRouter.d.ts +0 -10
  66. package/dist/routing/utils/getOrCreateDefaultRouter.d.ts.map +0 -1
  67. package/dist/routing/utils/parseRoute.d.ts +0 -5
  68. package/dist/routing/utils/parseRoute.d.ts.map +0 -1
  69. package/src/precaching/utils/getOrCreatePrecacheController.ts +0 -22
  70. package/src/routing/utils/getOrCreateDefaultRouter.ts +0 -29
@@ -6,15 +6,13 @@ import { type HandlePrecachingOptions } from "./handlePrecaching.js";
6
6
  import type { RuntimeCaching } from "./types.js";
7
7
  export interface SerwistOptions {
8
8
  /**
9
- * The precache controller that will be used to perform efficient
10
- * precaching of assets.
11
- * @see https://serwist.pages.dev/docs/sw/precaching
9
+ * An optional `PrecacheController` instance. If not provided, the singleton
10
+ * `PrecacheController` will be used.
12
11
  */
13
12
  precacheController?: PrecacheController;
14
13
  /**
15
- * The router that will be used to process a `FetchEvent`, responding
16
- * with a `Response` if a matching route exists.
17
- * @see https://serwist.pages.dev/docs/sw/routing
14
+ * An optional `Router` instance. If not provided, the singleton `Router`
15
+ * will be used.
18
16
  */
19
17
  router?: Router;
20
18
  }
@@ -79,6 +77,6 @@ export declare class Serwist {
79
77
  private _precacheController;
80
78
  private _router;
81
79
  constructor({ precacheController, router }?: SerwistOptions);
82
- install({ precacheEntries, precacheOptions, cleanupOutdatedCaches, navigateFallback, navigateFallbackAllowlist, navigateFallbackDenylist, skipWaiting, importScripts, navigationPreload, cacheId, clientsClaim, runtimeCaching, offlineAnalyticsConfig, disableDevLogs, fallbacks, }: SerwistInstallOptions): void;
80
+ install({ precacheEntries, precacheOptions, cleanupOutdatedCaches, navigateFallback, navigateFallbackAllowlist, navigateFallbackDenylist, skipWaiting, importScripts, navigationPreload, cacheId, clientsClaim, runtimeCaching, offlineAnalyticsConfig, disableDevLogs, fallbacks, }?: SerwistInstallOptions): void;
83
81
  }
84
82
  //# sourceMappingURL=Serwist.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Serwist.d.ts","sourceRoot":"","sources":["../../src/abstractions/Serwist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,gCAAgC,EAAc,MAAM,0CAA0C,CAAC;AAC7G,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAMzE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAK9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAsB,SAAQ,uBAAuB;IACpE;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,cAAc,EAAE,CAAC;IAClC;;;OAGG;IACH,sBAAsB,CAAC,EAAE,gCAAgC,GAAG,OAAO,CAAC;IACpE;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;CACtD;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,OAAO,CAAS;gBACZ,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAE,cAAmB;IAI/D,OAAO,CAAC,EACN,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,EACzB,wBAAwB,EACxB,WAAmB,EACnB,aAAa,EACb,iBAAyB,EACzB,OAAO,EACP,YAAoB,EACpB,cAAc,EACd,sBAAsB,EACtB,cAAsB,EACtB,SAAS,GACV,EAAE,qBAAqB;CA8DzB"}
1
+ {"version":3,"file":"Serwist.d.ts","sourceRoot":"","sources":["../../src/abstractions/Serwist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,gCAAgC,EAAc,MAAM,0CAA0C,CAAC;AAC7G,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAMzE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAK9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAsB,SAAQ,uBAAuB;IACpE;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,cAAc,EAAE,CAAC;IAClC;;;OAGG;IACH,sBAAsB,CAAC,EAAE,gCAAgC,GAAG,OAAO,CAAC;IACpE;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;CACtD;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,OAAO,CAAS;gBACZ,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAE,cAAmB;IAI/D,OAAO,CAAC,EACN,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,EACzB,wBAAwB,EACxB,WAAmB,EACnB,aAAa,EACb,iBAAyB,EACzB,OAAO,EACP,YAAoB,EACpB,cAAc,EACd,sBAAsB,EACtB,cAAsB,EACtB,SAAS,GACV,GAAE,qBAA0B;CA8D9B"}
@@ -1,5 +1,5 @@
1
1
  import { assert, logger } from '@serwist/core/internal';
2
- import { R as Route } from './registerRoute.js';
2
+ import { R as Route } from './singletonRouter.js';
3
3
 
4
4
  class NavigationRoute extends Route {
5
5
  _allowlist;
@@ -1,8 +1,8 @@
1
1
  import { assert, SerwistError, logger, getFriendlyURL, privateCacheNames } from '@serwist/core/internal';
2
- import { r as registerRoute, R as Route } from './registerRoute.js';
2
+ import { g as getSingletonRouter, R as Route } from './singletonRouter.js';
3
3
  import { N as NetworkOnly, a as NetworkFirst } from './NetworkOnly.js';
4
4
  import { openDB } from 'idb';
5
- import { g as getOrCreatePrecacheController } from './getOrCreatePrecacheController.js';
5
+ import { g as getSingletonPrecacheController } from './singletonPrecacheController.js';
6
6
 
7
7
  const DB_VERSION = 3;
8
8
  const DB_NAME = "serwist-background-sync";
@@ -528,20 +528,20 @@ const createGtmJsRoute = (cacheName)=>{
528
528
  });
529
529
  return new Route(match, handler, "GET");
530
530
  };
531
- const initialize = (options = {})=>{
532
- const cacheName = privateCacheNames.getGoogleAnalyticsName(options.cacheName);
531
+ const initialize = ({ cacheName, router = getSingletonRouter(), ...options } = {})=>{
532
+ const resolvedCacheName = privateCacheNames.getGoogleAnalyticsName(cacheName);
533
533
  const bgSyncPlugin = new BackgroundSyncPlugin(QUEUE_NAME, {
534
534
  maxRetentionTime: MAX_RETENTION_TIME,
535
535
  onSync: createOnSyncCallback(options)
536
536
  });
537
537
  const routes = [
538
- createGtmJsRoute(cacheName),
539
- createAnalyticsJsRoute(cacheName),
540
- createGtagJsRoute(cacheName),
538
+ createGtmJsRoute(resolvedCacheName),
539
+ createAnalyticsJsRoute(resolvedCacheName),
540
+ createGtagJsRoute(resolvedCacheName),
541
541
  ...createCollectRoutes(bgSyncPlugin)
542
542
  ];
543
543
  for (const route of routes){
544
- registerRoute(route);
544
+ router.registerRoute(route);
545
545
  }
546
546
  };
547
547
 
@@ -550,7 +550,7 @@ class PrecacheFallbackPlugin {
550
550
  _precacheController;
551
551
  constructor({ fallbackUrls, precacheController }){
552
552
  this._fallbackUrls = fallbackUrls;
553
- this._precacheController = precacheController || getOrCreatePrecacheController();
553
+ this._precacheController = precacheController || getSingletonPrecacheController();
554
554
  }
555
555
  async handlerDidError(param) {
556
556
  for (const fallback of this._fallbackUrls){
@@ -1,6 +1,7 @@
1
1
  import { logger, getFriendlyURL, privateCacheNames } from '@serwist/core/internal';
2
- import { g as getOrCreatePrecacheController } from './getOrCreatePrecacheController.js';
3
- import { R as Route, r as registerRoute } from './registerRoute.js';
2
+ import { g as getSingletonPrecacheController } from './singletonPrecacheController.js';
3
+ import { r as registerRoute } from './registerRoute.js';
4
+ import { R as Route } from './singletonRouter.js';
4
5
 
5
6
  function removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching = []) {
6
7
  for (const paramName of [
@@ -89,18 +90,18 @@ const cleanupOutdatedCaches = ()=>{
89
90
  };
90
91
 
91
92
  const createHandlerBoundToURL = (url)=>{
92
- const precacheController = getOrCreatePrecacheController();
93
+ const precacheController = getSingletonPrecacheController();
93
94
  return precacheController.createHandlerBoundToURL(url);
94
95
  };
95
96
 
96
97
  const addRoute = (options)=>{
97
- const precacheController = getOrCreatePrecacheController();
98
+ const precacheController = getSingletonPrecacheController();
98
99
  const precacheRoute = new PrecacheRoute(precacheController, options);
99
100
  registerRoute(precacheRoute);
100
101
  };
101
102
 
102
103
  const precache = (entries)=>{
103
- const precacheController = getOrCreatePrecacheController();
104
+ const precacheController = getSingletonPrecacheController();
104
105
  precacheController.precache(entries);
105
106
  };
106
107
 
@@ -1,408 +1,7 @@
1
- import { assert, logger, getFriendlyURL, SerwistError } from '@serwist/core/internal';
2
-
3
- const defaultMethod = "GET";
4
- const validMethods = [
5
- "DELETE",
6
- "GET",
7
- "HEAD",
8
- "PATCH",
9
- "POST",
10
- "PUT"
11
- ];
12
-
13
- const normalizeHandler = (handler)=>{
14
- if (handler && typeof handler === "object") {
15
- if (process.env.NODE_ENV !== "production") {
16
- assert.hasMethod(handler, "handle", {
17
- moduleName: "@serwist/routing",
18
- className: "Route",
19
- funcName: "constructor",
20
- paramName: "handler"
21
- });
22
- }
23
- return handler;
24
- }
25
- if (process.env.NODE_ENV !== "production") {
26
- assert.isType(handler, "function", {
27
- moduleName: "@serwist/routing",
28
- className: "Route",
29
- funcName: "constructor",
30
- paramName: "handler"
31
- });
32
- }
33
- return {
34
- handle: handler
35
- };
36
- };
37
-
38
- class Route {
39
- handler;
40
- match;
41
- method;
42
- catchHandler;
43
- constructor(match, handler, method = defaultMethod){
44
- if (process.env.NODE_ENV !== "production") {
45
- assert.isType(match, "function", {
46
- moduleName: "@serwist/routing",
47
- className: "Route",
48
- funcName: "constructor",
49
- paramName: "match"
50
- });
51
- if (method) {
52
- assert.isOneOf(method, validMethods, {
53
- paramName: "method"
54
- });
55
- }
56
- }
57
- this.handler = normalizeHandler(handler);
58
- this.match = match;
59
- this.method = method;
60
- }
61
- setCatchHandler(handler) {
62
- this.catchHandler = normalizeHandler(handler);
63
- }
64
- }
65
-
66
- class Router {
67
- _routes;
68
- _defaultHandlerMap;
69
- _catchHandler;
70
- constructor(){
71
- this._routes = new Map();
72
- this._defaultHandlerMap = new Map();
73
- }
74
- get routes() {
75
- return this._routes;
76
- }
77
- addFetchListener() {
78
- self.addEventListener("fetch", (event)=>{
79
- const { request } = event;
80
- const responsePromise = this.handleRequest({
81
- request,
82
- event
83
- });
84
- if (responsePromise) {
85
- event.respondWith(responsePromise);
86
- }
87
- });
88
- }
89
- addCacheListener() {
90
- self.addEventListener("message", (event)=>{
91
- if (event.data && event.data.type === "CACHE_URLS") {
92
- const { payload } = event.data;
93
- if (process.env.NODE_ENV !== "production") {
94
- logger.debug("Caching URLs from the window", payload.urlsToCache);
95
- }
96
- const requestPromises = Promise.all(payload.urlsToCache.map((entry)=>{
97
- if (typeof entry === "string") {
98
- entry = [
99
- entry
100
- ];
101
- }
102
- const request = new Request(...entry);
103
- return this.handleRequest({
104
- request,
105
- event
106
- });
107
- }));
108
- event.waitUntil(requestPromises);
109
- if (event.ports?.[0]) {
110
- void requestPromises.then(()=>event.ports[0].postMessage(true));
111
- }
112
- }
113
- });
114
- }
115
- handleRequest({ request, event }) {
116
- if (process.env.NODE_ENV !== "production") {
117
- assert.isInstance(request, Request, {
118
- moduleName: "@serwist/routing",
119
- className: "Router",
120
- funcName: "handleRequest",
121
- paramName: "options.request"
122
- });
123
- }
124
- const url = new URL(request.url, location.href);
125
- if (!url.protocol.startsWith("http")) {
126
- if (process.env.NODE_ENV !== "production") {
127
- logger.debug("The Serwist router only supports URLs that start with 'http'.");
128
- }
129
- return;
130
- }
131
- const sameOrigin = url.origin === location.origin;
132
- const { params, route } = this.findMatchingRoute({
133
- event,
134
- request,
135
- sameOrigin,
136
- url
137
- });
138
- let handler = route?.handler;
139
- const debugMessages = [];
140
- if (process.env.NODE_ENV !== "production") {
141
- if (handler) {
142
- debugMessages.push([
143
- "Found a route to handle this request:",
144
- route
145
- ]);
146
- if (params) {
147
- debugMessages.push([
148
- `Passing the following params to the route's handler:`,
149
- params
150
- ]);
151
- }
152
- }
153
- }
154
- const method = request.method;
155
- if (!handler && this._defaultHandlerMap.has(method)) {
156
- if (process.env.NODE_ENV !== "production") {
157
- debugMessages.push(`Failed to find a matching route. Falling back to the default handler for ${method}.`);
158
- }
159
- handler = this._defaultHandlerMap.get(method);
160
- }
161
- if (!handler) {
162
- if (process.env.NODE_ENV !== "production") {
163
- logger.debug(`No route found for: ${getFriendlyURL(url)}`);
164
- }
165
- return;
166
- }
167
- if (process.env.NODE_ENV !== "production") {
168
- logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`);
169
- for (const msg of debugMessages){
170
- if (Array.isArray(msg)) {
171
- logger.log(...msg);
172
- } else {
173
- logger.log(msg);
174
- }
175
- }
176
- logger.groupEnd();
177
- }
178
- let responsePromise;
179
- try {
180
- responsePromise = handler.handle({
181
- url,
182
- request,
183
- event,
184
- params
185
- });
186
- } catch (err) {
187
- responsePromise = Promise.reject(err);
188
- }
189
- const catchHandler = route?.catchHandler;
190
- if (responsePromise instanceof Promise && (this._catchHandler || catchHandler)) {
191
- responsePromise = responsePromise.catch(async (err)=>{
192
- if (catchHandler) {
193
- if (process.env.NODE_ENV !== "production") {
194
- logger.groupCollapsed(`Error thrown when responding to: ${getFriendlyURL(url)}. Falling back to route's Catch Handler.`);
195
- logger.error("Error thrown by:", route);
196
- logger.error(err);
197
- logger.groupEnd();
198
- }
199
- try {
200
- return await catchHandler.handle({
201
- url,
202
- request,
203
- event,
204
- params
205
- });
206
- } catch (catchErr) {
207
- if (catchErr instanceof Error) {
208
- err = catchErr;
209
- }
210
- }
211
- }
212
- if (this._catchHandler) {
213
- if (process.env.NODE_ENV !== "production") {
214
- logger.groupCollapsed(`Error thrown when responding to: ${getFriendlyURL(url)}. Falling back to global Catch Handler.`);
215
- logger.error("Error thrown by:", route);
216
- logger.error(err);
217
- logger.groupEnd();
218
- }
219
- return this._catchHandler.handle({
220
- url,
221
- request,
222
- event
223
- });
224
- }
225
- throw err;
226
- });
227
- }
228
- return responsePromise;
229
- }
230
- findMatchingRoute({ url, sameOrigin, request, event }) {
231
- const routes = this._routes.get(request.method) || [];
232
- for (const route of routes){
233
- let params;
234
- const matchResult = route.match({
235
- url,
236
- sameOrigin,
237
- request,
238
- event
239
- });
240
- if (matchResult) {
241
- if (process.env.NODE_ENV !== "production") {
242
- if (matchResult instanceof Promise) {
243
- logger.warn(`While routing ${getFriendlyURL(url)}, an async matchCallback function was used. Please convert the following route to use a synchronous matchCallback function:`, route);
244
- }
245
- }
246
- params = matchResult;
247
- if (Array.isArray(params) && params.length === 0) {
248
- params = undefined;
249
- } else if (matchResult.constructor === Object && Object.keys(matchResult).length === 0) {
250
- params = undefined;
251
- } else if (typeof matchResult === "boolean") {
252
- params = undefined;
253
- }
254
- return {
255
- route,
256
- params
257
- };
258
- }
259
- }
260
- return {};
261
- }
262
- setDefaultHandler(handler, method = defaultMethod) {
263
- this._defaultHandlerMap.set(method, normalizeHandler(handler));
264
- }
265
- setCatchHandler(handler) {
266
- this._catchHandler = normalizeHandler(handler);
267
- }
268
- registerRoute(route) {
269
- if (process.env.NODE_ENV !== "production") {
270
- assert.isType(route, "object", {
271
- moduleName: "@serwist/routing",
272
- className: "Router",
273
- funcName: "registerRoute",
274
- paramName: "route"
275
- });
276
- assert.hasMethod(route, "match", {
277
- moduleName: "@serwist/routing",
278
- className: "Router",
279
- funcName: "registerRoute",
280
- paramName: "route"
281
- });
282
- assert.isType(route.handler, "object", {
283
- moduleName: "@serwist/routing",
284
- className: "Router",
285
- funcName: "registerRoute",
286
- paramName: "route"
287
- });
288
- assert.hasMethod(route.handler, "handle", {
289
- moduleName: "@serwist/routing",
290
- className: "Router",
291
- funcName: "registerRoute",
292
- paramName: "route.handler"
293
- });
294
- assert.isType(route.method, "string", {
295
- moduleName: "@serwist/routing",
296
- className: "Router",
297
- funcName: "registerRoute",
298
- paramName: "route.method"
299
- });
300
- }
301
- if (!this._routes.has(route.method)) {
302
- this._routes.set(route.method, []);
303
- }
304
- this._routes.get(route.method).push(route);
305
- }
306
- unregisterRoute(route) {
307
- if (!this._routes.has(route.method)) {
308
- throw new SerwistError("unregister-route-but-not-found-with-method", {
309
- method: route.method
310
- });
311
- }
312
- const routeIndex = this._routes.get(route.method).indexOf(route);
313
- if (routeIndex > -1) {
314
- this._routes.get(route.method).splice(routeIndex, 1);
315
- } else {
316
- throw new SerwistError("unregister-route-route-not-registered");
317
- }
318
- }
319
- }
320
-
321
- let defaultRouter;
322
- const getOrCreateDefaultRouter = ()=>{
323
- if (!defaultRouter) {
324
- defaultRouter = new Router();
325
- defaultRouter.addFetchListener();
326
- defaultRouter.addCacheListener();
327
- }
328
- return defaultRouter;
329
- };
330
-
331
- class RegExpRoute extends Route {
332
- constructor(regExp, handler, method){
333
- if (process.env.NODE_ENV !== "production") {
334
- assert.isInstance(regExp, RegExp, {
335
- moduleName: "@serwist/routing",
336
- className: "RegExpRoute",
337
- funcName: "constructor",
338
- paramName: "pattern"
339
- });
340
- }
341
- const match = ({ url })=>{
342
- const result = regExp.exec(url.href);
343
- if (!result) {
344
- return;
345
- }
346
- if (url.origin !== location.origin && result.index !== 0) {
347
- if (process.env.NODE_ENV !== "production") {
348
- logger.debug(`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.`);
349
- }
350
- return;
351
- }
352
- return result.slice(1);
353
- };
354
- super(match, handler, method);
355
- }
356
- }
357
-
358
- const parseRoute = (capture, handler, method)=>{
359
- let route;
360
- if (typeof capture === "string") {
361
- const captureUrl = new URL(capture, location.href);
362
- if (process.env.NODE_ENV !== "production") {
363
- if (!(capture.startsWith("/") || capture.startsWith("http"))) {
364
- throw new SerwistError("invalid-string", {
365
- moduleName: "@serwist/routing",
366
- funcName: "registerRoute",
367
- paramName: "capture"
368
- });
369
- }
370
- const valueToCheck = capture.startsWith("http") ? captureUrl.pathname : capture;
371
- const wildcards = "[*:?+]";
372
- if (new RegExp(`${wildcards}`).exec(valueToCheck)) {
373
- logger.debug(`The '$capture' parameter contains an Express-style wildcard character (${wildcards}). Strings are now always interpreted as exact matches; use a RegExp for partial or wildcard matches.`);
374
- }
375
- }
376
- const matchCallback = ({ url })=>{
377
- if (process.env.NODE_ENV !== "production") {
378
- if (url.pathname === captureUrl.pathname && url.origin !== captureUrl.origin) {
379
- logger.debug(`${capture} only partially matches the cross-origin URL ${url.toString()}. This route will only handle cross-origin requests if they match the entire URL.`);
380
- }
381
- }
382
- return url.href === captureUrl.href;
383
- };
384
- route = new Route(matchCallback, handler, method);
385
- } else if (capture instanceof RegExp) {
386
- route = new RegExpRoute(capture, handler, method);
387
- } else if (typeof capture === "function") {
388
- route = new Route(capture, handler, method);
389
- } else if (capture instanceof Route) {
390
- route = capture;
391
- } else {
392
- throw new SerwistError("unsupported-route-type", {
393
- moduleName: "@serwist/routing",
394
- funcName: "registerRoute",
395
- paramName: "capture"
396
- });
397
- }
398
- return route;
399
- };
1
+ import { g as getSingletonRouter } from './singletonRouter.js';
400
2
 
401
3
  const registerRoute = (capture, handler, method)=>{
402
- const route = parseRoute(capture, handler, method);
403
- const defaultRouter = getOrCreateDefaultRouter();
404
- defaultRouter.registerRoute(route);
405
- return route;
4
+ return getSingletonRouter().registerCapture(capture, handler, method);
406
5
  };
407
6
 
408
- export { Route as R, RegExpRoute as a, Router as b, getOrCreateDefaultRouter as g, parseRoute as p, registerRoute as r };
7
+ export { registerRoute as r };
@@ -418,12 +418,16 @@ class PrecacheController {
418
418
  }
419
419
  }
420
420
 
421
- let precacheController;
422
- const getOrCreatePrecacheController = ()=>{
423
- if (!precacheController) {
424
- precacheController = new PrecacheController();
421
+ let defaultPrecacheController = undefined;
422
+ const getSingletonPrecacheController = ()=>{
423
+ if (!defaultPrecacheController) {
424
+ defaultPrecacheController = new PrecacheController();
425
425
  }
426
- return precacheController;
426
+ return defaultPrecacheController;
427
+ };
428
+ const setSingletonPrecacheController = (precacheController)=>{
429
+ defaultPrecacheController = precacheController;
430
+ return defaultPrecacheController;
427
431
  };
428
432
 
429
- export { PrecacheController as P, PrecacheStrategy as a, getOrCreatePrecacheController as g };
433
+ export { PrecacheController as P, PrecacheStrategy as a, getSingletonPrecacheController as g, setSingletonPrecacheController as s };