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