@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,25 @@
1
+ import { HeadDetails } from "./head_details";
2
+ import { Location } from "./location";
3
+ export declare class Snapshot {
4
+ static wrap(value: Snapshot | string | HTMLHtmlElement): Snapshot;
5
+ static fromHTMLString(html: string): Snapshot;
6
+ static fromHTMLElement(htmlElement: HTMLHtmlElement): Snapshot;
7
+ readonly headDetails: HeadDetails;
8
+ readonly bodyElement: HTMLBodyElement;
9
+ constructor(headDetails: HeadDetails, bodyElement: HTMLBodyElement);
10
+ clone(): Snapshot;
11
+ getRootLocation(): Location;
12
+ getCacheControlValue(): string | undefined;
13
+ getElementForAnchor(anchor: string): Element | null;
14
+ getPermanentElements(): Element[];
15
+ getPermanentElementById(id: string): Element | null;
16
+ getPermanentElementsPresentInSnapshot(snapshot: Snapshot): Element[];
17
+ findFirstAutofocusableElement(): Element | null;
18
+ hasAnchor(anchor: string): boolean;
19
+ isPreviewable(): boolean;
20
+ isCacheable(): boolean;
21
+ isVisitable(): boolean;
22
+ getSetting(name: string): string | undefined;
23
+ getSetting(name: string, defaultValue: string): string;
24
+ }
25
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../lib/turbolinks/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,qBAAa,QAAQ;IACnB,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,eAAe;IAUtD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM;IAMlC,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,eAAe;IAQnD,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;gBAE1B,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe;IAKlE,KAAK,IAAI,QAAQ;IAOjB,eAAe;IAKf,oBAAoB;IAIpB,mBAAmB,CAAC,MAAM,EAAE,MAAM;IAUlC,oBAAoB;IAMpB,uBAAuB,CAAC,EAAE,EAAE,MAAM;IAIlC,qCAAqC,CAAC,QAAQ,EAAE,QAAQ;IAMxD,6BAA6B;IAI7B,SAAS,CAAC,MAAM,EAAE,MAAM;IAIxB,aAAa;IAIb,WAAW;IAIX,WAAW;IAMX,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAC5C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;CAKvD"}
@@ -0,0 +1,77 @@
1
+ import { HeadDetails } from "./head_details";
2
+ import { Location } from "./location";
3
+ import { array } from "./util";
4
+ export class Snapshot {
5
+ static wrap(value) {
6
+ if (value instanceof this) {
7
+ return value;
8
+ }
9
+ else if (typeof value == "string") {
10
+ return this.fromHTMLString(value);
11
+ }
12
+ else {
13
+ return this.fromHTMLElement(value);
14
+ }
15
+ }
16
+ static fromHTMLString(html) {
17
+ const element = document.createElement("html");
18
+ element.innerHTML = html;
19
+ return this.fromHTMLElement(element);
20
+ }
21
+ static fromHTMLElement(htmlElement) {
22
+ const headElement = htmlElement.querySelector("head");
23
+ const bodyElement = htmlElement.querySelector("body") || document.createElement("body");
24
+ const headDetails = HeadDetails.fromHeadElement(headElement);
25
+ return new this(headDetails, bodyElement);
26
+ }
27
+ constructor(headDetails, bodyElement) {
28
+ this.headDetails = headDetails;
29
+ this.bodyElement = bodyElement;
30
+ }
31
+ clone() {
32
+ return new Snapshot(this.headDetails, this.bodyElement.cloneNode(true));
33
+ }
34
+ getRootLocation() {
35
+ const root = this.getSetting("root", "/");
36
+ return new Location(root);
37
+ }
38
+ getCacheControlValue() {
39
+ return this.getSetting("cache-control");
40
+ }
41
+ getElementForAnchor(anchor) {
42
+ try {
43
+ return this.bodyElement.querySelector(`[id='${anchor}'], a[name='${anchor}']`);
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ getPermanentElements() {
50
+ return array(this.bodyElement.querySelectorAll("[id][data-turbolinks-permanent]"));
51
+ }
52
+ getPermanentElementById(id) {
53
+ return this.bodyElement.querySelector(`#${id}[data-turbolinks-permanent]`);
54
+ }
55
+ getPermanentElementsPresentInSnapshot(snapshot) {
56
+ return this.getPermanentElements().filter(({ id }) => snapshot.getPermanentElementById(id));
57
+ }
58
+ findFirstAutofocusableElement() {
59
+ return this.bodyElement.querySelector("[autofocus]");
60
+ }
61
+ hasAnchor(anchor) {
62
+ return this.getElementForAnchor(anchor) != null;
63
+ }
64
+ isPreviewable() {
65
+ return this.getCacheControlValue() != "no-preview";
66
+ }
67
+ isCacheable() {
68
+ return this.getCacheControlValue() != "no-cache";
69
+ }
70
+ isVisitable() {
71
+ return this.getSetting("visit-control") != "reload";
72
+ }
73
+ getSetting(name, defaultValue) {
74
+ const value = this.headDetails.getMetaValue(`turbolinks-${name}`);
75
+ return value == null ? defaultValue : value;
76
+ }
77
+ }
@@ -0,0 +1,18 @@
1
+ import { Location } from "./location";
2
+ import { Snapshot } from "./snapshot";
3
+ export declare class SnapshotCache {
4
+ readonly keys: string[];
5
+ readonly snapshots: {
6
+ [url: string]: Snapshot;
7
+ };
8
+ readonly size: number;
9
+ constructor(size: number);
10
+ has(location: Location): boolean;
11
+ get(location: Location): Snapshot | undefined;
12
+ put(location: Location, snapshot: Snapshot): Snapshot;
13
+ read(location: Location): Snapshot;
14
+ write(location: Location, snapshot: Snapshot): void;
15
+ touch(location: Location): void;
16
+ trim(): void;
17
+ }
18
+ //# sourceMappingURL=snapshot_cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot_cache.d.ts","sourceRoot":"","sources":["../../../lib/turbolinks/snapshot_cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,qBAAa,aAAa;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAM;IAC7B,QAAQ,CAAC,SAAS,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAA;KAAE,CAAM;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM;IAIxB,GAAG,CAAC,QAAQ,EAAE,QAAQ;IAItB,GAAG,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS;IAQ7C,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;IAQ1C,IAAI,CAAC,QAAQ,EAAE,QAAQ;IAIvB,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;IAI5C,KAAK,CAAC,QAAQ,EAAE,QAAQ;IAQxB,IAAI;CAKL"}
@@ -0,0 +1,42 @@
1
+ export class SnapshotCache {
2
+ constructor(size) {
3
+ this.keys = [];
4
+ this.snapshots = {};
5
+ this.size = size;
6
+ }
7
+ has(location) {
8
+ return location.toCacheKey() in this.snapshots;
9
+ }
10
+ get(location) {
11
+ if (this.has(location)) {
12
+ const snapshot = this.read(location);
13
+ this.touch(location);
14
+ return snapshot;
15
+ }
16
+ }
17
+ put(location, snapshot) {
18
+ this.write(location, snapshot);
19
+ this.touch(location);
20
+ return snapshot;
21
+ }
22
+ // Private
23
+ read(location) {
24
+ return this.snapshots[location.toCacheKey()];
25
+ }
26
+ write(location, snapshot) {
27
+ this.snapshots[location.toCacheKey()] = snapshot;
28
+ }
29
+ touch(location) {
30
+ const key = location.toCacheKey();
31
+ const index = this.keys.indexOf(key);
32
+ if (index > -1)
33
+ this.keys.splice(index, 1);
34
+ this.keys.unshift(key);
35
+ this.trim();
36
+ }
37
+ trim() {
38
+ for (const key of this.keys.splice(this.size)) {
39
+ delete this.snapshots[key];
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,45 @@
1
+ import { HeadDetails } from "./head_details";
2
+ import { Renderer, RenderDelegate, RenderCallback } from "./renderer";
3
+ import { Snapshot } from "./snapshot";
4
+ export type PermanentElement = Element & {
5
+ id: string;
6
+ };
7
+ export type Placeholder = {
8
+ element: Element;
9
+ permanentElement: PermanentElement;
10
+ };
11
+ type BodyRenderer = (body: string) => void;
12
+ export declare class SnapshotRenderer extends Renderer {
13
+ delegate?: RenderDelegate;
14
+ readonly currentSnapshot: Snapshot;
15
+ readonly currentHeadDetails: HeadDetails;
16
+ readonly newSnapshot: Snapshot;
17
+ readonly newHeadDetails: HeadDetails;
18
+ readonly newBody: HTMLBodyElement;
19
+ readonly isPreview: boolean;
20
+ renderBody: BodyRenderer;
21
+ static render(delegate: RenderDelegate, callback: RenderCallback, currentSnapshot: Snapshot, newSnapshot: Snapshot, isPreview: boolean, renderBody: BodyRenderer): Promise<void>;
22
+ constructor(currentSnapshot: Snapshot, newSnapshot: Snapshot, isPreview: boolean, renderBody: BodyRenderer);
23
+ render(delegate: RenderDelegate, callback: RenderCallback): Promise<void>;
24
+ mergeHead(): Promise<void>;
25
+ replaceBody(): void;
26
+ shouldRender(): boolean;
27
+ trackedElementsAreIdentical(): boolean;
28
+ copyNewHeadStylesheetElements(): void;
29
+ copyNewHeadScriptElements(onScriptsLoaded: () => void): void;
30
+ removeCurrentHeadProvisionalElements(): void;
31
+ copyNewHeadProvisionalElements(): void;
32
+ relocateCurrentBodyPermanentElements(): Placeholder[];
33
+ replacePlaceholderElementsWithClonedPermanentElements(placeholders: Placeholder[]): void;
34
+ activateNewBodyScriptElements(): void;
35
+ assignNewBody(): void;
36
+ focusFirstAutofocusableElement(): void;
37
+ getNewHeadStylesheetElements(): Element[];
38
+ getNewHeadScriptElements(): HTMLScriptElement[];
39
+ getCurrentHeadProvisionalElements(): Element[];
40
+ getNewHeadProvisionalElements(): Element[];
41
+ getCurrentBodyPermanentElements(): PermanentElement[];
42
+ getNewBodyScriptElements(): HTMLScriptElement[];
43
+ }
44
+ export {};
45
+ //# sourceMappingURL=snapshot_renderer%20copy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot_renderer copy.d.ts","sourceRoot":"","sources":["../../../lib/turbolinks/snapshot_renderer copy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,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,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAK3C,qBAAa,gBAAiB,SAAQ,QAAQ;IAC5C,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC;IACnC,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,YAAY,CAAC;IAGzB,MAAM,CAAC,MAAM,CACX,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,cAAc,EACxB,eAAe,EAAE,QAAQ,EACzB,WAAW,EAAE,QAAQ,EACrB,SAAS,EAAE,OAAO,EAClB,UAAU,EAAE,YAAY;gBAWxB,eAAe,EAAE,QAAQ,EACzB,WAAW,EAAE,QAAQ,EACrB,SAAS,EAAE,OAAO,EAClB,UAAU,EAAE,YAAY;IAYpB,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc;IAczD,SAAS;IAmBf,WAAW;IAOX,YAAY;IAIZ,2BAA2B;IAO3B,6BAA6B;IAM7B,yBAAyB,CAAC,eAAe,EAAE,MAAM,IAAI;IAoCrD,oCAAoC;IAMpC,8BAA8B;IAM9B,oCAAoC;IAoBpC,qDAAqD,CACnD,YAAY,EAAE,WAAW,EAAE;IAQ7B,6BAA6B;IAO7B,aAAa;IAOb,8BAA8B;IAO9B,4BAA4B;IAM5B,wBAAwB;IAMxB,iCAAiC;IAIjC,6BAA6B;IAI7B,+BAA+B,IAAI,gBAAgB,EAAE;IAMrD,wBAAwB;CAGzB"}
@@ -0,0 +1,179 @@
1
+ import { Renderer } from "./renderer";
2
+ import { array, createScriptElement } from "./util";
3
+ const allHeadScriptsEverRun = {};
4
+ let firstLoad = true;
5
+ export class SnapshotRenderer extends Renderer {
6
+ // todo: dont need this?
7
+ static render(delegate, callback, currentSnapshot, newSnapshot, isPreview, renderBody) {
8
+ return new this(currentSnapshot, newSnapshot, isPreview, renderBody).render(delegate, callback);
9
+ }
10
+ constructor(currentSnapshot, newSnapshot, isPreview, renderBody) {
11
+ super();
12
+ this.currentSnapshot = currentSnapshot;
13
+ this.currentHeadDetails = currentSnapshot.headDetails;
14
+ this.newSnapshot = newSnapshot;
15
+ this.newHeadDetails = newSnapshot.headDetails;
16
+ this.newBody = newSnapshot.bodyElement;
17
+ this.isPreview = isPreview;
18
+ this.renderBody = renderBody;
19
+ }
20
+ async render(delegate, callback) {
21
+ this.delegate = delegate;
22
+ if (this.shouldRender()) {
23
+ this.replaceBody();
24
+ if (!this.isPreview) {
25
+ this.focusFirstAutofocusableElement();
26
+ }
27
+ await this.mergeHead();
28
+ callback();
29
+ }
30
+ else {
31
+ this.invalidateView();
32
+ }
33
+ }
34
+ async mergeHead() {
35
+ if (firstLoad) {
36
+ // TODO: messy code
37
+ for (const [outerHTML, details] of Object.entries(this.currentHeadDetails.detailsByOuterHTML)) {
38
+ allHeadScriptsEverRun[outerHTML] = true;
39
+ }
40
+ }
41
+ firstLoad = false;
42
+ return new Promise((resolve) => {
43
+ this.copyNewHeadStylesheetElements();
44
+ this.copyNewHeadScriptElements(resolve);
45
+ this.removeCurrentHeadProvisionalElements();
46
+ this.copyNewHeadProvisionalElements();
47
+ });
48
+ }
49
+ replaceBody() {
50
+ const placeholders = this.relocateCurrentBodyPermanentElements();
51
+ this.activateNewBodyScriptElements();
52
+ this.assignNewBody(); // todo: react.
53
+ this.replacePlaceholderElementsWithClonedPermanentElements(placeholders);
54
+ }
55
+ shouldRender() {
56
+ return this.newSnapshot.isVisitable() && this.trackedElementsAreIdentical();
57
+ }
58
+ trackedElementsAreIdentical() {
59
+ return (this.currentHeadDetails.getTrackedElementSignature() ==
60
+ this.newHeadDetails.getTrackedElementSignature());
61
+ }
62
+ copyNewHeadStylesheetElements() {
63
+ for (const element of this.getNewHeadStylesheetElements()) {
64
+ document.head.appendChild(element);
65
+ }
66
+ }
67
+ copyNewHeadScriptElements(onScriptsLoaded) {
68
+ let blockingLoaded = [];
69
+ const dispatch = () => {
70
+ this.activateNewBodyScriptElements();
71
+ this.focusFirstAutofocusableElement();
72
+ onScriptsLoaded();
73
+ };
74
+ for (const element of this.getNewHeadScriptElements()) {
75
+ const runBefore = element.outerHTML in allHeadScriptsEverRun;
76
+ if (!runBefore) {
77
+ let cb = false;
78
+ if (!element.defer && element.src) {
79
+ const idx = blockingLoaded.length;
80
+ cb = () => {
81
+ blockingLoaded[idx] = true;
82
+ if (blockingLoaded.every((v) => v)) {
83
+ dispatch();
84
+ }
85
+ };
86
+ blockingLoaded.push(false);
87
+ }
88
+ const script = createScriptElement(element);
89
+ if (cb) {
90
+ script.addEventListener("load", cb);
91
+ }
92
+ document.head.appendChild(script);
93
+ allHeadScriptsEverRun[element.outerHTML] = true;
94
+ }
95
+ }
96
+ if (blockingLoaded.length === 0) {
97
+ // //TODO: raf waits for react to finish... not 100% sure of the reliability
98
+ requestAnimationFrame(dispatch);
99
+ }
100
+ }
101
+ removeCurrentHeadProvisionalElements() {
102
+ for (const element of this.getCurrentHeadProvisionalElements()) {
103
+ document.head.removeChild(element);
104
+ }
105
+ }
106
+ copyNewHeadProvisionalElements() {
107
+ for (const element of this.getNewHeadProvisionalElements()) {
108
+ document.head.appendChild(element);
109
+ }
110
+ }
111
+ relocateCurrentBodyPermanentElements() {
112
+ return this.getCurrentBodyPermanentElements().reduce((placeholders, permanentElement) => {
113
+ const newElement = this.newSnapshot.getPermanentElementById(permanentElement.id);
114
+ if (newElement) {
115
+ const placeholder = createPlaceholderForPermanentElement(permanentElement);
116
+ replaceElementWithElement(permanentElement, placeholder.element);
117
+ replaceElementWithElement(newElement, permanentElement);
118
+ return [...placeholders, placeholder];
119
+ }
120
+ else {
121
+ return placeholders;
122
+ }
123
+ }, []);
124
+ }
125
+ replacePlaceholderElementsWithClonedPermanentElements(placeholders) {
126
+ for (const { element, permanentElement } of placeholders) {
127
+ const clonedElement = permanentElement.cloneNode(true);
128
+ replaceElementWithElement(element, clonedElement);
129
+ }
130
+ }
131
+ activateNewBodyScriptElements() {
132
+ for (const inertScriptElement of this.getNewBodyScriptElements()) {
133
+ const activatedScriptElement = createScriptElement(inertScriptElement);
134
+ replaceElementWithElement(inertScriptElement, activatedScriptElement);
135
+ }
136
+ }
137
+ assignNewBody() {
138
+ replaceElementWithElement(document.querySelector("#alignablewebnextjsframe").firstElementChild, this.newBody);
139
+ }
140
+ focusFirstAutofocusableElement() {
141
+ const element = this.newSnapshot.findFirstAutofocusableElement();
142
+ if (elementIsFocusable(element)) {
143
+ element.focus();
144
+ }
145
+ }
146
+ getNewHeadStylesheetElements() {
147
+ return this.newHeadDetails.getStylesheetElementsNotInDetails(this.currentHeadDetails);
148
+ }
149
+ getNewHeadScriptElements() {
150
+ return this.newHeadDetails.getScriptElementsNotInDetails(this.currentHeadDetails);
151
+ }
152
+ getCurrentHeadProvisionalElements() {
153
+ return this.currentHeadDetails.getProvisionalElements();
154
+ }
155
+ getNewHeadProvisionalElements() {
156
+ return this.newHeadDetails.getProvisionalElements();
157
+ }
158
+ getCurrentBodyPermanentElements() {
159
+ return this.currentSnapshot.getPermanentElementsPresentInSnapshot(this.newSnapshot);
160
+ }
161
+ getNewBodyScriptElements() {
162
+ return array(this.newBody.querySelectorAll("script"));
163
+ }
164
+ }
165
+ function createPlaceholderForPermanentElement(permanentElement) {
166
+ const element = document.createElement("meta");
167
+ element.setAttribute("name", "turbolinks-permanent-placeholder");
168
+ element.setAttribute("content", permanentElement.id);
169
+ return { element, permanentElement };
170
+ }
171
+ function replaceElementWithElement(fromElement, toElement) {
172
+ const parentElement = fromElement.parentElement;
173
+ if (parentElement) {
174
+ return parentElement.replaceChild(toElement, fromElement);
175
+ }
176
+ }
177
+ function elementIsFocusable(element) {
178
+ return element && typeof element.focus == "function";
179
+ }
@@ -0,0 +1,43 @@
1
+ import { HeadDetails } from "./head_details";
2
+ import { RenderCallback, RenderDelegate, Renderer } from "./renderer";
3
+ import { Snapshot } from "./snapshot";
4
+ export { RenderCallback, RenderDelegate } from "./renderer";
5
+ export type PermanentElement = Element & {
6
+ id: string;
7
+ };
8
+ export type Placeholder = {
9
+ element: Element;
10
+ permanentElement: PermanentElement;
11
+ };
12
+ export declare class SnapshotRenderer extends Renderer {
13
+ readonly delegate: RenderDelegate;
14
+ readonly currentSnapshot: Snapshot;
15
+ readonly currentHeadDetails: HeadDetails;
16
+ readonly newSnapshot: Snapshot;
17
+ readonly newHeadDetails: HeadDetails;
18
+ readonly newBody: HTMLBodyElement;
19
+ readonly isPreview: boolean;
20
+ static render(delegate: RenderDelegate, callback: RenderCallback, currentSnapshot: Snapshot, newSnapshot: Snapshot, isPreview: boolean): void;
21
+ constructor(delegate: RenderDelegate, currentSnapshot: Snapshot, newSnapshot: Snapshot, isPreview: boolean);
22
+ render(callback: RenderCallback): void;
23
+ mergeHead(): void;
24
+ replaceBody(): void;
25
+ shouldRender(): boolean;
26
+ trackedElementsAreIdentical(): boolean;
27
+ copyNewHeadStylesheetElements(): void;
28
+ copyNewHeadScriptElements(): void;
29
+ removeCurrentHeadProvisionalElements(): void;
30
+ copyNewHeadProvisionalElements(): void;
31
+ relocateCurrentBodyPermanentElements(): Placeholder[];
32
+ replacePlaceholderElementsWithClonedPermanentElements(placeholders: Placeholder[]): void;
33
+ activateNewBodyScriptElements(): void;
34
+ assignNewBody(): void;
35
+ focusFirstAutofocusableElement(): void;
36
+ getNewHeadStylesheetElements(): Element[];
37
+ getNewHeadScriptElements(): Element[];
38
+ getCurrentHeadProvisionalElements(): Element[];
39
+ getNewHeadProvisionalElements(): Element[];
40
+ getCurrentBodyPermanentElements(): PermanentElement[];
41
+ getNewBodyScriptElements(): HTMLScriptElement[];
42
+ }
43
+ //# sourceMappingURL=snapshot_renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot_renderer.d.ts","sourceRoot":"","sources":["../../../lib/turbolinks/snapshot_renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5D,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,qBAAa,gBAAiB,SAAQ,QAAQ;IAC5C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC;IACnC,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B,MAAM,CAAC,MAAM,CACX,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,cAAc,EACxB,eAAe,EAAE,QAAQ,EACzB,WAAW,EAAE,QAAQ,EACrB,SAAS,EAAE,OAAO;gBAQlB,QAAQ,EAAE,cAAc,EACxB,eAAe,EAAE,QAAQ,EACzB,WAAW,EAAE,QAAQ,EACrB,SAAS,EAAE,OAAO;IAYpB,MAAM,CAAC,QAAQ,EAAE,cAAc;IAe/B,SAAS;IAOT,WAAW;IAOX,YAAY;IAIZ,2BAA2B;IAO3B,6BAA6B;IAM7B,yBAAyB;IAMzB,oCAAoC;IAMpC,8BAA8B;IAM9B,oCAAoC;IAoBpC,qDAAqD,CACnD,YAAY,EAAE,WAAW,EAAE;IAQ7B,6BAA6B;IAQ7B,aAAa;IAOb,8BAA8B;IAO9B,4BAA4B;IAM5B,wBAAwB;IAMxB,iCAAiC;IAIjC,6BAA6B;IAI7B,+BAA+B,IAAI,gBAAgB,EAAE;IAMrD,wBAAwB;CAGzB"}
@@ -0,0 +1,139 @@
1
+ import { Renderer } from "./renderer";
2
+ import { array } from "./util";
3
+ export class SnapshotRenderer extends Renderer {
4
+ static render(delegate, callback, currentSnapshot, newSnapshot, isPreview) {
5
+ return new this(delegate, currentSnapshot, newSnapshot, isPreview).render(callback);
6
+ }
7
+ constructor(delegate, currentSnapshot, newSnapshot, isPreview) {
8
+ super();
9
+ this.delegate = delegate;
10
+ this.currentSnapshot = currentSnapshot;
11
+ this.currentHeadDetails = currentSnapshot.headDetails;
12
+ this.newSnapshot = newSnapshot;
13
+ this.newHeadDetails = newSnapshot.headDetails;
14
+ this.newBody = newSnapshot.bodyElement;
15
+ this.isPreview = isPreview;
16
+ }
17
+ render(callback) {
18
+ if (this.shouldRender()) {
19
+ this.mergeHead();
20
+ this.renderView(() => {
21
+ this.replaceBody();
22
+ if (!this.isPreview) {
23
+ this.focusFirstAutofocusableElement();
24
+ }
25
+ callback();
26
+ });
27
+ }
28
+ else {
29
+ this.invalidateView();
30
+ }
31
+ }
32
+ mergeHead() {
33
+ this.copyNewHeadStylesheetElements();
34
+ this.copyNewHeadScriptElements();
35
+ this.removeCurrentHeadProvisionalElements();
36
+ this.copyNewHeadProvisionalElements();
37
+ }
38
+ replaceBody() {
39
+ const placeholders = this.relocateCurrentBodyPermanentElements();
40
+ this.activateNewBodyScriptElements();
41
+ this.assignNewBody();
42
+ this.replacePlaceholderElementsWithClonedPermanentElements(placeholders);
43
+ }
44
+ shouldRender() {
45
+ return this.newSnapshot.isVisitable() && this.trackedElementsAreIdentical();
46
+ }
47
+ trackedElementsAreIdentical() {
48
+ return (this.currentHeadDetails.getTrackedElementSignature() ==
49
+ this.newHeadDetails.getTrackedElementSignature());
50
+ }
51
+ copyNewHeadStylesheetElements() {
52
+ for (const element of this.getNewHeadStylesheetElements()) {
53
+ document.head.appendChild(element);
54
+ }
55
+ }
56
+ copyNewHeadScriptElements() {
57
+ for (const element of this.getNewHeadScriptElements()) {
58
+ document.head.appendChild(this.createScriptElement(element));
59
+ }
60
+ }
61
+ removeCurrentHeadProvisionalElements() {
62
+ for (const element of this.getCurrentHeadProvisionalElements()) {
63
+ document.head.removeChild(element);
64
+ }
65
+ }
66
+ copyNewHeadProvisionalElements() {
67
+ for (const element of this.getNewHeadProvisionalElements()) {
68
+ document.head.appendChild(element);
69
+ }
70
+ }
71
+ relocateCurrentBodyPermanentElements() {
72
+ return this.getCurrentBodyPermanentElements().reduce((placeholders, permanentElement) => {
73
+ const newElement = this.newSnapshot.getPermanentElementById(permanentElement.id);
74
+ if (newElement) {
75
+ const placeholder = createPlaceholderForPermanentElement(permanentElement);
76
+ replaceElementWithElement(permanentElement, placeholder.element);
77
+ replaceElementWithElement(newElement, permanentElement);
78
+ return [...placeholders, placeholder];
79
+ }
80
+ else {
81
+ return placeholders;
82
+ }
83
+ }, []);
84
+ }
85
+ replacePlaceholderElementsWithClonedPermanentElements(placeholders) {
86
+ for (const { element, permanentElement } of placeholders) {
87
+ const clonedElement = permanentElement.cloneNode(true);
88
+ replaceElementWithElement(element, clonedElement);
89
+ }
90
+ }
91
+ activateNewBodyScriptElements() {
92
+ for (const inertScriptElement of this.getNewBodyScriptElements()) {
93
+ const activatedScriptElement = this.createScriptElement(inertScriptElement);
94
+ replaceElementWithElement(inertScriptElement, activatedScriptElement);
95
+ }
96
+ }
97
+ assignNewBody() {
98
+ replaceElementWithElement(document.querySelector("#alignablewebnextjsframe").firstElementChild, this.newBody);
99
+ }
100
+ focusFirstAutofocusableElement() {
101
+ const element = this.newSnapshot.findFirstAutofocusableElement();
102
+ if (elementIsFocusable(element)) {
103
+ element.focus();
104
+ }
105
+ }
106
+ getNewHeadStylesheetElements() {
107
+ return this.newHeadDetails.getStylesheetElementsNotInDetails(this.currentHeadDetails);
108
+ }
109
+ getNewHeadScriptElements() {
110
+ return this.newHeadDetails.getScriptElementsNotInDetails(this.currentHeadDetails);
111
+ }
112
+ getCurrentHeadProvisionalElements() {
113
+ return this.currentHeadDetails.getProvisionalElements();
114
+ }
115
+ getNewHeadProvisionalElements() {
116
+ return this.newHeadDetails.getProvisionalElements();
117
+ }
118
+ getCurrentBodyPermanentElements() {
119
+ return this.currentSnapshot.getPermanentElementsPresentInSnapshot(this.newSnapshot);
120
+ }
121
+ getNewBodyScriptElements() {
122
+ return array(this.newBody.querySelectorAll("script"));
123
+ }
124
+ }
125
+ function createPlaceholderForPermanentElement(permanentElement) {
126
+ const element = document.createElement("meta");
127
+ element.setAttribute("name", "turbolinks-permanent-placeholder");
128
+ element.setAttribute("content", permanentElement.id);
129
+ return { element, permanentElement };
130
+ }
131
+ function replaceElementWithElement(fromElement, toElement) {
132
+ const parentElement = fromElement.parentElement;
133
+ if (parentElement) {
134
+ return parentElement.replaceChild(toElement, fromElement);
135
+ }
136
+ }
137
+ function elementIsFocusable(element) {
138
+ return element && typeof element.focus == "function";
139
+ }
@@ -0,0 +1,7 @@
1
+ export type Action = "advance" | "replace" | "restore";
2
+ export declare function isAction(action: any): action is Action;
3
+ export type Position = {
4
+ x: number;
5
+ y: number;
6
+ };
7
+ //# sourceMappingURL=types.d.ts.map
@@ -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,3 @@
1
+ export function isAction(action) {
2
+ return action == "advance" || action == "replace" || action == "restore";
3
+ }
@@ -0,0 +1,14 @@
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
+ //# 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"}