@speedkit/cli 2.71.0 → 2.72.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,15 @@
1
+ # [2.72.0](https://gitlab.orestes.info/baqend/speed-kit-cli/compare/v2.71.0...v2.72.0) (2024-12-18)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **integration-devtools:** only update if installed ([d9f9710](https://gitlab.orestes.info/baqend/speed-kit-cli/commit/d9f971019d0baaa05dbba4e2ca684419577e5a78))
7
+
8
+
9
+ ### Features
10
+
11
+ * **onboarding:** embed integration-devtools ([530d863](https://gitlab.orestes.info/baqend/speed-kit-cli/commit/530d8633c06a84110f24116885c4f02ee1d9df65))
12
+
1
13
  # [2.71.0](https://gitlab.orestes.info/baqend/speed-kit-cli/compare/v2.70.1...v2.71.0) (2024-12-12)
2
14
 
3
15
 
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.71.0 linux-x64 node-v20.18.1
24
+ @speedkit/cli/2.72.0 linux-x64 node-v20.18.1
25
25
  $ sk --help [COMMAND]
26
26
  USAGE
27
27
  $ sk COMMAND
@@ -0,0 +1,12 @@
1
+ import { UserCliConfig } from "../../../../helpers/cli-config";
2
+ import { CliServiceInterface } from "../../../cli";
3
+ export declare class ExtensionDownloader {
4
+ private userConfig;
5
+ private cli;
6
+ constructor(userConfig: UserCliConfig, cli: CliServiceInterface);
7
+ downloadExtension(): Promise<string | false>;
8
+ private updateLocalDevtools;
9
+ isInstalled(): boolean;
10
+ private checkInstalledVersion;
11
+ private getRemoteVersion;
12
+ }
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExtensionDownloader = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const node_fs_1 = tslib_1.__importDefault(require("node:fs"));
6
+ const node_path_1 = tslib_1.__importDefault(require("node:path"));
7
+ const semver_1 = tslib_1.__importDefault(require("semver"));
8
+ const extract_zip_1 = tslib_1.__importDefault(require("extract-zip"));
9
+ const cli_1 = require("../../../cli");
10
+ const safe_1 = require("../../../../helpers/safe");
11
+ const devtools = "integration-devtools";
12
+ class ExtensionDownloader {
13
+ userConfig;
14
+ cli;
15
+ constructor(userConfig, cli) {
16
+ this.userConfig = userConfig;
17
+ this.cli = cli;
18
+ }
19
+ async downloadExtension() {
20
+ // check for already installed devExtension
21
+ const isInstalled = this.isInstalled();
22
+ if (isInstalled) {
23
+ // check for updates
24
+ const remoteVersion = await this.getRemoteVersion();
25
+ const localVersion = await this.checkInstalledVersion();
26
+ if (semver_1.default.compare(remoteVersion, localVersion) > 0) {
27
+ const response = await this.cli.confirm(`integration-devtools update available from ${localVersion} to ${remoteVersion} Install?`, true);
28
+ if (!response) {
29
+ return false;
30
+ }
31
+ }
32
+ }
33
+ else {
34
+ const response = await this.cli.confirm("Do you want to install devtools-extension?", true);
35
+ if (!response) {
36
+ return false;
37
+ }
38
+ }
39
+ this.cli.startAction("update integration-devtools");
40
+ const response = await (0, safe_1.safe)(this.updateLocalDevtools());
41
+ if (response.success === false) {
42
+ this.cli.endAction(cli_1.CliActionStatus.FAILED);
43
+ this.cli.writeError(response.error);
44
+ return false;
45
+ }
46
+ this.cli.endAction(cli_1.CliActionStatus.COMPLETED);
47
+ return response.data;
48
+ }
49
+ async updateLocalDevtools() {
50
+ // downloadExtension
51
+ const extensionResponse = await fetch("https://threepointonefour.app.baqend.com/v1/code/webhook_gitlab_release?download");
52
+ // get fileName from header
53
+ const fileName = extensionResponse.headers.get("filename");
54
+ // resolve path for unpacked extension
55
+ const extensionUnpacked = node_path_1.default.resolve(this.userConfig.tempFolder, devtools);
56
+ // resolve path for zipFile
57
+ const archivePath = node_path_1.default.resolve(this.userConfig.tempFolder, fileName);
58
+ // getFileBlob
59
+ const extensionBlob = await extensionResponse.arrayBuffer();
60
+ // write zipFile
61
+ node_fs_1.default.writeFileSync(archivePath, Buffer.from(extensionBlob));
62
+ // cleanUp older versions
63
+ node_fs_1.default.rmSync(extensionUnpacked, { recursive: true, force: true });
64
+ // extract zipArchive
65
+ await (0, extract_zip_1.default)(archivePath, { dir: extensionUnpacked });
66
+ // remove zipArchive
67
+ node_fs_1.default.rmSync(archivePath);
68
+ return extensionUnpacked;
69
+ }
70
+ isInstalled() {
71
+ const extensionPath = node_path_1.default.resolve(this.userConfig.tempFolder, devtools, "manifest.json");
72
+ return node_fs_1.default.existsSync(extensionPath);
73
+ }
74
+ checkInstalledVersion() {
75
+ const extensionPath = node_path_1.default.resolve(this.userConfig.tempFolder, devtools, "manifest.json");
76
+ const manifestFile = node_fs_1.default.readFileSync(extensionPath, "utf-8");
77
+ const manifestConfig = JSON.parse(manifestFile);
78
+ return manifestConfig.version;
79
+ }
80
+ async getRemoteVersion() {
81
+ const versionResponse = await fetch("https://threepointonefour.app.baqend.com/v1/code/webhook_gitlab_release");
82
+ if (!versionResponse.ok) {
83
+ throw new Error("Could not find version for" + devtools);
84
+ }
85
+ const response = await versionResponse.json();
86
+ return response.version;
87
+ }
88
+ }
89
+ exports.ExtensionDownloader = ExtensionDownloader;
@@ -1,10 +1,12 @@
1
1
  import { UserCliConfig } from "../../../../helpers/cli-config";
2
2
  import { CliServiceInterface } from "../../../cli";
3
+ import { ExtensionDownloader } from "./extension-downloader";
3
4
  export declare class ExtensionValidator {
5
+ private extensionDownloader;
4
6
  private cliConfig;
5
- private cliBasePath;
6
7
  private cli;
7
- constructor(cliConfig: UserCliConfig, cliBasePath: string, cli: CliServiceInterface);
8
+ constructor(extensionDownloader: ExtensionDownloader, cliConfig: UserCliConfig, cli: CliServiceInterface);
8
9
  getValidBrowserExtensionPaths(): Promise<string[]>;
9
10
  private getManifestConfig;
11
+ private handleDevtoolsExtension;
10
12
  }
@@ -9,17 +9,16 @@ const safe_1 = require("../../../../helpers/safe");
9
9
  const node_fs_1 = require("node:fs");
10
10
  const browser_extension_error_1 = require("../../error/browser-extension-error");
11
11
  class ExtensionValidator {
12
+ extensionDownloader;
12
13
  cliConfig;
13
- cliBasePath;
14
14
  cli;
15
- constructor(cliConfig, cliBasePath, cli) {
15
+ constructor(extensionDownloader, cliConfig, cli) {
16
+ this.extensionDownloader = extensionDownloader;
16
17
  this.cliConfig = cliConfig;
17
- this.cliBasePath = cliBasePath;
18
18
  this.cli = cli;
19
19
  }
20
20
  async getValidBrowserExtensionPaths() {
21
21
  const validExtensions = [];
22
- const validPaths = [];
23
22
  this.cli.startAction("resolve browserExtensions");
24
23
  const browserExtensions = this.cliConfig.chromeExtensionPaths
25
24
  .split(",")
@@ -37,13 +36,14 @@ class ExtensionValidator {
37
36
  name: manifestConfig.name,
38
37
  version: manifestConfig.version,
39
38
  });
40
- validPaths.push(cleanedExtensionPath);
41
39
  }
42
40
  this.cli.endAction(cli_1.CliActionStatus.COMPLETED);
41
+ this.cli.spacer();
42
+ await this.handleDevtoolsExtension(validExtensions);
43
43
  if (validExtensions.length > 0) {
44
44
  this.cli.table(validExtensions, { name: {}, version: {}, path: {} });
45
45
  }
46
- return validPaths;
46
+ return validExtensions.map((config) => config.path);
47
47
  }
48
48
  async getManifestConfig(cleanedExtensionPath) {
49
49
  const manifestPath = node_path_1.default.resolve(cleanedExtensionPath, "manifest.json");
@@ -59,5 +59,20 @@ class ExtensionValidator {
59
59
  }
60
60
  return result.data;
61
61
  }
62
+ async handleDevtoolsExtension(validExtensions) {
63
+ if (validExtensions.some((config) => config.name.toLowerCase().includes("devtools extension"))) {
64
+ return;
65
+ }
66
+ const path = await this.extensionDownloader.downloadExtension();
67
+ if (path === false) {
68
+ return;
69
+ }
70
+ const extensionConfig = await this.getManifestConfig(path);
71
+ validExtensions.push({
72
+ path: path,
73
+ name: extensionConfig.name,
74
+ version: extensionConfig.version,
75
+ });
76
+ }
62
77
  }
63
78
  exports.ExtensionValidator = ExtensionValidator;
@@ -41,6 +41,7 @@ const fs = tslib_1.__importStar(require("node:fs"));
41
41
  const path = tslib_1.__importStar(require("node:path"));
42
42
  const static_recipe_1 = require("../integration-api/virtual/static-recipe");
43
43
  const diff_against_current_page_1 = require("./dashboard/diff-against-current-page");
44
+ const extension_downloader_1 = require("./browser/extension/extension-downloader");
44
45
  class OnboardingServiceFactory {
45
46
  context;
46
47
  cliConfig;
@@ -66,7 +67,8 @@ class OnboardingServiceFactory {
66
67
  const skTemplate = new install_speed_kit_js_template_1.InstallSpeedKitJsTemplate();
67
68
  const speedKitInstallContext = new speed_kit_install_context_1.SpeedKitInstallContext(customerConfig, this.context.configName, files, bundler, skTemplate, this.context.local);
68
69
  await this.buildInstallResource(speedKitInstallContext, files, cli);
69
- const extensionPaths = await new extension_validator_1.ExtensionValidator(this.cliConfig, this.context.cliPath, cli).getValidBrowserExtensionPaths();
70
+ const extensionDownloader = new extension_downloader_1.ExtensionDownloader(this.cliConfig, cli);
71
+ const extensionPaths = await new extension_validator_1.ExtensionValidator(extensionDownloader, this.cliConfig, cli).getValidBrowserExtensionPaths();
70
72
  this.cliConfig.chromeExtensionPaths = extensionPaths.join(",");
71
73
  const browserContext = new onboarding_model_1.BrowserContext(domainToStart, customerConfig.chromeFlags || [], this.cliConfig);
72
74
  const fileWatcher = new file_watcher_1.FileWatcher(cli, customerConfig, files, documentHandler, browserContext, cache);
@@ -712,5 +712,5 @@
712
712
  ]
713
713
  }
714
714
  },
715
- "version": "2.71.0"
715
+ "version": "2.72.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.71.0",
4
+ "version": "2.72.0",
5
5
  "author": {
6
6
  "name": "Baqend.com",
7
7
  "email": "info@baqend.com"
@@ -92,6 +92,7 @@
92
92
  "parse5-htmlparser2-tree-adapter": "7.0.0",
93
93
  "puppeteer": "^22.6.5",
94
94
  "puppeteer-extra": "^3.3.6",
95
+ "semver": "^7.6.3",
95
96
  "strip-comments": "^2.0.1",
96
97
  "uuid": "^9.0.1",
97
98
  "esbuild": "^0.20.2",