@alignable/bifrost 0.1.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-4W4KH2A5.js +50 -0
- package/dist/chunk-4W4KH2A5.js.map +1 -0
- package/dist/{chunk-X3MUHPJ3.js → chunk-NS2C4D24.js} +59 -177
- package/dist/chunk-NS2C4D24.js.map +1 -0
- package/dist/controller-af32e731.d.ts +9 -0
- package/dist/index.d.ts +1 -15
- package/dist/index.js +1 -13
- package/dist/index.js.map +1 -1
- package/dist/renderer/+config.js +2 -46
- package/dist/renderer/Head.d.ts +5 -0
- package/dist/renderer/Head.js +25 -0
- package/dist/renderer/Head.js.map +1 -0
- package/dist/renderer/bifrost/onAfterRenderClient.d.ts +5 -0
- package/dist/renderer/bifrost/onAfterRenderClient.js +14 -0
- package/dist/renderer/bifrost/onAfterRenderClient.js.map +1 -0
- package/dist/renderer/bifrost/onBeforeRenderClient.d.ts +5 -0
- package/dist/renderer/bifrost/onBeforeRenderClient.js +15 -0
- package/dist/renderer/bifrost/onBeforeRenderClient.js.map +1 -0
- package/dist/renderer/config.d.ts +51 -70
- package/dist/renderer/config.js.map +1 -1
- package/dist/renderer/headHtmlEnd.d.ts +7 -0
- package/dist/renderer/headHtmlEnd.js +8 -0
- package/dist/renderer/headHtmlEnd.js.map +1 -0
- package/dist/renderer/onBeforeRoute.d.ts +3 -6
- package/dist/renderer/onBeforeRoute.js +9 -3
- package/dist/renderer/onBeforeRoute.js.map +1 -1
- package/dist/renderer/wrapped/Page.d.ts +9 -0
- package/dist/renderer/wrapped/Page.js +25 -0
- package/dist/renderer/wrapped/Page.js.map +1 -0
- package/dist/renderer/wrapped/onAfterRenderClient.d.ts +7 -0
- package/dist/renderer/wrapped/onAfterRenderClient.js +30 -0
- package/dist/renderer/wrapped/onAfterRenderClient.js.map +1 -0
- package/dist/renderer/wrapped/onBeforeRender.client.d.ts +7 -0
- package/dist/renderer/wrapped/onBeforeRender.client.js +40 -0
- package/dist/renderer/wrapped/onBeforeRender.client.js.map +1 -0
- package/dist/renderer/wrapped/onBeforeRenderClient.d.ts +7 -0
- package/dist/renderer/wrapped/onBeforeRenderClient.js +172 -0
- package/dist/renderer/wrapped/onBeforeRenderClient.js.map +1 -0
- package/dist/renderer/wrapped/onBeforeRenderHtml.d.ts +5 -0
- package/dist/renderer/wrapped/onBeforeRenderHtml.js +14 -0
- package/dist/renderer/wrapped/onBeforeRenderHtml.js.map +1 -0
- package/dist/type-82702ff4.d.ts +27 -0
- package/package.json +12 -22
- package/dist/chunk-2DSY3VFP.js +0 -118
- package/dist/chunk-2DSY3VFP.js.map +0 -1
- package/dist/chunk-5SP2QGEH.js +0 -76
- package/dist/chunk-5SP2QGEH.js.map +0 -1
- package/dist/chunk-ABLEI4J7.js +0 -30
- package/dist/chunk-ABLEI4J7.js.map +0 -1
- package/dist/chunk-EYYCKU6F.js +0 -11
- package/dist/chunk-EYYCKU6F.js.map +0 -1
- package/dist/chunk-IYGONC4I.js +0 -31
- package/dist/chunk-IYGONC4I.js.map +0 -1
- package/dist/chunk-JHLK62FM.js +0 -20
- package/dist/chunk-JHLK62FM.js.map +0 -1
- package/dist/chunk-K4H777XA.js +0 -9
- package/dist/chunk-K4H777XA.js.map +0 -1
- package/dist/chunk-OXCN6F2S.js +0 -10
- package/dist/chunk-OXCN6F2S.js.map +0 -1
- package/dist/chunk-PESUYCE4.js +0 -33
- package/dist/chunk-PESUYCE4.js.map +0 -1
- package/dist/chunk-RQ34EW7E.js +0 -13
- package/dist/chunk-RQ34EW7E.js.map +0 -1
- package/dist/chunk-RSVASTEA.js +0 -63
- package/dist/chunk-RSVASTEA.js.map +0 -1
- package/dist/chunk-VYXAWOXV.js +0 -22
- package/dist/chunk-VYXAWOXV.js.map +0 -1
- package/dist/chunk-X2R7ODLQ.js +0 -14
- package/dist/chunk-X2R7ODLQ.js.map +0 -1
- package/dist/chunk-X3MUHPJ3.js.map +0 -1
- package/dist/chunk-XMNZZA6S.js +0 -75
- package/dist/chunk-XMNZZA6S.js.map +0 -1
- package/dist/internal-837e7a40.d.ts +0 -128
- package/dist/renderer/_error/Page.d.ts +0 -8
- package/dist/renderer/_error/Page.js +0 -14
- package/dist/renderer/_error/Page.js.map +0 -1
- package/dist/renderer/bifrost/onRenderClient.d.ts +0 -9
- package/dist/renderer/bifrost/onRenderClient.js +0 -15
- package/dist/renderer/bifrost/onRenderClient.js.map +0 -1
- package/dist/renderer/bifrost/onRenderHtml.d.ts +0 -20
- package/dist/renderer/bifrost/onRenderHtml.js +0 -13
- package/dist/renderer/bifrost/onRenderHtml.js.map +0 -1
- package/dist/renderer/configs/bifrost.d.ts +0 -50
- package/dist/renderer/configs/bifrost.js +0 -7
- package/dist/renderer/configs/bifrost.js.map +0 -1
- package/dist/renderer/configs/wrapped.d.ts +0 -25
- package/dist/renderer/configs/wrapped.js +0 -7
- package/dist/renderer/configs/wrapped.js.map +0 -1
- package/dist/renderer/onRenderClient.d.ts +0 -9
- package/dist/renderer/onRenderClient.js +0 -35
- package/dist/renderer/onRenderClient.js.map +0 -1
- package/dist/renderer/onRenderHtml.d.ts +0 -37
- package/dist/renderer/onRenderHtml.js +0 -32
- package/dist/renderer/onRenderHtml.js.map +0 -1
- package/dist/renderer/useNavigation.d.ts +0 -13
- package/dist/renderer/useNavigation.js +0 -12
- package/dist/renderer/useNavigation.js.map +0 -1
- package/dist/renderer/usePageContext.d.ts +0 -14
- package/dist/renderer/usePageContext.js +0 -10
- package/dist/renderer/usePageContext.js.map +0 -1
- package/dist/renderer/utils/PassthruLayout.d.ts +0 -5
- package/dist/renderer/utils/PassthruLayout.js +0 -7
- package/dist/renderer/utils/PassthruLayout.js.map +0 -1
- package/dist/renderer/utils/buildHead.d.ts +0 -9
- package/dist/renderer/utils/buildHead.js +0 -7
- package/dist/renderer/utils/buildHead.js.map +0 -1
- package/dist/renderer/utils/getConfigOrPageContext.d.ts +0 -13
- package/dist/renderer/utils/getConfigOrPageContext.js +0 -7
- package/dist/renderer/utils/getConfigOrPageContext.js.map +0 -1
- package/dist/renderer/utils/getGlobalObject.d.ts +0 -6
- package/dist/renderer/utils/getGlobalObject.js +0 -7
- package/dist/renderer/utils/getGlobalObject.js.map +0 -1
- package/dist/renderer/wrapped/onRenderClient.d.ts +0 -9
- package/dist/renderer/wrapped/onRenderClient.js +0 -13
- package/dist/renderer/wrapped/onRenderClient.js.map +0 -1
- package/dist/renderer/wrapped/onRenderHtml.d.ts +0 -27
- package/dist/renderer/wrapped/onRenderHtml.js +0 -12
- package/dist/renderer/wrapped/onRenderHtml.js.map +0 -1
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// renderer/config.ts
|
|
2
|
+
var config_default = {
|
|
3
|
+
name: "@alignable/bifrost",
|
|
4
|
+
require: {
|
|
5
|
+
vike: ">=0.4.244",
|
|
6
|
+
"vike-react": ">=0.6.11"
|
|
7
|
+
},
|
|
8
|
+
Head: "import:@alignable/bifrost/__internal/renderer/Head:default",
|
|
9
|
+
headHtmlEnd: "import:@alignable/bifrost/__internal/renderer/headHtmlEnd:default",
|
|
10
|
+
onBeforeRoute: "import:@alignable/bifrost/__internal/renderer/onBeforeRoute:default",
|
|
11
|
+
passToClient: ["proxyLayoutInfo"],
|
|
12
|
+
meta: {
|
|
13
|
+
getLayout: { env: { server: true, client: true } },
|
|
14
|
+
proxyHeaders: { env: { server: true, client: true } },
|
|
15
|
+
proxyMode: {
|
|
16
|
+
env: { server: true, client: true, config: true },
|
|
17
|
+
effect({ configDefinedAt, configValue }) {
|
|
18
|
+
switch (configValue) {
|
|
19
|
+
case false:
|
|
20
|
+
return {
|
|
21
|
+
onBeforeRenderClient: "import:@alignable/bifrost/__internal/renderer/bifrost/onBeforeRenderClient:default",
|
|
22
|
+
onAfterRenderClient: "import:@alignable/bifrost/__internal/renderer/bifrost/onAfterRenderClient:default"
|
|
23
|
+
};
|
|
24
|
+
case "wrapped":
|
|
25
|
+
return {
|
|
26
|
+
Page: "import:@alignable/bifrost/__internal/renderer/wrapped/Page:default",
|
|
27
|
+
onBeforeRenderHtml: "import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRenderHtml:default",
|
|
28
|
+
onBeforeRender: "import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRender.client:default",
|
|
29
|
+
onBeforeRenderClient: "import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRenderClient:default",
|
|
30
|
+
onAfterRenderClient: "import:@alignable/bifrost/__internal/renderer/wrapped/onAfterRenderClient:default",
|
|
31
|
+
meta: {
|
|
32
|
+
onBeforeRender: { env: { client: true, server: false } }
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
case "passthru":
|
|
36
|
+
return { clientRouting: false };
|
|
37
|
+
default:
|
|
38
|
+
throw new Error(
|
|
39
|
+
`${configDefinedAt} should be one of: false, "wrapped", "passthru"`
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export {
|
|
48
|
+
config_default
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=chunk-4W4KH2A5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../renderer/config.ts"],"sourcesContent":["import { type Config } from \"vike/types\";\n\nexport default {\n name: \"@alignable/bifrost\",\n require: {\n vike: \">=0.4.244\",\n \"vike-react\": \">=0.6.11\",\n },\n\n Head: \"import:@alignable/bifrost/__internal/renderer/Head:default\",\n headHtmlEnd:\n \"import:@alignable/bifrost/__internal/renderer/headHtmlEnd:default\",\n onBeforeRoute:\n \"import:@alignable/bifrost/__internal/renderer/onBeforeRoute:default\",\n\n passToClient: [\"proxyLayoutInfo\"],\n\n meta: {\n getLayout: { env: { server: true, client: true } },\n proxyHeaders: { env: { server: true, client: true } },\n proxyMode: {\n env: { server: true, client: true, config: true },\n effect({ configDefinedAt, configValue }) {\n switch (configValue) {\n case false:\n return {\n onBeforeRenderClient:\n \"import:@alignable/bifrost/__internal/renderer/bifrost/onBeforeRenderClient:default\",\n onAfterRenderClient:\n \"import:@alignable/bifrost/__internal/renderer/bifrost/onAfterRenderClient:default\",\n };\n case \"wrapped\":\n return {\n Page: \"import:@alignable/bifrost/__internal/renderer/wrapped/Page:default\" as any,\n onBeforeRenderHtml:\n \"import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRenderHtml:default\",\n onBeforeRender:\n \"import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRender.client:default\",\n onBeforeRenderClient:\n \"import:@alignable/bifrost/__internal/renderer/wrapped/onBeforeRenderClient:default\",\n onAfterRenderClient:\n \"import:@alignable/bifrost/__internal/renderer/wrapped/onAfterRenderClient:default\",\n meta: {\n onBeforeRender: { env: { client: true, server: false } },\n },\n };\n case \"passthru\":\n // tell Vike to hit the server for all passthru pages (which will get load balanced to legacy backend)\n return { clientRouting: false };\n default:\n throw new Error(\n `${configDefinedAt} should be one of: false, \"wrapped\", \"passthru\"`\n );\n }\n },\n },\n },\n} satisfies Config;\n\n/**\n * Returning null tells Bifrost to run passthru proxy\n */\nexport type GetLayout = (\n headers: Record<string, number | string | string[] | undefined>\n) => Vike.ProxyLayoutInfo | null;\n\ndeclare global {\n namespace Vike {\n interface Config {\n proxyMode?: false | \"wrapped\" | \"passthru\";\n proxyHeaders?: Record<string, string>;\n getLayout?: GetLayout;\n }\n interface PageContext {\n proxyLayoutInfo?: ProxyLayoutInfo;\n }\n interface ProxyLayoutInfo {}\n }\n}\n\n// This is only used for fastify integration\nexport { type WrappedServerOnly } from \"../lib/type\";\n"],"mappings":";AAEA,IAAO,iBAAQ;AAAA,EACb,MAAM;AAAA,EACN,SAAS;AAAA,IACP,MAAM;AAAA,IACN,cAAc;AAAA,EAChB;AAAA,EAEA,MAAM;AAAA,EACN,aACE;AAAA,EACF,eACE;AAAA,EAEF,cAAc,CAAC,iBAAiB;AAAA,EAEhC,MAAM;AAAA,IACJ,WAAW,EAAE,KAAK,EAAE,QAAQ,MAAM,QAAQ,KAAK,EAAE;AAAA,IACjD,cAAc,EAAE,KAAK,EAAE,QAAQ,MAAM,QAAQ,KAAK,EAAE;AAAA,IACpD,WAAW;AAAA,MACT,KAAK,EAAE,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK;AAAA,MAChD,OAAO,EAAE,iBAAiB,YAAY,GAAG;AACvC,gBAAQ,aAAa;AAAA,UACnB,KAAK;AACH,mBAAO;AAAA,cACL,sBACE;AAAA,cACF,qBACE;AAAA,YACJ;AAAA,UACF,KAAK;AACH,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,oBACE;AAAA,cACF,gBACE;AAAA,cACF,sBACE;AAAA,cACF,qBACE;AAAA,cACF,MAAM;AAAA,gBACJ,gBAAgB,EAAE,KAAK,EAAE,QAAQ,MAAM,QAAQ,MAAM,EAAE;AAAA,cACzD;AAAA,YACF;AAAA,UACF,KAAK;AAEH,mBAAO,EAAE,eAAe,MAAM;AAAA,UAChC;AACE,kBAAM,IAAI;AAAA,cACR,GAAG,eAAe;AAAA,YACpB;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
setNavigation
|
|
3
|
-
} from "./chunk-PESUYCE4.js";
|
|
4
|
-
|
|
5
1
|
// lib/turbolinks/util.ts
|
|
6
2
|
function array(values) {
|
|
7
3
|
return Array.prototype.slice.call(values);
|
|
@@ -114,121 +110,6 @@ function focusFirstAutofocusableElement() {
|
|
|
114
110
|
}
|
|
115
111
|
}
|
|
116
112
|
|
|
117
|
-
// lib/turbolinks/mergeHead.ts
|
|
118
|
-
var allHeadScriptsEverRun = {};
|
|
119
|
-
var firstLoad = true;
|
|
120
|
-
var lastTrackedScriptSignature;
|
|
121
|
-
async function mergeHead(head, trackScripts, reload) {
|
|
122
|
-
const newHead = categorizeHead(head);
|
|
123
|
-
const oldHead = categorizeHead(document.head);
|
|
124
|
-
if (head.querySelector('meta[name="turbolinks-visit-control"]')?.getAttribute("content") === "reload") {
|
|
125
|
-
reload();
|
|
126
|
-
}
|
|
127
|
-
if (trackScripts) {
|
|
128
|
-
lastTrackedScriptSignature = lastTrackedScriptSignature || trackedElementSignature([...oldHead.scripts, ...oldHead.stylesheets]);
|
|
129
|
-
if (lastTrackedScriptSignature !== trackedElementSignature([...newHead.scripts, ...newHead.stylesheets])) {
|
|
130
|
-
reload();
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
if (firstLoad) {
|
|
134
|
-
for (const element of oldHead.scripts) {
|
|
135
|
-
allHeadScriptsEverRun[element.outerHTML] = {
|
|
136
|
-
tracked: elementIsTracked(element)
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
firstLoad = false;
|
|
140
|
-
}
|
|
141
|
-
copyNewHeadStylesheetElements(newHead.stylesheets, oldHead.stylesheets);
|
|
142
|
-
removeCurrentHeadProvisionalElements(oldHead.provisional);
|
|
143
|
-
copyNewHeadProvisionalElements(newHead.provisional);
|
|
144
|
-
return new Promise((resolve) => {
|
|
145
|
-
copyNewHeadScriptElements(newHead.scripts, resolve);
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
function trackedElementSignature(scripts) {
|
|
149
|
-
return scripts.filter(elementIsTracked).map((s) => s.outerHTML).join();
|
|
150
|
-
}
|
|
151
|
-
function copyNewHeadStylesheetElements(next, prev) {
|
|
152
|
-
const existing = prev.map((s) => s.outerHTML);
|
|
153
|
-
for (const element of next) {
|
|
154
|
-
if (!existing.includes(element.outerHTML)) {
|
|
155
|
-
document.head.appendChild(element);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
function copyNewHeadScriptElements(next, onScriptsLoaded) {
|
|
160
|
-
let blockingLoaded = [];
|
|
161
|
-
function dispatch2() {
|
|
162
|
-
onScriptsLoaded();
|
|
163
|
-
}
|
|
164
|
-
for (const element of next) {
|
|
165
|
-
const runBefore = element.outerHTML in allHeadScriptsEverRun;
|
|
166
|
-
if (!runBefore) {
|
|
167
|
-
let cb;
|
|
168
|
-
if (!element.defer && element.src) {
|
|
169
|
-
const idx = blockingLoaded.length;
|
|
170
|
-
cb = () => {
|
|
171
|
-
blockingLoaded[idx] = true;
|
|
172
|
-
if (blockingLoaded.every((v) => v)) {
|
|
173
|
-
dispatch2();
|
|
174
|
-
}
|
|
175
|
-
};
|
|
176
|
-
blockingLoaded.push(false);
|
|
177
|
-
}
|
|
178
|
-
document.head.appendChild(createScriptElement(element, cb));
|
|
179
|
-
allHeadScriptsEverRun[element.outerHTML] = {
|
|
180
|
-
tracked: elementIsTracked(element)
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
if (blockingLoaded.length === 0) {
|
|
185
|
-
requestAnimationFrame(dispatch2);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
function removeCurrentHeadProvisionalElements(prev) {
|
|
189
|
-
for (const element of prev) {
|
|
190
|
-
document.head.removeChild(element);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
function copyNewHeadProvisionalElements(next) {
|
|
194
|
-
for (const element of next) {
|
|
195
|
-
document.head.appendChild(element);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
function elementIsTracked(element) {
|
|
199
|
-
return element.getAttribute("data-turbolinks-track") == "reload";
|
|
200
|
-
}
|
|
201
|
-
function elementIsScript(element) {
|
|
202
|
-
const tagName = element.tagName.toLowerCase();
|
|
203
|
-
return tagName == "script";
|
|
204
|
-
}
|
|
205
|
-
function elementIsStylesheet(element) {
|
|
206
|
-
const tagName = element.tagName.toLowerCase();
|
|
207
|
-
return tagName == "style" || tagName == "link" && element.getAttribute("rel") == "stylesheet";
|
|
208
|
-
}
|
|
209
|
-
function elementIsFavicon(element) {
|
|
210
|
-
const tagName = element.tagName.toLowerCase();
|
|
211
|
-
return tagName == "link" && element.getAttribute("rel") == "icon";
|
|
212
|
-
}
|
|
213
|
-
function categorizeHead(head) {
|
|
214
|
-
const scripts = [];
|
|
215
|
-
const stylesheets = [];
|
|
216
|
-
const provisional = [];
|
|
217
|
-
for (const element of head.children) {
|
|
218
|
-
if (elementIsFavicon(element)) {
|
|
219
|
-
continue;
|
|
220
|
-
}
|
|
221
|
-
if (elementIsScript(element)) {
|
|
222
|
-
scripts.push(element);
|
|
223
|
-
} else if (elementIsStylesheet(element)) {
|
|
224
|
-
stylesheets.push(element);
|
|
225
|
-
} else {
|
|
226
|
-
provisional.push(element);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
return { scripts, stylesheets, provisional };
|
|
230
|
-
}
|
|
231
|
-
|
|
232
113
|
// lib/turbolinks/lruCache.ts
|
|
233
114
|
var LruCache = class {
|
|
234
115
|
constructor(maxEntries) {
|
|
@@ -371,10 +252,7 @@ var BrowserAdapter = class {
|
|
|
371
252
|
this.controller = controller2;
|
|
372
253
|
}
|
|
373
254
|
visitProposedToLocationWithAction(location, action) {
|
|
374
|
-
this.controller.startVisitToLocationWithAction(
|
|
375
|
-
location,
|
|
376
|
-
action
|
|
377
|
-
);
|
|
255
|
+
this.controller.startVisitToLocationWithAction(location, action);
|
|
378
256
|
}
|
|
379
257
|
visitStarted(visit) {
|
|
380
258
|
visit.issueRequest();
|
|
@@ -405,6 +283,7 @@ var BrowserAdapter = class {
|
|
|
405
283
|
this.hideProgressBar();
|
|
406
284
|
}
|
|
407
285
|
visitCompleted(visit) {
|
|
286
|
+
visit.onCompleted();
|
|
408
287
|
}
|
|
409
288
|
pageInvalidated() {
|
|
410
289
|
this.reload();
|
|
@@ -591,14 +470,29 @@ var Visit = class {
|
|
|
591
470
|
return;
|
|
592
471
|
}
|
|
593
472
|
loadResponse() {
|
|
594
|
-
this.render(
|
|
473
|
+
this.render(() => {
|
|
595
474
|
if (!this.renderFn)
|
|
596
475
|
throw new Error("Render details not set before rendering");
|
|
597
476
|
this.cacheSnapshot();
|
|
598
|
-
|
|
599
|
-
this.complete();
|
|
477
|
+
this.renderFn();
|
|
600
478
|
});
|
|
601
479
|
}
|
|
480
|
+
updateIfRedirect(url) {
|
|
481
|
+
const newLocation = Location.wrap(url);
|
|
482
|
+
if (this.location.isEqualTo(newLocation))
|
|
483
|
+
return;
|
|
484
|
+
console.log("redirected", this.location, newLocation);
|
|
485
|
+
this.redirectedToLocation = newLocation;
|
|
486
|
+
}
|
|
487
|
+
onCompleted() {
|
|
488
|
+
if (this.redirectedToLocation) {
|
|
489
|
+
this.location = this.redirectedToLocation;
|
|
490
|
+
this.controller.updateLocationAndRestorationIdentifier(
|
|
491
|
+
this.redirectedToLocation,
|
|
492
|
+
this.restorationIdentifier
|
|
493
|
+
);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
602
496
|
// HTTP request delegate
|
|
603
497
|
/*
|
|
604
498
|
requestStarted() {
|
|
@@ -613,15 +507,6 @@ var Visit = class {
|
|
|
613
507
|
}
|
|
614
508
|
}
|
|
615
509
|
|
|
616
|
-
requestCompletedWithResponse(
|
|
617
|
-
response: string,
|
|
618
|
-
redirectedToLocation?: Location
|
|
619
|
-
) {
|
|
620
|
-
this.response = response;
|
|
621
|
-
this.redirectedToLocation = redirectedToLocation;
|
|
622
|
-
this.adapter.visitRequestCompleted(this);
|
|
623
|
-
}
|
|
624
|
-
|
|
625
510
|
requestFailedWithStatusCode(statusCode: number, response?: string) {
|
|
626
511
|
this.response = response;
|
|
627
512
|
this.adapter.visitRequestFailedWithStatusCode(this, statusCode);
|
|
@@ -732,6 +617,11 @@ var Controller = class {
|
|
|
732
617
|
setProgressBarDelay(delay) {
|
|
733
618
|
this.progressBarDelay = delay;
|
|
734
619
|
}
|
|
620
|
+
// For after redirect, on page load we update this info for ios adapter
|
|
621
|
+
updateLocationAndRestorationIdentifier(locatable, restorationIdentifier) {
|
|
622
|
+
this.location = Location.wrap(locatable);
|
|
623
|
+
this.restorationIdentifier = restorationIdentifier;
|
|
624
|
+
}
|
|
735
625
|
// History delegate
|
|
736
626
|
historyPoppedToLocationWithRestorationIdentifier(location, restorationIdentifier) {
|
|
737
627
|
if (this.enabled) {
|
|
@@ -792,7 +682,6 @@ var Controller = class {
|
|
|
792
682
|
});
|
|
793
683
|
}
|
|
794
684
|
notifyApplicationBeforeVisitingLocation(location) {
|
|
795
|
-
setNavigation({ state: "loading" });
|
|
796
685
|
return dispatch("turbolinks:before-visit", {
|
|
797
686
|
data: { url: location.absoluteURL },
|
|
798
687
|
cancelable: true
|
|
@@ -807,7 +696,6 @@ var Controller = class {
|
|
|
807
696
|
return dispatch("turbolinks:before-cache");
|
|
808
697
|
}
|
|
809
698
|
notifyApplicationBeforeRender() {
|
|
810
|
-
setNavigation({ state: "idle" });
|
|
811
699
|
return dispatch("turbolinks:before-render");
|
|
812
700
|
}
|
|
813
701
|
notifyApplicationAfterRender() {
|
|
@@ -886,7 +774,9 @@ var Turbolinks = {
|
|
|
886
774
|
controller.setProgressBarDelay(delay);
|
|
887
775
|
},
|
|
888
776
|
start() {
|
|
889
|
-
if (window.Turbolinks
|
|
777
|
+
if (window.Turbolinks?.controller?.started)
|
|
778
|
+
return;
|
|
779
|
+
if (window.Turbolinks !== Turbolinks && window.Turbolinks?.controller?.adapter) {
|
|
890
780
|
window.Turbolinks.controller.adapter.controller = controller;
|
|
891
781
|
controller.adapter = window.Turbolinks.controller.adapter;
|
|
892
782
|
}
|
|
@@ -897,55 +787,47 @@ var Turbolinks = {
|
|
|
897
787
|
_vpsCachePageContext(pageContext) {
|
|
898
788
|
controller.pageContext = pageContext;
|
|
899
789
|
},
|
|
900
|
-
|
|
790
|
+
// Returns promise for turbolinks to be ready to render (runs requestAnimationFrame internally)
|
|
791
|
+
async _vikeBeforeRender(beforeRenderFn) {
|
|
901
792
|
if (controller.currentVisit) {
|
|
902
793
|
const { currentVisit } = controller;
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
()
|
|
908
|
-
|
|
909
|
-
controller.
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
if (executeBodyScripts) {
|
|
913
|
-
activateNewBodyScriptElements(
|
|
914
|
-
Array.from(document.body.querySelectorAll("script"))
|
|
915
|
-
);
|
|
916
|
-
}
|
|
917
|
-
focusFirstAutofocusableElement();
|
|
918
|
-
controller.viewRendered();
|
|
919
|
-
controller.adapter.visitRendered(currentVisit);
|
|
920
|
-
};
|
|
921
|
-
controller.adapter.visitRequestCompleted(controller.currentVisit);
|
|
922
|
-
controller.adapter.visitRequestFinished(controller.currentVisit);
|
|
794
|
+
return new Promise((resolve) => {
|
|
795
|
+
currentVisit.renderFn = () => {
|
|
796
|
+
beforeRenderFn?.();
|
|
797
|
+
controller.viewWillRender();
|
|
798
|
+
resolve();
|
|
799
|
+
};
|
|
800
|
+
controller.adapter.visitRequestCompleted(currentVisit);
|
|
801
|
+
controller.adapter.visitRequestFinished(currentVisit);
|
|
802
|
+
});
|
|
923
803
|
} else {
|
|
924
804
|
console.error(
|
|
925
805
|
"controller.currentVisit should exist when onRenderClient fires"
|
|
926
806
|
);
|
|
927
807
|
}
|
|
928
|
-
}
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
808
|
+
},
|
|
809
|
+
async _vikeAfterRender(activateBody) {
|
|
810
|
+
if (controller.currentVisit) {
|
|
811
|
+
if (activateBody) {
|
|
812
|
+
activateNewBodyScriptElements(
|
|
813
|
+
Array.from(document.body.querySelectorAll("script"))
|
|
814
|
+
);
|
|
815
|
+
}
|
|
816
|
+
focusFirstAutofocusableElement();
|
|
817
|
+
controller.viewRendered();
|
|
818
|
+
controller.adapter.visitRendered(controller.currentVisit);
|
|
819
|
+
controller.currentVisit.complete();
|
|
820
|
+
} else {
|
|
821
|
+
console.error(
|
|
822
|
+
"controller.currentVisit should exist when onAfterRenderClient fires"
|
|
823
|
+
);
|
|
941
824
|
}
|
|
942
|
-
root.render(page);
|
|
943
825
|
}
|
|
944
|
-
}
|
|
826
|
+
};
|
|
945
827
|
|
|
946
828
|
export {
|
|
829
|
+
createScriptElement,
|
|
947
830
|
copyElementAttributes,
|
|
948
|
-
Turbolinks
|
|
949
|
-
renderReact
|
|
831
|
+
Turbolinks
|
|
950
832
|
};
|
|
951
|
-
//# sourceMappingURL=chunk-
|
|
833
|
+
//# sourceMappingURL=chunk-NS2C4D24.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../lib/turbolinks/util.ts","../lib/turbolinks/lruCache.ts","../lib/turbolinks/progress_bar.ts","../lib/turbolinks/browser_adapter.ts","../lib/turbolinks/location.ts","../lib/turbolinks/types.ts","../lib/turbolinks/visit.ts","../lib/turbolinks/controller.ts","../lib/turbolinks/index.ts"],"sourcesContent":["export function array<T>(values: ArrayLike<T>): T[] {\n return Array.prototype.slice.call(values);\n}\n\nexport const closest = (() => {\n const html = document.documentElement;\n\n type MatchesSelector = (this: Element, selector: string) => boolean;\n const match: MatchesSelector =\n html.matches ||\n (html as any).webkitMatchesSelector ||\n (html as any).msMatchesSelector ||\n (html as any).mozMatchesSelector;\n\n type Closest = (this: Element, selector: string) => Element | null;\n const closest: Closest =\n html.closest ||\n function (selector: string) {\n let element: Element | null = this;\n while (element) {\n if (match.call(element, selector)) {\n return element;\n } else {\n element = element.parentElement;\n }\n }\n };\n\n return function (element: Element, selector: string) {\n return closest.call(element, selector);\n };\n})();\n\nexport function defer(callback: () => any) {\n setTimeout(callback, 1);\n}\n\nexport type DispatchOptions = {\n target: EventTarget;\n cancelable: boolean;\n data: any;\n};\n\nexport function dispatch(\n eventName: string,\n { target, cancelable, data }: Partial<DispatchOptions> = {}\n) {\n const event = document.createEvent(\"Events\") as Event & { data: any };\n event.initEvent(eventName, true, cancelable == true);\n event.data = data || {};\n\n // Fix setting `defaultPrevented` when `preventDefault()` is called\n // http://stackoverflow.com/questions/23349191/event-preventdefault-is-not-working-in-ie-11-for-custom-events\n if (event.cancelable && !preventDefaultSupported) {\n const { preventDefault } = event;\n event.preventDefault = function () {\n if (!this.defaultPrevented) {\n Object.defineProperty(this, \"defaultPrevented\", { get: () => true });\n }\n preventDefault.call(this);\n };\n }\n\n (target || document).dispatchEvent(event);\n return event;\n}\n\nconst preventDefaultSupported = (() => {\n const event = document.createEvent(\"Events\");\n event.initEvent(\"test\", true, true);\n event.preventDefault();\n return event.defaultPrevented;\n})();\n\nexport function unindent(\n strings: TemplateStringsArray,\n ...values: any[]\n): string {\n const lines = trimLeft(interpolate(strings, values)).split(\"\\n\");\n const match = lines[0].match(/^\\s+/);\n const indent = match ? match[0].length : 0;\n return lines.map((line) => line.slice(indent)).join(\"\\n\");\n}\n\nfunction trimLeft(string: string) {\n return string.replace(/^\\n/, \"\");\n}\n\nfunction interpolate(strings: TemplateStringsArray, values: any[]) {\n return strings.reduce((result, string, i) => {\n const value = values[i] == undefined ? \"\" : values[i];\n return result + string + value;\n }, \"\");\n}\n\nexport function uuid() {\n return Array.apply(null, { length: 36 } as any)\n .map((_, i) => {\n if (i == 8 || i == 13 || i == 18 || i == 23) {\n return \"-\";\n } else if (i == 14) {\n return \"4\";\n } else if (i == 19) {\n return (Math.floor(Math.random() * 4) + 8).toString(16);\n } else {\n return Math.floor(Math.random() * 15).toString(16);\n }\n })\n .join(\"\");\n}\n\nexport function createScriptElement(element: Element, cb?: () => void) {\n if (element.getAttribute(\"data-turbolinks-eval\") == \"false\") {\n return element;\n } else {\n const createdScriptElement = document.createElement(\"script\");\n createdScriptElement.textContent = element.textContent;\n // async false makes scripts run in-order. it wont block js execution (thankfully)\n // https://github.com/turbolinks/turbolinks/issues/282#issuecomment-355731712\n createdScriptElement.async = false;\n copyElementAttributes(createdScriptElement, element);\n if (cb) {\n createdScriptElement.addEventListener(\"load\", cb);\n }\n return createdScriptElement;\n }\n}\n\nexport function copyElementAttributes(\n destinationElement: Element,\n sourceElement: Element\n) {\n for (const { name, value } of array(sourceElement.attributes)) {\n destinationElement.setAttribute(name, value);\n }\n}\n\nfunction replaceElementWithElement(fromElement: Element, toElement: Element) {\n const parentElement = fromElement.parentElement;\n if (parentElement) {\n return parentElement.replaceChild(toElement, fromElement);\n }\n}\nexport function activateNewBodyScriptElements(\n newScriptElements: HTMLScriptElement[]\n) {\n for (const inertScriptElement of newScriptElements) {\n const activatedScriptElement = createScriptElement(inertScriptElement);\n replaceElementWithElement(inertScriptElement, activatedScriptElement);\n }\n}\n\nexport function focusFirstAutofocusableElement() {\n const element = document.body.querySelector(\"[autofocus]\");\n if (element && \"focus\" in element && typeof element.focus === \"function\") {\n element.focus();\n }\n}\n","export class LruCache<T> {\n private values: Map<string, T> = new Map<string, T>();\n private maxEntries;\n\n constructor(maxEntries: number) {\n this.maxEntries = maxEntries;\n }\n\n public get(key: string): T | undefined {\n const hasKey = this.values.has(key);\n let entry: T | undefined;\n if (hasKey) {\n // peek the entry, re-insert for LRU strategy\n entry = this.values.get(key)!;\n this.values.delete(key);\n this.values.set(key, entry);\n }\n\n return entry;\n }\n\n public put(key: string, value: T) {\n if (this.values.size >= this.maxEntries) {\n // least-recently used cache eviction strategy\n const keyToDelete = this.values.keys().next().value;\n\n this.values.delete(keyToDelete);\n }\n\n this.values.set(key, value);\n }\n}\n","import { unindent } from \"./util\";\n\nexport class ProgressBar {\n static animationDuration = 300; /*ms*/\n\n static get defaultCSS() {\n return unindent`\n .turbolinks-progress-bar {\n position: fixed;\n display: block;\n top: 0;\n left: 0;\n height: 3px;\n background: #0076ff;\n z-index: 9999;\n transition:\n width ${ProgressBar.animationDuration}ms ease-out,\n opacity ${ProgressBar.animationDuration / 2}ms ${\n ProgressBar.animationDuration / 2\n }ms ease-in;\n transform: translate3d(0, 0, 0);\n }\n `;\n }\n\n readonly stylesheetElement = this.createStylesheetElement();\n readonly progressElement = this.createProgressElement();\n\n hiding = false;\n trickleInterval?: number;\n value = 0;\n visible = false;\n\n show() {\n if (!this.visible) {\n this.visible = true;\n this.installStylesheetElement();\n this.installProgressElement();\n this.startTrickling();\n }\n }\n\n hide() {\n if (this.visible && !this.hiding) {\n this.hiding = true;\n this.fadeProgressElement(() => {\n this.uninstallProgressElement();\n this.stopTrickling();\n this.visible = false;\n this.hiding = false;\n });\n }\n }\n\n setValue(value: number) {\n this.value = value;\n this.refresh();\n }\n\n // Private\n\n installStylesheetElement() {\n document.head.insertBefore(\n this.stylesheetElement,\n document.head.firstChild\n );\n }\n\n installProgressElement() {\n this.progressElement.style.width = \"0\";\n this.progressElement.style.opacity = \"1\";\n document.documentElement.insertBefore(this.progressElement, document.body);\n this.refresh();\n }\n\n fadeProgressElement(callback: () => void) {\n this.progressElement.style.opacity = \"0\";\n setTimeout(callback, ProgressBar.animationDuration * 1.5);\n }\n\n uninstallProgressElement() {\n if (this.progressElement.parentNode) {\n document.documentElement.removeChild(this.progressElement);\n }\n }\n\n startTrickling() {\n if (!this.trickleInterval) {\n this.trickleInterval = window.setInterval(\n this.trickle,\n ProgressBar.animationDuration\n );\n }\n }\n\n stopTrickling() {\n window.clearInterval(this.trickleInterval);\n delete this.trickleInterval;\n }\n\n trickle = () => {\n this.setValue(this.value + Math.random() / 100);\n };\n\n refresh() {\n requestAnimationFrame(() => {\n this.progressElement.style.width = `${10 + this.value * 90}%`;\n });\n }\n\n createStylesheetElement() {\n const element = document.createElement(\"style\");\n element.type = \"text/css\";\n element.textContent = ProgressBar.defaultCSS;\n return element;\n }\n\n createProgressElement() {\n const element = document.createElement(\"div\");\n element.className = \"turbolinks-progress-bar\";\n return element;\n }\n}\n","import { Adapter } from \"./adapter\";\nimport { Controller } from \"./controller\";\nimport { Locatable } from \"./location\";\nimport { ProgressBar } from \"./progress_bar\";\nimport { Action } from \"./types\";\nimport { Visit } from \"./visit\";\n\nexport class BrowserAdapter implements Adapter {\n readonly controller: Controller;\n readonly progressBar = new ProgressBar();\n\n progressBarTimeout?: number;\n\n constructor(controller: Controller) {\n this.controller = controller;\n }\n\n visitProposedToLocationWithAction(location: Locatable, action: Action) {\n this.controller.startVisitToLocationWithAction(location, action);\n }\n\n visitStarted(visit: Visit) {\n visit.issueRequest();\n visit.changeHistory();\n visit.loadCachedSnapshot();\n }\n\n visitRequestStarted(visit: Visit) {\n this.progressBar.setValue(0);\n if (visit.hasCachedSnapshot() || visit.action != \"restore\") {\n this.showProgressBarAfterDelay();\n } else {\n this.showProgressBar();\n }\n }\n\n visitRequestProgressed(visit: Visit) {\n this.progressBar.setValue(visit.progress);\n }\n\n visitRequestCompleted(visit: Visit) {\n visit.loadResponse();\n }\n\n visitRequestFailedWithStatusCode(visit: Visit, statusCode: number) {\n switch (statusCode) {\n // TODO\n // case SystemStatusCode.networkFailure:\n // case SystemStatusCode.timeoutFailure:\n // case SystemStatusCode.contentTypeMismatch:\n // return this.reload()\n default:\n return visit.loadResponse();\n }\n }\n\n visitRequestFinished(visit: Visit) {\n this.hideProgressBar();\n }\n\n visitCompleted(visit: Visit) {\n visit.onCompleted();\n }\n\n pageInvalidated() {\n this.reload();\n }\n\n visitFailed(visit: Visit) {}\n\n visitRendered(visit: Visit) {}\n\n // Private\n\n showProgressBarAfterDelay() {\n this.progressBarTimeout = window.setTimeout(\n this.showProgressBar,\n this.controller.progressBarDelay\n );\n }\n\n showProgressBar = () => {\n this.progressBar.show();\n };\n\n hideProgressBar() {\n this.progressBar.hide();\n if (this.progressBarTimeout != null) {\n window.clearTimeout(this.progressBarTimeout);\n delete this.progressBarTimeout;\n }\n }\n\n reload() {\n window.location.reload();\n }\n}\n","export type Locatable = Location | string;\n\nexport class Location {\n static get currentLocation() {\n return this.wrap(window.location.toString());\n }\n\n static wrap(locatable: Locatable): Location;\n static wrap(locatable?: Locatable | null): Location | undefined;\n static wrap(locatable: Locatable) {\n if (typeof locatable == \"string\") {\n return new this(locatable);\n } else if (locatable != null) {\n return locatable;\n }\n }\n\n readonly absoluteURL: string;\n readonly requestURL: string;\n readonly anchor?: string;\n\n constructor(url: string) {\n const linkWithAnchor = document.createElement(\"a\");\n linkWithAnchor.href = url;\n\n this.absoluteURL = linkWithAnchor.href;\n\n const anchorLength = linkWithAnchor.hash.length;\n if (anchorLength < 2) {\n this.requestURL = this.absoluteURL;\n } else {\n this.requestURL = this.absoluteURL.slice(0, -anchorLength);\n this.anchor = linkWithAnchor.hash.slice(1);\n }\n }\n\n getOrigin() {\n return this.absoluteURL.split(\"/\", 3).join(\"/\");\n }\n\n getPath() {\n return (this.requestURL.match(/\\/\\/[^/]*(\\/[^?;]*)/) || [])[1] || \"/\";\n }\n\n getPathComponents() {\n return this.getPath().split(\"/\").slice(1);\n }\n\n getLastPathComponent() {\n return this.getPathComponents().slice(-1)[0];\n }\n\n getExtension() {\n return (this.getLastPathComponent().match(/\\.[^.]*$/) || [])[0] || \"\";\n }\n\n isHTML() {\n return this.getExtension().match(/^(?:|\\.(?:htm|html|xhtml))$/);\n }\n\n isPrefixedBy(location: Location): boolean {\n const prefixURL = getPrefixURL(location);\n return (\n this.isEqualTo(location) || stringStartsWith(this.absoluteURL, prefixURL)\n );\n }\n\n isEqualTo(location?: Location) {\n return location && this.absoluteURL === location.absoluteURL;\n }\n\n toCacheKey() {\n return this.requestURL;\n }\n\n toJSON() {\n return this.absoluteURL;\n }\n\n toString() {\n return this.absoluteURL;\n }\n\n valueOf() {\n return this.absoluteURL;\n }\n}\n\nfunction getPrefixURL(location: Location) {\n return addTrailingSlash(location.getOrigin() + location.getPath());\n}\n\nfunction addTrailingSlash(url: string) {\n return stringEndsWith(url, \"/\") ? url : url + \"/\";\n}\n\nfunction stringStartsWith(string: string, prefix: string) {\n return string.slice(0, prefix.length) === prefix;\n}\n\nfunction stringEndsWith(string: string, suffix: string) {\n return string.slice(-suffix.length) === suffix;\n}\n","export type Action = \"advance\" | \"replace\" | \"restore\";\n\nexport function isAction(action: any): action is Action {\n return action == \"advance\" || action == \"replace\" || action == \"restore\";\n}\n\nexport type Position = { x: number; y: number };\n","import { navigate } from \"vike/client/router\";\nimport { Adapter } from \"./adapter\";\nimport { Controller } from \"./controller.js\";\nimport { Location } from \"./location\";\nimport { Action } from \"./types\";\nimport { uuid } from \"./util\";\n\nexport enum TimingMetric {\n visitStart = \"visitStart\",\n requestStart = \"requestStart\",\n requestEnd = \"requestEnd\",\n visitEnd = \"visitEnd\",\n}\n\nexport type TimingMetrics = Partial<{ [metric in TimingMetric]: any }>;\n\nexport enum VisitState {\n initialized = \"initialized\",\n started = \"started\",\n canceled = \"canceled\",\n failed = \"failed\",\n completed = \"completed\",\n}\n\nexport class Visit {\n readonly controller: Controller;\n readonly action: Action;\n readonly adapter: Adapter;\n readonly identifier = uuid();\n readonly restorationIdentifier: string;\n readonly timingMetrics: TimingMetrics = {};\n\n frame?: number;\n location: Location;\n progress = 0;\n referrer?: Location;\n redirectedToLocation?: Location;\n snapshotCached = false;\n state = VisitState.initialized;\n\n requestInFlight = false;\n renderFn?: () => void;\n\n constructor(\n controller: Controller,\n location: Location,\n action: Action,\n restorationIdentifier: string = uuid()\n ) {\n this.controller = controller;\n this.location = location;\n this.action = action;\n this.adapter = controller.adapter;\n this.restorationIdentifier = restorationIdentifier;\n }\n\n start() {\n if (this.state == VisitState.initialized) {\n this.recordTimingMetric(TimingMetric.visitStart);\n this.state = VisitState.started;\n this.adapter.visitStarted(this);\n }\n }\n\n cancel() {\n if (this.state == VisitState.started) {\n this.requestInFlight = false;\n this.cancelRender();\n this.state = VisitState.canceled;\n }\n }\n\n complete() {\n if (this.state == VisitState.started) {\n this.recordTimingMetric(TimingMetric.visitEnd);\n this.state = VisitState.completed;\n this.adapter.visitCompleted(this);\n this.controller.visitCompleted(this);\n }\n }\n\n fail() {\n if (this.state == VisitState.started) {\n this.state = VisitState.failed;\n this.adapter.visitFailed(this);\n }\n }\n\n changeHistory() {\n // no-op since issueRequest calls navigate which handles all of this already\n return;\n }\n\n issueRequest() {\n if (!this.requestInFlight) {\n if (this.shouldIssueRequest()) {\n const url = new URL(\n this.location.toString(),\n this.location.getOrigin()\n );\n navigate(url.pathname + url.hash + url.search, {\n overwriteLastHistoryEntry: this.action === \"replace\",\n }).catch(console.error);\n this.progress = 0;\n this.requestInFlight = true;\n }\n }\n }\n\n getCachedSnapshot() {\n const snapshot = this.controller.getCachedSnapshotForLocation(\n this.location\n );\n if (snapshot) {\n if (this.action == \"restore\") {\n return snapshot;\n }\n }\n }\n\n hasCachedSnapshot() {\n return this.getCachedSnapshot() != null;\n }\n\n loadCachedSnapshot() {\n // no-op since issueRequest calls navigate which handles all of this already\n return;\n }\n\n loadResponse() {\n this.render(() => {\n if (!this.renderFn)\n throw new Error(\"Render details not set before rendering\");\n this.cacheSnapshot();\n this.renderFn();\n });\n }\n\n updateIfRedirect(url: string) {\n const newLocation = Location.wrap(url);\n if (this.location.isEqualTo(newLocation)) return;\n console.log(\"redirected\", this.location, newLocation);\n this.redirectedToLocation = newLocation;\n }\n\n onCompleted() {\n if (this.redirectedToLocation) {\n this.location = this.redirectedToLocation;\n this.controller.updateLocationAndRestorationIdentifier(\n this.redirectedToLocation,\n this.restorationIdentifier\n );\n }\n }\n\n // HTTP request delegate\n\n /*\n requestStarted() {\n this.recordTimingMetric(TimingMetric.requestStart);\n this.adapter.visitRequestStarted(this);\n }\n\n requestProgressed(progress: number) {\n this.progress = progress;\n if (this.adapter.visitRequestProgressed) {\n this.adapter.visitRequestProgressed(this);\n }\n }\n\n requestFailedWithStatusCode(statusCode: number, response?: string) {\n this.response = response;\n this.adapter.visitRequestFailedWithStatusCode(this, statusCode);\n }\n\n requestFinished() {\n this.recordTimingMetric(TimingMetric.requestEnd);\n this.adapter.visitRequestFinished(this);\n }\n */\n\n // Instrumentation\n\n recordTimingMetric(metric: TimingMetric) {\n this.timingMetrics[metric] = new Date().getTime();\n }\n\n getTimingMetrics(): TimingMetrics {\n return { ...this.timingMetrics };\n }\n\n // Private\n\n shouldIssueRequest() {\n return this.action == \"restore\" ? !this.hasCachedSnapshot() : true;\n }\n\n cacheSnapshot() {\n if (!this.snapshotCached) {\n this.controller.cacheSnapshot();\n this.snapshotCached = true;\n }\n }\n\n render(callback: () => void) {\n this.cancelRender();\n this.frame = requestAnimationFrame(() => {\n delete this.frame;\n callback.call(this);\n });\n }\n\n cancelRender() {\n if (this.frame) {\n cancelAnimationFrame(this.frame);\n delete this.frame;\n }\n }\n}\n","import { LruCache } from \"./lruCache\";\nimport { Adapter } from \"./adapter\";\nimport { BrowserAdapter } from \"./browser_adapter\";\nimport { Location, Locatable } from \"./location\";\nimport { Action, isAction } from \"./types\";\nimport { closest, defer, dispatch, uuid } from \"./util\";\nimport { Visit } from \"./visit\";\nimport { PageContextClient } from \"vike/types\";\n\nexport type TimingData = {};\nexport type VisitOptions = { action: Action };\n\nexport interface Snapshot {\n bodyEl: HTMLElement;\n headEl: HTMLHeadElement;\n pageContext: PageContextClient;\n}\n\nexport class Controller {\n adapter: Adapter = new BrowserAdapter(this);\n\n cache = new LruCache<Snapshot>(10);\n currentVisit?: Visit;\n enabled = true;\n lastRenderedLocation?: Location;\n location!: Location;\n progressBarDelay = 500;\n restorationIdentifier!: string; // This only exists for compatibility with iOS\n started = false;\n pageContext: any;\n\n start() {\n if (!this.started) {\n addEventListener(\"click\", this.clickCaptured, true);\n this.location = Location.currentLocation;\n this.restorationIdentifier = uuid();\n this.lastRenderedLocation = this.location;\n this.started = true;\n this.enabled = true;\n }\n }\n\n disable() {\n this.enabled = false;\n }\n\n stop() {\n if (this.started) {\n removeEventListener(\"click\", this.clickCaptured, true);\n this.started = false;\n }\n }\n\n clearCache() {\n this.cache = new LruCache(10);\n }\n\n visit(location: Locatable, options: Partial<VisitOptions> = {}) {\n location = Location.wrap(location);\n if (this.applicationAllowsVisitingLocation(location)) {\n if (this.locationIsVisitable(location)) {\n const action = options.action || \"advance\";\n this.adapter.visitProposedToLocationWithAction(location, action);\n } else {\n window.location.href = location.toString();\n }\n }\n }\n\n startVisitToLocationWithAction(\n location: Locatable,\n action: Action,\n restorationIdentifier?: string\n ) {\n this.startVisit(Location.wrap(location), action);\n }\n\n setProgressBarDelay(delay: number) {\n this.progressBarDelay = delay;\n }\n\n // For after redirect, on page load we update this info for ios adapter\n updateLocationAndRestorationIdentifier(\n locatable: Locatable,\n restorationIdentifier: string\n ) {\n this.location = Location.wrap(locatable);\n this.restorationIdentifier = restorationIdentifier;\n }\n\n // History delegate\n\n historyPoppedToLocationWithRestorationIdentifier(\n location: Locatable,\n restorationIdentifier: string\n ) {\n if (this.enabled) {\n this.location = Location.wrap(location);\n this.restorationIdentifier = restorationIdentifier;\n this.startVisit(this.location, \"restore\");\n } else {\n this.adapter.pageInvalidated();\n }\n }\n\n // Snapshot cache\n\n getCachedSnapshotForLocation(location: Locatable) {\n return this.cache.get(Location.wrap(location).toCacheKey());\n }\n\n shouldCacheSnapshot() {\n return (\n document.querySelector(\"#proxied-body\") &&\n document.head\n .querySelector(\"meta[name='turbolinks-no-cache']\")\n ?.getAttribute(\"content\") != \"no-cache\"\n );\n }\n\n cacheSnapshot() {\n if (this.shouldCacheSnapshot()) {\n this.notifyApplicationBeforeCachingSnapshot();\n const snapshot = {\n bodyEl: document.body.cloneNode(true),\n headEl: document.head.cloneNode(true),\n pageContext: this.pageContext,\n };\n const location = this.lastRenderedLocation || Location.currentLocation;\n defer(() => this.cache.put(location.toCacheKey(), snapshot));\n }\n }\n\n // View\n viewInvalidated() {\n this.adapter.pageInvalidated();\n }\n\n viewWillRender() {\n this.notifyApplicationBeforeRender();\n }\n\n viewRendered() {\n this.lastRenderedLocation = this.currentVisit!.location;\n this.notifyApplicationAfterRender();\n }\n\n // Event handlers\n\n clickCaptured = () => {\n removeEventListener(\"click\", this.clickBubbled, false);\n addEventListener(\"click\", this.clickBubbled, false);\n };\n\n clickBubbled = (event: MouseEvent) => {\n if (this.enabled && this.clickEventIsSignificant(event)) {\n const link = this.getVisitableLinkForTarget(event.target);\n if (link) {\n const location = this.getVisitableLocationForLink(link);\n if (\n location &&\n this.applicationAllowsFollowingLinkToLocation(link, location)\n ) {\n event.preventDefault();\n event.stopPropagation();\n const action = this.getActionForLink(link);\n this.visit(location, { action });\n }\n }\n }\n };\n\n // Application events\n\n applicationAllowsFollowingLinkToLocation(link: Element, location: Location) {\n const event = this.notifyApplicationAfterClickingLinkToLocation(\n link,\n location\n );\n return !event.defaultPrevented;\n }\n\n applicationAllowsVisitingLocation(location: Location) {\n const event = this.notifyApplicationBeforeVisitingLocation(location);\n return !event.defaultPrevented;\n }\n\n notifyApplicationAfterClickingLinkToLocation(\n link: Element,\n location: Location\n ) {\n return dispatch(\"turbolinks:click\", {\n target: link,\n data: { url: location.absoluteURL },\n cancelable: true,\n });\n }\n\n notifyApplicationBeforeVisitingLocation(location: Location) {\n return dispatch(\"turbolinks:before-visit\", {\n data: { url: location.absoluteURL },\n cancelable: true,\n });\n }\n\n notifyApplicationAfterVisitingLocation(location: Location) {\n return dispatch(\"turbolinks:visit\", {\n data: { url: location.absoluteURL },\n });\n }\n\n notifyApplicationBeforeCachingSnapshot() {\n return dispatch(\"turbolinks:before-cache\");\n }\n\n notifyApplicationBeforeRender() {\n return dispatch(\"turbolinks:before-render\");\n }\n\n notifyApplicationAfterRender() {\n return dispatch(\"turbolinks:render\");\n }\n\n notifyApplicationAfterPageLoad(timing: TimingData = {}) {\n return dispatch(\"turbolinks:load\", {\n data: { url: this.location.absoluteURL, timing },\n });\n }\n\n // Private\n\n startVisit(location: Location, action: Action) {\n if (this.currentVisit) {\n this.currentVisit.cancel();\n }\n this.currentVisit = this.createVisit(location, action);\n this.currentVisit.start();\n this.notifyApplicationAfterVisitingLocation(location);\n }\n\n createVisit(location: Location, action: Action): Visit {\n const visit = new Visit(this, location, action);\n visit.referrer = this.location;\n if (action === \"restore\") {\n // dont issue navigate() because VPS already did.\n visit.requestInFlight = true;\n }\n return visit;\n }\n\n visitCompleted(visit: Visit) {\n this.notifyApplicationAfterPageLoad(visit.getTimingMetrics());\n }\n\n clickEventIsSignificant(event: MouseEvent) {\n return !(\n (event.target && (event.target as any).isContentEditable) ||\n event.defaultPrevented ||\n event.which > 1 ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey\n );\n }\n\n getVisitableLinkForTarget(target: EventTarget | null) {\n if (target instanceof Element && this.elementIsVisitable(target)) {\n return closest(target, \"a[href]:not([target]):not([download])\");\n }\n }\n\n getVisitableLocationForLink(link: Element) {\n const location = new Location(link.getAttribute(\"href\") || \"\");\n if (this.locationIsVisitable(location)) {\n return location;\n }\n }\n\n getActionForLink(link: Element): Action {\n const action = link.getAttribute(\"data-turbolinks-action\");\n return isAction(action) ? action : \"advance\";\n }\n\n elementIsVisitable(element: Element) {\n const container = closest(element, \"[data-turbolinks]\");\n if (container) {\n return container.getAttribute(\"data-turbolinks\") != \"false\";\n } else {\n return true;\n }\n }\n\n locationIsVisitable(location: Location) {\n return location.isPrefixedBy(new Location(\"/\")) && location.isHTML();\n }\n}\n","import { mergeHead } from \"./mergeHead\";\nimport { Controller, VisitOptions } from \"./controller\";\nimport { Locatable } from \"./location\";\nimport {\n activateNewBodyScriptElements,\n focusFirstAutofocusableElement,\n} from \"./util\";\n\nconst controller = new Controller();\n\nexport const Turbolinks = {\n get supported() {\n return true;\n },\n\n controller,\n\n visit(location: Locatable, options?: Partial<VisitOptions>) {\n controller.visit(location, options);\n },\n\n clearCache() {\n controller.clearCache();\n },\n\n setProgressBarDelay(delay: number) {\n controller.setProgressBarDelay(delay);\n },\n\n start() {\n if (window.Turbolinks?.controller?.started) return;\n\n // because this runs after ios hooks, we have to recover. See onRenderHtml\n if (\n window.Turbolinks !== Turbolinks &&\n window.Turbolinks?.controller?.adapter\n ) {\n (window.Turbolinks.controller.adapter as any).controller = controller;\n controller.adapter = window.Turbolinks.controller.adapter;\n }\n // Tells vike not to do link interception\n (window as any)._disableAutomaticLinkInterception = true;\n window.Turbolinks = Turbolinks;\n controller.start();\n },\n\n _vpsCachePageContext(pageContext: any) {\n controller.pageContext = pageContext;\n },\n\n // Returns promise for turbolinks to be ready to render (runs requestAnimationFrame internally)\n async _vikeBeforeRender(beforeRenderFn?: () => void): Promise<void> {\n if (controller.currentVisit) {\n const { currentVisit } = controller;\n\n return new Promise((resolve) => {\n currentVisit.renderFn = () => {\n beforeRenderFn?.();\n controller.viewWillRender(); // turbolinks:before-render\n resolve();\n };\n\n controller.adapter.visitRequestCompleted(currentVisit);\n controller.adapter.visitRequestFinished(currentVisit);\n });\n } else {\n console.error(\n \"controller.currentVisit should exist when onRenderClient fires\"\n );\n }\n },\n\n async _vikeAfterRender(activateBody: boolean) {\n if (controller.currentVisit) {\n if (activateBody) {\n activateNewBodyScriptElements(\n Array.from(document.body.querySelectorAll(\"script\"))\n );\n }\n\n focusFirstAutofocusableElement();\n\n controller.viewRendered(); // turbolinks:render\n controller.adapter.visitRendered(controller.currentVisit);\n controller.currentVisit.complete(); // turbolinks:load\n } else {\n console.error(\n \"controller.currentVisit should exist when onAfterRenderClient fires\"\n );\n }\n },\n};\n\nexport type Turbolinks = typeof Turbolinks;\n"],"mappings":"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","names":["closest","controller","controller"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,20 +1,6 @@
|
|
|
1
|
-
export { Config, GuardAsync, GuardSync, Meta, OnBeforePrerenderStartAsync, OnBeforePrerenderStartSync, OnBeforeRenderAsync, OnBeforeRenderSync, OnBeforeRouteAsync, OnBeforeRouteSync, OnHydrationEndAsync, OnHydrationEndSync, OnPageTransitionEndAsync, OnPageTransitionEndSync, OnPageTransitionStartAsync, OnPageTransitionStartSync, OnPrerenderStartAsync, OnPrerenderStartSync, OnRenderClientAsync, OnRenderClientSync, OnRenderHtmlAsync, OnRenderHtmlSync, RouteAsync, RouteSync } from 'vike/types';
|
|
2
1
|
import { navigate as navigate$1 } from 'vike/client/router';
|
|
3
2
|
export { prefetch } from 'vike/client/router';
|
|
4
|
-
import { A as ApplicationFacingPageContext, a as AugmentMe } from './internal-837e7a40.js';
|
|
5
|
-
export { N as BifrostConfig, P as BifrostProxyConfig, D as DocumentProps, d as DynamicScripts, G as GetLayout, b as LayoutComponent, L as LayoutMap, c as PageContext, S as Scripts } from './internal-837e7a40.js';
|
|
6
|
-
export { PageContextProvider, usePageContext } from './renderer/usePageContext.js';
|
|
7
|
-
export { useNavigation } from './renderer/useNavigation.js';
|
|
8
|
-
import 'react';
|
|
9
|
-
import './renderer/configs/bifrost.js';
|
|
10
|
-
import './renderer/configs/wrapped.js';
|
|
11
3
|
|
|
12
4
|
declare const navigate: typeof navigate$1;
|
|
13
|
-
declare global {
|
|
14
|
-
namespace Vike {
|
|
15
|
-
interface PageContext extends ApplicationFacingPageContext, AugmentMe.PageContextInit {
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
5
|
|
|
20
|
-
export {
|
|
6
|
+
export { navigate };
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
useNavigation
|
|
3
|
-
} from "./chunk-PESUYCE4.js";
|
|
4
|
-
import {
|
|
5
|
-
PageContextProvider,
|
|
6
|
-
usePageContext
|
|
7
|
-
} from "./chunk-IYGONC4I.js";
|
|
8
|
-
import "./chunk-EYYCKU6F.js";
|
|
9
|
-
|
|
10
1
|
// index.ts
|
|
11
2
|
import { prefetch } from "vike/client/router";
|
|
12
3
|
var navigate = async (url, opts) => {
|
|
@@ -20,10 +11,7 @@ var navigate = async (url, opts) => {
|
|
|
20
11
|
}
|
|
21
12
|
};
|
|
22
13
|
export {
|
|
23
|
-
PageContextProvider,
|
|
24
14
|
navigate,
|
|
25
|
-
prefetch
|
|
26
|
-
useNavigation,
|
|
27
|
-
usePageContext
|
|
15
|
+
prefetch
|
|
28
16
|
};
|
|
29
17
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../index.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../index.ts"],"sourcesContent":["import { navigate as vikeNavigate } from \"vike/client/router\";\nexport { prefetch } from \"vike/client/router\";\n\n// It would be great if we could just let people call `navigate` from Vike,\n// Multiple blockers:\n// - detecting advance/replace\n// - canceling navigation in event handlers / adapter\nexport const navigate: typeof vikeNavigate = async (url, opts) => {\n window.Turbolinks.visit(url, {\n action: opts?.overwriteLastHistoryEntry ? \"replace\" : \"advance\",\n });\n if (window.Turbolinks.controller.currentVisit?.state === \"started\") {\n return new Promise((resolve) => {\n window.document.addEventListener(\"turbolinks:load\", (ev) => resolve());\n });\n }\n};\n"],"mappings":";AACA,SAAS,gBAAgB;AAMlB,IAAM,WAAgC,OAAO,KAAK,SAAS;AAChE,SAAO,WAAW,MAAM,KAAK;AAAA,IAC3B,QAAQ,MAAM,4BAA4B,YAAY;AAAA,EACxD,CAAC;AACD,MAAI,OAAO,WAAW,WAAW,cAAc,UAAU,WAAW;AAClE,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,aAAO,SAAS,iBAAiB,mBAAmB,CAAC,OAAO,QAAQ,CAAC;AAAA,IACvE,CAAC;AAAA,EACH;AACF;","names":[]}
|
package/dist/renderer/+config.js
CHANGED
|
@@ -1,50 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import {
|
|
5
|
-
wrappedConfig
|
|
6
|
-
} from "../chunk-X2R7ODLQ.js";
|
|
7
|
-
|
|
8
|
-
// renderer/config.ts
|
|
9
|
-
var config_default = {
|
|
10
|
-
name: "@alignable/bifrost",
|
|
11
|
-
require: {
|
|
12
|
-
vike: ">=0.4.244"
|
|
13
|
-
},
|
|
14
|
-
clientHooks: true,
|
|
15
|
-
onBeforeRoute: "import:@alignable/bifrost/renderer/onBeforeRoute:default",
|
|
16
|
-
onRenderClient: "import:@alignable/bifrost/renderer/onRenderClient:default",
|
|
17
|
-
onRenderHtml: "import:@alignable/bifrost/renderer/onRenderHtml:default",
|
|
18
|
-
passToClient: [...bifrostConfig.passToClient, ...wrappedConfig.passToClient],
|
|
19
|
-
clientRouting: true,
|
|
20
|
-
hydrationCanBeAborted: true,
|
|
21
|
-
meta: {
|
|
22
|
-
...bifrostConfig.meta,
|
|
23
|
-
...wrappedConfig.meta,
|
|
24
|
-
onClientInit: { env: { client: true }, global: true },
|
|
25
|
-
proxyMode: {
|
|
26
|
-
env: { server: true, client: true, config: true },
|
|
27
|
-
effect({ configDefinedAt, configValue }) {
|
|
28
|
-
switch (configValue) {
|
|
29
|
-
case false:
|
|
30
|
-
return {};
|
|
31
|
-
case "wrapped":
|
|
32
|
-
return {
|
|
33
|
-
meta: {
|
|
34
|
-
onBeforeRender: { env: { client: true, server: false } }
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
case "passthru":
|
|
38
|
-
return { clientRouting: false };
|
|
39
|
-
default:
|
|
40
|
-
throw new Error(
|
|
41
|
-
`${configDefinedAt} should be one of: false, "wrapped", "passthru"`
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
};
|
|
2
|
+
config_default
|
|
3
|
+
} from "../chunk-4W4KH2A5.js";
|
|
48
4
|
export {
|
|
49
5
|
config_default as default
|
|
50
6
|
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// renderer/Head.tsx
|
|
2
|
+
import React from "react";
|
|
3
|
+
var turbolinksIOSCompat = `window.Turbolinks = {controller:{restorationIdentifier: ''}};`;
|
|
4
|
+
var turbolinksLoadEvent = `addEventListener("DOMContentLoaded", () => {
|
|
5
|
+
const event = new Event("turbolinks:load", { bubbles: true, cancelable: true });
|
|
6
|
+
event.data = {url: window.location.href};
|
|
7
|
+
document.dispatchEvent(event);
|
|
8
|
+
});`;
|
|
9
|
+
var turbolinksBackButton = `addEventListener("popstate", (e) => {
|
|
10
|
+
if(e.state && e.state.turbolinks) window.location.reload();
|
|
11
|
+
});`;
|
|
12
|
+
function Head() {
|
|
13
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
|
|
14
|
+
"script",
|
|
15
|
+
{
|
|
16
|
+
dangerouslySetInnerHTML: {
|
|
17
|
+
__html: turbolinksIOSCompat + turbolinksLoadEvent + turbolinksBackButton
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
));
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
Head as default
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=Head.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../renderer/Head.tsx"],"sourcesContent":["import React from \"react\";\n\n// Register turbolinks global for ios to hook into\nconst turbolinksIOSCompat = `window.Turbolinks = {controller:{restorationIdentifier: ''}};`;\n\n/// emit turbolinks:load on DOMContentLoaded\nconst turbolinksLoadEvent = `addEventListener(\"DOMContentLoaded\", () => {\n const event = new Event(\"turbolinks:load\", { bubbles: true, cancelable: true });\n event.data = {url: window.location.href};\n document.dispatchEvent(event); \n});`;\n\n/**\n * Hard reload when user navigates to a passthru turbolinks page.\n * Turbolinks navigates with history.pushState. When navigating passthru => bifrost (tracked scripts change), it reloads page.\n * Now on bifrost page, if user clicks back button, the browser sees the original navigation as initiated by pushState,\n * so the browser does not load the page. We detect this and force a reload.\n *\n * Further discussion on Vike handling this natively: https://github.com/vikejs/vike/issues/2801\n */\nconst turbolinksBackButton = `addEventListener(\"popstate\", (e) => {\n if(e.state && e.state.turbolinks) window.location.reload();\n});`;\n\nexport default function Head() {\n return (\n <>\n <script\n dangerouslySetInnerHTML={{\n __html: turbolinksIOSCompat + turbolinksLoadEvent + turbolinksBackButton\n }}\n />\n </>\n );\n}\n"],"mappings":";AAAA,OAAO,WAAW;AAGlB,IAAM,sBAAsB;AAG5B,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAc5B,IAAM,uBAAuB;AAAA;AAAA;AAId,SAAR,OAAwB;AAC7B,SACE,0DACE;AAAA,IAAC;AAAA;AAAA,MACC,yBAAyB;AAAA,QACvB,QAAQ,sBAAsB,sBAAsB;AAAA,MACtD;AAAA;AAAA,EACF,CACF;AAEJ;","names":[]}
|