@very-simple/ajax 0.5.2 → 0.5.4
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/index.d.ts +3 -1
- package/dist/index.js +38 -44
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ interface VisitOptions {
|
|
|
6
6
|
morphHeads?: boolean;
|
|
7
7
|
autoFocus?: boolean;
|
|
8
8
|
loadingDelay?: number;
|
|
9
|
+
progressHideDelay?: number;
|
|
9
10
|
}
|
|
10
11
|
type MergeStrategy = 'replace' | 'morph' | 'before' | 'after' | 'prepend' | 'append' | 'update';
|
|
11
12
|
interface Config {
|
|
@@ -13,6 +14,7 @@ interface Config {
|
|
|
13
14
|
merge?: MergeStrategy;
|
|
14
15
|
morphHeads?: boolean;
|
|
15
16
|
loadingDelay?: number;
|
|
17
|
+
progressHideDelay?: number;
|
|
16
18
|
}
|
|
17
19
|
type EventMap = {
|
|
18
20
|
visit: {
|
|
@@ -39,7 +41,7 @@ declare global {
|
|
|
39
41
|
|
|
40
42
|
declare const _default: {
|
|
41
43
|
start: ({ watchHistory, merge, morphHeads, loadingDelay, }?: Config) => void;
|
|
42
|
-
visit: (url: string, { action, emitEvents, isBackForward, morphHeads, merge: mergeStrategy, loadingDelay, autoFocus, }?: VisitOptions) => Promise<void>;
|
|
44
|
+
visit: (url: string, { action, emitEvents, isBackForward, morphHeads, merge: mergeStrategy, loadingDelay, progressHideDelay, autoFocus, }?: VisitOptions) => Promise<void>;
|
|
43
45
|
};
|
|
44
46
|
|
|
45
47
|
export { _default as default };
|
package/dist/index.js
CHANGED
|
@@ -3,22 +3,26 @@ var globalConfig = {
|
|
|
3
3
|
watchHistory: true,
|
|
4
4
|
morphHeads: true,
|
|
5
5
|
merge: "replace",
|
|
6
|
-
loadingDelay: 500
|
|
6
|
+
loadingDelay: 500,
|
|
7
|
+
progressHideDelay: 500
|
|
7
8
|
};
|
|
8
9
|
|
|
9
10
|
// src/load.ts
|
|
10
11
|
var parser = new DOMParser();
|
|
11
12
|
var currentLoadController;
|
|
13
|
+
var progress = 0;
|
|
14
|
+
var trickleInterval;
|
|
12
15
|
var load = async (url, regionIds, options) => {
|
|
13
16
|
let progressDelayTimeout;
|
|
14
17
|
try {
|
|
15
|
-
currentLoadController?.abort(
|
|
18
|
+
currentLoadController?.abort();
|
|
16
19
|
currentLoadController = new AbortController();
|
|
17
20
|
setProgress(0);
|
|
18
|
-
progressDelayTimeout = window.setTimeout(
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
progressDelayTimeout = window.setTimeout(() => {
|
|
22
|
+
toggleLoading(true);
|
|
23
|
+
toggleProgress(true);
|
|
24
|
+
startTrickle();
|
|
25
|
+
}, options.loadingDelay);
|
|
22
26
|
const response = await fetch(url, {
|
|
23
27
|
headers: {
|
|
24
28
|
"X-Very-Simple-Request": "true",
|
|
@@ -26,52 +30,37 @@ var load = async (url, regionIds, options) => {
|
|
|
26
30
|
},
|
|
27
31
|
signal: currentLoadController.signal
|
|
28
32
|
});
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
let receivedBytes = 0;
|
|
33
|
-
const stream = new ReadableStream({
|
|
34
|
-
start(controller) {
|
|
35
|
-
const read = async () => {
|
|
36
|
-
const { done, value } = await reader.read();
|
|
37
|
-
if (done) {
|
|
38
|
-
if (contentLengthHeader && receivedBytes > length) {
|
|
39
|
-
console.warn(
|
|
40
|
-
`Server sent more data (${receivedBytes} bytes) than specified in Content-Length header (${length} bytes).`
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
controller.close();
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
receivedBytes += value.length;
|
|
47
|
-
if (contentLengthHeader) {
|
|
48
|
-
const progress = Math.min(receivedBytes / length, 1);
|
|
49
|
-
setProgress(progress);
|
|
50
|
-
}
|
|
51
|
-
controller.enqueue(value);
|
|
52
|
-
read();
|
|
53
|
-
};
|
|
54
|
-
read();
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
const html = await new Response(stream, {
|
|
58
|
-
headers: { "Content-Type": "text/html" }
|
|
59
|
-
}).text();
|
|
60
|
-
return parser.parseFromString(html, "text/html");
|
|
33
|
+
const html = await response.text();
|
|
34
|
+
const document2 = parser.parseFromString(html, "text/html");
|
|
35
|
+
return { document: document2, url: response.url };
|
|
61
36
|
} catch (e) {
|
|
62
37
|
setProgress(0);
|
|
63
|
-
|
|
38
|
+
const isAbortError = e instanceof DOMException && e.name === "AbortError";
|
|
39
|
+
if (!isAbortError) {
|
|
64
40
|
window.location.reload();
|
|
65
41
|
}
|
|
66
42
|
} finally {
|
|
67
43
|
clearTimeout(progressDelayTimeout);
|
|
44
|
+
stopTrickle();
|
|
45
|
+
setProgress(1);
|
|
68
46
|
toggleLoading(false);
|
|
47
|
+
setTimeout(() => toggleProgress(false), options.progressHideDelay);
|
|
69
48
|
}
|
|
70
49
|
};
|
|
71
|
-
var
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
50
|
+
var trickle = () => {
|
|
51
|
+
const amount = -0.095 * progress + 0.1;
|
|
52
|
+
setProgress(progress + Math.random() * amount);
|
|
53
|
+
};
|
|
54
|
+
var startTrickle = () => trickleInterval = window.setInterval(trickle, 300);
|
|
55
|
+
var stopTrickle = () => clearInterval(trickleInterval);
|
|
56
|
+
var setProgress = (value) => {
|
|
57
|
+
progress = value;
|
|
58
|
+
document.documentElement.style.setProperty(
|
|
59
|
+
"--simple-progress",
|
|
60
|
+
`${Math.round(value * 1e4) / 100}%`
|
|
61
|
+
);
|
|
62
|
+
};
|
|
63
|
+
var toggleProgress = (state) => document.documentElement.toggleAttribute("data-simple-progress", state);
|
|
75
64
|
var toggleLoading = (state) => document.documentElement.toggleAttribute("data-simple-loading", state);
|
|
76
65
|
|
|
77
66
|
// src/merge.ts
|
|
@@ -154,6 +143,7 @@ var visit = async (url, {
|
|
|
154
143
|
morphHeads = globalConfig.morphHeads,
|
|
155
144
|
merge: mergeStrategy = globalConfig.merge,
|
|
156
145
|
loadingDelay = globalConfig.loadingDelay,
|
|
146
|
+
progressHideDelay = globalConfig.progressHideDelay,
|
|
157
147
|
autoFocus = true
|
|
158
148
|
} = {}) => {
|
|
159
149
|
prevUrl = currentUrl;
|
|
@@ -164,7 +154,11 @@ var visit = async (url, {
|
|
|
164
154
|
newDocument = cache.get(url)?.cloneNode(true);
|
|
165
155
|
}
|
|
166
156
|
const regions = findRegions(document);
|
|
167
|
-
|
|
157
|
+
if (!newDocument) {
|
|
158
|
+
const options = { loadingDelay, progressHideDelay };
|
|
159
|
+
const result = await load(url, Array.from(regions.keys()), options);
|
|
160
|
+
if (result) ({ url, document: newDocument } = result);
|
|
161
|
+
}
|
|
168
162
|
if (!newDocument) return;
|
|
169
163
|
if (emitEvents) emit("before-render", { url, prevUrl, newDocument });
|
|
170
164
|
if (!isBackForward) {
|