@alignable/bifrost 0.0.11 → 0.0.13
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 +6 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/lib/PageShell.d.ts.map +1 -1
- package/dist/lib/getElementAttributes.d.ts +2 -0
- package/dist/lib/getElementAttributes.d.ts.map +1 -0
- package/dist/lib/getElementAttributes.js +7 -0
- package/dist/lib/turbolinks/adapter.d.ts +17 -0
- package/dist/lib/turbolinks/adapter.d.ts.map +1 -0
- package/dist/lib/turbolinks/adapter.js +1 -0
- package/dist/lib/turbolinks/browser_adapter.d.ts +28 -0
- package/dist/lib/turbolinks/browser_adapter.d.ts.map +1 -0
- package/dist/lib/turbolinks/browser_adapter.js +68 -0
- package/dist/lib/turbolinks/controller.d.ts +75 -0
- package/dist/lib/turbolinks/controller.d.ts.map +1 -0
- package/dist/lib/turbolinks/controller.js +219 -0
- package/dist/lib/turbolinks/head_details.d.ts +24 -0
- package/dist/lib/turbolinks/head_details.d.ts.map +1 -0
- package/dist/lib/turbolinks/head_details.js +97 -0
- package/dist/lib/turbolinks/index.d.ts +14 -0
- package/dist/lib/turbolinks/index.d.ts.map +1 -0
- package/dist/lib/turbolinks/index.js +55 -0
- package/dist/lib/turbolinks/location.d.ts +23 -0
- package/dist/lib/turbolinks/location.d.ts.map +1 -0
- package/dist/lib/turbolinks/location.js +75 -0
- package/dist/lib/turbolinks/lruCache.d.ts.map +1 -0
- package/dist/lib/turbolinks/mergeHead.d.ts +2 -0
- package/dist/lib/turbolinks/mergeHead.d.ts.map +1 -0
- package/dist/lib/{mergeHead.js → turbolinks/mergeHead.js} +27 -33
- package/dist/lib/turbolinks/progress_bar.d.ts +24 -0
- package/dist/lib/turbolinks/progress_bar.d.ts.map +1 -0
- package/dist/lib/turbolinks/progress_bar.js +99 -0
- package/dist/lib/turbolinks/types.d.ts +7 -0
- package/dist/lib/turbolinks/types.d.ts.map +1 -0
- package/dist/lib/turbolinks/types.js +3 -0
- package/dist/lib/turbolinks/util.d.ts +18 -0
- package/dist/lib/turbolinks/util.d.ts.map +1 -0
- package/dist/lib/turbolinks/util.js +125 -0
- package/dist/lib/turbolinks/visit.d.ts +55 -0
- package/dist/lib/turbolinks/visit.d.ts.map +1 -0
- package/dist/lib/turbolinks/visit.js +163 -0
- package/dist/proxy/pages/onRenderClient.d.ts.map +1 -1
- package/dist/proxy/pages/onRenderClient.js +40 -29
- package/dist/proxy/pages/onRenderHtml.d.ts.map +1 -1
- package/dist/proxy/pages/onRenderHtml.js +19 -5
- package/dist/proxy/pages/restorationVisit/+config.d.ts +2 -0
- package/dist/proxy/pages/restorationVisit/+config.d.ts.map +1 -1
- package/dist/proxy/pages/restorationVisit/+config.js +3 -0
- package/dist/proxy/pages/restorationVisit/onRenderClient.d.ts +3 -0
- package/dist/proxy/pages/restorationVisit/onRenderClient.d.ts.map +1 -0
- package/dist/proxy/pages/restorationVisit/onRenderClient.js +41 -0
- package/dist/renderer/getConfigOrPageContext.d.ts +8 -0
- package/dist/renderer/getConfigOrPageContext.d.ts.map +1 -0
- package/dist/renderer/getConfigOrPageContext.js +6 -0
- package/dist/renderer/onBeforeRoute.d.ts +1 -6
- package/dist/renderer/onBeforeRoute.d.ts.map +1 -1
- package/dist/renderer/onBeforeRoute.js +19 -11
- package/dist/renderer/onRenderClient.d.ts.map +1 -1
- package/dist/renderer/onRenderClient.js +31 -24
- package/dist/renderer/onRenderHtml.d.ts.map +1 -1
- package/dist/renderer/onRenderHtml.js +15 -18
- package/dist/renderer/utils/buildHead.d.ts +4 -0
- package/dist/renderer/utils/buildHead.d.ts.map +1 -0
- package/dist/renderer/utils/buildHead.js +10 -0
- package/dist/types/internal.d.ts +26 -23
- package/dist/types/internal.d.ts.map +1 -1
- package/package.json +13 -5
- package/dist/lib/dispatchTurbolinks.d.ts +0 -28
- package/dist/lib/dispatchTurbolinks.d.ts.map +0 -1
- package/dist/lib/dispatchTurbolinks.js +0 -5
- package/dist/lib/domUtils.d.ts +0 -3
- package/dist/lib/domUtils.d.ts.map +0 -1
- package/dist/lib/domUtils.js +0 -34
- package/dist/lib/linkInterceptor.d.ts +0 -2
- package/dist/lib/linkInterceptor.d.ts.map +0 -1
- package/dist/lib/linkInterceptor.js +0 -74
- package/dist/lib/lruCache.d.ts.map +0 -1
- package/dist/lib/mergeHead.d.ts +0 -2
- package/dist/lib/mergeHead.d.ts.map +0 -1
- package/dist/lib/navigateAnywhere.d.ts +0 -3
- package/dist/lib/navigateAnywhere.d.ts.map +0 -1
- package/dist/lib/navigateAnywhere.js +0 -15
- package/dist/lib/snapshots.d.ts +0 -9
- package/dist/lib/snapshots.d.ts.map +0 -1
- package/dist/lib/snapshots.js +0 -50
- package/dist/lib/turbolinks.d.ts +0 -5
- package/dist/lib/turbolinks.d.ts.map +0 -1
- package/dist/lib/turbolinks.js +0 -14
- package/dist/renderer/getDocumentProps.d.ts +0 -3
- package/dist/renderer/getDocumentProps.d.ts.map +0 -1
- package/dist/renderer/getDocumentProps.js +0 -3
- package/dist/renderer/utils/formatMetaObject.d.ts +0 -4
- package/dist/renderer/utils/formatMetaObject.d.ts.map +0 -1
- package/dist/renderer/utils/formatMetaObject.js +0 -3
- /package/dist/lib/{lruCache.d.ts → turbolinks/lruCache.d.ts} +0 -0
- /package/dist/lib/{lruCache.js → turbolinks/lruCache.js} +0 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { mergeHead } from "./mergeHead";
|
|
2
|
+
import { Controller } from "./controller";
|
|
3
|
+
import { activateNewBodyScriptElements, focusFirstAutofocusableElement } from "./util";
|
|
4
|
+
const controller = new Controller();
|
|
5
|
+
export const Turbolinks = {
|
|
6
|
+
get supported() {
|
|
7
|
+
return true;
|
|
8
|
+
},
|
|
9
|
+
controller,
|
|
10
|
+
visit(location, options) {
|
|
11
|
+
controller.visit(location, options);
|
|
12
|
+
},
|
|
13
|
+
clearCache() {
|
|
14
|
+
controller.clearCache();
|
|
15
|
+
},
|
|
16
|
+
setProgressBarDelay(delay) {
|
|
17
|
+
controller.setProgressBarDelay(delay);
|
|
18
|
+
},
|
|
19
|
+
start() {
|
|
20
|
+
// because this runs after ios hooks, we have to recover. See onRenderHtml
|
|
21
|
+
if (window.Turbolinks !== Turbolinks &&
|
|
22
|
+
window.Turbolinks.controller.adapter) {
|
|
23
|
+
window.Turbolinks.controller.adapter.controller = controller;
|
|
24
|
+
controller.adapter = window.Turbolinks.controller.adapter;
|
|
25
|
+
}
|
|
26
|
+
// Tells vite-plugin-ssr not to do link interception
|
|
27
|
+
window._disableAutomaticLinkInterception = true;
|
|
28
|
+
window.Turbolinks = Turbolinks;
|
|
29
|
+
controller.start();
|
|
30
|
+
},
|
|
31
|
+
_vpsCachePageContext(pageContext) {
|
|
32
|
+
controller.pageContext = pageContext;
|
|
33
|
+
},
|
|
34
|
+
_vpsOnRenderClient(newHead, trackScripts, renderBody) {
|
|
35
|
+
if (controller.currentVisit) {
|
|
36
|
+
const { currentVisit } = controller;
|
|
37
|
+
// TODO: move to controller?
|
|
38
|
+
currentVisit.renderFn = async () => {
|
|
39
|
+
const scriptsLoaded = mergeHead(newHead, trackScripts, () => controller.viewInvalidated());
|
|
40
|
+
controller.viewWillRender();
|
|
41
|
+
renderBody();
|
|
42
|
+
await scriptsLoaded;
|
|
43
|
+
activateNewBodyScriptElements(Array.from(document.body.querySelectorAll("script")));
|
|
44
|
+
focusFirstAutofocusableElement();
|
|
45
|
+
controller.viewRendered();
|
|
46
|
+
controller.adapter.visitRendered(currentVisit);
|
|
47
|
+
};
|
|
48
|
+
controller.adapter.visitRequestCompleted(controller.currentVisit);
|
|
49
|
+
controller.adapter.visitRequestFinished(controller.currentVisit);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
console.error("controller.currentVisit should exist when onRenderClient fires");
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type Locatable = Location | string;
|
|
2
|
+
export declare class Location {
|
|
3
|
+
static get currentLocation(): Location;
|
|
4
|
+
static wrap(locatable: Locatable): Location;
|
|
5
|
+
static wrap(locatable?: Locatable | null): Location | undefined;
|
|
6
|
+
readonly absoluteURL: string;
|
|
7
|
+
readonly requestURL: string;
|
|
8
|
+
readonly anchor?: string;
|
|
9
|
+
constructor(url: string);
|
|
10
|
+
getOrigin(): string;
|
|
11
|
+
getPath(): string;
|
|
12
|
+
getPathComponents(): string[];
|
|
13
|
+
getLastPathComponent(): string;
|
|
14
|
+
getExtension(): string;
|
|
15
|
+
isHTML(): RegExpMatchArray | null;
|
|
16
|
+
isPrefixedBy(location: Location): boolean;
|
|
17
|
+
isEqualTo(location?: Location): boolean | undefined;
|
|
18
|
+
toCacheKey(): string;
|
|
19
|
+
toJSON(): string;
|
|
20
|
+
toString(): string;
|
|
21
|
+
valueOf(): string;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=location.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"location.d.ts","sourceRoot":"","sources":["../../../lib/turbolinks/location.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1C,qBAAa,QAAQ;IACnB,MAAM,KAAK,eAAe,aAEzB;IAED,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,QAAQ;IAC3C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS;IAS/D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEb,GAAG,EAAE,MAAM;IAevB,SAAS;IAIT,OAAO;IAIP,iBAAiB;IAIjB,oBAAoB;IAIpB,YAAY;IAIZ,MAAM;IAIN,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAOzC,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAI7B,UAAU;IAIV,MAAM;IAIN,QAAQ;IAIR,OAAO;CAGR"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export class Location {
|
|
2
|
+
static get currentLocation() {
|
|
3
|
+
return this.wrap(window.location.toString());
|
|
4
|
+
}
|
|
5
|
+
static wrap(locatable) {
|
|
6
|
+
if (typeof locatable == "string") {
|
|
7
|
+
return new this(locatable);
|
|
8
|
+
}
|
|
9
|
+
else if (locatable != null) {
|
|
10
|
+
return locatable;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
constructor(url) {
|
|
14
|
+
const linkWithAnchor = document.createElement("a");
|
|
15
|
+
linkWithAnchor.href = url;
|
|
16
|
+
this.absoluteURL = linkWithAnchor.href;
|
|
17
|
+
const anchorLength = linkWithAnchor.hash.length;
|
|
18
|
+
if (anchorLength < 2) {
|
|
19
|
+
this.requestURL = this.absoluteURL;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
this.requestURL = this.absoluteURL.slice(0, -anchorLength);
|
|
23
|
+
this.anchor = linkWithAnchor.hash.slice(1);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
getOrigin() {
|
|
27
|
+
return this.absoluteURL.split("/", 3).join("/");
|
|
28
|
+
}
|
|
29
|
+
getPath() {
|
|
30
|
+
return (this.requestURL.match(/\/\/[^/]*(\/[^?;]*)/) || [])[1] || "/";
|
|
31
|
+
}
|
|
32
|
+
getPathComponents() {
|
|
33
|
+
return this.getPath().split("/").slice(1);
|
|
34
|
+
}
|
|
35
|
+
getLastPathComponent() {
|
|
36
|
+
return this.getPathComponents().slice(-1)[0];
|
|
37
|
+
}
|
|
38
|
+
getExtension() {
|
|
39
|
+
return (this.getLastPathComponent().match(/\.[^.]*$/) || [])[0] || "";
|
|
40
|
+
}
|
|
41
|
+
isHTML() {
|
|
42
|
+
return this.getExtension().match(/^(?:|\.(?:htm|html|xhtml))$/);
|
|
43
|
+
}
|
|
44
|
+
isPrefixedBy(location) {
|
|
45
|
+
const prefixURL = getPrefixURL(location);
|
|
46
|
+
return (this.isEqualTo(location) || stringStartsWith(this.absoluteURL, prefixURL));
|
|
47
|
+
}
|
|
48
|
+
isEqualTo(location) {
|
|
49
|
+
return location && this.absoluteURL === location.absoluteURL;
|
|
50
|
+
}
|
|
51
|
+
toCacheKey() {
|
|
52
|
+
return this.requestURL;
|
|
53
|
+
}
|
|
54
|
+
toJSON() {
|
|
55
|
+
return this.absoluteURL;
|
|
56
|
+
}
|
|
57
|
+
toString() {
|
|
58
|
+
return this.absoluteURL;
|
|
59
|
+
}
|
|
60
|
+
valueOf() {
|
|
61
|
+
return this.absoluteURL;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function getPrefixURL(location) {
|
|
65
|
+
return addTrailingSlash(location.getOrigin() + location.getPath());
|
|
66
|
+
}
|
|
67
|
+
function addTrailingSlash(url) {
|
|
68
|
+
return stringEndsWith(url, "/") ? url : url + "/";
|
|
69
|
+
}
|
|
70
|
+
function stringStartsWith(string, prefix) {
|
|
71
|
+
return string.slice(0, prefix.length) === prefix;
|
|
72
|
+
}
|
|
73
|
+
function stringEndsWith(string, suffix) {
|
|
74
|
+
return string.slice(-suffix.length) === suffix;
|
|
75
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lruCache.d.ts","sourceRoot":"","sources":["../../../lib/turbolinks/lruCache.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAQ,CAAC,CAAC;IACrB,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,UAAU,CAAC;gBAEP,UAAU,EAAE,MAAM;IAIvB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAa/B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;CAUjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeHead.d.ts","sourceRoot":"","sources":["../../../lib/turbolinks/mergeHead.ts"],"names":[],"mappings":"AASA,wBAAsB,SAAS,CAC7B,IAAI,EAAE,eAAe,EACrB,YAAY,EAAE,OAAO,EACrB,MAAM,EAAE,MAAM,IAAI,iBAyCnB"}
|
|
@@ -1,14 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { activateNewBodyScriptElements, createScriptElement } from "./domUtils.js";
|
|
1
|
+
import { createScriptElement } from "./util";
|
|
3
2
|
const allHeadScriptsEverRun = {};
|
|
4
3
|
let firstLoad = true;
|
|
5
|
-
|
|
6
|
-
export function mergeHead(head) {
|
|
7
|
-
const
|
|
8
|
-
const newHead = categorizeHead(parsed);
|
|
4
|
+
let lastTrackedScriptSignature;
|
|
5
|
+
export async function mergeHead(head, trackScripts, reload) {
|
|
6
|
+
const newHead = categorizeHead(head);
|
|
9
7
|
const oldHead = categorizeHead(document.head);
|
|
10
|
-
if (
|
|
11
|
-
|
|
8
|
+
if (head
|
|
9
|
+
.querySelector('meta[name="turbolinks-visit-control"]')
|
|
10
|
+
?.getAttribute("content") === "reload") {
|
|
11
|
+
reload();
|
|
12
|
+
}
|
|
13
|
+
if (trackScripts) {
|
|
14
|
+
lastTrackedScriptSignature =
|
|
15
|
+
lastTrackedScriptSignature ||
|
|
16
|
+
trackedElementSignature([...oldHead.scripts, ...oldHead.stylesheets]);
|
|
17
|
+
if (lastTrackedScriptSignature !==
|
|
18
|
+
trackedElementSignature([...newHead.scripts, ...newHead.stylesheets])) {
|
|
19
|
+
reload();
|
|
20
|
+
}
|
|
12
21
|
}
|
|
13
22
|
if (firstLoad) {
|
|
14
23
|
// TODO: messy code
|
|
@@ -22,17 +31,15 @@ export function mergeHead(head) {
|
|
|
22
31
|
copyNewHeadStylesheetElements(newHead.stylesheets, oldHead.stylesheets);
|
|
23
32
|
removeCurrentHeadProvisionalElements(oldHead.provisional);
|
|
24
33
|
copyNewHeadProvisionalElements(newHead.provisional);
|
|
25
|
-
|
|
34
|
+
return new Promise((resolve) => {
|
|
35
|
+
copyNewHeadScriptElements(newHead.scripts, resolve);
|
|
36
|
+
});
|
|
26
37
|
}
|
|
27
|
-
function
|
|
28
|
-
return
|
|
38
|
+
function trackedElementSignature(scripts) {
|
|
39
|
+
return scripts
|
|
29
40
|
.filter(elementIsTracked)
|
|
30
41
|
.map((s) => s.outerHTML)
|
|
31
|
-
.join()
|
|
32
|
-
next
|
|
33
|
-
.filter(elementIsTracked)
|
|
34
|
-
.map((s) => s.outerHTML)
|
|
35
|
-
.join());
|
|
42
|
+
.join();
|
|
36
43
|
}
|
|
37
44
|
function copyNewHeadStylesheetElements(next, prev) {
|
|
38
45
|
const existing = prev.map((s) => s.outerHTML);
|
|
@@ -42,17 +49,10 @@ function copyNewHeadStylesheetElements(next, prev) {
|
|
|
42
49
|
}
|
|
43
50
|
}
|
|
44
51
|
}
|
|
45
|
-
function copyNewHeadScriptElements(next) {
|
|
52
|
+
function copyNewHeadScriptElements(next, onScriptsLoaded) {
|
|
46
53
|
let blockingLoaded = [];
|
|
47
54
|
function dispatch() {
|
|
48
|
-
|
|
49
|
-
.querySelector("#proxied-body")
|
|
50
|
-
.querySelectorAll("script");
|
|
51
|
-
// TODO: maybe this goes in onTransitionEnd? Need to test.
|
|
52
|
-
activateNewBodyScriptElements(Array.from(scripts));
|
|
53
|
-
focusFirstAutofocusableElement();
|
|
54
|
-
dispatchTurbolinks("turbolinks:render", {});
|
|
55
|
-
dispatchTurbolinks("turbolinks:load", { url: window.location.href });
|
|
55
|
+
onScriptsLoaded();
|
|
56
56
|
}
|
|
57
57
|
for (const element of next) {
|
|
58
58
|
const runBefore = element.outerHTML in allHeadScriptsEverRun;
|
|
@@ -75,8 +75,8 @@ function copyNewHeadScriptElements(next) {
|
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
if (blockingLoaded.length === 0) {
|
|
78
|
-
//
|
|
79
|
-
requestAnimationFrame(
|
|
78
|
+
// raf waits for react to finish
|
|
79
|
+
requestAnimationFrame(dispatch);
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
function removeCurrentHeadProvisionalElements(prev) {
|
|
@@ -89,12 +89,6 @@ function copyNewHeadProvisionalElements(next) {
|
|
|
89
89
|
document.head.appendChild(element);
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
|
-
function focusFirstAutofocusableElement() {
|
|
93
|
-
const element = document.body.querySelector("[autofocus]");
|
|
94
|
-
if (element && "focus" in element && typeof element.focus === "function") {
|
|
95
|
-
element.focus();
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
92
|
function elementIsTracked(element) {
|
|
99
93
|
return element.getAttribute("data-turbolinks-track") == "reload";
|
|
100
94
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare class ProgressBar {
|
|
2
|
+
static animationDuration: number;
|
|
3
|
+
static get defaultCSS(): string;
|
|
4
|
+
readonly stylesheetElement: HTMLStyleElement;
|
|
5
|
+
readonly progressElement: HTMLDivElement;
|
|
6
|
+
hiding: boolean;
|
|
7
|
+
trickleInterval?: number;
|
|
8
|
+
value: number;
|
|
9
|
+
visible: boolean;
|
|
10
|
+
show(): void;
|
|
11
|
+
hide(): void;
|
|
12
|
+
setValue(value: number): void;
|
|
13
|
+
installStylesheetElement(): void;
|
|
14
|
+
installProgressElement(): void;
|
|
15
|
+
fadeProgressElement(callback: () => void): void;
|
|
16
|
+
uninstallProgressElement(): void;
|
|
17
|
+
startTrickling(): void;
|
|
18
|
+
stopTrickling(): void;
|
|
19
|
+
trickle: () => void;
|
|
20
|
+
refresh(): void;
|
|
21
|
+
createStylesheetElement(): HTMLStyleElement;
|
|
22
|
+
createProgressElement(): HTMLDivElement;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=progress_bar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress_bar.d.ts","sourceRoot":"","sources":["../../../lib/turbolinks/progress_bar.ts"],"names":[],"mappings":"AAEA,qBAAa,WAAW;IACtB,MAAM,CAAC,iBAAiB,SAAO;IAE/B,MAAM,KAAK,UAAU,WAkBpB;IAED,QAAQ,CAAC,iBAAiB,mBAAkC;IAC5D,QAAQ,CAAC,eAAe,iBAAgC;IAExD,MAAM,UAAS;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,SAAK;IACV,OAAO,UAAS;IAEhB,IAAI;IASJ,IAAI;IAYJ,QAAQ,CAAC,KAAK,EAAE,MAAM;IAOtB,wBAAwB;IAOxB,sBAAsB;IAOtB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,IAAI;IAKxC,wBAAwB;IAMxB,cAAc;IASd,aAAa;IAKb,OAAO,aAEL;IAEF,OAAO;IAMP,uBAAuB;IAOvB,qBAAqB;CAKtB"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { unindent } from "./util";
|
|
2
|
+
class ProgressBar {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.stylesheetElement = this.createStylesheetElement();
|
|
5
|
+
this.progressElement = this.createProgressElement();
|
|
6
|
+
this.hiding = false;
|
|
7
|
+
this.value = 0;
|
|
8
|
+
this.visible = false;
|
|
9
|
+
this.trickle = () => {
|
|
10
|
+
this.setValue(this.value + Math.random() / 100);
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
static get defaultCSS() {
|
|
14
|
+
return unindent `
|
|
15
|
+
.turbolinks-progress-bar {
|
|
16
|
+
position: fixed;
|
|
17
|
+
display: block;
|
|
18
|
+
top: 0;
|
|
19
|
+
left: 0;
|
|
20
|
+
height: 3px;
|
|
21
|
+
background: #0076ff;
|
|
22
|
+
z-index: 9999;
|
|
23
|
+
transition:
|
|
24
|
+
width ${ProgressBar.animationDuration}ms ease-out,
|
|
25
|
+
opacity ${ProgressBar.animationDuration / 2}ms ${ProgressBar.animationDuration / 2}ms ease-in;
|
|
26
|
+
transform: translate3d(0, 0, 0);
|
|
27
|
+
}
|
|
28
|
+
`;
|
|
29
|
+
}
|
|
30
|
+
show() {
|
|
31
|
+
if (!this.visible) {
|
|
32
|
+
this.visible = true;
|
|
33
|
+
this.installStylesheetElement();
|
|
34
|
+
this.installProgressElement();
|
|
35
|
+
this.startTrickling();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
hide() {
|
|
39
|
+
if (this.visible && !this.hiding) {
|
|
40
|
+
this.hiding = true;
|
|
41
|
+
this.fadeProgressElement(() => {
|
|
42
|
+
this.uninstallProgressElement();
|
|
43
|
+
this.stopTrickling();
|
|
44
|
+
this.visible = false;
|
|
45
|
+
this.hiding = false;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
setValue(value) {
|
|
50
|
+
this.value = value;
|
|
51
|
+
this.refresh();
|
|
52
|
+
}
|
|
53
|
+
// Private
|
|
54
|
+
installStylesheetElement() {
|
|
55
|
+
document.head.insertBefore(this.stylesheetElement, document.head.firstChild);
|
|
56
|
+
}
|
|
57
|
+
installProgressElement() {
|
|
58
|
+
this.progressElement.style.width = "0";
|
|
59
|
+
this.progressElement.style.opacity = "1";
|
|
60
|
+
document.documentElement.insertBefore(this.progressElement, document.body);
|
|
61
|
+
this.refresh();
|
|
62
|
+
}
|
|
63
|
+
fadeProgressElement(callback) {
|
|
64
|
+
this.progressElement.style.opacity = "0";
|
|
65
|
+
setTimeout(callback, ProgressBar.animationDuration * 1.5);
|
|
66
|
+
}
|
|
67
|
+
uninstallProgressElement() {
|
|
68
|
+
if (this.progressElement.parentNode) {
|
|
69
|
+
document.documentElement.removeChild(this.progressElement);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
startTrickling() {
|
|
73
|
+
if (!this.trickleInterval) {
|
|
74
|
+
this.trickleInterval = window.setInterval(this.trickle, ProgressBar.animationDuration);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
stopTrickling() {
|
|
78
|
+
window.clearInterval(this.trickleInterval);
|
|
79
|
+
delete this.trickleInterval;
|
|
80
|
+
}
|
|
81
|
+
refresh() {
|
|
82
|
+
requestAnimationFrame(() => {
|
|
83
|
+
this.progressElement.style.width = `${10 + this.value * 90}%`;
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
createStylesheetElement() {
|
|
87
|
+
const element = document.createElement("style");
|
|
88
|
+
element.type = "text/css";
|
|
89
|
+
element.textContent = ProgressBar.defaultCSS;
|
|
90
|
+
return element;
|
|
91
|
+
}
|
|
92
|
+
createProgressElement() {
|
|
93
|
+
const element = document.createElement("div");
|
|
94
|
+
element.className = "turbolinks-progress-bar";
|
|
95
|
+
return element;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
ProgressBar.animationDuration = 300; /*ms*/
|
|
99
|
+
export { ProgressBar };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../lib/turbolinks/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAEvD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,IAAI,MAAM,CAEtD;AAED,MAAM,MAAM,QAAQ,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare function array<T>(values: ArrayLike<T>): T[];
|
|
2
|
+
export declare const closest: (element: Element, selector: string) => Element | null;
|
|
3
|
+
export declare function defer(callback: () => any): void;
|
|
4
|
+
export type DispatchOptions = {
|
|
5
|
+
target: EventTarget;
|
|
6
|
+
cancelable: boolean;
|
|
7
|
+
data: any;
|
|
8
|
+
};
|
|
9
|
+
export declare function dispatch(eventName: string, { target, cancelable, data }?: Partial<DispatchOptions>): Event & {
|
|
10
|
+
data: any;
|
|
11
|
+
};
|
|
12
|
+
export declare function unindent(strings: TemplateStringsArray, ...values: any[]): string;
|
|
13
|
+
export declare function uuid(): string;
|
|
14
|
+
export declare function createScriptElement(element: Element, cb?: () => void): Element;
|
|
15
|
+
export declare function copyElementAttributes(destinationElement: Element, sourceElement: Element): void;
|
|
16
|
+
export declare function activateNewBodyScriptElements(newScriptElements: HTMLScriptElement[]): void;
|
|
17
|
+
export declare function focusFirstAutofocusableElement(): void;
|
|
18
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../lib/turbolinks/util.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAElD;AAED,eAAO,MAAM,OAAO,YAwBQ,OAAO,YAAY,MAAM,mBAGjD,CAAC;AAEL,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,QAExC;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,GAAG,CAAC;CACX,CAAC;AAEF,wBAAgB,QAAQ,CACtB,SAAS,EAAE,MAAM,EACjB,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAE,OAAO,CAAC,eAAe,CAAM;UAEK,GAAG;EAkBpE;AASD,wBAAgB,QAAQ,CACtB,OAAO,EAAE,oBAAoB,EAC7B,GAAG,MAAM,EAAE,GAAG,EAAE,GACf,MAAM,CAKR;AAaD,wBAAgB,IAAI,WAcnB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,MAAM,IAAI,WAepE;AAED,wBAAgB,qBAAqB,CACnC,kBAAkB,EAAE,OAAO,EAC3B,aAAa,EAAE,OAAO,QAKvB;AAQD,wBAAgB,6BAA6B,CAC3C,iBAAiB,EAAE,iBAAiB,EAAE,QAMvC;AAED,wBAAgB,8BAA8B,SAK7C"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
export function array(values) {
|
|
2
|
+
return Array.prototype.slice.call(values);
|
|
3
|
+
}
|
|
4
|
+
export const closest = (() => {
|
|
5
|
+
const html = document.documentElement;
|
|
6
|
+
const match = html.matches ||
|
|
7
|
+
html.webkitMatchesSelector ||
|
|
8
|
+
html.msMatchesSelector ||
|
|
9
|
+
html.mozMatchesSelector;
|
|
10
|
+
const closest = html.closest ||
|
|
11
|
+
function (selector) {
|
|
12
|
+
let element = this;
|
|
13
|
+
while (element) {
|
|
14
|
+
if (match.call(element, selector)) {
|
|
15
|
+
return element;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
element = element.parentElement;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
return function (element, selector) {
|
|
23
|
+
return closest.call(element, selector);
|
|
24
|
+
};
|
|
25
|
+
})();
|
|
26
|
+
export function defer(callback) {
|
|
27
|
+
setTimeout(callback, 1);
|
|
28
|
+
}
|
|
29
|
+
export function dispatch(eventName, { target, cancelable, data } = {}) {
|
|
30
|
+
const event = document.createEvent("Events");
|
|
31
|
+
event.initEvent(eventName, true, cancelable == true);
|
|
32
|
+
event.data = data || {};
|
|
33
|
+
// Fix setting `defaultPrevented` when `preventDefault()` is called
|
|
34
|
+
// http://stackoverflow.com/questions/23349191/event-preventdefault-is-not-working-in-ie-11-for-custom-events
|
|
35
|
+
if (event.cancelable && !preventDefaultSupported) {
|
|
36
|
+
const { preventDefault } = event;
|
|
37
|
+
event.preventDefault = function () {
|
|
38
|
+
if (!this.defaultPrevented) {
|
|
39
|
+
Object.defineProperty(this, "defaultPrevented", { get: () => true });
|
|
40
|
+
}
|
|
41
|
+
preventDefault.call(this);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
(target || document).dispatchEvent(event);
|
|
45
|
+
return event;
|
|
46
|
+
}
|
|
47
|
+
const preventDefaultSupported = (() => {
|
|
48
|
+
const event = document.createEvent("Events");
|
|
49
|
+
event.initEvent("test", true, true);
|
|
50
|
+
event.preventDefault();
|
|
51
|
+
return event.defaultPrevented;
|
|
52
|
+
})();
|
|
53
|
+
export function unindent(strings, ...values) {
|
|
54
|
+
const lines = trimLeft(interpolate(strings, values)).split("\n");
|
|
55
|
+
const match = lines[0].match(/^\s+/);
|
|
56
|
+
const indent = match ? match[0].length : 0;
|
|
57
|
+
return lines.map((line) => line.slice(indent)).join("\n");
|
|
58
|
+
}
|
|
59
|
+
function trimLeft(string) {
|
|
60
|
+
return string.replace(/^\n/, "");
|
|
61
|
+
}
|
|
62
|
+
function interpolate(strings, values) {
|
|
63
|
+
return strings.reduce((result, string, i) => {
|
|
64
|
+
const value = values[i] == undefined ? "" : values[i];
|
|
65
|
+
return result + string + value;
|
|
66
|
+
}, "");
|
|
67
|
+
}
|
|
68
|
+
export function uuid() {
|
|
69
|
+
return Array.apply(null, { length: 36 })
|
|
70
|
+
.map((_, i) => {
|
|
71
|
+
if (i == 8 || i == 13 || i == 18 || i == 23) {
|
|
72
|
+
return "-";
|
|
73
|
+
}
|
|
74
|
+
else if (i == 14) {
|
|
75
|
+
return "4";
|
|
76
|
+
}
|
|
77
|
+
else if (i == 19) {
|
|
78
|
+
return (Math.floor(Math.random() * 4) + 8).toString(16);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
return Math.floor(Math.random() * 15).toString(16);
|
|
82
|
+
}
|
|
83
|
+
})
|
|
84
|
+
.join("");
|
|
85
|
+
}
|
|
86
|
+
export function createScriptElement(element, cb) {
|
|
87
|
+
if (element.getAttribute("data-turbolinks-eval") == "false") {
|
|
88
|
+
return element;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
const createdScriptElement = document.createElement("script");
|
|
92
|
+
createdScriptElement.textContent = element.textContent;
|
|
93
|
+
// async false makes scripts run in-order. it wont block js execution (thankfully)
|
|
94
|
+
// https://github.com/turbolinks/turbolinks/issues/282#issuecomment-355731712
|
|
95
|
+
createdScriptElement.async = false;
|
|
96
|
+
copyElementAttributes(createdScriptElement, element);
|
|
97
|
+
if (cb) {
|
|
98
|
+
createdScriptElement.addEventListener("load", cb);
|
|
99
|
+
}
|
|
100
|
+
return createdScriptElement;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
export function copyElementAttributes(destinationElement, sourceElement) {
|
|
104
|
+
for (const { name, value } of array(sourceElement.attributes)) {
|
|
105
|
+
destinationElement.setAttribute(name, value);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function replaceElementWithElement(fromElement, toElement) {
|
|
109
|
+
const parentElement = fromElement.parentElement;
|
|
110
|
+
if (parentElement) {
|
|
111
|
+
return parentElement.replaceChild(toElement, fromElement);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export function activateNewBodyScriptElements(newScriptElements) {
|
|
115
|
+
for (const inertScriptElement of newScriptElements) {
|
|
116
|
+
const activatedScriptElement = createScriptElement(inertScriptElement);
|
|
117
|
+
replaceElementWithElement(inertScriptElement, activatedScriptElement);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export function focusFirstAutofocusableElement() {
|
|
121
|
+
const element = document.body.querySelector("[autofocus]");
|
|
122
|
+
if (element && "focus" in element && typeof element.focus === "function") {
|
|
123
|
+
element.focus();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Adapter } from "./adapter";
|
|
2
|
+
import { Controller } from "./controller.js";
|
|
3
|
+
import { Location } from "./location";
|
|
4
|
+
import { Action } from "./types";
|
|
5
|
+
export declare enum TimingMetric {
|
|
6
|
+
visitStart = "visitStart",
|
|
7
|
+
requestStart = "requestStart",
|
|
8
|
+
requestEnd = "requestEnd",
|
|
9
|
+
visitEnd = "visitEnd"
|
|
10
|
+
}
|
|
11
|
+
export type TimingMetrics = Partial<{
|
|
12
|
+
[metric in TimingMetric]: any;
|
|
13
|
+
}>;
|
|
14
|
+
export declare enum VisitState {
|
|
15
|
+
initialized = "initialized",
|
|
16
|
+
started = "started",
|
|
17
|
+
canceled = "canceled",
|
|
18
|
+
failed = "failed",
|
|
19
|
+
completed = "completed"
|
|
20
|
+
}
|
|
21
|
+
export declare class Visit {
|
|
22
|
+
readonly controller: Controller;
|
|
23
|
+
readonly action: Action;
|
|
24
|
+
readonly adapter: Adapter;
|
|
25
|
+
readonly identifier: string;
|
|
26
|
+
readonly restorationIdentifier: string;
|
|
27
|
+
readonly timingMetrics: TimingMetrics;
|
|
28
|
+
frame?: number;
|
|
29
|
+
location: Location;
|
|
30
|
+
progress: number;
|
|
31
|
+
referrer?: Location;
|
|
32
|
+
redirectedToLocation?: Location;
|
|
33
|
+
snapshotCached: boolean;
|
|
34
|
+
state: VisitState;
|
|
35
|
+
requestInFlight: boolean;
|
|
36
|
+
renderFn?: () => Promise<void>;
|
|
37
|
+
constructor(controller: Controller, location: Location, action: Action, restorationIdentifier?: string);
|
|
38
|
+
start(): void;
|
|
39
|
+
cancel(): void;
|
|
40
|
+
complete(): void;
|
|
41
|
+
fail(): void;
|
|
42
|
+
changeHistory(): void;
|
|
43
|
+
issueRequest(): void;
|
|
44
|
+
getCachedSnapshot(): import("./controller.js").Snapshot | undefined;
|
|
45
|
+
hasCachedSnapshot(): boolean;
|
|
46
|
+
loadCachedSnapshot(): void;
|
|
47
|
+
loadResponse(): void;
|
|
48
|
+
recordTimingMetric(metric: TimingMetric): void;
|
|
49
|
+
getTimingMetrics(): TimingMetrics;
|
|
50
|
+
shouldIssueRequest(): boolean;
|
|
51
|
+
cacheSnapshot(): void;
|
|
52
|
+
render(callback: () => Promise<void>): void;
|
|
53
|
+
cancelRender(): void;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=visit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visit.d.ts","sourceRoot":"","sources":["../../../lib/turbolinks/visit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,oBAAY,YAAY;IACtB,UAAU,eAAe;IACzB,YAAY,iBAAiB;IAC7B,UAAU,eAAe;IACzB,QAAQ,aAAa;CACtB;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC;KAAG,MAAM,IAAI,YAAY,GAAG,GAAG;CAAE,CAAC,CAAC;AAEvE,oBAAY,UAAU;IACpB,WAAW,gBAAgB;IAC3B,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,MAAM,WAAW;IACjB,SAAS,cAAc;CACxB;AAED,qBAAa,KAAK;IAChB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,SAAU;IAC7B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAM;IAE3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,SAAK;IACb,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,oBAAoB,CAAC,EAAE,QAAQ,CAAC;IAChC,cAAc,UAAS;IACvB,KAAK,aAA0B;IAE/B,eAAe,UAAS;IACxB,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;gBAG7B,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,qBAAqB,GAAE,MAAe;IASxC,KAAK;IAQL,MAAM;IAQN,QAAQ;IASR,IAAI;IAOJ,aAAa;IAKb,YAAY;IAgBZ,iBAAiB;IAWjB,iBAAiB;IAIjB,kBAAkB;IAKlB,YAAY;IA+CZ,kBAAkB,CAAC,MAAM,EAAE,YAAY;IAIvC,gBAAgB,IAAI,aAAa;IAMjC,kBAAkB;IAIlB,aAAa;IAOb,MAAM,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;IAQpC,YAAY;CAMb"}
|