@hubspot/cli 6.3.0 → 6.4.0-beta.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 (49) hide show
  1. package/bin/cli.js +2 -0
  2. package/commands/doctor.d.ts +8 -0
  3. package/commands/doctor.js +60 -0
  4. package/commands/init.js +20 -7
  5. package/commands/lint.d.ts +4 -1
  6. package/commands/lint.js +11 -2
  7. package/commands/project/installDeps.js +5 -5
  8. package/commands/project/logs.js +1 -1
  9. package/commands/theme/preview.js +38 -20
  10. package/lang/en.lyaml +68 -0
  11. package/lib/DevServerManager.js +2 -5
  12. package/lib/commonOpts.d.ts +3 -2
  13. package/lib/commonOpts.js +2 -2
  14. package/lib/dependencyManagement.d.ts +3 -1
  15. package/lib/dependencyManagement.js +19 -0
  16. package/lib/doctor/Diagnosis.d.ts +27 -0
  17. package/lib/doctor/Diagnosis.js +119 -0
  18. package/lib/doctor/DiagnosticInfoBuilder.d.ts +61 -0
  19. package/lib/doctor/DiagnosticInfoBuilder.js +158 -0
  20. package/lib/doctor/Doctor.d.ts +21 -0
  21. package/lib/doctor/Doctor.js +328 -0
  22. package/lib/errorHandlers/index.d.ts +14 -1
  23. package/lib/errorHandlers/index.js +43 -50
  24. package/lib/errorHandlers/suppressError.d.ts +2 -1
  25. package/lib/errorHandlers/suppressError.js +32 -37
  26. package/lib/interpolation.d.ts +3 -0
  27. package/lib/interpolation.js +4 -3
  28. package/lib/links.d.ts +9 -0
  29. package/lib/links.js +99 -97
  30. package/lib/projects.d.ts +4 -1
  31. package/lib/projects.js +5 -3
  32. package/lib/ui/SpinniesManager.d.ts +39 -1
  33. package/lib/ui/SpinniesManager.js +66 -35
  34. package/lib/ui/git.d.ts +1 -1
  35. package/lib/ui/git.js +17 -17
  36. package/lib/ui/index.d.ts +16 -1
  37. package/lib/ui/index.js +87 -114
  38. package/lib/ui/serverlessFunctionLogs.js +28 -19
  39. package/lib/ui/spinniesUtils.d.ts +31 -0
  40. package/lib/ui/spinniesUtils.js +45 -31
  41. package/lib/ui/supportHyperlinks.d.ts +6 -0
  42. package/lib/ui/supportHyperlinks.js +10 -10
  43. package/lib/ui/supportsColor.d.ts +16 -0
  44. package/lib/ui/supportsColor.js +19 -17
  45. package/lib/ui/table.d.ts +3 -1
  46. package/lib/ui/table.js +17 -11
  47. package/lib/usageTracking.d.ts +2 -1
  48. package/lib/usageTracking.js +2 -0
  49. package/package.json +10 -5
@@ -1 +1,32 @@
1
+ export declare const VALID_STATUSES: readonly ["succeed", "fail", "spinning", "non-spinnable", "stopped"];
2
+ declare const VALID_COLORS: readonly ["black", "red", "green", "yellow", "blue", "magenta", "cyan", "white", "gray", "redBright", "greenBright", "yellowBright", "blueBright", "magentaBright", "cyanBright", "whiteBright"];
3
+ export type Spinner = {
4
+ interval: number;
5
+ frames: string[];
6
+ };
7
+ export type SpinnerOptions = {
8
+ text?: string;
9
+ status?: typeof VALID_STATUSES[number];
10
+ indent?: number;
11
+ spinner?: Partial<Spinner>;
12
+ disableSpins?: boolean;
13
+ color?: typeof VALID_COLORS[number];
14
+ spinnerColor?: typeof VALID_COLORS[number];
15
+ succeedColor?: typeof VALID_COLORS[number];
16
+ failColor?: typeof VALID_COLORS[number];
17
+ succeedPrefix?: string;
18
+ failPrefix?: string;
19
+ };
20
+ export declare const SPINNERS: {
21
+ [key: string]: Spinner;
22
+ };
23
+ export declare function purgeSpinnerOptions(options: SpinnerOptions): SpinnerOptions;
24
+ export declare function purgeSpinnersOptions({ spinner, disableSpins, ...others }: SpinnerOptions): SpinnerOptions;
25
+ export declare function colorOptions({ color, succeedColor, failColor, spinnerColor, }: SpinnerOptions): Partial<SpinnerOptions>;
26
+ export declare function prefixOptions({ succeedPrefix, failPrefix, }: SpinnerOptions): Partial<SpinnerOptions>;
27
+ export declare function breakText(text: string, prefixLength: number): string;
28
+ export declare function getLinesLength(text: string, prefixLength: number): number[];
29
+ export declare function writeStream(stream: NodeJS.WriteStream, output: string, rawLines: number[]): void;
30
+ export declare function cleanStream(stream: NodeJS.WriteStream, rawLines: number[]): void;
31
+ export declare function terminalSupportsUnicode(): boolean;
1
32
  export {};
@@ -1,6 +1,18 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- // @ts-nocheck
6
+ exports.SPINNERS = exports.VALID_STATUSES = void 0;
7
+ exports.purgeSpinnerOptions = purgeSpinnerOptions;
8
+ exports.purgeSpinnersOptions = purgeSpinnersOptions;
9
+ exports.colorOptions = colorOptions;
10
+ exports.prefixOptions = prefixOptions;
11
+ exports.breakText = breakText;
12
+ exports.getLinesLength = getLinesLength;
13
+ exports.writeStream = writeStream;
14
+ exports.cleanStream = cleanStream;
15
+ exports.terminalSupportsUnicode = terminalSupportsUnicode;
4
16
  /*
5
17
  https://github.com/jbcarpanelli/spinnies
6
18
 
@@ -10,9 +22,9 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of
10
22
 
11
23
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
12
24
  **/
13
- const readline = require('readline');
14
- const stripAnsi = require('strip-ansi');
15
- const VALID_STATUSES = [
25
+ const readline_1 = __importDefault(require("readline"));
26
+ const strip_ansi_1 = __importDefault(require("strip-ansi"));
27
+ exports.VALID_STATUSES = [
16
28
  'succeed',
17
29
  'fail',
18
30
  'spinning',
@@ -37,7 +49,7 @@ const VALID_COLORS = [
37
49
  'cyanBright',
38
50
  'whiteBright',
39
51
  ];
40
- const SPINNERS = {
52
+ exports.SPINNERS = {
41
53
  dots: {
42
54
  interval: 50,
43
55
  frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],
@@ -51,7 +63,7 @@ function purgeSpinnerOptions(options) {
51
63
  const { text, status, indent } = options;
52
64
  const opts = { text, status, indent };
53
65
  const colors = colorOptions(options);
54
- if (!VALID_STATUSES.includes(status))
66
+ if (!exports.VALID_STATUSES.includes(status))
55
67
  delete opts.status;
56
68
  if (typeof text !== 'string')
57
69
  delete opts.text;
@@ -68,12 +80,20 @@ function purgeSpinnersOptions({ spinner, disableSpins, ...others }) {
68
80
  }
69
81
  function turnToValidSpinner(spinner = {}) {
70
82
  const platformSpinner = terminalSupportsUnicode()
71
- ? SPINNERS.dots
72
- : SPINNERS.dashes;
83
+ ? exports.SPINNERS.dots
84
+ : exports.SPINNERS.dashes;
73
85
  if (typeof spinner !== 'object') {
74
86
  return platformSpinner;
75
87
  }
76
- let { interval, frames } = spinner;
88
+ let interval, frames;
89
+ if ('interval' in spinner && 'frames' in spinner) {
90
+ interval = spinner.interval;
91
+ frames = spinner.frames;
92
+ }
93
+ else {
94
+ interval = platformSpinner.interval;
95
+ frames = platformSpinner.frames;
96
+ }
77
97
  if (!Array.isArray(frames) || frames.length < 1)
78
98
  frames = platformSpinner.frames;
79
99
  if (typeof interval !== 'number') {
@@ -81,8 +101,13 @@ function turnToValidSpinner(spinner = {}) {
81
101
  }
82
102
  return { interval, frames };
83
103
  }
84
- function colorOptions({ color, succeedColor, failColor, spinnerColor }) {
85
- const colors = { color, succeedColor, failColor, spinnerColor };
104
+ function colorOptions({ color, succeedColor, failColor, spinnerColor, }) {
105
+ const colors = {
106
+ color,
107
+ succeedColor,
108
+ failColor,
109
+ spinnerColor,
110
+ };
86
111
  Object.keys(colors).forEach(key => {
87
112
  if (!VALID_COLORS.includes(colors[key])) {
88
113
  delete colors[key];
@@ -90,7 +115,7 @@ function colorOptions({ color, succeedColor, failColor, spinnerColor }) {
90
115
  });
91
116
  return colors;
92
117
  }
93
- function prefixOptions({ succeedPrefix, failPrefix }) {
118
+ function prefixOptions({ succeedPrefix, failPrefix, }) {
94
119
  if (terminalSupportsUnicode()) {
95
120
  succeedPrefix = succeedPrefix || '✓';
96
121
  failPrefix = failPrefix || '✖';
@@ -114,23 +139,23 @@ function breakLine(line, prefixLength) {
114
139
  : line;
115
140
  }
116
141
  function getLinesLength(text, prefixLength) {
117
- return stripAnsi(text)
142
+ return (0, strip_ansi_1.default)(text)
118
143
  .split('\n')
119
144
  .map((line, index) => index === 0 ? line.length + prefixLength : line.length);
120
145
  }
121
146
  function writeStream(stream, output, rawLines) {
122
147
  stream.write(output);
123
- readline.moveCursor(stream, 0, -rawLines.length);
148
+ readline_1.default.moveCursor(stream, 0, -rawLines.length);
124
149
  }
125
150
  function cleanStream(stream, rawLines) {
126
151
  rawLines.forEach((lineLength, index) => {
127
- readline.moveCursor(stream, lineLength, index);
128
- readline.clearLine(stream, 1);
129
- readline.moveCursor(stream, -lineLength, -index);
152
+ readline_1.default.moveCursor(stream, lineLength, index);
153
+ readline_1.default.clearLine(stream, 1);
154
+ readline_1.default.moveCursor(stream, -lineLength, -index);
130
155
  });
131
- readline.moveCursor(stream, 0, rawLines.length);
132
- readline.clearScreenDown(stream);
133
- readline.moveCursor(stream, 0, -rawLines.length);
156
+ readline_1.default.moveCursor(stream, 0, rawLines.length);
157
+ readline_1.default.clearScreenDown(stream);
158
+ readline_1.default.moveCursor(stream, 0, -rawLines.length);
134
159
  }
135
160
  function terminalSupportsUnicode() {
136
161
  // The default command prompt and powershell in Windows do not support Unicode characters.
@@ -139,14 +164,3 @@ function terminalSupportsUnicode() {
139
164
  process.env.TERM_PROGRAM === 'vscode' ||
140
165
  !!process.env.WT_SESSION);
141
166
  }
142
- module.exports = {
143
- breakText,
144
- cleanStream,
145
- colorOptions,
146
- getLinesLength,
147
- purgeSpinnerOptions,
148
- purgeSpinnersOptions,
149
- SPINNERS,
150
- terminalSupportsUnicode,
151
- writeStream,
152
- };
@@ -1 +1,7 @@
1
+ declare function supportsHyperlink(stream?: NodeJS.WriteStream): boolean;
2
+ export declare const supportsHyperlinkModule: {
3
+ supportsHyperlink: typeof supportsHyperlink;
4
+ stdout: boolean;
5
+ stderr: boolean;
6
+ };
1
7
  export {};
@@ -1,7 +1,7 @@
1
- // @ts-nocheck
2
- 'use strict';
1
+ "use strict";
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
4
- const { hasFlag } = require('../hasFlag');
3
+ exports.supportsHyperlinkModule = void 0;
4
+ const hasFlag_1 = require("../hasFlag");
5
5
  //See https://github.com/jamestalmage/supports-hyperlinks (License: https://github.com/jamestalmage/supports-hyperlinks/blob/master/license)
6
6
  function parseVersion(versionString) {
7
7
  if (/^\d{3,4}$/.test(versionString)) {
@@ -15,14 +15,14 @@ function parseVersion(versionString) {
15
15
  }
16
16
  const versions = (versionString || '').split('.').map(n => parseInt(n, 10));
17
17
  return {
18
- major: versions[0],
19
- minor: versions[1],
20
- patch: versions[2],
18
+ major: versions[0] || 0,
19
+ minor: versions[1] || 0,
20
+ patch: versions[2] || 0,
21
21
  };
22
22
  }
23
23
  function supportsHyperlink(stream) {
24
24
  const { env } = process;
25
- if (hasFlag('noHyperlinks')) {
25
+ if ((0, hasFlag_1.hasFlag)('noHyperlinks')) {
26
26
  return false;
27
27
  }
28
28
  if (stream && !stream.isTTY) {
@@ -35,7 +35,7 @@ function supportsHyperlink(stream) {
35
35
  return false;
36
36
  }
37
37
  if ('TERM_PROGRAM' in env) {
38
- const version = parseVersion(env.TERM_PROGRAM_VERSION);
38
+ const version = parseVersion(env.TERM_PROGRAM_VERSION || '');
39
39
  switch (env.TERM_PROGRAM) {
40
40
  case 'iTerm.app':
41
41
  if (version.major === 3) {
@@ -50,12 +50,12 @@ function supportsHyperlink(stream) {
50
50
  if (env.VTE_VERSION === '0.50.0') {
51
51
  return false;
52
52
  }
53
- const version = parseVersion(env.VTE_VERSION);
53
+ const version = parseVersion(env.VTE_VERSION || '');
54
54
  return version.major > 0 || version.minor >= 50;
55
55
  }
56
56
  return false;
57
57
  }
58
- module.exports = {
58
+ exports.supportsHyperlinkModule = {
59
59
  supportsHyperlink,
60
60
  stdout: supportsHyperlink(process.stdout),
61
61
  stderr: supportsHyperlink(process.stderr),
@@ -1 +1,17 @@
1
+ interface ColorSupportLevel {
2
+ level: number;
3
+ hasBasic: boolean;
4
+ has256: boolean;
5
+ has16m: boolean;
6
+ }
7
+ declare function createSupportsColor(stream: {
8
+ isTTY?: boolean;
9
+ } | null, options?: {
10
+ streamIsTTY?: boolean;
11
+ }): ColorSupportLevel;
12
+ export declare const supportsColor: {
13
+ createSupportsColor: typeof createSupportsColor;
14
+ stdout: ColorSupportLevel;
15
+ stderr: ColorSupportLevel;
16
+ };
1
17
  export {};
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- // @ts-nocheck
4
- const process = require('process');
5
- const os = require('os');
6
- const tty = require('tty');
7
- const { hasFlag } = require('../hasFlag');
8
- const { env } = process;
9
- //From: https://github.com/chalk/supports-color/blob/main/index.js (License: https://github.com/chalk/supports-color/blob/main/license)
6
+ exports.supportsColor = void 0;
7
+ const process_1 = __importDefault(require("process"));
8
+ const os_1 = __importDefault(require("os"));
9
+ const tty_1 = __importDefault(require("tty"));
10
+ const hasFlag_1 = require("../hasFlag");
11
+ const { env } = process_1.default;
10
12
  function translateLevel(level) {
11
13
  if (level === 0) {
12
14
  return {
@@ -31,13 +33,13 @@ function _supportsColor(haveStream, { streamIsTTY } = {}) {
31
33
  if (env.TERM === 'dumb') {
32
34
  return min;
33
35
  }
34
- if (hasFlag('noColor')) {
36
+ if ((0, hasFlag_1.hasFlag)('noColor')) {
35
37
  return 0;
36
38
  }
37
- if (process.platform === 'win32') {
39
+ if (process_1.default.platform === 'win32') {
38
40
  // Windows 10 build 10586 is the first Windows release that supports 256 colors.
39
41
  // Windows 10 build 14931 is the first release that supports 16m/TrueColor.
40
- const osRelease = os.release().split('.');
42
+ const osRelease = os_1.default.release().split('.');
41
43
  if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {
42
44
  return Number(osRelease[2]) >= 14931 ? 3 : 2;
43
45
  }
@@ -75,10 +77,11 @@ function _supportsColor(haveStream, { streamIsTTY } = {}) {
75
77
  // No default
76
78
  }
77
79
  }
78
- if (/-256(color)?$/i.test(env.TERM)) {
80
+ if (env.TERM && /-256(color)?$/i.test(env.TERM)) {
79
81
  return 2;
80
82
  }
81
- if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
83
+ if (env.TERM &&
84
+ /^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
82
85
  return 1;
83
86
  }
84
87
  if ('COLORTERM' in env) {
@@ -88,14 +91,13 @@ function _supportsColor(haveStream, { streamIsTTY } = {}) {
88
91
  }
89
92
  function createSupportsColor(stream, options = {}) {
90
93
  const level = _supportsColor(stream, {
91
- streamIsTTY: stream && stream.isTTY,
94
+ streamIsTTY: stream?.isTTY,
92
95
  ...options,
93
96
  });
94
97
  return translateLevel(level);
95
98
  }
96
- const supportsColor = {
99
+ exports.supportsColor = {
97
100
  createSupportsColor,
98
- stdout: createSupportsColor({ isTTY: tty.isatty(1) }),
99
- stderr: createSupportsColor({ isTTY: tty.isatty(2) }),
101
+ stdout: createSupportsColor({ isTTY: tty_1.default.isatty(1) }),
102
+ stderr: createSupportsColor({ isTTY: tty_1.default.isatty(2) }),
100
103
  };
101
- module.exports = supportsColor;
package/lib/ui/table.d.ts CHANGED
@@ -1 +1,3 @@
1
- export {};
1
+ import { TableUserConfig } from 'table';
2
+ export declare function getTableContents(tableData?: any[][], tableConfig?: Partial<TableUserConfig>): string;
3
+ export declare function getTableHeader(headerItems: string[]): string[];
package/lib/ui/table.js CHANGED
@@ -1,12 +1,20 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- // @ts-nocheck
4
- const chalk = require('chalk');
5
- const { table } = require('table');
6
+ exports.getTableContents = getTableContents;
7
+ exports.getTableHeader = getTableHeader;
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const table_1 = require("table");
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6
11
  function isObject(item) {
7
12
  return item && typeof item === 'object' && !Array.isArray(item);
8
13
  }
9
- function mergeDeep(target, ...sources) {
14
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
+ function mergeDeep(target,
16
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
+ ...sources) {
10
18
  if (!sources.length)
11
19
  return target;
12
20
  const source = sources.shift();
@@ -51,14 +59,12 @@ const tableConfigDefaults = {
51
59
  return false;
52
60
  },
53
61
  };
54
- function getTableContents(tableData = [], tableConfig = {}) {
62
+ function getTableContents(
63
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
64
+ tableData = [], tableConfig = {}) {
55
65
  const mergedConfig = mergeDeep({}, tableConfigDefaults, tableConfig);
56
- return table(tableData, mergedConfig);
66
+ return (0, table_1.table)(tableData, mergedConfig);
57
67
  }
58
68
  function getTableHeader(headerItems) {
59
- return headerItems.map(headerItem => chalk.bold(headerItem));
69
+ return headerItems.map(headerItem => chalk_1.default.bold(headerItem));
60
70
  }
61
- module.exports = {
62
- getTableContents,
63
- getTableHeader,
64
- };
@@ -1 +1,2 @@
1
- export {};
1
+ export declare function trackCommandUsage(command: any, meta: {} | undefined, accountId: any): void;
2
+ export declare function trackCommandMetadataUsage(command: any, meta: {} | undefined, accountId: any): void;
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.trackCommandUsage = trackCommandUsage;
4
+ exports.trackCommandMetadataUsage = trackCommandMetadataUsage;
3
5
  // @ts-nocheck
4
6
  const { trackUsage } = require('@hubspot/local-dev-lib/trackUsage');
5
7
  const { isTrackingAllowed, getAccountConfig, } = require('@hubspot/local-dev-lib/config');
package/package.json CHANGED
@@ -1,16 +1,14 @@
1
1
  {
2
2
  "name": "@hubspot/cli",
3
- "version": "6.3.0",
3
+ "version": "6.4.0-beta.0",
4
4
  "description": "The official CLI for developing on HubSpot",
5
5
  "license": "Apache-2.0",
6
6
  "repository": "https://github.com/HubSpot/hubspot-cli",
7
7
  "dependencies": {
8
- "@hubspot/local-dev-lib": "2.1.1",
8
+ "@hubspot/local-dev-lib": "2.3.0",
9
9
  "@hubspot/serverless-dev-runtime": "7.0.0",
10
10
  "@hubspot/theme-preview-dev-server": "0.0.9",
11
11
  "@hubspot/ui-extensions-dev-server": "0.8.33",
12
- "@types/fs-extra": "^11.0.4",
13
- "@types/js-yaml": "^4.0.9",
14
12
  "archiver": "^7.0.1",
15
13
  "chalk": "^4.1.2",
16
14
  "chokidar": "^3.0.1",
@@ -20,7 +18,6 @@
20
18
  "findup-sync": "^4.0.0",
21
19
  "fs-extra": "^8.1.0",
22
20
  "inquirer": "8.2.0",
23
- "jest": "^29.5.0",
24
21
  "js-yaml": "^4.1.0",
25
22
  "moment": "^2.29.1",
26
23
  "open": "^7.0.3",
@@ -32,13 +29,18 @@
32
29
  "yargs": "17.7.2"
33
30
  },
34
31
  "devDependencies": {
32
+ "@types/fs-extra": "^11.0.4",
33
+ "@types/jest": "^29.5.14",
34
+ "@types/js-yaml": "^4.0.9",
35
35
  "@types/semver": "^7.5.8",
36
+ "@types/yargs": "^17.0.33",
36
37
  "@typescript-eslint/eslint-plugin": "^8.11.0",
37
38
  "@typescript-eslint/parser": "^8.11.0",
38
39
  "axios": "^1.7.2",
39
40
  "eslint": "^8.56.0",
40
41
  "eslint-plugin-import": "^2.31.0",
41
42
  "husky": "^4.3.8",
43
+ "jest": "^29.5.0",
42
44
  "lint-staged": "^10.5.4",
43
45
  "madge": "^8.0.0",
44
46
  "mock-stdin": "^1.0.0",
@@ -48,6 +50,9 @@
48
50
  "ts-node": "^10.9.2",
49
51
  "typescript": "^5.6.2"
50
52
  },
53
+ "optionalDependencies": {
54
+ "@hubspot/cms-dev-server": "^0.18.9"
55
+ },
51
56
  "scripts": {
52
57
  "build": "ts-node ./scripts/build.ts",
53
58
  "lint": "eslint . && prettier --list-different ./**/*.{js,json}",