paymongo-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug-report.md +33 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +30 -0
- package/.github/workflows/ci-cd.yml +88 -0
- package/.github/workflows/ci.yml +46 -0
- package/.github/workflows/release.yml +54 -0
- package/LICENSE +21 -0
- package/README.md +113 -0
- package/bin/paymongo.js +3 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/commands/config.d.ts +4 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +398 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/dev.d.ts +4 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +353 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/gui.d.ts +4 -0
- package/dist/commands/gui.d.ts.map +1 -0
- package/dist/commands/gui.js +74 -0
- package/dist/commands/gui.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +268 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +4 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +287 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/payments.d.ts +4 -0
- package/dist/commands/payments.d.ts.map +1 -0
- package/dist/commands/payments.js +180 -0
- package/dist/commands/payments.js.map +1 -0
- package/dist/commands/team/index.d.ts +4 -0
- package/dist/commands/team/index.d.ts.map +1 -0
- package/dist/commands/team/index.js +155 -0
- package/dist/commands/team/index.js.map +1 -0
- package/dist/commands/trigger.d.ts +4 -0
- package/dist/commands/trigger.d.ts.map +1 -0
- package/dist/commands/trigger.js +312 -0
- package/dist/commands/trigger.js.map +1 -0
- package/dist/commands/webhooks.d.ts +4 -0
- package/dist/commands/webhooks.d.ts.map +1 -0
- package/dist/commands/webhooks.js +357 -0
- package/dist/commands/webhooks.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/services/analytics/service.d.ts +29 -0
- package/dist/services/analytics/service.d.ts.map +1 -0
- package/dist/services/analytics/service.js +97 -0
- package/dist/services/analytics/service.js.map +1 -0
- package/dist/services/api/client.d.ts +27 -0
- package/dist/services/api/client.d.ts.map +1 -0
- package/dist/services/api/client.js +151 -0
- package/dist/services/api/client.js.map +1 -0
- package/dist/services/config/manager.d.ts +16 -0
- package/dist/services/config/manager.d.ts.map +1 -0
- package/dist/services/config/manager.js +211 -0
- package/dist/services/config/manager.js.map +1 -0
- package/dist/services/github/auth.d.ts +15 -0
- package/dist/services/github/auth.d.ts.map +1 -0
- package/dist/services/github/auth.js +119 -0
- package/dist/services/github/auth.js.map +1 -0
- package/dist/services/github/client.d.ts +54 -0
- package/dist/services/github/client.d.ts.map +1 -0
- package/dist/services/github/client.js +107 -0
- package/dist/services/github/client.js.map +1 -0
- package/dist/services/github/sync.d.ts +26 -0
- package/dist/services/github/sync.d.ts.map +1 -0
- package/dist/services/github/sync.js +200 -0
- package/dist/services/github/sync.js.map +1 -0
- package/dist/services/web/server.d.ts +30 -0
- package/dist/services/web/server.d.ts.map +1 -0
- package/dist/services/web/server.js +159 -0
- package/dist/services/web/server.js.map +1 -0
- package/dist/types/paymongo.d.ts +118 -0
- package/dist/types/paymongo.d.ts.map +1 -0
- package/dist/types/paymongo.js +3 -0
- package/dist/types/paymongo.js.map +1 -0
- package/dist/utils/cache.d.ts +20 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +164 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/constants.d.ts +32 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +52 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/errors.d.ts +33 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +79 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +17 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +53 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/spinner.d.ts +17 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +54 -0
- package/dist/utils/spinner.js.map +1 -0
- package/dist/utils/validator.d.ts +10 -0
- package/dist/utils/validator.d.ts.map +1 -0
- package/dist/utils/validator.js +79 -0
- package/dist/utils/validator.js.map +1 -0
- package/package.json +70 -0
- package/web/index.html +688 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
export interface PayMongoConfig {
|
|
2
|
+
version: string;
|
|
3
|
+
projectName: string;
|
|
4
|
+
environment: 'test' | 'live';
|
|
5
|
+
apiKeys: {
|
|
6
|
+
test?: {
|
|
7
|
+
public: string;
|
|
8
|
+
secret: string;
|
|
9
|
+
};
|
|
10
|
+
live?: {
|
|
11
|
+
public: string;
|
|
12
|
+
secret: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
webhooks: {
|
|
16
|
+
url: string;
|
|
17
|
+
events: string[];
|
|
18
|
+
};
|
|
19
|
+
webhookSecrets: Record<string, string>;
|
|
20
|
+
dev: {
|
|
21
|
+
port: number;
|
|
22
|
+
autoRegisterWebhook: boolean;
|
|
23
|
+
verifyWebhookSignatures: boolean;
|
|
24
|
+
};
|
|
25
|
+
team?: {
|
|
26
|
+
githubToken?: string;
|
|
27
|
+
repo?: string;
|
|
28
|
+
branch?: string;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export interface WebhookData {
|
|
32
|
+
id: string;
|
|
33
|
+
type: 'webhook';
|
|
34
|
+
attributes: {
|
|
35
|
+
url: string;
|
|
36
|
+
events: string[];
|
|
37
|
+
status: 'enabled' | 'disabled';
|
|
38
|
+
created_at: number;
|
|
39
|
+
updated_at: number;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export interface PaymentData {
|
|
43
|
+
id: string;
|
|
44
|
+
type: 'payment';
|
|
45
|
+
attributes: {
|
|
46
|
+
amount: number;
|
|
47
|
+
currency: string;
|
|
48
|
+
status: 'paid' | 'failed' | 'pending';
|
|
49
|
+
created_at: number;
|
|
50
|
+
updated_at: number;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export interface ApiResponse<T> {
|
|
54
|
+
data: T;
|
|
55
|
+
meta?: {
|
|
56
|
+
count?: number;
|
|
57
|
+
pagination?: {
|
|
58
|
+
current_page: number;
|
|
59
|
+
per_page: number;
|
|
60
|
+
total_count: number;
|
|
61
|
+
total_pages: number;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export interface WebhookEvent {
|
|
66
|
+
id: string;
|
|
67
|
+
type: string;
|
|
68
|
+
attributes: Record<string, unknown>;
|
|
69
|
+
relationships?: Record<string, unknown>;
|
|
70
|
+
}
|
|
71
|
+
export interface PaymentEvent extends WebhookEvent {
|
|
72
|
+
type: 'payment';
|
|
73
|
+
attributes: {
|
|
74
|
+
amount: number;
|
|
75
|
+
currency: string;
|
|
76
|
+
status: 'paid' | 'failed' | 'pending' | 'expired';
|
|
77
|
+
created_at: number;
|
|
78
|
+
updated_at: number;
|
|
79
|
+
fees: number;
|
|
80
|
+
net_amount: number;
|
|
81
|
+
};
|
|
82
|
+
relationships: {
|
|
83
|
+
payment_intent?: {
|
|
84
|
+
data: {
|
|
85
|
+
id: string;
|
|
86
|
+
type: 'payment_intent';
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export interface CommandOptions {
|
|
92
|
+
help?: boolean;
|
|
93
|
+
version?: boolean;
|
|
94
|
+
}
|
|
95
|
+
export interface ConfigManagerOptions {
|
|
96
|
+
configPath?: string;
|
|
97
|
+
}
|
|
98
|
+
export interface LoggerOptions {
|
|
99
|
+
level?: 'error' | 'warn' | 'info' | 'debug';
|
|
100
|
+
file?: string;
|
|
101
|
+
}
|
|
102
|
+
export interface SpinnerOptions {
|
|
103
|
+
text?: string;
|
|
104
|
+
color?: string;
|
|
105
|
+
}
|
|
106
|
+
export interface ApiClientConfig {
|
|
107
|
+
config: PayMongoConfig;
|
|
108
|
+
}
|
|
109
|
+
export interface PayMongoError {
|
|
110
|
+
code: string;
|
|
111
|
+
message: string;
|
|
112
|
+
details?: Record<string, unknown>;
|
|
113
|
+
}
|
|
114
|
+
export interface TunnelInfo {
|
|
115
|
+
url(): string | null;
|
|
116
|
+
close(): Promise<void>;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=paymongo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paymongo.d.ts","sourceRoot":"","sources":["../../src/types/paymongo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paymongo.js","sourceRoot":"","sources":["../../src/types/paymongo.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface CacheOptions {
|
|
2
|
+
ttl?: number;
|
|
3
|
+
maxSize?: number;
|
|
4
|
+
}
|
|
5
|
+
export declare class Cache {
|
|
6
|
+
private cacheDir;
|
|
7
|
+
private options;
|
|
8
|
+
constructor(options?: CacheOptions);
|
|
9
|
+
private getCacheKey;
|
|
10
|
+
private getCachePath;
|
|
11
|
+
private isExpired;
|
|
12
|
+
private getCacheSize;
|
|
13
|
+
private cleanup;
|
|
14
|
+
get<T>(key: string): Promise<T | null>;
|
|
15
|
+
set<T>(key: string, data: T): Promise<void>;
|
|
16
|
+
clear(): Promise<void>;
|
|
17
|
+
invalidate(key: string): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
export default Cache;
|
|
20
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAyB;gBAE5B,OAAO,GAAE,YAAiB;IAetC,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,OAAO;IAwBT,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAiBtC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAW7C;AAED,eAAe,KAAK,CAAC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.Cache = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const crypto = __importStar(require("crypto"));
|
|
40
|
+
class Cache {
|
|
41
|
+
constructor(options = {}) {
|
|
42
|
+
this.options = {
|
|
43
|
+
ttl: options.ttl || 5 * 60 * 1000, // 5 minutes default
|
|
44
|
+
maxSize: options.maxSize || 10, // 10MB default
|
|
45
|
+
};
|
|
46
|
+
// Create cache directory in user's home
|
|
47
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || '/tmp';
|
|
48
|
+
this.cacheDir = path.join(homeDir, '.paymongo-cli', 'cache');
|
|
49
|
+
if (!fs.existsSync(this.cacheDir)) {
|
|
50
|
+
fs.mkdirSync(this.cacheDir, { recursive: true });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
getCacheKey(key) {
|
|
54
|
+
return crypto.createHash('md5').update(key).digest('hex');
|
|
55
|
+
}
|
|
56
|
+
getCachePath(key) {
|
|
57
|
+
return path.join(this.cacheDir, this.getCacheKey(key) + '.json');
|
|
58
|
+
}
|
|
59
|
+
isExpired(filePath) {
|
|
60
|
+
try {
|
|
61
|
+
const stats = fs.statSync(filePath);
|
|
62
|
+
const age = Date.now() - stats.mtime.getTime();
|
|
63
|
+
return age > this.options.ttl;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
getCacheSize() {
|
|
70
|
+
try {
|
|
71
|
+
const files = fs.readdirSync(this.cacheDir);
|
|
72
|
+
let totalSize = 0;
|
|
73
|
+
for (const file of files) {
|
|
74
|
+
const filePath = path.join(this.cacheDir, file);
|
|
75
|
+
const stats = fs.statSync(filePath);
|
|
76
|
+
totalSize += stats.size;
|
|
77
|
+
}
|
|
78
|
+
return totalSize / (1024 * 1024); // MB
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return 0;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
cleanup() {
|
|
85
|
+
try {
|
|
86
|
+
const files = fs
|
|
87
|
+
.readdirSync(this.cacheDir)
|
|
88
|
+
.map((file) => ({
|
|
89
|
+
name: file,
|
|
90
|
+
path: path.join(this.cacheDir, file),
|
|
91
|
+
stats: fs.statSync(path.join(this.cacheDir, file)),
|
|
92
|
+
}))
|
|
93
|
+
.sort((a, b) => a.stats.mtime.getTime() - b.stats.mtime.getTime());
|
|
94
|
+
// Remove oldest files if cache is too large
|
|
95
|
+
let currentSize = this.getCacheSize();
|
|
96
|
+
for (const file of files) {
|
|
97
|
+
if (currentSize <= this.options.maxSize * 0.8) {
|
|
98
|
+
break;
|
|
99
|
+
} // Keep 80% of max size
|
|
100
|
+
fs.unlinkSync(file.path);
|
|
101
|
+
currentSize -= file.stats.size / (1024 * 1024);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Ignore cleanup errors
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async get(key) {
|
|
109
|
+
const cachePath = this.getCachePath(key);
|
|
110
|
+
try {
|
|
111
|
+
if (!fs.existsSync(cachePath) || this.isExpired(cachePath)) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
const data = fs.readFileSync(cachePath, 'utf-8');
|
|
115
|
+
const cached = JSON.parse(data);
|
|
116
|
+
return cached.data;
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async set(key, data) {
|
|
123
|
+
const cachePath = this.getCachePath(key);
|
|
124
|
+
try {
|
|
125
|
+
const cacheData = {
|
|
126
|
+
data,
|
|
127
|
+
timestamp: Date.now(),
|
|
128
|
+
};
|
|
129
|
+
fs.writeFileSync(cachePath, JSON.stringify(cacheData));
|
|
130
|
+
// Cleanup if cache is getting too large
|
|
131
|
+
if (this.getCacheSize() > this.options.maxSize) {
|
|
132
|
+
this.cleanup();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// Ignore cache write errors
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async clear() {
|
|
140
|
+
try {
|
|
141
|
+
const files = fs.readdirSync(this.cacheDir);
|
|
142
|
+
for (const file of files) {
|
|
143
|
+
fs.unlinkSync(path.join(this.cacheDir, file));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// Ignore clear errors
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async invalidate(key) {
|
|
151
|
+
const cachePath = this.getCachePath(key);
|
|
152
|
+
try {
|
|
153
|
+
if (fs.existsSync(cachePath)) {
|
|
154
|
+
fs.unlinkSync(cachePath);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Ignore delete errors
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
exports.Cache = Cache;
|
|
163
|
+
exports.default = Cache;
|
|
164
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare const PAYMONGO_API_BASE = "https://api.paymongo.com";
|
|
2
|
+
export declare const PAYMONGO_API_VERSION = "v1";
|
|
3
|
+
export declare const WEBHOOK_EVENTS: readonly ["payment.paid", "payment.failed", "payment.refunded", "source.chargeable", "checkout_session.payment.paid", "qrph.expired"];
|
|
4
|
+
export declare const ENVIRONMENTS: readonly ["test", "live"];
|
|
5
|
+
export declare const CONFIG_FILE_NAME = ".paymongo";
|
|
6
|
+
export declare const ENV_FILE_NAME = ".env";
|
|
7
|
+
export declare const CLI_NAME = "paymongo";
|
|
8
|
+
export declare const CLI_VERSION = "1.0.0";
|
|
9
|
+
export declare const REQUEST_TIMEOUT = 30000;
|
|
10
|
+
export declare const MAX_RETRIES = 3;
|
|
11
|
+
export declare const RETRY_DELAY = 1000;
|
|
12
|
+
export declare const DEFAULT_DEV_PORT = 3000;
|
|
13
|
+
export declare const DEFAULT_WEBHOOK_PATH = "/webhook";
|
|
14
|
+
export declare const LOG_LEVELS: readonly ["error", "warn", "info", "debug"];
|
|
15
|
+
export declare const ERROR_MESSAGES: {
|
|
16
|
+
readonly INVALID_API_KEY: "Invalid API key format";
|
|
17
|
+
readonly INVALID_WEBHOOK_URL: "Invalid webhook URL. Must be HTTPS or localhost";
|
|
18
|
+
readonly CONFIG_NOT_FOUND: "Configuration file not found. Run \"paymongo init\" first";
|
|
19
|
+
readonly API_KEY_NOT_FOUND: "API key not found. Run \"paymongo login\" to set it up";
|
|
20
|
+
readonly NETWORK_ERROR: "Network error. Please check your internet connection";
|
|
21
|
+
readonly UNAUTHORIZED: "Unauthorized. Please check your API keys";
|
|
22
|
+
readonly RATE_LIMITED: "Rate limited. Please try again later";
|
|
23
|
+
readonly SERVER_ERROR: "Server error. Please try again later";
|
|
24
|
+
};
|
|
25
|
+
export declare const SUCCESS_MESSAGES: {
|
|
26
|
+
readonly CONFIG_SAVED: "Configuration saved successfully";
|
|
27
|
+
readonly WEBHOOK_CREATED: "Webhook created successfully";
|
|
28
|
+
readonly WEBHOOK_DELETED: "Webhook deleted successfully";
|
|
29
|
+
readonly LOGIN_SUCCESSFUL: "Login successful";
|
|
30
|
+
readonly DEV_SERVER_STARTED: "Development server started";
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,iBAAiB,6BAA6B,CAAC;AAC5D,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAGzC,eAAO,MAAM,cAAc,uIAOjB,CAAC;AAGX,eAAO,MAAM,YAAY,2BAA4B,CAAC;AAGtD,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAC5C,eAAO,MAAM,aAAa,SAAS,CAAC;AAGpC,eAAO,MAAM,QAAQ,aAAa,CAAC;AACnC,eAAO,MAAM,WAAW,UAAU,CAAC;AAGnC,eAAO,MAAM,eAAe,QAAQ,CAAC;AACrC,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,WAAW,OAAO,CAAC;AAGhC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,oBAAoB,aAAa,CAAC;AAG/C,eAAO,MAAM,UAAU,6CAA8C,CAAC;AAGtE,eAAO,MAAM,cAAc;;;;;;;;;CASjB,CAAC;AAGX,eAAO,MAAM,gBAAgB;;;;;;CAMnB,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SUCCESS_MESSAGES = exports.ERROR_MESSAGES = exports.LOG_LEVELS = exports.DEFAULT_WEBHOOK_PATH = exports.DEFAULT_DEV_PORT = exports.RETRY_DELAY = exports.MAX_RETRIES = exports.REQUEST_TIMEOUT = exports.CLI_VERSION = exports.CLI_NAME = exports.ENV_FILE_NAME = exports.CONFIG_FILE_NAME = exports.ENVIRONMENTS = exports.WEBHOOK_EVENTS = exports.PAYMONGO_API_VERSION = exports.PAYMONGO_API_BASE = void 0;
|
|
4
|
+
// API Constants
|
|
5
|
+
exports.PAYMONGO_API_BASE = 'https://api.paymongo.com';
|
|
6
|
+
exports.PAYMONGO_API_VERSION = 'v1';
|
|
7
|
+
// Webhook Events
|
|
8
|
+
exports.WEBHOOK_EVENTS = [
|
|
9
|
+
'payment.paid',
|
|
10
|
+
'payment.failed',
|
|
11
|
+
'payment.refunded',
|
|
12
|
+
'source.chargeable',
|
|
13
|
+
'checkout_session.payment.paid',
|
|
14
|
+
'qrph.expired',
|
|
15
|
+
];
|
|
16
|
+
// Environment Constants
|
|
17
|
+
exports.ENVIRONMENTS = ['test', 'live'];
|
|
18
|
+
// File Paths
|
|
19
|
+
exports.CONFIG_FILE_NAME = '.paymongo';
|
|
20
|
+
exports.ENV_FILE_NAME = '.env';
|
|
21
|
+
// CLI Constants
|
|
22
|
+
exports.CLI_NAME = 'paymongo';
|
|
23
|
+
exports.CLI_VERSION = '1.0.0';
|
|
24
|
+
// HTTP Constants
|
|
25
|
+
exports.REQUEST_TIMEOUT = 30000; // 30 seconds
|
|
26
|
+
exports.MAX_RETRIES = 3;
|
|
27
|
+
exports.RETRY_DELAY = 1000; // 1 second
|
|
28
|
+
// Development Constants
|
|
29
|
+
exports.DEFAULT_DEV_PORT = 3000;
|
|
30
|
+
exports.DEFAULT_WEBHOOK_PATH = '/webhook';
|
|
31
|
+
// Logging Constants
|
|
32
|
+
exports.LOG_LEVELS = ['error', 'warn', 'info', 'debug'];
|
|
33
|
+
// Error Messages
|
|
34
|
+
exports.ERROR_MESSAGES = {
|
|
35
|
+
INVALID_API_KEY: 'Invalid API key format',
|
|
36
|
+
INVALID_WEBHOOK_URL: 'Invalid webhook URL. Must be HTTPS or localhost',
|
|
37
|
+
CONFIG_NOT_FOUND: 'Configuration file not found. Run "paymongo init" first',
|
|
38
|
+
API_KEY_NOT_FOUND: 'API key not found. Run "paymongo login" to set it up',
|
|
39
|
+
NETWORK_ERROR: 'Network error. Please check your internet connection',
|
|
40
|
+
UNAUTHORIZED: 'Unauthorized. Please check your API keys',
|
|
41
|
+
RATE_LIMITED: 'Rate limited. Please try again later',
|
|
42
|
+
SERVER_ERROR: 'Server error. Please try again later',
|
|
43
|
+
};
|
|
44
|
+
// Success Messages
|
|
45
|
+
exports.SUCCESS_MESSAGES = {
|
|
46
|
+
CONFIG_SAVED: 'Configuration saved successfully',
|
|
47
|
+
WEBHOOK_CREATED: 'Webhook created successfully',
|
|
48
|
+
WEBHOOK_DELETED: 'Webhook deleted successfully',
|
|
49
|
+
LOGIN_SUCCESSFUL: 'Login successful',
|
|
50
|
+
DEV_SERVER_STARTED: 'Development server started',
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":";;;AAAA,gBAAgB;AACH,QAAA,iBAAiB,GAAG,0BAA0B,CAAC;AAC/C,QAAA,oBAAoB,GAAG,IAAI,CAAC;AAEzC,iBAAiB;AACJ,QAAA,cAAc,GAAG;IAC5B,cAAc;IACd,gBAAgB;IAChB,kBAAkB;IAClB,mBAAmB;IACnB,+BAA+B;IAC/B,cAAc;CACN,CAAC;AAEX,wBAAwB;AACX,QAAA,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,CAAU,CAAC;AAEtD,aAAa;AACA,QAAA,gBAAgB,GAAG,WAAW,CAAC;AAC/B,QAAA,aAAa,GAAG,MAAM,CAAC;AAEpC,gBAAgB;AACH,QAAA,QAAQ,GAAG,UAAU,CAAC;AACtB,QAAA,WAAW,GAAG,OAAO,CAAC;AAEnC,iBAAiB;AACJ,QAAA,eAAe,GAAG,KAAK,CAAC,CAAC,aAAa;AACtC,QAAA,WAAW,GAAG,CAAC,CAAC;AAChB,QAAA,WAAW,GAAG,IAAI,CAAC,CAAC,WAAW;AAE5C,wBAAwB;AACX,QAAA,gBAAgB,GAAG,IAAI,CAAC;AACxB,QAAA,oBAAoB,GAAG,UAAU,CAAC;AAE/C,oBAAoB;AACP,QAAA,UAAU,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAEtE,iBAAiB;AACJ,QAAA,cAAc,GAAG;IAC5B,eAAe,EAAE,wBAAwB;IACzC,mBAAmB,EAAE,iDAAiD;IACtE,gBAAgB,EAAE,yDAAyD;IAC3E,iBAAiB,EAAE,sDAAsD;IACzE,aAAa,EAAE,sDAAsD;IACrE,YAAY,EAAE,0CAA0C;IACxD,YAAY,EAAE,sCAAsC;IACpD,YAAY,EAAE,sCAAsC;CAC5C,CAAC;AAEX,mBAAmB;AACN,QAAA,gBAAgB,GAAG;IAC9B,YAAY,EAAE,kCAAkC;IAChD,eAAe,EAAE,8BAA8B;IAC/C,eAAe,EAAE,8BAA8B;IAC/C,gBAAgB,EAAE,kBAAkB;IACpC,kBAAkB,EAAE,4BAA4B;CACxC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare class PayMongoError extends Error {
|
|
2
|
+
code?: string | undefined;
|
|
3
|
+
statusCode?: number | undefined;
|
|
4
|
+
constructor(message: string, code?: string | undefined, statusCode?: number | undefined);
|
|
5
|
+
}
|
|
6
|
+
export declare class ConfigError extends Error {
|
|
7
|
+
configPath?: string | undefined;
|
|
8
|
+
constructor(message: string, configPath?: string | undefined);
|
|
9
|
+
}
|
|
10
|
+
export declare class ApiKeyError extends Error {
|
|
11
|
+
keyType?: "public" | "secret" | undefined;
|
|
12
|
+
constructor(message: string, keyType?: "public" | "secret" | undefined);
|
|
13
|
+
}
|
|
14
|
+
export declare class NetworkError extends Error {
|
|
15
|
+
originalError?: Error | undefined;
|
|
16
|
+
constructor(message: string, originalError?: Error | undefined);
|
|
17
|
+
}
|
|
18
|
+
export declare class ValidationError extends Error {
|
|
19
|
+
field?: string | undefined;
|
|
20
|
+
constructor(message: string, field?: string | undefined);
|
|
21
|
+
}
|
|
22
|
+
export declare class WebhookError extends Error {
|
|
23
|
+
webhookId?: string | undefined;
|
|
24
|
+
constructor(message: string, webhookId?: string | undefined);
|
|
25
|
+
}
|
|
26
|
+
export interface RetryOptions {
|
|
27
|
+
maxRetries?: number;
|
|
28
|
+
delayMs?: number;
|
|
29
|
+
backoffMultiplier?: number;
|
|
30
|
+
retryCondition?: (error: Error) => boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare function withRetry<T>(operation: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
33
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAc,SAAQ,KAAK;IAG7B,IAAI,CAAC,EAAE,MAAM;IACb,UAAU,CAAC,EAAE,MAAM;gBAF1B,OAAO,EAAE,MAAM,EACR,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,UAAU,CAAC,EAAE,MAAM,YAAA;CAK7B;AAED,qBAAa,WAAY,SAAQ,KAAK;IACA,UAAU,CAAC,EAAE,MAAM;gBAA3C,OAAO,EAAE,MAAM,EAAS,UAAU,CAAC,EAAE,MAAM,YAAA;CAIxD;AAED,qBAAa,WAAY,SAAQ,KAAK;IACA,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ;gBAArD,OAAO,EAAE,MAAM,EAAS,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,YAAA;CAIlE;AAED,qBAAa,YAAa,SAAQ,KAAK;IACD,aAAa,CAAC,EAAE,KAAK;gBAA7C,OAAO,EAAE,MAAM,EAAS,aAAa,CAAC,EAAE,KAAK,YAAA;CAI1D;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACJ,KAAK,CAAC,EAAE,MAAM;gBAAtC,OAAO,EAAE,MAAM,EAAS,KAAK,CAAC,EAAE,MAAM,YAAA;CAInD;AAED,qBAAa,YAAa,SAAQ,KAAK;IACD,SAAS,CAAC,EAAE,MAAM;gBAA1C,OAAO,EAAE,MAAM,EAAS,SAAS,CAAC,EAAE,MAAM,YAAA;CAIvD;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC;CAC5C;AAED,wBAAsB,SAAS,CAAC,CAAC,EAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CAiCZ"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebhookError = exports.ValidationError = exports.NetworkError = exports.ApiKeyError = exports.ConfigError = exports.PayMongoError = void 0;
|
|
4
|
+
exports.withRetry = withRetry;
|
|
5
|
+
class PayMongoError extends Error {
|
|
6
|
+
constructor(message, code, statusCode) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.statusCode = statusCode;
|
|
10
|
+
this.name = 'PayMongoError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.PayMongoError = PayMongoError;
|
|
14
|
+
class ConfigError extends Error {
|
|
15
|
+
constructor(message, configPath) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.configPath = configPath;
|
|
18
|
+
this.name = 'ConfigError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.ConfigError = ConfigError;
|
|
22
|
+
class ApiKeyError extends Error {
|
|
23
|
+
constructor(message, keyType) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.keyType = keyType;
|
|
26
|
+
this.name = 'ApiKeyError';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.ApiKeyError = ApiKeyError;
|
|
30
|
+
class NetworkError extends Error {
|
|
31
|
+
constructor(message, originalError) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.originalError = originalError;
|
|
34
|
+
this.name = 'NetworkError';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.NetworkError = NetworkError;
|
|
38
|
+
class ValidationError extends Error {
|
|
39
|
+
constructor(message, field) {
|
|
40
|
+
super(message);
|
|
41
|
+
this.field = field;
|
|
42
|
+
this.name = 'ValidationError';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.ValidationError = ValidationError;
|
|
46
|
+
class WebhookError extends Error {
|
|
47
|
+
constructor(message, webhookId) {
|
|
48
|
+
super(message);
|
|
49
|
+
this.webhookId = webhookId;
|
|
50
|
+
this.name = 'WebhookError';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.WebhookError = WebhookError;
|
|
54
|
+
async function withRetry(operation, options = {}) {
|
|
55
|
+
const { maxRetries = 3, delayMs = 1000, backoffMultiplier = 2, retryCondition = (error) => {
|
|
56
|
+
// Default: retry on network errors and 5xx status codes
|
|
57
|
+
return error.name === 'NetworkError' ||
|
|
58
|
+
(error.message.includes('Network error') && !error.message.includes('401')) ||
|
|
59
|
+
(error.message.includes('timeout') || error.message.includes('ECONNRESET'));
|
|
60
|
+
} } = options;
|
|
61
|
+
let lastError;
|
|
62
|
+
let currentDelay = delayMs;
|
|
63
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
64
|
+
try {
|
|
65
|
+
return await operation();
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
lastError = error;
|
|
69
|
+
if (attempt === maxRetries || !retryCondition(lastError)) {
|
|
70
|
+
throw lastError;
|
|
71
|
+
}
|
|
72
|
+
console.log(`Attempt ${attempt + 1} failed, retrying in ${currentDelay}ms...`);
|
|
73
|
+
await new Promise(resolve => setTimeout(resolve, currentDelay));
|
|
74
|
+
currentDelay *= backoffMultiplier;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
throw lastError;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface LoggerOptions {
|
|
2
|
+
level?: 'error' | 'warn' | 'info' | 'debug';
|
|
3
|
+
file?: string;
|
|
4
|
+
}
|
|
5
|
+
declare class Logger {
|
|
6
|
+
private logger;
|
|
7
|
+
constructor(options?: LoggerOptions);
|
|
8
|
+
error(message: string, ...meta: any[]): void;
|
|
9
|
+
warn(message: string, ...meta: any[]): void;
|
|
10
|
+
info(message: string, ...meta: any[]): void;
|
|
11
|
+
debug(message: string, ...meta: any[]): void;
|
|
12
|
+
success(message: string): void;
|
|
13
|
+
failure(message: string): void;
|
|
14
|
+
warning(message: string): void;
|
|
15
|
+
}
|
|
16
|
+
export default Logger;
|
|
17
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,cAAM,MAAM;IACV,OAAO,CAAC,MAAM,CAAiB;gBAEnB,OAAO,GAAE,aAAkB;IAgCvC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI3C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAK5C,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAG/B;AAED,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const winston_1 = __importDefault(require("winston"));
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
class Logger {
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
const { level = 'info', file } = options;
|
|
11
|
+
const transports = [
|
|
12
|
+
new winston_1.default.transports.Console({
|
|
13
|
+
level,
|
|
14
|
+
format: winston_1.default.format.combine(winston_1.default.format.colorize(), winston_1.default.format.simple()),
|
|
15
|
+
}),
|
|
16
|
+
];
|
|
17
|
+
if (file) {
|
|
18
|
+
transports.push(new winston_1.default.transports.File({
|
|
19
|
+
filename: file,
|
|
20
|
+
level,
|
|
21
|
+
format: winston_1.default.format.combine(winston_1.default.format.timestamp(), winston_1.default.format.json()),
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
this.logger = winston_1.default.createLogger({
|
|
25
|
+
level,
|
|
26
|
+
transports,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
error(message, ...meta) {
|
|
30
|
+
this.logger.error(message, ...meta);
|
|
31
|
+
}
|
|
32
|
+
warn(message, ...meta) {
|
|
33
|
+
this.logger.warn(message, ...meta);
|
|
34
|
+
}
|
|
35
|
+
info(message, ...meta) {
|
|
36
|
+
this.logger.info(message, ...meta);
|
|
37
|
+
}
|
|
38
|
+
debug(message, ...meta) {
|
|
39
|
+
this.logger.debug(message, ...meta);
|
|
40
|
+
}
|
|
41
|
+
// Convenience methods with chalk colors
|
|
42
|
+
success(message) {
|
|
43
|
+
console.log(chalk_1.default.green('✓'), message);
|
|
44
|
+
}
|
|
45
|
+
failure(message) {
|
|
46
|
+
console.log(chalk_1.default.red('✗'), message);
|
|
47
|
+
}
|
|
48
|
+
warning(message) {
|
|
49
|
+
console.log(chalk_1.default.yellow('⚠'), message);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.default = Logger;
|
|
53
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;;;AAAA,sDAA8B;AAC9B,kDAA0B;AAO1B,MAAM,MAAM;IAGV,YAAY,UAAyB,EAAE;QACrC,MAAM,EAAE,KAAK,GAAG,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QAEzC,MAAM,UAAU,GAAwB;YACtC,IAAI,iBAAO,CAAC,UAAU,CAAC,OAAO,CAAC;gBAC7B,KAAK;gBACL,MAAM,EAAE,iBAAO,CAAC,MAAM,CAAC,OAAO,CAC5B,iBAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EACzB,iBAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CACxB;aACF,CAAC;SACH,CAAC;QAEF,IAAI,IAAI,EAAE,CAAC;YACT,UAAU,CAAC,IAAI,CACb,IAAI,iBAAO,CAAC,UAAU,CAAC,IAAI,CAAC;gBAC1B,QAAQ,EAAE,IAAI;gBACd,KAAK;gBACL,MAAM,EAAE,iBAAO,CAAC,MAAM,CAAC,OAAO,CAC5B,iBAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAC1B,iBAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CACtB;aACF,CAAC,CACH,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,iBAAO,CAAC,YAAY,CAAC;YACjC,KAAK;YACL,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,wCAAwC;IACxC,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,kBAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface SpinnerOptions {
|
|
2
|
+
text?: string;
|
|
3
|
+
color?: 'black' | 'red' | 'green' | 'yellow' | 'blue' | 'magenta' | 'cyan' | 'white' | 'gray';
|
|
4
|
+
}
|
|
5
|
+
declare class Spinner {
|
|
6
|
+
private spinner;
|
|
7
|
+
constructor(options?: SpinnerOptions);
|
|
8
|
+
start(text?: string): void;
|
|
9
|
+
stop(): void;
|
|
10
|
+
succeed(text?: string): void;
|
|
11
|
+
fail(text?: string): void;
|
|
12
|
+
warn(text?: string): void;
|
|
13
|
+
info(text?: string): void;
|
|
14
|
+
update(text: string): void;
|
|
15
|
+
}
|
|
16
|
+
export default Spinner;
|
|
17
|
+
//# sourceMappingURL=spinner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/utils/spinner.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;CAC/F;AAED,cAAM,OAAO;IACX,OAAO,CAAC,OAAO,CAAM;gBAET,OAAO,GAAE,cAAmB;IASxC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAO1B,IAAI,IAAI,IAAI;IAIZ,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAO5B,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAOzB,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAOzB,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAOzB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAG3B;AAED,eAAe,OAAO,CAAC"}
|