@speedkit/cli 2.38.0 → 2.40.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 (58) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +21 -5
  3. package/dist/commands/build-parameter-query.d.ts +1 -1
  4. package/dist/commands/build-prewarm-query.d.ts +1 -1
  5. package/dist/commands/config/edit.d.ts +6 -0
  6. package/dist/commands/config/edit.js +23 -0
  7. package/dist/commands/deploy.d.ts +1 -1
  8. package/dist/commands/document-handler.d.ts +1 -1
  9. package/dist/commands/find-pops.js +0 -1
  10. package/dist/commands/onboarding.d.ts +1 -1
  11. package/dist/commands/onboarding.js +1 -1
  12. package/dist/commands/prewarm.d.ts +1 -1
  13. package/dist/commands/pull.d.ts +1 -1
  14. package/dist/dummy.spec.js +2 -3
  15. package/dist/helpers/build-query-helper.js +5 -6
  16. package/dist/helpers/file-helper.js +2 -3
  17. package/dist/helpers/get-parsed-config.js +3 -4
  18. package/dist/helpers/is-directory.js +1 -2
  19. package/dist/helpers/is-file.js +1 -2
  20. package/dist/helpers/logging-helper.js +3 -4
  21. package/dist/helpers/normalize.d.ts +0 -1
  22. package/dist/helpers/normalize.js +4 -5
  23. package/dist/helpers/race.js +1 -2
  24. package/dist/helpers/safe.js +1 -2
  25. package/dist/helpers/scrape.js +1 -1
  26. package/dist/helpers/speed-kit-rule-to-reg-exp.js +1 -2
  27. package/dist/models/cli-parameters.d.ts +1 -1
  28. package/dist/services/athena/athena-service-factory.js +1 -1
  29. package/dist/services/athena/athena-service.d.ts +3 -1
  30. package/dist/services/athena/athena-service.js +14 -2
  31. package/dist/services/config-api-service.d.ts +1 -1
  32. package/dist/services/config-api-service.js +1 -0
  33. package/dist/services/integration-api/file-reader.d.ts +0 -1
  34. package/dist/services/onboarding/browser/extension/devtools-extension-api.d.ts +7 -0
  35. package/dist/services/onboarding/browser/extension/devtools-extension-api.js +16 -0
  36. package/dist/services/onboarding/browser/extension/extension-validator.d.ts +10 -0
  37. package/dist/services/onboarding/browser/extension/extension-validator.js +71 -0
  38. package/dist/services/onboarding/dashboard/index.d.ts +1 -0
  39. package/dist/services/onboarding/dashboard/index.js +23 -22
  40. package/dist/services/onboarding/dashboard/request-diff-service.d.ts +2 -1
  41. package/dist/services/onboarding/dashboard/request-diff-service.js +34 -6
  42. package/dist/services/onboarding/error/browser-extension-error.d.ts +5 -0
  43. package/dist/services/onboarding/error/browser-extension-error.js +12 -0
  44. package/dist/services/onboarding/fetch-event-handler.js +13 -14
  45. package/dist/services/onboarding/onboarding-model.d.ts +33 -3
  46. package/dist/services/onboarding/onboarding-model.js +32 -5
  47. package/dist/services/onboarding/onboarding-service-factory.d.ts +1 -0
  48. package/dist/services/onboarding/onboarding-service-factory.js +22 -4
  49. package/dist/services/onboarding/onboarding-service.d.ts +3 -3
  50. package/dist/services/onboarding/onboarding-service.js +35 -30
  51. package/dist/services/onboarding/todo-collector.d.ts +2 -2
  52. package/dist/services/onboarding/todo-collector.js +1 -1
  53. package/dist/services/prewarm/assets/asset-api-client.js +0 -1
  54. package/oclif.manifest.json +25 -1
  55. package/package.json +19 -19
  56. package/dist/services/onboarding/dashboard/frontend-dist/assets/index-e3bd4f6e.css +0 -1
  57. package/dist/services/onboarding/dashboard/frontend-dist/assets/main-215271c2.js +0 -9
  58. package/dist/services/onboarding/dashboard/frontend-dist/index.html +0 -18
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OnboardingService = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const puppeteer_extra_1 = tslib_1.__importDefault(require("puppeteer-extra"));
6
- const chalk_1 = tslib_1.__importDefault(require("chalk"));
6
+ const onboarding_model_1 = require("./onboarding-model");
7
7
  const cli_1 = require("../cli");
8
8
  const safe_1 = require("../../helpers/safe");
9
9
  /**
@@ -15,15 +15,15 @@ class OnboardingService {
15
15
  fetchEventHandler;
16
16
  fileWatcher;
17
17
  cli;
18
- taskCollector;
18
+ developmentToolsMessages;
19
19
  reinstallOnNextNavigate = false;
20
- constructor(browserContext, customerConfig, fetchEventHandler, fileWatcher, cli, taskCollector) {
20
+ constructor(browserContext, customerConfig, fetchEventHandler, fileWatcher, cli, developmentToolsMessages) {
21
21
  this.browserContext = browserContext;
22
22
  this.customerConfig = customerConfig;
23
23
  this.fetchEventHandler = fetchEventHandler;
24
24
  this.fileWatcher = fileWatcher;
25
25
  this.cli = cli;
26
- this.taskCollector = taskCollector;
26
+ this.developmentToolsMessages = developmentToolsMessages;
27
27
  }
28
28
  /**
29
29
  * prepare puppeteerBrowser, add eventListeners and start
@@ -33,10 +33,6 @@ class OnboardingService {
33
33
  const browser = await this.prepareBrowser();
34
34
  const page = await this.preparePage(browser);
35
35
  this.cli.endAction(cli_1.CliActionStatus.COMPLETED);
36
- if (this.browserContext.startParameterDashboard) {
37
- const { goto } = await browser.newPage();
38
- await goto("http://skonboarding.local/");
39
- }
40
36
  await this.navigate(page, `${this.customerConfig.scope}speed-kit-install.html?url=${this.customerConfig.scope}`);
41
37
  }
42
38
  async prepareBrowser() {
@@ -52,7 +48,7 @@ class OnboardingService {
52
48
  await this.fetchEventHandler.handleRequestFetchEvents(target);
53
49
  }
54
50
  }
55
- browser.on("disconnected", () => {
51
+ browser.on(onboarding_model_1.BROWSER_EVENTS.DISCONNECTED, () => {
56
52
  this.cli.writeError("Browser disconnected, shutting down");
57
53
  process.exit(-1);
58
54
  });
@@ -60,14 +56,18 @@ class OnboardingService {
60
56
  }
61
57
  async preparePage(browser) {
62
58
  const page = await this.findPage(browser);
63
- await this.prepareCleanState(page);
59
+ await (0, safe_1.safe)(this.prepareCleanState(page));
64
60
  this.registerFileWatcher(page);
65
61
  this.registerReinstallSpeedKitOnNavigate(page);
66
- page.on("framenavigated", async (_frame) => {
67
- // inject open Todos from configFiles
68
- const tasks = this.taskCollector.getOpenTasks();
69
- await (0, safe_1.safe)(page.evaluate(`window.skOnboarding = ${JSON.stringify(tasks)}`));
62
+ this.developmentToolsMessages.addMessage({
63
+ id: "cli",
64
+ data: `config loaded for app "${this.customerConfig.app}"`,
70
65
  });
66
+ const messages = this.developmentToolsMessages.messages;
67
+ await page.evaluateOnNewDocument((messages) => {
68
+ // @ts-expect-error unknown method getSkCliMessages
69
+ window.skCliMessages = messages;
70
+ }, messages);
71
71
  return page;
72
72
  }
73
73
  async findPage(browser) {
@@ -80,27 +80,33 @@ class OnboardingService {
80
80
  return browser.newPage();
81
81
  }
82
82
  async prepareCleanState(page) {
83
- const pageClient = await page.target().createCDPSession();
84
- pageClient.on("ServiceWorker.workerRegistrationUpdated", ({ registrations, }) => {
85
- for (const registration of registrations) {
86
- if (registration.isDeleted) {
87
- this.cli.writeWarning((0, chalk_1.default) `{yellow Unregistered Service Worker} at {bold ${registration.scopeURL}} (${registration.registrationId})`);
88
- }
89
- }
90
- });
83
+ const cdpSession = await page.target().createCDPSession();
91
84
  // cleanUp old serviceWorkers
92
- await pageClient.send("ServiceWorker.enable");
93
- await pageClient.send("ServiceWorker.unregister", {
85
+ await cdpSession.send("ServiceWorker.enable");
86
+ await cdpSession.send("ServiceWorker.unregister", {
94
87
  scopeURL: this.browserContext.domain,
95
88
  });
96
89
  // clear storage for a clean start
97
- await pageClient.send("Storage.clearCookies");
98
- await pageClient.send("Storage.clearDataForOrigin", {
90
+ await cdpSession.send("Storage.clearCookies");
91
+ await cdpSession.send("Storage.clearDataForOrigin", {
99
92
  origin: this.browserContext.domain,
100
93
  storageTypes: "all",
101
94
  });
102
- await pageClient.send("Emulation.clearDeviceMetricsOverride");
103
- await pageClient.send("Emulation.clearGeolocationOverride");
95
+ await cdpSession.send("Emulation.clearDeviceMetricsOverride");
96
+ await cdpSession.send("Emulation.clearGeolocationOverride");
97
+ (0, safe_1.safe)(() => {
98
+ cdpSession.on(onboarding_model_1.CDP_SESSION.EVENTS.SERVICE_WORKER.REGISTRATION_UPDATED, ({ registrations, }) => {
99
+ for (const registration of registrations) {
100
+ if (registration.isDeleted) {
101
+ this.developmentToolsMessages.addMessage({
102
+ id: "serviceWorker",
103
+ data: `Unregistered Service Worker at ${registration.scopeURL} id: ${registration.registrationId}`,
104
+ });
105
+ this.cli.writeWarning(`${this.cli.style.yellow("Unregistered Service Worker")} at ${this.cli.style.bold(registration.scopeURL)} (${registration.registrationId})`);
106
+ }
107
+ }
108
+ });
109
+ });
104
110
  }
105
111
  async reinstallSpeedKit(page, pathname) {
106
112
  const url = new URL(page.url());
@@ -129,8 +135,7 @@ class OnboardingService {
129
135
  }
130
136
  async navigate(page, pathname) {
131
137
  const goto = new URL(pathname, `${this.browserContext.domain}`);
132
- await page.goto(goto.toString());
133
- await page.bringToFront();
138
+ await (0, safe_1.safe)(page.goto(goto.toString()));
134
139
  }
135
140
  }
136
141
  exports.OnboardingService = OnboardingService;
@@ -1,4 +1,4 @@
1
- import { FileInterface } from "../integration-api";
1
+ import { InstallResourceInterface } from "../integration-api/integration-api-model";
2
2
  export type task = {
3
3
  todo: string;
4
4
  context: string;
@@ -11,7 +11,7 @@ export type task = {
11
11
  */
12
12
  export declare class TodoCollector {
13
13
  private files;
14
- constructor(files: FileInterface[]);
14
+ constructor(files: InstallResourceInterface[]);
15
15
  getOpenTasks(): task[];
16
16
  lineNumber(needle: string, haystack: string): number;
17
17
  lineNumberByIndex(index: number, string: string): number;
@@ -23,7 +23,7 @@ class TodoCollector {
23
23
  tasks.push({
24
24
  todo: task,
25
25
  context: encodeURI(taskContext),
26
- file: configFile.name,
26
+ file: configFile.path,
27
27
  line: this.lineNumber(task, content),
28
28
  });
29
29
  return taskString;
@@ -37,7 +37,6 @@ class AssetApiClient {
37
37
  authorization: `BAT ${this.authenticationToken}`,
38
38
  },
39
39
  method: "HEAD",
40
- timeout: __1.FETCH_TIMEOUT,
41
40
  });
42
41
  }
43
42
  getRateLimit() {
@@ -686,7 +686,31 @@
686
686
  "commands",
687
687
  "wpt-launcher.js"
688
688
  ]
689
+ },
690
+ "config:edit": {
691
+ "aliases": [],
692
+ "args": {},
693
+ "description": "Edit cli config",
694
+ "examples": [
695
+ "$ sk config edit"
696
+ ],
697
+ "flags": {},
698
+ "hasDynamicHelp": false,
699
+ "hiddenAliases": [],
700
+ "id": "config:edit",
701
+ "pluginAlias": "@speedkit/cli",
702
+ "pluginName": "@speedkit/cli",
703
+ "pluginType": "core",
704
+ "strict": true,
705
+ "enableJsonFlag": false,
706
+ "isESM": false,
707
+ "relativePath": [
708
+ "dist",
709
+ "commands",
710
+ "config",
711
+ "edit.js"
712
+ ]
689
713
  }
690
714
  },
691
- "version": "2.38.0"
715
+ "version": "2.40.0"
692
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.38.0",
4
+ "version": "2.40.0",
5
5
  "author": {
6
6
  "name": "Baqend.com",
7
7
  "email": "info@baqend.com"
@@ -22,8 +22,7 @@
22
22
  "scripts": {
23
23
  "prepare": "husky install",
24
24
  "prebuild": "shx rm -rf dist",
25
- "build": "tsc -b && copyfiles -u 1 src/**/*hbs ./dist && copyfiles -u 1 src/**/*js ./dist && npm run build:dashboard",
26
- "build:dashboard": "copyfiles -u 1 src/services/onboarding/dashboard/frontend-dist/**/*.html dist && copyfiles -u 1 src/services/onboarding/dashboard/frontend-dist/**/*.js dist && copyfiles -u 1 src/services/onboarding/dashboard/frontend-dist/**/*.css dist",
25
+ "build": "tsc -b && copyfiles -u 1 src/**/*hbs ./dist && copyfiles -u 1 src/**/*js ./dist",
27
26
  "postbuild": "oclif manifest && oclif readme",
28
27
  "prepack": "npm run build",
29
28
  "test": "mocha --config ./.mocharc.cjs --reporter mocha-junit-reporter --reporter-options mochaFile=junit.xml",
@@ -83,21 +82,22 @@
83
82
  "domhandler": "5.0.3",
84
83
  "domutils": "^3.1",
85
84
  "dotenv": "^16.4",
86
- "esbuild": "^0.20",
87
85
  "extract-zip": "^2.0.1",
88
- "fs-extra": "^10.1.0",
89
- "handlebars": "^4.7",
86
+ "fs-extra": "^11.2.0",
87
+ "handlebars": "^4.7.8",
90
88
  "htmlparser2": "8.0",
91
89
  "json2csv": "^6.0.0-alpha.2",
92
- "node-fetch": "^2.6",
90
+ "node-fetch": "^2.7.0",
93
91
  "parse5": "7.1",
94
92
  "parse5-htmlparser2-tree-adapter": "7.0.0",
95
- "puppeteer": "^21.11",
96
- "puppeteer-core": "^22.4",
97
- "puppeteer-extra": "^3.3",
98
- "puppeteer-extra-plugin-user-preferences": "^2.4",
93
+ "puppeteer": "^22.6.5",
94
+ "puppeteer-core": "^22.6.5",
95
+ "puppeteer-extra": "^3.3.6",
96
+ "puppeteer-extra-plugin-user-preferences": "^2.4.1",
99
97
  "strip-comments": "^2.0.1",
100
- "uuid": "^8.3.2"
98
+ "uuid": "^9.0.1",
99
+ "esbuild": "^0.20.2",
100
+ "ts-node": "^10.9.2"
101
101
  },
102
102
  "devDependencies": {
103
103
  "@commitlint/cli": "^17.7.1",
@@ -109,10 +109,10 @@
109
109
  "@types/fs-extra": "^9.0.13",
110
110
  "@types/mocha": "^10.0",
111
111
  "@types/mock-fs": "^4.13.4",
112
- "@types/node": "^18.19",
113
- "@types/uuid": "^8.3.4",
112
+ "@types/node": "^20.12.7",
113
+ "@types/uuid": "^9.0.8",
114
114
  "@typescript-eslint/eslint-plugin": "^7.2.0",
115
- "chai": "^4.4",
115
+ "chai": "^4.4.1",
116
116
  "copyfiles": "^2.4.1",
117
117
  "eslint": "^8.57",
118
118
  "eslint-config-prettier": "^9.1",
@@ -124,16 +124,16 @@
124
124
  "memfs": "^4.8.0",
125
125
  "mocha": "^10.1.0",
126
126
  "mocha-junit-reporter": "^2.2.1",
127
+ "mock-fs": "^5.2.0",
127
128
  "nock": "^13.5",
128
129
  "nyc": "^15.1.0",
129
- "oclif": "^4.5",
130
+ "oclif": "^4.8.8",
130
131
  "shx": "^0.3.4",
131
132
  "ts-mocha": "^10.0.0",
132
- "ts-node": "^10.9",
133
133
  "ts-sinon": "^2.0.2",
134
134
  "tslib": "^2.6",
135
- "typescript": "^5.4",
136
- "typescript-json-serializer": "^4.3.0"
135
+ "typescript": "^5.4.5",
136
+ "typescript-json-serializer": "^6.0.1"
137
137
  },
138
138
  "lint-staged": {
139
139
  "*.ts": [
@@ -1 +0,0 @@
1
- *,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Poppins-Regular;font-feature-settings:normal}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}:root{--red: #ff4c3f;--red-dimmed: #bb382e;--green: #10af80;--greenOpacity: RGBA(12, 217, 149, .16);--blue: #0568fd;--blue-dimmed: #034cb9;--disabled: #6b7c96;--disabled-dimmed: #525f73;--fontPrimary: #282c39;--fontSecondary: #6b7c96;--backgroundPrimary: #fff;--backgroundSecondary: #eef2f7;--borderPrimary: #d8e1ed;--borderSecondary: #d8e1ed;--whiteOpacity: RGBA(255, 255, 255, .6);--tableFontPrimary: var(--fontPrimary);--tableFontSecondary: var(--fontSecondary);--tableBackgroundPrimary: var(--backgroundPrimary);--tableBackgroundSecondary: #f7f8fb;--tableBackgroundTernary: var(--backgroundSecondary);--tableBorder: #d8e1ed;--hover: var(--backgroundSecondary);--input-background: var(--backgroundPrimary);font-family:Inter,system-ui,Avenir,Helvetica,Arial,sans-serif;font-weight:400;color-scheme:light dark;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%;--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity))}@media (prefers-contrast: more){:root{--fontSecondary: #282c39;--backgroundPrimary: #fff;--backgroundSecondary: #d8e1ed;--borderPrimary: #6b7c96;--borderSecondary: #6b7c96;--buttonPrimary: #0568fd;--buttonSecondary: #282c39;--whiteOpacity: RGBA(255, 255, 255, 1)}}@font-face{font-family:Lato;font-style:normal;font-weight:400;src:local("Lato Regular"),local("Lato-Regular"),url(/fonts/Lato-Regular.ttf) format("truetype")}@font-face{font-family:Lato-Bold;font-style:normal;font-weight:700;src:local("Lato Bold"),local("Lato-Bold"),url(/fonts/Lato-Bold.ttf) format("truetype")}@font-face{font-family:Poppins-Regular;font-style:normal;font-weight:400;src:local("Poppins Regular"),local("Poppins-Regular"),url(/fonts/Poppins-Regular.ttf) format("truetype")}@font-face{font-family:Poppins-SemiBold;font-style:normal;font-weight:600;src:local("Poppins SemiBold"),local("Poppins-SemiBold"),url(/fonts/Poppins-SemiBold.ttf) format("truetype")}a{font-weight:500;text-decoration:inherit}a:hover{color:var(--blue-dimmed)}body{margin:0;min-width:320px;min-height:100vh}h1{font-size:3.2em;line-height:1.1}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.pointer-events-none{pointer-events:none}.visible{visibility:visible}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-y-\[0\.185rem\]{top:.185rem;bottom:.185rem}.left-1\/2-2{left:calc(50% - 2px)}.left-\[2px\]{left:2px}.top-\[0\]{top:0}.m-1{margin:.25rem}.m-2{margin:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.-ml-8{margin-left:-2rem}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mr-auto{margin-right:auto}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.hidden{display:none}.min-h-screen{min-height:100vh}.w-1\/12{width:8.333333%}.w-1\/2{width:50%}.w-2\/12{width:16.666667%}.w-7\/12{width:58.333333%}.w-full{width:100%}.w-sidebar{width:clamp(60px,80px,130px)}.min-w-full{min-width:100%}.max-w-full{max-width:100%}.flex-auto{flex:1 1 auto}.flex-grow{flex-grow:1}.border-collapse{border-collapse:collapse}.scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.content-between{align-content:space-between}.content-evenly{align-content:space-evenly}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-evenly{justify-content:space-evenly}.overflow-hidden{overflow:hidden}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-bq-blue{border-color:var(--blue)}.border-bq-sec-border{border-color:var(--borderSecondary)}.border-bq-table-border{border-color:var(--tableBorder)}.border-b-bq-table-border{border-bottom-color:var(--tableBorder)}.bg-bq-blue{background-color:var(--blue)}.bg-bq-grey-light{--tw-bg-opacity: 1;background-color:rgb(242 244 246 / var(--tw-bg-opacity))}.bg-bq-prim-background{background-color:var(--backgroundPrimary)}.bg-bq-sec-background{background-color:var(--backgroundSecondary)}.bg-bq-table-background-prim{background-color:var(--tableBackgroundPrimary)}.bg-bq-table-background-sec{background-color:var(--tableBackgroundSecondary)}.bg-green-200{--tw-bg-opacity: 1;background-color:rgb(187 247 208 / var(--tw-bg-opacity))}.bg-red-200{--tw-bg-opacity: 1;background-color:rgb(254 202 202 / var(--tw-bg-opacity))}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-\[0\.185rem\]{padding:.185rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.pl-4{padding-left:1rem}.pt-5{padding-top:1.25rem}.text-left{text-align:left}.text-center{text-align:center}.font-bold{font-family:Poppins-SemiBold}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-clamp font-size{-d-e-f-a-u-l-t:clamp(.8rem,.425rem + 3vw,2rem);s:clamp(.3rem,.3438rem + 1.25vw,.8rem);m:clamp(.5rem,.3438rem + 1.25vw,1rem);xl:clamp(1rem,.6875rem + 2.5vw,2rem)}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.font-bold{font-weight:700}.capitalize{text-transform:capitalize}.text-bq-blue{color:var(--blue)}.text-bq-prim-font{color:var(--fontPrimary)}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.opacity-60{opacity:.6}.shadow{--tw-shadow: 0px 1px 4px 0px #282C3914;--tw-shadow-colored: 0px 1px 4px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}*:disabled{cursor:default}*:disabled:disabled{opacity:.5}@media (prefers-color-scheme: dark){html{--fontPrimary: #e1e8f0;--fontSecondary: #8493ad;--backgroundPrimary: #282c39;--backgroundSecondary: #121212;--borderPrimary: #2e373e;--borderSecondary: #4a5a65;--buttonPrimary: #0568fd;--buttonSecondary: #d8e1ed;--whiteOpacity: RGBA(255, 255, 255, .06);--hover: #393f51;--tableFontPrimary: #d8e1ed;--tableFontSecondary: rgba(216 225 237, .6);--tableBackgroundPrimary: var(--backgroundPrimary);--tableBackgroundSecondary: #21242d;--tableBackgroundTernary: #1d1f26;--tableBorder: #333a4b;--input-background: var(--backgroundSecondary);color-scheme:dark}}.g-input:focus-within{margin:-1px;border-width:2px;border-color:var(--blue)}.g-content-divider{margin-top:1.25rem;margin-bottom:1.25rem;border-width:1px;border-left-width:0px;border-right-width:0px;border-bottom-width:0px;border-color:var(--borderPrimary)}#app{height:100%;width:100%}.tabs-component{margin-bottom:1rem;display:flex;flex-direction:column;padding-left:.5rem;padding-right:.5rem}.tabs-component-tabs{margin-bottom:-.5rem;display:flex}.tabs-component-tabs .tabs-component-tab-a{display:block;background-color:var(--backgroundSecondary);padding:.5rem .75rem;color:var(--fontSecondary)}.tabs-component-tabs .tabs-component-tab-a.is-active,.tabs-component-tabs .tabs-component-tab-a:hover{background-color:var(--backgroundPrimary);color:var(--fontPrimary)}.tabs-component-panels{padding:.5rem;color:var(--fontPrimary)}.router-link-exact-active{background-color:var(--tableBackgroundSecondary)}.hover\:scale-95:hover{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:bg-blue-200:hover{--tw-bg-opacity: 1;background-color:rgb(191 219 254 / var(--tw-bg-opacity))}.hover\:outline:hover{outline-style:solid}.hover\:outline-bq-blue-dimmed:hover{outline-color:var(--blue-dimmed)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.datatable{border-collapse:collapse;table-layout:fixed}.data-table th{text-align:left}.datatable tr:nth-child(odd) textarea,.datatable tr:nth-child(odd) input,.datatable tr:nth-child(odd){background-color:var(--tableBackgroundPrimary)}.datatable tr:nth-child(2n) textarea,.datatable tr:nth-child(2n) input,.datatable tr:nth-child(2n){background-color:var(--tableBackgroundSecondary)}.datatable td{padding:.25rem}.datatable tr textarea.identical,.datatable tr input.identical{--tw-bg-opacity: 1;background-color:rgb(187 247 208 / var(--tw-bg-opacity))}.datatable tr textarea.diff,.datatable tr input.diff{--tw-bg-opacity: 1;background-color:rgb(254 202 202 / var(--tw-bg-opacity))}