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,151 @@
|
|
|
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
|
+
exports.ApiClient = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const REQUEST_TIMEOUT = 30000;
|
|
9
|
+
const errors_1 = require("../../utils/errors");
|
|
10
|
+
const cache_1 = __importDefault(require("../../utils/cache"));
|
|
11
|
+
class ApiClient {
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.config = options.config;
|
|
14
|
+
const timeout = options.timeout || REQUEST_TIMEOUT;
|
|
15
|
+
this.client = axios_1.default.create({
|
|
16
|
+
baseURL: `https://api.paymongo.com/v1`,
|
|
17
|
+
timeout,
|
|
18
|
+
headers: {
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
'User-Agent': 'paymongo-cli/1.0.0',
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
this.cache = new cache_1.default({ ttl: 2 * 60 * 1000 }); // 2 minute cache for API responses
|
|
24
|
+
this.setupInterceptors();
|
|
25
|
+
}
|
|
26
|
+
setupInterceptors() {
|
|
27
|
+
// Request interceptor to add authentication
|
|
28
|
+
this.client.interceptors.request.use((config) => {
|
|
29
|
+
const env = this.config.environment;
|
|
30
|
+
const secretKey = this.config.apiKeys[env]?.secret;
|
|
31
|
+
if (!secretKey) {
|
|
32
|
+
throw new Error('Secret API key not found');
|
|
33
|
+
}
|
|
34
|
+
config.auth = {
|
|
35
|
+
username: secretKey,
|
|
36
|
+
password: '', // PayMongo uses username-only auth
|
|
37
|
+
};
|
|
38
|
+
return config;
|
|
39
|
+
});
|
|
40
|
+
// Response interceptor for error handling
|
|
41
|
+
this.client.interceptors.response.use((response) => response, async (error) => {
|
|
42
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
43
|
+
const status = error.response?.status;
|
|
44
|
+
if (!error.response) {
|
|
45
|
+
throw new errors_1.NetworkError(`Network error - no response received: ${error.message}`, error);
|
|
46
|
+
}
|
|
47
|
+
if (status === 401) {
|
|
48
|
+
throw new Error('Invalid API key or unauthorized');
|
|
49
|
+
}
|
|
50
|
+
throw new Error(error.message);
|
|
51
|
+
}
|
|
52
|
+
throw new Error('Unknown network error');
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
async validateApiKey() {
|
|
56
|
+
try {
|
|
57
|
+
await (0, errors_1.withRetry)(() => this.client.get('/webhooks'));
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Webhook methods
|
|
65
|
+
async createWebhook(url, events) {
|
|
66
|
+
const result = await (0, errors_1.withRetry)(() => this.client
|
|
67
|
+
.post('/webhooks', {
|
|
68
|
+
data: {
|
|
69
|
+
attributes: {
|
|
70
|
+
url,
|
|
71
|
+
events,
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
})
|
|
75
|
+
.then((response) => response.data.data));
|
|
76
|
+
// Invalidate webhook list cache when creating new webhook
|
|
77
|
+
await this.cache.invalidate(`webhooks_${this.config.environment}`);
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
async listWebhooks() {
|
|
81
|
+
const cacheKey = `webhooks_${this.config.environment}`;
|
|
82
|
+
// Try cache first for list operations
|
|
83
|
+
const cached = await this.cache.get(cacheKey);
|
|
84
|
+
if (cached) {
|
|
85
|
+
return cached;
|
|
86
|
+
}
|
|
87
|
+
const result = await (0, errors_1.withRetry)(() => this.client.get('/webhooks').then((response) => response.data.data));
|
|
88
|
+
// Cache the result
|
|
89
|
+
await this.cache.set(cacheKey, result);
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
async getWebhook(id) {
|
|
93
|
+
const cacheKey = `webhook_${id}`;
|
|
94
|
+
// Try cache first
|
|
95
|
+
const cached = await this.cache.get(cacheKey);
|
|
96
|
+
if (cached) {
|
|
97
|
+
return cached;
|
|
98
|
+
}
|
|
99
|
+
const result = await (0, errors_1.withRetry)(() => this.client.get(`/webhooks/${id}`).then((response) => response.data.data));
|
|
100
|
+
// Cache the result
|
|
101
|
+
await this.cache.set(cacheKey, result);
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
async updateWebhook(id, updates) {
|
|
105
|
+
// Invalidate cache when updating
|
|
106
|
+
await this.cache.invalidate(`webhook_${id}`);
|
|
107
|
+
await this.cache.invalidate(`webhooks_${this.config.environment}`);
|
|
108
|
+
return (0, errors_1.withRetry)(() => this.client
|
|
109
|
+
.put(`/webhooks/${id}`, {
|
|
110
|
+
data: {
|
|
111
|
+
attributes: updates,
|
|
112
|
+
},
|
|
113
|
+
})
|
|
114
|
+
.then((response) => response.data.data));
|
|
115
|
+
}
|
|
116
|
+
async deleteWebhook(id) {
|
|
117
|
+
// Invalidate cache when deleting
|
|
118
|
+
await this.cache.invalidate(`webhook_${id}`);
|
|
119
|
+
await this.cache.invalidate(`webhooks_${this.config.environment}`);
|
|
120
|
+
return (0, errors_1.withRetry)(() => this.client.delete(`/webhooks/${id}`));
|
|
121
|
+
}
|
|
122
|
+
// Payment methods (for validation and testing)
|
|
123
|
+
async getPayment(id) {
|
|
124
|
+
return (0, errors_1.withRetry)(() => this.client.get(`/payments/${id}`).then((response) => response.data.data));
|
|
125
|
+
}
|
|
126
|
+
async listPayments(limit = 10) {
|
|
127
|
+
const result = await (0, errors_1.withRetry)(() => this.client
|
|
128
|
+
.get('/payments', {
|
|
129
|
+
params: { limit },
|
|
130
|
+
})
|
|
131
|
+
.then((response) => response.data.data));
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
async createPaymentIntent(amount, currency = 'PHP', description, paymentMethods = ['card', 'gcash', 'paymaya']) {
|
|
135
|
+
return (0, errors_1.withRetry)(() => this.client
|
|
136
|
+
.post('/payment_intents', {
|
|
137
|
+
data: {
|
|
138
|
+
attributes: {
|
|
139
|
+
amount,
|
|
140
|
+
payment_method_allowed: paymentMethods,
|
|
141
|
+
currency,
|
|
142
|
+
description,
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
})
|
|
146
|
+
.then((response) => response.data.data));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.ApiClient = ApiClient;
|
|
150
|
+
exports.default = ApiClient;
|
|
151
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/services/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ConfigManagerOptions, PayMongoConfig } from '../../types/paymongo';
|
|
2
|
+
export declare class ConfigManager {
|
|
3
|
+
private explorer;
|
|
4
|
+
private configPath;
|
|
5
|
+
private configCache;
|
|
6
|
+
constructor(options?: ConfigManagerOptions);
|
|
7
|
+
load(): Promise<PayMongoConfig | null>;
|
|
8
|
+
save(config: PayMongoConfig): Promise<void>;
|
|
9
|
+
exists(): Promise<boolean>;
|
|
10
|
+
delete(): Promise<void>;
|
|
11
|
+
getDefaultConfig(): PayMongoConfig;
|
|
12
|
+
private validateConfig;
|
|
13
|
+
mergeConfig(base: PayMongoConfig, updates: Partial<PayMongoConfig>): PayMongoConfig;
|
|
14
|
+
}
|
|
15
|
+
export default ConfigManager;
|
|
16
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/services/config/manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAK5E,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAqE;gBAE5E,OAAO,GAAE,oBAAyB;IAIxC,IAAI,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAoDtC,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B3C,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAS1B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAa7B,gBAAgB,IAAI,cAAc;IAmBlC,OAAO,CAAC,cAAc;IA8CtB,WAAW,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc;CAsBpF;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,211 @@
|
|
|
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.ConfigManager = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const cosmiconfig_1 = require("cosmiconfig");
|
|
40
|
+
const errors_1 = require("../../utils/errors");
|
|
41
|
+
const CONFIG_FILE_NAME = '.paymongo';
|
|
42
|
+
class ConfigManager {
|
|
43
|
+
constructor(options = {}) {
|
|
44
|
+
this.explorer = (0, cosmiconfig_1.cosmiconfig)('paymongo');
|
|
45
|
+
this.configCache = new Map();
|
|
46
|
+
this.configPath = options.configPath || path.join(process.cwd(), CONFIG_FILE_NAME);
|
|
47
|
+
}
|
|
48
|
+
async load() {
|
|
49
|
+
try {
|
|
50
|
+
// Check if we have a cached version
|
|
51
|
+
const cached = this.configCache.get(this.configPath);
|
|
52
|
+
if (cached) {
|
|
53
|
+
// Check if file has been modified since caching
|
|
54
|
+
try {
|
|
55
|
+
const stats = fs.statSync(this.configPath);
|
|
56
|
+
if (stats.mtime.getTime() === cached.mtime) {
|
|
57
|
+
return cached.config;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// File might not exist, continue with loading
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const result = await this.explorer.load(this.configPath);
|
|
65
|
+
const config = result?.config;
|
|
66
|
+
if (!config) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
// Validate required fields
|
|
70
|
+
this.validateConfig(config);
|
|
71
|
+
// Cache the config with file modification time
|
|
72
|
+
try {
|
|
73
|
+
const stats = fs.statSync(this.configPath);
|
|
74
|
+
this.configCache.set(this.configPath, {
|
|
75
|
+
config,
|
|
76
|
+
mtime: stats.mtime.getTime(),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// If we can't get stats, just don't cache
|
|
81
|
+
}
|
|
82
|
+
return config;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (error.code === 'ENOENT') {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
// If it's already a ConfigError or ValidationError, re-throw
|
|
89
|
+
if (error instanceof errors_1.ConfigError || error instanceof errors_1.ValidationError) {
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
throw new errors_1.ConfigError(`Failed to load config: ${error.message}`, this.configPath);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async save(config) {
|
|
96
|
+
try {
|
|
97
|
+
// Ensure directory exists
|
|
98
|
+
const dir = path.dirname(this.configPath);
|
|
99
|
+
if (!fs.existsSync(dir)) {
|
|
100
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
101
|
+
}
|
|
102
|
+
// Write config file
|
|
103
|
+
const configContent = JSON.stringify(config, null, 2);
|
|
104
|
+
fs.writeFileSync(this.configPath, configContent, 'utf-8');
|
|
105
|
+
// Update cache with new modification time
|
|
106
|
+
try {
|
|
107
|
+
const stats = fs.statSync(this.configPath);
|
|
108
|
+
this.configCache.set(this.configPath, {
|
|
109
|
+
config,
|
|
110
|
+
mtime: stats.mtime.getTime(),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// If we can't get stats, clear cache
|
|
115
|
+
this.configCache.delete(this.configPath);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
throw new errors_1.ConfigError(`Failed to save config: ${error.message}`, this.configPath);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async exists() {
|
|
123
|
+
try {
|
|
124
|
+
await fs.promises.access(this.configPath);
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async delete() {
|
|
132
|
+
try {
|
|
133
|
+
if (await this.exists()) {
|
|
134
|
+
fs.unlinkSync(this.configPath);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
throw new errors_1.ConfigError(`Failed to delete config: ${error.message}`, this.configPath);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
getDefaultConfig() {
|
|
142
|
+
return {
|
|
143
|
+
version: '1.0',
|
|
144
|
+
projectName: 'PayMongo Project',
|
|
145
|
+
environment: 'test',
|
|
146
|
+
apiKeys: {},
|
|
147
|
+
webhooks: {
|
|
148
|
+
url: `http://localhost:3000/webhook`,
|
|
149
|
+
events: ['payment.paid', 'payment.failed'],
|
|
150
|
+
},
|
|
151
|
+
webhookSecrets: {},
|
|
152
|
+
dev: {
|
|
153
|
+
port: 3000,
|
|
154
|
+
autoRegisterWebhook: true,
|
|
155
|
+
verifyWebhookSignatures: false, // Default to false for development ease
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
validateConfig(config) {
|
|
160
|
+
// Check required fields
|
|
161
|
+
if (!config.version) {
|
|
162
|
+
throw new errors_1.ValidationError('Config file is missing required "version" field', 'version');
|
|
163
|
+
}
|
|
164
|
+
if (!config.projectName) {
|
|
165
|
+
throw new errors_1.ValidationError('Config file is missing required "projectName" field', 'projectName');
|
|
166
|
+
}
|
|
167
|
+
if (!config.environment || !['test', 'live'].includes(config.environment)) {
|
|
168
|
+
throw new errors_1.ValidationError('Config file has invalid "environment" field (must be "test" or "live")', 'environment');
|
|
169
|
+
}
|
|
170
|
+
// Check API keys structure
|
|
171
|
+
if (!config.apiKeys || typeof config.apiKeys !== 'object') {
|
|
172
|
+
throw new errors_1.ValidationError('Config file is missing or has invalid "apiKeys" field', 'apiKeys');
|
|
173
|
+
}
|
|
174
|
+
const env = config.environment;
|
|
175
|
+
if (!config.apiKeys[env]) {
|
|
176
|
+
throw new errors_1.ValidationError(`Config file is missing API keys for environment "${env}"`, `apiKeys.${env}`);
|
|
177
|
+
}
|
|
178
|
+
if (!config.apiKeys[env].secret) {
|
|
179
|
+
throw new errors_1.ValidationError(`Config file is missing secret API key for environment "${env}"`, `apiKeys.${env}.secret`);
|
|
180
|
+
}
|
|
181
|
+
// Check dev configuration
|
|
182
|
+
if (!config.dev || typeof config.dev !== 'object') {
|
|
183
|
+
throw new errors_1.ValidationError('Config file is missing or has invalid "dev" field', 'dev');
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
mergeConfig(base, updates) {
|
|
187
|
+
return {
|
|
188
|
+
...base,
|
|
189
|
+
...updates,
|
|
190
|
+
apiKeys: {
|
|
191
|
+
...base.apiKeys,
|
|
192
|
+
...updates.apiKeys,
|
|
193
|
+
},
|
|
194
|
+
webhooks: {
|
|
195
|
+
...base.webhooks,
|
|
196
|
+
...updates.webhooks,
|
|
197
|
+
},
|
|
198
|
+
webhookSecrets: {
|
|
199
|
+
...base.webhookSecrets,
|
|
200
|
+
...updates.webhookSecrets,
|
|
201
|
+
},
|
|
202
|
+
dev: {
|
|
203
|
+
...base.dev,
|
|
204
|
+
...updates.dev,
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
exports.ConfigManager = ConfigManager;
|
|
210
|
+
exports.default = ConfigManager;
|
|
211
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/services/config/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ConfigManager } from '../config/manager';
|
|
2
|
+
import { GitHubClient } from './client';
|
|
3
|
+
export interface GitHubAuthOptions {
|
|
4
|
+
config: ConfigManager;
|
|
5
|
+
}
|
|
6
|
+
export declare class GitHubAuthService {
|
|
7
|
+
private config;
|
|
8
|
+
constructor(options: GitHubAuthOptions);
|
|
9
|
+
authenticate(token?: string): Promise<GitHubClient>;
|
|
10
|
+
storeToken(token: string): Promise<void>;
|
|
11
|
+
getStoredToken(): Promise<string | undefined>;
|
|
12
|
+
promptForToken(): Promise<string>;
|
|
13
|
+
setupToken(): Promise<string>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/services/github/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAgB;gBAElB,OAAO,EAAE,iBAAiB;IAIhC,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA+BnD,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxC,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAK7C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAqBjC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;CAoBpC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
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.GitHubAuthService = void 0;
|
|
37
|
+
const client_1 = require("./client");
|
|
38
|
+
class GitHubAuthService {
|
|
39
|
+
constructor(options) {
|
|
40
|
+
this.config = options.config;
|
|
41
|
+
}
|
|
42
|
+
async authenticate(token) {
|
|
43
|
+
let githubToken = token;
|
|
44
|
+
if (!githubToken) {
|
|
45
|
+
// Try to get from config
|
|
46
|
+
const config = await this.config.load();
|
|
47
|
+
githubToken = config?.team?.githubToken;
|
|
48
|
+
}
|
|
49
|
+
if (!githubToken) {
|
|
50
|
+
throw new Error('GitHub token not found. Please provide a token or run "paymongo team sync --repo owner/repo" to set it up.');
|
|
51
|
+
}
|
|
52
|
+
const client = new client_1.GitHubClient({ token: githubToken });
|
|
53
|
+
// Validate token by making a test request
|
|
54
|
+
try {
|
|
55
|
+
await client.getRepo('octocat', 'Hello-World'); // Public repo test
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
if (error instanceof Error && error.message.includes('401')) {
|
|
59
|
+
throw new Error('Invalid GitHub token. Please check your token and try again.');
|
|
60
|
+
}
|
|
61
|
+
// If it's another error (like network), we can proceed
|
|
62
|
+
// The token might still be valid for private repos
|
|
63
|
+
}
|
|
64
|
+
return client;
|
|
65
|
+
}
|
|
66
|
+
async storeToken(token) {
|
|
67
|
+
let config = await this.config.load();
|
|
68
|
+
if (!config) {
|
|
69
|
+
config = this.config.getDefaultConfig();
|
|
70
|
+
}
|
|
71
|
+
if (!config.team) {
|
|
72
|
+
config.team = {};
|
|
73
|
+
}
|
|
74
|
+
config.team.githubToken = token;
|
|
75
|
+
await this.config.save(config);
|
|
76
|
+
}
|
|
77
|
+
async getStoredToken() {
|
|
78
|
+
const config = await this.config.load();
|
|
79
|
+
return config?.team?.githubToken;
|
|
80
|
+
}
|
|
81
|
+
async promptForToken() {
|
|
82
|
+
const inquirer = await Promise.resolve().then(() => __importStar(require('inquirer')));
|
|
83
|
+
const answers = await inquirer.default.prompt([
|
|
84
|
+
{
|
|
85
|
+
type: 'password',
|
|
86
|
+
name: 'token',
|
|
87
|
+
message: 'Enter your GitHub Personal Access Token:',
|
|
88
|
+
mask: '*',
|
|
89
|
+
validate: (input) => {
|
|
90
|
+
if (!input || input.length < 20) {
|
|
91
|
+
return 'Please enter a valid GitHub token (at least 20 characters)';
|
|
92
|
+
}
|
|
93
|
+
return true;
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
]);
|
|
97
|
+
return answers.token;
|
|
98
|
+
}
|
|
99
|
+
async setupToken() {
|
|
100
|
+
console.log('🔑 GitHub Authentication Setup');
|
|
101
|
+
console.log('=============================');
|
|
102
|
+
console.log('');
|
|
103
|
+
console.log('To use team features, you need a GitHub Personal Access Token.');
|
|
104
|
+
console.log('You can create one at: https://github.com/settings/tokens');
|
|
105
|
+
console.log('');
|
|
106
|
+
console.log('Required permissions:');
|
|
107
|
+
console.log('• repo (Full control of private repositories)');
|
|
108
|
+
console.log('• workflow (Update GitHub Action workflows)');
|
|
109
|
+
console.log('');
|
|
110
|
+
console.log('The token will be stored securely in your local configuration.');
|
|
111
|
+
console.log('');
|
|
112
|
+
const token = await this.promptForToken();
|
|
113
|
+
await this.storeToken(token);
|
|
114
|
+
console.log('✅ GitHub token stored successfully!');
|
|
115
|
+
return token;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.GitHubAuthService = GitHubAuthService;
|
|
119
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/services/github/auth.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,qCAAwC;AAMxC,MAAa,iBAAiB;IAG5B,YAAY,OAA0B;QACpC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAc;QAC/B,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,yBAAyB;YACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACxC,WAAW,GAAG,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,4GAA4G,CAC7G,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,qBAAY,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAExD,0CAA0C;QAC1C,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,mBAAmB;QACrE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5D,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;YAClF,CAAC;YACD,uDAAuD;YACvD,mDAAmD;QACrD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACnB,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAChC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,QAAQ,GAAG,wDAAa,UAAU,GAAC,CAAC;QAE1C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;YAC5C;gBACE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,0CAA0C;gBACnD,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;oBAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;wBAChC,OAAO,4DAA4D,CAAC;oBACtE,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;aACF;SACF,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,KAAK,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAE7B,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAlGD,8CAkGC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export interface GitHubClientOptions {
|
|
2
|
+
token?: string;
|
|
3
|
+
timeout?: number;
|
|
4
|
+
}
|
|
5
|
+
export interface GitHubRepo {
|
|
6
|
+
name: string;
|
|
7
|
+
full_name: string;
|
|
8
|
+
owner: {
|
|
9
|
+
login: string;
|
|
10
|
+
id: number;
|
|
11
|
+
};
|
|
12
|
+
private: boolean;
|
|
13
|
+
html_url: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface GitHubFileContent {
|
|
17
|
+
name: string;
|
|
18
|
+
path: string;
|
|
19
|
+
sha: string;
|
|
20
|
+
size: number;
|
|
21
|
+
url: string;
|
|
22
|
+
html_url: string;
|
|
23
|
+
git_url: string;
|
|
24
|
+
download_url: string;
|
|
25
|
+
type: 'file' | 'dir';
|
|
26
|
+
content?: string;
|
|
27
|
+
encoding?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface GitHubCommit {
|
|
30
|
+
sha: string;
|
|
31
|
+
commit: {
|
|
32
|
+
message: string;
|
|
33
|
+
author: {
|
|
34
|
+
name: string;
|
|
35
|
+
email: string;
|
|
36
|
+
date: string;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
html_url: string;
|
|
40
|
+
}
|
|
41
|
+
export declare class GitHubClient {
|
|
42
|
+
private client;
|
|
43
|
+
private token;
|
|
44
|
+
constructor(options?: GitHubClientOptions);
|
|
45
|
+
private setupInterceptors;
|
|
46
|
+
getRepo(owner: string, repo: string): Promise<GitHubRepo>;
|
|
47
|
+
getFile(owner: string, repo: string, path: string, ref?: string): Promise<GitHubFileContent>;
|
|
48
|
+
createOrUpdateFile(owner: string, repo: string, path: string, content: string, message: string, branch?: string, sha?: string): Promise<any>;
|
|
49
|
+
getCommits(owner: string, repo: string, path?: string, since?: string): Promise<GitHubCommit[]>;
|
|
50
|
+
createRepo(name: string, description?: string, isPrivate?: boolean): Promise<GitHubRepo>;
|
|
51
|
+
setToken(token: string): void;
|
|
52
|
+
hasToken(): boolean;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/services/github/client.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE;YACN,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;KACH,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,KAAK,CAAqB;gBAEtB,OAAO,GAAE,mBAAwB;IAqB7C,OAAO,CAAC,iBAAiB;IA4BnB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAQzD,OAAO,CACX,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,iBAAiB,CAAC;IASvB,kBAAkB,CACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAe,EACvB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,GAAG,CAAC;IAkBT,UAAU,CACd,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,EAAE,CAAC;IAYpB,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,EACpB,SAAS,GAAE,OAAe,GACzB,OAAO,CAAC,UAAU,CAAC;IAetB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7B,QAAQ,IAAI,OAAO;CAGpB"}
|