@browserflow-ai/cli 0.0.6
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/bin/bf.js +3 -0
- package/dist/commands/baseline.d.ts +77 -0
- package/dist/commands/baseline.d.ts.map +1 -0
- package/dist/commands/baseline.js +429 -0
- package/dist/commands/baseline.js.map +1 -0
- package/dist/commands/doctor.d.ts +39 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +230 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/explore.d.ts +12 -0
- package/dist/commands/explore.d.ts.map +1 -0
- package/dist/commands/explore.js +114 -0
- package/dist/commands/explore.js.map +1 -0
- package/dist/commands/init.d.ts +15 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +160 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lint.d.ts +37 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +248 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/repair.d.ts +72 -0
- package/dist/commands/repair.d.ts.map +1 -0
- package/dist/commands/repair.js +271 -0
- package/dist/commands/repair.js.map +1 -0
- package/dist/commands/review.d.ts +26 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +371 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.d.ts +5 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +66 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/run/executor.d.ts +10 -0
- package/dist/run/executor.d.ts.map +1 -0
- package/dist/run/executor.js +95 -0
- package/dist/run/executor.js.map +1 -0
- package/dist/run/failure-bundle.d.ts +65 -0
- package/dist/run/failure-bundle.d.ts.map +1 -0
- package/dist/run/failure-bundle.js +253 -0
- package/dist/run/failure-bundle.js.map +1 -0
- package/dist/run/index.d.ts +6 -0
- package/dist/run/index.d.ts.map +1 -0
- package/dist/run/index.js +6 -0
- package/dist/run/index.js.map +1 -0
- package/dist/run/output.d.ts +5 -0
- package/dist/run/output.d.ts.map +1 -0
- package/dist/run/output.js +62 -0
- package/dist/run/output.js.map +1 -0
- package/dist/run/results.d.ts +5 -0
- package/dist/run/results.d.ts.map +1 -0
- package/dist/run/results.js +124 -0
- package/dist/run/results.js.map +1 -0
- package/dist/run/types.d.ts +44 -0
- package/dist/run/types.d.ts.map +1 -0
- package/dist/run/types.js +2 -0
- package/dist/run/types.js.map +1 -0
- package/dist/ui/box.d.ts +13 -0
- package/dist/ui/box.d.ts.map +1 -0
- package/dist/ui/box.js +32 -0
- package/dist/ui/box.js.map +1 -0
- package/dist/ui/colors.d.ts +28 -0
- package/dist/ui/colors.d.ts.map +1 -0
- package/dist/ui/colors.js +34 -0
- package/dist/ui/colors.js.map +1 -0
- package/dist/ui/env.d.ts +31 -0
- package/dist/ui/env.d.ts.map +1 -0
- package/dist/ui/env.js +77 -0
- package/dist/ui/env.js.map +1 -0
- package/dist/ui/index.d.ts +7 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +7 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/output.d.ts +18 -0
- package/dist/ui/output.d.ts.map +1 -0
- package/dist/ui/output.js +33 -0
- package/dist/ui/output.js.map +1 -0
- package/dist/ui/prompts.d.ts +12 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +37 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/ui/spinner.d.ts +9 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/spinner.js +27 -0
- package/dist/ui/spinner.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../../src/ui/box.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,UAAe,GAAG,MAAM,CAwB5F;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,UAAe,GAAG,IAAI,CAEzF"}
|
package/dist/ui/box.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { colors } from './colors.js';
|
|
2
|
+
/**
|
|
3
|
+
* Format content into a box with title and return as string
|
|
4
|
+
*/
|
|
5
|
+
export function formatBox(title, content, options = {}) {
|
|
6
|
+
const width = options.width ?? 58;
|
|
7
|
+
const lines = [];
|
|
8
|
+
// Top border with title
|
|
9
|
+
// Account for ANSI escape codes in padEnd calculation
|
|
10
|
+
const styledTitle = colors.bold(title);
|
|
11
|
+
const ansiOverhead = styledTitle.length - title.length;
|
|
12
|
+
lines.push('┌' + '─'.repeat(width) + '┐');
|
|
13
|
+
lines.push('│ ' + styledTitle.padEnd(width - 1 + ansiOverhead) + '│');
|
|
14
|
+
if (content.length > 0) {
|
|
15
|
+
lines.push('├' + '─'.repeat(width) + '┤');
|
|
16
|
+
for (const line of content) {
|
|
17
|
+
// Handle lines that might be longer than width
|
|
18
|
+
const truncated = line.length > width - 2 ? line.slice(0, width - 5) + '...' : line;
|
|
19
|
+
lines.push('│ ' + truncated.padEnd(width - 1) + '│');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Bottom border
|
|
23
|
+
lines.push('└' + '─'.repeat(width) + '┘');
|
|
24
|
+
return lines.join('\n');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Print a formatted box to the console
|
|
28
|
+
*/
|
|
29
|
+
export function printBox(title, content, options = {}) {
|
|
30
|
+
console.log(formatBox(title, content, options));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=box.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box.js","sourceRoot":"","sources":["../../src/ui/box.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,OAAiB,EAAE,UAAsB,EAAE;IAClF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IAClC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,wBAAwB;IACxB,sDAAsD;IACtD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IACvD,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IAC1C,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC;IAEtE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,+CAA+C;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YACpF,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IAE1C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,OAAiB,EAAE,UAAsB,EAAE;IACjF,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export declare const colors: {
|
|
3
|
+
success: import("chalk").ChalkInstance;
|
|
4
|
+
error: import("chalk").ChalkInstance;
|
|
5
|
+
warning: import("chalk").ChalkInstance;
|
|
6
|
+
info: import("chalk").ChalkInstance;
|
|
7
|
+
dim: import("chalk").ChalkInstance;
|
|
8
|
+
bold: import("chalk").ChalkInstance;
|
|
9
|
+
underline: import("chalk").ChalkInstance;
|
|
10
|
+
primary: import("chalk").ChalkInstance;
|
|
11
|
+
secondary: import("chalk").ChalkInstance;
|
|
12
|
+
code: import("chalk").ChalkInstance;
|
|
13
|
+
path: import("chalk").ChalkInstance;
|
|
14
|
+
pass: import("chalk").ChalkInstance;
|
|
15
|
+
fail: import("chalk").ChalkInstance;
|
|
16
|
+
skip: import("chalk").ChalkInstance;
|
|
17
|
+
};
|
|
18
|
+
export declare const symbols: {
|
|
19
|
+
pass: string;
|
|
20
|
+
fail: string;
|
|
21
|
+
pending: string;
|
|
22
|
+
arrow: string;
|
|
23
|
+
bullet: string;
|
|
24
|
+
info: string;
|
|
25
|
+
warn: string;
|
|
26
|
+
};
|
|
27
|
+
export { chalk };
|
|
28
|
+
//# sourceMappingURL=colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/ui/colors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;CAwBlB,CAAC;AAGF,eAAO,MAAM,OAAO;;;;;;;;CAQnB,CAAC;AAEF,OAAO,EAAE,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export const colors = {
|
|
3
|
+
// Status colors
|
|
4
|
+
success: chalk.green,
|
|
5
|
+
error: chalk.red,
|
|
6
|
+
warning: chalk.yellow,
|
|
7
|
+
info: chalk.blue,
|
|
8
|
+
// UI elements
|
|
9
|
+
dim: chalk.dim,
|
|
10
|
+
bold: chalk.bold,
|
|
11
|
+
underline: chalk.underline,
|
|
12
|
+
// BrowserFlow brand
|
|
13
|
+
primary: chalk.cyan,
|
|
14
|
+
secondary: chalk.magenta,
|
|
15
|
+
// Code and paths
|
|
16
|
+
code: chalk.cyan,
|
|
17
|
+
path: chalk.underline,
|
|
18
|
+
// Semantic
|
|
19
|
+
pass: chalk.green,
|
|
20
|
+
fail: chalk.red,
|
|
21
|
+
skip: chalk.yellow,
|
|
22
|
+
};
|
|
23
|
+
// Pre-rendered symbols for consistent output
|
|
24
|
+
export const symbols = {
|
|
25
|
+
pass: chalk.green('✓'),
|
|
26
|
+
fail: chalk.red('✗'),
|
|
27
|
+
pending: chalk.yellow('○'),
|
|
28
|
+
arrow: chalk.cyan('→'),
|
|
29
|
+
bullet: chalk.dim('•'),
|
|
30
|
+
info: chalk.blue('ℹ'),
|
|
31
|
+
warn: chalk.yellow('⚠'),
|
|
32
|
+
};
|
|
33
|
+
export { chalk };
|
|
34
|
+
//# sourceMappingURL=colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/ui/colors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,gBAAgB;IAChB,OAAO,EAAE,KAAK,CAAC,KAAK;IACpB,KAAK,EAAE,KAAK,CAAC,GAAG;IAChB,OAAO,EAAE,KAAK,CAAC,MAAM;IACrB,IAAI,EAAE,KAAK,CAAC,IAAI;IAEhB,cAAc;IACd,GAAG,EAAE,KAAK,CAAC,GAAG;IACd,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,SAAS,EAAE,KAAK,CAAC,SAAS;IAE1B,oBAAoB;IACpB,OAAO,EAAE,KAAK,CAAC,IAAI;IACnB,SAAS,EAAE,KAAK,CAAC,OAAO;IAExB,iBAAiB;IACjB,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,IAAI,EAAE,KAAK,CAAC,SAAS;IAErB,WAAW;IACX,IAAI,EAAE,KAAK,CAAC,KAAK;IACjB,IAAI,EAAE,KAAK,CAAC,GAAG;IACf,IAAI,EAAE,KAAK,CAAC,MAAM;CACnB,CAAC;AAEF,6CAA6C;AAC7C,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;IACtB,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;IAC1B,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACtB,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;IACtB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACrB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;CACxB,CAAC;AAEF,OAAO,EAAE,KAAK,EAAE,CAAC"}
|
package/dist/ui/env.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment detection utilities for CLI output
|
|
3
|
+
* Handles CI detection, TTY checks, and color support
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Detect if running in a CI environment
|
|
7
|
+
*/
|
|
8
|
+
export declare function isCI(): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Check if stdout is a TTY (interactive terminal)
|
|
11
|
+
*/
|
|
12
|
+
export declare function isTTY(): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Check if the terminal supports colors
|
|
15
|
+
* Respects NO_COLOR and FORCE_COLOR environment variables
|
|
16
|
+
*/
|
|
17
|
+
export declare function supportsColor(): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Reset cached values (for testing)
|
|
20
|
+
*/
|
|
21
|
+
export declare function resetEnvCache(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Check if spinners should be used
|
|
24
|
+
* Spinners don't work well in CI or non-TTY environments
|
|
25
|
+
*/
|
|
26
|
+
export declare function shouldUseSpinners(): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Check if interactive prompts can be used
|
|
29
|
+
*/
|
|
30
|
+
export declare function isInteractive(): boolean;
|
|
31
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/ui/env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;GAEG;AACH,wBAAgB,IAAI,IAAI,OAAO,CAe9B;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,OAAO,CAI/B;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAkBvC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAIpC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC"}
|
package/dist/ui/env.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment detection utilities for CLI output
|
|
3
|
+
* Handles CI detection, TTY checks, and color support
|
|
4
|
+
*/
|
|
5
|
+
// Cache values since they don't change during execution
|
|
6
|
+
let cachedIsCI;
|
|
7
|
+
let cachedIsTTY;
|
|
8
|
+
let cachedSupportsColor;
|
|
9
|
+
/**
|
|
10
|
+
* Detect if running in a CI environment
|
|
11
|
+
*/
|
|
12
|
+
export function isCI() {
|
|
13
|
+
if (cachedIsCI !== undefined)
|
|
14
|
+
return cachedIsCI;
|
|
15
|
+
cachedIsCI = Boolean(process.env.CI ||
|
|
16
|
+
process.env.GITHUB_ACTIONS ||
|
|
17
|
+
process.env.GITLAB_CI ||
|
|
18
|
+
process.env.JENKINS_URL ||
|
|
19
|
+
process.env.CIRCLECI ||
|
|
20
|
+
process.env.TRAVIS ||
|
|
21
|
+
process.env.BUILDKITE ||
|
|
22
|
+
process.env.TF_BUILD // Azure Pipelines
|
|
23
|
+
);
|
|
24
|
+
return cachedIsCI;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check if stdout is a TTY (interactive terminal)
|
|
28
|
+
*/
|
|
29
|
+
export function isTTY() {
|
|
30
|
+
if (cachedIsTTY !== undefined)
|
|
31
|
+
return cachedIsTTY;
|
|
32
|
+
cachedIsTTY = Boolean(process.stdout.isTTY);
|
|
33
|
+
return cachedIsTTY;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if the terminal supports colors
|
|
37
|
+
* Respects NO_COLOR and FORCE_COLOR environment variables
|
|
38
|
+
*/
|
|
39
|
+
export function supportsColor() {
|
|
40
|
+
if (cachedSupportsColor !== undefined)
|
|
41
|
+
return cachedSupportsColor;
|
|
42
|
+
// NO_COLOR takes precedence (https://no-color.org/)
|
|
43
|
+
if (process.env.NO_COLOR) {
|
|
44
|
+
cachedSupportsColor = false;
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
// FORCE_COLOR overrides TTY check
|
|
48
|
+
if (process.env.FORCE_COLOR) {
|
|
49
|
+
cachedSupportsColor = true;
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
// Default to TTY status
|
|
53
|
+
cachedSupportsColor = isTTY();
|
|
54
|
+
return cachedSupportsColor;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Reset cached values (for testing)
|
|
58
|
+
*/
|
|
59
|
+
export function resetEnvCache() {
|
|
60
|
+
cachedIsCI = undefined;
|
|
61
|
+
cachedIsTTY = undefined;
|
|
62
|
+
cachedSupportsColor = undefined;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check if spinners should be used
|
|
66
|
+
* Spinners don't work well in CI or non-TTY environments
|
|
67
|
+
*/
|
|
68
|
+
export function shouldUseSpinners() {
|
|
69
|
+
return isTTY() && !isCI();
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check if interactive prompts can be used
|
|
73
|
+
*/
|
|
74
|
+
export function isInteractive() {
|
|
75
|
+
return isTTY() && !isCI() && Boolean(process.stdin.isTTY);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/ui/env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wDAAwD;AACxD,IAAI,UAA+B,CAAC;AACpC,IAAI,WAAgC,CAAC;AACrC,IAAI,mBAAwC,CAAC;AAE7C;;GAEG;AACH,MAAM,UAAU,IAAI;IAClB,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC;IAEhD,UAAU,GAAG,OAAO,CAClB,OAAO,CAAC,GAAG,CAAC,EAAE;QACd,OAAO,CAAC,GAAG,CAAC,cAAc;QAC1B,OAAO,CAAC,GAAG,CAAC,SAAS;QACrB,OAAO,CAAC,GAAG,CAAC,WAAW;QACvB,OAAO,CAAC,GAAG,CAAC,QAAQ;QACpB,OAAO,CAAC,GAAG,CAAC,MAAM;QAClB,OAAO,CAAC,GAAG,CAAC,SAAS;QACrB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,kBAAkB;KACxC,CAAC;IAEF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK;IACnB,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAClD,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,mBAAmB,KAAK,SAAS;QAAE,OAAO,mBAAmB,CAAC;IAElE,oDAAoD;IACpD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACzB,mBAAmB,GAAG,KAAK,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kCAAkC;IAClC,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QAC5B,mBAAmB,GAAG,IAAI,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wBAAwB;IACxB,mBAAmB,GAAG,KAAK,EAAE,CAAC;IAC9B,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,UAAU,GAAG,SAAS,CAAC;IACvB,WAAW,GAAG,SAAS,CAAC;IACxB,mBAAmB,GAAG,SAAS,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
|
package/dist/ui/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enable or disable JSON output mode
|
|
3
|
+
*/
|
|
4
|
+
export declare function setJsonMode(enabled: boolean): void;
|
|
5
|
+
/**
|
|
6
|
+
* Check if JSON mode is currently enabled
|
|
7
|
+
*/
|
|
8
|
+
export declare function isJsonMode(): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Output data - in JSON mode outputs as formatted JSON,
|
|
11
|
+
* in normal mode does nothing (caller should handle human output)
|
|
12
|
+
*/
|
|
13
|
+
export declare function output(data: unknown): void;
|
|
14
|
+
/**
|
|
15
|
+
* Reset output state (for testing)
|
|
16
|
+
*/
|
|
17
|
+
export declare function resetOutputState(): void;
|
|
18
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/ui/output.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAElD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAK1C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global JSON mode state
|
|
3
|
+
*/
|
|
4
|
+
let jsonMode = false;
|
|
5
|
+
/**
|
|
6
|
+
* Enable or disable JSON output mode
|
|
7
|
+
*/
|
|
8
|
+
export function setJsonMode(enabled) {
|
|
9
|
+
jsonMode = enabled;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Check if JSON mode is currently enabled
|
|
13
|
+
*/
|
|
14
|
+
export function isJsonMode() {
|
|
15
|
+
return jsonMode;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Output data - in JSON mode outputs as formatted JSON,
|
|
19
|
+
* in normal mode does nothing (caller should handle human output)
|
|
20
|
+
*/
|
|
21
|
+
export function output(data) {
|
|
22
|
+
if (jsonMode) {
|
|
23
|
+
console.log(JSON.stringify(data, null, 2));
|
|
24
|
+
}
|
|
25
|
+
// In non-JSON mode, caller handles human-friendly output
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Reset output state (for testing)
|
|
29
|
+
*/
|
|
30
|
+
export function resetOutputState() {
|
|
31
|
+
jsonMode = false;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/ui/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,QAAQ,GAAG,OAAO,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,IAAa;IAClC,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,yDAAyD;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,QAAQ,GAAG,KAAK,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function logSuccess(message: string): void;
|
|
2
|
+
export declare function logError(message: string): void;
|
|
3
|
+
export declare function logWarning(message: string): void;
|
|
4
|
+
export declare function logInfo(message: string): void;
|
|
5
|
+
export declare function logStep(step: number, total: number, message: string): void;
|
|
6
|
+
export declare function logHeader(title: string): void;
|
|
7
|
+
export declare function logNewline(): void;
|
|
8
|
+
/**
|
|
9
|
+
* Print "Next steps" guidance for the user
|
|
10
|
+
*/
|
|
11
|
+
export declare function printNextSteps(steps: string[]): void;
|
|
12
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI7C;AAED,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAQpD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { colors, symbols } from './colors.js';
|
|
2
|
+
export function logSuccess(message) {
|
|
3
|
+
console.log(colors.success('✓'), message);
|
|
4
|
+
}
|
|
5
|
+
export function logError(message) {
|
|
6
|
+
console.error(colors.error('✗'), message);
|
|
7
|
+
}
|
|
8
|
+
export function logWarning(message) {
|
|
9
|
+
console.warn(colors.warning('⚠'), message);
|
|
10
|
+
}
|
|
11
|
+
export function logInfo(message) {
|
|
12
|
+
console.log(colors.info('ℹ'), message);
|
|
13
|
+
}
|
|
14
|
+
export function logStep(step, total, message) {
|
|
15
|
+
console.log(colors.dim(`[${step}/${total}]`), message);
|
|
16
|
+
}
|
|
17
|
+
export function logHeader(title) {
|
|
18
|
+
console.log();
|
|
19
|
+
console.log(colors.bold(colors.primary(title)));
|
|
20
|
+
console.log(colors.dim('─'.repeat(title.length)));
|
|
21
|
+
}
|
|
22
|
+
export function logNewline() {
|
|
23
|
+
console.log();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Print "Next steps" guidance for the user
|
|
27
|
+
*/
|
|
28
|
+
export function printNextSteps(steps) {
|
|
29
|
+
if (steps.length === 0)
|
|
30
|
+
return;
|
|
31
|
+
console.log();
|
|
32
|
+
console.log(colors.bold('Next steps:'));
|
|
33
|
+
for (const step of steps) {
|
|
34
|
+
console.log(` ${symbols.arrow} ${step}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,KAAa,EAAE,OAAe;IAClE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAe;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE/B,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Ora } from 'ora';
|
|
2
|
+
export interface SpinnerOptions {
|
|
3
|
+
text: string;
|
|
4
|
+
color?: 'cyan' | 'green' | 'yellow' | 'red' | 'blue' | 'magenta';
|
|
5
|
+
}
|
|
6
|
+
export declare function createSpinner(options: SpinnerOptions | string): Ora;
|
|
7
|
+
export declare function withSpinner<T>(text: string, fn: () => Promise<T>): Promise<T>;
|
|
8
|
+
export declare function stepSpinner(step: string, total?: number): Ora;
|
|
9
|
+
//# sourceMappingURL=spinner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/ui/spinner.ts"],"names":[],"mappings":"AAAA,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAGpC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;CAClE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,GAAG,GAAG,CAMnE;AAED,wBAAsB,WAAW,CAAC,CAAC,EACjC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAYZ;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG,CAG7D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import ora, {} from 'ora';
|
|
2
|
+
import { colors } from './colors.js';
|
|
3
|
+
export function createSpinner(options) {
|
|
4
|
+
const opts = typeof options === 'string' ? { text: options } : options;
|
|
5
|
+
return ora({
|
|
6
|
+
text: opts.text,
|
|
7
|
+
color: opts.color ?? 'cyan',
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
export async function withSpinner(text, fn) {
|
|
11
|
+
const spinner = createSpinner(text);
|
|
12
|
+
spinner.start();
|
|
13
|
+
try {
|
|
14
|
+
const result = await fn();
|
|
15
|
+
spinner.succeed();
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
spinner.fail();
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function stepSpinner(step, total) {
|
|
24
|
+
const prefix = total ? colors.dim(`[${step}/${total}]`) : colors.dim(`[${step}]`);
|
|
25
|
+
return createSpinner(`${prefix} `);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/ui/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,EAAE,EAAY,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC,MAAM,UAAU,aAAa,CAAC,OAAgC;IAC5D,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IACvE,OAAO,GAAG,CAAC;QACT,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,MAAM;KAC5B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAY,EACZ,EAAoB;IAEpB,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;QAC1B,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,KAAc;IACtD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;IAClF,OAAO,aAAa,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;AACrC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@browserflow-ai/cli",
|
|
3
|
+
"version": "0.0.6",
|
|
4
|
+
"description": "bf command-line tool for BrowserFlow - Human-in-the-Loop E2E Test Generation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"bf": "./bin/bf.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts"
|
|
15
|
+
},
|
|
16
|
+
"./dist/*": {
|
|
17
|
+
"import": "./dist/*.js",
|
|
18
|
+
"types": "./dist/*.d.ts"
|
|
19
|
+
},
|
|
20
|
+
"./dist/commands/explore.js": {
|
|
21
|
+
"import": "./dist/commands/explore.js",
|
|
22
|
+
"types": "./dist/commands/explore.d.ts"
|
|
23
|
+
},
|
|
24
|
+
"./dist/commands/review.js": {
|
|
25
|
+
"import": "./dist/commands/review.js",
|
|
26
|
+
"types": "./dist/commands/review.d.ts"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsc",
|
|
31
|
+
"test": "bun test",
|
|
32
|
+
"typecheck": "tsc --noEmit",
|
|
33
|
+
"dev": "bun run src/index.ts"
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist",
|
|
37
|
+
"bin"
|
|
38
|
+
],
|
|
39
|
+
"keywords": [
|
|
40
|
+
"browserflow",
|
|
41
|
+
"e2e",
|
|
42
|
+
"testing",
|
|
43
|
+
"playwright",
|
|
44
|
+
"ai",
|
|
45
|
+
"automation"
|
|
46
|
+
],
|
|
47
|
+
"repository": {
|
|
48
|
+
"type": "git",
|
|
49
|
+
"url": "https://github.com/akatz-ai/browserflow.git",
|
|
50
|
+
"directory": "packages/cli"
|
|
51
|
+
},
|
|
52
|
+
"bugs": {
|
|
53
|
+
"url": "https://github.com/akatz-ai/browserflow/issues"
|
|
54
|
+
},
|
|
55
|
+
"homepage": "https://github.com/akatz-ai/browserflow#readme",
|
|
56
|
+
"license": "MIT",
|
|
57
|
+
"engines": {
|
|
58
|
+
"node": ">=18.0.0"
|
|
59
|
+
},
|
|
60
|
+
"dependencies": {
|
|
61
|
+
"@browserflow-ai/core": "0.0.6",
|
|
62
|
+
"@browserflow-ai/exploration": "0.0.6",
|
|
63
|
+
"@browserflow-ai/generator": "0.0.6",
|
|
64
|
+
"@browserflow-ai/review-ui": "0.0.6",
|
|
65
|
+
"chalk": "^5.3.0",
|
|
66
|
+
"commander": "^12.0.0",
|
|
67
|
+
"ora": "^8.0.0",
|
|
68
|
+
"pixelmatch": "^6.0.0",
|
|
69
|
+
"pngjs": "^7.0.0",
|
|
70
|
+
"yaml": "^2.8.2"
|
|
71
|
+
},
|
|
72
|
+
"devDependencies": {
|
|
73
|
+
"@types/node": "^20.10.0",
|
|
74
|
+
"@types/pixelmatch": "^5.2.6",
|
|
75
|
+
"@types/pngjs": "^6.0.5",
|
|
76
|
+
"bun-types": "^1.1.0"
|
|
77
|
+
}
|
|
78
|
+
}
|