@ovineko/spa-guard 0.0.1-alpha-31 → 0.0.2-alpha-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/README.md CHANGED
@@ -22,6 +22,36 @@ const cleanup = recommendedSetup();
22
22
  // optionally call cleanup() to stop background checks
23
23
  ```
24
24
 
25
+ `recommendedSetup` is idempotent. Repeated calls return the same cleanup function and do not re-run setup side effects.
26
+
27
+ By default, `recommendedSetup` uses `healthyBoot: "auto"`:
28
+
29
+ - if retry params exist in the URL, it waits a dynamic grace period and calls `markRetryHealthyBoot()` only when the orchestrator phase is still `idle`.
30
+ - if no retry params exist, it does nothing.
31
+
32
+ Auto grace period formula:
33
+
34
+ - `max(5000, max(reloadDelays)+1000, sum(lazyRetry.retryDelays)+1000)`
35
+
36
+ If you want strict control, switch to manual healthy-boot mode and call `markRetryHealthyBoot()` yourself.
37
+
38
+ ```ts
39
+ import { markRetryHealthyBoot } from "@ovineko/spa-guard";
40
+ import { recommendedSetup } from "@ovineko/spa-guard/runtime";
41
+
42
+ recommendedSetup();
43
+
44
+ await Promise.all([import("./routes/Home"), import("./routes/Checkout")]);
45
+
46
+ markRetryHealthyBoot();
47
+ ```
48
+
49
+ Disable auto healthy boot:
50
+
51
+ ```ts
52
+ recommendedSetup({ healthyBoot: "manual" });
53
+ ```
54
+
25
55
  Disable version checking:
26
56
 
27
57
  ```ts
@@ -72,7 +102,23 @@ If enough time has passed since the last reload (configurable via `minTimeBetwee
72
102
 
73
103
  ### Healthy boot
74
104
 
75
- After a successful app boot following a retry reload, call `markRetryHealthyBoot()`. This clears retry URL params, cancels any pending timer, and resets orchestrator state.
105
+ After a successful app boot following a retry reload, `markRetryHealthyBoot()` clears retry URL params, cancels any pending timer, and resets orchestrator state.
106
+
107
+ Default behavior in `recommendedSetup`: auto healthy-boot after a grace period (`healthyBoot: "auto"`).
108
+ Manual override: set `healthyBoot: "manual"` and call `markRetryHealthyBoot()` yourself once critical boot is confirmed.
109
+
110
+ ### Avoid false retry loops from app errors
111
+
112
+ By default, regular `unhandledrejection` events also trigger `triggerRetry()` (`handleUnhandledRejections.retry: true`). If your app has non-chunk unhandled rejections, this can look like retry looping even though chunks are healthy. In that case, disable reload-on-unhandled-rejection:
113
+
114
+ ```ts
115
+ window.__SPA_GUARD_OPTIONS__ = {
116
+ handleUnhandledRejections: {
117
+ retry: false,
118
+ sendBeacon: true,
119
+ },
120
+ };
121
+ ```
76
122
 
77
123
  ### Static asset burst coalescing
78
124
 
@@ -108,8 +154,9 @@ Only `retryOrchestrator.ts` may schedule reloads, advance retry state, or transi
108
154
 
109
155
  ### `@ovineko/spa-guard/runtime`
110
156
 
111
- - `recommendedSetup(options?)` — enable recommended runtime features; returns cleanup function
112
- - `RecommendedSetupOptions` — `{ versionCheck?: boolean }`
157
+ - `recommendedSetup(options?)` — enable recommended runtime features; idempotent and returns cleanup function
158
+ - `RecommendedSetupOptions` — `{ versionCheck?: boolean; healthyBoot?: "auto" | "manual" | "off" | false | { mode?: "auto"; graceMs?: number } }`
159
+ - `healthyBoot.graceMs` acts as a lower bound override for auto mode (`max(computedGraceMs, graceMs)`)
113
160
  - `startVersionCheck` / `stopVersionCheck` — manual version check control
114
161
  - `getState` / `subscribeToState` — runtime state access
115
162
  - `SpaGuardState` — state type
package/dist/_internal.js CHANGED
@@ -1,15 +1,15 @@
1
- import {
2
- SPINNER_ID,
3
- defaultSpinnerSvg,
4
- extractVersionFromHtml,
5
- sanitizeCssValue
6
- } from "./chunk-QDYSBRW2.js";
7
1
  import {
8
2
  createLogger,
9
3
  isChunkError,
10
4
  listenInternal,
11
5
  serializeError
12
- } from "./chunk-YTH35AWC.js";
6
+ } from "./chunk-4K3AQHLC.js";
7
+ import {
8
+ SPINNER_ID,
9
+ defaultSpinnerSvg,
10
+ extractVersionFromHtml,
11
+ sanitizeCssValue
12
+ } from "./chunk-T42DLOQP.js";
13
13
  import {
14
14
  dispatchAsyncRuntimeError,
15
15
  dispatchChunkLoadError,
@@ -18,7 +18,7 @@ import {
18
18
  dispatchNetworkTimeout,
19
19
  dispatchSyncRuntimeError,
20
20
  dispatchUnhandledRejection
21
- } from "./chunk-ALPGMLNW.js";
21
+ } from "./chunk-ORYUDYHU.js";
22
22
  import {
23
23
  applyI18n,
24
24
  debugSyncErrorEventType,
@@ -40,7 +40,7 @@ import {
40
40
  shouldIgnoreMessages,
41
41
  subscribe,
42
42
  triggerRetry
43
- } from "./chunk-X6IW7S2K.js";
43
+ } from "./chunk-LIKSIU75.js";
44
44
  import "./chunk-MLKGABMK.js";
45
45
 
46
46
  // src/common/handleErrorWithSpaGuard.ts
@@ -11,7 +11,7 @@ import {
11
11
  shouldIgnoreMessages,
12
12
  staticAssetRecoveryKey,
13
13
  triggerRetry
14
- } from "./chunk-X6IW7S2K.js";
14
+ } from "./chunk-LIKSIU75.js";
15
15
 
16
16
  // src/common/isChunkError.ts
17
17
  var isChunkError = (error) => {
@@ -73,7 +73,7 @@ var serializeErrorInternal = (error) => {
73
73
  return {
74
74
  message: error.message,
75
75
  name: error.name,
76
- stack: error.stack,
76
+ stack: error.stack ? truncate(error.stack) : void 0,
77
77
  type: "Error",
78
78
  ...extractErrorProperties(error)
79
79
  };
@@ -264,12 +264,22 @@ var extractBoundedObject = (obj, visited, depth) => {
264
264
  };
265
265
  var extractErrorProperties = (error) => {
266
266
  const props = {};
267
+ let keyCount = 0;
267
268
  for (const key of Object.getOwnPropertyNames(error)) {
269
+ if (keyCount >= MAX_KEYS) {
270
+ break;
271
+ }
268
272
  if (!["message", "name", "stack"].includes(key)) {
269
273
  try {
270
- props[key] = error[key];
274
+ const value = error[key];
275
+ if (value === null || value === void 0 || typeof value !== "object") {
276
+ props[key] = typeof value === "string" ? truncate(value) : value;
277
+ } else {
278
+ props[key] = "[object]";
279
+ }
271
280
  } catch {
272
281
  }
282
+ keyCount++;
273
283
  }
274
284
  }
275
285
  return props;
@@ -291,12 +301,21 @@ var extractEventTarget = (target) => {
291
301
  };
292
302
  var extractOwnProperties = (obj) => {
293
303
  const props = {};
304
+ let keyCount = 0;
294
305
  for (const key of Object.keys(obj)) {
306
+ if (keyCount >= MAX_KEYS) {
307
+ break;
308
+ }
295
309
  try {
296
310
  const value = obj[key];
297
- props[key] = typeof value === "object" ? String(value) : value;
311
+ if (value === null || value === void 0 || typeof value !== "object") {
312
+ props[key] = typeof value === "string" ? truncate(value) : value;
313
+ } else {
314
+ props[key] = "[object]";
315
+ }
298
316
  } catch {
299
317
  }
318
+ keyCount++;
300
319
  }
301
320
  return props;
302
321
  };
@@ -3,7 +3,7 @@ import {
3
3
  getRetryAttemptFromUrl,
4
4
  getRetryStateFromUrl,
5
5
  subscribe
6
- } from "./chunk-X6IW7S2K.js";
6
+ } from "./chunk-LIKSIU75.js";
7
7
 
8
8
  // src/runtime/state.ts
9
9
  var getInitialStateFromUrl = () => {
@@ -348,8 +348,9 @@ var showLoadingUI = (attempt) => {
348
348
  targetElement.innerHTML = container.innerHTML;
349
349
  const retrySection = targetElement.querySelector('[data-spa-guard-section="retrying"]');
350
350
  if (retrySection) {
351
- retrySection.style.display = "";
352
- retrySection.style.visibility = "visible";
351
+ const retrySectionEl = retrySection;
352
+ retrySectionEl.style.display = "";
353
+ retrySectionEl.style.visibility = "visible";
353
354
  }
354
355
  const attemptElements = targetElement.querySelectorAll('[data-spa-guard-content="attempt"]');
355
356
  for (const el of attemptElements) {
@@ -771,7 +772,7 @@ var triggerRetry = (input = {}) => {
771
772
  globalThis.window.location.href = reloadUrl;
772
773
  } catch (navError) {
773
774
  getLogger()?.error("triggerRetry navigation failed", navError);
774
- setState({ phase: "idle" });
775
+ setState({ phase: "idle", timer: null });
775
776
  }
776
777
  }, delay);
777
778
  setState({ timer });
@@ -4,7 +4,7 @@ import {
4
4
  emitEvent,
5
5
  getOptions,
6
6
  setFallbackStateForDebug
7
- } from "./chunk-X6IW7S2K.js";
7
+ } from "./chunk-LIKSIU75.js";
8
8
 
9
9
  // src/runtime/debug/errorDispatchers.ts
10
10
  function dispatchAsyncRuntimeError() {
@@ -2,7 +2,7 @@ import {
2
2
  defaultSpinnerHtml,
3
3
  getOptions,
4
4
  spinnerStateWindowKey
5
- } from "./chunk-X6IW7S2K.js";
5
+ } from "./chunk-LIKSIU75.js";
6
6
 
7
7
  // src/common/parseVersion.ts
8
8
  function extractVersionFromHtml(html) {
@@ -2,7 +2,7 @@ import {
2
2
  createLogger,
3
3
  listenInternal,
4
4
  serializeError
5
- } from "../chunk-YTH35AWC.js";
5
+ } from "../chunk-4K3AQHLC.js";
6
6
  import {
7
7
  ForceRetryError,
8
8
  disableDefaultRetry,
@@ -16,7 +16,7 @@ import {
16
16
  resetFallbackMode,
17
17
  subscribe,
18
18
  triggerRetry
19
- } from "../chunk-X6IW7S2K.js";
19
+ } from "../chunk-LIKSIU75.js";
20
20
  import {
21
21
  __export
22
22
  } from "../chunk-MLKGABMK.js";
@@ -5,7 +5,7 @@ var translations = {
5
5
  ar: {
6
6
  heading: "\u062D\u062F\u062B \u062E\u0637\u0623 \u0645\u0627",
7
7
  loading: "...\u062C\u0627\u0631\u064D \u0627\u0644\u062A\u062D\u0645\u064A\u0644",
8
- message: "\u064A\u0631\u062C\u0649 \u062A\u062D\u062F\u064A\u062B \u0627\u0644\u0635\u0641\u062D\u0629 \u0644\u0644\u0645\u062A\u0627\u0628\u0639\u0629.",
8
+ message: "\u064A\u0631\u062C\u0649 \u062A\u062D\u062F\u064A\u062B \u0627\u0644\u0635\u0641\u062D\u0629 \u0644\u0644\u0645\u062A\u0627\u0628\u0639\u0629",
9
9
  reload: "\u0625\u0639\u0627\u062F\u0629 \u062A\u062D\u0645\u064A\u0644",
10
10
  retrying: "\u0645\u062D\u0627\u0648\u0644\u0629 \u0625\u0639\u0627\u062F\u0629",
11
11
  rtl: true,
@@ -14,7 +14,7 @@ var translations = {
14
14
  az: {
15
15
  heading: "N\u0259s\u0259 s\u0259hv getdi",
16
16
  loading: "Y\xFCkl\u0259nir...",
17
- message: "Davam etm\u0259k \xFC\xE7\xFCn s\u0259hif\u0259ni yenil\u0259yin.",
17
+ message: "Davam etm\u0259k \xFC\xE7\xFCn s\u0259hif\u0259ni yenil\u0259yin",
18
18
  reload: "S\u0259hif\u0259ni yenid\u0259n y\xFCkl\u0259",
19
19
  retrying: "Yenid\u0259n c\u0259hd",
20
20
  tryAgain: "Yenid\u0259n c\u0259r\u0259b edin"
@@ -22,7 +22,7 @@ var translations = {
22
22
  ca: {
23
23
  heading: "Alguna cosa ha anat malament",
24
24
  loading: "Carregant...",
25
- message: "Si us plau, actualitzeu la p\xE0gina per continuar.",
25
+ message: "Si us plau, actualitzeu la p\xE0gina per continuar",
26
26
  reload: "Recarrega la p\xE0gina",
27
27
  retrying: "Intent de reintent",
28
28
  tryAgain: "Torna-ho a provar"
@@ -30,7 +30,7 @@ var translations = {
30
30
  cs: {
31
31
  heading: "N\u011Bco se pokazilo",
32
32
  loading: "Na\u010D\xEDt\xE1n\xED...",
33
- message: "Obnovte str\xE1nku pros\xEDm pro pokra\u010Dov\xE1n\xED.",
33
+ message: "Obnovte str\xE1nku pros\xEDm pro pokra\u010Dov\xE1n\xED",
34
34
  reload: "Znovu na\u010D\xEDst str\xE1nku",
35
35
  retrying: "Pokus o opakov\xE1n\xED",
36
36
  tryAgain: "Zkusit znovu"
@@ -38,7 +38,7 @@ var translations = {
38
38
  da: {
39
39
  heading: "Noget gik galt",
40
40
  loading: "Indl\xE6ser...",
41
- message: "Opdater venligst siden for at forts\xE6tte.",
41
+ message: "Opdater venligst siden for at forts\xE6tte",
42
42
  reload: "Genindl\xE6s side",
43
43
  retrying: "Fors\xF8g igen",
44
44
  tryAgain: "Pr\xF8v igen"
@@ -46,7 +46,7 @@ var translations = {
46
46
  de: {
47
47
  heading: "Etwas ist schief gelaufen",
48
48
  loading: "L\xE4dt...",
49
- message: "Bitte aktualisieren Sie die Seite, um fortzufahren.",
49
+ message: "Bitte aktualisieren Sie die Seite, um fortzufahren",
50
50
  reload: "Seite neu laden",
51
51
  retrying: "Wiederholungsversuch",
52
52
  tryAgain: "Erneut versuchen"
@@ -54,7 +54,7 @@ var translations = {
54
54
  el: {
55
55
  heading: "\u039A\u03AC\u03C4\u03B9 \u03C0\u03AE\u03B3\u03B5 \u03C3\u03C4\u03C1\u03B1\u03B2\u03AC",
56
56
  loading: "\u03A6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7...",
57
- message: "\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B1\u03BD\u03B1\u03BD\u03B5\u03CE\u03C3\u03C4\u03B5 \u03C4\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03C3\u03C5\u03BD\u03B5\u03C7\u03AF\u03C3\u03B5\u03C4\u03B5.",
57
+ message: "\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B1\u03BD\u03B1\u03BD\u03B5\u03CE\u03C3\u03C4\u03B5 \u03C4\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03C3\u03C5\u03BD\u03B5\u03C7\u03AF\u03C3\u03B5\u03C4\u03B5",
58
58
  reload: "\u0395\u03C0\u03B1\u03BD\u03B1\u03C6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2",
59
59
  retrying: "\u03A0\u03C1\u03BF\u03C3\u03C0\u03AC\u03B8\u03B5\u03B9\u03B1 \u03B5\u03C0\u03B1\u03BD\u03AC\u03BB\u03B7\u03C8\u03B7\u03C2",
60
60
  tryAgain: "\u0394\u03BF\u03BA\u03B9\u03BC\u03AC\u03C3\u03C4\u03B5 \u03BE\u03B1\u03BD\u03AC"
@@ -62,7 +62,7 @@ var translations = {
62
62
  en: {
63
63
  heading: "Something went wrong",
64
64
  loading: "Loading...",
65
- message: "Please refresh the page to continue.",
65
+ message: "Please refresh the page to continue",
66
66
  reload: "Reload page",
67
67
  retrying: "Retry attempt",
68
68
  tryAgain: "Try again"
@@ -70,7 +70,7 @@ var translations = {
70
70
  es: {
71
71
  heading: "Algo sali\xF3 mal",
72
72
  loading: "Cargando...",
73
- message: "Por favor, actualice la p\xE1gina para continuar.",
73
+ message: "Por favor, actualice la p\xE1gina para continuar",
74
74
  reload: "Recargar p\xE1gina",
75
75
  retrying: "Intento de reintento",
76
76
  tryAgain: "Intentar de nuevo"
@@ -78,7 +78,7 @@ var translations = {
78
78
  eu: {
79
79
  heading: "Zerbait gaizki joan da",
80
80
  loading: "Kargatzen...",
81
- message: "Mesedez, freskatu orria jarraitzeko.",
81
+ message: "Mesedez, freskatu orria jarraitzeko",
82
82
  reload: "Orria berritu",
83
83
  retrying: "Saiakera berri",
84
84
  tryAgain: "Saiatu berriro"
@@ -86,7 +86,7 @@ var translations = {
86
86
  fa: {
87
87
  heading: "\u0645\u0634\u06A9\u0644\u06CC \u067E\u06CC\u0634 \u0622\u0645\u062F",
88
88
  loading: "\u062F\u0631 \u062D\u0627\u0644 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC...",
89
- message: "\u0644\u0637\u0641\u0627\u064B \u0635\u0641\u062D\u0647 \u0631\u0627 \u0628\u0631\u0627\u06CC \u0627\u062F\u0627\u0645\u0647 \u062A\u0627\u0632\u0647 \u06A9\u0646\u06CC\u062F.",
89
+ message: "\u0644\u0637\u0641\u0627\u064B \u0635\u0641\u062D\u0647 \u0631\u0627 \u0628\u0631\u0627\u06CC \u0627\u062F\u0627\u0645\u0647 \u062A\u0627\u0632\u0647 \u06A9\u0646\u06CC\u062F",
90
90
  reload: "\u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC \u0645\u062C\u062F\u062F",
91
91
  retrying: "\u062A\u0644\u0627\u0634 \u062F\u0648\u0628\u0627\u0631\u0647",
92
92
  rtl: true,
@@ -95,7 +95,7 @@ var translations = {
95
95
  fi: {
96
96
  heading: "Jokin meni pieleen",
97
97
  loading: "Ladataan...",
98
- message: "P\xE4ivit\xE4 sivu jatkaaksesi.",
98
+ message: "P\xE4ivit\xE4 sivu jatkaaksesi",
99
99
  reload: "Lataa sivu uudelleen",
100
100
  retrying: "Uudelleenyritys",
101
101
  tryAgain: "Yrit\xE4 uudelleen"
@@ -103,7 +103,7 @@ var translations = {
103
103
  fr: {
104
104
  heading: "Quelque chose s'est mal pass\xE9",
105
105
  loading: "Chargement...",
106
- message: "Veuillez actualiser la page pour continuer.",
106
+ message: "Veuillez actualiser la page pour continuer",
107
107
  reload: "Recharger la page",
108
108
  retrying: "Tentative de nouvel essai",
109
109
  tryAgain: "R\xE9essayer"
@@ -111,7 +111,7 @@ var translations = {
111
111
  he: {
112
112
  heading: "\u05DE\u05E9\u05D4\u05D5 \u05D4\u05E9\u05EA\u05D1\u05E9",
113
113
  loading: "...\u05D8\u05D5\u05E2\u05DF",
114
- message: "\u05D0\u05E0\u05D0 \u05E8\u05E2\u05E0\u05DF \u05D0\u05EA \u05D4\u05D3\u05E3 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05DE\u05E9\u05D9\u05DA.",
114
+ message: "\u05D0\u05E0\u05D0 \u05E8\u05E2\u05E0\u05DF \u05D0\u05EA \u05D4\u05D3\u05E3 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05DE\u05E9\u05D9\u05DA",
115
115
  reload: "\u05D8\u05E2\u05DF \u05DE\u05D7\u05D3\u05E9",
116
116
  retrying: "\u05E0\u05D9\u05E1\u05D9\u05D5\u05DF \u05D7\u05D5\u05D6\u05E8",
117
117
  rtl: true,
@@ -120,7 +120,7 @@ var translations = {
120
120
  hr: {
121
121
  heading: "Ne\u0161to je po\u0161lo po zlu",
122
122
  loading: "U\u010Ditavanje...",
123
- message: "Molimo osvje\u017Eite stranicu da biste nastavili.",
123
+ message: "Molimo osvje\u017Eite stranicu da biste nastavili",
124
124
  reload: "Ponovno u\u010Ditaj stranicu",
125
125
  retrying: "Poku\u0161aj ponovnog poku\u0161aja",
126
126
  tryAgain: "Poku\u0161aj ponovo"
@@ -128,7 +128,7 @@ var translations = {
128
128
  hu: {
129
129
  heading: "Valami hiba t\xF6rt\xE9nt",
130
130
  loading: "Bet\xF6lt\xE9s...",
131
- message: "K\xE9rj\xFCk, friss\xEDtse az oldalt a folytat\xE1shoz.",
131
+ message: "K\xE9rj\xFCk, friss\xEDtse az oldalt a folytat\xE1shoz",
132
132
  reload: "Oldal \xFAjrat\xF6lt\xE9se",
133
133
  retrying: "\xDAjrapr\xF3b\xE1lkoz\xE1si k\xEDs\xE9rlet",
134
134
  tryAgain: "Pr\xF3b\xE1lja \xFAjra"
@@ -136,7 +136,7 @@ var translations = {
136
136
  id: {
137
137
  heading: "Terjadi kesalahan",
138
138
  loading: "Memuat...",
139
- message: "Silakan segarkan halaman untuk melanjutkan.",
139
+ message: "Silakan segarkan halaman untuk melanjutkan",
140
140
  reload: "Muat ulang halaman",
141
141
  retrying: "Percobaan ulang",
142
142
  tryAgain: "Coba lagi"
@@ -144,7 +144,7 @@ var translations = {
144
144
  it: {
145
145
  heading: "Qualcosa \xE8 andato storto",
146
146
  loading: "Caricamento...",
147
- message: "Aggiorna la pagina per continuare.",
147
+ message: "Aggiorna la pagina per continuare",
148
148
  reload: "Ricarica pagina",
149
149
  retrying: "Tentativo di ripetizione",
150
150
  tryAgain: "Riprova"
@@ -152,7 +152,7 @@ var translations = {
152
152
  ja: {
153
153
  heading: "\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F",
154
154
  loading: "\u8AAD\u307F\u8FBC\u307F\u4E2D...",
155
- message: "\u30DA\u30FC\u30B8\u3092\u66F4\u65B0\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
155
+ message: "\u30DA\u30FC\u30B8\u3092\u66F4\u65B0\u3057\u3066\u304F\u3060\u3055\u3044",
156
156
  reload: "\u518D\u8AAD\u307F\u8FBC\u307F",
157
157
  retrying: "\u30EA\u30C8\u30E9\u30A4",
158
158
  tryAgain: "\u3082\u3046\u4E00\u5EA6\u8A66\u3059"
@@ -160,7 +160,7 @@ var translations = {
160
160
  ka: {
161
161
  heading: "\u10E0\u10D0\u10E6\u10D0\u10EA \u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D0\u10D3 \u10DB\u10DD\u10EE\u10D3\u10D0",
162
162
  loading: "\u10D8\u10E2\u10D5\u10D8\u10E0\u10D7\u10D4\u10D1\u10D0...",
163
- message: "\u10D2\u10D7\u10EE\u10DD\u10D5\u10D7 \u10D2\u10D0\u10DC\u10D0\u10D0\u10EE\u10DA\u10DD\u10D7 \u10D2\u10D5\u10D4\u10E0\u10D3\u10D8 \u10D2\u10D0\u10E1\u10D0\u10D2\u10E0\u10EB\u10D4\u10DA\u10D4\u10D1\u10DA\u10D0\u10D3.",
163
+ message: "\u10D2\u10D7\u10EE\u10DD\u10D5\u10D7 \u10D2\u10D0\u10DC\u10D0\u10D0\u10EE\u10DA\u10DD\u10D7 \u10D2\u10D5\u10D4\u10E0\u10D3\u10D8 \u10D2\u10D0\u10E1\u10D0\u10D2\u10E0\u10EB\u10D4\u10DA\u10D4\u10D1\u10DA\u10D0\u10D3",
164
164
  reload: "\u10D2\u10D5\u10D4\u10E0\u10D3\u10D8\u10E1 \u10D2\u10D0\u10D3\u10D0\u10E2\u10D5\u10D8\u10E0\u10D7\u10D5\u10D0",
165
165
  retrying: "\u10D2\u10D0\u10DB\u10D4\u10DD\u10E0\u10D4\u10D1\u10D8\u10E1 \u10DB\u10EA\u10D3\u10D4\u10DA\u10DD\u10D1\u10D0",
166
166
  tryAgain: "\u10D9\u10D8\u10D3\u10D4\u10D5 \u10E1\u10EA\u10D0\u10D3\u10D4\u10D7"
@@ -168,7 +168,7 @@ var translations = {
168
168
  kk: {
169
169
  heading: "\u0411\u0456\u0440\u0434\u0435\u04A3\u0435 \u0434\u04B1\u0440\u044B\u0441 \u0431\u043E\u043B\u043C\u0430\u0434\u044B",
170
170
  loading: "\u0416\u04AF\u043A\u0442\u0435\u043B\u0443\u0434\u0435...",
171
- message: "\u0416\u0430\u043B\u0493\u0430\u0441\u0442\u044B\u0440\u0443 \u04AF\u0448\u0456\u043D \u0431\u0435\u0442\u0442\u0456 \u0436\u0430\u04A3\u0430\u0440\u0442\u044B\u04A3\u044B\u0437.",
171
+ message: "\u0416\u0430\u043B\u0493\u0430\u0441\u0442\u044B\u0440\u0443 \u04AF\u0448\u0456\u043D \u0431\u0435\u0442\u0442\u0456 \u0436\u0430\u04A3\u0430\u0440\u0442\u044B\u04A3\u044B\u0437",
172
172
  reload: "\u0411\u0435\u0442\u0442\u0456 \u049B\u0430\u0439\u0442\u0430 \u0436\u04AF\u043A\u0442\u0435\u0443",
173
173
  retrying: "\u049A\u0430\u0439\u0442\u0430\u043B\u0430\u0443 \u04D9\u0440\u0435\u043A\u0435\u0442\u0456",
174
174
  tryAgain: "\u049A\u0430\u0439\u0442\u0430\u043B\u0430\u043F \u043A\u04E9\u0440\u0456\u04A3\u0456\u0437"
@@ -176,7 +176,7 @@ var translations = {
176
176
  ko: {
177
177
  heading: "\uBB38\uC81C\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4",
178
178
  loading: "\uB85C\uB529 \uC911...",
179
- message: "\uD398\uC774\uC9C0\uB97C \uC0C8\uB85C\uACE0\uCE68\uD574 \uC8FC\uC138\uC694.",
179
+ message: "\uD398\uC774\uC9C0\uB97C \uC0C8\uB85C\uACE0\uCE68\uD574 \uC8FC\uC138\uC694",
180
180
  reload: "\uC0C8\uB85C\uACE0\uCE68",
181
181
  retrying: "\uC7AC\uC2DC\uB3C4",
182
182
  tryAgain: "\uB2E4\uC2DC \uC2DC\uB3C4"
@@ -184,7 +184,7 @@ var translations = {
184
184
  ky: {
185
185
  heading: "\u0411\u0438\u0440 \u043D\u0435\u0440\u0441\u0435 \u0442\u0443\u0443\u0440\u0430 \u044D\u043C\u0435\u0441 \u0431\u043E\u043B\u0434\u0443",
186
186
  loading: "\u0416\u04AF\u043A\u0442\u04E9\u043B\u04AF\u04AF\u0434\u04E9...",
187
- message: "\u0423\u043B\u0430\u043D\u0442\u0443\u0443 \u04AF\u0447\u04AF\u043D \u0431\u0430\u0440\u0430\u043A\u0442\u044B \u0436\u0430\u04A3\u044B\u0440\u0442\u044B\u04A3\u044B\u0437.",
187
+ message: "\u0423\u043B\u0430\u043D\u0442\u0443\u0443 \u04AF\u0447\u04AF\u043D \u0431\u0430\u0440\u0430\u043A\u0442\u044B \u0436\u0430\u04A3\u044B\u0440\u0442\u044B\u04A3\u044B\u0437",
188
188
  reload: "\u0411\u0430\u0440\u0430\u043A\u0442\u044B \u043A\u0430\u0439\u0440\u0430 \u0436\u04AF\u043A\u0442\u04E9\u04E9",
189
189
  retrying: "\u041A\u0430\u0439\u0442\u0430\u043B\u043E\u043E \u0430\u0440\u0430\u043A\u0435\u0442\u0438",
190
190
  tryAgain: "\u041A\u0430\u0439\u0440\u0430 \u0430\u0440\u0430\u043A\u0435\u0442 \u043A\u044B\u043B\u044B\u04A3\u044B\u0437"
@@ -192,7 +192,7 @@ var translations = {
192
192
  lt: {
193
193
  heading: "Ka\u017Ekas nutiko ne taip",
194
194
  loading: "\u012Ekeliama...",
195
- message: "Pra\u0161ome atnaujinti puslap\u012F, kad t\u0119stum\u0117te.",
195
+ message: "Pra\u0161ome atnaujinti puslap\u012F, kad t\u0119stum\u0117te",
196
196
  reload: "I\u0161 naujo \u012Fkelti puslap\u012F",
197
197
  retrying: "Pakartotinis bandymas",
198
198
  tryAgain: "Bandyti dar kart\u0105"
@@ -200,7 +200,7 @@ var translations = {
200
200
  lv: {
201
201
  heading: "Kaut kas nog\u0101ja greizi",
202
202
  loading: "Iel\u0101d\u0113...",
203
- message: "L\u016Bdzu, atsvaidziniet lapu, lai turpin\u0101tu.",
203
+ message: "L\u016Bdzu, atsvaidziniet lapu, lai turpin\u0101tu",
204
204
  reload: "P\u0101rl\u0101d\u0113t lapu",
205
205
  retrying: "Atk\u0101rtots m\u0113\u0123in\u0101jums",
206
206
  tryAgain: "M\u0113\u0123iniet v\u0113lreiz"
@@ -208,7 +208,7 @@ var translations = {
208
208
  nl: {
209
209
  heading: "Er is iets misgegaan",
210
210
  loading: "Laden...",
211
- message: "Ververs de pagina om door te gaan.",
211
+ message: "Ververs de pagina om door te gaan",
212
212
  reload: "Pagina herladen",
213
213
  retrying: "Opnieuw proberen",
214
214
  tryAgain: "Probeer opnieuw"
@@ -216,7 +216,7 @@ var translations = {
216
216
  no: {
217
217
  heading: "Noe gikk galt",
218
218
  loading: "Laster...",
219
- message: "Vennligst oppdater siden for \xE5 fortsette.",
219
+ message: "Vennligst oppdater siden for \xE5 fortsette",
220
220
  reload: "Last inn siden p\xE5 nytt",
221
221
  retrying: "Nytt fors\xF8k",
222
222
  tryAgain: "Pr\xF8v igjen"
@@ -224,7 +224,7 @@ var translations = {
224
224
  pl: {
225
225
  heading: "Co\u015B posz\u0142o nie tak",
226
226
  loading: "\u0141adowanie...",
227
- message: "Od\u015Bwie\u017C stron\u0119, aby kontynuowa\u0107.",
227
+ message: "Od\u015Bwie\u017C stron\u0119, aby kontynuowa\u0107",
228
228
  reload: "Prze\u0142aduj stron\u0119",
229
229
  retrying: "Pr\xF3ba ponowienia",
230
230
  tryAgain: "Spr\xF3buj ponownie"
@@ -232,7 +232,7 @@ var translations = {
232
232
  pt: {
233
233
  heading: "Algo deu errado",
234
234
  loading: "Carregando...",
235
- message: "Por favor, atualize a p\xE1gina para continuar.",
235
+ message: "Por favor, atualize a p\xE1gina para continuar",
236
236
  reload: "Recarregar p\xE1gina",
237
237
  retrying: "Tentativa de nova tentativa",
238
238
  tryAgain: "Tentar novamente"
@@ -240,7 +240,7 @@ var translations = {
240
240
  ro: {
241
241
  heading: "Ceva nu a mers bine",
242
242
  loading: "Se \xEEncarc\u0103...",
243
- message: "V\u0103 rug\u0103m s\u0103 re\xEEmprosp\u0103ta\u021Bi pagina pentru a continua.",
243
+ message: "V\u0103 rug\u0103m s\u0103 re\xEEmprosp\u0103ta\u021Bi pagina pentru a continua",
244
244
  reload: "Re\xEEncarc\u0103 pagina",
245
245
  retrying: "\xCEncercare de re\xEEncercare",
246
246
  tryAgain: "\xCEncearc\u0103 din nou"
@@ -248,7 +248,7 @@ var translations = {
248
248
  ru: {
249
249
  heading: "\u0427\u0442\u043E-\u0442\u043E \u043F\u043E\u0448\u043B\u043E \u043D\u0435 \u0442\u0430\u043A",
250
250
  loading: "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430...",
251
- message: "\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C.",
251
+ message: "\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C",
252
252
  reload: "\u041F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443",
253
253
  retrying: "\u041F\u043E\u0432\u0442\u043E\u0440\u043D\u0430\u044F \u043F\u043E\u043F\u044B\u0442\u043A\u0430",
254
254
  tryAgain: "\u041F\u043E\u043F\u0440\u043E\u0431\u043E\u0432\u0430\u0442\u044C \u0441\u043D\u043E\u0432\u0430"
@@ -256,7 +256,7 @@ var translations = {
256
256
  sk: {
257
257
  heading: "Nie\u010Do sa pokazilo",
258
258
  loading: "Na\u010D\xEDtava sa...",
259
- message: "Obnovte str\xE1nku pros\xEDm pre pokra\u010Dovanie.",
259
+ message: "Obnovte str\xE1nku pros\xEDm pre pokra\u010Dovanie",
260
260
  reload: "Znovu na\u010D\xEDta\u0165 str\xE1nku",
261
261
  retrying: "Pokus o opakovanie",
262
262
  tryAgain: "Sk\xFAsi\u0165 znova"
@@ -264,7 +264,7 @@ var translations = {
264
264
  sl: {
265
265
  heading: "Nekaj je \u0161lo narobe",
266
266
  loading: "Nalaganje...",
267
- message: "Prosimo, osve\u017Eite stran za nadaljevanje.",
267
+ message: "Prosimo, osve\u017Eite stran za nadaljevanje",
268
268
  reload: "Ponovno nalo\u017Ei stran",
269
269
  retrying: "Poskus ponovnega poskusa",
270
270
  tryAgain: "Poskusi znova"
@@ -272,7 +272,7 @@ var translations = {
272
272
  sv: {
273
273
  heading: "N\xE5got gick fel",
274
274
  loading: "Laddar...",
275
- message: "Uppdatera sidan f\xF6r att forts\xE4tta.",
275
+ message: "Uppdatera sidan f\xF6r att forts\xE4tta",
276
276
  reload: "Ladda om sidan",
277
277
  retrying: "Nytt f\xF6rs\xF6k",
278
278
  tryAgain: "F\xF6rs\xF6k igen"
@@ -288,7 +288,7 @@ var translations = {
288
288
  tr: {
289
289
  heading: "Bir \u015Feyler ters gitti",
290
290
  loading: "Y\xFCkleniyor...",
291
- message: "Devam etmek i\xE7in l\xFCtfen sayfay\u0131 yenileyin.",
291
+ message: "Devam etmek i\xE7in l\xFCtfen sayfay\u0131 yenileyin",
292
292
  reload: "Sayfay\u0131 yeniden y\xFCkle",
293
293
  retrying: "Yeniden deneme giri\u015Fimi",
294
294
  tryAgain: "Tekrar dene"
@@ -296,7 +296,7 @@ var translations = {
296
296
  uk: {
297
297
  heading: "\u0429\u043E\u0441\u044C \u043F\u0456\u0448\u043B\u043E \u043D\u0435 \u0442\u0430\u043A",
298
298
  loading: "\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F...",
299
- message: "\u0411\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u043E\u043D\u043E\u0432\u0456\u0442\u044C \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443, \u0449\u043E\u0431 \u043F\u0440\u043E\u0434\u043E\u0432\u0436\u0438\u0442\u0438.",
299
+ message: "\u0411\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u043E\u043D\u043E\u0432\u0456\u0442\u044C \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443, \u0449\u043E\u0431 \u043F\u0440\u043E\u0434\u043E\u0432\u0436\u0438\u0442\u0438",
300
300
  reload: "\u041F\u0435\u0440\u0435\u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443",
301
301
  retrying: "\u041F\u043E\u0432\u0442\u043E\u0440\u043D\u0430 \u0441\u043F\u0440\u043E\u0431\u0430",
302
302
  tryAgain: "\u0421\u043F\u0440\u043E\u0431\u0443\u0432\u0430\u0442\u0438 \u0437\u043D\u043E\u0432\u0443"
@@ -304,7 +304,7 @@ var translations = {
304
304
  zh: {
305
305
  heading: "\u51FA\u4E86\u70B9\u95EE\u9898",
306
306
  loading: "\u52A0\u8F7D\u4E2D...",
307
- message: "\u8BF7\u5237\u65B0\u9875\u9762\u4EE5\u7EE7\u7EED\u3002",
307
+ message: "\u8BF7\u5237\u65B0\u9875\u9762\u4EE5\u7EE7\u7EED",
308
308
  reload: "\u91CD\u65B0\u52A0\u8F7D",
309
309
  retrying: "\u91CD\u8BD5\u6B21\u6570",
310
310
  tryAgain: "\u91CD\u8BD5"
@@ -8,13 +8,13 @@ import {
8
8
  dispatchStaticAsset404,
9
9
  dispatchSyncRuntimeError,
10
10
  dispatchUnhandledRejection
11
- } from "../../chunk-ALPGMLNW.js";
11
+ } from "../../chunk-ORYUDYHU.js";
12
12
  import {
13
13
  subscribeToState
14
- } from "../../chunk-SCBBWARW.js";
14
+ } from "../../chunk-IZAXNDHZ.js";
15
15
  import {
16
16
  subscribe
17
- } from "../../chunk-X6IW7S2K.js";
17
+ } from "../../chunk-LIKSIU75.js";
18
18
  import "../../chunk-MLKGABMK.js";
19
19
 
20
20
  // src/runtime/debug/index.ts
@@ -3,19 +3,21 @@ import {
3
3
  extractVersionFromHtml,
4
4
  getSpinnerHtml,
5
5
  showSpinner
6
- } from "../chunk-QDYSBRW2.js";
6
+ } from "../chunk-T42DLOQP.js";
7
7
  import {
8
8
  getState,
9
9
  subscribeToState
10
- } from "../chunk-SCBBWARW.js";
10
+ } from "../chunk-IZAXNDHZ.js";
11
11
  import {
12
12
  ForceRetryError,
13
13
  getLogger,
14
14
  getOptions,
15
+ getRetryAttemptFromUrl,
16
+ getRetrySnapshot,
15
17
  markRetryHealthyBoot,
16
18
  setTranslations,
17
19
  versionCheckStateWindowKey
18
- } from "../chunk-X6IW7S2K.js";
20
+ } from "../chunk-LIKSIU75.js";
19
21
  import "../chunk-MLKGABMK.js";
20
22
 
21
23
  // src/common/checkVersion.ts
@@ -255,18 +257,120 @@ var stopVersionCheck = () => {
255
257
  };
256
258
 
257
259
  // src/runtime/recommendedSetup.ts
260
+ var AUTO_HEALTHY_BOOT_BUFFER_MS = 1e3;
261
+ var MIN_HEALTHY_BOOT_GRACE_MS = 5e3;
262
+ var setupStateWindowKey = "__spa_guard_runtime_recommended_setup_state__";
263
+ var createFreshState = () => ({
264
+ cleanup: () => {
265
+ },
266
+ initialized: false,
267
+ timer: null,
268
+ versionCheckEnabled: false
269
+ });
270
+ var getState3 = () => {
271
+ if (globalThis.window === void 0) {
272
+ return createFreshState();
273
+ }
274
+ const w = globalThis.window;
275
+ if (!w[setupStateWindowKey]) {
276
+ w[setupStateWindowKey] = createFreshState();
277
+ }
278
+ return w[setupStateWindowKey];
279
+ };
280
+ var resolveOptions = (overrides) => {
281
+ const healthyBoot = overrides?.healthyBoot;
282
+ const versionCheck = overrides?.versionCheck ?? true;
283
+ const computedGraceMs = computeAutoHealthyBootGraceMs();
284
+ if (healthyBoot === false || healthyBoot === "off") {
285
+ return {
286
+ healthyBootGraceMs: computedGraceMs,
287
+ healthyBootMode: "off",
288
+ versionCheck
289
+ };
290
+ }
291
+ if (healthyBoot === "manual") {
292
+ return {
293
+ healthyBootGraceMs: computedGraceMs,
294
+ healthyBootMode: "manual",
295
+ versionCheck
296
+ };
297
+ }
298
+ if (healthyBoot && typeof healthyBoot === "object") {
299
+ return {
300
+ healthyBootGraceMs: Math.max(computedGraceMs, healthyBoot.graceMs ?? computedGraceMs),
301
+ healthyBootMode: "auto",
302
+ versionCheck
303
+ };
304
+ }
305
+ return {
306
+ healthyBootGraceMs: computedGraceMs,
307
+ healthyBootMode: "auto",
308
+ versionCheck
309
+ };
310
+ };
311
+ var computeAutoHealthyBootGraceMs = () => {
312
+ const options = getOptions();
313
+ const reloadDelays = options.reloadDelays ?? [1e3, 2e3, 5e3];
314
+ const lazyRetryDelays = options.lazyRetry?.retryDelays ?? [1e3, 2e3];
315
+ const maxReloadDelay = Math.max(...reloadDelays, 0);
316
+ const lazyRetryTotalDelay = lazyRetryDelays.reduce((acc, delay) => acc + delay, 0);
317
+ return Math.max(
318
+ MIN_HEALTHY_BOOT_GRACE_MS,
319
+ maxReloadDelay + AUTO_HEALTHY_BOOT_BUFFER_MS,
320
+ lazyRetryTotalDelay + AUTO_HEALTHY_BOOT_BUFFER_MS
321
+ );
322
+ };
323
+ var scheduleAutoHealthyBoot = (graceMs) => {
324
+ if (globalThis.window === void 0) {
325
+ return null;
326
+ }
327
+ if (getRetryAttemptFromUrl() === null) {
328
+ return null;
329
+ }
330
+ return setTimeout(() => {
331
+ if (getRetryAttemptFromUrl() === null) {
332
+ return;
333
+ }
334
+ const snapshot = getRetrySnapshot();
335
+ if (snapshot.phase !== "idle") {
336
+ return;
337
+ }
338
+ markRetryHealthyBoot();
339
+ }, graceMs);
340
+ };
258
341
  var recommendedSetup = (overrides) => {
342
+ const state = getState3();
343
+ if (state.initialized) {
344
+ return state.cleanup;
345
+ }
259
346
  dismissSpinner();
260
- markRetryHealthyBoot();
261
- const options = { versionCheck: true, ...overrides };
347
+ const options = resolveOptions(overrides);
262
348
  if (options.versionCheck) {
263
349
  startVersionCheck();
264
350
  }
265
- return () => {
266
- if (options.versionCheck) {
351
+ const timer = options.healthyBootMode === "auto" ? scheduleAutoHealthyBoot(options.healthyBootGraceMs) : null;
352
+ const cleanup = () => {
353
+ const currentState = getState3();
354
+ if (!currentState.initialized) {
355
+ return;
356
+ }
357
+ if (currentState.timer !== null) {
358
+ clearTimeout(currentState.timer);
359
+ }
360
+ if (currentState.versionCheckEnabled) {
267
361
  stopVersionCheck();
268
362
  }
363
+ if (globalThis.window !== void 0) {
364
+ globalThis.window[setupStateWindowKey] = createFreshState();
365
+ }
269
366
  };
367
+ Object.assign(state, {
368
+ cleanup,
369
+ initialized: true,
370
+ timer,
371
+ versionCheckEnabled: options.versionCheck
372
+ });
373
+ return cleanup;
270
374
  };
271
375
  export {
272
376
  ForceRetryError,
@@ -1,12 +1,36 @@
1
1
  export interface RecommendedSetupOptions {
2
+ /**
3
+ * Healthy boot handling strategy.
4
+ *
5
+ * - `"auto"` (default): if retry URL params are present, mark healthy boot
6
+ * after a grace period and only when orchestrator is still idle.
7
+ * - `"manual"`: never auto-mark; call `markRetryHealthyBoot()` yourself.
8
+ * - `"off"` / `false`: disable healthy boot handling.
9
+ */
10
+ healthyBoot?: RecommendedSetupHealthyBoot;
2
11
  /**
3
12
  * Whether to start version checking.
4
13
  * @default true
5
14
  */
6
15
  versionCheck?: boolean;
7
16
  }
17
+ interface HealthyBootAutoConfig {
18
+ /**
19
+ * Delay before auto-marking healthy boot when retry params are present in URL.
20
+ * @default dynamic:
21
+ * max(5000, max(reloadDelays)+1000, sum(lazyRetry.retryDelays)+1000)
22
+ */
23
+ graceMs?: number;
24
+ /**
25
+ * Explicit mode for object config.
26
+ * @default "auto"
27
+ */
28
+ mode?: "auto";
29
+ }
30
+ type RecommendedSetupHealthyBoot = "auto" | "manual" | "off" | false | HealthyBootAutoConfig;
8
31
  /**
9
32
  * Enable recommended runtime features with sensible defaults.
10
33
  * Returns a cleanup function that tears down all started features.
11
34
  */
12
35
  export declare const recommendedSetup: (overrides?: RecommendedSetupOptions) => (() => void);
36
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ovineko/spa-guard",
3
- "version": "0.0.1-alpha-31",
3
+ "version": "0.0.2-alpha-0",
4
4
  "description": "Chunk load error handling for SPAs — core runtime, error handling, schema, i18n",
5
5
  "keywords": [
6
6
  "spa",