@very-simple/ajax 0.5.3 → 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 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
18
  currentLoadController?.abort();
16
19
  currentLoadController = new AbortController();
17
20
  setProgress(0);
18
- progressDelayTimeout = window.setTimeout(
19
- () => toggleLoading(true),
20
- options.loadingDelay
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,38 +30,9 @@ var load = async (url, regionIds, options) => {
26
30
  },
27
31
  signal: currentLoadController.signal
28
32
  });
29
- const reader = response.body?.getReader();
30
- const contentLengthHeader = response.headers.get("Content-Length");
31
- const length = parseInt(contentLengthHeader ?? "0");
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";
@@ -66,13 +41,26 @@ var load = async (url, regionIds, options) => {
66
41
  }
67
42
  } finally {
68
43
  clearTimeout(progressDelayTimeout);
44
+ stopTrickle();
45
+ setProgress(1);
69
46
  toggleLoading(false);
47
+ setTimeout(() => toggleProgress(false), options.progressHideDelay);
70
48
  }
71
49
  };
72
- var setProgress = (value) => document.documentElement.style.setProperty(
73
- "--simple-progress",
74
- `${Math.round(value * 1e4) / 100}%`
75
- );
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);
76
64
  var toggleLoading = (state) => document.documentElement.toggleAttribute("data-simple-loading", state);
77
65
 
78
66
  // src/merge.ts
@@ -155,6 +143,7 @@ var visit = async (url, {
155
143
  morphHeads = globalConfig.morphHeads,
156
144
  merge: mergeStrategy = globalConfig.merge,
157
145
  loadingDelay = globalConfig.loadingDelay,
146
+ progressHideDelay = globalConfig.progressHideDelay,
158
147
  autoFocus = true
159
148
  } = {}) => {
160
149
  prevUrl = currentUrl;
@@ -165,7 +154,11 @@ var visit = async (url, {
165
154
  newDocument = cache.get(url)?.cloneNode(true);
166
155
  }
167
156
  const regions = findRegions(document);
168
- newDocument ??= await load(url, Array.from(regions.keys()), { loadingDelay });
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
+ }
169
162
  if (!newDocument) return;
170
163
  if (emitEvents) emit("before-render", { url, prevUrl, newDocument });
171
164
  if (!isBackForward) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@very-simple/ajax",
3
- "version": "0.5.3",
3
+ "version": "0.5.4",
4
4
  "description": "A very simple turbolinks inspired library",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",