@ultimat3/pwa 7.0.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CLAUDE.md CHANGED
@@ -18,6 +18,7 @@ Tier 4. May import tiers 0–3: `core`, `schema`, `i18n`, `money`, `time`, `cach
18
18
  | Precache FETCH | the revision is appended with `?` or `&`, picked per entry. `PrecacheAsset.url` is public API and a bundler emits `?v=<hash>` of its own, so a fixed `?` built `...?locale=en?v=<rev>`; `addAll` is all-or-nothing, so one non-200 there means `install` rejects and the worker never activates at all. |
19
19
  | SW scope | `assertScope` refuses a relative `swPath`. `lastIndexOf('/')` on `sw.js` is `-1`, so the directory was `''` and `scope.startsWith('')` passed for every scope — the check waved through exactly the config most likely to be wrong. |
20
20
  | HTML sinks | one escaper: `escapeAttribute` from `@ultimat3/seo` (tier 1, and the only one reachable — render's `html.ts` is tier 4, sideways). `appleTouchLinks` and `renderThemeColorMeta` interpolate app config into attributes; both escape. Never a second escaper here. |
21
+ | A byte count in a warning | `formatBytes` from `@ultimat3/core`, never a local one. The copy that lived in `precache.ts` stopped at `mb`, so a precache past a gigabyte reported a four-digit `mb` — and `@ultimat3/render`'s copy stopped at `kb`, so the two halves of one build printed different units for the same bytes. Still on this barrel: a size report is what a caller of this package prints. |
21
22
  | Cache names | always `cacheNamespace(buildId, kind)`. An unkeyed cache name is a rejected change. |
22
23
  | Offline fallback | `requireOfflineFallback` runs inside `generateServiceWorker`. Never optional. |
23
24
  | Capabilities | gate the manifest member **and** the SW block, where the capability has one. Disabled → zero bytes. `push`, `backgroundSync` and `badging` emit worker code; `shareTarget`, `fileHandlers` and `protocolHandlers` are **manifest-only** — the OS delivers to a route the app already serves — and their `CAPABILITY_SW_MARKERS` list is empty, which `service-worker.test.ts` checks in both directions: every declared marker is in the worker when its capability is on, none is when they are all off. `shareTarget` named `/_x/share-target` there while no block emitted it. |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ultimat3/pwa",
3
- "version": "7.0.0",
3
+ "version": "8.0.0",
4
4
  "description": "Generated service worker, web manifest, icons, push and version-skew handling.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -31,7 +31,7 @@
31
31
  "test": "bun test"
32
32
  },
33
33
  "dependencies": {
34
- "@ultimat3/core": "7.0.0",
35
- "@ultimat3/seo": "7.0.0"
34
+ "@ultimat3/core": "8.0.0",
35
+ "@ultimat3/seo": "8.0.0"
36
36
  }
37
37
  }
package/src/index.ts CHANGED
@@ -6,6 +6,9 @@
6
6
  * re-exported here; a consumer still needs one import, and now it names the real type.
7
7
  */
8
8
  export type { OfflineStrategy, RenderMode } from '@ultimat3/core';
9
+ // Moved to `@ultimat3/core` (one formatter, `b`/`kb`/`mb`/`gb`); still named here because a service
10
+ // worker's size report is what a caller of this package prints.
11
+ export { formatBytes } from '@ultimat3/core';
9
12
  export type { BackgroundSyncOptions, RetryPolicy } from './background-sync';
10
13
  export {
11
14
  backgroundSyncSource,
@@ -94,7 +97,6 @@ export type { PrecacheAsset, PrecacheEntry, PrecacheInput, PrecacheManifest } fr
94
97
  export {
95
98
  buildPrecacheManifest,
96
99
  DEFAULT_PRECACHE_WARN_BYTES,
97
- formatBytes,
98
100
  serializePrecacheManifest,
99
101
  } from './precache';
100
102
  export type {
package/src/precache.ts CHANGED
@@ -4,6 +4,9 @@
4
4
  * hash, never the build id, or every deploy would re-fetch everything.
5
5
  */
6
6
 
7
+ // One formatter, in `@ultimat3/core`: the copy that lived here stopped at `mb`, and the route
8
+ // budget message on the other side of the build stopped at `kb`, for the same byte count.
9
+ import { formatBytes } from '@ultimat3/core';
7
10
  import type { PwaRoute } from './strategies';
8
11
 
9
12
  export interface PrecacheAsset {
@@ -120,12 +123,6 @@ export function buildPrecacheManifest(input: PrecacheInput): PrecacheManifest {
120
123
  return { buildId: input.buildId, entries: sorted, totalBytes, warnings };
121
124
  }
122
125
 
123
- export function formatBytes(bytes: number): string {
124
- if (bytes < 1024) return `${bytes}b`;
125
- if (bytes < 1024 * 1024) return `${Math.round((bytes / 1024) * 10) / 10}kb`;
126
- return `${Math.round((bytes / (1024 * 1024)) * 10) / 10}mb`;
127
- }
128
-
129
126
  /** The manifest as it is embedded in `sw.js`; stable key order for determinism. */
130
127
  export function serializePrecacheManifest(manifest: PrecacheManifest): string {
131
128
  const rows = manifest.entries.map(