@swoff/cli 0.3.13 → 0.3.15

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 (269) hide show
  1. package/README.md +28 -32
  2. package/dist/index.js +4 -15
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/cli/help.js +4 -9
  5. package/dist/lib/cli/help.js.map +1 -1
  6. package/dist/lib/commands/clean.js +8 -17
  7. package/dist/lib/commands/clean.js.map +1 -1
  8. package/dist/lib/commands/generate-guide.js +16 -30
  9. package/dist/lib/commands/generate-guide.js.map +1 -1
  10. package/dist/lib/commands/generate.js +33 -7
  11. package/dist/lib/commands/generate.js.map +1 -1
  12. package/dist/lib/commands/init.js +259 -23
  13. package/dist/lib/commands/init.js.map +1 -1
  14. package/dist/lib/commands/validate.js +2 -4
  15. package/dist/lib/commands/validate.js.map +1 -1
  16. package/dist/lib/config/loader.js +34 -25
  17. package/dist/lib/config/loader.js.map +1 -1
  18. package/dist/lib/config/minimal-config.js +64 -0
  19. package/dist/lib/config/minimal-config.js.map +1 -0
  20. package/dist/lib/config/validator.js +219 -110
  21. package/dist/lib/config/validator.js.map +1 -1
  22. package/dist/lib/generators/file-generators/api-config.js +1 -1
  23. package/dist/lib/generators/file-generators/api-config.js.map +1 -1
  24. package/dist/lib/generators/file-generators/auth-adapter.js +13 -0
  25. package/dist/lib/generators/file-generators/auth-adapter.js.map +1 -0
  26. package/dist/lib/generators/file-generators/auth-check.js +40 -0
  27. package/dist/lib/generators/file-generators/auth-check.js.map +1 -0
  28. package/dist/lib/generators/file-generators/auth-store.js +2 -5
  29. package/dist/lib/generators/file-generators/auth-store.js.map +1 -1
  30. package/dist/lib/generators/file-generators/background-sync.js +1 -1
  31. package/dist/lib/generators/file-generators/background-sync.js.map +1 -1
  32. package/dist/lib/generators/file-generators/cache.js +2 -1
  33. package/dist/lib/generators/file-generators/cache.js.map +1 -1
  34. package/dist/lib/generators/file-generators/client-injector-bundle.js +15 -0
  35. package/dist/lib/generators/file-generators/client-injector-bundle.js.map +1 -0
  36. package/dist/lib/generators/file-generators/client-injector.js +2 -1
  37. package/dist/lib/generators/file-generators/client-injector.js.map +1 -1
  38. package/dist/lib/generators/file-generators/connectivity.js +12 -0
  39. package/dist/lib/generators/file-generators/connectivity.js.map +1 -0
  40. package/dist/lib/generators/file-generators/context.js +7 -0
  41. package/dist/lib/generators/file-generators/context.js.map +1 -1
  42. package/dist/lib/generators/file-generators/fetch-wrapper.js +1 -1
  43. package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -1
  44. package/dist/lib/generators/file-generators/generate-framework-adapters.js +29 -20
  45. package/dist/lib/generators/file-generators/generate-framework-adapters.js.map +1 -1
  46. package/dist/lib/generators/file-generators/gql-wrapper.js +2 -2
  47. package/dist/lib/generators/file-generators/gql-wrapper.js.map +1 -1
  48. package/dist/lib/generators/file-generators/guide-generator.js +51 -1
  49. package/dist/lib/generators/file-generators/guide-generator.js.map +1 -1
  50. package/dist/lib/generators/file-generators/invalidation-tags.js +2 -3
  51. package/dist/lib/generators/file-generators/invalidation-tags.js.map +1 -1
  52. package/dist/lib/generators/file-generators/mutation-queue.js +2 -2
  53. package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -1
  54. package/dist/lib/generators/file-generators/mutation-state.js +1 -1
  55. package/dist/lib/generators/file-generators/mutation-state.js.map +1 -1
  56. package/dist/lib/generators/file-generators/open-db.js +6 -0
  57. package/dist/lib/generators/file-generators/open-db.js.map +1 -0
  58. package/dist/lib/generators/file-generators/push.js +1 -2
  59. package/dist/lib/generators/file-generators/push.js.map +1 -1
  60. package/dist/lib/generators/file-generators/pwa-install.js +2 -6
  61. package/dist/lib/generators/file-generators/pwa-install.js.map +1 -1
  62. package/dist/lib/generators/file-generators/server-push.js +1 -1
  63. package/dist/lib/generators/file-generators/server-push.js.map +1 -1
  64. package/dist/lib/generators/file-generators/storage.js +6 -0
  65. package/dist/lib/generators/file-generators/storage.js.map +1 -0
  66. package/dist/lib/generators/file-generators/sw-generator-build.js +105 -48
  67. package/dist/lib/generators/file-generators/sw-generator-build.js.map +1 -1
  68. package/dist/lib/generators/file-generators/sw-injector.js +0 -4
  69. package/dist/lib/generators/file-generators/sw-injector.js.map +1 -1
  70. package/dist/lib/generators/file-generators/sw-template.js +8 -9
  71. package/dist/lib/generators/file-generators/sw-template.js.map +1 -1
  72. package/dist/lib/generators/file-generators/swoff-api-bundle.js +51 -0
  73. package/dist/lib/generators/file-generators/swoff-api-bundle.js.map +1 -0
  74. package/dist/lib/generators/sw-build-utils.js +69 -0
  75. package/dist/lib/generators/sw-build-utils.js.map +1 -0
  76. package/dist/lib/generators/sw-generator.js +23 -34
  77. package/dist/lib/generators/sw-generator.js.map +1 -1
  78. package/dist/lib/generators/sw-sections/activate-handler.js +77 -23
  79. package/dist/lib/generators/sw-sections/activate-handler.js.map +1 -1
  80. package/dist/lib/generators/sw-sections/assemble-sw.js +20 -95
  81. package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
  82. package/dist/lib/generators/sw-sections/background-precache.js +126 -0
  83. package/dist/lib/generators/sw-sections/background-precache.js.map +1 -0
  84. package/dist/lib/generators/sw-sections/background-sync-handler.js +74 -72
  85. package/dist/lib/generators/sw-sections/background-sync-handler.js.map +1 -1
  86. package/dist/lib/generators/sw-sections/batch-refresh-queue.js +102 -0
  87. package/dist/lib/generators/sw-sections/batch-refresh-queue.js.map +1 -0
  88. package/dist/lib/generators/sw-sections/config-header.js +2 -3
  89. package/dist/lib/generators/sw-sections/config-header.js.map +1 -1
  90. package/dist/lib/generators/sw-sections/default-template.js +64 -7
  91. package/dist/lib/generators/sw-sections/default-template.js.map +1 -1
  92. package/dist/lib/generators/sw-sections/fetch-handler.js +621 -495
  93. package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -1
  94. package/dist/lib/generators/sw-sections/install-handler.js +41 -23
  95. package/dist/lib/generators/sw-sections/install-handler.js.map +1 -1
  96. package/dist/lib/generators/sw-sections/message-handler.js +34 -8
  97. package/dist/lib/generators/sw-sections/message-handler.js.map +1 -1
  98. package/dist/lib/generators/sw-sections/server-push-handler.js +10 -14
  99. package/dist/lib/generators/sw-sections/server-push-handler.js.map +1 -1
  100. package/dist/lib/generators/sw-sections/shared.js +70 -0
  101. package/dist/lib/generators/sw-sections/shared.js.map +1 -0
  102. package/dist/lib/generators/sw-sections/sw-push.js +2 -6
  103. package/dist/lib/generators/sw-sections/sw-push.js.map +1 -1
  104. package/dist/lib/generators/sw-sections/tag-management.js +55 -86
  105. package/dist/lib/generators/sw-sections/tag-management.js.map +1 -1
  106. package/dist/lib/generators/swoff-files-generator.js +183 -59
  107. package/dist/lib/generators/swoff-files-generator.js.map +1 -1
  108. package/dist/lib/shared/config-types.js +84 -79
  109. package/dist/lib/shared/config-types.js.map +1 -1
  110. package/dist/lib/shared/feature-registry.js +198 -0
  111. package/dist/lib/shared/feature-registry.js.map +1 -0
  112. package/dist/lib/utils/detect-framework.js +52 -9
  113. package/dist/lib/utils/detect-framework.js.map +1 -1
  114. package/dist/runtime/api-config.js +2 -2
  115. package/dist/runtime/api-config.js.map +1 -1
  116. package/dist/runtime/auth-adapter.js +179 -0
  117. package/dist/runtime/auth-adapter.js.map +1 -0
  118. package/dist/runtime/auth-state.js +16 -6
  119. package/dist/runtime/auth-state.js.map +1 -1
  120. package/dist/runtime/auth-store.js +219 -213
  121. package/dist/runtime/auth-store.js.map +1 -1
  122. package/dist/runtime/background-sync.js +5 -2
  123. package/dist/runtime/background-sync.js.map +1 -1
  124. package/dist/runtime/cache.js +91 -3
  125. package/dist/runtime/cache.js.map +1 -1
  126. package/dist/runtime/client-injector-bundle.js +314 -0
  127. package/dist/runtime/client-injector-bundle.js.map +1 -0
  128. package/dist/runtime/client-injector.js +188 -30
  129. package/dist/runtime/client-injector.js.map +1 -1
  130. package/dist/runtime/connectivity.js +83 -0
  131. package/dist/runtime/connectivity.js.map +1 -0
  132. package/dist/runtime/fetch-wrapper.js +26 -59
  133. package/dist/runtime/fetch-wrapper.js.map +1 -1
  134. package/dist/runtime/gql-wrapper.js +15 -9
  135. package/dist/runtime/gql-wrapper.js.map +1 -1
  136. package/dist/runtime/invalidation-tags.js +12 -89
  137. package/dist/runtime/invalidation-tags.js.map +1 -1
  138. package/dist/runtime/mutation-queue.js +83 -31
  139. package/dist/runtime/mutation-queue.js.map +1 -1
  140. package/dist/runtime/mutation-state.js +3 -3
  141. package/dist/runtime/mutation-state.js.map +1 -1
  142. package/dist/runtime/open-db.js +41 -0
  143. package/dist/runtime/open-db.js.map +1 -0
  144. package/dist/runtime/push.js +15 -27
  145. package/dist/runtime/push.js.map +1 -1
  146. package/dist/runtime/pwa-prompt.js +35 -3
  147. package/dist/runtime/pwa-prompt.js.map +1 -1
  148. package/dist/runtime/reset.js +39 -42
  149. package/dist/runtime/reset.js.map +1 -1
  150. package/dist/runtime/server-push.js +23 -13
  151. package/dist/runtime/server-push.js.map +1 -1
  152. package/dist/runtime/storage.js +32 -0
  153. package/dist/runtime/storage.js.map +1 -0
  154. package/dist/runtime/sw-injector.js +19 -178
  155. package/dist/runtime/sw-injector.js.map +1 -1
  156. package/dist/runtime/swoff-api-bundle.js +1491 -0
  157. package/dist/runtime/swoff-api-bundle.js.map +1 -0
  158. package/dist/runtime/type-definitions.js +8 -7
  159. package/dist/runtime/type-definitions.js.map +1 -1
  160. package/dist/runtime/utils.js +4 -0
  161. package/dist/runtime/utils.js.map +1 -1
  162. package/package.json +9 -3
  163. package/templates/react/useAuth.jsx +7 -4
  164. package/templates/react/useAuth.tsx +14 -14
  165. package/templates/react/useBackgroundSync.jsx +5 -4
  166. package/templates/react/useBackgroundSync.tsx +5 -4
  167. package/templates/react/useCachedFetch.jsx +8 -0
  168. package/templates/react/useCachedFetch.tsx +8 -0
  169. package/templates/react/useMutation.jsx +60 -56
  170. package/templates/react/useMutation.tsx +65 -64
  171. package/templates/react/useMutationQueue.jsx +5 -1
  172. package/templates/react/useMutationQueue.tsx +8 -2
  173. package/templates/react/useMutationState.jsx +3 -4
  174. package/templates/react/useMutationState.tsx +4 -8
  175. package/templates/react/useNetworkStatus.jsx +57 -17
  176. package/templates/react/useNetworkStatus.tsx +42 -20
  177. package/templates/react/useOfflineAnalytics.jsx +42 -0
  178. package/templates/react/useOfflineAnalytics.tsx +50 -0
  179. package/templates/react/usePwaInstall.jsx +26 -0
  180. package/templates/react/usePwaInstall.tsx +26 -0
  181. package/templates/react/useSWUpdate.jsx +7 -52
  182. package/templates/react/useSWUpdate.tsx +12 -51
  183. package/templates/react/useStorageEstimate.jsx +56 -0
  184. package/templates/react/useStorageEstimate.tsx +67 -0
  185. package/dist/__tests__/assemble-sw.test.js +0 -145
  186. package/dist/__tests__/assemble-sw.test.js.map +0 -1
  187. package/dist/__tests__/cli-integration.test.js +0 -231
  188. package/dist/__tests__/cli-integration.test.js.map +0 -1
  189. package/dist/__tests__/config-types.test.js +0 -124
  190. package/dist/__tests__/config-types.test.js.map +0 -1
  191. package/dist/__tests__/detect-language.test.js +0 -51
  192. package/dist/__tests__/detect-language.test.js.map +0 -1
  193. package/dist/__tests__/file-generators.test.js +0 -228
  194. package/dist/__tests__/file-generators.test.js.map +0 -1
  195. package/dist/__tests__/glob-matcher.test.js +0 -86
  196. package/dist/__tests__/glob-matcher.test.js.map +0 -1
  197. package/dist/__tests__/invalidation-tags.test.js +0 -283
  198. package/dist/__tests__/invalidation-tags.test.js.map +0 -1
  199. package/dist/__tests__/loader.test.js +0 -77
  200. package/dist/__tests__/loader.test.js.map +0 -1
  201. package/dist/__tests__/validator.test.js +0 -340
  202. package/dist/__tests__/validator.test.js.map +0 -1
  203. package/dist/lib/commands/add.js +0 -120
  204. package/dist/lib/commands/add.js.map +0 -1
  205. package/dist/lib/commands/assets.js +0 -45
  206. package/dist/lib/commands/assets.js.map +0 -1
  207. package/dist/lib/commands/generate-assets.js +0 -44
  208. package/dist/lib/commands/generate-assets.js.map +0 -1
  209. package/dist/lib/commands/info.js +0 -183
  210. package/dist/lib/commands/info.js.map +0 -1
  211. package/dist/lib/generators/asset-generator/dependency-resolver.js +0 -85
  212. package/dist/lib/generators/asset-generator/dependency-resolver.js.map +0 -1
  213. package/dist/lib/generators/asset-generator/generate.js +0 -111
  214. package/dist/lib/generators/asset-generator/generate.js.map +0 -1
  215. package/dist/lib/generators/asset-generator/guide.js +0 -43
  216. package/dist/lib/generators/asset-generator/guide.js.map +0 -1
  217. package/dist/lib/generators/asset-generator/html-patcher.js +0 -65
  218. package/dist/lib/generators/asset-generator/html-patcher.js.map +0 -1
  219. package/dist/lib/generators/asset-generator/ico-encoder.js +0 -29
  220. package/dist/lib/generators/asset-generator/ico-encoder.js.map +0 -1
  221. package/dist/lib/generators/asset-generator/manifest-patcher.js +0 -23
  222. package/dist/lib/generators/asset-generator/manifest-patcher.js.map +0 -1
  223. package/dist/lib/generators/asset-generator/maskable.js +0 -15
  224. package/dist/lib/generators/asset-generator/maskable.js.map +0 -1
  225. package/dist/lib/generators/asset-generator/rasterize.js +0 -32
  226. package/dist/lib/generators/asset-generator/rasterize.js.map +0 -1
  227. package/dist/lib/generators/asset-generator/sizes.js +0 -25
  228. package/dist/lib/generators/asset-generator/sizes.js.map +0 -1
  229. package/dist/lib/generators/file-generators/auth-fetch.js +0 -151
  230. package/dist/lib/generators/file-generators/auth-fetch.js.map +0 -1
  231. package/dist/lib/generators/file-generators/auth-user.js +0 -13
  232. package/dist/lib/generators/file-generators/auth-user.js.map +0 -1
  233. package/dist/lib/generators/file-generators/fetch-state.js +0 -6
  234. package/dist/lib/generators/file-generators/fetch-state.js.map +0 -1
  235. package/dist/lib/generators/file-generators/generate-hooks.js +0 -44
  236. package/dist/lib/generators/file-generators/generate-hooks.js.map +0 -1
  237. package/dist/lib/generators/file-generators/indexeddb.js +0 -74
  238. package/dist/lib/generators/file-generators/indexeddb.js.map +0 -1
  239. package/dist/lib/generators/file-generators/manifest.js +0 -46
  240. package/dist/lib/generators/file-generators/manifest.js.map +0 -1
  241. package/dist/lib/generators/file-generators/mutation-reconcile.js +0 -57
  242. package/dist/lib/generators/file-generators/mutation-reconcile.js.map +0 -1
  243. package/dist/lib/generators/file-generators/quick-readme.js +0 -21
  244. package/dist/lib/generators/file-generators/quick-readme.js.map +0 -1
  245. package/dist/lib/generators/file-generators/reconcile.js +0 -50
  246. package/dist/lib/generators/file-generators/reconcile.js.map +0 -1
  247. package/dist/lib/generators/file-generators/store.js +0 -86
  248. package/dist/lib/generators/file-generators/store.js.map +0 -1
  249. package/dist/lib/generators/file-generators/sw-push.js +0 -67
  250. package/dist/lib/generators/file-generators/sw-push.js.map +0 -1
  251. package/dist/lib/generators/sw-sections/glob-matcher-code.js.map +0 -1
  252. package/dist/lib/utils/build-script.js +0 -35
  253. package/dist/lib/utils/build-script.js.map +0 -1
  254. package/dist/lib/utils/tty-status.js +0 -21
  255. package/dist/lib/utils/tty-status.js.map +0 -1
  256. package/dist/runtime/auth-user.js +0 -168
  257. package/dist/runtime/auth-user.js.map +0 -1
  258. package/dist/runtime/fetch-state.js +0 -42
  259. package/dist/runtime/fetch-state.js.map +0 -1
  260. package/dist/runtime/pwa-index.js +0 -11
  261. package/dist/runtime/pwa-index.js.map +0 -1
  262. package/dist/runtime/pwa-injector.js +0 -44
  263. package/dist/runtime/pwa-injector.js.map +0 -1
  264. package/dist/runtime/pwa-install.js +0 -83
  265. package/dist/runtime/pwa-install.js.map +0 -1
  266. package/templates/react/useCacheInvalidation.jsx +0 -19
  267. package/templates/react/useCacheInvalidation.tsx +0 -52
  268. package/templates/react/useIsFetching.jsx +0 -32
  269. package/templates/react/useIsFetching.tsx +0 -32
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/fetch-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetch-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/fetch-handler.ts"],"names":[],"mappings":"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"}
@@ -1,34 +1,52 @@
1
1
  /**
2
2
  * Generates the SW install event handler (asset pre-caching with progress).
3
+ * Also exports a reusable precacheAssets() function used by both install and
4
+ * the RESET_CACHE message handler.
3
5
  */
4
6
  export function generateInstallHandler() {
5
7
  return `
8
+ async function precacheAssets() {
9
+ const cache = await caches.open("precache");
10
+ const stale = await cache.keys();
11
+ await Promise.all(stale.map(function(req) { return cache.delete(req); }));
12
+ let downloaded = 0;
13
+ let attempted = 0;
14
+ const total = PRECACHE_FALLBACKS.length;
15
+ if (total === 0) return;
16
+ const allClients = await self.clients.matchAll({ includeUncontrolled: true });
17
+ for (const url of PRECACHE_FALLBACKS) {
18
+ attempted++;
19
+ try {
20
+ const request = new Request(url);
21
+ await cache.add(request);
22
+ downloaded++;
23
+ } catch (err) {
24
+ console.error(\`Failed to cache \${url}:\`, err);
25
+ allClients.forEach((client) => {
26
+ client.postMessage({
27
+ type: "SW_NOTIFICATION",
28
+ level: "warn",
29
+ code: "PRECACHE_FAILED",
30
+ message: \`Failed to precache \${url}\`,
31
+ });
32
+ });
33
+ }
34
+ const percent = Math.round((attempted / total) * 100);
35
+ allClients.forEach((client) => {
36
+ client.postMessage({
37
+ type: "SW_PROGRESS",
38
+ percent,
39
+ downloaded,
40
+ total,
41
+ });
42
+ });
43
+ }
44
+ }
45
+
6
46
  self.addEventListener("install", (event) => {
7
47
  event.waitUntil(
8
48
  (async () => {
9
- const cache = await caches.open(CACHE_NAME);
10
- let downloaded = 0;
11
- let attempted = 0;
12
- for (const asset of ASSETS_TO_CACHE) {
13
- attempted++;
14
- try {
15
- const request = new Request(asset.url, asset.options);
16
- await cache.add(request);
17
- downloaded++;
18
- } catch (err) {
19
- console.error(\`Failed to cache \${asset.url}:\`, err);
20
- }
21
- const percent = Math.round((attempted / ASSETS_TO_CACHE.length) * 100);
22
- const clients = await self.clients.matchAll({ includeUncontrolled: true });
23
- clients.forEach((client) => {
24
- client.postMessage({
25
- type: "SW_PROGRESS",
26
- percent,
27
- downloaded,
28
- total: ASSETS_TO_CACHE.length,
29
- });
30
- });
31
- }
49
+ await precacheAssets();
32
50
  if (AUTO_SKIP_WAITING) self.skipWaiting();
33
51
  })(),
34
52
  );
@@ -1 +1 @@
1
- {"version":3,"file":"install-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/install-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA8BL,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"install-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/install-handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA8CL,CAAC;AACL,CAAC"}
@@ -31,6 +31,36 @@ function debouncedInvalidate(tag) {
31
31
  self.addEventListener("message", (event) => {
32
32
  if (event.data.type === "SKIP_WAITING") {
33
33
  self.skipWaiting();
34
+ }
35
+ if (event.data.type === "FOCUS") {
36
+ if (typeof handleRefetch === "function") handleRefetch("refetchOnFocus");
37
+ }
38
+ if (event.data.type === "ONLINE") {
39
+ if (typeof handleRefetch === "function") handleRefetch("refetchOnReconnect");
40
+ }
41
+ if (event.data.type === "OFFLINE") {
42
+ // Client went offline — the SW already serves from cache transparently.
43
+ // No action needed; reactive refetches will resume on next ONLINE signal.
44
+ }
45
+ if (event.data.type === "RESUME_PRECACHE") {
46
+ startBackgroundPrecache().catch(function(err) {
47
+ console.error("Background precache error:", err);
48
+ });
49
+ }
50
+ if (event.data.type === "RESET_CACHE") {
51
+ event.waitUntil(
52
+ (async () => {
53
+ const keys = await caches.keys();
54
+ await Promise.all(keys.map((k) => caches.delete(k)));
55
+ await precacheAssets();
56
+ await resetPrecacheCheckpoint();
57
+ const port = event.ports?.[0];
58
+ port?.postMessage({ type: "RESET_CACHE_COMPLETE" });
59
+ })(),
60
+ );
61
+ startBackgroundPrecache().catch(function(err) {
62
+ console.error("Background precache error:", err);
63
+ });
34
64
  }`;
35
65
  if (tagInvalidation) {
36
66
  const invalidateCall = debounceMs > 0
@@ -42,13 +72,13 @@ self.addEventListener("message", (event) => {
42
72
  }
43
73
  if (event.data.type === "GET_URLS_FOR_TAG" && event.data.tag) {
44
74
  const urls = getUrlsForTag(event.data.tag);
45
- if (event.ports && event.ports[0]) {
75
+ if (event.ports?.[0]) {
46
76
  event.ports[0].postMessage({ type: "URLS_FOR_TAG", urls });
47
77
  }
48
78
  }
49
79
  if (event.data.type === "GET_TAGS_FOR_URL" && event.data.url) {
50
80
  const tags = getTagsForUrl(event.data.url);
51
- if (event.ports && event.ports[0]) {
81
+ if (event.ports?.[0]) {
52
82
  event.ports[0].postMessage({ type: "TAGS_FOR_URL", tags });
53
83
  }
54
84
  }
@@ -57,13 +87,9 @@ self.addEventListener("message", (event) => {
57
87
  }`;
58
88
  }
59
89
  code += `
60
- if (event.data.type === "ONLINE") {
61
- event.waitUntil(handleOnline());
90
+ if (event.data.type === "AUTH_CLEARED") {
91
+ event.waitUntil(broadcastToClients("AUTH_CLEARED"));
62
92
  }
63
- if (event.data.type === "FOCUS") {
64
- event.waitUntil(handleOnFocus());
65
- }
66
-
67
93
  });`;
68
94
  return code;
69
95
  }
@@ -1 +1 @@
1
- {"version":3,"file":"message-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/message-handler.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,sBAAsB,CAAC,eAAwB,EAAE,aAAqB,CAAC;IACrF,MAAM,gBAAgB,GAAG,eAAe,IAAI,UAAU,GAAG,CAAC;QACxD,CAAC,CAAC;mCAC6B,UAAU;;;;;;;;;;;;;;;;;;;;;;;;CAwB5C;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,IAAI,GAAG,GAAG,gBAAgB;;;;IAI5B,CAAC;IAEH,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,cAAc,GAAG,UAAU,GAAG,CAAC;YACnC,CAAC,CAAC,sDAAsD;YACxD,CAAC,CAAC,kDAAkD,CAAC;QAEvD,IAAI,IAAI;;MAEN,cAAc;;;;;;;;;;;;;;;;IAgBhB,CAAC;IACH,CAAC;IAED,IAAI,IAAI;;;;;;;;IAQN,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"message-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/message-handler.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,sBAAsB,CAAC,eAAwB,EAAE,aAAqB,CAAC;IACrF,MAAM,gBAAgB,GAAG,eAAe,IAAI,UAAU,GAAG,CAAC;QACxD,CAAC,CAAC;mCAC6B,UAAU;;;;;;;;;;;;;;;;;;;;;;;;CAwB5C;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,IAAI,GAAG,GAAG,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkC5B,CAAC;IAEH,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,cAAc,GAAG,UAAU,GAAG,CAAC;YACnC,CAAC,CAAC,sDAAsD;YACxD,CAAC,CAAC,kDAAkD,CAAC;QAEvD,IAAI,IAAI;;MAEN,cAAc;;;;;;;;;;;;;;;;IAgBhB,CAAC;IACH,CAAC;IAED,IAAI,IAAI;;;;IAIN,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -14,11 +14,11 @@ let pushReconnectTimer = null;
14
14
  async function connectPushEvents() {
15
15
  try {
16
16
  pushWs = new WebSocket("${endpoint}");
17
- pushWs.onmessage = (event) => {
17
+ pushWs.onmessage = async (event) => {
18
18
  try {
19
19
  const data = JSON.parse(event.data);
20
20
  if (data.type === "invalidate" && data.tags) {
21
- data.tags.forEach((tag) => invalidateByTag(tag));
21
+ await Promise.all(data.tags.map((tag) => invalidateByTag(tag)));
22
22
  }
23
23
  } catch {}
24
24
  };
@@ -36,11 +36,11 @@ async function connectPushEvents() {
36
36
 
37
37
  function scheduleReconnect() {
38
38
  if (pushReconnectTimer) clearTimeout(pushReconnectTimer);
39
- pushReconnectTimer = setTimeout(connectPushEvents, ${reconnectDelayMs});
39
+ pushReconnectTimer = setTimeout(connectPushEvents, Math.max(1000, ${reconnectDelayMs}));
40
40
  }
41
41
 
42
- self.addEventListener("activate", (event) => {
43
- event.waitUntil(connectPushEvents());
42
+ self.addEventListener("activate", () => {
43
+ connectPushEvents();
44
44
  });
45
45
  `;
46
46
  }
@@ -49,11 +49,7 @@ self.addEventListener("activate", (event) => {
49
49
  // --- Server Push Events (SSE) ---
50
50
 
51
51
  function notifyClientsSSE(connected) {
52
- self.clients.matchAll().then(function(clients) {
53
- clients.forEach(function(client) {
54
- client.postMessage({ type: "SSE_STATUS", connected: !!connected });
55
- });
56
- });
52
+ broadcastToClients("SSE_STATUS", { connected: !!connected });
57
53
  }
58
54
 
59
55
  let pushReconnectTimer = null;
@@ -97,7 +93,7 @@ async function connectPushEvents() {
97
93
  try {
98
94
  const parsed = JSON.parse(dataStr);
99
95
  if (parsed.tags) {
100
- parsed.tags.forEach((tag) => invalidateByTag(tag));
96
+ await Promise.all(parsed.tags.map((tag) => invalidateByTag(tag)));
101
97
  }
102
98
  } catch {}
103
99
  }
@@ -115,11 +111,11 @@ async function connectPushEvents() {
115
111
 
116
112
  function scheduleReconnect() {
117
113
  if (pushReconnectTimer) clearTimeout(pushReconnectTimer);
118
- pushReconnectTimer = setTimeout(connectPushEvents, ${reconnectDelayMs});
114
+ pushReconnectTimer = setTimeout(connectPushEvents, Math.max(1000, ${reconnectDelayMs}));
119
115
  }
120
116
 
121
- self.addEventListener("activate", (event) => {
122
- event.waitUntil(connectPushEvents());
117
+ self.addEventListener("activate", () => {
118
+ connectPushEvents();
123
119
  });
124
120
  `;
125
121
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server-push-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/server-push-handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,UAAU,yBAAyB,CACvC,IAAyB,EACzB,QAAgB,EAChB,gBAAwB;IAExB,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,OAAO;;;;;;;;8BAQmB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;uDAuBiB,gBAAgB;;;;;;CAMtE,CAAC;IACA,CAAC;IAED,qCAAqC;IACrC,OAAO;;;;;;;;;;;;;;;;;oCAiB2B,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uDAqDW,gBAAgB;;;;;;CAMtE,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"server-push-handler.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/server-push-handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,UAAU,yBAAyB,CACvC,IAAyB,EACzB,QAAgB,EAChB,gBAAwB;IAExB,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,OAAO;;;;;;;;8BAQmB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;sEAuBgC,gBAAgB;;;;;;CAMrF,CAAC;IACF,CAAC;IAEC,qCAAqC;IACrC,OAAO;;;;;;;;;;;;;oCAa2B,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sEAqD0B,gBAAgB;;;;;;CAMrF,CAAC;AACF,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { generateFetchHandler } from "./fetch-handler.js";
2
+ import { generateActivateHandler } from "./activate-handler.js";
3
+ import { generateInstallHandler } from "./install-handler.js";
4
+ import { generateMessageHandler } from "./message-handler.js";
5
+ import { generateTagManagement } from "./tag-management.js";
6
+ import { generateBatchRefreshQueue } from "./batch-refresh-queue.js";
7
+ import { generateSwPushHandlers } from "./sw-push.js";
8
+ import { generateServerPushHandler } from "./server-push-handler.js";
9
+ import { generateBackgroundSyncHandler } from "./background-sync-handler.js";
10
+ import { generateBackgroundPrecache } from "./background-precache.js";
11
+ const COOKIE_AUTH_TYPES = ["cookie"];
12
+ function isCookieAuth(authType) {
13
+ return COOKIE_AUTH_TYPES.includes(authType);
14
+ }
15
+ export function shouldIncludeBackgroundSync(config) {
16
+ const { features } = config;
17
+ return !!(features.mutationQueue.backgroundSync &&
18
+ features.mutationQueue.enabled &&
19
+ (!features.auth.enabled || isCookieAuth(features.auth.type)));
20
+ }
21
+ export function shouldIncludeServerPush(config) {
22
+ const { features } = config;
23
+ return !!(features.serverPush?.enabled &&
24
+ (!features.auth.enabled || isCookieAuth(features.auth.type)));
25
+ }
26
+ export function generateBackgroundSyncCode(config) {
27
+ const { features } = config;
28
+ const authType = features.auth.enabled ? features.auth.type : undefined;
29
+ const mq = features.mutationQueue;
30
+ const maxCacheAge = features.serviceWorker.strategy.maxRuntimeCacheAge;
31
+ return `\n\n${generateBackgroundSyncHandler(authType, mq.batchSize, mq.batchDelayMs, mq.retry, true, maxCacheAge)}`;
32
+ }
33
+ /**
34
+ * Applies all SW section generators (fetch, activate, install, message,
35
+ * tag management, push, server push) into the template code.
36
+ *
37
+ * @param code - The template code with placeholder markers
38
+ * @param config - Swoff configuration
39
+ * @param useApiBasePlaceholder - When true, prepend SWOFF_API_BASE to server-push endpoint
40
+ * @returns The code with all sections replaced
41
+ */
42
+ export function applySwSections(code, config, useApiBasePlaceholder, debug) {
43
+ const { features } = config;
44
+ const { serviceWorker } = features;
45
+ const { strategy, navigation } = serviceWorker;
46
+ const { refetchQueue } = features;
47
+ const maxCacheAge = strategy.maxRuntimeCacheAge;
48
+ const spEnabled = shouldIncludeServerPush(config);
49
+ const spEndpoint = features.serverPush?.endpoint ?? "";
50
+ code = code.replace("// [[FETCH_HANDLER]]", () => generateFetchHandler({ strategy, navigation, refetchQueue }, features.tagInvalidation.enabled, features.mutationQueue.enabled, features.auth.routePaths, spEnabled ? spEndpoint : undefined, debug));
51
+ code = code.replace("// [[ACTIVATE_HANDLER]]", () => generateActivateHandler(navigation.preload, maxCacheAge));
52
+ code = code.replace("// [[BACKGROUND_PRECACHE]]", () => generateBackgroundPrecache());
53
+ code = code.replace("// [[INSTALL_HANDLER]]", () => generateInstallHandler());
54
+ code = code.replace("// [[BATCH_REFRESH_QUEUE]]", () => generateBatchRefreshQueue(refetchQueue.retry, refetchQueue.batchSize, refetchQueue.batchDelayMs));
55
+ code = code.replace("// [[MESSAGE_HANDLER]]", () => generateMessageHandler(features.tagInvalidation.enabled, features.tagInvalidation.debounceMs ?? 0));
56
+ code = features.tagInvalidation.enabled
57
+ ? code.replace("// [[TAG_MANAGEMENT]]", () => generateTagManagement(maxCacheAge))
58
+ : code.replace("// [[TAG_MANAGEMENT]]", "");
59
+ const endpoint = useApiBasePlaceholder
60
+ ? "SWOFF_API_BASE" + spEndpoint
61
+ : spEndpoint;
62
+ code = features.pushNotifications
63
+ ? code.replace("// [[PUSH_HANDLERS]]", () => generateSwPushHandlers())
64
+ : code.replace("// [[PUSH_HANDLERS]]", "");
65
+ code = spEnabled
66
+ ? code.replace("// [[SERVER_PUSH_HANDLER]]", () => generateServerPushHandler(features.serverPush.type, endpoint, features.serverPush.reconnectDelayMs))
67
+ : code.replace("// [[SERVER_PUSH_HANDLER]]", "");
68
+ return code;
69
+ }
70
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/shared.ts"],"names":[],"mappings":"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"}
@@ -41,10 +41,6 @@ self.addEventListener("notificationclick", (event) => {
41
41
 
42
42
  event.waitUntil(
43
43
  (async () => {
44
- if (action) {
45
- // Handle action clicks (e.g., "reply", "dismiss")
46
- }
47
-
48
44
  const clients = await self.clients.matchAll({ type: "window" });
49
45
 
50
46
  for (const client of clients) {
@@ -56,8 +52,8 @@ self.addEventListener("notificationclick", (event) => {
56
52
  }
57
53
  }
58
54
 
59
- if (clients.openWindow) {
60
- return clients.openWindow(url);
55
+ if (self.clients.openWindow) {
56
+ return self.clients.openWindow(url);
61
57
  }
62
58
  })(),
63
59
  );
@@ -1 +1 @@
1
- {"version":3,"file":"sw-push.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/sw-push.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2DR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"sw-push.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/sw-push.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuDR,CAAC;AACF,CAAC"}
@@ -1,99 +1,32 @@
1
- /**
2
- * Generates IndexedDB-based tag invalidation logic for the SW.
3
- * After invalidation, tries to re-fetch URLs in the background.
4
- * On failure, keeps the old entry as stale-while-revalidate fallback.
5
- *
6
- * Cascading is handled by the client — the SW processes one tag at a time.
7
- */
8
- export function generateTagManagement() {
1
+ export function generateTagManagement(maxAge) {
2
+ const evict = maxAge && maxAge > 0;
9
3
  return `
10
- const staleVersions = new Map();
11
- const STALE_VERSIONS_MAX = 100;
12
- const STALE_VERSION_TTL = 30 * 60 * 1000;
13
4
  const TAG_DB_NAME = "swoff-cache-tags";
14
5
  const TAG_STORE_NAME = "tags";
15
6
  // Bump this when adding new indexes/stores for schema migration
16
7
  const TAG_DB_VERSION = 1;
17
8
 
18
- function cleanStaleVersions() {
19
- const now = Date.now();
20
- for (const [url, ts] of staleVersions) {
21
- if (staleVersions.size > STALE_VERSIONS_MAX || now - ts > STALE_VERSION_TTL) {
22
- staleVersions.delete(url);
9
+ async function cacheTagUrl(url, actualUrl, tags, method, body, contentType) {
10
+ const db = await openDB(TAG_DB_NAME, TAG_DB_VERSION, function(db) {
11
+ if (!db.objectStoreNames.contains(TAG_STORE_NAME)) {
12
+ const store = db.createObjectStore(TAG_STORE_NAME, { keyPath: "url" });
13
+ store.createIndex("by-tag", "tags", { multiEntry: true });
23
14
  }
24
- }
25
- }
26
-
27
- function openTagDB() {
28
- return new Promise((resolve, reject) => {
29
- const request = indexedDB.open(TAG_DB_NAME, TAG_DB_VERSION);
30
- request.onupgradeneeded = (e) => {
31
- const db = e.target.result;
32
- if (!db.objectStoreNames.contains(TAG_STORE_NAME)) {
33
- const store = db.createObjectStore(TAG_STORE_NAME, { keyPath: "url" });
34
- store.createIndex("by-tag", "tags", { multiEntry: true });
35
- }
36
- };
37
- request.onsuccess = (e) => resolve(e.target.result);
38
- request.onerror = (e) => reject(e.target.error);
39
15
  });
40
- }
41
-
42
- async function cacheTagUrl(url, actualUrl, tags, method, body, contentType) {
43
- const db = await openTagDB();
44
- const tx = db.transaction(TAG_STORE_NAME, "readwrite");
16
+ ${evict
17
+ ? `await pruneStaleStore(db, TAG_STORE_NAME, Date.now() - MAX_RUNTIME_CACHE_AGE * 1000);
18
+ `
19
+ : ""}const tx = db.transaction(TAG_STORE_NAME, "readwrite");
45
20
  const store = tx.objectStore(TAG_STORE_NAME);
46
- store.put({ url, actualUrl, tags, method: method || "GET", body: body || null, contentType: contentType || null });
21
+ store.put({ url, actualUrl, tags, method: method || "GET", body: body || null, contentType: contentType || null, timestamp: Date.now() });
47
22
  await new Promise((resolve, reject) => {
48
23
  tx.oncomplete = () => resolve();
49
24
  tx.onerror = () => reject(tx.error);
50
25
  });
51
26
  }
52
27
 
53
- async function invalidateByTag(tag) {
54
- const db = await openTagDB();
55
- const tx = db.transaction(TAG_STORE_NAME, "readonly");
56
- const store = tx.objectStore(TAG_STORE_NAME);
57
- const index = store.index("by-tag");
58
- const entries = await new Promise((resolve, reject) => {
59
- const request = index.getAll(tag);
60
- request.onsuccess = () => resolve(request.result);
61
- request.onerror = () => reject(request.error);
62
- });
63
- await db.close();
64
-
65
- // Remove from tag index and runtime cache
66
- const writeDb = await openTagDB();
67
- const writeTx = writeDb.transaction(TAG_STORE_NAME, "readwrite");
68
- const writeStore = writeTx.objectStore(TAG_STORE_NAME);
69
- for (const entry of entries) {
70
- writeStore.delete(entry.url);
71
- }
72
- await new Promise((resolve, reject) => {
73
- writeTx.oncomplete = () => resolve();
74
- writeTx.onerror = () => reject(writeTx.error);
75
- });
76
- writeDb.close();
77
-
78
- const runtimeCache = await caches.open(CACHE_NAME_RUNTIME);
79
- for (const entry of entries) {
80
- await runtimeCache.delete(entry.url);
81
- }
82
-
83
- // Enqueue background refetch through batched refresh queue
84
- for (const entry of entries) {
85
- staleVersions.set(entry.url, Date.now());
86
- queueRefresh(entry.url, entry.actualUrl, entry.tags, entry.method, entry.body, entry.contentType);
87
- }
88
-
89
- const clients = await self.clients.matchAll();
90
- clients.forEach((client) => {
91
- client.postMessage({ type: "TAG_INVALIDATED", tag });
92
- });
93
- }
94
-
95
28
  async function getUrlsForTag(tag) {
96
- const db = await openTagDB();
29
+ const db = await openDB(TAG_DB_NAME, TAG_DB_VERSION);
97
30
  const tx = db.transaction(TAG_STORE_NAME, "readonly");
98
31
  const store = tx.objectStore(TAG_STORE_NAME);
99
32
  const index = store.index("by-tag");
@@ -102,12 +35,12 @@ async function getUrlsForTag(tag) {
102
35
  request.onsuccess = () => resolve(request.result);
103
36
  request.onerror = () => reject(request.error);
104
37
  });
105
- await db.close();
38
+ tx.oncomplete = () => db.close();
106
39
  return entries.map((e) => ({ url: e.url, actualUrl: e.actualUrl }));
107
40
  }
108
41
 
109
42
  async function getTagsForUrl(url) {
110
- const db = await openTagDB();
43
+ const db = await openDB(TAG_DB_NAME, TAG_DB_VERSION);
111
44
  const tx = db.transaction(TAG_STORE_NAME, "readonly");
112
45
  const store = tx.objectStore(TAG_STORE_NAME);
113
46
  const entry = await new Promise((resolve, reject) => {
@@ -115,12 +48,48 @@ async function getTagsForUrl(url) {
115
48
  request.onsuccess = () => resolve(request.result);
116
49
  request.onerror = () => reject(request.error);
117
50
  });
118
- await db.close();
51
+ tx.oncomplete = () => db.close();
119
52
  return entry ? entry.tags : [];
120
53
  }
121
54
 
55
+ async function invalidateByTag(tag) {
56
+ const db = await openDB(TAG_DB_NAME, TAG_DB_VERSION);
57
+ const tx = db.transaction(TAG_STORE_NAME, "readwrite");
58
+ const store = tx.objectStore(TAG_STORE_NAME);
59
+ const index = store.index("by-tag");
60
+ const entries = await new Promise((resolve, reject) => {
61
+ const request = index.getAll(tag);
62
+ request.onsuccess = () => resolve(request.result);
63
+ request.onerror = () => reject(request.error);
64
+ });
65
+
66
+ if (!entries || entries.length === 0) {
67
+ tx.oncomplete = () => db.close();
68
+ return;
69
+ }
70
+
71
+ for (const entry of entries) {
72
+ store.delete(entry.url);
73
+ }
74
+ await new Promise((resolve, reject) => {
75
+ tx.oncomplete = () => resolve();
76
+ tx.onerror = () => reject(tx.error);
77
+ });
78
+ db.close();
79
+
80
+ const runtimeCache = await caches.open("swoff-runtime");
81
+ const rscCache = await caches.open("swoff-runtime-html");
82
+ for (const entry of entries) {
83
+ await runtimeCache.delete(entry.url);
84
+ await rscCache.delete(entry.url);
85
+ queueRefresh(entry.actualUrl);
86
+ }
87
+
88
+ broadcastToClients("TAG_INVALIDATED", { tag });
89
+ }
90
+
122
91
  async function invalidateMatching(globPattern) {
123
- const db = await openTagDB();
92
+ const db = await openDB(TAG_DB_NAME, TAG_DB_VERSION);
124
93
  const tx = db.transaction(TAG_STORE_NAME, "readonly");
125
94
  const store = tx.objectStore(TAG_STORE_NAME);
126
95
  const allEntries = await new Promise((resolve, reject) => {
@@ -128,9 +97,9 @@ async function invalidateMatching(globPattern) {
128
97
  request.onsuccess = () => resolve(request.result);
129
98
  request.onerror = () => reject(request.error);
130
99
  });
131
- await db.close();
100
+ tx.oncomplete = () => db.close();
132
101
 
133
- const matching = allEntries.filter((entry) => matchGlob(entry.url, globPattern));
102
+ const matching = allEntries.filter((entry) => matchGlob(entry.actualUrl, globPattern));
134
103
  const tags = new Set();
135
104
  for (const entry of matching) {
136
105
  for (const tag of entry.tags) {
@@ -1 +1 @@
1
- {"version":3,"file":"tag-management.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/tag-management.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoIP,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"tag-management.js","sourceRoot":"","sources":["../../../../src/lib/generators/sw-sections/tag-management.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB,CAAC,MAAe;IACnD,MAAM,KAAK,GAAG,MAAM,IAAI,MAAM,GAAG,CAAC,CAAC;IAEnC,OAAO;;;;;;;;;;;;;IAcL,KAAK;QACH,CAAC,CAAC;GACL;QACG,CAAC,CAAC,EACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2FA,CAAC;AACH,CAAC"}