@alignable/bifrost 0.0.9 → 0.0.10

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.
Files changed (75) hide show
  1. package/dist/lib/turbolinks/adapter.d.ts +17 -0
  2. package/dist/lib/turbolinks/adapter.d.ts.map +1 -0
  3. package/dist/lib/turbolinks/adapter.js +1 -0
  4. package/dist/lib/turbolinks/browser_adapter.d.ts +28 -0
  5. package/dist/lib/turbolinks/browser_adapter.d.ts.map +1 -0
  6. package/dist/lib/turbolinks/browser_adapter.js +71 -0
  7. package/dist/lib/turbolinks/controller.d.ts +101 -0
  8. package/dist/lib/turbolinks/controller.d.ts.map +1 -0
  9. package/dist/lib/turbolinks/controller.js +290 -0
  10. package/dist/lib/turbolinks/head_details.d.ts +23 -0
  11. package/dist/lib/turbolinks/head_details.d.ts.map +1 -0
  12. package/dist/lib/turbolinks/head_details.js +92 -0
  13. package/dist/lib/turbolinks/history.d.ts +22 -0
  14. package/dist/lib/turbolinks/history.d.ts.map +1 -0
  15. package/dist/lib/turbolinks/history.js +60 -0
  16. package/dist/lib/turbolinks/index.d.ts +14 -0
  17. package/dist/lib/turbolinks/index.d.ts.map +1 -0
  18. package/dist/lib/turbolinks/index.js +55 -0
  19. package/dist/lib/turbolinks/location.d.ts +23 -0
  20. package/dist/lib/turbolinks/location.d.ts.map +1 -0
  21. package/dist/lib/turbolinks/location.js +75 -0
  22. package/dist/lib/turbolinks/namespace.d.ts +12 -0
  23. package/dist/lib/turbolinks/namespace.d.ts.map +1 -0
  24. package/dist/lib/turbolinks/namespace.js +20 -0
  25. package/dist/lib/turbolinks/passthrough_renderer.d.ts +32 -0
  26. package/dist/lib/turbolinks/passthrough_renderer.d.ts.map +1 -0
  27. package/dist/lib/turbolinks/passthrough_renderer.js +128 -0
  28. package/dist/lib/turbolinks/progress_bar.d.ts +24 -0
  29. package/dist/lib/turbolinks/progress_bar.d.ts.map +1 -0
  30. package/dist/lib/turbolinks/progress_bar.js +99 -0
  31. package/dist/lib/turbolinks/renderer.d.ts +14 -0
  32. package/dist/lib/turbolinks/renderer.d.ts.map +1 -0
  33. package/dist/lib/turbolinks/renderer.js +28 -0
  34. package/dist/lib/turbolinks/scroll_manager.d.ts +16 -0
  35. package/dist/lib/turbolinks/scroll_manager.d.ts.map +1 -0
  36. package/dist/lib/turbolinks/scroll_manager.js +32 -0
  37. package/dist/lib/turbolinks/snapshot.d.ts +25 -0
  38. package/dist/lib/turbolinks/snapshot.d.ts.map +1 -0
  39. package/dist/lib/turbolinks/snapshot.js +77 -0
  40. package/dist/lib/turbolinks/snapshot_cache.d.ts +18 -0
  41. package/dist/lib/turbolinks/snapshot_cache.d.ts.map +1 -0
  42. package/dist/lib/turbolinks/snapshot_cache.js +42 -0
  43. package/dist/lib/turbolinks/snapshot_renderer copy.d.ts +45 -0
  44. package/dist/lib/turbolinks/snapshot_renderer copy.d.ts.map +1 -0
  45. package/dist/lib/turbolinks/snapshot_renderer copy.js +179 -0
  46. package/dist/lib/turbolinks/snapshot_renderer.d.ts +43 -0
  47. package/dist/lib/turbolinks/snapshot_renderer.d.ts.map +1 -0
  48. package/dist/lib/turbolinks/snapshot_renderer.js +139 -0
  49. package/dist/lib/turbolinks/types.d.ts +7 -0
  50. package/dist/lib/turbolinks/types.d.ts.map +1 -0
  51. package/dist/lib/turbolinks/types.js +3 -0
  52. package/dist/lib/turbolinks/util.d.ts +14 -0
  53. package/dist/lib/turbolinks/util.d.ts.map +1 -0
  54. package/dist/lib/turbolinks/util.js +85 -0
  55. package/dist/lib/turbolinks/view.d.ts +21 -0
  56. package/dist/lib/turbolinks/view.d.ts.map +1 -0
  57. package/dist/lib/turbolinks/view.js +42 -0
  58. package/dist/lib/turbolinks/visit.d.ts +73 -0
  59. package/dist/lib/turbolinks/visit.d.ts.map +1 -0
  60. package/dist/lib/turbolinks/visit.js +227 -0
  61. package/dist/renderer/+config.d.ts +6 -0
  62. package/dist/renderer/+config.d.ts.map +1 -1
  63. package/dist/renderer/+config.js +3 -1
  64. package/dist/renderer/onBeforeRoute.d.ts +1 -1
  65. package/dist/renderer/onRenderClient.d.ts.map +1 -1
  66. package/dist/renderer/onRenderClient.js +7 -1
  67. package/dist/renderer/onRenderHtml.d.ts.map +1 -1
  68. package/dist/renderer/onRenderHtml.js +9 -1
  69. package/dist/renderer/utils/formatMetaObject.d.ts +4 -0
  70. package/dist/renderer/utils/formatMetaObject.d.ts.map +1 -0
  71. package/dist/renderer/utils/formatMetaObject.js +3 -0
  72. package/package.json +1 -1
  73. package/dist/proxy/pages/onPageTransitionEnd.d.ts +0 -3
  74. package/dist/proxy/pages/onPageTransitionEnd.d.ts.map +0 -1
  75. package/dist/proxy/pages/onPageTransitionEnd.js +0 -3
@@ -0,0 +1,60 @@
1
+ import { Location } from "./location";
2
+ import { defer } from "./util";
3
+ export class History {
4
+ constructor(delegate) {
5
+ this.started = false;
6
+ this.pageLoaded = false;
7
+ // Event handlers
8
+ this.onPopState = (event) => {
9
+ // return
10
+ if (!this.shouldHandlePopState())
11
+ return;
12
+ if (!event.state)
13
+ return;
14
+ const { turbolinks } = event.state;
15
+ if (!turbolinks)
16
+ return;
17
+ const location = Location.currentLocation;
18
+ const { restorationIdentifier } = turbolinks;
19
+ this.delegate.historyPoppedToLocationWithRestorationIdentifier(location, restorationIdentifier);
20
+ };
21
+ this.onPageLoad = (event) => {
22
+ defer(() => {
23
+ this.pageLoaded = true;
24
+ });
25
+ };
26
+ this.delegate = delegate;
27
+ }
28
+ start() {
29
+ if (!this.started) {
30
+ addEventListener("popstate", this.onPopState, false);
31
+ addEventListener("load", this.onPageLoad, false);
32
+ this.started = true;
33
+ }
34
+ }
35
+ stop() {
36
+ if (this.started) {
37
+ removeEventListener("popstate", this.onPopState, false);
38
+ removeEventListener("load", this.onPageLoad, false);
39
+ this.started = false;
40
+ }
41
+ }
42
+ push(location, restorationIdentifier) {
43
+ this.update(history.pushState, location, restorationIdentifier);
44
+ }
45
+ replace(location, restorationIdentifier) {
46
+ this.update(history.replaceState, location, restorationIdentifier);
47
+ }
48
+ // Private
49
+ shouldHandlePopState() {
50
+ // Safari dispatches a popstate event after window's load event, ignore it
51
+ return this.pageIsLoaded();
52
+ }
53
+ pageIsLoaded() {
54
+ return this.pageLoaded || document.readyState == "complete";
55
+ }
56
+ update(method, location, restorationIdentifier) {
57
+ const state = { turbolinks: { restorationIdentifier } };
58
+ method.call(history, state, "", location.absoluteURL);
59
+ }
60
+ }
@@ -0,0 +1,14 @@
1
+ import { Controller, VisitOptions } from "./controller";
2
+ import { Locatable } from "./location";
3
+ import { Renderer } from "./renderer";
4
+ export declare const Turbolinks: {
5
+ readonly supported: boolean;
6
+ controller: Controller;
7
+ visit(location: Locatable, options?: Partial<VisitOptions>): void;
8
+ clearCache(): void;
9
+ setProgressBarDelay(delay: number): void;
10
+ start(): void;
11
+ _vpsRenderClientWith(renderer: Renderer): void;
12
+ _vpsOnRenderClient(renderFn: () => Promise<void>): void;
13
+ };
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/turbolinks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,eAAO,MAAM,UAAU;;;oBAOL,SAAS,YAAY,QAAQ,YAAY,CAAC;;+BAQ/B,MAAM;;mCAmBF,QAAQ;iCAaV,MAAM,QAAQ,IAAI,CAAC;CAgBjD,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { Controller } from "./controller";
2
+ const controller = new Controller();
3
+ export const Turbolinks = {
4
+ get supported() {
5
+ return Controller.supported;
6
+ },
7
+ controller,
8
+ visit(location, options) {
9
+ controller.visit(location, options);
10
+ },
11
+ clearCache() {
12
+ controller.clearCache();
13
+ },
14
+ setProgressBarDelay(delay) {
15
+ controller.setProgressBarDelay(delay);
16
+ },
17
+ start() {
18
+ // because this runs after ios hooks, we have to recover. See onRenderHtml
19
+ if (window.Turbolinks !== Turbolinks &&
20
+ window.Turbolinks.controller.adapter) {
21
+ console.log(window.Turbolinks, Turbolinks);
22
+ window.Turbolinks.controller.adapter.controller = controller;
23
+ controller.adapter = window.Turbolinks.controller.adapter;
24
+ console.log(window.Turbolinks, Turbolinks);
25
+ window.Turbolinks = Turbolinks;
26
+ }
27
+ controller.start();
28
+ },
29
+ _vpsRenderClientWith(renderer) {
30
+ if (controller.currentVisit) {
31
+ // TODO: move to controller
32
+ controller.currentVisit.renderer = renderer;
33
+ controller.adapter.visitRequestCompleted(controller.currentVisit);
34
+ controller.adapter.visitRequestFinished(controller.currentVisit);
35
+ }
36
+ else {
37
+ console.error("controller.currentVisit should exist when onRenderClient fires");
38
+ }
39
+ },
40
+ _vpsOnRenderClient(renderFn) {
41
+ if (controller.currentVisit) {
42
+ // TODO: move to controller
43
+ controller.currentVisit.renderFn = async () => {
44
+ controller.viewWillRender();
45
+ await renderFn();
46
+ controller.viewRendered();
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,12 @@
1
+ import { Controller, VisitOptions } from "./controller";
2
+ import { Locatable } from "./location";
3
+ declare const _default: {
4
+ readonly supported: boolean;
5
+ controller: Controller;
6
+ visit(location: Locatable, options?: Partial<VisitOptions>): void;
7
+ clearCache(): void;
8
+ setProgressBarDelay(delay: number): void;
9
+ start(): void;
10
+ };
11
+ export default _default;
12
+ //# sourceMappingURL=namespace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../../lib/turbolinks/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;;;;oBAWrB,SAAS,YAAY,QAAQ,YAAY,CAAC;;+BAQ/B,MAAM;;;AAfnC,wBAsBE"}
@@ -0,0 +1,20 @@
1
+ import { Controller } from "./controller";
2
+ const controller = new Controller();
3
+ export default {
4
+ get supported() {
5
+ return Controller.supported;
6
+ },
7
+ controller,
8
+ visit(location, options) {
9
+ controller.visit(location, options);
10
+ },
11
+ clearCache() {
12
+ controller.clearCache();
13
+ },
14
+ setProgressBarDelay(delay) {
15
+ controller.setProgressBarDelay(delay);
16
+ },
17
+ start() {
18
+ controller.start();
19
+ },
20
+ };
@@ -0,0 +1,32 @@
1
+ import { HeadDetails } from "./head_details";
2
+ import { Renderer, RenderDelegate, RenderCallback } from "./renderer";
3
+ export type PermanentElement = Element & {
4
+ id: string;
5
+ };
6
+ export type Placeholder = {
7
+ element: Element;
8
+ permanentElement: PermanentElement;
9
+ };
10
+ type BodyRenderer = () => void;
11
+ export declare class PassthruRenderer extends Renderer {
12
+ delegate?: RenderDelegate;
13
+ readonly currentHeadDetails: HeadDetails;
14
+ readonly newHeadDetails: HeadDetails;
15
+ renderBody: BodyRenderer;
16
+ constructor(currentHeadDetails: HeadDetails, newHeadDetails: HeadDetails, renderBody: BodyRenderer);
17
+ render(delegate: RenderDelegate, callback: RenderCallback): Promise<void>;
18
+ mergeHead(): Promise<void>;
19
+ shouldRender(): boolean;
20
+ trackedElementsAreIdentical(): boolean;
21
+ copyNewHeadStylesheetElements(): void;
22
+ copyNewHeadScriptElements(onScriptsLoaded: () => void): void;
23
+ removeCurrentHeadProvisionalElements(): void;
24
+ copyNewHeadProvisionalElements(): void;
25
+ focusFirstAutofocusableElement(): void;
26
+ getNewHeadStylesheetElements(): any;
27
+ getNewHeadScriptElements(): HTMLScriptElement[];
28
+ getCurrentHeadProvisionalElements(): any;
29
+ getNewHeadProvisionalElements(): any;
30
+ }
31
+ export {};
32
+ //# sourceMappingURL=passthrough_renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passthrough_renderer.d.ts","sourceRoot":"","sources":["../../../lib/turbolinks/passthrough_renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAItE,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,CAAC;AAEF,KAAK,YAAY,GAAG,MAAM,IAAI,CAAC;AAK/B,qBAAa,gBAAiB,SAAQ,QAAQ;IAC5C,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IACrC,UAAU,EAAE,YAAY,CAAC;gBAGvB,kBAAkB,EAAE,WAAW,EAC/B,cAAc,EAAE,WAAW,EAC3B,UAAU,EAAE,YAAY;IAQpB,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc;IAazD,SAAS;IAmBf,YAAY;IAIZ,2BAA2B;IAO3B,6BAA6B;IAM7B,yBAAyB,CAAC,eAAe,EAAE,MAAM,IAAI;IAmCrD,oCAAoC;IAMpC,8BAA8B;IAM9B,8BAA8B;IAO9B,4BAA4B;IAM5B,wBAAwB;IAMxB,iCAAiC;IAIjC,6BAA6B;CAG9B"}
@@ -0,0 +1,128 @@
1
+ import { Renderer } from "./renderer";
2
+ import { createScriptElement } from "./util";
3
+ const allHeadScriptsEverRun = {};
4
+ let firstLoad = true;
5
+ export class PassthruRenderer extends Renderer {
6
+ constructor(currentHeadDetails, newHeadDetails, renderBody) {
7
+ super();
8
+ this.currentHeadDetails = currentHeadDetails;
9
+ this.newHeadDetails = newHeadDetails;
10
+ this.renderBody = renderBody;
11
+ }
12
+ async render(delegate, callback) {
13
+ this.delegate = delegate;
14
+ if (this.shouldRender()) {
15
+ const scriptsLoaded = this.mergeHead();
16
+ this.renderBody();
17
+ this.focusFirstAutofocusableElement();
18
+ await scriptsLoaded;
19
+ callback();
20
+ }
21
+ else {
22
+ this.invalidateView();
23
+ }
24
+ }
25
+ async mergeHead() {
26
+ if (firstLoad) {
27
+ // TODO: messy code
28
+ for (const [outerHTML, details] of Object.entries(this.currentHeadDetails.detailsByOuterHTML)) {
29
+ allHeadScriptsEverRun[outerHTML] = true;
30
+ }
31
+ }
32
+ firstLoad = false;
33
+ return new Promise((resolve) => {
34
+ this.copyNewHeadStylesheetElements();
35
+ this.copyNewHeadScriptElements(resolve);
36
+ this.removeCurrentHeadProvisionalElements();
37
+ this.copyNewHeadProvisionalElements();
38
+ });
39
+ }
40
+ shouldRender() {
41
+ return true;
42
+ }
43
+ trackedElementsAreIdentical() {
44
+ return (this.currentHeadDetails.getTrackedElementSignature() ==
45
+ this.newHeadDetails.getTrackedElementSignature());
46
+ }
47
+ copyNewHeadStylesheetElements() {
48
+ for (const element of this.getNewHeadStylesheetElements()) {
49
+ document.head.appendChild(element);
50
+ }
51
+ }
52
+ copyNewHeadScriptElements(onScriptsLoaded) {
53
+ let blockingLoaded = [];
54
+ const dispatch = () => {
55
+ this.focusFirstAutofocusableElement();
56
+ onScriptsLoaded();
57
+ };
58
+ for (const element of this.getNewHeadScriptElements()) {
59
+ const runBefore = element.outerHTML in allHeadScriptsEverRun;
60
+ if (!runBefore) {
61
+ let cb = false;
62
+ if (!element.defer && element.src) {
63
+ const idx = blockingLoaded.length;
64
+ cb = () => {
65
+ blockingLoaded[idx] = true;
66
+ if (blockingLoaded.every((v) => v)) {
67
+ dispatch();
68
+ }
69
+ };
70
+ blockingLoaded.push(false);
71
+ }
72
+ const script = createScriptElement(element);
73
+ if (cb) {
74
+ script.addEventListener("load", cb);
75
+ }
76
+ document.head.appendChild(script);
77
+ allHeadScriptsEverRun[element.outerHTML] = true;
78
+ }
79
+ }
80
+ if (blockingLoaded.length === 0) {
81
+ // //TODO: raf waits for react to finish... not 100% sure of the reliability
82
+ requestAnimationFrame(dispatch);
83
+ }
84
+ }
85
+ removeCurrentHeadProvisionalElements() {
86
+ for (const element of this.getCurrentHeadProvisionalElements()) {
87
+ document.head.removeChild(element);
88
+ }
89
+ }
90
+ copyNewHeadProvisionalElements() {
91
+ for (const element of this.getNewHeadProvisionalElements()) {
92
+ document.head.appendChild(element);
93
+ }
94
+ }
95
+ focusFirstAutofocusableElement() {
96
+ const element = document.body.querySelector("[autofocus]");
97
+ if (element && "focus" in element && typeof element.focus === "function") {
98
+ element.focus();
99
+ }
100
+ }
101
+ getNewHeadStylesheetElements() {
102
+ return this.newHeadDetails.getStylesheetElementsNotInDetails(this.currentHeadDetails);
103
+ }
104
+ getNewHeadScriptElements() {
105
+ return this.newHeadDetails.getScriptElementsNotInDetails(this.currentHeadDetails);
106
+ }
107
+ getCurrentHeadProvisionalElements() {
108
+ return this.currentHeadDetails.getProvisionalElements();
109
+ }
110
+ getNewHeadProvisionalElements() {
111
+ return this.newHeadDetails.getProvisionalElements();
112
+ }
113
+ }
114
+ function createPlaceholderForPermanentElement(permanentElement) {
115
+ const element = document.createElement("meta");
116
+ element.setAttribute("name", "turbolinks-permanent-placeholder");
117
+ element.setAttribute("content", permanentElement.id);
118
+ return { element, permanentElement };
119
+ }
120
+ function replaceElementWithElement(fromElement, toElement) {
121
+ const parentElement = fromElement.parentElement;
122
+ if (parentElement) {
123
+ return parentElement.replaceChild(toElement, fromElement);
124
+ }
125
+ }
126
+ function elementIsFocusable(element) {
127
+ return element && typeof element.focus == "function";
128
+ }
@@ -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,14 @@
1
+ export type RenderCallback = () => void;
2
+ export interface RenderDelegate {
3
+ viewWillRender(newBody: HTMLBodyElement): void;
4
+ viewRendered(newBody: HTMLBodyElement): void;
5
+ viewInvalidated(): void;
6
+ }
7
+ export declare abstract class Renderer {
8
+ abstract delegate: RenderDelegate;
9
+ abstract newBody: HTMLBodyElement;
10
+ renderView(callback: RenderCallback): void;
11
+ invalidateView(): void;
12
+ createScriptElement(element: Element): Element;
13
+ }
14
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../lib/turbolinks/renderer.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC;AAExC,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/C,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAC7C,eAAe,IAAI,IAAI,CAAC;CACzB;AAED,8BAAsB,QAAQ;IAC5B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAElC,UAAU,CAAC,QAAQ,EAAE,cAAc;IAMnC,cAAc;IAId,mBAAmB,CAAC,OAAO,EAAE,OAAO;CAWrC"}
@@ -0,0 +1,28 @@
1
+ import { array } from "./util";
2
+ export class Renderer {
3
+ renderView(callback) {
4
+ this.delegate.viewWillRender(this.newBody);
5
+ callback();
6
+ this.delegate.viewRendered(this.newBody);
7
+ }
8
+ invalidateView() {
9
+ this.delegate.viewInvalidated();
10
+ }
11
+ createScriptElement(element) {
12
+ if (element.getAttribute("data-turbolinks-eval") == "false") {
13
+ return element;
14
+ }
15
+ else {
16
+ const createdScriptElement = document.createElement("script");
17
+ createdScriptElement.textContent = element.textContent;
18
+ createdScriptElement.async = false;
19
+ copyElementAttributes(createdScriptElement, element);
20
+ return createdScriptElement;
21
+ }
22
+ }
23
+ }
24
+ function copyElementAttributes(destinationElement, sourceElement) {
25
+ for (const { name, value } of array(sourceElement.attributes)) {
26
+ destinationElement.setAttribute(name, value);
27
+ }
28
+ }
@@ -0,0 +1,16 @@
1
+ import { Position } from "./types";
2
+ export interface ScrollManagerDelegate {
3
+ scrollPositionChanged(position: Position): void;
4
+ }
5
+ export declare class ScrollManager {
6
+ readonly delegate: ScrollManagerDelegate;
7
+ started: boolean;
8
+ constructor(delegate: ScrollManagerDelegate);
9
+ start(): void;
10
+ stop(): void;
11
+ scrollToElement(element: Element): void;
12
+ scrollToPosition({ x, y }: Position): void;
13
+ onScroll: () => void;
14
+ updatePosition(position: Position): void;
15
+ }
16
+ //# sourceMappingURL=scroll_manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll_manager.d.ts","sourceRoot":"","sources":["../../../lib/turbolinks/scroll_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,MAAM,WAAW,qBAAqB;IACpC,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;CACjD;AAED,qBAAa,aAAa;IACxB,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;IACzC,OAAO,UAAS;gBAEJ,QAAQ,EAAE,qBAAqB;IAI3C,KAAK;IAQL,IAAI;IAOJ,eAAe,CAAC,OAAO,EAAE,OAAO;IAIhC,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ;IAInC,QAAQ,aAEN;IAIF,cAAc,CAAC,QAAQ,EAAE,QAAQ;CAGlC"}
@@ -0,0 +1,32 @@
1
+ export class ScrollManager {
2
+ constructor(delegate) {
3
+ this.started = false;
4
+ this.onScroll = () => {
5
+ this.updatePosition({ x: window.pageXOffset, y: window.pageYOffset });
6
+ };
7
+ this.delegate = delegate;
8
+ }
9
+ start() {
10
+ if (!this.started) {
11
+ addEventListener("scroll", this.onScroll, false);
12
+ this.onScroll();
13
+ this.started = true;
14
+ }
15
+ }
16
+ stop() {
17
+ if (this.started) {
18
+ removeEventListener("scroll", this.onScroll, false);
19
+ this.started = false;
20
+ }
21
+ }
22
+ scrollToElement(element) {
23
+ element.scrollIntoView();
24
+ }
25
+ scrollToPosition({ x, y }) {
26
+ window.scrollTo(x, y);
27
+ }
28
+ // Private
29
+ updatePosition(position) {
30
+ this.delegate.scrollPositionChanged(position);
31
+ }
32
+ }