@serwist/next 9.0.0-preview.1 → 9.0.0-preview.10

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAMhE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAQvC,QAAA,MAAM,eAAe,kBAAmB,yBAAyB,mBAAkB,UAAU,KAAK,UA4NjG,CAAC;AAEF,eAAe,eAAe,CAAC;AAC/B,YAAY,EAAE,yBAAyB,IAAI,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAKhE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAQvC,QAAA,MAAM,eAAe,kBAAmB,yBAAyB,mBAAkB,UAAU,KAAK,UAkOjG,CAAC;AAEF,eAAe,eAAe,CAAC;AAC/B,YAAY,EAAE,yBAAyB,IAAI,aAAa,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -1,12 +1,11 @@
1
+ import fs from 'node:fs';
1
2
  import path from 'node:path';
2
3
  import { fileURLToPath } from 'node:url';
3
4
  import { validateNextInjectManifestOptions } from '@serwist/build/next';
4
5
  import { InjectManifest } from '@serwist/webpack-plugin';
5
6
  import { ChildCompilationPlugin, relativeToOutputPath } from '@serwist/webpack-plugin/internal';
6
- import { CleanWebpackPlugin } from 'clean-webpack-plugin';
7
- import fg from 'fast-glob';
7
+ import { globSync } from 'glob';
8
8
  import crypto from 'node:crypto';
9
- import fs from 'node:fs';
10
9
  import { createRequire } from 'node:module';
11
10
  import chalk from 'chalk';
12
11
 
@@ -157,7 +156,24 @@ const withSerwistInit = (pluginOptions)=>{
157
156
  swDest = path.join(options.dir, swDest);
158
157
  }
159
158
  const publicDir = path.resolve(options.dir, "public");
160
- const destDir = path.dirname(swDest);
159
+ const { dir: destDir, base: destBase } = path.parse(swDest);
160
+ const cleanUpList = globSync([
161
+ "swe-worker-*.js",
162
+ "swe-worker-*.js.map",
163
+ destBase,
164
+ `${destBase}.map`
165
+ ], {
166
+ absolute: true,
167
+ nodir: true,
168
+ cwd: destDir
169
+ });
170
+ for (const file of cleanUpList){
171
+ fs.rm(file, {
172
+ force: true
173
+ }, (err)=>{
174
+ if (err) throw err;
175
+ });
176
+ }
161
177
  const shouldBuildSWEntryWorker = cacheOnNavigation;
162
178
  let swEntryPublicPath = undefined;
163
179
  let swEntryWorkerDest = undefined;
@@ -177,28 +193,21 @@ const withSerwistInit = (pluginOptions)=>{
177
193
  info(`Service worker: ${swDest}`);
178
194
  info(` URL: ${_sw}`);
179
195
  info(` Scope: ${_scope}`);
180
- config.plugins.push(new CleanWebpackPlugin({
181
- cleanOnceBeforeBuildPatterns: [
182
- path.join(destDir, "swe-worker-*.js"),
183
- path.join(destDir, "swe-worker-*.js.map"),
184
- swDest
185
- ]
186
- }));
187
196
  let resolvedManifestEntries = additionalPrecacheEntries;
188
197
  if (!resolvedManifestEntries) {
189
- const swDestFileName = path.basename(swDest);
190
198
  const userPublicGlob = typeof globPublicPatterns === "string" ? [
191
199
  globPublicPatterns
192
200
  ] : globPublicPatterns ?? [
193
201
  "**/*"
194
202
  ];
195
- const publicScan = fg.sync([
203
+ const publicScan = globSync([
196
204
  ...userPublicGlob,
197
205
  "!swe-worker-*.js",
198
206
  "!swe-worker-*.js.map",
199
- `!${swDestFileName.replace(/^\/+/, "")}`,
200
- `!${swDestFileName.replace(/^\/+/, "")}.map`
207
+ `!${destBase}`,
208
+ `!${destBase}.map`
201
209
  ], {
210
+ nodir: true,
202
211
  cwd: publicDir
203
212
  });
204
213
  resolvedManifestEntries = publicScan.map((f)=>({
@@ -1,5 +1,4 @@
1
+ import { PAGES_CACHE_NAME } from "./worker/constants.js";
1
2
  import { defaultCache } from "./worker/defaultCache.js";
2
- import { type DefinePageRuntimeCachingOptions, type PageRuntimeCaching, definePageRuntimeCaching } from "./worker/definePageRuntimeCaching.js";
3
- export { defaultCache, definePageRuntimeCaching };
4
- export type { DefinePageRuntimeCachingOptions, PageRuntimeCaching };
3
+ export { defaultCache, PAGES_CACHE_NAME };
5
4
  //# sourceMappingURL=index.worker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.worker.d.ts","sourceRoot":"","sources":["../src/index.worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,KAAK,+BAA+B,EAAE,KAAK,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAE/I,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAE,CAAC;AAClD,YAAY,EAAE,+BAA+B,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.worker.d.ts","sourceRoot":"","sources":["../src/index.worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
@@ -1,163 +1,162 @@
1
- const nonNullable = (value)=>value !== null && value !== undefined;
1
+ import { ExpirationPlugin } from '@serwist/expiration';
2
+ import { RangeRequestsPlugin } from '@serwist/range-requests';
3
+ import { CacheFirst, StaleWhileRevalidate, NetworkFirst } from '@serwist/strategies';
2
4
 
3
- const definePageRuntimeCaching = ({ rscPrefetch, rsc, html })=>{
4
- const pageRcs = [
5
- rscPrefetch,
6
- rsc,
7
- html
8
- ];
9
- if (pageRcs[0]) {
10
- if (!pageRcs[0].options) pageRcs[0].options = {};
11
- pageRcs[0].options.cacheName = "pages-rsc-prefetch";
12
- }
13
- if (pageRcs[1]) {
14
- if (!pageRcs[1].options) pageRcs[1].options = {};
15
- pageRcs[1].options.cacheName = "pages-rsc";
16
- }
17
- if (pageRcs[2]) {
18
- if (!pageRcs[2].options) pageRcs[2].options = {};
19
- pageRcs[2].options.cacheName = "pages";
20
- }
21
- return pageRcs.filter(nonNullable);
5
+ const PAGES_CACHE_NAME = {
6
+ rscPrefetch: "pages-rsc-prefetch",
7
+ rsc: "pages-rsc",
8
+ html: "pages"
22
9
  };
23
10
 
24
11
  const defaultCache = [
25
12
  {
26
- urlPattern: /^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,
27
- handler: "CacheFirst",
28
- options: {
13
+ matcher: /^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,
14
+ handler: new CacheFirst({
29
15
  cacheName: "google-fonts-webfonts",
30
- expiration: {
31
- maxEntries: 4,
32
- maxAgeSeconds: 365 * 24 * 60 * 60
33
- }
34
- }
16
+ plugins: [
17
+ new ExpirationPlugin({
18
+ maxEntries: 4,
19
+ maxAgeSeconds: 365 * 24 * 60 * 60
20
+ })
21
+ ]
22
+ })
35
23
  },
36
24
  {
37
- urlPattern: /^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,
38
- handler: "StaleWhileRevalidate",
39
- options: {
25
+ matcher: /^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,
26
+ handler: new StaleWhileRevalidate({
40
27
  cacheName: "google-fonts-stylesheets",
41
- expiration: {
42
- maxEntries: 4,
43
- maxAgeSeconds: 7 * 24 * 60 * 60
44
- }
45
- }
28
+ plugins: [
29
+ new ExpirationPlugin({
30
+ maxEntries: 4,
31
+ maxAgeSeconds: 7 * 24 * 60 * 60
32
+ })
33
+ ]
34
+ })
46
35
  },
47
36
  {
48
- urlPattern: /\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,
49
- handler: "StaleWhileRevalidate",
50
- options: {
37
+ matcher: /\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,
38
+ handler: new StaleWhileRevalidate({
51
39
  cacheName: "static-font-assets",
52
- expiration: {
53
- maxEntries: 4,
54
- maxAgeSeconds: 7 * 24 * 60 * 60
55
- }
56
- }
40
+ plugins: [
41
+ new ExpirationPlugin({
42
+ maxEntries: 4,
43
+ maxAgeSeconds: 7 * 24 * 60 * 60
44
+ })
45
+ ]
46
+ })
57
47
  },
58
48
  {
59
- urlPattern: /\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,
60
- handler: "StaleWhileRevalidate",
61
- options: {
49
+ matcher: /\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,
50
+ handler: new StaleWhileRevalidate({
62
51
  cacheName: "static-image-assets",
63
- expiration: {
64
- maxEntries: 64,
65
- maxAgeSeconds: 30 * 24 * 60 * 60
66
- }
67
- }
52
+ plugins: [
53
+ new ExpirationPlugin({
54
+ maxEntries: 64,
55
+ maxAgeSeconds: 30 * 24 * 60 * 60
56
+ })
57
+ ]
58
+ })
68
59
  },
69
60
  {
70
- urlPattern: /\/_next\/static.+\.js$/i,
71
- handler: "CacheFirst",
72
- options: {
61
+ matcher: /\/_next\/static.+\.js$/i,
62
+ handler: new CacheFirst({
73
63
  cacheName: "next-static-js-assets",
74
- expiration: {
75
- maxEntries: 64,
76
- maxAgeSeconds: 24 * 60 * 60
77
- }
78
- }
64
+ plugins: [
65
+ new ExpirationPlugin({
66
+ maxEntries: 64,
67
+ maxAgeSeconds: 24 * 60 * 60
68
+ })
69
+ ]
70
+ })
79
71
  },
80
72
  {
81
- urlPattern: /\/_next\/image\?url=.+$/i,
82
- handler: "StaleWhileRevalidate",
83
- options: {
73
+ matcher: /\/_next\/image\?url=.+$/i,
74
+ handler: new StaleWhileRevalidate({
84
75
  cacheName: "next-image",
85
- expiration: {
86
- maxEntries: 64,
87
- maxAgeSeconds: 24 * 60 * 60
88
- }
89
- }
76
+ plugins: [
77
+ new ExpirationPlugin({
78
+ maxEntries: 64,
79
+ maxAgeSeconds: 24 * 60 * 60
80
+ })
81
+ ]
82
+ })
90
83
  },
91
84
  {
92
- urlPattern: /\.(?:mp3|wav|ogg)$/i,
93
- handler: "CacheFirst",
94
- options: {
95
- rangeRequests: true,
85
+ matcher: /\.(?:mp3|wav|ogg)$/i,
86
+ handler: new CacheFirst({
96
87
  cacheName: "static-audio-assets",
97
- expiration: {
98
- maxEntries: 32,
99
- maxAgeSeconds: 24 * 60 * 60
100
- }
101
- }
88
+ plugins: [
89
+ new ExpirationPlugin({
90
+ maxEntries: 32,
91
+ maxAgeSeconds: 24 * 60 * 60
92
+ }),
93
+ new RangeRequestsPlugin()
94
+ ]
95
+ })
102
96
  },
103
97
  {
104
- urlPattern: /\.(?:mp4|webm)$/i,
105
- handler: "CacheFirst",
106
- options: {
107
- rangeRequests: true,
98
+ matcher: /\.(?:mp4|webm)$/i,
99
+ handler: new CacheFirst({
108
100
  cacheName: "static-video-assets",
109
- expiration: {
110
- maxEntries: 32,
111
- maxAgeSeconds: 24 * 60 * 60
112
- }
113
- }
101
+ plugins: [
102
+ new ExpirationPlugin({
103
+ maxEntries: 32,
104
+ maxAgeSeconds: 24 * 60 * 60
105
+ }),
106
+ new RangeRequestsPlugin()
107
+ ]
108
+ })
114
109
  },
115
110
  {
116
- urlPattern: /\.(?:js)$/i,
117
- handler: "StaleWhileRevalidate",
118
- options: {
111
+ matcher: /\.(?:js)$/i,
112
+ handler: new StaleWhileRevalidate({
119
113
  cacheName: "static-js-assets",
120
- expiration: {
121
- maxEntries: 48,
122
- maxAgeSeconds: 24 * 60 * 60
123
- }
124
- }
114
+ plugins: [
115
+ new ExpirationPlugin({
116
+ maxEntries: 48,
117
+ maxAgeSeconds: 24 * 60 * 60
118
+ })
119
+ ]
120
+ })
125
121
  },
126
122
  {
127
- urlPattern: /\.(?:css|less)$/i,
128
- handler: "StaleWhileRevalidate",
129
- options: {
123
+ matcher: /\.(?:css|less)$/i,
124
+ handler: new StaleWhileRevalidate({
130
125
  cacheName: "static-style-assets",
131
- expiration: {
132
- maxEntries: 32,
133
- maxAgeSeconds: 24 * 60 * 60
134
- }
135
- }
126
+ plugins: [
127
+ new ExpirationPlugin({
128
+ maxEntries: 32,
129
+ maxAgeSeconds: 24 * 60 * 60
130
+ })
131
+ ]
132
+ })
136
133
  },
137
134
  {
138
- urlPattern: /\/_next\/data\/.+\/.+\.json$/i,
139
- handler: "StaleWhileRevalidate",
140
- options: {
135
+ matcher: /\/_next\/data\/.+\/.+\.json$/i,
136
+ handler: new NetworkFirst({
141
137
  cacheName: "next-data",
142
- expiration: {
143
- maxEntries: 32,
144
- maxAgeSeconds: 24 * 60 * 60
145
- }
146
- }
138
+ plugins: [
139
+ new ExpirationPlugin({
140
+ maxEntries: 32,
141
+ maxAgeSeconds: 24 * 60 * 60
142
+ })
143
+ ]
144
+ })
147
145
  },
148
146
  {
149
- urlPattern: /\.(?:json|xml|csv)$/i,
150
- handler: "NetworkFirst",
151
- options: {
147
+ matcher: /\.(?:json|xml|csv)$/i,
148
+ handler: new NetworkFirst({
152
149
  cacheName: "static-data-assets",
153
- expiration: {
154
- maxEntries: 32,
155
- maxAgeSeconds: 24 * 60 * 60
156
- }
157
- }
150
+ plugins: [
151
+ new ExpirationPlugin({
152
+ maxEntries: 32,
153
+ maxAgeSeconds: 24 * 60 * 60
154
+ })
155
+ ]
156
+ })
158
157
  },
159
158
  {
160
- urlPattern: ({ sameOrigin, url: { pathname } })=>{
159
+ matcher: ({ sameOrigin, url: { pathname } })=>{
161
160
  if (!sameOrigin || pathname.startsWith("/api/auth/callback")) {
162
161
  return false;
163
162
  }
@@ -166,72 +165,79 @@ const defaultCache = [
166
165
  }
167
166
  return false;
168
167
  },
169
- handler: "NetworkFirst",
170
168
  method: "GET",
171
- options: {
169
+ handler: new NetworkFirst({
172
170
  cacheName: "apis",
173
- expiration: {
174
- maxEntries: 16,
175
- maxAgeSeconds: 24 * 60 * 60
176
- },
171
+ plugins: [
172
+ new ExpirationPlugin({
173
+ maxEntries: 16,
174
+ maxAgeSeconds: 24 * 60 * 60
175
+ })
176
+ ],
177
177
  networkTimeoutSeconds: 10
178
- }
179
- },
180
- ...definePageRuntimeCaching({
181
- rscPrefetch: {
182
- urlPattern: ({ request, url: { pathname }, sameOrigin })=>request.headers.get("RSC") === "1" && request.headers.get("Next-Router-Prefetch") === "1" && sameOrigin && !pathname.startsWith("/api/"),
183
- handler: "NetworkFirst",
184
- options: {
185
- expiration: {
178
+ })
179
+ },
180
+ {
181
+ matcher: ({ request, url: { pathname }, sameOrigin })=>request.headers.get("RSC") === "1" && request.headers.get("Next-Router-Prefetch") === "1" && sameOrigin && !pathname.startsWith("/api/"),
182
+ handler: new NetworkFirst({
183
+ cacheName: PAGES_CACHE_NAME.rscPrefetch,
184
+ plugins: [
185
+ new ExpirationPlugin({
186
186
  maxEntries: 32,
187
187
  maxAgeSeconds: 24 * 60 * 60
188
- }
189
- }
190
- },
191
- rsc: {
192
- urlPattern: ({ request, url: { pathname }, sameOrigin })=>request.headers.get("RSC") === "1" && sameOrigin && !pathname.startsWith("/api/"),
193
- handler: "NetworkFirst",
194
- options: {
195
- expiration: {
188
+ })
189
+ ]
190
+ })
191
+ },
192
+ {
193
+ matcher: ({ request, url: { pathname }, sameOrigin })=>request.headers.get("RSC") === "1" && sameOrigin && !pathname.startsWith("/api/"),
194
+ handler: new NetworkFirst({
195
+ cacheName: PAGES_CACHE_NAME.rsc,
196
+ plugins: [
197
+ new ExpirationPlugin({
196
198
  maxEntries: 32,
197
199
  maxAgeSeconds: 24 * 60 * 60
198
- }
199
- }
200
- },
201
- html: {
202
- urlPattern: ({ request, url: { pathname }, sameOrigin })=>request.headers.get("Content-Type")?.includes("text/html") && sameOrigin && !pathname.startsWith("/api/"),
203
- handler: "NetworkFirst",
204
- options: {
205
- expiration: {
200
+ })
201
+ ]
202
+ })
203
+ },
204
+ {
205
+ matcher: ({ request, url: { pathname }, sameOrigin })=>request.headers.get("Content-Type")?.includes("text/html") && sameOrigin && !pathname.startsWith("/api/"),
206
+ handler: new NetworkFirst({
207
+ cacheName: PAGES_CACHE_NAME.html,
208
+ plugins: [
209
+ new ExpirationPlugin({
206
210
  maxEntries: 32,
207
211
  maxAgeSeconds: 24 * 60 * 60
208
- }
209
- }
210
- }
211
- }),
212
+ })
213
+ ]
214
+ })
215
+ },
212
216
  {
213
- urlPattern: ({ url: { pathname }, sameOrigin })=>sameOrigin && !pathname.startsWith("/api/"),
214
- handler: "NetworkFirst",
215
- options: {
217
+ matcher: ({ url: { pathname }, sameOrigin })=>sameOrigin && !pathname.startsWith("/api/"),
218
+ handler: new NetworkFirst({
216
219
  cacheName: "others",
217
- expiration: {
218
- maxEntries: 32,
219
- maxAgeSeconds: 24 * 60 * 60
220
- }
221
- }
220
+ plugins: [
221
+ new ExpirationPlugin({
222
+ maxEntries: 32,
223
+ maxAgeSeconds: 24 * 60 * 60
224
+ })
225
+ ]
226
+ })
222
227
  },
223
228
  {
224
- urlPattern: ({ sameOrigin })=>!sameOrigin,
225
- handler: "NetworkFirst",
226
- options: {
229
+ matcher: ({ sameOrigin })=>!sameOrigin,
230
+ handler: new NetworkFirst({
227
231
  cacheName: "cross-origin",
228
- expiration: {
229
- maxEntries: 32,
230
- maxAgeSeconds: 60 * 60
231
- },
232
+ plugins: [
233
+ new ExpirationPlugin({
234
+ maxEntries: 32,
235
+ maxAgeSeconds: 60 * 60
236
+ })
237
+ ],
232
238
  networkTimeoutSeconds: 10
233
- }
239
+ })
234
240
  }
235
241
  ];
236
242
 
237
- export { defaultCache, definePageRuntimeCaching };
243
+ export { PAGES_CACHE_NAME, defaultCache };
@@ -0,0 +1,6 @@
1
+ export declare const PAGES_CACHE_NAME: {
2
+ readonly rscPrefetch: "pages-rsc-prefetch";
3
+ readonly rsc: "pages-rsc";
4
+ readonly html: "pages";
5
+ };
6
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/worker/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB;;;;CAInB,CAAC"}
@@ -1,3 +1,15 @@
1
- import type { RuntimeCaching } from "@serwist/sw";
2
- export declare const defaultCache: RuntimeCaching[];
1
+ import { CacheFirst, NetworkFirst } from "@serwist/strategies";
2
+ export declare const defaultCache: ({
3
+ matcher: RegExp;
4
+ handler: CacheFirst;
5
+ method?: undefined;
6
+ } | {
7
+ matcher: ({ sameOrigin, url: { pathname } }: import("@serwist/core").RouteMatchCallbackOptions) => boolean;
8
+ method: "GET";
9
+ handler: NetworkFirst;
10
+ } | {
11
+ matcher: ({ request, url: { pathname }, sameOrigin }: import("@serwist/core").RouteMatchCallbackOptions) => boolean | undefined;
12
+ handler: NetworkFirst;
13
+ method?: undefined;
14
+ })[];
3
15
  //# sourceMappingURL=defaultCache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaultCache.d.ts","sourceRoot":"","sources":["../../src/worker/defaultCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,eAAO,MAAM,YAAY,kBA0NG,CAAC"}
1
+ {"version":3,"file":"defaultCache.d.ts","sourceRoot":"","sources":["../../src/worker/defaultCache.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAwB,MAAM,qBAAqB,CAAC;AAMrF,eAAO,MAAM,YAAY;;;;;;;;;;;;IA6OG,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serwist/next",
3
- "version": "9.0.0-preview.1",
3
+ "version": "9.0.0-preview.10",
4
4
  "type": "module",
5
5
  "description": "A module that integrates Serwist into your Next.js application.",
6
6
  "files": [
@@ -12,8 +12,13 @@
12
12
  "serwistjs",
13
13
  "sw",
14
14
  "service worker",
15
+ "progressive web apps",
15
16
  "web",
16
- "service-worker"
17
+ "service-worker",
18
+ "progressive-web-apps",
19
+ "next",
20
+ "next.js",
21
+ "pwa"
17
22
  ],
18
23
  "engines": {
19
24
  "node": ">=18.0.0"
@@ -51,12 +56,14 @@
51
56
  },
52
57
  "dependencies": {
53
58
  "chalk": "5.3.0",
54
- "clean-webpack-plugin": "4.0.0",
55
- "fast-glob": "3.3.2",
56
- "@serwist/build": "9.0.0-preview.1",
57
- "@serwist/core": "9.0.0-preview.1",
58
- "@serwist/webpack-plugin": "9.0.0-preview.1",
59
- "@serwist/window": "9.0.0-preview.1"
59
+ "glob": "10.3.10",
60
+ "@serwist/build": "9.0.0-preview.10",
61
+ "@serwist/core": "9.0.0-preview.10",
62
+ "@serwist/expiration": "9.0.0-preview.10",
63
+ "@serwist/range-requests": "9.0.0-preview.10",
64
+ "@serwist/strategies": "9.0.0-preview.10",
65
+ "@serwist/webpack-plugin": "9.0.0-preview.10",
66
+ "@serwist/window": "9.0.0-preview.10"
60
67
  },
61
68
  "devDependencies": {
62
69
  "@types/node": "20.11.16",
@@ -65,17 +72,17 @@
65
72
  "react-dom": "18.2.0",
66
73
  "rollup": "4.9.6",
67
74
  "type-fest": "4.10.2",
68
- "typescript": "5.4.0-dev.20240203",
75
+ "typescript": "5.4.0-dev.20240206",
69
76
  "webpack": "5.90.1",
70
- "@serwist/constants": "9.0.0-preview.1",
71
- "@serwist/sw": "9.0.0-preview.1",
72
- "@serwist/utils": "9.0.0-preview.1"
77
+ "@serwist/constants": "9.0.0-preview.10",
78
+ "@serwist/sw": "9.0.0-preview.10",
79
+ "@serwist/utils": "9.0.0-preview.10"
73
80
  },
74
81
  "peerDependencies": {
75
82
  "next": ">=14.0.0",
76
83
  "typescript": ">=5.0.0",
77
84
  "webpack": ">=5.9.0",
78
- "@serwist/sw": "9.0.0-preview.1"
85
+ "@serwist/sw": "9.0.0-preview.10"
79
86
  },
80
87
  "peerDependenciesMeta": {
81
88
  "@serwist/sw": {
package/src/index.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import fs from "node:fs";
1
2
  import path from "node:path";
2
3
  import { fileURLToPath } from "node:url";
3
4
 
@@ -5,8 +6,7 @@ import type { NextInjectManifestOptions } from "@serwist/build";
5
6
  import { validateNextInjectManifestOptions } from "@serwist/build/next";
6
7
  import { InjectManifest } from "@serwist/webpack-plugin";
7
8
  import { ChildCompilationPlugin, relativeToOutputPath } from "@serwist/webpack-plugin/internal";
8
- import { CleanWebpackPlugin } from "clean-webpack-plugin";
9
- import fg from "fast-glob";
9
+ import { globSync } from "glob";
10
10
  import type { NextConfig } from "next";
11
11
  import type { Compilation, Configuration, default as Webpack } from "webpack";
12
12
 
@@ -122,7 +122,19 @@ const withSerwistInit = (pluginOptions: NextInjectManifestOptions): ((nextConfig
122
122
  }
123
123
 
124
124
  const publicDir = path.resolve(options.dir, "public");
125
- const destDir = path.dirname(swDest);
125
+ const { dir: destDir, base: destBase } = path.parse(swDest);
126
+
127
+ const cleanUpList = globSync(["swe-worker-*.js", "swe-worker-*.js.map", destBase, `${destBase}.map`], {
128
+ absolute: true,
129
+ nodir: true,
130
+ cwd: destDir,
131
+ });
132
+
133
+ for (const file of cleanUpList) {
134
+ fs.rm(file, { force: true }, (err) => {
135
+ if (err) throw err;
136
+ });
137
+ }
126
138
 
127
139
  const shouldBuildSWEntryWorker = cacheOnNavigation;
128
140
  let swEntryPublicPath: string | undefined = undefined;
@@ -150,28 +162,22 @@ const withSerwistInit = (pluginOptions: NextInjectManifestOptions): ((nextConfig
150
162
  logger.info(` URL: ${_sw}`);
151
163
  logger.info(` Scope: ${_scope}`);
152
164
 
153
- config.plugins.push(
154
- new CleanWebpackPlugin({
155
- cleanOnceBeforeBuildPatterns: [path.join(destDir, "swe-worker-*.js"), path.join(destDir, "swe-worker-*.js.map"), swDest],
156
- }),
157
- );
158
-
159
165
  // Precache files in public folder
160
166
  let resolvedManifestEntries = additionalPrecacheEntries;
161
167
 
162
168
  if (!resolvedManifestEntries) {
163
- const swDestFileName = path.basename(swDest);
164
169
  const userPublicGlob = typeof globPublicPatterns === "string" ? [globPublicPatterns] : globPublicPatterns ?? ["**/*"];
165
- const publicScan = fg.sync(
170
+ const publicScan = globSync(
166
171
  [
167
172
  ...userPublicGlob,
168
173
  // Forcibly include these in case the user outputs these files to `public`.
169
174
  "!swe-worker-*.js",
170
175
  "!swe-worker-*.js.map",
171
- `!${swDestFileName.replace(/^\/+/, "")}`,
172
- `!${swDestFileName.replace(/^\/+/, "")}.map`,
176
+ `!${destBase}`,
177
+ `!${destBase}.map`,
173
178
  ],
174
179
  {
180
+ nodir: true,
175
181
  cwd: publicDir,
176
182
  },
177
183
  );
@@ -1,5 +1,4 @@
1
+ import { PAGES_CACHE_NAME } from "./worker/constants.js";
1
2
  import { defaultCache } from "./worker/defaultCache.js";
2
- import { type DefinePageRuntimeCachingOptions, type PageRuntimeCaching, definePageRuntimeCaching } from "./worker/definePageRuntimeCaching.js";
3
3
 
4
- export { defaultCache, definePageRuntimeCaching };
5
- export type { DefinePageRuntimeCachingOptions, PageRuntimeCaching };
4
+ export { defaultCache, PAGES_CACHE_NAME };
@@ -0,0 +1,5 @@
1
+ export const PAGES_CACHE_NAME = {
2
+ rscPrefetch: "pages-rsc-prefetch",
3
+ rsc: "pages-rsc",
4
+ html: "pages",
5
+ } as const;
@@ -1,144 +1,160 @@
1
+ import { ExpirationPlugin } from "@serwist/expiration";
2
+ import { RangeRequestsPlugin } from "@serwist/range-requests";
3
+ import { CacheFirst, NetworkFirst, StaleWhileRevalidate } from "@serwist/strategies";
1
4
  import type { RuntimeCaching } from "@serwist/sw";
2
- import { definePageRuntimeCaching } from "./definePageRuntimeCaching.js";
3
5
 
4
- // Serwist RuntimeCaching config: https://developers.google.com/web/tools/workbox/reference-docs/latest/module-workbox-build#.RuntimeCachingEntry
6
+ import { PAGES_CACHE_NAME } from "./constants.js";
7
+
8
+ // Serwist RuntimeCaching config: https://serwist.pages.dev/docs/sw/register-runtime-caching
5
9
  export const defaultCache = [
6
10
  {
7
- urlPattern: /^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,
8
- handler: "CacheFirst",
9
- options: {
11
+ matcher: /^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,
12
+ handler: new CacheFirst({
10
13
  cacheName: "google-fonts-webfonts",
11
- expiration: {
12
- maxEntries: 4,
13
- maxAgeSeconds: 365 * 24 * 60 * 60, // 365 days
14
- },
15
- },
14
+ plugins: [
15
+ new ExpirationPlugin({
16
+ maxEntries: 4,
17
+ maxAgeSeconds: 365 * 24 * 60 * 60, // 365 days
18
+ }),
19
+ ],
20
+ }),
16
21
  },
17
22
  {
18
- urlPattern: /^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,
19
- handler: "StaleWhileRevalidate",
20
- options: {
23
+ matcher: /^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,
24
+ handler: new StaleWhileRevalidate({
21
25
  cacheName: "google-fonts-stylesheets",
22
- expiration: {
23
- maxEntries: 4,
24
- maxAgeSeconds: 7 * 24 * 60 * 60, // 7 days
25
- },
26
- },
26
+ plugins: [
27
+ new ExpirationPlugin({
28
+ maxEntries: 4,
29
+ maxAgeSeconds: 7 * 24 * 60 * 60, // 7 days
30
+ }),
31
+ ],
32
+ }),
27
33
  },
28
34
  {
29
- urlPattern: /\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,
30
- handler: "StaleWhileRevalidate",
31
- options: {
35
+ matcher: /\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,
36
+ handler: new StaleWhileRevalidate({
32
37
  cacheName: "static-font-assets",
33
- expiration: {
34
- maxEntries: 4,
35
- maxAgeSeconds: 7 * 24 * 60 * 60, // 7 days
36
- },
37
- },
38
+ plugins: [
39
+ new ExpirationPlugin({
40
+ maxEntries: 4,
41
+ maxAgeSeconds: 7 * 24 * 60 * 60, // 7 days
42
+ }),
43
+ ],
44
+ }),
38
45
  },
39
46
  {
40
- urlPattern: /\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,
41
- handler: "StaleWhileRevalidate",
42
- options: {
47
+ matcher: /\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,
48
+ handler: new StaleWhileRevalidate({
43
49
  cacheName: "static-image-assets",
44
- expiration: {
45
- maxEntries: 64,
46
- maxAgeSeconds: 30 * 24 * 60 * 60, // 30 days
47
- },
48
- },
50
+ plugins: [
51
+ new ExpirationPlugin({
52
+ maxEntries: 64,
53
+ maxAgeSeconds: 30 * 24 * 60 * 60, // 30 days
54
+ }),
55
+ ],
56
+ }),
49
57
  },
50
58
  {
51
- urlPattern: /\/_next\/static.+\.js$/i,
52
- handler: "CacheFirst",
53
- options: {
59
+ matcher: /\/_next\/static.+\.js$/i,
60
+ handler: new CacheFirst({
54
61
  cacheName: "next-static-js-assets",
55
- expiration: {
56
- maxEntries: 64,
57
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
58
- },
59
- },
62
+ plugins: [
63
+ new ExpirationPlugin({
64
+ maxEntries: 64,
65
+ maxAgeSeconds: 24 * 60 * 60, // 24 hours
66
+ }),
67
+ ],
68
+ }),
60
69
  },
61
70
  {
62
- urlPattern: /\/_next\/image\?url=.+$/i,
63
- handler: "StaleWhileRevalidate",
64
- options: {
71
+ matcher: /\/_next\/image\?url=.+$/i,
72
+ handler: new StaleWhileRevalidate({
65
73
  cacheName: "next-image",
66
- expiration: {
67
- maxEntries: 64,
68
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
69
- },
70
- },
74
+ plugins: [
75
+ new ExpirationPlugin({
76
+ maxEntries: 64,
77
+ maxAgeSeconds: 24 * 60 * 60, // 24 hours
78
+ }),
79
+ ],
80
+ }),
71
81
  },
72
82
  {
73
- urlPattern: /\.(?:mp3|wav|ogg)$/i,
74
- handler: "CacheFirst",
75
- options: {
76
- rangeRequests: true,
83
+ matcher: /\.(?:mp3|wav|ogg)$/i,
84
+ handler: new CacheFirst({
77
85
  cacheName: "static-audio-assets",
78
- expiration: {
79
- maxEntries: 32,
80
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
81
- },
82
- },
86
+ plugins: [
87
+ new ExpirationPlugin({
88
+ maxEntries: 32,
89
+ maxAgeSeconds: 24 * 60 * 60, // 24 hours
90
+ }),
91
+ new RangeRequestsPlugin(),
92
+ ],
93
+ }),
83
94
  },
84
95
  {
85
- urlPattern: /\.(?:mp4|webm)$/i,
86
- handler: "CacheFirst",
87
- options: {
88
- rangeRequests: true,
96
+ matcher: /\.(?:mp4|webm)$/i,
97
+ handler: new CacheFirst({
89
98
  cacheName: "static-video-assets",
90
- expiration: {
91
- maxEntries: 32,
92
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
93
- },
94
- },
99
+ plugins: [
100
+ new ExpirationPlugin({
101
+ maxEntries: 32,
102
+ maxAgeSeconds: 24 * 60 * 60, // 24 hours
103
+ }),
104
+ new RangeRequestsPlugin(),
105
+ ],
106
+ }),
95
107
  },
96
108
  {
97
- urlPattern: /\.(?:js)$/i,
98
- handler: "StaleWhileRevalidate",
99
- options: {
109
+ matcher: /\.(?:js)$/i,
110
+ handler: new StaleWhileRevalidate({
100
111
  cacheName: "static-js-assets",
101
- expiration: {
102
- maxEntries: 48,
103
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
104
- },
105
- },
112
+ plugins: [
113
+ new ExpirationPlugin({
114
+ maxEntries: 48,
115
+ maxAgeSeconds: 24 * 60 * 60, // 24 hours
116
+ }),
117
+ ],
118
+ }),
106
119
  },
107
120
  {
108
- urlPattern: /\.(?:css|less)$/i,
109
- handler: "StaleWhileRevalidate",
110
- options: {
121
+ matcher: /\.(?:css|less)$/i,
122
+ handler: new StaleWhileRevalidate({
111
123
  cacheName: "static-style-assets",
112
- expiration: {
113
- maxEntries: 32,
114
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
115
- },
116
- },
124
+ plugins: [
125
+ new ExpirationPlugin({
126
+ maxEntries: 32,
127
+ maxAgeSeconds: 24 * 60 * 60, // 24 hours
128
+ }),
129
+ ],
130
+ }),
117
131
  },
118
132
  {
119
- urlPattern: /\/_next\/data\/.+\/.+\.json$/i,
120
- handler: "StaleWhileRevalidate",
121
- options: {
133
+ matcher: /\/_next\/data\/.+\/.+\.json$/i,
134
+ handler: new NetworkFirst({
122
135
  cacheName: "next-data",
123
- expiration: {
124
- maxEntries: 32,
125
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
126
- },
127
- },
136
+ plugins: [
137
+ new ExpirationPlugin({
138
+ maxEntries: 32,
139
+ maxAgeSeconds: 24 * 60 * 60, // 24 hours
140
+ }),
141
+ ],
142
+ }),
128
143
  },
129
144
  {
130
- urlPattern: /\.(?:json|xml|csv)$/i,
131
- handler: "NetworkFirst",
132
- options: {
145
+ matcher: /\.(?:json|xml|csv)$/i,
146
+ handler: new NetworkFirst({
133
147
  cacheName: "static-data-assets",
134
- expiration: {
135
- maxEntries: 32,
136
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
137
- },
138
- },
148
+ plugins: [
149
+ new ExpirationPlugin({
150
+ maxEntries: 32,
151
+ maxAgeSeconds: 24 * 60 * 60, // 24 hours
152
+ }),
153
+ ],
154
+ }),
139
155
  },
140
156
  {
141
- urlPattern: ({ sameOrigin, url: { pathname } }) => {
157
+ matcher: ({ sameOrigin, url: { pathname } }) => {
142
158
  // Exclude /api/auth/callback/* to fix OAuth workflow in Safari without having an impact on other environments
143
159
  // The above route is the default for next-auth, you may need to change it if your OAuth workflow has a different callback route
144
160
  // Issue: https://github.com/shadowwalker/next-pwa/issues/131#issuecomment-821894809
@@ -152,72 +168,79 @@ export const defaultCache = [
152
168
 
153
169
  return false;
154
170
  },
155
- handler: "NetworkFirst",
156
171
  method: "GET",
157
- options: {
172
+ handler: new NetworkFirst({
158
173
  cacheName: "apis",
159
- expiration: {
160
- maxEntries: 16,
161
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
162
- },
174
+ plugins: [
175
+ new ExpirationPlugin({
176
+ maxEntries: 16,
177
+ maxAgeSeconds: 24 * 60 * 60, // 24 hours
178
+ }),
179
+ ],
163
180
  networkTimeoutSeconds: 10, // fallback to cache if API does not response within 10 seconds
164
- },
181
+ }),
165
182
  },
166
- ...definePageRuntimeCaching({
167
- rscPrefetch: {
168
- urlPattern: ({ request, url: { pathname }, sameOrigin }) =>
169
- request.headers.get("RSC") === "1" && request.headers.get("Next-Router-Prefetch") === "1" && sameOrigin && !pathname.startsWith("/api/"),
170
- handler: "NetworkFirst",
171
- options: {
172
- expiration: {
183
+ {
184
+ matcher: ({ request, url: { pathname }, sameOrigin }) =>
185
+ request.headers.get("RSC") === "1" && request.headers.get("Next-Router-Prefetch") === "1" && sameOrigin && !pathname.startsWith("/api/"),
186
+ handler: new NetworkFirst({
187
+ cacheName: PAGES_CACHE_NAME.rscPrefetch,
188
+ plugins: [
189
+ new ExpirationPlugin({
173
190
  maxEntries: 32,
174
191
  maxAgeSeconds: 24 * 60 * 60, // 24 hours
175
- },
176
- },
177
- },
178
- rsc: {
179
- urlPattern: ({ request, url: { pathname }, sameOrigin }) => request.headers.get("RSC") === "1" && sameOrigin && !pathname.startsWith("/api/"),
180
- handler: "NetworkFirst",
181
- options: {
182
- expiration: {
192
+ }),
193
+ ],
194
+ }),
195
+ },
196
+ {
197
+ matcher: ({ request, url: { pathname }, sameOrigin }) => request.headers.get("RSC") === "1" && sameOrigin && !pathname.startsWith("/api/"),
198
+ handler: new NetworkFirst({
199
+ cacheName: PAGES_CACHE_NAME.rsc,
200
+ plugins: [
201
+ new ExpirationPlugin({
183
202
  maxEntries: 32,
184
203
  maxAgeSeconds: 24 * 60 * 60, // 24 hours
185
- },
186
- },
187
- },
188
- html: {
189
- urlPattern: ({ request, url: { pathname }, sameOrigin }) =>
190
- request.headers.get("Content-Type")?.includes("text/html") && sameOrigin && !pathname.startsWith("/api/"),
191
- handler: "NetworkFirst",
192
- options: {
193
- expiration: {
204
+ }),
205
+ ],
206
+ }),
207
+ },
208
+ {
209
+ matcher: ({ request, url: { pathname }, sameOrigin }) =>
210
+ request.headers.get("Content-Type")?.includes("text/html") && sameOrigin && !pathname.startsWith("/api/"),
211
+ handler: new NetworkFirst({
212
+ cacheName: PAGES_CACHE_NAME.html,
213
+ plugins: [
214
+ new ExpirationPlugin({
194
215
  maxEntries: 32,
195
216
  maxAgeSeconds: 24 * 60 * 60, // 24 hours
196
- },
197
- },
198
- },
199
- }),
217
+ }),
218
+ ],
219
+ }),
220
+ },
200
221
  {
201
- urlPattern: ({ url: { pathname }, sameOrigin }) => sameOrigin && !pathname.startsWith("/api/"),
202
- handler: "NetworkFirst",
203
- options: {
222
+ matcher: ({ url: { pathname }, sameOrigin }) => sameOrigin && !pathname.startsWith("/api/"),
223
+ handler: new NetworkFirst({
204
224
  cacheName: "others",
205
- expiration: {
206
- maxEntries: 32,
207
- maxAgeSeconds: 24 * 60 * 60, // 24 hours
208
- },
209
- },
225
+ plugins: [
226
+ new ExpirationPlugin({
227
+ maxEntries: 32,
228
+ maxAgeSeconds: 24 * 60 * 60, // 24 hours
229
+ }),
230
+ ],
231
+ }),
210
232
  },
211
233
  {
212
- urlPattern: ({ sameOrigin }) => !sameOrigin,
213
- handler: "NetworkFirst",
214
- options: {
234
+ matcher: ({ sameOrigin }) => !sameOrigin,
235
+ handler: new NetworkFirst({
215
236
  cacheName: "cross-origin",
216
- expiration: {
217
- maxEntries: 32,
218
- maxAgeSeconds: 60 * 60, // 1 hour
219
- },
237
+ plugins: [
238
+ new ExpirationPlugin({
239
+ maxEntries: 32,
240
+ maxAgeSeconds: 60 * 60, // 1 hour
241
+ }),
242
+ ],
220
243
  networkTimeoutSeconds: 10,
221
- },
244
+ }),
222
245
  },
223
246
  ] satisfies RuntimeCaching[];
@@ -1,16 +0,0 @@
1
- import type { RuntimeCaching } from "@serwist/sw";
2
- export interface PageRuntimeCaching extends Omit<RuntimeCaching, "options"> {
3
- options?: Omit<NonNullable<RuntimeCaching["options"]>, "cacheName">;
4
- }
5
- export interface DefinePageRuntimeCachingOptions {
6
- rscPrefetch?: PageRuntimeCaching;
7
- rsc?: PageRuntimeCaching;
8
- html?: PageRuntimeCaching;
9
- }
10
- /**
11
- * Conveniently define three `runtimeCaching` entries for Next.js pages.
12
- * @param options
13
- * @returns
14
- */
15
- export declare const definePageRuntimeCaching: ({ rscPrefetch, rsc, html }: DefinePageRuntimeCachingOptions) => RuntimeCaching[];
16
- //# sourceMappingURL=definePageRuntimeCaching.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"definePageRuntimeCaching.d.ts","sourceRoot":"","sources":["../../src/worker/definePageRuntimeCaching.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC;IACzE,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;CACrE;AAED,MAAM,WAAW,+BAA+B;IAC9C,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,GAAG,CAAC,EAAE,kBAAkB,CAAC;IACzB,IAAI,CAAC,EAAE,kBAAkB,CAAC;CAC3B;AAED;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,+BAAgC,+BAA+B,KAAG,cAAc,EAiBpH,CAAC"}
@@ -1,36 +0,0 @@
1
- import type { RuntimeCaching } from "@serwist/sw";
2
- import { nonNullable } from "@serwist/utils";
3
-
4
- export interface PageRuntimeCaching extends Omit<RuntimeCaching, "options"> {
5
- options?: Omit<NonNullable<RuntimeCaching["options"]>, "cacheName">;
6
- }
7
-
8
- export interface DefinePageRuntimeCachingOptions {
9
- rscPrefetch?: PageRuntimeCaching;
10
- rsc?: PageRuntimeCaching;
11
- html?: PageRuntimeCaching;
12
- }
13
-
14
- /**
15
- * Conveniently define three `runtimeCaching` entries for Next.js pages.
16
- * @param options
17
- * @returns
18
- */
19
- export const definePageRuntimeCaching = ({ rscPrefetch, rsc, html }: DefinePageRuntimeCachingOptions): RuntimeCaching[] => {
20
- const pageRcs = [rscPrefetch, rsc, html] as RuntimeCaching[];
21
-
22
- if (pageRcs[0]) {
23
- if (!pageRcs[0].options) pageRcs[0].options = {};
24
- pageRcs[0].options.cacheName = "pages-rsc-prefetch";
25
- }
26
- if (pageRcs[1]) {
27
- if (!pageRcs[1].options) pageRcs[1].options = {};
28
- pageRcs[1].options.cacheName = "pages-rsc";
29
- }
30
- if (pageRcs[2]) {
31
- if (!pageRcs[2].options) pageRcs[2].options = {};
32
- pageRcs[2].options.cacheName = "pages";
33
- }
34
-
35
- return pageRcs.filter(nonNullable);
36
- };