@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.
Files changed (94) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +1 -1
  3. package/dist/helpers/file-helper.d.ts +6 -0
  4. package/dist/helpers/file-helper.js +6 -0
  5. package/dist/helpers/race.d.ts +1 -1
  6. package/dist/helpers/race.js +8 -9
  7. package/dist/helpers/safe.js +2 -2
  8. package/dist/models/cli-parameters.js +4 -3
  9. package/dist/services/athena/athena-service.js +3 -2
  10. package/dist/services/athena/error/athena-query-error.d.ts +4 -0
  11. package/dist/services/athena/error/athena-query-error.js +9 -0
  12. package/dist/services/athena/error/fetch-credentials-error.d.ts +5 -1
  13. package/dist/services/athena/error/fetch-credentials-error.js +9 -1
  14. package/dist/services/bundler/bundle-service.js +5 -3
  15. package/dist/services/bundler/error/bundle-fetch-error.d.ts +3 -0
  16. package/dist/services/bundler/error/bundle-fetch-error.js +8 -0
  17. package/dist/services/bundler/error/bundle-resolve-error.d.ts +3 -0
  18. package/dist/services/bundler/error/bundle-resolve-error.js +8 -0
  19. package/dist/services/config-api/client.d.ts +1 -1
  20. package/dist/services/config-api/client.js +29 -7
  21. package/dist/services/config-api/error/json-response-error.d.ts +3 -1
  22. package/dist/services/config-api/error/json-response-error.js +4 -1
  23. package/dist/services/config-api/error/login-error.d.ts +3 -3
  24. package/dist/services/config-api/error/login-error.js +3 -4
  25. package/dist/services/config-api/factory/config-api-service-factory.js +2 -1
  26. package/dist/services/config-api-service.d.ts +3 -0
  27. package/dist/services/config-api-service.js +3 -0
  28. package/dist/services/customer-config/customer-config-service-model.d.ts +2 -0
  29. package/dist/services/customer-config/customer-config-service.js +10 -2
  30. package/dist/services/customer-config/templates/config_SpeedKit.js.hbs +35 -1
  31. package/dist/services/customer-config/templates/config_documentHandler.js.hbs +112 -112
  32. package/dist/services/customer-config/templates/config_dynamicBlocks.es6.hbs +290 -108
  33. package/dist/services/customer-config/templates/config_dynamicStyles.css.hbs +8 -8
  34. package/dist/services/customer-config/templates/config_loadHandler.js.hbs +61 -0
  35. package/dist/services/deploy/error/file-handler-error.d.ts +4 -0
  36. package/dist/services/deploy/error/file-handler-error.js +9 -0
  37. package/dist/services/diff-service.d.ts +3 -0
  38. package/dist/services/diff-service.js +3 -0
  39. package/dist/services/document-handler-runtime/document-handler-server.js +2 -4
  40. package/dist/services/error-handling/error/application-error.d.ts +18 -0
  41. package/dist/services/error-handling/error/application-error.js +28 -0
  42. package/dist/services/error-handling/error/config-file-error.d.ts +4 -0
  43. package/dist/services/error-handling/error/config-file-error.js +9 -0
  44. package/dist/services/error-handling/error/connection-error.d.ts +4 -0
  45. package/dist/services/error-handling/error/connection-error.js +9 -0
  46. package/dist/services/integration-api/error/customer-config-error.d.ts +2 -1
  47. package/dist/services/integration-api/error/customer-config-error.js +2 -1
  48. package/dist/services/integration-api/error/customer-config-legacy-error.d.ts +3 -1
  49. package/dist/services/integration-api/error/customer-config-legacy-error.js +4 -1
  50. package/dist/services/integration-api/error/mandatory-file-missing-error.d.ts +3 -2
  51. package/dist/services/integration-api/error/mandatory-file-missing-error.js +4 -4
  52. package/dist/services/integration-api/error/origin-error.d.ts +2 -1
  53. package/dist/services/integration-api/error/origin-error.js +2 -1
  54. package/dist/services/integration-api/error/read-files-error.d.ts +5 -0
  55. package/dist/services/integration-api/error/read-files-error.js +10 -0
  56. package/dist/services/integration-api/external/external-file-reader.js +8 -2
  57. package/dist/services/integration-api/file-reader.js +12 -4
  58. package/dist/services/integration-api/handler/customer-config-handler.d.ts +1 -0
  59. package/dist/services/integration-api/handler/customer-config-handler.js +22 -5
  60. package/dist/services/integration-api/handler/install-resource-handler.js +2 -1
  61. package/dist/services/integration-api/integration-api-service.js +2 -1
  62. package/dist/services/integration-api/spec/mandatory-files-validator.spec.js +4 -3
  63. package/dist/services/integration-api/validator/customer-config-validator.js +1 -1
  64. package/dist/services/integration-api/validator/mandatory-files-validator.js +6 -2
  65. package/dist/services/onboarding/error/vm-error.d.ts +3 -1
  66. package/dist/services/onboarding/error/vm-error.js +4 -1
  67. package/dist/services/onboarding/fetch-event-handler.js +1 -1
  68. package/dist/services/onboarding/todo-collector.d.ts +1 -1
  69. package/dist/services/onboarding/todo-collector.js +2 -2
  70. package/dist/services/prewarm/csv-reader.js +1 -3
  71. package/dist/services/prewarm/error/invalid-origin-error.d.ts +2 -1
  72. package/dist/services/prewarm/error/invalid-origin-error.js +3 -1
  73. package/dist/services/prewarm/error/read-csv-error.d.ts +4 -5
  74. package/dist/services/prewarm/error/read-csv-error.js +5 -8
  75. package/oclif.manifest.json +7 -1
  76. package/package.json +1 -1
  77. package/dist/helpers/get-chrome-path.d.ts +0 -7
  78. package/dist/helpers/get-chrome-path.js +0 -31
  79. package/dist/helpers/is-executable.d.ts +0 -1
  80. package/dist/helpers/is-executable.js +0 -15
  81. package/dist/helpers/watch-files.d.ts +0 -1
  82. package/dist/helpers/watch-files.js +0 -20
  83. package/dist/services/deploy/error/create-find-temporary-directory-error.d.ts +0 -4
  84. package/dist/services/deploy/error/create-find-temporary-directory-error.js +0 -10
  85. package/dist/services/deploy/error/deploy-app-error.d.ts +0 -2
  86. package/dist/services/deploy/error/deploy-app-error.js +0 -5
  87. package/dist/services/deploy/error/no-active-installation-error.d.ts +0 -4
  88. package/dist/services/deploy/error/no-active-installation-error.js +0 -10
  89. package/dist/services/integration-api/error/handler/customer-config-legacy-handler.d.ts +0 -5
  90. package/dist/services/integration-api/error/handler/customer-config-legacy-handler.js +0 -24
  91. package/dist/services/integration-api/error/handler/origin-handler.d.ts +0 -5
  92. package/dist/services/integration-api/error/handler/origin-handler.js +0 -22
  93. package/dist/services/integration-api/error/load-customer-error.d.ts +0 -4
  94. 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
- const MAIN_PRE_RENDERED_BLOCK_SELECTOR = "#app";
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
- async function sleep(interval = 500) {
121
- return new Promise(resolve => setTimeout(resolve, interval))
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(root, selector, retryInterval = 500, maxAttempts = 10) {
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
- document.dispatchEvent(new CustomEvent('speed-kit-prerender-ready'))
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(local, remote, prerender) {
182
- let changes = {}
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
- let remoteBlock = remote.querySelector(selector)
192
- let reason = []
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 (localBlock && !remoteBlock) {
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
- if (localBlock.hasAttribute('data-sk-change-detect')) {
202
- continue;
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
- if (localBlock.hasAttribute('srcset') && (localBlock.getAttribute('srcset') !== remoteBlock.getAttribute('srcset'))) {
206
- reason.push({selector, reason: 'srcset differs'})
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
- if (localBlock.hasAttribute('src') && (localBlock.getAttribute('src') !== remoteBlock.getAttribute('src'))) {
210
- reason.push({selector, reason: 'src differs'})
211
- }
368
+ if (!localRootElement) {
369
+ return;
370
+ }
371
+
372
+ if (!remoteRootElement) {
373
+ sendRevalidation(config.find, "remote block not found");
374
+ }
212
375
 
213
- if (localBlock.hasAttribute('href') && (localBlock.getAttribute('href') !== remoteBlock.getAttribute('href'))) {
214
- reason.push({selector, reason: 'href differs'})
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
- let localString = localBlock.innerHTML.replace(/\s+/g, '').replace(/<!--.*?-->/g, "");
218
- let remoteString = remoteBlock.innerHTML.replace(/\s+/g, '').replace(/<!--.*?-->/g, "");
219
- if (localString !== remoteString) {
220
- reason.push({selector, reason: 'innerHTML differs'})
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
- if (reason.length > 0) {
223
- changes[selector] = reason
224
- hasChanges = true;
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
- function sendRevalidation(url, selectors) {
233
- let baqendAssetUrl = url;
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: selectors,
420
+ triggeredBy: { [selector]: [reason] },
241
421
  };
242
422
 
243
- // Please note: *.appName is being provided by the DocumentHandler AFTER having this config processed
244
- let beaconUrl = `https://${window.dynamicBlockConfig.appName}.app.baqend.com/v1/rum/pi`;
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
- /* Pre-Rendering */
108
- body > div.speed-kit-pre-rendered-block-added {
109
- position: absolute !important;
110
- top: 0 !important;
111
- width: calc(100vw) !important;
112
- left: 0 !important;
113
- z-index: 1000;
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,4 @@
1
+ import ApplicationError from "../../error-handling/error/application-error";
2
+ export declare class FileHandlerError extends ApplicationError {
3
+ readonly code = "NO_HANDLER_FOR_FILE_TYPE";
4
+ }
@@ -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;
@@ -1,4 +1,7 @@
1
1
  import { CliService } from "./cli";
2
+ /**
3
+ * @deprecated
4
+ */
2
5
  export declare class DiffService {
3
6
  private cli;
4
7
  private tempPath;
@@ -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
- const documentHandlerResponse = await (async () => {
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
- const outerModule = require(module);
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;
@@ -0,0 +1,4 @@
1
+ import ApplicationError from "./application-error";
2
+ export declare class ConfigFileError extends ApplicationError {
3
+ readonly code = "CONFIG_FILE_ERROR";
4
+ }