@firela/billclaw-cli 0.1.3
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/LICENSE +21 -0
- package/README.md +204 -0
- package/bin/billclaw.js +10 -0
- package/dist/commands/config.d.ts +11 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +112 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/export.d.ts +11 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +106 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/index.d.ts +46 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +22 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/registry.d.ts +62 -0
- package/dist/commands/registry.d.ts.map +1 -0
- package/dist/commands/registry.js +77 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/commands/setup.d.ts +11 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +214 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +11 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +187 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +11 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +150 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/config.d.ts +32 -0
- package/dist/runtime/config.d.ts.map +1 -0
- package/dist/runtime/config.js +105 -0
- package/dist/runtime/config.js.map +1 -0
- package/dist/runtime/context.d.ts +33 -0
- package/dist/runtime/context.d.ts.map +1 -0
- package/dist/runtime/context.js +35 -0
- package/dist/runtime/context.js.map +1 -0
- package/dist/runtime/events.d.ts +24 -0
- package/dist/runtime/events.d.ts.map +1 -0
- package/dist/runtime/events.js +54 -0
- package/dist/runtime/events.js.map +1 -0
- package/dist/runtime/index.d.ts +10 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +10 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/logger.d.ts +41 -0
- package/dist/runtime/logger.d.ts.map +1 -0
- package/dist/runtime/logger.js +95 -0
- package/dist/runtime/logger.js.map +1 -0
- package/dist/utils/format.d.ts +62 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +153 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/progress.d.ts +38 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +70 -0
- package/dist/utils/progress.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI logger implementation
|
|
3
|
+
*
|
|
4
|
+
* Console-based logger with colored output and severity levels.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Log level enum
|
|
8
|
+
*/
|
|
9
|
+
export var LogLevel;
|
|
10
|
+
(function (LogLevel) {
|
|
11
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
12
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
13
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
14
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
15
|
+
})(LogLevel || (LogLevel = {}));
|
|
16
|
+
/**
|
|
17
|
+
* Default logger configuration
|
|
18
|
+
*/
|
|
19
|
+
const defaultConfig = {
|
|
20
|
+
level: process.env.DEBUG ? LogLevel.DEBUG : LogLevel.INFO,
|
|
21
|
+
colors: process.stdout.isTTY ?? false,
|
|
22
|
+
timestamps: true,
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* ANSI color codes
|
|
26
|
+
*/
|
|
27
|
+
const colors = {
|
|
28
|
+
reset: "\x1b[0m",
|
|
29
|
+
dim: "\x1b[2m",
|
|
30
|
+
red: "\x1b[31m",
|
|
31
|
+
yellow: "\x1b[33m",
|
|
32
|
+
blue: "\x1b[34m",
|
|
33
|
+
green: "\x1b[32m",
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* CLI logger implementation
|
|
37
|
+
*/
|
|
38
|
+
export class CliLogger {
|
|
39
|
+
config;
|
|
40
|
+
constructor(config = {}) {
|
|
41
|
+
this.config = { ...defaultConfig, ...config };
|
|
42
|
+
}
|
|
43
|
+
setLevel(level) {
|
|
44
|
+
this.config.level = level;
|
|
45
|
+
}
|
|
46
|
+
debug(...args) {
|
|
47
|
+
if (this.config.level <= LogLevel.DEBUG) {
|
|
48
|
+
this.log("DEBUG", args, colors.dim);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
info(...args) {
|
|
52
|
+
if (this.config.level <= LogLevel.INFO) {
|
|
53
|
+
this.log("INFO", args, colors.blue);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
warn(...args) {
|
|
57
|
+
if (this.config.level <= LogLevel.WARN) {
|
|
58
|
+
this.log("WARN", args, colors.yellow);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
error(...args) {
|
|
62
|
+
if (this.config.level <= LogLevel.ERROR) {
|
|
63
|
+
this.log("ERROR", args, colors.red);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
log(level, args, color) {
|
|
67
|
+
const timestamp = this.config.timestamps
|
|
68
|
+
? `${new Date().toISOString()} `
|
|
69
|
+
: "";
|
|
70
|
+
const prefix = this.config.colors
|
|
71
|
+
? `${color}${timestamp}[${level}]${colors.reset} `
|
|
72
|
+
: `${timestamp}[${level}] `;
|
|
73
|
+
const output = args
|
|
74
|
+
.map((arg) => {
|
|
75
|
+
if (typeof arg === "string") {
|
|
76
|
+
return arg;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
return JSON.stringify(arg, null, 2);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return String(arg);
|
|
83
|
+
}
|
|
84
|
+
})
|
|
85
|
+
.join(" ");
|
|
86
|
+
console.log(prefix + output);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Create a default CLI logger instance
|
|
91
|
+
*/
|
|
92
|
+
export function createLogger(config) {
|
|
93
|
+
return new CliLogger(config);
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/runtime/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Table configuration options
|
|
3
|
+
*/
|
|
4
|
+
export interface TableOptions {
|
|
5
|
+
head: string[];
|
|
6
|
+
style?: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Simple table implementation
|
|
10
|
+
*/
|
|
11
|
+
export declare class CliTable {
|
|
12
|
+
private _head;
|
|
13
|
+
private rows;
|
|
14
|
+
constructor(options: TableOptions);
|
|
15
|
+
push(row: string[]): void;
|
|
16
|
+
toString(): string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create a formatted table
|
|
20
|
+
*/
|
|
21
|
+
export declare function createTable(options: TableOptions): CliTable;
|
|
22
|
+
/**
|
|
23
|
+
* Print a table to console
|
|
24
|
+
*/
|
|
25
|
+
export declare function printTable(table: CliTable): void;
|
|
26
|
+
/**
|
|
27
|
+
* Format a status badge
|
|
28
|
+
*/
|
|
29
|
+
export declare function formatStatus(status: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Format an account type badge
|
|
32
|
+
*/
|
|
33
|
+
export declare function formatAccountType(type: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Format currency amount
|
|
36
|
+
*/
|
|
37
|
+
export declare function formatCurrency(amount: number, currency?: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* Format date
|
|
40
|
+
*/
|
|
41
|
+
export declare function formatDate(date: Date | string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Format datetime
|
|
44
|
+
*/
|
|
45
|
+
export declare function formatDateTime(date: Date | string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Print success message
|
|
48
|
+
*/
|
|
49
|
+
export declare function success(message: string): void;
|
|
50
|
+
/**
|
|
51
|
+
* Print error message
|
|
52
|
+
*/
|
|
53
|
+
export declare function error(message: string): void;
|
|
54
|
+
/**
|
|
55
|
+
* Print warning message
|
|
56
|
+
*/
|
|
57
|
+
export declare function warn(message: string): void;
|
|
58
|
+
/**
|
|
59
|
+
* Print info message
|
|
60
|
+
*/
|
|
61
|
+
export declare function info(message: string): void;
|
|
62
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC;AAED;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,IAAI,CAAiB;gBAEjB,OAAO,EAAE,YAAY;IAIjC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI;IAIzB,QAAQ,IAAI,MAAM;CA8BnB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,QAAQ,CAE3D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEhD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAmBnD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAQ,GAAG,MAAM,CAKvE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAOtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAS1D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI utilities for formatted output
|
|
3
|
+
*
|
|
4
|
+
* Provides table formatting, colored output, and status displays.
|
|
5
|
+
*/
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
/**
|
|
8
|
+
* Simple table implementation
|
|
9
|
+
*/
|
|
10
|
+
export class CliTable {
|
|
11
|
+
_head;
|
|
12
|
+
rows = [];
|
|
13
|
+
constructor(options) {
|
|
14
|
+
this._head = options.head;
|
|
15
|
+
}
|
|
16
|
+
push(row) {
|
|
17
|
+
this.rows.push(row);
|
|
18
|
+
}
|
|
19
|
+
toString() {
|
|
20
|
+
// Calculate column widths
|
|
21
|
+
const colCount = this._head.length;
|
|
22
|
+
const widths = [];
|
|
23
|
+
for (let i = 0; i < colCount; i++) {
|
|
24
|
+
let maxLen = this._head[i].length;
|
|
25
|
+
for (const row of this.rows) {
|
|
26
|
+
if (row[i] && row[i].length > maxLen) {
|
|
27
|
+
maxLen = row[i].length;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
widths.push(maxLen + 2);
|
|
31
|
+
}
|
|
32
|
+
// Build output
|
|
33
|
+
const lines = [];
|
|
34
|
+
// Header
|
|
35
|
+
const header = this._head.map((h, i) => h.padEnd(widths[i])).join("");
|
|
36
|
+
lines.push(chalk.cyan(header));
|
|
37
|
+
// Rows
|
|
38
|
+
for (const row of this.rows) {
|
|
39
|
+
const line = row.map((cell, i) => (cell ?? "").padEnd(widths[i])).join("");
|
|
40
|
+
lines.push(line);
|
|
41
|
+
}
|
|
42
|
+
return lines.join("\n");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create a formatted table
|
|
47
|
+
*/
|
|
48
|
+
export function createTable(options) {
|
|
49
|
+
return new CliTable(options);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Print a table to console
|
|
53
|
+
*/
|
|
54
|
+
export function printTable(table) {
|
|
55
|
+
console.log(table.toString());
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Format a status badge
|
|
59
|
+
*/
|
|
60
|
+
export function formatStatus(status) {
|
|
61
|
+
const normalized = status.toLowerCase();
|
|
62
|
+
switch (normalized) {
|
|
63
|
+
case "active":
|
|
64
|
+
case "connected":
|
|
65
|
+
case "ok":
|
|
66
|
+
case "success":
|
|
67
|
+
return chalk.green(status);
|
|
68
|
+
case "pending":
|
|
69
|
+
case "syncing":
|
|
70
|
+
return chalk.yellow(status);
|
|
71
|
+
case "inactive":
|
|
72
|
+
case "disconnected":
|
|
73
|
+
case "error":
|
|
74
|
+
case "failed":
|
|
75
|
+
return chalk.red(status);
|
|
76
|
+
default:
|
|
77
|
+
return chalk.gray(status);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Format an account type badge
|
|
82
|
+
*/
|
|
83
|
+
export function formatAccountType(type) {
|
|
84
|
+
const normalized = type.toLowerCase();
|
|
85
|
+
switch (normalized) {
|
|
86
|
+
case "plaid":
|
|
87
|
+
return chalk.blue(type);
|
|
88
|
+
case "gmail":
|
|
89
|
+
return chalk.red(type);
|
|
90
|
+
case "gocardless":
|
|
91
|
+
return chalk.green(type);
|
|
92
|
+
default:
|
|
93
|
+
return chalk.gray(type);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Format currency amount
|
|
98
|
+
*/
|
|
99
|
+
export function formatCurrency(amount, currency = "USD") {
|
|
100
|
+
return new Intl.NumberFormat("en-US", {
|
|
101
|
+
style: "currency",
|
|
102
|
+
currency,
|
|
103
|
+
}).format(amount);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Format date
|
|
107
|
+
*/
|
|
108
|
+
export function formatDate(date) {
|
|
109
|
+
const d = typeof date === "string" ? new Date(date) : date;
|
|
110
|
+
return d.toLocaleDateString("en-US", {
|
|
111
|
+
year: "numeric",
|
|
112
|
+
month: "short",
|
|
113
|
+
day: "numeric",
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Format datetime
|
|
118
|
+
*/
|
|
119
|
+
export function formatDateTime(date) {
|
|
120
|
+
const d = typeof date === "string" ? new Date(date) : date;
|
|
121
|
+
return d.toLocaleString("en-US", {
|
|
122
|
+
year: "numeric",
|
|
123
|
+
month: "short",
|
|
124
|
+
day: "numeric",
|
|
125
|
+
hour: "2-digit",
|
|
126
|
+
minute: "2-digit",
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Print success message
|
|
131
|
+
*/
|
|
132
|
+
export function success(message) {
|
|
133
|
+
console.log(chalk.green("✓") + " " + message);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Print error message
|
|
137
|
+
*/
|
|
138
|
+
export function error(message) {
|
|
139
|
+
console.error(chalk.red("✗") + " " + message);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Print warning message
|
|
143
|
+
*/
|
|
144
|
+
export function warn(message) {
|
|
145
|
+
console.warn(chalk.yellow("⚠") + " " + message);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Print info message
|
|
149
|
+
*/
|
|
150
|
+
export function info(message) {
|
|
151
|
+
console.log(chalk.blue("ℹ") + " " + message);
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress utilities for CLI operations
|
|
3
|
+
*
|
|
4
|
+
* Provides spinner and progress bar functionality.
|
|
5
|
+
*/
|
|
6
|
+
import ora from "ora";
|
|
7
|
+
/**
|
|
8
|
+
* Progress spinner options
|
|
9
|
+
*/
|
|
10
|
+
export interface SpinnerOptions {
|
|
11
|
+
text: string;
|
|
12
|
+
color?: typeof ora.prototype["color"];
|
|
13
|
+
hideCursor?: boolean;
|
|
14
|
+
interval?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Progress spinner wrapper
|
|
18
|
+
*/
|
|
19
|
+
export declare class Spinner {
|
|
20
|
+
private ora;
|
|
21
|
+
constructor(options: SpinnerOptions);
|
|
22
|
+
start(): Spinner;
|
|
23
|
+
stop(): Spinner;
|
|
24
|
+
succeed(text?: string): Spinner;
|
|
25
|
+
fail(text?: string): Spinner;
|
|
26
|
+
warn(text?: string): Spinner;
|
|
27
|
+
info(text?: string): Spinner;
|
|
28
|
+
update(text: string): Spinner;
|
|
29
|
+
/**
|
|
30
|
+
* Execute an async function with loading indicator
|
|
31
|
+
*/
|
|
32
|
+
static withLoading<T>(text: string, fn: () => Promise<T>): Promise<T>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a progress spinner
|
|
36
|
+
*/
|
|
37
|
+
export declare function createSpinner(options: SpinnerOptions): Spinner;
|
|
38
|
+
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/utils/progress.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,GAAY,MAAM,KAAK,CAAA;AAE9B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,OAAO,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IACrC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,GAAG,CAAK;gBAEJ,OAAO,EAAE,cAAc;IASnC,KAAK,IAAI,OAAO;IAKhB,IAAI,IAAI,OAAO;IAKf,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAK/B,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAK5B,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAK5B,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAK5B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAK7B;;OAEG;WACU,WAAW,CAAC,CAAC,EAAG,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAW7E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAE9D"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress utilities for CLI operations
|
|
3
|
+
*
|
|
4
|
+
* Provides spinner and progress bar functionality.
|
|
5
|
+
*/
|
|
6
|
+
import ora from "ora";
|
|
7
|
+
/**
|
|
8
|
+
* Progress spinner wrapper
|
|
9
|
+
*/
|
|
10
|
+
export class Spinner {
|
|
11
|
+
ora;
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.ora = ora({
|
|
14
|
+
text: options.text,
|
|
15
|
+
color: options.color ?? "cyan",
|
|
16
|
+
hideCursor: options.hideCursor ?? true,
|
|
17
|
+
interval: options.interval,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
start() {
|
|
21
|
+
this.ora.start();
|
|
22
|
+
return this;
|
|
23
|
+
}
|
|
24
|
+
stop() {
|
|
25
|
+
this.ora.stop();
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
succeed(text) {
|
|
29
|
+
this.ora.succeed(text);
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
fail(text) {
|
|
33
|
+
this.ora.fail(text);
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
warn(text) {
|
|
37
|
+
this.ora.warn(text);
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
info(text) {
|
|
41
|
+
this.ora.info(text);
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
update(text) {
|
|
45
|
+
this.ora.text = text;
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Execute an async function with loading indicator
|
|
50
|
+
*/
|
|
51
|
+
static async withLoading(text, fn) {
|
|
52
|
+
const spinner = new Spinner({ text }).start();
|
|
53
|
+
try {
|
|
54
|
+
const result = await fn();
|
|
55
|
+
spinner.succeed();
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
spinner.fail();
|
|
60
|
+
throw err;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create a progress spinner
|
|
66
|
+
*/
|
|
67
|
+
export function createSpinner(options) {
|
|
68
|
+
return new Spinner(options);
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/utils/progress.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,GAAY,MAAM,KAAK,CAAA;AAY9B;;GAEG;AACH,MAAM,OAAO,OAAO;IACV,GAAG,CAAK;IAEhB,YAAY,OAAuB;QACjC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;YACb,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,MAAM;YAC9B,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;YACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAA;IACJ,CAAC;IAED,KAAK;QACH,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QAChB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI;QACF,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;QACf,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,CAAC,IAAa;QACnB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACtB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC,IAAa;QAChB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC,IAAa;QAChB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC,IAAa;QAChB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAA;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,WAAW,CAAK,IAAY,EAAE,EAAoB;QAC7D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAA;QAC7C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAA;YACzB,OAAO,CAAC,OAAO,EAAE,CAAA;YACjB,OAAO,MAAM,CAAA;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,EAAE,CAAA;YACd,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAuB;IACnD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;AAC7B,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@firela/billclaw-cli",
|
|
3
|
+
"version": "0.1.3",
|
|
4
|
+
"description": "BillClaw CLI - Standalone command-line interface for financial data management",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"bin": {
|
|
16
|
+
"billclaw": "./bin/billclaw.js"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"bin",
|
|
21
|
+
"README.md"
|
|
22
|
+
],
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"billclaw",
|
|
28
|
+
"cli",
|
|
29
|
+
"financial-data",
|
|
30
|
+
"plaid",
|
|
31
|
+
"banking",
|
|
32
|
+
"transactions",
|
|
33
|
+
"beancount",
|
|
34
|
+
"ledger"
|
|
35
|
+
],
|
|
36
|
+
"author": "fire-la",
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "https://github.com/fire-la/billclaw.git",
|
|
41
|
+
"directory": "packages/cli"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@types/node": "^25.2.0",
|
|
45
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
46
|
+
"oxfmt": "^0.1.0",
|
|
47
|
+
"oxlint": "^0.15.0",
|
|
48
|
+
"typescript": "^5.8.0",
|
|
49
|
+
"vitest": "^3.0.0"
|
|
50
|
+
},
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"chalk": "^5.4.0",
|
|
53
|
+
"cli-table3": "^0.6.5",
|
|
54
|
+
"commander": "^13.1.0",
|
|
55
|
+
"inquirer": "^12.0.0",
|
|
56
|
+
"ora": "^8.1.0",
|
|
57
|
+
"@firela/billclaw-core": "0.1.3"
|
|
58
|
+
},
|
|
59
|
+
"engines": {
|
|
60
|
+
"node": ">=20.0.0"
|
|
61
|
+
},
|
|
62
|
+
"scripts": {
|
|
63
|
+
"build": "tsc",
|
|
64
|
+
"dev": "tsc --watch",
|
|
65
|
+
"test": "vitest",
|
|
66
|
+
"test:coverage": "vitest --coverage",
|
|
67
|
+
"lint": "oxlint",
|
|
68
|
+
"format": "oxfmt src/",
|
|
69
|
+
"format:write": "oxfmt -w src/",
|
|
70
|
+
"clean": "rm -rf dist"
|
|
71
|
+
}
|
|
72
|
+
}
|