@speedkit/cli 2.73.0 → 2.74.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 CHANGED
@@ -1,3 +1,18 @@
1
+ # [2.74.0](https://gitlab.orestes.info/baqend/speed-kit-cli/compare/v2.73.1...v2.74.0) (2025-01-09)
2
+
3
+
4
+ ### Features
5
+
6
+ * **customer-config:** improve change detection examples ([d98967d](https://gitlab.orestes.info/baqend/speed-kit-cli/commit/d98967d7da77ae9006ab9a3d1a2e87667784afd1))
7
+
8
+ ## [2.73.1](https://gitlab.orestes.info/baqend/speed-kit-cli/compare/v2.73.0...v2.73.1) (2025-01-08)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **onboarding:** fallback to utf8 if unsupported charset is detected ([425cfb4](https://gitlab.orestes.info/baqend/speed-kit-cli/commit/425cfb46862e5f1b7ed722fb9e603a98171f4398))
14
+ * **onboarding:** implement iconv-lite to get rid of charsetIssues ([1a0db84](https://gitlab.orestes.info/baqend/speed-kit-cli/commit/1a0db846c0461fc9faec25d041f8dc46f5b33252))
15
+
1
16
  # [2.73.0](https://gitlab.orestes.info/baqend/speed-kit-cli/compare/v2.72.0...v2.73.0) (2025-01-08)
2
17
 
3
18
 
package/README.md CHANGED
@@ -21,7 +21,7 @@ $ npm install -g @speedkit/cli
21
21
  $ sk COMMAND
22
22
  running command...
23
23
  $ sk (--version)
24
- @speedkit/cli/2.73.0 linux-x64 node-v20.18.1
24
+ @speedkit/cli/2.74.0 linux-x64 node-v20.18.1
25
25
  $ sk --help [COMMAND]
26
26
  USAGE
27
27
  $ sk COMMAND
@@ -27,22 +27,36 @@
27
27
  compare: ["text"],
28
28
  },
29
29
 
30
- // Home:
30
+ // Top Banner:
31
+ {
32
+ find: ".header .top-banner",
33
+ compare: ["text"],
34
+ },
35
+
36
+ // First-Level Items of Header/Main Navigation:
37
+ {
38
+ find: ".header .main-navigation .first-level-item",
39
+ compare: ["text"],
40
+ },
41
+
42
+ // Stage Teaser:
31
43
  {
32
44
  find: ".stage-teaser source",
33
45
  compare: ["srcset"],
34
46
  },
35
47
 
36
- // PLP:
48
+ // PLP Items:
37
49
  {
38
50
  find: ".product-grid .product img",
39
51
  limit: 9, // only compare the first 9 products
40
52
  compare: ["src"],
41
53
  },
42
- // ...
43
54
 
44
- // PDP:
45
- // ...
55
+ // PDP Hero Image:
56
+ {
57
+ find: ".product-detail .slide.main img",
58
+ compare: ["src"],
59
+ },
46
60
  ],
47
61
  },
48
62
  {{#if isShopify}}
@@ -1,8 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CustomerDomainDocumentResponse = void 0;
4
+ const tslib_1 = require("tslib");
4
5
  const onboarding_model_1 = require("../onboarding-model");
5
6
  const origin_response_1 = require("../browser/origin-response");
7
+ const iconv_lite_1 = tslib_1.__importDefault(require("iconv-lite"));
8
+ const SUPPORTED_CHARSETS = new Set(["ascii", "utf8", "utf16le", "latin1"]);
6
9
  /**
7
10
  * Intercepts any request to the customersOrigin and equivalent requests to baqendAssetApi
8
11
  * @implements {FetchRequestPausedEventHandler}
@@ -59,7 +62,11 @@ class CustomerDomainDocumentResponse {
59
62
  if (!this.isHtmlContentHeader(event.responseHeaders)) {
60
63
  return;
61
64
  }
62
- let text = await this.getHtmlContent(client, event);
65
+ const contentType = event.responseHeaders.find((headerRecord) => {
66
+ return headerRecord.name.toLowerCase() === "content-type";
67
+ })?.["value"] || "";
68
+ const charset = contentType.split("charset=")?.[1]?.trim() || "utf-8";
69
+ let text = await this.getHtmlContent(client, event, charset);
63
70
  if (!this.isValidHtmlContent(text)) {
64
71
  return;
65
72
  }
@@ -75,6 +82,12 @@ class CustomerDomainDocumentResponse {
75
82
  const content = this.removeContentSecurityPolicy
76
83
  ? this.removeContentSecurityMetaTag(text)
77
84
  : text;
85
+ // replace origin contentTypeCharset with utf-8 as this is what it's converted to now
86
+ for (const header of headers) {
87
+ if (header.name.toLowerCase().includes("content-type")) {
88
+ header.value = header.value.replace(charset, "utf-8");
89
+ }
90
+ }
78
91
  return new origin_response_1.OriginResponse(content, headers, event.responseStatusCode);
79
92
  }
80
93
  isValidHtmlContent(text) {
@@ -92,18 +105,19 @@ class CustomerDomainDocumentResponse {
92
105
  })?.["value"];
93
106
  return contentType && contentType.includes("text/html");
94
107
  }
95
- async getHtmlContent(client, event) {
96
- const contentType = event.responseHeaders.find((headerRecord) => {
97
- return headerRecord.name.toLowerCase() === "content-type";
98
- })?.["value"] || "";
99
- let charset = contentType.split("charset=")?.[1] || "utf-8";
108
+ async getHtmlContent(client, event, charset) {
100
109
  const { body, base64Encoded } = await client.send("Fetch.getResponseBody", {
101
110
  requestId: event.requestId,
102
111
  });
112
+ // create text from base64Encoded
103
113
  if (base64Encoded) {
104
- if (charset.includes("ISO-8859")) {
105
- charset = "latin1";
114
+ // make use of iconv if charset is not supported by node:buffer
115
+ if (!SUPPORTED_CHARSETS.has(charset)) {
116
+ return iconv_lite_1.default
117
+ .decode(Buffer.from(body, "base64"), charset.toLowerCase())
118
+ .toString();
106
119
  }
120
+ // @ts-expect-error string is not valid
107
121
  return Buffer.from(body, "base64").toString(charset);
108
122
  }
109
123
  return body;
@@ -13,6 +13,7 @@ export declare class VirtualOrestesApp {
13
13
  private cli;
14
14
  constructor(customerConfig: CustomerConfig, crawler: Crawler, documentHandler: DocumentHandlerServer, cache: Cache, cli: CliService);
15
15
  fetchAssetResponse(event: Protocol.Fetch.RequestPausedEvent): Promise<Partial<Protocol.Fetch.FulfillRequestRequest> | AbortResponse>;
16
+ private getResponseText;
16
17
  private returnErrorResponse;
17
18
  private convertResponseHeadersToOrestesFormat;
18
19
  private returnRedirect;
@@ -1,9 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VirtualOrestesApp = void 0;
4
+ const tslib_1 = require("tslib");
4
5
  const baqend_response_1 = require("../browser/baqend-response");
5
6
  const safe_1 = require("../../../helpers/safe");
6
7
  const onboarding_model_1 = require("../onboarding-model");
8
+ const iconv_lite_1 = tslib_1.__importDefault(require("iconv-lite"));
7
9
  class VirtualOrestesApp {
8
10
  customerConfig;
9
11
  crawler;
@@ -44,7 +46,7 @@ class VirtualOrestesApp {
44
46
  if (response.status > 300 && response.status < 400) {
45
47
  return this.returnRedirect(customHeaders, response, event);
46
48
  }
47
- const responseContent = await response.text();
49
+ const responseContent = await this.getResponseText(response);
48
50
  if (!this.isHtmlContentHeader(response.headers) ||
49
51
  !this.isValidHtmlContent(responseContent)) {
50
52
  const customResponse = new baqend_response_1.BaqendResponse(responseContent, response.headers.get("Content-Type") || null, customHeaders);
@@ -78,6 +80,16 @@ class VirtualOrestesApp {
78
80
  this.cache.addEntry(event.request.url, baqendResponse);
79
81
  return baqendResponse;
80
82
  }
83
+ async getResponseText(response) {
84
+ const contentType = response.headers.get("content-type") || "";
85
+ const charset = contentType.split("charset=")?.[1]?.trim() || "utf-8";
86
+ if (charset.toLowerCase() !== "utf-8") {
87
+ return iconv_lite_1.default
88
+ .decode(Buffer.from(await response.arrayBuffer()), charset.toLowerCase())
89
+ .toString();
90
+ }
91
+ return await response.text();
92
+ }
81
93
  returnErrorResponse(customResponse, customHeaders) {
82
94
  const message = `Could not transform html: - ${customResponse.error}`;
83
95
  this.cli.writeError(`[VirtualOrestes]: ${message}`);
@@ -712,5 +712,5 @@
712
712
  ]
713
713
  }
714
714
  },
715
- "version": "2.73.0"
715
+ "version": "2.74.0"
716
716
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@speedkit/cli",
3
3
  "description": "Speed Kit CLI",
4
- "version": "2.73.0",
4
+ "version": "2.74.0",
5
5
  "author": {
6
6
  "name": "Baqend.com",
7
7
  "email": "info@baqend.com"
@@ -96,7 +96,8 @@
96
96
  "strip-comments": "^2.0.1",
97
97
  "uuid": "^9.0.1",
98
98
  "esbuild": "^0.20.2",
99
- "ts-node": "^10.9.2"
99
+ "ts-node": "^10.9.2",
100
+ "iconv-lite": "^0.6.3"
100
101
  },
101
102
  "devDependencies": {
102
103
  "@commitlint/cli": "^17.8.1",