@speedkit/cli 2.31.1 → 2.32.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/CHANGELOG.md +11 -0
- package/README.md +1 -1
- package/dist/helpers/file-helper.d.ts +6 -0
- package/dist/helpers/file-helper.js +6 -0
- package/dist/helpers/race.d.ts +1 -1
- package/dist/helpers/race.js +8 -9
- package/dist/helpers/safe.js +2 -2
- package/dist/models/cli-parameters.js +4 -3
- package/dist/services/athena/athena-service.js +3 -2
- package/dist/services/athena/error/athena-query-error.d.ts +4 -0
- package/dist/services/athena/error/athena-query-error.js +9 -0
- package/dist/services/athena/error/fetch-credentials-error.d.ts +5 -1
- package/dist/services/athena/error/fetch-credentials-error.js +9 -1
- package/dist/services/bundler/bundle-service.js +5 -3
- package/dist/services/bundler/error/bundle-fetch-error.d.ts +3 -0
- package/dist/services/bundler/error/bundle-fetch-error.js +8 -0
- package/dist/services/bundler/error/bundle-resolve-error.d.ts +3 -0
- package/dist/services/bundler/error/bundle-resolve-error.js +8 -0
- package/dist/services/config-api/client.d.ts +1 -1
- package/dist/services/config-api/client.js +29 -7
- package/dist/services/config-api/error/json-response-error.d.ts +3 -1
- package/dist/services/config-api/error/json-response-error.js +4 -1
- package/dist/services/config-api/error/login-error.d.ts +3 -3
- package/dist/services/config-api/error/login-error.js +3 -4
- package/dist/services/config-api/factory/config-api-service-factory.js +2 -1
- package/dist/services/config-api-service.d.ts +3 -0
- package/dist/services/config-api-service.js +3 -0
- package/dist/services/customer-config/customer-config-service-model.d.ts +2 -0
- package/dist/services/customer-config/customer-config-service.js +10 -2
- package/dist/services/customer-config/templates/config_SpeedKit.js.hbs +35 -1
- package/dist/services/customer-config/templates/config_documentHandler.js.hbs +112 -112
- package/dist/services/customer-config/templates/config_dynamicBlocks.es6.hbs +290 -108
- package/dist/services/customer-config/templates/config_dynamicStyles.css.hbs +8 -8
- package/dist/services/customer-config/templates/config_loadHandler.js.hbs +61 -0
- package/dist/services/deploy/error/file-handler-error.d.ts +4 -0
- package/dist/services/deploy/error/file-handler-error.js +9 -0
- package/dist/services/diff-service.d.ts +3 -0
- package/dist/services/diff-service.js +3 -0
- package/dist/services/document-handler-runtime/document-handler-server.js +2 -4
- package/dist/services/error-handling/error/application-error.d.ts +18 -0
- package/dist/services/error-handling/error/application-error.js +28 -0
- package/dist/services/error-handling/error/config-file-error.d.ts +4 -0
- package/dist/services/error-handling/error/config-file-error.js +9 -0
- package/dist/services/error-handling/error/connection-error.d.ts +4 -0
- package/dist/services/error-handling/error/connection-error.js +9 -0
- package/dist/services/integration-api/error/customer-config-error.d.ts +2 -1
- package/dist/services/integration-api/error/customer-config-error.js +2 -1
- package/dist/services/integration-api/error/customer-config-legacy-error.d.ts +3 -1
- package/dist/services/integration-api/error/customer-config-legacy-error.js +4 -1
- package/dist/services/integration-api/error/mandatory-file-missing-error.d.ts +3 -2
- package/dist/services/integration-api/error/mandatory-file-missing-error.js +4 -4
- package/dist/services/integration-api/error/origin-error.d.ts +2 -1
- package/dist/services/integration-api/error/origin-error.js +2 -1
- package/dist/services/integration-api/error/read-files-error.d.ts +5 -0
- package/dist/services/integration-api/error/read-files-error.js +10 -0
- package/dist/services/integration-api/external/external-file-reader.js +8 -2
- package/dist/services/integration-api/file-reader.js +12 -4
- package/dist/services/integration-api/handler/customer-config-handler.d.ts +1 -0
- package/dist/services/integration-api/handler/customer-config-handler.js +22 -5
- package/dist/services/integration-api/handler/install-resource-handler.js +2 -1
- package/dist/services/integration-api/integration-api-service.js +2 -1
- package/dist/services/integration-api/spec/mandatory-files-validator.spec.js +4 -3
- package/dist/services/integration-api/validator/customer-config-validator.js +1 -1
- package/dist/services/integration-api/validator/mandatory-files-validator.js +6 -2
- package/dist/services/onboarding/error/vm-error.d.ts +3 -1
- package/dist/services/onboarding/error/vm-error.js +4 -1
- package/dist/services/onboarding/fetch-event-handler.js +1 -1
- package/dist/services/onboarding/todo-collector.d.ts +1 -1
- package/dist/services/onboarding/todo-collector.js +2 -2
- package/dist/services/prewarm/csv-reader.js +1 -3
- package/dist/services/prewarm/error/invalid-origin-error.d.ts +2 -1
- package/dist/services/prewarm/error/invalid-origin-error.js +3 -1
- package/dist/services/prewarm/error/read-csv-error.d.ts +4 -5
- package/dist/services/prewarm/error/read-csv-error.js +5 -8
- package/oclif.manifest.json +7 -1
- package/package.json +1 -1
- package/dist/helpers/get-chrome-path.d.ts +0 -7
- package/dist/helpers/get-chrome-path.js +0 -31
- package/dist/helpers/is-executable.d.ts +0 -1
- package/dist/helpers/is-executable.js +0 -15
- package/dist/helpers/watch-files.d.ts +0 -1
- package/dist/helpers/watch-files.js +0 -20
- package/dist/services/deploy/error/create-find-temporary-directory-error.d.ts +0 -4
- package/dist/services/deploy/error/create-find-temporary-directory-error.js +0 -10
- package/dist/services/deploy/error/deploy-app-error.d.ts +0 -2
- package/dist/services/deploy/error/deploy-app-error.js +0 -5
- package/dist/services/deploy/error/no-active-installation-error.d.ts +0 -4
- package/dist/services/deploy/error/no-active-installation-error.js +0 -10
- package/dist/services/integration-api/error/handler/customer-config-legacy-handler.d.ts +0 -5
- package/dist/services/integration-api/error/handler/customer-config-legacy-handler.js +0 -24
- package/dist/services/integration-api/error/handler/origin-handler.d.ts +0 -5
- package/dist/services/integration-api/error/handler/origin-handler.js +0 -22
- package/dist/services/integration-api/error/load-customer-error.d.ts +0 -4
- package/dist/services/integration-api/error/load-customer-error.js +0 -10
|
@@ -1,9 +1,34 @@
|
|
|
1
1
|
(function() {
|
|
2
2
|
{{#if addPreRendering}}
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
{{#unless supportShadowDomInPreRendering}}
|
|
4
|
+
const PRERENDER_TIMEOUT = 30_000; // 30s
|
|
5
|
+
const PRERENDER_CHECK_INTERVAL = 300; // 300ms
|
|
6
|
+
const preRenderedRootConfig = [
|
|
7
|
+
// TODO: adjust/replace this exemplary list
|
|
8
|
+
{
|
|
9
|
+
selector: "body > #app, #speed-kit-pre-rendered-app",
|
|
10
|
+
detectChanges: [
|
|
11
|
+
{
|
|
12
|
+
// header area
|
|
13
|
+
find: "#page-root > div > .aem-container > div:nth-of-type(1)",
|
|
14
|
+
detectChanges: [
|
|
15
|
+
// main categories
|
|
16
|
+
{
|
|
17
|
+
find: 'button[id^="menu-button"] p',
|
|
18
|
+
compare: ["text"],
|
|
19
|
+
},
|
|
20
|
+
// logo
|
|
21
|
+
{
|
|
22
|
+
find: "img[src]",
|
|
23
|
+
compare: ["src"],
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
];
|
|
30
|
+
{{/unless}}
|
|
5
31
|
{{/if}}
|
|
6
|
-
|
|
7
32
|
/**
|
|
8
33
|
* @type {DynamicBlockConfig}
|
|
9
34
|
*/
|
|
@@ -12,11 +37,21 @@
|
|
|
12
37
|
dynamicScriptExecution: true, // Shopify specific
|
|
13
38
|
// => as some async external scripts are injected more or less randomly into the html, destroying the order of local & remote scripts
|
|
14
39
|
{{/if}}
|
|
15
|
-
{{#unless addPreRendering}}
|
|
16
|
-
{{/unless}}
|
|
17
|
-
|
|
18
40
|
blocks: [
|
|
19
41
|
// TODO: adjust/replace this exemplary list
|
|
42
|
+
{{#if addPreRendering}}
|
|
43
|
+
{{#unless supportShadowDomInPreRendering}}
|
|
44
|
+
...preRenderedRootConfig.map((config) => {
|
|
45
|
+
return {
|
|
46
|
+
selector: config.selector,
|
|
47
|
+
merge: (localBlock, remoteBlock) => {
|
|
48
|
+
handlePreRenderBlock(localBlock, remoteBlock);
|
|
49
|
+
},
|
|
50
|
+
detectChanges: false,
|
|
51
|
+
};
|
|
52
|
+
}),
|
|
53
|
+
{{/unless}}
|
|
54
|
+
{{/if}}
|
|
20
55
|
|
|
21
56
|
{{#if isShopify}}
|
|
22
57
|
// Shopify specific:
|
|
@@ -55,27 +90,6 @@
|
|
|
55
90
|
// ...
|
|
56
91
|
],
|
|
57
92
|
},
|
|
58
|
-
{{#if addPreRendering}}
|
|
59
|
-
|
|
60
|
-
// Pre-Rendering:
|
|
61
|
-
{
|
|
62
|
-
selector: MAIN_PRE_RENDERED_BLOCK_SELECTOR,
|
|
63
|
-
merge: (localBlock,remoteBlock) => {
|
|
64
|
-
// handle preRendering by inserting pre-rendered #app before initial #app
|
|
65
|
-
if(window.dynamicBlockConfig.prerender){
|
|
66
|
-
localBlock.classList.add('speed-kit-shadow-app-root');
|
|
67
|
-
let localId = localBlock.getAttribute('id');
|
|
68
|
-
if (localId) {
|
|
69
|
-
localBlock.setAttribute('id',`sk-${localId}`)
|
|
70
|
-
}
|
|
71
|
-
localBlock.before(remoteBlock)
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
SpeedKit.replaceBlock(localBlock,remoteBlock);
|
|
75
|
-
},
|
|
76
|
-
detectChanges: false,
|
|
77
|
-
},
|
|
78
|
-
{{/if}}
|
|
79
93
|
{{#if isPlentymarkets}}
|
|
80
94
|
|
|
81
95
|
// Plentymarkets specific:
|
|
@@ -117,8 +131,171 @@
|
|
|
117
131
|
//================================================================================
|
|
118
132
|
|
|
119
133
|
{{#if addPreRendering}}
|
|
120
|
-
|
|
121
|
-
|
|
134
|
+
{{#if supportShadowDomInPreRendering}}
|
|
135
|
+
const preRenderedRootConfig = [
|
|
136
|
+
// TODO: adjust/replace this exemplary list
|
|
137
|
+
// TODO: accessing elements within a shadow-dom, nested detectChanges is needed on that level
|
|
138
|
+
{
|
|
139
|
+
selector: ".sk-container",
|
|
140
|
+
remote: "body > #app",
|
|
141
|
+
detectChanges: [
|
|
142
|
+
{
|
|
143
|
+
find: "tef-carousel",
|
|
144
|
+
detectChanges: [
|
|
145
|
+
{
|
|
146
|
+
find: ".slide tef-stage-teaser",
|
|
147
|
+
detectChanges: [
|
|
148
|
+
{
|
|
149
|
+
find: '[slot="visual"] source',
|
|
150
|
+
compare: ["srcset"],
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
find: '[slot="overline"]',
|
|
154
|
+
compare: ["text"],
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
},
|
|
158
|
+
],
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
},
|
|
162
|
+
];
|
|
163
|
+
|
|
164
|
+
document.addEventListener("dynamic-fetcher-data-ready", function () {
|
|
165
|
+
setTimeout(() => {
|
|
166
|
+
registerRemoteRenderObserver();
|
|
167
|
+
}, 500);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
function registerRemoteRenderObserver() {
|
|
171
|
+
window?.performance?.mark("sk-prerender-observe-start");
|
|
172
|
+
|
|
173
|
+
let promises = [];
|
|
174
|
+
for (const preRenderedRoot of preRenderedRootConfig) {
|
|
175
|
+
const remoteSelector = preRenderedRoot.remote;
|
|
176
|
+
const remoteRootElement = document.querySelector(remoteSelector);
|
|
177
|
+
if (!remoteRootElement) {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
promises = [...promises, ...collectWaitForEvents(remoteRootElement)];
|
|
181
|
+
}
|
|
182
|
+
removePlaceholderWhenResolved(promises);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function collectWaitForEvents(remoteRootElement) {
|
|
186
|
+
const undefinedElements =
|
|
187
|
+
remoteRootElement.querySelectorAll(":not(:defined)");
|
|
188
|
+
return [...undefinedElements]
|
|
189
|
+
.filter((element) => element.localName.startsWith("{{shadowDomCustomElementPrefix}}"))
|
|
190
|
+
.map((element) => {
|
|
191
|
+
return customElements.whenDefined(element.localName);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* checks for all webComponents to be ready before switching to origin
|
|
197
|
+
*
|
|
198
|
+
* @param remoteRootElement
|
|
199
|
+
*/
|
|
200
|
+
function removePlaceholderWhenResolved(promises) {
|
|
201
|
+
const preRenderedPlaceHolders = document.querySelectorAll(
|
|
202
|
+
".speed-kit-shadow-app-root",
|
|
203
|
+
);
|
|
204
|
+
Promise.race([
|
|
205
|
+
Promise.all(promises),
|
|
206
|
+
new Promise((resolve) => {
|
|
207
|
+
setTimeout(resolve, 5000);
|
|
208
|
+
}),
|
|
209
|
+
])
|
|
210
|
+
.catch((error) => {})
|
|
211
|
+
.then(() => {
|
|
212
|
+
try {
|
|
213
|
+
detectChanges();
|
|
214
|
+
} catch (error) {}
|
|
215
|
+
preRenderedPlaceHolders.forEach((localRootElement) =>
|
|
216
|
+
localRootElement.remove(),
|
|
217
|
+
);
|
|
218
|
+
dispatchReadyEvent(window.dynamicBlockConfig.preRenderWaitFor);
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
{{else}}
|
|
222
|
+
function handlePreRenderBlock(localBlock, remoteBlock) {
|
|
223
|
+
// handle preRendering by inserting pre-rendered #app before initial #app
|
|
224
|
+
if (
|
|
225
|
+
window.dynamicBlockConfig.preRenderWaitFor &&
|
|
226
|
+
window.dynamicBlockConfig.preRenderWaitFor.length > 0
|
|
227
|
+
) {
|
|
228
|
+
localBlock.classList.add("speed-kit-shadow-app-root");
|
|
229
|
+
localBlock.before(remoteBlock);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
SpeedKit.replaceBlock(localBlock, remoteBlock);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
document.addEventListener("dynamic-fetcher-data-ready", () => {
|
|
236
|
+
function registerRemoteRenderObserver() {
|
|
237
|
+
window?.performance?.mark("sk-prerender-observe-start");
|
|
238
|
+
|
|
239
|
+
for (const preRenderedRoot of preRenderedRootConfig) {
|
|
240
|
+
const selector = preRenderedRoot.selector
|
|
241
|
+
.split(",")
|
|
242
|
+
.map((selector) => {
|
|
243
|
+
return selector + ".speed-kit-pre-rendered-block-added";
|
|
244
|
+
})
|
|
245
|
+
.join(",");
|
|
246
|
+
|
|
247
|
+
const localRootElement = document.querySelector(selector);
|
|
248
|
+
|
|
249
|
+
if (!localRootElement) {
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
removePlaceholder(localRootElement);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
registerRemoteRenderObserver();
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* checks for all webComponents to be ready before switching to origin
|
|
260
|
+
*
|
|
261
|
+
* @param localRootElement
|
|
262
|
+
*/
|
|
263
|
+
function removePlaceholder(localRootElement) {
|
|
264
|
+
let waitFor = [];
|
|
265
|
+
for (let selector of window.dynamicBlockConfig.preRenderWaitFor) {
|
|
266
|
+
waitFor.push(
|
|
267
|
+
querySelectorWithRetry(
|
|
268
|
+
document,
|
|
269
|
+
selector,
|
|
270
|
+
PRERENDER_CHECK_INTERVAL,
|
|
271
|
+
Math.floor(PRERENDER_TIMEOUT / PRERENDER_CHECK_INTERVAL),
|
|
272
|
+
),
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const promises = [...waitFor];
|
|
277
|
+
|
|
278
|
+
Promise.race([
|
|
279
|
+
Promise.all(promises),
|
|
280
|
+
new Promise((resolve) => {
|
|
281
|
+
setTimeout(resolve, PRERENDER_TIMEOUT);
|
|
282
|
+
}),
|
|
283
|
+
])
|
|
284
|
+
.catch((error) => {})
|
|
285
|
+
.then(() => {
|
|
286
|
+
try {
|
|
287
|
+
detectChanges(
|
|
288
|
+
localRootElement,
|
|
289
|
+
window.dynamicBlockConfig.preRenderWaitFor,
|
|
290
|
+
);
|
|
291
|
+
} catch (error) {}
|
|
292
|
+
localRootElement.remove();
|
|
293
|
+
dispatchReadyEvent(window.dynamicBlockConfig.preRenderWaitFor);
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
async function sleep(interval = 100) {
|
|
298
|
+
return new Promise((resolve) => setTimeout(resolve, interval));
|
|
122
299
|
}
|
|
123
300
|
|
|
124
301
|
/**
|
|
@@ -129,119 +306,124 @@
|
|
|
129
306
|
* @param maxAttempts
|
|
130
307
|
* @returns {Promise<*>}
|
|
131
308
|
*/
|
|
132
|
-
async function querySelectorWithRetry(
|
|
309
|
+
async function querySelectorWithRetry(
|
|
310
|
+
root,
|
|
311
|
+
selector,
|
|
312
|
+
retryInterval = 100,
|
|
313
|
+
maxAttempts = 50,
|
|
314
|
+
) {
|
|
133
315
|
for (let i = 0; i < maxAttempts; i++) {
|
|
134
316
|
const element = root.querySelector(selector);
|
|
135
317
|
if (element) {
|
|
136
|
-
return element
|
|
318
|
+
return element;
|
|
137
319
|
}
|
|
138
|
-
await sleep(retryInterval)
|
|
320
|
+
await sleep(retryInterval);
|
|
139
321
|
}
|
|
140
322
|
}
|
|
141
|
-
|
|
142
|
-
// hide preRendered appRoot if configured waitForElements were found on remote block
|
|
143
|
-
const shadowAppRoot = document.querySelector(`body > ${MAIN_PRE_RENDERED_BLOCK_SELECTOR}.speed-kit-pre-rendered-block-added`);
|
|
144
|
-
if (shadowAppRoot) {
|
|
145
|
-
document.addEventListener('dynamic-fetcher-data-ready', () => {
|
|
146
|
-
if (window.dynamicBlockConfig.prerender) {
|
|
147
|
-
let waitFor = []
|
|
148
|
-
for (let selector of window.dynamicBlockConfig.prerender) {
|
|
149
|
-
waitFor.push(querySelectorWithRetry(document, prepareWaitForSelector(`body > ${MAIN_PRE_RENDERED_BLOCK_SELECTOR}:not(.speed-kit-pre-rendered-block-added) `, selector)))
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
return Promise.all(waitFor).catch(() => true).then(() => {
|
|
153
|
-
let appRoot = document.querySelector(`body > ${MAIN_PRE_RENDERED_BLOCK_SELECTOR}:not(.speed-kit-pre-rendered-block-added)`)
|
|
154
|
-
detectChanges(shadowAppRoot, appRoot, window.dynamicBlockConfig.prerender);
|
|
155
|
-
shadowAppRoot.remove();
|
|
156
|
-
dispatchReadyEvent();
|
|
157
|
-
})
|
|
158
|
-
}
|
|
159
|
-
})
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* prepare selector for querySelectorWithRetry
|
|
164
|
-
* @param root - root element
|
|
165
|
-
* @param selector - selector string
|
|
166
|
-
* @returns {*}
|
|
167
|
-
*/
|
|
168
|
-
function prepareWaitForSelector(root, selector) {
|
|
169
|
-
return selector.split(',').map(string => {
|
|
170
|
-
return root + string
|
|
171
|
-
}).join(',');
|
|
172
|
-
}
|
|
173
|
-
|
|
323
|
+
{{/if}}
|
|
174
324
|
/**
|
|
175
325
|
* dispatch prerender ready event after shadow app root was removed
|
|
176
326
|
*/
|
|
177
|
-
function dispatchReadyEvent() {
|
|
178
|
-
|
|
327
|
+
function dispatchReadyEvent(preRenderWaitForElement) {
|
|
328
|
+
window?.performance?.mark("sk-prerender-observe-end");
|
|
329
|
+
document.dispatchEvent(
|
|
330
|
+
new CustomEvent("speed-kit-prerender-ready", {
|
|
331
|
+
detail: { element: preRenderWaitForElement },
|
|
332
|
+
}),
|
|
333
|
+
);
|
|
334
|
+
document.querySelector("html").classList.add("sk-prerender-ready");
|
|
179
335
|
}
|
|
180
336
|
|
|
181
|
-
function detectChanges(
|
|
182
|
-
|
|
183
|
-
let hasChanges = false;
|
|
184
|
-
for (let selector of prerender) {
|
|
185
|
-
let localBlock = local.querySelector(selector);
|
|
186
|
-
if (!localBlock) {
|
|
187
|
-
console.log(selector + ' not found')
|
|
188
|
-
continue;
|
|
189
|
-
}
|
|
337
|
+
function detectChanges() {
|
|
338
|
+
window?.performance?.mark("sk-prerender-change-detection-start");
|
|
190
339
|
|
|
191
|
-
|
|
192
|
-
|
|
340
|
+
for (const config of preRenderedRootConfig) {
|
|
341
|
+
const localRootElement = document.querySelector(
|
|
342
|
+
`${config.selector}.speed-kit-pre-rendered-block-added`,
|
|
343
|
+
);
|
|
344
|
+
const remoteRootElement = document.querySelector(
|
|
345
|
+
`${config.selector}:not(.speed-kit-pre-rendered-block-added)`,
|
|
346
|
+
);
|
|
193
347
|
|
|
194
|
-
if (
|
|
195
|
-
reason.push({selector, reason: 'remote block not found'})
|
|
196
|
-
changes[selector] = reason
|
|
197
|
-
hasChanges = true;
|
|
348
|
+
if (!localRootElement || !remoteRootElement) {
|
|
198
349
|
continue;
|
|
199
350
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
351
|
+
if (config.detectChanges && config.detectChanges.length > 0) {
|
|
352
|
+
for (const detect of config.detectChanges) {
|
|
353
|
+
detectChangesInBlock(localRootElement, remoteRootElement, detect);
|
|
354
|
+
}
|
|
203
355
|
}
|
|
356
|
+
}
|
|
357
|
+
window?.performance?.mark("sk-prerender-change-detection-end");
|
|
358
|
+
}
|
|
204
359
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
360
|
+
function detectChangesInBlock(
|
|
361
|
+
parentLocalElement,
|
|
362
|
+
parentRemoteElement,
|
|
363
|
+
config,
|
|
364
|
+
) {
|
|
365
|
+
const localRootElement = parentLocalElement.querySelector(config.find);
|
|
366
|
+
const remoteRootElement = parentRemoteElement.querySelector(config.find);
|
|
208
367
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
368
|
+
if (!localRootElement) {
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
if (!remoteRootElement) {
|
|
373
|
+
sendRevalidation(config.find, "remote block not found");
|
|
374
|
+
}
|
|
212
375
|
|
|
213
|
-
|
|
214
|
-
|
|
376
|
+
// on next subElement search for changes
|
|
377
|
+
if (config.detectChanges && config.detectChanges.length > 0) {
|
|
378
|
+
for (const detect of config.detectChanges) {
|
|
379
|
+
detectChangesInBlock(localRootElement, remoteRootElement, detect);
|
|
215
380
|
}
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
if (!config.compare || config.compare.length === 0) {
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
216
387
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
388
|
+
for (const compare of config.compare) {
|
|
389
|
+
if (
|
|
390
|
+
compare === "text" &&
|
|
391
|
+
localRootElement.innerHTML !== remoteRootElement.innerHTML
|
|
392
|
+
) {
|
|
393
|
+
sendRevalidation(config.find, "content diffs");
|
|
394
|
+
continue;
|
|
221
395
|
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
396
|
+
|
|
397
|
+
if (
|
|
398
|
+
localRootElement.hasAttribute(compare) &&
|
|
399
|
+
remoteRootElement.hasAttribute(compare) &&
|
|
400
|
+
localRootElement.getAttribute(compare) !==
|
|
401
|
+
remoteRootElement.getAttribute(compare)
|
|
402
|
+
) {
|
|
403
|
+
sendRevalidation(config.find, `${compare} diffs`);
|
|
225
404
|
}
|
|
226
405
|
}
|
|
227
|
-
if (hasChanges) {
|
|
228
|
-
sendRevalidation(window.location.href, changes)
|
|
229
|
-
}
|
|
230
406
|
}
|
|
231
407
|
|
|
232
|
-
|
|
233
|
-
|
|
408
|
+
/**
|
|
409
|
+
* @param selector {string}
|
|
410
|
+
* @param reason {string}
|
|
411
|
+
*/
|
|
412
|
+
function sendRevalidation(selector, reason) {
|
|
413
|
+
let baqendAssetUrl = location.href;
|
|
234
414
|
let userId = window.SpeedKit.userId || "";
|
|
235
415
|
let sessionId = window.SpeedKit.sessionId || "";
|
|
236
416
|
let navigateId = window.SpeedKit.navigateId;
|
|
237
417
|
|
|
238
418
|
let detectedChanges = {
|
|
239
419
|
url: baqendAssetUrl,
|
|
240
|
-
triggeredBy:
|
|
420
|
+
triggeredBy: { [selector]: [reason] },
|
|
241
421
|
};
|
|
242
422
|
|
|
243
|
-
|
|
244
|
-
|
|
423
|
+
let beaconUrl =
|
|
424
|
+
"https://" +
|
|
425
|
+
window.dynamicBlockConfig.appName +
|
|
426
|
+
".app.baqend.com/v1/rum/pi";
|
|
245
427
|
let data = {
|
|
246
428
|
piId: navigateId,
|
|
247
429
|
userId: userId,
|
|
@@ -103,14 +103,14 @@ html > body {
|
|
|
103
103
|
mask-repeat: no-repeat;
|
|
104
104
|
}
|
|
105
105
|
{{#if addPreRendering}}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
z-index:
|
|
106
|
+
/* positioning for prerendered containers */
|
|
107
|
+
html.speed-kit-pre-rendered body > .speed-kit-shadow-app-root {
|
|
108
|
+
position: absolute;
|
|
109
|
+
top: 0;
|
|
110
|
+
width: 100%;
|
|
111
|
+
left: 0;
|
|
112
|
+
right: 0;
|
|
113
|
+
z-index: 99999;
|
|
114
114
|
background: #fff;
|
|
115
115
|
}
|
|
116
116
|
{{/if}}
|
|
@@ -16,6 +16,60 @@ import { GAEcommerceTrackingPlugin } from 'rum/GAEcommerceTrackingPlugin';
|
|
|
16
16
|
new GAEcommerceTrackingPlugin(),
|
|
17
17
|
{{/if}}
|
|
18
18
|
|
|
19
|
+
{{#if addPreRendering}}
|
|
20
|
+
{
|
|
21
|
+
key: "isPreRendered",
|
|
22
|
+
type: "PiDimension",
|
|
23
|
+
on: "load",
|
|
24
|
+
set: function () {
|
|
25
|
+
return !!document.querySelector(".speed-kit-pre-rendered");
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
on: onPrerenderReady,
|
|
30
|
+
track: function (controller, custom, event) {
|
|
31
|
+
var measure = performance.measure("sk-prerender-observe-runtime", {
|
|
32
|
+
start: "sk-prerender-observe-start",
|
|
33
|
+
end: "sk-prerender-observe-end",
|
|
34
|
+
});
|
|
35
|
+
var timing = {
|
|
36
|
+
start: measure.startTime,
|
|
37
|
+
duration: measure.duration,
|
|
38
|
+
url: window.location.href,
|
|
39
|
+
element: event?.detail?.element,
|
|
40
|
+
};
|
|
41
|
+
controller.trackCustomEvent(
|
|
42
|
+
"skPrerenderReady",
|
|
43
|
+
JSON.stringify(timing),
|
|
44
|
+
timing.duration,
|
|
45
|
+
);
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
on: onPrerenderReady,
|
|
50
|
+
track: function (controller) {
|
|
51
|
+
var measure = performance.measure(
|
|
52
|
+
"sk-prerender-observe-change-detection",
|
|
53
|
+
{
|
|
54
|
+
start: "sk-prerender-change-detection-start",
|
|
55
|
+
end: "sk-prerender-change-detection-end",
|
|
56
|
+
},
|
|
57
|
+
);
|
|
58
|
+
var timing = {
|
|
59
|
+
start: measure.startTime,
|
|
60
|
+
duration: measure.duration,
|
|
61
|
+
url: window.location.href,
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
controller.trackCustomEvent(
|
|
65
|
+
"skPrerenderChangeDetection",
|
|
66
|
+
JSON.stringify(timing),
|
|
67
|
+
timing.duration,
|
|
68
|
+
);
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{{/if}}
|
|
72
|
+
|
|
19
73
|
{
|
|
20
74
|
key: 'language',
|
|
21
75
|
type: 'SessionDimension',
|
|
@@ -391,4 +445,11 @@ import { GAEcommerceTrackingPlugin } from 'rum/GAEcommerceTrackingPlugin';
|
|
|
391
445
|
blacklistIfLoggedIn();
|
|
392
446
|
});
|
|
393
447
|
{{/if}}
|
|
448
|
+
{{#if addPreRendering}}
|
|
449
|
+
function onPrerenderReady(cb, controller) {
|
|
450
|
+
document.addEventListener("speed-kit-prerender-ready", (event) => {
|
|
451
|
+
cb(controller, event);
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
{{/if}}
|
|
394
455
|
}();
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FileHandlerError = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const application_error_1 = tslib_1.__importDefault(require("../../error-handling/error/application-error"));
|
|
6
|
+
class FileHandlerError extends application_error_1.default {
|
|
7
|
+
code = "NO_HANDLER_FOR_FILE_TYPE";
|
|
8
|
+
}
|
|
9
|
+
exports.FileHandlerError = FileHandlerError;
|
|
@@ -6,6 +6,9 @@ const fs = tslib_1.__importStar(require("node:fs/promises"));
|
|
|
6
6
|
const node_child_process_1 = require("node:child_process");
|
|
7
7
|
const node_path_1 = tslib_1.__importDefault(require("node:path"));
|
|
8
8
|
const file_helper_1 = require("../helpers/file-helper");
|
|
9
|
+
/**
|
|
10
|
+
* @deprecated
|
|
11
|
+
*/
|
|
9
12
|
class DiffService {
|
|
10
13
|
cli;
|
|
11
14
|
tempPath = null;
|
|
@@ -63,7 +63,7 @@ class DocumentHandlerServer {
|
|
|
63
63
|
filename: this.files.getByName("config_documentHandler").path,
|
|
64
64
|
});
|
|
65
65
|
try {
|
|
66
|
-
|
|
66
|
+
return await (async () => {
|
|
67
67
|
return await new Promise((resolve, reject) => {
|
|
68
68
|
vmContext.skInternalResponse.resolve = resolve;
|
|
69
69
|
// @ts-expect-error reject is unknown
|
|
@@ -72,7 +72,6 @@ class DocumentHandlerServer {
|
|
|
72
72
|
script.runInContext(context, { displayErrors: true });
|
|
73
73
|
});
|
|
74
74
|
})();
|
|
75
|
-
return documentHandlerResponse;
|
|
76
75
|
}
|
|
77
76
|
catch (error) {
|
|
78
77
|
if (error instanceof Error) {
|
|
@@ -193,8 +192,7 @@ class DocumentHandlerServer {
|
|
|
193
192
|
}
|
|
194
193
|
try {
|
|
195
194
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
196
|
-
|
|
197
|
-
return outerModule;
|
|
195
|
+
return require(module);
|
|
198
196
|
}
|
|
199
197
|
catch (error) {
|
|
200
198
|
this.cli.writeError(`[documentHandler] could not load module: ${module}`);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { PrettyPrintableError } from "@oclif/core/lib/interfaces";
|
|
2
|
+
export default class ApplicationError extends Error implements PrettyPrintableError {
|
|
3
|
+
/**
|
|
4
|
+
* a suggestion that may be useful or provide additional context
|
|
5
|
+
*/
|
|
6
|
+
suggestions?: string[];
|
|
7
|
+
/**
|
|
8
|
+
* an url to find out more information related to this error
|
|
9
|
+
* or fixing the error
|
|
10
|
+
*/
|
|
11
|
+
reference?: string;
|
|
12
|
+
/**
|
|
13
|
+
* a unique error code for this error class
|
|
14
|
+
*/
|
|
15
|
+
code?: string;
|
|
16
|
+
constructor(message: string, suggestions?: string[], reference?: string, code?: string);
|
|
17
|
+
get ref(): string;
|
|
18
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class ApplicationError extends Error {
|
|
4
|
+
/**
|
|
5
|
+
* a suggestion that may be useful or provide additional context
|
|
6
|
+
*/
|
|
7
|
+
suggestions;
|
|
8
|
+
/**
|
|
9
|
+
* an url to find out more information related to this error
|
|
10
|
+
* or fixing the error
|
|
11
|
+
*/
|
|
12
|
+
reference;
|
|
13
|
+
/**
|
|
14
|
+
* a unique error code for this error class
|
|
15
|
+
*/
|
|
16
|
+
code;
|
|
17
|
+
constructor(message, suggestions, reference, code) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.reference = reference;
|
|
20
|
+
this.suggestions = suggestions;
|
|
21
|
+
this.code = code;
|
|
22
|
+
}
|
|
23
|
+
// eslint-disable-next-line unicorn/prevent-abbreviations
|
|
24
|
+
get ref() {
|
|
25
|
+
return this.reference;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.default = ApplicationError;
|