@sfdxy/anypoint-connect 0.1.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/README.md +481 -0
- package/dist/api/AccessManagementApi.d.ts +42 -0
- package/dist/api/AccessManagementApi.d.ts.map +1 -0
- package/dist/api/AccessManagementApi.js +48 -0
- package/dist/api/AccessManagementApi.js.map +1 -0
- package/dist/api/ApiManagerApi.d.ts +87 -0
- package/dist/api/ApiManagerApi.d.ts.map +1 -0
- package/dist/api/ApiManagerApi.js +79 -0
- package/dist/api/ApiManagerApi.js.map +1 -0
- package/dist/api/CloudHub2Api.d.ts +167 -0
- package/dist/api/CloudHub2Api.d.ts.map +1 -0
- package/dist/api/CloudHub2Api.js +132 -0
- package/dist/api/CloudHub2Api.js.map +1 -0
- package/dist/api/DesignCenterApi.d.ts +118 -0
- package/dist/api/DesignCenterApi.d.ts.map +1 -0
- package/dist/api/DesignCenterApi.js +259 -0
- package/dist/api/DesignCenterApi.js.map +1 -0
- package/dist/api/ExchangeApi.d.ts +92 -0
- package/dist/api/ExchangeApi.d.ts.map +1 -0
- package/dist/api/ExchangeApi.js +74 -0
- package/dist/api/ExchangeApi.js.map +1 -0
- package/dist/api/LogsApi.d.ts +66 -0
- package/dist/api/LogsApi.d.ts.map +1 -0
- package/dist/api/LogsApi.js +175 -0
- package/dist/api/LogsApi.js.map +1 -0
- package/dist/api/MonitoringApi.d.ts +72 -0
- package/dist/api/MonitoringApi.d.ts.map +1 -0
- package/dist/api/MonitoringApi.js +133 -0
- package/dist/api/MonitoringApi.js.map +1 -0
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -0
- package/dist/auth/FileStore.d.ts +15 -0
- package/dist/auth/FileStore.d.ts.map +1 -0
- package/dist/auth/FileStore.js +63 -0
- package/dist/auth/FileStore.js.map +1 -0
- package/dist/auth/OAuthFlow.d.ts +36 -0
- package/dist/auth/OAuthFlow.d.ts.map +1 -0
- package/dist/auth/OAuthFlow.js +156 -0
- package/dist/auth/OAuthFlow.js.map +1 -0
- package/dist/auth/TokenManager.d.ts +40 -0
- package/dist/auth/TokenManager.d.ts.map +1 -0
- package/dist/auth/TokenManager.js +119 -0
- package/dist/auth/TokenManager.js.map +1 -0
- package/dist/auth/TokenStore.d.ts +18 -0
- package/dist/auth/TokenStore.d.ts.map +1 -0
- package/dist/auth/TokenStore.js +5 -0
- package/dist/auth/TokenStore.js.map +1 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +4 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +28 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/AnypointClient.d.ts +41 -0
- package/dist/client/AnypointClient.d.ts.map +1 -0
- package/dist/client/AnypointClient.js +76 -0
- package/dist/client/AnypointClient.js.map +1 -0
- package/dist/client/Cache.d.ts +15 -0
- package/dist/client/Cache.d.ts.map +1 -0
- package/dist/client/Cache.js +42 -0
- package/dist/client/Cache.js.map +1 -0
- package/dist/client/HttpClient.d.ts +26 -0
- package/dist/client/HttpClient.d.ts.map +1 -0
- package/dist/client/HttpClient.js +69 -0
- package/dist/client/HttpClient.js.map +1 -0
- package/dist/client/RateLimiter.d.ts +20 -0
- package/dist/client/RateLimiter.d.ts.map +1 -0
- package/dist/client/RateLimiter.js +48 -0
- package/dist/client/RateLimiter.js.map +1 -0
- package/dist/commands/api.d.ts +7 -0
- package/dist/commands/api.d.ts.map +1 -0
- package/dist/commands/api.js +144 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/apps.d.ts +7 -0
- package/dist/commands/apps.d.ts.map +1 -0
- package/dist/commands/apps.js +156 -0
- package/dist/commands/apps.js.map +1 -0
- package/dist/commands/auth.d.ts +7 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +103 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/config.d.ts +7 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +125 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/deploy.d.ts +7 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +145 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/design-center.d.ts +7 -0
- package/dist/commands/design-center.d.ts.map +1 -0
- package/dist/commands/design-center.js +183 -0
- package/dist/commands/design-center.js.map +1 -0
- package/dist/commands/exchange.d.ts +7 -0
- package/dist/commands/exchange.d.ts.map +1 -0
- package/dist/commands/exchange.js +134 -0
- package/dist/commands/exchange.js.map +1 -0
- package/dist/commands/index.d.ts +7 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +7 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/logs.d.ts +8 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +115 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/monitor.d.ts +8 -0
- package/dist/commands/monitor.d.ts.map +1 -0
- package/dist/commands/monitor.js +129 -0
- package/dist/commands/monitor.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +7 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +993 -0
- package/dist/mcp.js.map +1 -0
- package/dist/safety/guards.d.ts +27 -0
- package/dist/safety/guards.d.ts.map +1 -0
- package/dist/safety/guards.js +83 -0
- package/dist/safety/guards.js.map +1 -0
- package/dist/utils/config.d.ts +57 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +117 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/formatter.d.ts +21 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +58 -0
- package/dist/utils/formatter.js.map +1 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +43 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Client
|
|
3
|
+
* Axios wrapper with authentication and rate limiting
|
|
4
|
+
*/
|
|
5
|
+
import { type AxiosRequestConfig } from 'axios';
|
|
6
|
+
import type { TokenManager } from '../auth/TokenManager.js';
|
|
7
|
+
import { type RateLimiterConfig } from './RateLimiter.js';
|
|
8
|
+
export interface HttpClientConfig {
|
|
9
|
+
baseUrl?: string;
|
|
10
|
+
tokenManager: TokenManager;
|
|
11
|
+
rateLimiter?: RateLimiterConfig;
|
|
12
|
+
timeout?: number;
|
|
13
|
+
}
|
|
14
|
+
export declare class HttpClient {
|
|
15
|
+
private readonly client;
|
|
16
|
+
private readonly tokenManager;
|
|
17
|
+
private readonly rateLimiter;
|
|
18
|
+
constructor(config: HttpClientConfig);
|
|
19
|
+
get<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T>;
|
|
20
|
+
post<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
|
|
21
|
+
put<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
|
|
22
|
+
patch<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
|
|
23
|
+
delete<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T>;
|
|
24
|
+
download(url: string, config?: AxiosRequestConfig): Promise<Buffer>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=HttpClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpClient.d.ts","sourceRoot":"","sources":["../../src/client/HttpClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAc,EAAsB,KAAK,kBAAkB,EAAsB,MAAM,OAAO,CAAC;AAC/F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAe,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAIvE,MAAM,WAAW,gBAAgB;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,UAAU;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;gBAE9B,MAAM,EAAE,gBAAgB;IAoB9B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAOtE,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAOvF,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAOtF,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAOxF,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAOzE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;CAS5E"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Client
|
|
3
|
+
* Axios wrapper with authentication and rate limiting
|
|
4
|
+
*/
|
|
5
|
+
import axios from 'axios';
|
|
6
|
+
import { RateLimiter } from './RateLimiter.js';
|
|
7
|
+
const DEFAULT_BASE_URL = 'https://anypoint.mulesoft.com';
|
|
8
|
+
export class HttpClient {
|
|
9
|
+
client;
|
|
10
|
+
tokenManager;
|
|
11
|
+
rateLimiter;
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.tokenManager = config.tokenManager;
|
|
14
|
+
this.rateLimiter = new RateLimiter(config.rateLimiter);
|
|
15
|
+
this.client = axios.create({
|
|
16
|
+
baseURL: config.baseUrl || DEFAULT_BASE_URL,
|
|
17
|
+
timeout: config.timeout || 30000,
|
|
18
|
+
headers: {
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
// Add auth interceptor
|
|
23
|
+
this.client.interceptors.request.use(async (requestConfig) => {
|
|
24
|
+
const accessToken = await this.tokenManager.getAccessToken();
|
|
25
|
+
requestConfig.headers.Authorization = `Bearer ${accessToken}`;
|
|
26
|
+
return requestConfig;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
async get(url, config) {
|
|
30
|
+
return this.rateLimiter.execute(async () => {
|
|
31
|
+
const response = await this.client.get(url, config);
|
|
32
|
+
return response.data;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async post(url, data, config) {
|
|
36
|
+
return this.rateLimiter.execute(async () => {
|
|
37
|
+
const response = await this.client.post(url, data, config);
|
|
38
|
+
return response.data;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async put(url, data, config) {
|
|
42
|
+
return this.rateLimiter.execute(async () => {
|
|
43
|
+
const response = await this.client.put(url, data, config);
|
|
44
|
+
return response.data;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async patch(url, data, config) {
|
|
48
|
+
return this.rateLimiter.execute(async () => {
|
|
49
|
+
const response = await this.client.patch(url, data, config);
|
|
50
|
+
return response.data;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
async delete(url, config) {
|
|
54
|
+
return this.rateLimiter.execute(async () => {
|
|
55
|
+
const response = await this.client.delete(url, config);
|
|
56
|
+
return response.data;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async download(url, config) {
|
|
60
|
+
return this.rateLimiter.execute(async () => {
|
|
61
|
+
const response = await this.client.get(url, {
|
|
62
|
+
...config,
|
|
63
|
+
responseType: 'arraybuffer',
|
|
64
|
+
});
|
|
65
|
+
return Buffer.from(response.data);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=HttpClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpClient.js","sourceRoot":"","sources":["../../src/client/HttpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limiter
|
|
3
|
+
* Simple token bucket rate limiter
|
|
4
|
+
*/
|
|
5
|
+
export interface RateLimiterConfig {
|
|
6
|
+
requestsPerMinute?: number;
|
|
7
|
+
concurrentRequests?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare class RateLimiter {
|
|
10
|
+
private readonly maxConcurrent;
|
|
11
|
+
private readonly minIntervalMs;
|
|
12
|
+
private running;
|
|
13
|
+
private lastRequestTime;
|
|
14
|
+
private queue;
|
|
15
|
+
constructor(config?: RateLimiterConfig);
|
|
16
|
+
execute<T>(fn: () => Promise<T>): Promise<T>;
|
|
17
|
+
private waitForSlot;
|
|
18
|
+
private releaseSlot;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=RateLimiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimiter.d.ts","sourceRoot":"","sources":["../../src/client/RateLimiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,qBAAa,WAAW;IACpB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,KAAK,CAAyB;gBAE1B,MAAM,CAAC,EAAE,iBAAiB;IAMhC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;YAYpC,WAAW;IAiBzB,OAAO,CAAC,WAAW;CAItB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limiter
|
|
3
|
+
* Simple token bucket rate limiter
|
|
4
|
+
*/
|
|
5
|
+
export class RateLimiter {
|
|
6
|
+
maxConcurrent;
|
|
7
|
+
minIntervalMs;
|
|
8
|
+
running = 0;
|
|
9
|
+
lastRequestTime = 0;
|
|
10
|
+
queue = [];
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this.maxConcurrent = config?.concurrentRequests ?? 10;
|
|
13
|
+
const rpm = config?.requestsPerMinute ?? 100;
|
|
14
|
+
this.minIntervalMs = (60 * 1000) / rpm;
|
|
15
|
+
}
|
|
16
|
+
async execute(fn) {
|
|
17
|
+
await this.waitForSlot();
|
|
18
|
+
this.running++;
|
|
19
|
+
try {
|
|
20
|
+
return await fn();
|
|
21
|
+
}
|
|
22
|
+
finally {
|
|
23
|
+
this.running--;
|
|
24
|
+
this.releaseSlot();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async waitForSlot() {
|
|
28
|
+
// Wait for concurrency slot
|
|
29
|
+
if (this.running >= this.maxConcurrent) {
|
|
30
|
+
await new Promise((resolve) => {
|
|
31
|
+
this.queue.push(resolve);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
// Wait for rate limit interval
|
|
35
|
+
const now = Date.now();
|
|
36
|
+
const elapsed = now - this.lastRequestTime;
|
|
37
|
+
if (elapsed < this.minIntervalMs) {
|
|
38
|
+
await new Promise((resolve) => setTimeout(resolve, this.minIntervalMs - elapsed));
|
|
39
|
+
}
|
|
40
|
+
this.lastRequestTime = Date.now();
|
|
41
|
+
}
|
|
42
|
+
releaseSlot() {
|
|
43
|
+
const next = this.queue.shift();
|
|
44
|
+
if (next)
|
|
45
|
+
next();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=RateLimiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../../src/client/RateLimiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,OAAO,WAAW;IACH,aAAa,CAAS;IACtB,aAAa,CAAS;IAC/B,OAAO,GAAG,CAAC,CAAC;IACZ,eAAe,GAAG,CAAC,CAAC;IACpB,KAAK,GAAsB,EAAE,CAAC;IAEtC,YAAY,MAA0B;QAClC,IAAI,CAAC,aAAa,GAAG,MAAM,EAAE,kBAAkB,IAAI,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,EAAE,iBAAiB,IAAI,GAAG,CAAC;QAC7C,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,OAAO,CAAI,EAAoB;QACjC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,EAAE,CAAC;QAEf,IAAI,CAAC;YACD,OAAO,MAAM,EAAE,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,WAAW;QACrB,4BAA4B;QAC5B,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;QACP,CAAC;QAED,+BAA+B;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC;QAC3C,IAAI,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtC,CAAC;IAEO,WAAW;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI;YAAE,IAAI,EAAE,CAAC;IACrB,CAAC;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/commands/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,gBAAgB,IAAI,OAAO,CA8I1C"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Manager CLI Commands
|
|
3
|
+
* anc api list | policies | sla-tiers | alerts
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { getConfig } from '../utils/config.js';
|
|
7
|
+
import { log } from '../utils/logger.js';
|
|
8
|
+
import { printTable } from '../utils/formatter.js';
|
|
9
|
+
import { AnypointClient } from '../client/AnypointClient.js';
|
|
10
|
+
function createClient() {
|
|
11
|
+
const config = getConfig();
|
|
12
|
+
return new AnypointClient({
|
|
13
|
+
clientId: config.clientId,
|
|
14
|
+
clientSecret: config.clientSecret,
|
|
15
|
+
redirectUri: config.callbackUrl,
|
|
16
|
+
baseUrl: config.baseUrl,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function createApiCommand() {
|
|
20
|
+
const api = new Command('api').description('Manage API instances, policies, and SLA tiers');
|
|
21
|
+
api.command('list')
|
|
22
|
+
.description('List API instances in an environment')
|
|
23
|
+
.requiredOption('-e, --env <name>', 'Environment name or ID')
|
|
24
|
+
.action(async (opts) => {
|
|
25
|
+
try {
|
|
26
|
+
const client = createClient();
|
|
27
|
+
const orgId = await client.getDefaultOrgId();
|
|
28
|
+
const env = await client.accessManagement.resolveEnvironment(orgId, opts.env);
|
|
29
|
+
const assets = await client.apiManager.getApis(orgId, env.id);
|
|
30
|
+
if (assets.length === 0) {
|
|
31
|
+
log.info(`No API instances in ${env.name}`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
log.header(`API Instances in ${env.name}`);
|
|
35
|
+
const rows = [];
|
|
36
|
+
for (const asset of assets) {
|
|
37
|
+
for (const instance of asset.apis) {
|
|
38
|
+
rows.push([
|
|
39
|
+
asset.exchangeAssetName,
|
|
40
|
+
String(instance.id),
|
|
41
|
+
instance.status,
|
|
42
|
+
instance.assetVersion || '-',
|
|
43
|
+
instance.technology || '-',
|
|
44
|
+
instance.endpointUri || '-',
|
|
45
|
+
]);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
printTable(['API Name', 'ID', 'Status', 'Version', 'Technology', 'Endpoint'], rows);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
log.error(`Failed: ${error instanceof Error ? error.message : error}`);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
api.command('policies')
|
|
56
|
+
.description('List policies applied to an API')
|
|
57
|
+
.argument('<apiName>', 'API name or ID')
|
|
58
|
+
.requiredOption('-e, --env <name>', 'Environment name or ID')
|
|
59
|
+
.action(async (apiName, opts) => {
|
|
60
|
+
try {
|
|
61
|
+
const client = createClient();
|
|
62
|
+
const orgId = await client.getDefaultOrgId();
|
|
63
|
+
const env = await client.accessManagement.resolveEnvironment(orgId, opts.env);
|
|
64
|
+
// Try as numeric ID first, then search by name
|
|
65
|
+
let apiId;
|
|
66
|
+
const numId = parseInt(apiName);
|
|
67
|
+
if (!isNaN(numId)) {
|
|
68
|
+
apiId = numId;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const found = await client.apiManager.findByName(orgId, env.id, apiName);
|
|
72
|
+
if (!found) {
|
|
73
|
+
log.error(`API "${apiName}" not found in ${env.name}`);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
apiId = found.instance.id;
|
|
77
|
+
log.dim(` Resolved: ${found.asset.exchangeAssetName} (ID: ${apiId})`);
|
|
78
|
+
}
|
|
79
|
+
const policies = await client.apiManager.getPolicies(orgId, env.id, apiId);
|
|
80
|
+
if (policies.length === 0) {
|
|
81
|
+
log.info('No policies applied');
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
log.header(`Policies (${policies.length})`);
|
|
85
|
+
for (const p of policies) {
|
|
86
|
+
log.kv('Policy', `${p.template?.assetId || p.policyTemplateId || 'unknown'} v${p.template?.assetVersion || '?'}`);
|
|
87
|
+
log.kv(' Order', String(p.order ?? '-'));
|
|
88
|
+
log.kv(' Disabled', String(p.disabled ?? false));
|
|
89
|
+
if (p.configurationData) {
|
|
90
|
+
log.kv(' Config', JSON.stringify(p.configurationData));
|
|
91
|
+
}
|
|
92
|
+
console.log();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
log.error(`Failed: ${error instanceof Error ? error.message : error}`);
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
api.command('sla-tiers')
|
|
101
|
+
.description('List SLA tiers for an API')
|
|
102
|
+
.argument('<apiName>', 'API name or ID')
|
|
103
|
+
.requiredOption('-e, --env <name>', 'Environment name or ID')
|
|
104
|
+
.action(async (apiName, opts) => {
|
|
105
|
+
try {
|
|
106
|
+
const client = createClient();
|
|
107
|
+
const orgId = await client.getDefaultOrgId();
|
|
108
|
+
const env = await client.accessManagement.resolveEnvironment(orgId, opts.env);
|
|
109
|
+
let apiId;
|
|
110
|
+
const numId = parseInt(apiName);
|
|
111
|
+
if (!isNaN(numId)) {
|
|
112
|
+
apiId = numId;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
const found = await client.apiManager.findByName(orgId, env.id, apiName);
|
|
116
|
+
if (!found) {
|
|
117
|
+
log.error(`API "${apiName}" not found in ${env.name}`);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
apiId = found.instance.id;
|
|
121
|
+
}
|
|
122
|
+
const tiers = await client.apiManager.getSlaTiers(orgId, env.id, apiId);
|
|
123
|
+
if (tiers.length === 0) {
|
|
124
|
+
log.info('No SLA tiers configured');
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
printTable(['Name', 'Status', 'Auto-Approve', 'Limits', 'Apps'], tiers.map((t) => [
|
|
128
|
+
t.name,
|
|
129
|
+
t.status,
|
|
130
|
+
t.autoApprove ? 'Yes' : 'No',
|
|
131
|
+
t.limits
|
|
132
|
+
.map((l) => `${l.maximumRequests} req/${l.timePeriodInMilliseconds / 1000}s`)
|
|
133
|
+
.join(', '),
|
|
134
|
+
String(t.applicationCount),
|
|
135
|
+
]));
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
log.error(`Failed: ${error instanceof Error ? error.message : error}`);
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
return api;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/commands/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../src/commands/apps.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,wBAAgB,iBAAiB,IAAI,OAAO,CA2J3C"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apps CLI Commands
|
|
3
|
+
* anc apps list | status
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { getConfig } from '../utils/config.js';
|
|
7
|
+
import { log } from '../utils/logger.js';
|
|
8
|
+
import { printTable } from '../utils/formatter.js';
|
|
9
|
+
import { AnypointClient } from '../client/AnypointClient.js';
|
|
10
|
+
import { isProductionEnv, confirmProductionDeploy } from '../safety/guards.js';
|
|
11
|
+
function createClient() {
|
|
12
|
+
const config = getConfig();
|
|
13
|
+
return new AnypointClient({
|
|
14
|
+
clientId: config.clientId,
|
|
15
|
+
clientSecret: config.clientSecret,
|
|
16
|
+
redirectUri: config.callbackUrl,
|
|
17
|
+
baseUrl: config.baseUrl,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export function createAppsCommand() {
|
|
21
|
+
const apps = new Command('apps').description('Manage deployed applications');
|
|
22
|
+
apps.command('list')
|
|
23
|
+
.description('List deployed applications')
|
|
24
|
+
.requiredOption('-e, --env <name>', 'Environment name or ID')
|
|
25
|
+
.action(async (opts) => {
|
|
26
|
+
try {
|
|
27
|
+
const client = createClient();
|
|
28
|
+
const orgId = await client.getDefaultOrgId();
|
|
29
|
+
const env = await client.accessManagement.resolveEnvironment(orgId, opts.env);
|
|
30
|
+
const deployments = await client.cloudHub2.getDeployments(orgId, env.id);
|
|
31
|
+
if (deployments.length === 0) {
|
|
32
|
+
log.info(`No applications deployed in ${env.name}`);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
log.header(`Applications in ${env.name} (${deployments.length})`);
|
|
36
|
+
printTable(['Name', 'Status', 'Version', 'Runtime', 'Replicas'], deployments.map((d) => [
|
|
37
|
+
d.name,
|
|
38
|
+
d.status,
|
|
39
|
+
d.application?.ref?.version || '-',
|
|
40
|
+
d.target?.deploymentSettings?.runtime?.version || '-',
|
|
41
|
+
String(d.target?.replicas?.length || 0),
|
|
42
|
+
]));
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
log.error(`Failed to list apps: ${error instanceof Error ? error.message : error}`);
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
apps.command('status')
|
|
50
|
+
.description('Get detailed status of an application')
|
|
51
|
+
.argument('<appName>', 'Application name')
|
|
52
|
+
.requiredOption('-e, --env <name>', 'Environment name or ID')
|
|
53
|
+
.action(async (appName, opts) => {
|
|
54
|
+
try {
|
|
55
|
+
const client = createClient();
|
|
56
|
+
const orgId = await client.getDefaultOrgId();
|
|
57
|
+
const env = await client.accessManagement.resolveEnvironment(orgId, opts.env);
|
|
58
|
+
const deployment = await client.cloudHub2.findByName(orgId, env.id, appName);
|
|
59
|
+
if (!deployment) {
|
|
60
|
+
log.error(`Application "${appName}" not found in ${env.name}`);
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
log.header(`${deployment.name}`);
|
|
64
|
+
log.kv('Status', deployment.status);
|
|
65
|
+
log.kv('Version', deployment.application?.ref?.version || '-');
|
|
66
|
+
log.kv('Runtime', deployment.target?.deploymentSettings?.runtime?.version || '-');
|
|
67
|
+
log.kv('Group ID', deployment.application?.ref?.groupId || '-');
|
|
68
|
+
log.kv('Artifact ID', deployment.application?.ref?.artifactId || '-');
|
|
69
|
+
if (deployment.target?.replicas) {
|
|
70
|
+
console.log();
|
|
71
|
+
log.bold(' Replicas:');
|
|
72
|
+
for (const replica of deployment.target.replicas) {
|
|
73
|
+
log.kv(` ${replica.id}`, `${replica.state} (${replica.deploymentLocation || 'unknown'})`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (deployment.target?.deploymentSettings?.http?.inbound?.publicUrl) {
|
|
77
|
+
console.log();
|
|
78
|
+
log.kv('Public URL', deployment.target.deploymentSettings.http.inbound.publicUrl);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
log.error(`Failed to get status: ${error instanceof Error ? error.message : error}`);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
apps.command('restart')
|
|
87
|
+
.description('Restart an application')
|
|
88
|
+
.argument('<appName>', 'Application name')
|
|
89
|
+
.requiredOption('-e, --env <name>', 'Environment name or ID')
|
|
90
|
+
.option('--force', 'Skip production confirmation', false)
|
|
91
|
+
.action(async (appName, opts) => {
|
|
92
|
+
try {
|
|
93
|
+
const client = createClient();
|
|
94
|
+
const orgId = await client.getDefaultOrgId();
|
|
95
|
+
const env = await client.accessManagement.resolveEnvironment(orgId, opts.env);
|
|
96
|
+
const deployment = await client.cloudHub2.findByName(orgId, env.id, appName);
|
|
97
|
+
if (!deployment) {
|
|
98
|
+
log.error(`Application "${appName}" not found in ${env.name}`);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
if (isProductionEnv(env.name, env.isProduction) && !opts.force) {
|
|
102
|
+
const confirmed = await confirmProductionDeploy(env.name);
|
|
103
|
+
if (!confirmed) {
|
|
104
|
+
log.warn('Restart cancelled');
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
log.info(`Restarting ${appName} in ${env.name}...`);
|
|
109
|
+
await client.cloudHub2.restartApp(orgId, env.id, deployment.id);
|
|
110
|
+
log.success(`Restart initiated for ${appName}`);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
log.error(`Restart failed: ${error instanceof Error ? error.message : error}`);
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
apps.command('scale')
|
|
118
|
+
.description('Scale application replicas')
|
|
119
|
+
.argument('<appName>', 'Application name')
|
|
120
|
+
.requiredOption('-e, --env <name>', 'Environment name or ID')
|
|
121
|
+
.requiredOption('--replicas <n>', 'Number of replicas')
|
|
122
|
+
.option('--force', 'Skip production confirmation', false)
|
|
123
|
+
.action(async (appName, opts) => {
|
|
124
|
+
try {
|
|
125
|
+
const client = createClient();
|
|
126
|
+
const orgId = await client.getDefaultOrgId();
|
|
127
|
+
const env = await client.accessManagement.resolveEnvironment(orgId, opts.env);
|
|
128
|
+
const deployment = await client.cloudHub2.findByName(orgId, env.id, appName);
|
|
129
|
+
if (!deployment) {
|
|
130
|
+
log.error(`Application "${appName}" not found in ${env.name}`);
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
const replicas = parseInt(opts.replicas);
|
|
134
|
+
if (isNaN(replicas) || replicas < 1) {
|
|
135
|
+
log.error('Replicas must be a positive integer');
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
if (isProductionEnv(env.name, env.isProduction) && !opts.force) {
|
|
139
|
+
const confirmed = await confirmProductionDeploy(env.name);
|
|
140
|
+
if (!confirmed) {
|
|
141
|
+
log.warn('Scale cancelled');
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
log.info(`Scaling ${appName} to ${replicas} replica(s) in ${env.name}...`);
|
|
146
|
+
await client.cloudHub2.scaleApp(orgId, env.id, deployment.id, replicas);
|
|
147
|
+
log.success(`Scaled ${appName} to ${replicas} replica(s)`);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
log.error(`Scale failed: ${error instanceof Error ? error.message : error}`);
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
return apps;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=apps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apps.js","sourceRoot":"","sources":["../../src/commands/apps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,iBAAiB,IAAI,OAAO,CAsG3C"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth CLI Commands
|
|
3
|
+
* anc auth login | logout | status
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import open from 'open';
|
|
7
|
+
import ora from 'ora';
|
|
8
|
+
import { getConfig } from '../utils/config.js';
|
|
9
|
+
import { log } from '../utils/logger.js';
|
|
10
|
+
import { AnypointClient } from '../client/AnypointClient.js';
|
|
11
|
+
export function createAuthCommand() {
|
|
12
|
+
const auth = new Command('auth').description('Manage Anypoint Platform authentication');
|
|
13
|
+
auth.command('login')
|
|
14
|
+
.description('Authenticate with Anypoint Platform via OAuth')
|
|
15
|
+
.action(async () => {
|
|
16
|
+
try {
|
|
17
|
+
const config = getConfig();
|
|
18
|
+
const client = new AnypointClient({
|
|
19
|
+
clientId: config.clientId,
|
|
20
|
+
clientSecret: config.clientSecret,
|
|
21
|
+
redirectUri: config.callbackUrl,
|
|
22
|
+
baseUrl: config.baseUrl,
|
|
23
|
+
});
|
|
24
|
+
const authUrl = client.getAuthorizeUrl();
|
|
25
|
+
log.info('Opening browser for authentication...');
|
|
26
|
+
log.dim(` ${authUrl}`);
|
|
27
|
+
// Start listening for callback before opening browser
|
|
28
|
+
const authPromise = client.authenticate();
|
|
29
|
+
// Open browser
|
|
30
|
+
await open(authUrl);
|
|
31
|
+
const spinner = ora('Waiting for authentication...').start();
|
|
32
|
+
await authPromise;
|
|
33
|
+
spinner.stop();
|
|
34
|
+
// Verify by fetching user info
|
|
35
|
+
const me = await client.whoami();
|
|
36
|
+
log.success(`Authenticated as ${me.firstName} ${me.lastName} (${me.username})`);
|
|
37
|
+
log.kv('Organization', me.organization.name);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
log.error(`Authentication failed: ${error instanceof Error ? error.message : error}`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
auth.command('logout')
|
|
45
|
+
.description('Clear stored credentials')
|
|
46
|
+
.action(async () => {
|
|
47
|
+
try {
|
|
48
|
+
const config = getConfig();
|
|
49
|
+
const client = new AnypointClient({
|
|
50
|
+
clientId: config.clientId,
|
|
51
|
+
clientSecret: config.clientSecret,
|
|
52
|
+
redirectUri: config.callbackUrl,
|
|
53
|
+
baseUrl: config.baseUrl,
|
|
54
|
+
});
|
|
55
|
+
await client.logout();
|
|
56
|
+
log.success('Logged out successfully');
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
log.error(`Logout failed: ${error instanceof Error ? error.message : error}`);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
auth.command('status')
|
|
64
|
+
.description('Show current authentication status')
|
|
65
|
+
.action(async () => {
|
|
66
|
+
try {
|
|
67
|
+
const config = getConfig();
|
|
68
|
+
const client = new AnypointClient({
|
|
69
|
+
clientId: config.clientId,
|
|
70
|
+
clientSecret: config.clientSecret,
|
|
71
|
+
redirectUri: config.callbackUrl,
|
|
72
|
+
baseUrl: config.baseUrl,
|
|
73
|
+
});
|
|
74
|
+
const status = await client.getAuthStatus();
|
|
75
|
+
if (!status.authenticated) {
|
|
76
|
+
log.warn('Not authenticated. Run: anc auth login');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
log.success('Authenticated');
|
|
80
|
+
if (status.expiresAt) {
|
|
81
|
+
log.kv('Token Expires', status.expiresAt.toLocaleString());
|
|
82
|
+
log.kv('Expired', status.isExpired ? 'Yes' : 'No');
|
|
83
|
+
log.kv('Can Refresh', status.canRefresh ? 'Yes' : 'No');
|
|
84
|
+
}
|
|
85
|
+
// Show user info
|
|
86
|
+
try {
|
|
87
|
+
const me = await client.whoami();
|
|
88
|
+
log.kv('User', `${me.firstName} ${me.lastName} (${me.username})`);
|
|
89
|
+
log.kv('Organization', me.organization.name);
|
|
90
|
+
log.kv('Org ID', me.organization.id);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
log.dim(' Could not fetch user details (token may need refresh)');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
log.error(`Status check failed: ${error instanceof Error ? error.message : error}`);
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
return auth;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=auth.js.map
|