@pwa-platform/entry-resilience 0.3.2 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/probes.d.ts.map +1 -1
- package/dist/browser/probes.js +21 -19
- package/dist/browser/probes.js.map +1 -1
- package/dist/client/index.js +2 -1
- package/dist/client/index.js.map +1 -1
- package/dist/internal/origin.js +14 -1
- package/dist/internal/origin.js.map +1 -1
- package/dist/internal/plain-object.js +1 -1
- package/dist/internal/plain-object.js.map +1 -1
- package/dist/vite/default-style.d.ts +1 -1
- package/dist/vite/default-style.d.ts.map +1 -1
- package/dist/vite/default-style.js +5 -1
- package/dist/vite/default-style.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../../src/browser/probes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CACnC,CAAC;AAIF;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,SAAiB,EAAE,EAAE,mBAAmB,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../../src/browser/probes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CACnC,CAAC;AAIF;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,SAAiB,EAAE,EAAE,mBAAmB,GAAG,WAAW,CAY/F"}
|
package/dist/browser/probes.js
CHANGED
|
@@ -9,28 +9,30 @@ export function createProbes({ mountPath, fetchImpl = fetch }) {
|
|
|
9
9
|
return {
|
|
10
10
|
async probePrimary() {
|
|
11
11
|
const url = `${mountPath}__pwa-entry-probe?${Math.random()}`;
|
|
12
|
-
|
|
13
|
-
await fetchImpl(url, { cache: "no-store", credentials: "omit", signal: AbortSignal.timeout(PROBE_TIMEOUT_MS) });
|
|
14
|
-
return true;
|
|
15
|
-
}
|
|
16
|
-
catch {
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
12
|
+
return settlesInTime((signal) => fetchImpl(url, { cache: "no-store", credentials: "omit", signal }));
|
|
19
13
|
},
|
|
20
14
|
async probeAlternate(origin, startPath) {
|
|
21
|
-
|
|
22
|
-
await fetchImpl(`${origin}${startPath}`, {
|
|
23
|
-
mode: "no-cors",
|
|
24
|
-
credentials: "omit",
|
|
25
|
-
cache: "no-store",
|
|
26
|
-
signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),
|
|
27
|
-
});
|
|
28
|
-
return true;
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
15
|
+
return settlesInTime((signal) => fetchImpl(`${origin}${startPath}`, { mode: "no-cors", credentials: "omit", cache: "no-store", signal }));
|
|
33
16
|
},
|
|
34
17
|
};
|
|
35
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Whether `request` settles within the probe timeout. The timeout is an `AbortController` plus a timer rather than
|
|
21
|
+
* `AbortSignal.timeout`, which browsers below the supported floor (Safari 13.1 / Chrome 80 / Firefox 74) lack — it
|
|
22
|
+
* arrived in Chrome 103, Firefox 100 and Safari 16; without it every probe would report the origin unreachable.
|
|
23
|
+
*/
|
|
24
|
+
async function settlesInTime(request) {
|
|
25
|
+
const controller = new AbortController();
|
|
26
|
+
const timer = setTimeout(() => controller.abort(), PROBE_TIMEOUT_MS);
|
|
27
|
+
try {
|
|
28
|
+
await request(controller.signal);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
clearTimeout(timer);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
36
38
|
//# sourceMappingURL=probes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"probes.js","sourceRoot":"","sources":["../../src/browser/probes.ts"],"names":[],"mappings":"AASA,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,GAAG,KAAK,EAAuB;IAChF,OAAO;QACL,KAAK,CAAC,YAAY;YAChB,MAAM,GAAG,GAAG,GAAG,SAAS,qBAAqB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7D,
|
|
1
|
+
{"version":3,"file":"probes.js","sourceRoot":"","sources":["../../src/browser/probes.ts"],"names":[],"mappings":"AASA,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,GAAG,KAAK,EAAuB;IAChF,OAAO;QACL,KAAK,CAAC,YAAY;YAChB,MAAM,GAAG,GAAG,GAAG,SAAS,qBAAqB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7D,OAAO,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACvG,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,SAAiB;YACpD,OAAO,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE,CAC9B,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CACxG,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,aAAa,CAAC,OAAmD;IAC9E,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
|
package/dist/client/index.js
CHANGED
|
@@ -15,7 +15,8 @@ import { themeStorageKey } from "../internal/theme-key.js";
|
|
|
15
15
|
let ports;
|
|
16
16
|
/** Builds the shared browser ports on first use and returns the same instance on every later call. */
|
|
17
17
|
function sharedPorts() {
|
|
18
|
-
ports
|
|
18
|
+
if (ports === undefined)
|
|
19
|
+
ports = createEntryRuntimePorts(config);
|
|
19
20
|
return ports;
|
|
20
21
|
}
|
|
21
22
|
/** Runs the page-side entry-recovery check. Never throws — see `runEntryRecovery`'s docstring. */
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,gHAAgH;AAChH,sGAAsG;AACtG,2GAA2G;AAC3G,oHAAoH;AACpH,qHAAqH;AACrH,6EAA6E;AAC7E,EAAE;AACF,iHAAiH;AACjH,kHAAkH;AAClH,OAAO,MAAM,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAQ3D,IAAI,KAA6B,CAAC;AAElC,sGAAsG;AACtG,SAAS,WAAW;IAClB,KAAK,KAAK,uBAAuB,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,gHAAgH;AAChH,sGAAsG;AACtG,2GAA2G;AAC3G,oHAAoH;AACpH,qHAAqH;AACrH,6EAA6E;AAC7E,EAAE;AACF,iHAAiH;AACjH,kHAAkH;AAClH,OAAO,MAAM,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAQ3D,IAAI,KAA6B,CAAC;AAElC,sGAAsG;AACtG,SAAS,WAAW;IAClB,IAAI,KAAK,KAAK,SAAS;QAAE,KAAK,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACjE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,kBAAkB,CAAC,OAA2B;IAC5D,OAAO,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;AAC1D,CAAC;AAED;4CAC4C;AAC5C,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,OAAO,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QAC9D,IAAI,KAAK,KAAK,QAAQ;YAAE,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;;YAChD,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;AACH,CAAC"}
|
package/dist/internal/origin.js
CHANGED
|
@@ -7,7 +7,7 @@ const LOOPBACK_HOSTS = new Set(["localhost", "127.0.0.1", "[::1]"]);
|
|
|
7
7
|
* or fragment), protocol `https:`, with the sole exception of `http:` on a loopback host (any port).
|
|
8
8
|
*/
|
|
9
9
|
export function isNormalizedOrigin(value) {
|
|
10
|
-
if (!
|
|
10
|
+
if (!canParseUrl(value))
|
|
11
11
|
return false;
|
|
12
12
|
const url = new URL(value);
|
|
13
13
|
if (url.origin !== value)
|
|
@@ -16,4 +16,17 @@ export function isNormalizedOrigin(value) {
|
|
|
16
16
|
return true;
|
|
17
17
|
return url.protocol === "http:" && LOOPBACK_HOSTS.has(url.hostname);
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Whether `new URL(value, base)` would succeed: the same answer as `URL.canParse`, which browsers below the supported
|
|
21
|
+
* floor (Safari 13.1 / Chrome 80 / Firefox 74) do not have — it arrived in Chrome 120, Firefox 115 and Safari 17.
|
|
22
|
+
*/
|
|
23
|
+
function canParseUrl(value, base) {
|
|
24
|
+
try {
|
|
25
|
+
new URL(value, base);
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
19
32
|
//# sourceMappingURL=origin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"origin.js","sourceRoot":"","sources":["../../src/internal/origin.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,4GAA4G;AAC5G,2GAA2G;AAC3G,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAEzF;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"origin.js","sourceRoot":"","sources":["../../src/internal/origin.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,4GAA4G;AAC5G,2GAA2G;AAC3G,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAEzF;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,KAAa,EAAE,IAAa;IAC/C,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -11,6 +11,6 @@ export function isPlainObject(value) {
|
|
|
11
11
|
*/
|
|
12
12
|
export function hasKeysWithin(value, required, optional = []) {
|
|
13
13
|
const allowed = new Set([...required, ...optional]);
|
|
14
|
-
return Object.keys(value).every((key) => allowed.has(key)) && required.every((key) => Object.
|
|
14
|
+
return Object.keys(value).every((key) => allowed.has(key)) && required.every((key) => Object.prototype.hasOwnProperty.call(value, key));
|
|
15
15
|
}
|
|
16
16
|
//# sourceMappingURL=plain-object.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plain-object.js","sourceRoot":"","sources":["../../src/internal/plain-object.ts"],"names":[],"mappings":"AAAA,8GAA8G;AAC9G,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,SAAS,GAAY,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACxD,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,KAA8B,EAC9B,QAA2B,EAC3B,WAA8B,EAAE;IAEhC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"plain-object.js","sourceRoot":"","sources":["../../src/internal/plain-object.ts"],"names":[],"mappings":"AAAA,8GAA8G;AAC9G,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,SAAS,GAAY,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACxD,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,KAA8B,EAC9B,QAA2B,EAC3B,WAA8B,EAAE;IAEhC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;AAC1I,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const DEFAULT_RECOVERY_PAGE_STYLE = ".pwa-entry {\n --pwa-entry-bg: #ffffff;\n --pwa-entry-fg: #1f2328;\n --pwa-entry-muted: #5b6470;\n --pwa-entry-accent: #0b5cd5;\n --pwa-entry-accent-fg: #ffffff;\n --pwa-entry-radius: 0.5rem;\n --pwa-entry-max-width: 34rem;\n --pwa-entry-font: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n /* Covers the whole viewport, whatever the body's default margin: until 2026-09-24 the root was a centred\n max-width column, so in dark mode only that column was dark and the rest of the page stayed white. The content\n keeps its width through the inline padding instead of a max-width on the root. */\n display: block;\n position: fixed;\n inset: 0;\n overflow-y: auto;\n box-sizing: border-box;\n color-scheme: light;\n padding: 3rem max(1.5rem, calc((100% - var(--pwa-entry-max-width)) / 2));\n font-family: var(--pwa-entry-font);\n line-height: 1.5;\n color: var(--pwa-entry-fg);\n background: var(--pwa-entry-bg);\n}\n@media (prefers-color-scheme: dark) {\n .pwa-entry:not([data-theme=\"light\"]) {\n --pwa-entry-bg: #0f1419;\n --pwa-entry-fg: #e6e9ec;\n --pwa-entry-muted: #9aa4b0;\n --pwa-entry-accent: #4c93ff;\n --pwa-entry-accent-fg: #0b1220;\n color-scheme: dark;\n }\n}\n.pwa-entry[data-theme=\"dark\"] {\n --pwa-entry-bg: #0f1419;\n --pwa-entry-fg: #e6e9ec;\n --pwa-entry-muted: #9aa4b0;\n --pwa-entry-accent: #4c93ff;\n --pwa-entry-accent-fg: #0b1220;\n color-scheme: dark;\n}\n.pwa-entry__headline {\n margin: 0 0 0.75rem;\n font-size: 1.375rem;\n font-weight: 600;\n}\n.pwa-entry__message,\n.pwa-entry__expiry {\n margin: 0 0 0.75rem;\n color: var(--pwa-entry-muted);\n}\n.pwa-entry__list {\n display: grid;\n gap: 0.75rem;\n margin: 1.5rem 0 0;\n padding: 0;\n list-style: none;\n}\n.pwa-entry__item {\n margin: 0;\n padding: 0;\n}\n.pwa-entry__button {\n display: block;\n box-sizing: border-box;\n width: 100%;\n min-height: 44px;\n padding: 0.75rem 1rem;\n border: none;\n border-radius: var(--pwa-entry-radius);\n background: var(--pwa-entry-accent);\n color: var(--pwa-entry-accent-fg);\n font: inherit;\n font-weight: 600;\n cursor: pointer;\n}\n.pwa-entry__button:active {\n /* A brightness shift rather than a different background: swapping in a surface colour while the label keeps\n --pwa-entry-accent-fg leaves white text on a near-white fill for the light theme. */\n filter: brightness(0.92);\n}\n.pwa-entry__empty,\n.pwa-entry__loading {\n color: var(--pwa-entry-muted);\n}\n@media print {\n .pwa-entry {\n position: static;\n overflow: visible;\n }\n}\n";
|
|
1
|
+
export declare const DEFAULT_RECOVERY_PAGE_STYLE = ".pwa-entry {\n --pwa-entry-bg: #ffffff;\n --pwa-entry-fg: #1f2328;\n --pwa-entry-muted: #5b6470;\n --pwa-entry-accent: #0b5cd5;\n --pwa-entry-accent-fg: #ffffff;\n --pwa-entry-radius: 0.5rem;\n --pwa-entry-max-width: 34rem;\n --pwa-entry-font: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n /* Covers the whole viewport, whatever the body's default margin: until 2026-09-24 the root was a centred\n max-width column, so in dark mode only that column was dark and the rest of the page stayed white. The content\n keeps its width through the inline padding instead of a max-width on the root. */\n display: block;\n position: fixed;\n /* Not \"inset: 0\": Safari 13.1 lacks it (14.1+), and the cover would collapse. */\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n overflow-y: auto;\n box-sizing: border-box;\n color-scheme: light;\n padding: 3rem max(1.5rem, calc((100% - var(--pwa-entry-max-width)) / 2));\n font-family: var(--pwa-entry-font);\n line-height: 1.5;\n color: var(--pwa-entry-fg);\n background: var(--pwa-entry-bg);\n}\n@media (prefers-color-scheme: dark) {\n .pwa-entry:not([data-theme=\"light\"]) {\n --pwa-entry-bg: #0f1419;\n --pwa-entry-fg: #e6e9ec;\n --pwa-entry-muted: #9aa4b0;\n --pwa-entry-accent: #4c93ff;\n --pwa-entry-accent-fg: #0b1220;\n color-scheme: dark;\n }\n}\n.pwa-entry[data-theme=\"dark\"] {\n --pwa-entry-bg: #0f1419;\n --pwa-entry-fg: #e6e9ec;\n --pwa-entry-muted: #9aa4b0;\n --pwa-entry-accent: #4c93ff;\n --pwa-entry-accent-fg: #0b1220;\n color-scheme: dark;\n}\n.pwa-entry__headline {\n margin: 0 0 0.75rem;\n font-size: 1.375rem;\n font-weight: 600;\n}\n.pwa-entry__message,\n.pwa-entry__expiry {\n margin: 0 0 0.75rem;\n color: var(--pwa-entry-muted);\n}\n.pwa-entry__list {\n display: grid;\n gap: 0.75rem;\n margin: 1.5rem 0 0;\n padding: 0;\n list-style: none;\n}\n.pwa-entry__item {\n margin: 0;\n padding: 0;\n}\n.pwa-entry__button {\n display: block;\n box-sizing: border-box;\n width: 100%;\n min-height: 44px;\n padding: 0.75rem 1rem;\n border: none;\n border-radius: var(--pwa-entry-radius);\n background: var(--pwa-entry-accent);\n color: var(--pwa-entry-accent-fg);\n font: inherit;\n font-weight: 600;\n cursor: pointer;\n}\n.pwa-entry__button:active {\n /* A brightness shift rather than a different background: swapping in a surface colour while the label keeps\n --pwa-entry-accent-fg leaves white text on a near-white fill for the light theme. */\n filter: brightness(0.92);\n}\n.pwa-entry__empty,\n.pwa-entry__loading {\n color: var(--pwa-entry-muted);\n}\n@media print {\n .pwa-entry {\n position: static;\n overflow: visible;\n }\n}\n";
|
|
2
2
|
//# sourceMappingURL=default-style.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-style.d.ts","sourceRoot":"","sources":["../../src/vite/default-style.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,2BAA2B,
|
|
1
|
+
{"version":3,"file":"default-style.d.ts","sourceRoot":"","sources":["../../src/vite/default-style.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,2BAA2B,qrFAgGvC,CAAC"}
|
|
@@ -27,7 +27,11 @@ export const DEFAULT_RECOVERY_PAGE_STYLE = `.pwa-entry {
|
|
|
27
27
|
keeps its width through the inline padding instead of a max-width on the root. */
|
|
28
28
|
display: block;
|
|
29
29
|
position: fixed;
|
|
30
|
-
inset: 0
|
|
30
|
+
/* Not "inset: 0": Safari 13.1 lacks it (14.1+), and the cover would collapse. */
|
|
31
|
+
top: 0;
|
|
32
|
+
right: 0;
|
|
33
|
+
bottom: 0;
|
|
34
|
+
left: 0;
|
|
31
35
|
overflow-y: auto;
|
|
32
36
|
box-sizing: border-box;
|
|
33
37
|
color-scheme: light;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-style.js","sourceRoot":"","sources":["../../src/vite/default-style.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,iHAAiH;AACjH,kHAAkH;AAClH,kGAAkG;AAClG,EAAE;AACF,+GAA+G;AAC/G,8GAA8G;AAC9G,oHAAoH;AACpH,kHAAkH;AAClH,+GAA+G;AAC/G,gHAAgH;AAChH,mHAAmH;AACnH,EAAE;AACF,kHAAkH;AAClH,4GAA4G;AAC5G,MAAM,CAAC,MAAM,2BAA2B,GAAG
|
|
1
|
+
{"version":3,"file":"default-style.js","sourceRoot":"","sources":["../../src/vite/default-style.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,iHAAiH;AACjH,kHAAkH;AAClH,kGAAkG;AAClG,EAAE;AACF,+GAA+G;AAC/G,8GAA8G;AAC9G,oHAAoH;AACpH,kHAAkH;AAClH,+GAA+G;AAC/G,gHAAgH;AAChH,mHAAmH;AACnH,EAAE;AACF,kHAAkH;AAClH,4GAA4G;AAC5G,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgG1C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pwa-platform/entry-resilience",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Validated fallback entries for installed PWA applications.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"dist"
|
|
25
25
|
],
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@pwa-platform/vite": "0.
|
|
27
|
+
"@pwa-platform/vite": "0.4.1"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
30
30
|
"vite": "^5.0.0 || ^8.0.0"
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
"@playwright/test": "1.63.0",
|
|
34
34
|
"@types/node": "24.13.4",
|
|
35
35
|
"vite": "8.3.0",
|
|
36
|
-
"@pwa-platform/
|
|
37
|
-
"@pwa-platform/
|
|
36
|
+
"@pwa-platform/contracts": "0.4.1",
|
|
37
|
+
"@pwa-platform/browser-test-harness": "0.0.0"
|
|
38
38
|
},
|
|
39
39
|
"engines": {
|
|
40
40
|
"node": ">=22.0.0"
|