@capgo/capacitor-updater 7.19.3 → 7.20.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/README.md +4 -1
- package/android/src/main/java/ee/forgr/capacitor_updater/CapacitorUpdaterPlugin.java +65 -2
- package/dist/docs.json +17 -1
- package/dist/esm/definitions.d.ts +11 -1
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/history.d.ts +1 -0
- package/dist/esm/history.js +283 -0
- package/dist/esm/history.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/plugin.cjs.js +282 -0
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +282 -0
- package/dist/plugin.js.map +1 -1
- package/ios/Sources/CapacitorUpdaterPlugin/CapacitorUpdaterPlugin.swift +59 -1
- package/package.json +1 -1
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Maintains navigation history across Capgo-controlled reloads when keepUrlPathAfterReload is enabled.
|
|
3
|
+
*/
|
|
4
|
+
const KEEP_FLAG_KEY = '__capgo_keep_url_path_after_reload';
|
|
5
|
+
const HISTORY_STORAGE_KEY = '__capgo_history_stack__';
|
|
6
|
+
const MAX_STACK_ENTRIES = 100;
|
|
7
|
+
const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof history !== 'undefined';
|
|
8
|
+
if (isBrowser) {
|
|
9
|
+
const win = window;
|
|
10
|
+
if (!win.__capgoHistoryPatched) {
|
|
11
|
+
win.__capgoHistoryPatched = true;
|
|
12
|
+
const isFeatureConfigured = () => {
|
|
13
|
+
try {
|
|
14
|
+
if (win.__capgoKeepUrlPathAfterReload) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
// ignore access issues
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
return window.localStorage.getItem(KEEP_FLAG_KEY) === '1';
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const readStored = () => {
|
|
29
|
+
try {
|
|
30
|
+
const raw = window.sessionStorage.getItem(HISTORY_STORAGE_KEY);
|
|
31
|
+
if (!raw) {
|
|
32
|
+
return { stack: [], index: -1 };
|
|
33
|
+
}
|
|
34
|
+
const parsed = JSON.parse(raw);
|
|
35
|
+
if (!parsed || !Array.isArray(parsed.stack) || typeof parsed.index !== 'number') {
|
|
36
|
+
return { stack: [], index: -1 };
|
|
37
|
+
}
|
|
38
|
+
return parsed;
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
return { stack: [], index: -1 };
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const writeStored = (stack, index) => {
|
|
45
|
+
try {
|
|
46
|
+
window.sessionStorage.setItem(HISTORY_STORAGE_KEY, JSON.stringify({ stack, index }));
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
// Storage might be unavailable; fail silently.
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const clearStored = () => {
|
|
53
|
+
try {
|
|
54
|
+
window.sessionStorage.removeItem(HISTORY_STORAGE_KEY);
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
// ignore
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const normalize = (url) => {
|
|
61
|
+
try {
|
|
62
|
+
const base = url !== null && url !== void 0 ? url : window.location.href;
|
|
63
|
+
const parsed = new URL(base instanceof URL ? base.toString() : base, window.location.href);
|
|
64
|
+
return `${parsed.pathname}${parsed.search}${parsed.hash}`;
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
const trimStack = (stack, index) => {
|
|
71
|
+
if (stack.length <= MAX_STACK_ENTRIES) {
|
|
72
|
+
return { stack, index };
|
|
73
|
+
}
|
|
74
|
+
const start = stack.length - MAX_STACK_ENTRIES;
|
|
75
|
+
const trimmed = stack.slice(start);
|
|
76
|
+
const adjustedIndex = Math.max(0, index - start);
|
|
77
|
+
return { stack: trimmed, index: adjustedIndex };
|
|
78
|
+
};
|
|
79
|
+
const runWhenReady = (fn) => {
|
|
80
|
+
if (document.readyState === 'complete' || document.readyState === 'interactive') {
|
|
81
|
+
fn();
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
window.addEventListener('DOMContentLoaded', fn, { once: true });
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
let featureActive = false;
|
|
88
|
+
let isRestoring = false;
|
|
89
|
+
let restoreScheduled = false;
|
|
90
|
+
const ensureCurrentTracked = () => {
|
|
91
|
+
if (!featureActive) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const stored = readStored();
|
|
95
|
+
const current = normalize();
|
|
96
|
+
if (!current) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (stored.stack.length === 0) {
|
|
100
|
+
stored.stack.push(current);
|
|
101
|
+
stored.index = 0;
|
|
102
|
+
writeStored(stored.stack, stored.index);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (stored.index < 0 || stored.index >= stored.stack.length) {
|
|
106
|
+
stored.index = stored.stack.length - 1;
|
|
107
|
+
}
|
|
108
|
+
if (stored.stack[stored.index] !== current) {
|
|
109
|
+
stored.stack[stored.index] = current;
|
|
110
|
+
writeStored(stored.stack, stored.index);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
const record = (url, replace) => {
|
|
114
|
+
if (!featureActive || isRestoring) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const normalized = normalize(url);
|
|
118
|
+
if (!normalized) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
let { stack, index } = readStored();
|
|
122
|
+
if (stack.length === 0) {
|
|
123
|
+
stack.push(normalized);
|
|
124
|
+
index = stack.length - 1;
|
|
125
|
+
}
|
|
126
|
+
else if (replace) {
|
|
127
|
+
if (index < 0 || index >= stack.length) {
|
|
128
|
+
index = stack.length - 1;
|
|
129
|
+
}
|
|
130
|
+
stack[index] = normalized;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
if (index >= stack.length - 1) {
|
|
134
|
+
stack.push(normalized);
|
|
135
|
+
index = stack.length - 1;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
stack = stack.slice(0, index + 1);
|
|
139
|
+
stack.push(normalized);
|
|
140
|
+
index = stack.length - 1;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
({ stack, index } = trimStack(stack, index));
|
|
144
|
+
writeStored(stack, index);
|
|
145
|
+
};
|
|
146
|
+
const restoreHistory = () => {
|
|
147
|
+
if (!featureActive || isRestoring) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const stored = readStored();
|
|
151
|
+
if (stored.stack.length === 0) {
|
|
152
|
+
ensureCurrentTracked();
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const targetIndex = stored.index >= 0 && stored.index < stored.stack.length ? stored.index : stored.stack.length - 1;
|
|
156
|
+
const normalizedCurrent = normalize();
|
|
157
|
+
if (stored.stack.length === 1 && normalizedCurrent === stored.stack[0]) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const firstEntry = stored.stack[0];
|
|
161
|
+
if (!firstEntry) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
isRestoring = true;
|
|
165
|
+
try {
|
|
166
|
+
history.replaceState(history.state, document.title, firstEntry);
|
|
167
|
+
for (let i = 1; i < stored.stack.length; i += 1) {
|
|
168
|
+
history.pushState(history.state, document.title, stored.stack[i]);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
isRestoring = false;
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
isRestoring = false;
|
|
176
|
+
const currentIndex = stored.stack.length - 1;
|
|
177
|
+
const offset = targetIndex - currentIndex;
|
|
178
|
+
if (offset !== 0) {
|
|
179
|
+
history.go(offset);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
history.replaceState(history.state, document.title, stored.stack[targetIndex]);
|
|
183
|
+
window.dispatchEvent(new PopStateEvent('popstate'));
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
const scheduleRestore = () => {
|
|
187
|
+
if (!featureActive || restoreScheduled) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
restoreScheduled = true;
|
|
191
|
+
runWhenReady(() => {
|
|
192
|
+
restoreScheduled = false;
|
|
193
|
+
restoreHistory();
|
|
194
|
+
});
|
|
195
|
+
};
|
|
196
|
+
let originalPushState = null;
|
|
197
|
+
let originalReplaceState = null;
|
|
198
|
+
const popstateHandler = () => {
|
|
199
|
+
if (!featureActive || isRestoring) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const normalized = normalize();
|
|
203
|
+
if (!normalized) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const stored = readStored();
|
|
207
|
+
const idx = stored.stack.lastIndexOf(normalized);
|
|
208
|
+
if (idx >= 0) {
|
|
209
|
+
stored.index = idx;
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
stored.stack.push(normalized);
|
|
213
|
+
stored.index = stored.stack.length - 1;
|
|
214
|
+
}
|
|
215
|
+
const trimmed = trimStack(stored.stack, stored.index);
|
|
216
|
+
writeStored(trimmed.stack, trimmed.index);
|
|
217
|
+
};
|
|
218
|
+
const patchHistory = () => {
|
|
219
|
+
if (originalPushState && originalReplaceState) {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
originalPushState = history.pushState;
|
|
223
|
+
originalReplaceState = history.replaceState;
|
|
224
|
+
history.pushState = function pushStatePatched(state, title, url) {
|
|
225
|
+
const result = originalPushState.call(history, state, title, url);
|
|
226
|
+
record(url, false);
|
|
227
|
+
return result;
|
|
228
|
+
};
|
|
229
|
+
history.replaceState = function replaceStatePatched(state, title, url) {
|
|
230
|
+
const result = originalReplaceState.call(history, state, title, url);
|
|
231
|
+
record(url, true);
|
|
232
|
+
return result;
|
|
233
|
+
};
|
|
234
|
+
window.addEventListener('popstate', popstateHandler);
|
|
235
|
+
};
|
|
236
|
+
const unpatchHistory = () => {
|
|
237
|
+
if (originalPushState) {
|
|
238
|
+
history.pushState = originalPushState;
|
|
239
|
+
originalPushState = null;
|
|
240
|
+
}
|
|
241
|
+
if (originalReplaceState) {
|
|
242
|
+
history.replaceState = originalReplaceState;
|
|
243
|
+
originalReplaceState = null;
|
|
244
|
+
}
|
|
245
|
+
window.removeEventListener('popstate', popstateHandler);
|
|
246
|
+
};
|
|
247
|
+
const setFeatureActive = (enabled) => {
|
|
248
|
+
if (featureActive === enabled) {
|
|
249
|
+
if (featureActive) {
|
|
250
|
+
ensureCurrentTracked();
|
|
251
|
+
scheduleRestore();
|
|
252
|
+
}
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
featureActive = enabled;
|
|
256
|
+
if (featureActive) {
|
|
257
|
+
patchHistory();
|
|
258
|
+
ensureCurrentTracked();
|
|
259
|
+
scheduleRestore();
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
unpatchHistory();
|
|
263
|
+
clearStored();
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
window.addEventListener('CapacitorUpdaterKeepUrlPathAfterReload', (event) => {
|
|
267
|
+
var _a;
|
|
268
|
+
const evt = event;
|
|
269
|
+
const enabled = (_a = evt === null || evt === void 0 ? void 0 : evt.detail) === null || _a === void 0 ? void 0 : _a.enabled;
|
|
270
|
+
if (typeof enabled === 'boolean') {
|
|
271
|
+
win.__capgoKeepUrlPathAfterReload = enabled;
|
|
272
|
+
setFeatureActive(enabled);
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
win.__capgoKeepUrlPathAfterReload = true;
|
|
276
|
+
setFeatureActive(true);
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
setFeatureActive(isFeatureConfigured());
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
export {};
|
|
283
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/history.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,aAAa,GAAG,oCAAoC,CAAC;AAC3D,MAAM,mBAAmB,GAAG,yBAAyB,CAAC;AACtD,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,OAAO,OAAO,KAAK,WAAW,CAAC;AAErH,IAAI,SAAS,EAAE,CAAC;IACd,MAAM,GAAG,GAAG,MAGX,CAAC;IAEF,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;QAC/B,GAAG,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAEjC,MAAM,mBAAmB,GAAG,GAAY,EAAE;YACxC,IAAI,CAAC;gBACH,IAAI,GAAG,CAAC,6BAA6B,EAAE,CAAC;oBACtC,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,uBAAuB;YACzB,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC;YAC5D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC,CAAC;QAIF,MAAM,UAAU,GAAG,GAAkB,EAAE;YACrC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;gBAC/D,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;gBAClC,CAAC;gBACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;gBAChD,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAChF,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;gBAClC,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;YAClC,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,CAAC,KAAe,EAAE,KAAa,EAAQ,EAAE;YAC3D,IAAI,CAAC;gBACH,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACvF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,+CAA+C;YACjD,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,GAAS,EAAE;YAC7B,IAAI,CAAC;gBACH,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;YACxD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,SAAS,GAAG,CAAC,GAAyB,EAAiB,EAAE;YAC7D,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACzC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3F,OAAO,GAAG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,SAAS,GAAG,CAAC,KAAe,EAAE,KAAa,EAAiB,EAAE;YAClE,IAAI,KAAK,CAAC,MAAM,IAAI,iBAAiB,EAAE,CAAC;gBACtC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YAC1B,CAAC;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,iBAAiB,CAAC;YAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC;YACjD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;QAClD,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,CAAC,EAAc,EAAQ,EAAE;YAC5C,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,IAAI,QAAQ,CAAC,UAAU,KAAK,aAAa,EAAE,CAAC;gBAChF,EAAE,EAAE,CAAC;YACP,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAE7B,MAAM,oBAAoB,GAAG,GAAG,EAAE;YAChC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC3B,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;gBACjB,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBACxC,OAAO;YACT,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC5D,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC;gBAC3C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;gBACrC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,GAAoC,EAAE,OAAgB,EAAE,EAAE;YACxE,IAAI,CAAC,aAAa,IAAI,WAAW,EAAE,CAAC;gBAClC,OAAO;YACT,CAAC;YACD,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACvB,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YAC3B,CAAC;iBAAM,IAAI,OAAO,EAAE,CAAC;gBACnB,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACvC,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC3B,CAAC;gBACD,KAAK,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACvB,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC3B,CAAC;qBAAM,CAAC;oBACN,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;oBAClC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACvB,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;YACD,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YAC7C,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC;QAEF,MAAM,cAAc,GAAG,GAAG,EAAE;YAC1B,IAAI,CAAC,aAAa,IAAI,WAAW,EAAE,CAAC;gBAClC,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,oBAAoB,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YACD,MAAM,WAAW,GACf,MAAM,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACnG,MAAM,iBAAiB,GAAG,SAAS,EAAE,CAAC;YACtC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,iBAAiB,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,OAAO;YACT,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,WAAW,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC;gBACH,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAChD,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,WAAW,GAAG,KAAK,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,WAAW,GAAG,KAAK,CAAC;YACpB,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,WAAW,GAAG,YAAY,CAAC;YAC1C,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjB,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC/E,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,eAAe,GAAG,GAAG,EAAE;YAC3B,IAAI,CAAC,aAAa,IAAI,gBAAgB,EAAE,CAAC;gBACvC,OAAO;YACT,CAAC;YACD,gBAAgB,GAAG,IAAI,CAAC;YACxB,YAAY,CAAC,GAAG,EAAE;gBAChB,gBAAgB,GAAG,KAAK,CAAC;gBACzB,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,IAAI,iBAAiB,GAAoC,IAAI,CAAC;QAC9D,IAAI,oBAAoB,GAAuC,IAAI,CAAC;QAEpE,MAAM,eAAe,GAAG,GAAG,EAAE;YAC3B,IAAI,CAAC,aAAa,IAAI,WAAW,EAAE,CAAC;gBAClC,OAAO;YACT,CAAC;YACD,MAAM,UAAU,GAAG,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;YACjD,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC9B,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACtD,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,IAAI,iBAAiB,IAAI,oBAAoB,EAAE,CAAC;gBAC9C,OAAO;YACT,CAAC;YACD,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC;YACtC,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC;YAE5C,OAAO,CAAC,SAAS,GAAG,SAAS,gBAAgB,CAAC,KAAU,EAAE,KAAa,EAAE,GAAyB;gBAChG,MAAM,MAAM,GAAG,iBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAU,CAAC,CAAC;gBAC1E,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACnB,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC;YAEF,OAAO,CAAC,YAAY,GAAG,SAAS,mBAAmB,CAAC,KAAU,EAAE,KAAa,EAAE,GAAyB;gBACtG,MAAM,MAAM,GAAG,oBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAU,CAAC,CAAC;gBAC7E,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAClB,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC;YAEF,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QACvD,CAAC,CAAC;QAEF,MAAM,cAAc,GAAG,GAAG,EAAE;YAC1B,IAAI,iBAAiB,EAAE,CAAC;gBACtB,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC;gBACtC,iBAAiB,GAAG,IAAI,CAAC;YAC3B,CAAC;YACD,IAAI,oBAAoB,EAAE,CAAC;gBACzB,OAAO,CAAC,YAAY,GAAG,oBAAoB,CAAC;gBAC5C,oBAAoB,GAAG,IAAI,CAAC;YAC9B,CAAC;YACD,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAC1D,CAAC,CAAC;QAEF,MAAM,gBAAgB,GAAG,CAAC,OAAgB,EAAE,EAAE;YAC5C,IAAI,aAAa,KAAK,OAAO,EAAE,CAAC;gBAC9B,IAAI,aAAa,EAAE,CAAC;oBAClB,oBAAoB,EAAE,CAAC;oBACvB,eAAe,EAAE,CAAC;gBACpB,CAAC;gBACD,OAAO;YACT,CAAC;YACD,aAAa,GAAG,OAAO,CAAC;YACxB,IAAI,aAAa,EAAE,CAAC;gBAClB,YAAY,EAAE,CAAC;gBACf,oBAAoB,EAAE,CAAC;gBACvB,eAAe,EAAE,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,cAAc,EAAE,CAAC;gBACjB,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,wCAAwC,EAAE,CAAC,KAAK,EAAE,EAAE;;YAC1E,MAAM,GAAG,GAAG,KAA2C,CAAC;YACxD,MAAM,OAAO,GAAG,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,MAAM,0CAAE,OAAO,CAAC;YACrC,IAAI,OAAO,OAAO,KAAK,SAAS,EAAE,CAAC;gBACjC,GAAG,CAAC,6BAA6B,GAAG,OAAO,CAAC;gBAC5C,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,6BAA6B,GAAG,IAAI,CAAC;gBACzC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,gBAAgB,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC","sourcesContent":["/*\n * Maintains navigation history across Capgo-controlled reloads when keepUrlPathAfterReload is enabled.\n */\n\nconst KEEP_FLAG_KEY = '__capgo_keep_url_path_after_reload';\nconst HISTORY_STORAGE_KEY = '__capgo_history_stack__';\nconst MAX_STACK_ENTRIES = 100;\n\nconst isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof history !== 'undefined';\n\nif (isBrowser) {\n const win = window as typeof window & {\n __capgoHistoryPatched?: boolean;\n __capgoKeepUrlPathAfterReload?: boolean;\n };\n\n if (!win.__capgoHistoryPatched) {\n win.__capgoHistoryPatched = true;\n\n const isFeatureConfigured = (): boolean => {\n try {\n if (win.__capgoKeepUrlPathAfterReload) {\n return true;\n }\n } catch (err) {\n // ignore access issues\n }\n try {\n return window.localStorage.getItem(KEEP_FLAG_KEY) === '1';\n } catch (err) {\n return false;\n }\n };\n\n type StoredHistory = { stack: string[]; index: number };\n\n const readStored = (): StoredHistory => {\n try {\n const raw = window.sessionStorage.getItem(HISTORY_STORAGE_KEY);\n if (!raw) {\n return { stack: [], index: -1 };\n }\n const parsed = JSON.parse(raw) as StoredHistory;\n if (!parsed || !Array.isArray(parsed.stack) || typeof parsed.index !== 'number') {\n return { stack: [], index: -1 };\n }\n return parsed;\n } catch (err) {\n return { stack: [], index: -1 };\n }\n };\n\n const writeStored = (stack: string[], index: number): void => {\n try {\n window.sessionStorage.setItem(HISTORY_STORAGE_KEY, JSON.stringify({ stack, index }));\n } catch (err) {\n // Storage might be unavailable; fail silently.\n }\n };\n\n const clearStored = (): void => {\n try {\n window.sessionStorage.removeItem(HISTORY_STORAGE_KEY);\n } catch (err) {\n // ignore\n }\n };\n\n const normalize = (url?: string | URL | null): string | null => {\n try {\n const base = url ?? window.location.href;\n const parsed = new URL(base instanceof URL ? base.toString() : base, window.location.href);\n return `${parsed.pathname}${parsed.search}${parsed.hash}`;\n } catch (err) {\n return null;\n }\n };\n\n const trimStack = (stack: string[], index: number): StoredHistory => {\n if (stack.length <= MAX_STACK_ENTRIES) {\n return { stack, index };\n }\n const start = stack.length - MAX_STACK_ENTRIES;\n const trimmed = stack.slice(start);\n const adjustedIndex = Math.max(0, index - start);\n return { stack: trimmed, index: adjustedIndex };\n };\n\n const runWhenReady = (fn: () => void): void => {\n if (document.readyState === 'complete' || document.readyState === 'interactive') {\n fn();\n } else {\n window.addEventListener('DOMContentLoaded', fn, { once: true });\n }\n };\n\n let featureActive = false;\n let isRestoring = false;\n let restoreScheduled = false;\n\n const ensureCurrentTracked = () => {\n if (!featureActive) {\n return;\n }\n const stored = readStored();\n const current = normalize();\n if (!current) {\n return;\n }\n if (stored.stack.length === 0) {\n stored.stack.push(current);\n stored.index = 0;\n writeStored(stored.stack, stored.index);\n return;\n }\n if (stored.index < 0 || stored.index >= stored.stack.length) {\n stored.index = stored.stack.length - 1;\n }\n if (stored.stack[stored.index] !== current) {\n stored.stack[stored.index] = current;\n writeStored(stored.stack, stored.index);\n }\n };\n\n const record = (url: string | URL | null | undefined, replace: boolean) => {\n if (!featureActive || isRestoring) {\n return;\n }\n const normalized = normalize(url);\n if (!normalized) {\n return;\n }\n let { stack, index } = readStored();\n if (stack.length === 0) {\n stack.push(normalized);\n index = stack.length - 1;\n } else if (replace) {\n if (index < 0 || index >= stack.length) {\n index = stack.length - 1;\n }\n stack[index] = normalized;\n } else {\n if (index >= stack.length - 1) {\n stack.push(normalized);\n index = stack.length - 1;\n } else {\n stack = stack.slice(0, index + 1);\n stack.push(normalized);\n index = stack.length - 1;\n }\n }\n ({ stack, index } = trimStack(stack, index));\n writeStored(stack, index);\n };\n\n const restoreHistory = () => {\n if (!featureActive || isRestoring) {\n return;\n }\n const stored = readStored();\n if (stored.stack.length === 0) {\n ensureCurrentTracked();\n return;\n }\n const targetIndex =\n stored.index >= 0 && stored.index < stored.stack.length ? stored.index : stored.stack.length - 1;\n const normalizedCurrent = normalize();\n if (stored.stack.length === 1 && normalizedCurrent === stored.stack[0]) {\n return;\n }\n const firstEntry = stored.stack[0];\n if (!firstEntry) {\n return;\n }\n isRestoring = true;\n try {\n history.replaceState(history.state, document.title, firstEntry);\n for (let i = 1; i < stored.stack.length; i += 1) {\n history.pushState(history.state, document.title, stored.stack[i]);\n }\n } catch (err) {\n isRestoring = false;\n return;\n }\n isRestoring = false;\n const currentIndex = stored.stack.length - 1;\n const offset = targetIndex - currentIndex;\n if (offset !== 0) {\n history.go(offset);\n } else {\n history.replaceState(history.state, document.title, stored.stack[targetIndex]);\n window.dispatchEvent(new PopStateEvent('popstate'));\n }\n };\n\n const scheduleRestore = () => {\n if (!featureActive || restoreScheduled) {\n return;\n }\n restoreScheduled = true;\n runWhenReady(() => {\n restoreScheduled = false;\n restoreHistory();\n });\n };\n\n let originalPushState: typeof history.pushState | null = null;\n let originalReplaceState: typeof history.replaceState | null = null;\n\n const popstateHandler = () => {\n if (!featureActive || isRestoring) {\n return;\n }\n const normalized = normalize();\n if (!normalized) {\n return;\n }\n const stored = readStored();\n const idx = stored.stack.lastIndexOf(normalized);\n if (idx >= 0) {\n stored.index = idx;\n } else {\n stored.stack.push(normalized);\n stored.index = stored.stack.length - 1;\n }\n const trimmed = trimStack(stored.stack, stored.index);\n writeStored(trimmed.stack, trimmed.index);\n };\n\n const patchHistory = () => {\n if (originalPushState && originalReplaceState) {\n return;\n }\n originalPushState = history.pushState;\n originalReplaceState = history.replaceState;\n\n history.pushState = function pushStatePatched(state: any, title: string, url?: string | URL | null) {\n const result = originalPushState!.call(history, state, title, url as any);\n record(url, false);\n return result;\n };\n\n history.replaceState = function replaceStatePatched(state: any, title: string, url?: string | URL | null) {\n const result = originalReplaceState!.call(history, state, title, url as any);\n record(url, true);\n return result;\n };\n\n window.addEventListener('popstate', popstateHandler);\n };\n\n const unpatchHistory = () => {\n if (originalPushState) {\n history.pushState = originalPushState;\n originalPushState = null;\n }\n if (originalReplaceState) {\n history.replaceState = originalReplaceState;\n originalReplaceState = null;\n }\n window.removeEventListener('popstate', popstateHandler);\n };\n\n const setFeatureActive = (enabled: boolean) => {\n if (featureActive === enabled) {\n if (featureActive) {\n ensureCurrentTracked();\n scheduleRestore();\n }\n return;\n }\n featureActive = enabled;\n if (featureActive) {\n patchHistory();\n ensureCurrentTracked();\n scheduleRestore();\n } else {\n unpatchHistory();\n clearStored();\n }\n };\n\n window.addEventListener('CapacitorUpdaterKeepUrlPathAfterReload', (event) => {\n const evt = event as CustomEvent<{ enabled?: boolean }>;\n const enabled = evt?.detail?.enabled;\n if (typeof enabled === 'boolean') {\n win.__capgoKeepUrlPathAfterReload = enabled;\n setFeatureActive(enabled);\n } else {\n win.__capgoKeepUrlPathAfterReload = true;\n setFeatureActive(true);\n }\n });\n\n setFeatureActive(isFeatureConfigured());\n }\n}\n\nexport {};\n"]}
|
package/dist/esm/index.d.ts
CHANGED
package/dist/esm/index.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
6
|
import { registerPlugin } from '@capacitor/core';
|
|
7
|
+
import './history';
|
|
7
8
|
const CapacitorUpdater = registerPlugin('CapacitorUpdater', {
|
|
8
9
|
web: () => import('./web').then((m) => new m.CapacitorUpdaterWeb()),
|
|
9
10
|
});
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,WAAW,CAAC;AAInB,MAAM,gBAAgB,GAAG,cAAc,CAAyB,kBAAkB,EAAE;IAClF,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,mBAAmB,EAAE,CAAC;CACpE,CAAC,CAAC;AAEH,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,CAAC","sourcesContent":["/*\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\nimport { registerPlugin } from '@capacitor/core';\nimport './history';\n\nimport type { CapacitorUpdaterPlugin } from './definitions';\n\nconst CapacitorUpdater = registerPlugin<CapacitorUpdaterPlugin>('CapacitorUpdater', {\n web: () => import('./web').then((m) => new m.CapacitorUpdaterWeb()),\n});\n\nexport * from './definitions';\nexport { CapacitorUpdater };\n"]}
|
package/dist/plugin.cjs.js
CHANGED
|
@@ -2,6 +2,288 @@
|
|
|
2
2
|
|
|
3
3
|
var core = require('@capacitor/core');
|
|
4
4
|
|
|
5
|
+
/*
|
|
6
|
+
* Maintains navigation history across Capgo-controlled reloads when keepUrlPathAfterReload is enabled.
|
|
7
|
+
*/
|
|
8
|
+
const KEEP_FLAG_KEY = '__capgo_keep_url_path_after_reload';
|
|
9
|
+
const HISTORY_STORAGE_KEY = '__capgo_history_stack__';
|
|
10
|
+
const MAX_STACK_ENTRIES = 100;
|
|
11
|
+
const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof history !== 'undefined';
|
|
12
|
+
if (isBrowser) {
|
|
13
|
+
const win = window;
|
|
14
|
+
if (!win.__capgoHistoryPatched) {
|
|
15
|
+
win.__capgoHistoryPatched = true;
|
|
16
|
+
const isFeatureConfigured = () => {
|
|
17
|
+
try {
|
|
18
|
+
if (win.__capgoKeepUrlPathAfterReload) {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
// ignore access issues
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
return window.localStorage.getItem(KEEP_FLAG_KEY) === '1';
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const readStored = () => {
|
|
33
|
+
try {
|
|
34
|
+
const raw = window.sessionStorage.getItem(HISTORY_STORAGE_KEY);
|
|
35
|
+
if (!raw) {
|
|
36
|
+
return { stack: [], index: -1 };
|
|
37
|
+
}
|
|
38
|
+
const parsed = JSON.parse(raw);
|
|
39
|
+
if (!parsed || !Array.isArray(parsed.stack) || typeof parsed.index !== 'number') {
|
|
40
|
+
return { stack: [], index: -1 };
|
|
41
|
+
}
|
|
42
|
+
return parsed;
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
return { stack: [], index: -1 };
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const writeStored = (stack, index) => {
|
|
49
|
+
try {
|
|
50
|
+
window.sessionStorage.setItem(HISTORY_STORAGE_KEY, JSON.stringify({ stack, index }));
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
// Storage might be unavailable; fail silently.
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const clearStored = () => {
|
|
57
|
+
try {
|
|
58
|
+
window.sessionStorage.removeItem(HISTORY_STORAGE_KEY);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
// ignore
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const normalize = (url) => {
|
|
65
|
+
try {
|
|
66
|
+
const base = url !== null && url !== void 0 ? url : window.location.href;
|
|
67
|
+
const parsed = new URL(base instanceof URL ? base.toString() : base, window.location.href);
|
|
68
|
+
return `${parsed.pathname}${parsed.search}${parsed.hash}`;
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const trimStack = (stack, index) => {
|
|
75
|
+
if (stack.length <= MAX_STACK_ENTRIES) {
|
|
76
|
+
return { stack, index };
|
|
77
|
+
}
|
|
78
|
+
const start = stack.length - MAX_STACK_ENTRIES;
|
|
79
|
+
const trimmed = stack.slice(start);
|
|
80
|
+
const adjustedIndex = Math.max(0, index - start);
|
|
81
|
+
return { stack: trimmed, index: adjustedIndex };
|
|
82
|
+
};
|
|
83
|
+
const runWhenReady = (fn) => {
|
|
84
|
+
if (document.readyState === 'complete' || document.readyState === 'interactive') {
|
|
85
|
+
fn();
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
window.addEventListener('DOMContentLoaded', fn, { once: true });
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
let featureActive = false;
|
|
92
|
+
let isRestoring = false;
|
|
93
|
+
let restoreScheduled = false;
|
|
94
|
+
const ensureCurrentTracked = () => {
|
|
95
|
+
if (!featureActive) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const stored = readStored();
|
|
99
|
+
const current = normalize();
|
|
100
|
+
if (!current) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (stored.stack.length === 0) {
|
|
104
|
+
stored.stack.push(current);
|
|
105
|
+
stored.index = 0;
|
|
106
|
+
writeStored(stored.stack, stored.index);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (stored.index < 0 || stored.index >= stored.stack.length) {
|
|
110
|
+
stored.index = stored.stack.length - 1;
|
|
111
|
+
}
|
|
112
|
+
if (stored.stack[stored.index] !== current) {
|
|
113
|
+
stored.stack[stored.index] = current;
|
|
114
|
+
writeStored(stored.stack, stored.index);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
const record = (url, replace) => {
|
|
118
|
+
if (!featureActive || isRestoring) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const normalized = normalize(url);
|
|
122
|
+
if (!normalized) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
let { stack, index } = readStored();
|
|
126
|
+
if (stack.length === 0) {
|
|
127
|
+
stack.push(normalized);
|
|
128
|
+
index = stack.length - 1;
|
|
129
|
+
}
|
|
130
|
+
else if (replace) {
|
|
131
|
+
if (index < 0 || index >= stack.length) {
|
|
132
|
+
index = stack.length - 1;
|
|
133
|
+
}
|
|
134
|
+
stack[index] = normalized;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
if (index >= stack.length - 1) {
|
|
138
|
+
stack.push(normalized);
|
|
139
|
+
index = stack.length - 1;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
stack = stack.slice(0, index + 1);
|
|
143
|
+
stack.push(normalized);
|
|
144
|
+
index = stack.length - 1;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
({ stack, index } = trimStack(stack, index));
|
|
148
|
+
writeStored(stack, index);
|
|
149
|
+
};
|
|
150
|
+
const restoreHistory = () => {
|
|
151
|
+
if (!featureActive || isRestoring) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const stored = readStored();
|
|
155
|
+
if (stored.stack.length === 0) {
|
|
156
|
+
ensureCurrentTracked();
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const targetIndex = stored.index >= 0 && stored.index < stored.stack.length ? stored.index : stored.stack.length - 1;
|
|
160
|
+
const normalizedCurrent = normalize();
|
|
161
|
+
if (stored.stack.length === 1 && normalizedCurrent === stored.stack[0]) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const firstEntry = stored.stack[0];
|
|
165
|
+
if (!firstEntry) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
isRestoring = true;
|
|
169
|
+
try {
|
|
170
|
+
history.replaceState(history.state, document.title, firstEntry);
|
|
171
|
+
for (let i = 1; i < stored.stack.length; i += 1) {
|
|
172
|
+
history.pushState(history.state, document.title, stored.stack[i]);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
isRestoring = false;
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
isRestoring = false;
|
|
180
|
+
const currentIndex = stored.stack.length - 1;
|
|
181
|
+
const offset = targetIndex - currentIndex;
|
|
182
|
+
if (offset !== 0) {
|
|
183
|
+
history.go(offset);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
history.replaceState(history.state, document.title, stored.stack[targetIndex]);
|
|
187
|
+
window.dispatchEvent(new PopStateEvent('popstate'));
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
const scheduleRestore = () => {
|
|
191
|
+
if (!featureActive || restoreScheduled) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
restoreScheduled = true;
|
|
195
|
+
runWhenReady(() => {
|
|
196
|
+
restoreScheduled = false;
|
|
197
|
+
restoreHistory();
|
|
198
|
+
});
|
|
199
|
+
};
|
|
200
|
+
let originalPushState = null;
|
|
201
|
+
let originalReplaceState = null;
|
|
202
|
+
const popstateHandler = () => {
|
|
203
|
+
if (!featureActive || isRestoring) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const normalized = normalize();
|
|
207
|
+
if (!normalized) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const stored = readStored();
|
|
211
|
+
const idx = stored.stack.lastIndexOf(normalized);
|
|
212
|
+
if (idx >= 0) {
|
|
213
|
+
stored.index = idx;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
stored.stack.push(normalized);
|
|
217
|
+
stored.index = stored.stack.length - 1;
|
|
218
|
+
}
|
|
219
|
+
const trimmed = trimStack(stored.stack, stored.index);
|
|
220
|
+
writeStored(trimmed.stack, trimmed.index);
|
|
221
|
+
};
|
|
222
|
+
const patchHistory = () => {
|
|
223
|
+
if (originalPushState && originalReplaceState) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
originalPushState = history.pushState;
|
|
227
|
+
originalReplaceState = history.replaceState;
|
|
228
|
+
history.pushState = function pushStatePatched(state, title, url) {
|
|
229
|
+
const result = originalPushState.call(history, state, title, url);
|
|
230
|
+
record(url, false);
|
|
231
|
+
return result;
|
|
232
|
+
};
|
|
233
|
+
history.replaceState = function replaceStatePatched(state, title, url) {
|
|
234
|
+
const result = originalReplaceState.call(history, state, title, url);
|
|
235
|
+
record(url, true);
|
|
236
|
+
return result;
|
|
237
|
+
};
|
|
238
|
+
window.addEventListener('popstate', popstateHandler);
|
|
239
|
+
};
|
|
240
|
+
const unpatchHistory = () => {
|
|
241
|
+
if (originalPushState) {
|
|
242
|
+
history.pushState = originalPushState;
|
|
243
|
+
originalPushState = null;
|
|
244
|
+
}
|
|
245
|
+
if (originalReplaceState) {
|
|
246
|
+
history.replaceState = originalReplaceState;
|
|
247
|
+
originalReplaceState = null;
|
|
248
|
+
}
|
|
249
|
+
window.removeEventListener('popstate', popstateHandler);
|
|
250
|
+
};
|
|
251
|
+
const setFeatureActive = (enabled) => {
|
|
252
|
+
if (featureActive === enabled) {
|
|
253
|
+
if (featureActive) {
|
|
254
|
+
ensureCurrentTracked();
|
|
255
|
+
scheduleRestore();
|
|
256
|
+
}
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
featureActive = enabled;
|
|
260
|
+
if (featureActive) {
|
|
261
|
+
patchHistory();
|
|
262
|
+
ensureCurrentTracked();
|
|
263
|
+
scheduleRestore();
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
unpatchHistory();
|
|
267
|
+
clearStored();
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
window.addEventListener('CapacitorUpdaterKeepUrlPathAfterReload', (event) => {
|
|
271
|
+
var _a;
|
|
272
|
+
const evt = event;
|
|
273
|
+
const enabled = (_a = evt === null || evt === void 0 ? void 0 : evt.detail) === null || _a === void 0 ? void 0 : _a.enabled;
|
|
274
|
+
if (typeof enabled === 'boolean') {
|
|
275
|
+
win.__capgoKeepUrlPathAfterReload = enabled;
|
|
276
|
+
setFeatureActive(enabled);
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
win.__capgoKeepUrlPathAfterReload = true;
|
|
280
|
+
setFeatureActive(true);
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
setFeatureActive(isFeatureConfigured());
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
5
287
|
/*
|
|
6
288
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
7
289
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|