geni-bioinfo 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/dist/auth.d.ts +8 -0
- package/dist/auth.js +76 -0
- package/dist/aws/clients.d.ts +18 -0
- package/dist/aws/clients.js +34 -0
- package/dist/commands/activate.d.ts +2 -0
- package/dist/commands/activate.js +20 -0
- package/dist/commands/activity-log.d.ts +2 -0
- package/dist/commands/activity-log.js +31 -0
- package/dist/commands/api-token.d.ts +2 -0
- package/dist/commands/api-token.js +96 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.js +55 -0
- package/dist/commands/engine.d.ts +2 -0
- package/dist/commands/engine.js +83 -0
- package/dist/commands/environment.d.ts +2 -0
- package/dist/commands/environment.js +69 -0
- package/dist/commands/image.d.ts +2 -0
- package/dist/commands/image.js +40 -0
- package/dist/commands/instance.d.ts +2 -0
- package/dist/commands/instance.js +39 -0
- package/dist/commands/log.d.ts +3 -0
- package/dist/commands/log.js +43 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.js +24 -0
- package/dist/commands/plugin.d.ts +2 -0
- package/dist/commands/plugin.js +80 -0
- package/dist/commands/queue.d.ts +2 -0
- package/dist/commands/queue.js +74 -0
- package/dist/commands/registry.d.ts +2 -0
- package/dist/commands/registry.js +72 -0
- package/dist/commands/setup/create.d.ts +2 -0
- package/dist/commands/setup/create.js +254 -0
- package/dist/commands/setup/delete.d.ts +2 -0
- package/dist/commands/setup/delete.js +97 -0
- package/dist/commands/setup/status.d.ts +2 -0
- package/dist/commands/setup/status.js +46 -0
- package/dist/commands/setup.d.ts +2 -0
- package/dist/commands/setup.js +13 -0
- package/dist/commands/storage.d.ts +2 -0
- package/dist/commands/storage.js +67 -0
- package/dist/commands/submission.d.ts +2 -0
- package/dist/commands/submission.js +87 -0
- package/dist/commands/task.d.ts +2 -0
- package/dist/commands/task.js +21 -0
- package/dist/commands/tenant.d.ts +2 -0
- package/dist/commands/tenant.js +68 -0
- package/dist/commands/user.d.ts +2 -0
- package/dist/commands/user.js +82 -0
- package/dist/commands/workflow.d.ts +2 -0
- package/dist/commands/workflow.js +80 -0
- package/dist/errors.d.ts +38 -0
- package/dist/errors.js +194 -0
- package/dist/format.d.ts +22 -0
- package/dist/format.js +155 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +91 -0
- package/dist/templates/setup.yaml +503 -0
- package/package.json +49 -0
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function apiUrl(apiPath: string): string;
|
|
2
|
+
export declare function getAuthHeaders(): Record<string, string>;
|
|
3
|
+
export declare function fetchJson(url: string, init?: RequestInit): Promise<unknown>;
|
|
4
|
+
export declare function readJsonResponse(res: Response, context?: {
|
|
5
|
+
method?: string;
|
|
6
|
+
url?: string;
|
|
7
|
+
}): Promise<unknown>;
|
|
8
|
+
export declare function saveCredentials(token: string): void;
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
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.apiUrl = apiUrl;
|
|
7
|
+
exports.getAuthHeaders = getAuthHeaders;
|
|
8
|
+
exports.fetchJson = fetchJson;
|
|
9
|
+
exports.readJsonResponse = readJsonResponse;
|
|
10
|
+
exports.saveCredentials = saveCredentials;
|
|
11
|
+
const fs_1 = __importDefault(require("fs"));
|
|
12
|
+
const path_1 = __importDefault(require("path"));
|
|
13
|
+
const os_1 = __importDefault(require("os"));
|
|
14
|
+
const errors_1 = require("./errors");
|
|
15
|
+
const CREDENTIALS_FILE = path_1.default.join(os_1.default.homedir(), '.geni', 'credentials.json');
|
|
16
|
+
function apiUrl(apiPath) {
|
|
17
|
+
const base = process.env.GENI_API_URL ?? 'https://workflows-api.geni-bioinfo.com.br';
|
|
18
|
+
return `${base}${apiPath}`;
|
|
19
|
+
}
|
|
20
|
+
function getAuthHeaders() {
|
|
21
|
+
// 1. API token from env var → X-API-Key
|
|
22
|
+
if (process.env.GENI_API_TOKEN) {
|
|
23
|
+
return { 'X-API-Key': process.env.GENI_API_TOKEN };
|
|
24
|
+
}
|
|
25
|
+
// 2. Stored JWT from login → Authorization: Bearer
|
|
26
|
+
try {
|
|
27
|
+
const data = JSON.parse(fs_1.default.readFileSync(CREDENTIALS_FILE, 'utf-8'));
|
|
28
|
+
if (data.token) {
|
|
29
|
+
return { Authorization: `Bearer ${data.token}` };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// No stored credentials
|
|
34
|
+
}
|
|
35
|
+
return {};
|
|
36
|
+
}
|
|
37
|
+
async function fetchJson(url, init) {
|
|
38
|
+
const headers = {
|
|
39
|
+
...getAuthHeaders(),
|
|
40
|
+
...(init?.headers ?? {}),
|
|
41
|
+
};
|
|
42
|
+
const res = await fetch(url, { ...init, headers });
|
|
43
|
+
return readJsonResponse(res, { method: (init?.method ?? 'GET').toUpperCase(), url });
|
|
44
|
+
}
|
|
45
|
+
async function readJsonResponse(res, context) {
|
|
46
|
+
const body = await res.text();
|
|
47
|
+
const parsedBody = parseJsonBody(body);
|
|
48
|
+
if (!res.ok) {
|
|
49
|
+
throw new errors_1.HttpRequestError({
|
|
50
|
+
status: res.status,
|
|
51
|
+
method: context?.method ?? 'GET',
|
|
52
|
+
url: context?.url ?? res.url,
|
|
53
|
+
body,
|
|
54
|
+
parsedBody,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return parsedBody;
|
|
58
|
+
}
|
|
59
|
+
function parseJsonBody(body) {
|
|
60
|
+
if (!body)
|
|
61
|
+
return null;
|
|
62
|
+
try {
|
|
63
|
+
return JSON.parse(body);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return body;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function saveCredentials(token) {
|
|
70
|
+
const dir = path_1.default.dirname(CREDENTIALS_FILE);
|
|
71
|
+
if (!fs_1.default.existsSync(dir)) {
|
|
72
|
+
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
73
|
+
}
|
|
74
|
+
fs_1.default.writeFileSync(CREDENTIALS_FILE, JSON.stringify({ token }, null, 2), { mode: 0o600 });
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBT0Esd0JBR0M7QUFFRCx3Q0FpQkM7QUFFRCw4QkFRQztBQUVELDRDQWdCQztBQVdELDBDQU1DO0FBMUVELDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIsNENBQW9CO0FBQ3BCLHFDQUE0QztBQUU1QyxNQUFNLGdCQUFnQixHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsWUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBRTlFLFNBQWdCLE1BQU0sQ0FBQyxPQUFlO0lBQ3BDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLDJDQUEyQyxDQUFDO0lBQ3JGLE9BQU8sR0FBRyxJQUFJLEdBQUcsT0FBTyxFQUFFLENBQUM7QUFDN0IsQ0FBQztBQUVELFNBQWdCLGNBQWM7SUFDNUIsd0NBQXdDO0lBQ3hDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMvQixPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQUUsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNwRSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNuRCxDQUFDO0lBQ0gsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLHdCQUF3QjtJQUMxQixDQUFDO0lBRUQsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRU0sS0FBSyxVQUFVLFNBQVMsQ0FBQyxHQUFXLEVBQUUsSUFBa0I7SUFDN0QsTUFBTSxPQUFPLEdBQTJCO1FBQ3RDLEdBQUcsY0FBYyxFQUFFO1FBQ25CLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBaUMsSUFBSSxFQUFFLENBQUM7S0FDbkQsQ0FBQztJQUVGLE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbkQsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUVNLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsR0FBYSxFQUNiLE9BQTJDO0lBRTNDLE1BQU0sSUFBSSxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlCLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLHlCQUFnQixDQUFDO1lBQ3pCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtZQUNsQixNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxLQUFLO1lBQ2hDLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHO1lBQzVCLElBQUk7WUFDSixVQUFVO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxJQUFZO0lBQ2pDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdkIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLEtBQWE7SUFDM0MsTUFBTSxHQUFHLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzNDLElBQUksQ0FBQyxZQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDeEIsWUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsWUFBRSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDMUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgeyBIdHRwUmVxdWVzdEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG5jb25zdCBDUkVERU5USUFMU19GSUxFID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5nZW5pJywgJ2NyZWRlbnRpYWxzLmpzb24nKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFwaVVybChhcGlQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gcHJvY2Vzcy5lbnYuR0VOSV9BUElfVVJMID8/ICdodHRwczovL3dvcmtmbG93cy1hcGkuZ2VuaS1iaW9pbmZvLmNvbS5icic7XG4gIHJldHVybiBgJHtiYXNlfSR7YXBpUGF0aH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXV0aEhlYWRlcnMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIC8vIDEuIEFQSSB0b2tlbiBmcm9tIGVudiB2YXIg4oaSIFgtQVBJLUtleVxuICBpZiAocHJvY2Vzcy5lbnYuR0VOSV9BUElfVE9LRU4pIHtcbiAgICByZXR1cm4geyAnWC1BUEktS2V5JzogcHJvY2Vzcy5lbnYuR0VOSV9BUElfVE9LRU4gfTtcbiAgfVxuXG4gIC8vIDIuIFN0b3JlZCBKV1QgZnJvbSBsb2dpbiDihpIgQXV0aG9yaXphdGlvbjogQmVhcmVyXG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKENSRURFTlRJQUxTX0ZJTEUsICd1dGYtOCcpKTtcbiAgICBpZiAoZGF0YS50b2tlbikge1xuICAgICAgcmV0dXJuIHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2RhdGEudG9rZW59YCB9O1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gc3RvcmVkIGNyZWRlbnRpYWxzXG4gIH1cblxuICByZXR1cm4ge307XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEpzb24odXJsOiBzdHJpbmcsIGluaXQ/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIC4uLmdldEF1dGhIZWFkZXJzKCksXG4gICAgLi4uKGluaXQ/LmhlYWRlcnMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiA/PyB7fSksXG4gIH07XG5cbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IC4uLmluaXQsIGhlYWRlcnMgfSk7XG4gIHJldHVybiByZWFkSnNvblJlc3BvbnNlKHJlcywgeyBtZXRob2Q6IChpbml0Py5tZXRob2QgPz8gJ0dFVCcpLnRvVXBwZXJDYXNlKCksIHVybCB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRKc29uUmVzcG9uc2UoXG4gIHJlczogUmVzcG9uc2UsXG4gIGNvbnRleHQ/OiB7IG1ldGhvZD86IHN0cmluZzsgdXJsPzogc3RyaW5nIH0sXG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gIGNvbnN0IHBhcnNlZEJvZHkgPSBwYXJzZUpzb25Cb2R5KGJvZHkpO1xuICBpZiAoIXJlcy5vaykge1xuICAgIHRocm93IG5ldyBIdHRwUmVxdWVzdEVycm9yKHtcbiAgICAgIHN0YXR1czogcmVzLnN0YXR1cyxcbiAgICAgIG1ldGhvZDogY29udGV4dD8ubWV0aG9kID8/ICdHRVQnLFxuICAgICAgdXJsOiBjb250ZXh0Py51cmwgPz8gcmVzLnVybCxcbiAgICAgIGJvZHksXG4gICAgICBwYXJzZWRCb2R5LFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBwYXJzZWRCb2R5O1xufVxuXG5mdW5jdGlvbiBwYXJzZUpzb25Cb2R5KGJvZHk6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAoIWJvZHkpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGJvZHkpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gYm9keTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2F2ZUNyZWRlbnRpYWxzKHRva2VuOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKENSRURFTlRJQUxTX0ZJTEUpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkge1xuICAgIGZzLm1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG4gIGZzLndyaXRlRmlsZVN5bmMoQ1JFREVOVElBTFNfRklMRSwgSlNPTi5zdHJpbmdpZnkoeyB0b2tlbiB9LCBudWxsLCAyKSwgeyBtb2RlOiAwbzYwMCB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CloudFormationClient } from '@aws-sdk/client-cloudformation';
|
|
2
|
+
import { IAMClient } from '@aws-sdk/client-iam';
|
|
3
|
+
import { S3Client } from '@aws-sdk/client-s3';
|
|
4
|
+
import { STSClient } from '@aws-sdk/client-sts';
|
|
5
|
+
export declare function createClients(region: string, profile?: string): {
|
|
6
|
+
cfn: CloudFormationClient;
|
|
7
|
+
iam: IAMClient;
|
|
8
|
+
s3: S3Client;
|
|
9
|
+
sts: STSClient;
|
|
10
|
+
};
|
|
11
|
+
export declare function getCallerIdentity(sts: STSClient): Promise<{
|
|
12
|
+
account: string;
|
|
13
|
+
arn: string;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function parseAwsUri(uri: string): {
|
|
16
|
+
account: string;
|
|
17
|
+
region: string;
|
|
18
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createClients = createClients;
|
|
4
|
+
exports.getCallerIdentity = getCallerIdentity;
|
|
5
|
+
exports.parseAwsUri = parseAwsUri;
|
|
6
|
+
const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
|
|
7
|
+
const client_iam_1 = require("@aws-sdk/client-iam");
|
|
8
|
+
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
9
|
+
const client_sts_1 = require("@aws-sdk/client-sts");
|
|
10
|
+
const credential_providers_1 = require("@aws-sdk/credential-providers");
|
|
11
|
+
const errors_1 = require("../errors");
|
|
12
|
+
function createClients(region, profile) {
|
|
13
|
+
const credentials = (0, credential_providers_1.fromNodeProviderChain)({ profile });
|
|
14
|
+
const cfn = new client_cloudformation_1.CloudFormationClient({ region, credentials });
|
|
15
|
+
const iam = new client_iam_1.IAMClient({ credentials }); // IAM is global — no region needed
|
|
16
|
+
const s3 = new client_s3_1.S3Client({ region, credentials });
|
|
17
|
+
const sts = new client_sts_1.STSClient({ region, credentials });
|
|
18
|
+
return { cfn, iam, s3, sts };
|
|
19
|
+
}
|
|
20
|
+
async function getCallerIdentity(sts) {
|
|
21
|
+
const response = await sts.send(new client_sts_1.GetCallerIdentityCommand({}));
|
|
22
|
+
return {
|
|
23
|
+
account: response.Account,
|
|
24
|
+
arn: response.Arn,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function parseAwsUri(uri) {
|
|
28
|
+
const match = uri.match(/^aws:\/\/(\d{12})\/([a-z0-9-]+)$/);
|
|
29
|
+
if (!match) {
|
|
30
|
+
throw (0, errors_1.invalidArgument)(`Invalid AWS URI: "${uri}". Expected format: aws://<12-digit-account>/<region>`, 'Example: aws://123456789012/us-east-1');
|
|
31
|
+
}
|
|
32
|
+
return { account: match[1], region: match[2] };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hd3MvY2xpZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQU9BLHNDQVNDO0FBRUQsOENBTUM7QUFFRCxrQ0FTQztBQW5DRCwwRUFBc0U7QUFDdEUsb0RBQWdEO0FBQ2hELGtEQUE4QztBQUM5QyxvREFBMEU7QUFDMUUsd0VBQXNFO0FBQ3RFLHNDQUE0QztBQUU1QyxTQUFnQixhQUFhLENBQUMsTUFBYyxFQUFFLE9BQWdCO0lBQzFELE1BQU0sV0FBVyxHQUFHLElBQUEsNENBQXFCLEVBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBRXZELE1BQU0sR0FBRyxHQUFHLElBQUksNENBQW9CLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM5RCxNQUFNLEdBQUcsR0FBRyxJQUFJLHNCQUFTLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUNBQW1DO0lBQy9FLE1BQU0sRUFBRSxHQUFHLElBQUksb0JBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sR0FBRyxHQUFHLElBQUksc0JBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBRW5ELE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqQyxDQUFDO0FBRU0sS0FBSyxVQUFVLGlCQUFpQixDQUFDLEdBQWM7SUFDbEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUkscUNBQXdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRSxPQUFPO1FBQ0gsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFRO1FBQzFCLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBSTtLQUNyQixDQUFDO0FBQ04sQ0FBQztBQUVELFNBQWdCLFdBQVcsQ0FBQyxHQUFXO0lBQ25DLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztJQUM1RCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDVCxNQUFNLElBQUEsd0JBQWUsRUFDakIscUJBQXFCLEdBQUcsdURBQXVELEVBQy9FLHVDQUF1QyxDQUMxQyxDQUFDO0lBQ04sQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb25DbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgSUFNQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWlhbSc7XG5pbXBvcnQgeyBTM0NsaWVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zMyc7XG5pbXBvcnQgeyBTVFNDbGllbnQsIEdldENhbGxlcklkZW50aXR5Q29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zdHMnO1xuaW1wb3J0IHsgZnJvbU5vZGVQcm92aWRlckNoYWluIH0gZnJvbSAnQGF3cy1zZGsvY3JlZGVudGlhbC1wcm92aWRlcnMnO1xuaW1wb3J0IHsgaW52YWxpZEFyZ3VtZW50IH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNsaWVudHMocmVnaW9uOiBzdHJpbmcsIHByb2ZpbGU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IGZyb21Ob2RlUHJvdmlkZXJDaGFpbih7IHByb2ZpbGUgfSk7XG5cbiAgICBjb25zdCBjZm4gPSBuZXcgQ2xvdWRGb3JtYXRpb25DbGllbnQoeyByZWdpb24sIGNyZWRlbnRpYWxzIH0pO1xuICAgIGNvbnN0IGlhbSA9IG5ldyBJQU1DbGllbnQoeyBjcmVkZW50aWFscyB9KTsgLy8gSUFNIGlzIGdsb2JhbCDigJQgbm8gcmVnaW9uIG5lZWRlZFxuICAgIGNvbnN0IHMzID0gbmV3IFMzQ2xpZW50KHsgcmVnaW9uLCBjcmVkZW50aWFscyB9KTtcbiAgICBjb25zdCBzdHMgPSBuZXcgU1RTQ2xpZW50KHsgcmVnaW9uLCBjcmVkZW50aWFscyB9KTtcblxuICAgIHJldHVybiB7IGNmbiwgaWFtLCBzMywgc3RzIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDYWxsZXJJZGVudGl0eShzdHM6IFNUU0NsaWVudCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc3RzLnNlbmQobmV3IEdldENhbGxlcklkZW50aXR5Q29tbWFuZCh7fSkpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFjY291bnQ6IHJlc3BvbnNlLkFjY291bnQhLFxuICAgICAgICBhcm46IHJlc3BvbnNlLkFybiEsXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQXdzVXJpKHVyaTogc3RyaW5nKTogeyBhY2NvdW50OiBzdHJpbmc7IHJlZ2lvbjogc3RyaW5nIH0ge1xuICAgIGNvbnN0IG1hdGNoID0gdXJpLm1hdGNoKC9eYXdzOlxcL1xcLyhcXGR7MTJ9KVxcLyhbYS16MC05LV0rKSQvKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIHRocm93IGludmFsaWRBcmd1bWVudChcbiAgICAgICAgICAgIGBJbnZhbGlkIEFXUyBVUkk6IFwiJHt1cml9XCIuIEV4cGVjdGVkIGZvcm1hdDogYXdzOi8vPDEyLWRpZ2l0LWFjY291bnQ+LzxyZWdpb24+YCxcbiAgICAgICAgICAgICdFeGFtcGxlOiBhd3M6Ly8xMjM0NTY3ODkwMTIvdXMtZWFzdC0xJyxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYWNjb3VudDogbWF0Y2hbMV0sIHJlZ2lvbjogbWF0Y2hbMl0gfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.activateCommand = void 0;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const auth_1 = require("../auth");
|
|
6
|
+
exports.activateCommand = new commander_1.Command('activate')
|
|
7
|
+
.description('Activate your user or reset password')
|
|
8
|
+
.requiredOption('--token <token>', 'Activation token from the email link')
|
|
9
|
+
.requiredOption('--password <password>', 'Password to set for your account')
|
|
10
|
+
.action(async (opts) => {
|
|
11
|
+
const res = await fetch((0, auth_1.apiUrl)('/auth/activate'), {
|
|
12
|
+
method: 'POST',
|
|
13
|
+
headers: { 'Content-Type': 'application/json' },
|
|
14
|
+
body: JSON.stringify({ token: opts.token, password: opts.password }),
|
|
15
|
+
});
|
|
16
|
+
const data = await (0, auth_1.readJsonResponse)(res, { method: 'POST', url: (0, auth_1.apiUrl)('/auth/activate') });
|
|
17
|
+
(0, auth_1.saveCredentials)(data.accessToken);
|
|
18
|
+
console.log('Account activated. Credentials saved to ~/.geni/credentials.json');
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYWN0aXZhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQW9DO0FBQ3BDLGtDQUFvRTtBQUV2RCxRQUFBLGVBQWUsR0FBRyxJQUFJLG1CQUFPLENBQUMsVUFBVSxDQUFDO0tBQ25ELFdBQVcsQ0FBQyxzQ0FBc0MsQ0FBQztLQUNuRCxjQUFjLENBQUMsaUJBQWlCLEVBQUUsc0NBQXNDLENBQUM7S0FDekUsY0FBYyxDQUFDLHVCQUF1QixFQUFFLGtDQUFrQyxDQUFDO0tBQzNFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBeUMsRUFBRSxFQUFFO0lBQzFELE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUEsYUFBTSxFQUFDLGdCQUFnQixDQUFDLEVBQUU7UUFDaEQsTUFBTSxFQUFFLE1BQU07UUFDZCxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7UUFDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQ3JFLENBQUMsQ0FBQztJQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBQSx1QkFBZ0IsRUFBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFBLGFBQU0sRUFBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBRXpGLENBQUM7SUFDRixJQUFBLHNCQUFlLEVBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0VBQWtFLENBQUMsQ0FBQztBQUNsRixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgYXBpVXJsLCByZWFkSnNvblJlc3BvbnNlLCBzYXZlQ3JlZGVudGlhbHMgfSBmcm9tICcuLi9hdXRoJztcblxuZXhwb3J0IGNvbnN0IGFjdGl2YXRlQ29tbWFuZCA9IG5ldyBDb21tYW5kKCdhY3RpdmF0ZScpXG4gIC5kZXNjcmlwdGlvbignQWN0aXZhdGUgeW91ciB1c2VyIG9yIHJlc2V0IHBhc3N3b3JkJylcbiAgLnJlcXVpcmVkT3B0aW9uKCctLXRva2VuIDx0b2tlbj4nLCAnQWN0aXZhdGlvbiB0b2tlbiBmcm9tIHRoZSBlbWFpbCBsaW5rJylcbiAgLnJlcXVpcmVkT3B0aW9uKCctLXBhc3N3b3JkIDxwYXNzd29yZD4nLCAnUGFzc3dvcmQgdG8gc2V0IGZvciB5b3VyIGFjY291bnQnKVxuICAuYWN0aW9uKGFzeW5jIChvcHRzOiB7IHRva2VuOiBzdHJpbmc7IHBhc3N3b3JkOiBzdHJpbmcgfSkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGFwaVVybCgnL2F1dGgvYWN0aXZhdGUnKSwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdG9rZW46IG9wdHMudG9rZW4sIHBhc3N3b3JkOiBvcHRzLnBhc3N3b3JkIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZWFkSnNvblJlc3BvbnNlKHJlcywgeyBtZXRob2Q6ICdQT1NUJywgdXJsOiBhcGlVcmwoJy9hdXRoL2FjdGl2YXRlJykgfSkgYXMge1xuICAgICAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgICB9O1xuICAgIHNhdmVDcmVkZW50aWFscyhkYXRhLmFjY2Vzc1Rva2VuKTtcbiAgICBjb25zb2xlLmxvZygnQWNjb3VudCBhY3RpdmF0ZWQuIENyZWRlbnRpYWxzIHNhdmVkIHRvIH4vLmdlbmkvY3JlZGVudGlhbHMuanNvbicpO1xuICB9KTtcbiJdfQ==
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.activityLogCommand = void 0;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const auth_1 = require("../auth");
|
|
6
|
+
const format_js_1 = require("../format.js");
|
|
7
|
+
exports.activityLogCommand = new commander_1.Command('activity-log')
|
|
8
|
+
.description('Manage activity logs');
|
|
9
|
+
exports.activityLogCommand
|
|
10
|
+
.command('list')
|
|
11
|
+
.description('List activity logs')
|
|
12
|
+
.option('--action <action>', 'Filter by action (CREATE, UPDATE, DELETE)')
|
|
13
|
+
.option('--entity-type <type>', 'Filter by entity type')
|
|
14
|
+
.option('--entity-id <id>', 'Filter by entity ID')
|
|
15
|
+
.option('--user-id <id>', 'Filter by user ID')
|
|
16
|
+
.addOption(new commander_1.Option('--format <format>', 'Output format').choices(['table', 'json', 'csv']).default('table'))
|
|
17
|
+
.action(async (opts) => {
|
|
18
|
+
const params = new URLSearchParams();
|
|
19
|
+
if (opts.action)
|
|
20
|
+
params.set('action', opts.action);
|
|
21
|
+
if (opts.entityType)
|
|
22
|
+
params.set('entityType', opts.entityType);
|
|
23
|
+
if (opts.entityId)
|
|
24
|
+
params.set('entityId', opts.entityId);
|
|
25
|
+
if (opts.userId)
|
|
26
|
+
params.set('userId', opts.userId);
|
|
27
|
+
const query = params.toString() ? `?${params.toString()}` : '';
|
|
28
|
+
const data = await (0, auth_1.fetchJson)((0, auth_1.apiUrl)(`/activity-logs${query}`));
|
|
29
|
+
(0, format_js_1.formatOutput)(opts.format === 'json' ? data : data.items, opts.format, format_js_1.activityLogColumns);
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZpdHktbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2FjdGl2aXR5LWxvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBMkM7QUFDM0Msa0NBQTJDO0FBQzNDLDRDQUFrRjtBQUVyRSxRQUFBLGtCQUFrQixHQUFHLElBQUksbUJBQU8sQ0FBQyxjQUFjLENBQUM7S0FDMUQsV0FBVyxDQUFDLHNCQUFzQixDQUFDLENBQUE7QUFFdEMsMEJBQWtCO0tBQ2YsT0FBTyxDQUFDLE1BQU0sQ0FBQztLQUNmLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQztLQUNqQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsMkNBQTJDLENBQUM7S0FDeEUsTUFBTSxDQUFDLHNCQUFzQixFQUFFLHVCQUF1QixDQUFDO0tBQ3ZELE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxxQkFBcUIsQ0FBQztLQUNqRCxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUM7S0FDN0MsU0FBUyxDQUFDLElBQUksa0JBQU0sQ0FBQyxtQkFBbUIsRUFBRSxlQUFlLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQzlHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFNZCxFQUFFLEVBQUU7SUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFBO0lBQ3BDLElBQUksSUFBSSxDQUFDLE1BQU07UUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEQsSUFBSSxJQUFJLENBQUMsVUFBVTtRQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUM5RCxJQUFJLElBQUksQ0FBQyxRQUFRO1FBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3hELElBQUksSUFBSSxDQUFDLE1BQU07UUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDOUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFBLGdCQUFTLEVBQUMsSUFBQSxhQUFNLEVBQUMsaUJBQWlCLEtBQUssRUFBRSxDQUFDLENBQXlCLENBQUE7SUFDdEYsSUFBQSx3QkFBWSxFQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSw4QkFBa0IsQ0FBQyxDQUFBO0FBQzNGLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY29tbWFuZGVyJ1xuaW1wb3J0IHsgYXBpVXJsLCBmZXRjaEpzb24gfSBmcm9tICcuLi9hdXRoJ1xuaW1wb3J0IHsgZm9ybWF0T3V0cHV0LCBhY3Rpdml0eUxvZ0NvbHVtbnMsIHR5cGUgT3V0cHV0Rm9ybWF0IH0gZnJvbSAnLi4vZm9ybWF0LmpzJ1xuXG5leHBvcnQgY29uc3QgYWN0aXZpdHlMb2dDb21tYW5kID0gbmV3IENvbW1hbmQoJ2FjdGl2aXR5LWxvZycpXG4gIC5kZXNjcmlwdGlvbignTWFuYWdlIGFjdGl2aXR5IGxvZ3MnKVxuXG5hY3Rpdml0eUxvZ0NvbW1hbmRcbiAgLmNvbW1hbmQoJ2xpc3QnKVxuICAuZGVzY3JpcHRpb24oJ0xpc3QgYWN0aXZpdHkgbG9ncycpXG4gIC5vcHRpb24oJy0tYWN0aW9uIDxhY3Rpb24+JywgJ0ZpbHRlciBieSBhY3Rpb24gKENSRUFURSwgVVBEQVRFLCBERUxFVEUpJylcbiAgLm9wdGlvbignLS1lbnRpdHktdHlwZSA8dHlwZT4nLCAnRmlsdGVyIGJ5IGVudGl0eSB0eXBlJylcbiAgLm9wdGlvbignLS1lbnRpdHktaWQgPGlkPicsICdGaWx0ZXIgYnkgZW50aXR5IElEJylcbiAgLm9wdGlvbignLS11c2VyLWlkIDxpZD4nLCAnRmlsdGVyIGJ5IHVzZXIgSUQnKVxuICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQnKS5jaG9pY2VzKFsndGFibGUnLCAnanNvbicsICdjc3YnXSkuZGVmYXVsdCgndGFibGUnKSlcbiAgLmFjdGlvbihhc3luYyAob3B0czoge1xuICAgIGFjdGlvbj86IHN0cmluZ1xuICAgIGVudGl0eVR5cGU/OiBzdHJpbmdcbiAgICBlbnRpdHlJZD86IHN0cmluZ1xuICAgIHVzZXJJZD86IHN0cmluZ1xuICAgIGZvcm1hdDogT3V0cHV0Rm9ybWF0XG4gIH0pID0+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgICBpZiAob3B0cy5hY3Rpb24pIHBhcmFtcy5zZXQoJ2FjdGlvbicsIG9wdHMuYWN0aW9uKVxuICAgIGlmIChvcHRzLmVudGl0eVR5cGUpIHBhcmFtcy5zZXQoJ2VudGl0eVR5cGUnLCBvcHRzLmVudGl0eVR5cGUpXG4gICAgaWYgKG9wdHMuZW50aXR5SWQpIHBhcmFtcy5zZXQoJ2VudGl0eUlkJywgb3B0cy5lbnRpdHlJZClcbiAgICBpZiAob3B0cy51c2VySWQpIHBhcmFtcy5zZXQoJ3VzZXJJZCcsIG9wdHMudXNlcklkKVxuICAgIGNvbnN0IHF1ZXJ5ID0gcGFyYW1zLnRvU3RyaW5nKCkgPyBgPyR7cGFyYW1zLnRvU3RyaW5nKCl9YCA6ICcnXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoSnNvbihhcGlVcmwoYC9hY3Rpdml0eS1sb2dzJHtxdWVyeX1gKSkgYXMgeyBpdGVtczogdW5rbm93bltdIH1cbiAgICBmb3JtYXRPdXRwdXQob3B0cy5mb3JtYXQgPT09ICdqc29uJyA/IGRhdGEgOiBkYXRhLml0ZW1zLCBvcHRzLmZvcm1hdCwgYWN0aXZpdHlMb2dDb2x1bW5zKVxuICB9KVxuIl19
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.apiTokenCommand = void 0;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const auth_1 = require("../auth");
|
|
6
|
+
const format_js_1 = require("../format.js");
|
|
7
|
+
const apiTokenColumns = [
|
|
8
|
+
{ header: 'ID', value: (r) => r.id },
|
|
9
|
+
{ header: 'Prefix', value: (r) => r.token_prefix },
|
|
10
|
+
{ header: 'Role', value: (r) => r.role ?? '' },
|
|
11
|
+
{ header: 'Description', value: (r) => r.description },
|
|
12
|
+
{ header: 'Environment ID', value: (r) => r.environment_id ?? '' },
|
|
13
|
+
{ header: 'Created By', value: (r) => r.created_by },
|
|
14
|
+
{ header: 'Expires At', value: (r) => r.expires_at },
|
|
15
|
+
{ header: 'Last Used At', value: (r) => r.last_used_at },
|
|
16
|
+
{ header: 'Active', value: (r) => r.is_active },
|
|
17
|
+
];
|
|
18
|
+
exports.apiTokenCommand = new commander_1.Command('api-token')
|
|
19
|
+
.description('Manage API tokens');
|
|
20
|
+
exports.apiTokenCommand
|
|
21
|
+
.command('list')
|
|
22
|
+
.description('List API tokens for the current tenant')
|
|
23
|
+
.addOption(new commander_1.Option('--format <format>', 'Output format').choices(['table', 'json', 'csv']).default('table'))
|
|
24
|
+
.action(async (opts) => {
|
|
25
|
+
const data = await (0, auth_1.fetchJson)((0, auth_1.apiUrl)('/admin/api-tokens'));
|
|
26
|
+
(0, format_js_1.formatOutput)(data, opts.format, apiTokenColumns);
|
|
27
|
+
});
|
|
28
|
+
exports.apiTokenCommand
|
|
29
|
+
.command('get <id>')
|
|
30
|
+
.description('Get details of an API token')
|
|
31
|
+
.addOption(new commander_1.Option('--format <format>', 'Output format').choices(['table', 'json', 'csv']).default('table'))
|
|
32
|
+
.action(async (id, opts) => {
|
|
33
|
+
const data = await (0, auth_1.fetchJson)((0, auth_1.apiUrl)(`/admin/api-tokens/${id}`));
|
|
34
|
+
(0, format_js_1.formatOutput)(data, opts.format, apiTokenColumns);
|
|
35
|
+
});
|
|
36
|
+
exports.apiTokenCommand
|
|
37
|
+
.command('create')
|
|
38
|
+
.description('Create a new API token (token is shown only once)')
|
|
39
|
+
.requiredOption('--name <name>', 'Token name')
|
|
40
|
+
.addOption(new commander_1.Option('--role <role>', 'Token role').choices(['automation']).makeOptionMandatory())
|
|
41
|
+
.option('--description <text>', 'Human-readable label for this token')
|
|
42
|
+
.option('--expires-at <date>', 'Expiration date in ISO 8601 format (max 1 year, default 1 year)')
|
|
43
|
+
.option('--environment-id <uuid>', 'Optional — restrict token submissions to this environment')
|
|
44
|
+
.addOption(new commander_1.Option('--format <format>', 'Output format').choices(['table', 'json', 'csv']).default('table'))
|
|
45
|
+
.action(async (opts) => {
|
|
46
|
+
const body = { name: opts.name, role: opts.role };
|
|
47
|
+
if (opts.description)
|
|
48
|
+
body.description = opts.description;
|
|
49
|
+
if (opts.expiresAt)
|
|
50
|
+
body.expires_at = opts.expiresAt;
|
|
51
|
+
if (opts.environmentId)
|
|
52
|
+
body.environment_id = opts.environmentId;
|
|
53
|
+
const data = await (0, auth_1.fetchJson)((0, auth_1.apiUrl)('/admin/api-tokens'), {
|
|
54
|
+
method: 'POST',
|
|
55
|
+
headers: { 'Content-Type': 'application/json' },
|
|
56
|
+
body: JSON.stringify(body),
|
|
57
|
+
});
|
|
58
|
+
if (opts.format === 'json') {
|
|
59
|
+
console.log(JSON.stringify(data, null, 2));
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
console.log('');
|
|
63
|
+
console.log('API token created. Save this token — it will not be shown again.');
|
|
64
|
+
console.log('');
|
|
65
|
+
console.log(`Token: ${data.token}`);
|
|
66
|
+
console.log('');
|
|
67
|
+
const row = { ...data };
|
|
68
|
+
delete row.token;
|
|
69
|
+
(0, format_js_1.formatOutput)(row, opts.format, apiTokenColumns);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
exports.apiTokenCommand
|
|
73
|
+
.command('revoke <id>')
|
|
74
|
+
.description('Revoke an API token')
|
|
75
|
+
.action(async (id) => {
|
|
76
|
+
await (0, auth_1.fetchJson)((0, auth_1.apiUrl)(`/admin/api-tokens/${id}`), { method: 'DELETE' });
|
|
77
|
+
console.log('Token revoked.');
|
|
78
|
+
});
|
|
79
|
+
exports.apiTokenCommand
|
|
80
|
+
.command('revoke-batch')
|
|
81
|
+
.description('Revoke multiple API tokens at once (Admin only)')
|
|
82
|
+
.requiredOption('--ids <ids>', 'Comma-separated list of token IDs to revoke')
|
|
83
|
+
.action(async (opts) => {
|
|
84
|
+
const ids = opts.ids.split(',').map((id) => id.trim()).filter(Boolean);
|
|
85
|
+
if (ids.length === 0) {
|
|
86
|
+
console.error('No IDs provided.');
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
await (0, auth_1.fetchJson)((0, auth_1.apiUrl)('/admin/api-tokens/revoke-batch'), {
|
|
90
|
+
method: 'POST',
|
|
91
|
+
headers: { 'Content-Type': 'application/json' },
|
|
92
|
+
body: JSON.stringify({ ids }),
|
|
93
|
+
});
|
|
94
|
+
console.log(`${ids.length} token(s) revoked.`);
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2FwaS10b2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBNEM7QUFDNUMsa0NBQTRDO0FBQzVDLDRDQUErRDtBQUUvRCxNQUFNLGVBQWUsR0FBRztJQUN0QixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUM3RCxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRTtJQUMzRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUU7SUFDdkUsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQTBCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUU7SUFDL0UsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsSUFBSSxFQUFFLEVBQUU7SUFDM0YsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQTBCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUU7SUFDN0UsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQTBCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUU7SUFDN0UsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQTBCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUU7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aW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGFwaVVybCwgZmV0Y2hKc29uIH0gZnJvbSAnLi4vYXV0aCc7XG5pbXBvcnQgeyBmb3JtYXRPdXRwdXQsIHR5cGUgT3V0cHV0Rm9ybWF0IH0gZnJvbSAnLi4vZm9ybWF0LmpzJztcblxuY29uc3QgYXBpVG9rZW5Db2x1bW5zID0gW1xuICB7IGhlYWRlcjogJ0lEJywgdmFsdWU6IChyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gci5pZCB9LFxuICB7IGhlYWRlcjogJ1ByZWZpeCcsIHZhbHVlOiAocjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHIudG9rZW5fcHJlZml4IH0sXG4gIHsgaGVhZGVyOiAnUm9sZScsIHZhbHVlOiAocjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHIucm9sZSA/PyAnJyB9LFxuICB7IGhlYWRlcjogJ0Rlc2NyaXB0aW9uJywgdmFsdWU6IChyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gci5kZXNjcmlwdGlvbiB9LFxuICB7IGhlYWRlcjogJ0Vudmlyb25tZW50IElEJywgdmFsdWU6IChyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gci5lbnZpcm9ubWVudF9pZCA/PyAnJyB9LFxuICB7IGhlYWRlcjogJ0NyZWF0ZWQgQnknLCB2YWx1ZTogKHI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiByLmNyZWF0ZWRfYnkgfSxcbiAgeyBoZWFkZXI6ICdFeHBpcmVzIEF0JywgdmFsdWU6IChyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gci5leHBpcmVzX2F0IH0sXG4gIHsgaGVhZGVyOiAnTGFzdCBVc2VkIEF0JywgdmFsdWU6IChyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gci5sYXN0X3VzZWRfYXQgfSxcbiAgeyBoZWFkZXI6ICdBY3RpdmUnLCB2YWx1ZTogKHI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiByLmlzX2FjdGl2ZSB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IGFwaVRva2VuQ29tbWFuZCA9IG5ldyBDb21tYW5kKCdhcGktdG9rZW4nKVxuICAuZGVzY3JpcHRpb24oJ01hbmFnZSBBUEkgdG9rZW5zJyk7XG5cbmFwaVRva2VuQ29tbWFuZFxuICAuY29tbWFuZCgnbGlzdCcpXG4gIC5kZXNjcmlwdGlvbignTGlzdCBBUEkgdG9rZW5zIGZvciB0aGUgY3VycmVudCB0ZW5hbnQnKVxuICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQnKS5jaG9pY2VzKFsndGFibGUnLCAnanNvbicsICdjc3YnXSkuZGVmYXVsdCgndGFibGUnKSlcbiAgLmFjdGlvbihhc3luYyAob3B0czogeyBmb3JtYXQ6IE91dHB1dEZvcm1hdCB9KSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoSnNvbihhcGlVcmwoJy9hZG1pbi9hcGktdG9rZW5zJykpO1xuICAgIGZvcm1hdE91dHB1dChkYXRhLCBvcHRzLmZvcm1hdCwgYXBpVG9rZW5Db2x1bW5zKTtcbiAgfSk7XG5cbmFwaVRva2VuQ29tbWFuZFxuICAuY29tbWFuZCgnZ2V0IDxpZD4nKVxuICAuZGVzY3JpcHRpb24oJ0dldCBkZXRhaWxzIG9mIGFuIEFQSSB0b2tlbicpXG4gIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1mb3JtYXQgPGZvcm1hdD4nLCAnT3V0cHV0IGZvcm1hdCcpLmNob2ljZXMoWyd0YWJsZScsICdqc29uJywgJ2NzdiddKS5kZWZhdWx0KCd0YWJsZScpKVxuICAuYWN0aW9uKGFzeW5jIChpZDogc3RyaW5nLCBvcHRzOiB7IGZvcm1hdDogT3V0cHV0Rm9ybWF0IH0pID0+IHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgZmV0Y2hKc29uKGFwaVVybChgL2FkbWluL2FwaS10b2tlbnMvJHtpZH1gKSk7XG4gICAgZm9ybWF0T3V0cHV0KGRhdGEsIG9wdHMuZm9ybWF0LCBhcGlUb2tlbkNvbHVtbnMpO1xuICB9KTtcblxuYXBpVG9rZW5Db21tYW5kXG4gIC5jb21tYW5kKCdjcmVhdGUnKVxuICAuZGVzY3JpcHRpb24oJ0NyZWF0ZSBhIG5ldyBBUEkgdG9rZW4gKHRva2VuIGlzIHNob3duIG9ubHkgb25jZSknKVxuICAucmVxdWlyZWRPcHRpb24oJy0tbmFtZSA8bmFtZT4nLCAnVG9rZW4gbmFtZScpXG4gIC5hZGRPcHRpb24oXG4gICAgbmV3IE9wdGlvbignLS1yb2xlIDxyb2xlPicsICdUb2tlbiByb2xlJykuY2hvaWNlcyhbJ2F1dG9tYXRpb24nXSkubWFrZU9wdGlvbk1hbmRhdG9yeSgpLFxuICApXG4gIC5vcHRpb24oJy0tZGVzY3JpcHRpb24gPHRleHQ+JywgJ0h1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGlzIHRva2VuJylcbiAgLm9wdGlvbignLS1leHBpcmVzLWF0IDxkYXRlPicsICdFeHBpcmF0aW9uIGRhdGUgaW4gSVNPIDg2MDEgZm9ybWF0IChtYXggMSB5ZWFyLCBkZWZhdWx0IDEgeWVhciknKVxuICAub3B0aW9uKCctLWVudmlyb25tZW50LWlkIDx1dWlkPicsICdPcHRpb25hbCDigJQgcmVzdHJpY3QgdG9rZW4gc3VibWlzc2lvbnMgdG8gdGhpcyBlbnZpcm9ubWVudCcpXG4gIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1mb3JtYXQgPGZvcm1hdD4nLCAnT3V0cHV0IGZvcm1hdCcpLmNob2ljZXMoWyd0YWJsZScsICdqc29uJywgJ2NzdiddKS5kZWZhdWx0KCd0YWJsZScpKVxuICAuYWN0aW9uKGFzeW5jIChvcHRzOiB7IG5hbWU6IHN0cmluZzsgcm9sZTogc3RyaW5nOyBkZXNjcmlwdGlvbj86IHN0cmluZzsgZXhwaXJlc0F0Pzogc3RyaW5nOyBlbnZpcm9ubWVudElkPzogc3RyaW5nOyBmb3JtYXQ6IE91dHB1dEZvcm1hdCB9KSA9PiB7XG4gICAgY29uc3QgYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IG5hbWU6IG9wdHMubmFtZSwgcm9sZTogb3B0cy5yb2xlIH07XG4gICAgaWYgKG9wdHMuZGVzY3JpcHRpb24pIGJvZHkuZGVzY3JpcHRpb24gPSBvcHRzLmRlc2NyaXB0aW9uO1xuICAgIGlmIChvcHRzLmV4cGlyZXNBdCkgYm9keS5leHBpcmVzX2F0ID0gb3B0cy5leHBpcmVzQXQ7XG4gICAgaWYgKG9wdHMuZW52aXJvbm1lbnRJZCkgYm9keS5lbnZpcm9ubWVudF9pZCA9IG9wdHMuZW52aXJvbm1lbnRJZDtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaEpzb24oYXBpVXJsKCcvYWRtaW4vYXBpLXRva2VucycpLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICBpZiAob3B0cy5mb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICBjb25zb2xlLmxvZygnQVBJIHRva2VuIGNyZWF0ZWQuIFNhdmUgdGhpcyB0b2tlbiDigJQgaXQgd2lsbCBub3QgYmUgc2hvd24gYWdhaW4uJyk7XG4gICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICBjb25zb2xlLmxvZyhgVG9rZW46ICR7ZGF0YS50b2tlbn1gKTtcbiAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgIGNvbnN0IHJvdyA9IHsgLi4uZGF0YSB9O1xuICAgICAgZGVsZXRlIHJvdy50b2tlbjtcbiAgICAgIGZvcm1hdE91dHB1dChyb3csIG9wdHMuZm9ybWF0LCBhcGlUb2tlbkNvbHVtbnMpO1xuICAgIH1cbiAgfSk7XG5cbmFwaVRva2VuQ29tbWFuZFxuICAuY29tbWFuZCgncmV2b2tlIDxpZD4nKVxuICAuZGVzY3JpcHRpb24oJ1Jldm9rZSBhbiBBUEkgdG9rZW4nKVxuICAuYWN0aW9uKGFzeW5jIChpZDogc3RyaW5nKSA9PiB7XG4gICAgYXdhaXQgZmV0Y2hKc29uKGFwaVVybChgL2FkbWluL2FwaS10b2tlbnMvJHtpZH1gKSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgIGNvbnNvbGUubG9nKCdUb2tlbiByZXZva2VkLicpO1xuICB9KTtcblxuYXBpVG9rZW5Db21tYW5kXG4gIC5jb21tYW5kKCdyZXZva2UtYmF0Y2gnKVxuICAuZGVzY3JpcHRpb24oJ1Jldm9rZSBtdWx0aXBsZSBBUEkgdG9rZW5zIGF0IG9uY2UgKEFkbWluIG9ubHkpJylcbiAgLnJlcXVpcmVkT3B0aW9uKCctLWlkcyA8aWRzPicsICdDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0b2tlbiBJRHMgdG8gcmV2b2tlJylcbiAgLmFjdGlvbihhc3luYyAob3B0czogeyBpZHM6IHN0cmluZyB9KSA9PiB7XG4gICAgY29uc3QgaWRzID0gb3B0cy5pZHMuc3BsaXQoJywnKS5tYXAoKGlkKSA9PiBpZC50cmltKCkpLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcignTm8gSURzIHByb3ZpZGVkLicpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBhd2FpdCBmZXRjaEpzb24oYXBpVXJsKCcvYWRtaW4vYXBpLXRva2Vucy9yZXZva2UtYmF0Y2gnKSwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaWRzIH0pLFxuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKGAke2lkcy5sZW5ndGh9IHRva2VuKHMpIHJldm9rZWQuYCk7XG4gIH0pO1xuIl19
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.authCommand = void 0;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const auth_1 = require("../auth");
|
|
6
|
+
const loginSubCommand = new commander_1.Command('login')
|
|
7
|
+
.description('Login into GENI Workflows and store credentials')
|
|
8
|
+
.option('--email <email>', 'User email')
|
|
9
|
+
.option('--password <password>', 'User password')
|
|
10
|
+
.action(async (opts) => {
|
|
11
|
+
if (!opts.email || !opts.password) {
|
|
12
|
+
loginSubCommand.help();
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const res = await fetch((0, auth_1.apiUrl)('/auth/login'), {
|
|
16
|
+
method: 'POST',
|
|
17
|
+
headers: { 'Content-Type': 'application/json' },
|
|
18
|
+
body: JSON.stringify({ email: opts.email, password: opts.password }),
|
|
19
|
+
});
|
|
20
|
+
const data = await (0, auth_1.readJsonResponse)(res, { method: 'POST', url: (0, auth_1.apiUrl)('/auth/login') });
|
|
21
|
+
(0, auth_1.saveCredentials)(data.accessToken);
|
|
22
|
+
console.log('Logged in. Credentials saved to ~/.geni/credentials.json');
|
|
23
|
+
});
|
|
24
|
+
const activateSubCommand = new commander_1.Command('activate')
|
|
25
|
+
.description('Activate your user account')
|
|
26
|
+
.requiredOption('--token <token>', 'Activation token from the email link')
|
|
27
|
+
.requiredOption('--password <password>', 'Password to set for your account')
|
|
28
|
+
.action(async (opts) => {
|
|
29
|
+
const res = await fetch((0, auth_1.apiUrl)('/auth/activate'), {
|
|
30
|
+
method: 'POST',
|
|
31
|
+
headers: { 'Content-Type': 'application/json' },
|
|
32
|
+
body: JSON.stringify({ token: opts.token, password: opts.password }),
|
|
33
|
+
});
|
|
34
|
+
const data = await (0, auth_1.readJsonResponse)(res, { method: 'POST', url: (0, auth_1.apiUrl)('/auth/activate') });
|
|
35
|
+
(0, auth_1.saveCredentials)(data.accessToken);
|
|
36
|
+
console.log('Account activated. Credentials saved to ~/.geni/credentials.json');
|
|
37
|
+
});
|
|
38
|
+
const resetSubCommand = new commander_1.Command('reset')
|
|
39
|
+
.description('Request a password reset email')
|
|
40
|
+
.requiredOption('--email <email>', 'Email address of the account')
|
|
41
|
+
.action(async (opts) => {
|
|
42
|
+
const res = await fetch((0, auth_1.apiUrl)('/auth/forgot-password'), {
|
|
43
|
+
method: 'POST',
|
|
44
|
+
headers: { 'Content-Type': 'application/json' },
|
|
45
|
+
body: JSON.stringify({ email: opts.email }),
|
|
46
|
+
});
|
|
47
|
+
await (0, auth_1.readJsonResponse)(res, { method: 'POST', url: (0, auth_1.apiUrl)('/auth/reset') });
|
|
48
|
+
console.log('Password reset email sent.');
|
|
49
|
+
});
|
|
50
|
+
exports.authCommand = new commander_1.Command('auth')
|
|
51
|
+
.description('Authentication commands')
|
|
52
|
+
.addCommand(loginSubCommand)
|
|
53
|
+
.addCommand(activateSubCommand)
|
|
54
|
+
.addCommand(resetSubCommand);
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFvQztBQUNwQyxrQ0FBb0U7QUFFcEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxtQkFBTyxDQUFDLE9BQU8sQ0FBQztLQUN6QyxXQUFXLENBQUMsaURBQWlELENBQUM7S0FDOUQsTUFBTSxDQUFDLGlCQUFpQixFQUFFLFlBQVksQ0FBQztLQUN2QyxNQUFNLENBQUMsdUJBQXVCLEVBQUUsZUFBZSxDQUFDO0tBQ2hELE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBMkMsRUFBRSxFQUFFO0lBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUN0QixPQUFNO0lBQ1IsQ0FBQztJQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUEsYUFBTSxFQUFDLGFBQWEsQ0FBQyxFQUFFO1FBQzdDLE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1FBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUNyRSxDQUFDLENBQUM7SUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUEsdUJBQWdCLEVBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBQSxhQUFNLEVBQUMsYUFBYSxDQUFDLEVBQUUsQ0FFdEYsQ0FBQztJQUNGLElBQUEsc0JBQWUsRUFBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQywwREFBMEQsQ0FBQyxDQUFDO0FBQzFFLENBQUMsQ0FBQyxDQUFDO0FBRUwsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLG1CQUFPLENBQUMsVUFBVSxDQUFDO0tBQy9DLFdBQVcsQ0FBQyw0QkFBNEIsQ0FBQztLQUN6QyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsc0NBQXNDLENBQUM7S0FDekUsY0FBYyxDQUFDLHVCQUF1QixFQUFFLGtDQUFrQyxDQUFDO0tBQzNFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBeUMsRUFBRSxFQUFFO0lBQzFELE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUEsYUFBTSxFQUFDLGdCQUFnQixDQUFDLEVBQUU7UUFDaEQsTUFBTSxFQUFFLE1BQU07UUFDZCxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7UUFDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQ3JFLENBQUMsQ0FBQztJQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBQSx1QkFBZ0IsRUFBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFBLGFBQU0sRUFBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBRXpGLENBQUM7SUFDRixJQUFBLHNCQUFlLEVBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0VBQWtFLENBQUMsQ0FBQztBQUNsRixDQUFDLENBQUMsQ0FBQztBQUVMLE1BQU0sZUFBZSxHQUFHLElBQUksbUJBQU8sQ0FBQyxPQUFPLENBQUM7S0FDekMsV0FBVyxDQUFDLGdDQUFnQyxDQUFDO0tBQzdDLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSw4QkFBOEIsQ0FBQztLQUNqRSxNQUFNLENBQUMsS0FBSyxFQUFFLElBQXVCLEVBQUUsRUFBRTtJQUN4QyxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFBLGFBQU0sRUFBQyx1QkFBdUIsQ0FBQyxFQUFFO1FBQ3ZELE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1FBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztLQUM1QyxDQUFDLENBQUM7SUFDSCxNQUFNLElBQUEsdUJBQWdCLEVBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBQSxhQUFNLEVBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQztBQUM1QyxDQUFDLENBQUMsQ0FBQztBQUVRLFFBQUEsV0FBVyxHQUFHLElBQUksbUJBQU8sQ0FBQyxNQUFNLENBQUM7S0FDM0MsV0FBVyxDQUFDLHlCQUF5QixDQUFDO0tBQ3RDLFVBQVUsQ0FBQyxlQUFlLENBQUM7S0FDM0IsVUFBVSxDQUFDLGtCQUFrQixDQUFDO0tBQzlCLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgYXBpVXJsLCByZWFkSnNvblJlc3BvbnNlLCBzYXZlQ3JlZGVudGlhbHMgfSBmcm9tICcuLi9hdXRoJztcblxuY29uc3QgbG9naW5TdWJDb21tYW5kID0gbmV3IENvbW1hbmQoJ2xvZ2luJylcbiAgLmRlc2NyaXB0aW9uKCdMb2dpbiBpbnRvIEdFTkkgV29ya2Zsb3dzIGFuZCBzdG9yZSBjcmVkZW50aWFscycpXG4gIC5vcHRpb24oJy0tZW1haWwgPGVtYWlsPicsICdVc2VyIGVtYWlsJylcbiAgLm9wdGlvbignLS1wYXNzd29yZCA8cGFzc3dvcmQ+JywgJ1VzZXIgcGFzc3dvcmQnKVxuICAuYWN0aW9uKGFzeW5jIChvcHRzOiB7IGVtYWlsPzogc3RyaW5nOyBwYXNzd29yZD86IHN0cmluZyB9KSA9PiB7XG4gICAgaWYgKCFvcHRzLmVtYWlsIHx8ICFvcHRzLnBhc3N3b3JkKSB7XG4gICAgICBsb2dpblN1YkNvbW1hbmQuaGVscCgpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYXBpVXJsKCcvYXV0aC9sb2dpbicpLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBlbWFpbDogb3B0cy5lbWFpbCwgcGFzc3dvcmQ6IG9wdHMucGFzc3dvcmQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlYWRKc29uUmVzcG9uc2UocmVzLCB7IG1ldGhvZDogJ1BPU1QnLCB1cmw6IGFwaVVybCgnL2F1dGgvbG9naW4nKSB9KSBhcyB7XG4gICAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIH07XG4gICAgc2F2ZUNyZWRlbnRpYWxzKGRhdGEuYWNjZXNzVG9rZW4pO1xuICAgIGNvbnNvbGUubG9nKCdMb2dnZWQgaW4uIENyZWRlbnRpYWxzIHNhdmVkIHRvIH4vLmdlbmkvY3JlZGVudGlhbHMuanNvbicpO1xuICB9KTtcblxuY29uc3QgYWN0aXZhdGVTdWJDb21tYW5kID0gbmV3IENvbW1hbmQoJ2FjdGl2YXRlJylcbiAgLmRlc2NyaXB0aW9uKCdBY3RpdmF0ZSB5b3VyIHVzZXIgYWNjb3VudCcpXG4gIC5yZXF1aXJlZE9wdGlvbignLS10b2tlbiA8dG9rZW4+JywgJ0FjdGl2YXRpb24gdG9rZW4gZnJvbSB0aGUgZW1haWwgbGluaycpXG4gIC5yZXF1aXJlZE9wdGlvbignLS1wYXNzd29yZCA8cGFzc3dvcmQ+JywgJ1Bhc3N3b3JkIHRvIHNldCBmb3IgeW91ciBhY2NvdW50JylcbiAgLmFjdGlvbihhc3luYyAob3B0czogeyB0b2tlbjogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH0pID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChhcGlVcmwoJy9hdXRoL2FjdGl2YXRlJyksIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHRva2VuOiBvcHRzLnRva2VuLCBwYXNzd29yZDogb3B0cy5wYXNzd29yZCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEpzb25SZXNwb25zZShyZXMsIHsgbWV0aG9kOiAnUE9TVCcsIHVybDogYXBpVXJsKCcvYXV0aC9hY3RpdmF0ZScpIH0pIGFzIHtcbiAgICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gICAgfTtcbiAgICBzYXZlQ3JlZGVudGlhbHMoZGF0YS5hY2Nlc3NUb2tlbik7XG4gICAgY29uc29sZS5sb2coJ0FjY291bnQgYWN0aXZhdGVkLiBDcmVkZW50aWFscyBzYXZlZCB0byB+Ly5nZW5pL2NyZWRlbnRpYWxzLmpzb24nKTtcbiAgfSk7XG5cbmNvbnN0IHJlc2V0U3ViQ29tbWFuZCA9IG5ldyBDb21tYW5kKCdyZXNldCcpXG4gIC5kZXNjcmlwdGlvbignUmVxdWVzdCBhIHBhc3N3b3JkIHJlc2V0IGVtYWlsJylcbiAgLnJlcXVpcmVkT3B0aW9uKCctLWVtYWlsIDxlbWFpbD4nLCAnRW1haWwgYWRkcmVzcyBvZiB0aGUgYWNjb3VudCcpXG4gIC5hY3Rpb24oYXN5bmMgKG9wdHM6IHsgZW1haWw6IHN0cmluZyB9KSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYXBpVXJsKCcvYXV0aC9mb3Jnb3QtcGFzc3dvcmQnKSwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZW1haWw6IG9wdHMuZW1haWwgfSksXG4gICAgfSk7XG4gICAgYXdhaXQgcmVhZEpzb25SZXNwb25zZShyZXMsIHsgbWV0aG9kOiAnUE9TVCcsIHVybDogYXBpVXJsKCcvYXV0aC9yZXNldCcpIH0pO1xuICAgIGNvbnNvbGUubG9nKCdQYXNzd29yZCByZXNldCBlbWFpbCBzZW50LicpO1xuICB9KTtcblxuZXhwb3J0IGNvbnN0IGF1dGhDb21tYW5kID0gbmV3IENvbW1hbmQoJ2F1dGgnKVxuICAuZGVzY3JpcHRpb24oJ0F1dGhlbnRpY2F0aW9uIGNvbW1hbmRzJylcbiAgLmFkZENvbW1hbmQobG9naW5TdWJDb21tYW5kKVxuICAuYWRkQ29tbWFuZChhY3RpdmF0ZVN1YkNvbW1hbmQpXG4gIC5hZGRDb21tYW5kKHJlc2V0U3ViQ29tbWFuZCk7XG4iXX0=
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.engineCommand = void 0;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const auth_1 = require("../auth");
|
|
6
|
+
const format_js_1 = require("../format.js");
|
|
7
|
+
const errors_js_1 = require("../errors.js");
|
|
8
|
+
function parseS3Uri(uri) {
|
|
9
|
+
const match = uri.match(/^s3:\/\/([^/]+)(\/(.+))?$/);
|
|
10
|
+
if (!match)
|
|
11
|
+
throw (0, errors_js_1.invalidArgument)(`Invalid S3 URI: "${uri}". Expected format: s3://bucket or s3://bucket/prefix`);
|
|
12
|
+
return { bucketName: match[1], prefix: match[3] || undefined };
|
|
13
|
+
}
|
|
14
|
+
const collect = (val, prev) => [...prev, val];
|
|
15
|
+
exports.engineCommand = new commander_1.Command('engine')
|
|
16
|
+
.description('Manage engines');
|
|
17
|
+
exports.engineCommand
|
|
18
|
+
.command('list')
|
|
19
|
+
.description('List engines')
|
|
20
|
+
.option('--status <status>', 'Filter by status (e.g. ACTIVE, PENDING, FAILED, DELETED)')
|
|
21
|
+
.addOption(new commander_1.Option('--format <format>', 'Output format').choices(['table', 'json', 'csv']).default('table'))
|
|
22
|
+
.action(async (opts) => {
|
|
23
|
+
const params = new URLSearchParams();
|
|
24
|
+
if (opts.status)
|
|
25
|
+
params.set('status', opts.status);
|
|
26
|
+
if (process.env.GENI_TENANT_ID)
|
|
27
|
+
params.set('tenantId', process.env.GENI_TENANT_ID);
|
|
28
|
+
const query = params.size ? `?${params}` : '';
|
|
29
|
+
const data = await (0, auth_1.fetchJson)((0, auth_1.apiUrl)(`/admin/engines${query}`));
|
|
30
|
+
(0, format_js_1.formatOutput)(opts.format === 'json' ? data : data.items, opts.format, format_js_1.engineColumns);
|
|
31
|
+
});
|
|
32
|
+
exports.engineCommand
|
|
33
|
+
.command('get <id>')
|
|
34
|
+
.description('Get an engine by ID')
|
|
35
|
+
.addOption(new commander_1.Option('--format <format>', 'Output format').choices(['table', 'json', 'csv']).default('table'))
|
|
36
|
+
.action(async (id, opts) => {
|
|
37
|
+
const query = process.env.GENI_TENANT_ID ? `?tenantId=${process.env.GENI_TENANT_ID}` : '';
|
|
38
|
+
const data = await (0, auth_1.fetchJson)((0, auth_1.apiUrl)(`/admin/engines/${id}${query}`));
|
|
39
|
+
(0, format_js_1.formatOutput)(data, opts.format, format_js_1.engineColumns);
|
|
40
|
+
});
|
|
41
|
+
exports.engineCommand
|
|
42
|
+
.command('delete <id>')
|
|
43
|
+
.description('Delete an engine')
|
|
44
|
+
.addOption(new commander_1.Option('--format <format>', 'Output format').choices(['table', 'json', 'csv']).default('table'))
|
|
45
|
+
.action(async (id, opts) => {
|
|
46
|
+
const query = process.env.GENI_TENANT_ID ? `?tenantId=${process.env.GENI_TENANT_ID}` : '';
|
|
47
|
+
const data = await (0, auth_1.fetchJson)((0, auth_1.apiUrl)(`/admin/engines/${id}${query}`), {
|
|
48
|
+
method: 'DELETE',
|
|
49
|
+
});
|
|
50
|
+
(0, format_js_1.formatOutput)(data, opts.format, format_js_1.engineColumns);
|
|
51
|
+
});
|
|
52
|
+
exports.engineCommand
|
|
53
|
+
.command('create')
|
|
54
|
+
.description('Create an engine')
|
|
55
|
+
.requiredOption('--name <name>', 'Engine name')
|
|
56
|
+
.requiredOption('--environment-id <id>', 'Environment ID')
|
|
57
|
+
.option('--engine <engine>', 'Engine type', 'nextflow')
|
|
58
|
+
.option('--engine-version <version>', 'Engine version', '25.10.4')
|
|
59
|
+
.option('--read-only <uri>', 'Read-only access to S3 bucket/prefix, e.g. s3://bucket/prefix (repeatable)', collect, [])
|
|
60
|
+
.option('--read-write <uri>', 'Read-write access to S3 bucket/prefix (repeatable)', collect, [])
|
|
61
|
+
.option('--write-only <uri>', 'Write-only access to S3 bucket/prefix (repeatable)', collect, [])
|
|
62
|
+
.addOption(new commander_1.Option('--format <format>', 'Output format').choices(['table', 'json', 'csv']).default('table'))
|
|
63
|
+
.action(async (opts) => {
|
|
64
|
+
const s3Buckets = [
|
|
65
|
+
...opts.readOnly.map(u => ({ ...parseS3Uri(u), permissionMode: 'read-only' })),
|
|
66
|
+
...opts.readWrite.map(u => ({ ...parseS3Uri(u), permissionMode: 'read-write' })),
|
|
67
|
+
...opts.writeOnly.map(u => ({ ...parseS3Uri(u), permissionMode: 'write-only' })),
|
|
68
|
+
];
|
|
69
|
+
const data = await (0, auth_1.fetchJson)((0, auth_1.apiUrl)('/admin/engines'), {
|
|
70
|
+
method: 'POST',
|
|
71
|
+
headers: { 'Content-Type': 'application/json' },
|
|
72
|
+
body: JSON.stringify({
|
|
73
|
+
name: opts.name,
|
|
74
|
+
environmentId: opts.environmentId,
|
|
75
|
+
engine: opts.engine,
|
|
76
|
+
engineVersion: opts.engineVersion,
|
|
77
|
+
...(s3Buckets.length > 0 ? { s3Buckets } : {}),
|
|
78
|
+
...(process.env.GENI_TENANT_ID ? { tenantId: process.env.GENI_TENANT_ID } : {}),
|
|
79
|
+
}),
|
|
80
|
+
});
|
|
81
|
+
(0, format_js_1.formatOutput)(data, opts.format, format_js_1.engineColumns);
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2VuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBMkM7QUFDM0Msa0NBQTJDO0FBQzNDLDRDQUE2RTtBQUM3RSw0Q0FBOEM7QUFVOUMsU0FBUyxVQUFVLENBQUMsR0FBVztJQUM3QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDcEQsSUFBSSxDQUFDLEtBQUs7UUFBRSxNQUFNLElBQUEsMkJBQWUsRUFBQyxvQkFBb0IsR0FBRyx1REFBdUQsQ0FBQyxDQUFBO0lBQ2pILE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxFQUFFLENBQUE7QUFDaEUsQ0FBQztBQUVELE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQTtBQUVsRCxRQUFBLGFBQWEsR0FBRyxJQUFJLG1CQUFPLENBQUMsUUFBUSxDQUFDO0tBQy9DLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0FBRWhDLHFCQUFhO0tBQ1YsT0FBTyxDQUFDLE1BQU0sQ0FBQztLQUNmLFdBQVcsQ0FBQyxjQUFjLENBQUM7S0FDM0IsTUFBTSxDQUFDLG1CQUFtQixFQUFFLDBEQUEwRCxDQUFDO0tBQ3ZGLFNBQVMsQ0FBQyxJQUFJLGtCQUFNLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUM5RyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQStDLEVBQUUsRUFBRTtJQUNoRSxN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QUFDLEVBQUUsY0FBYyxFQUFFLFlBQThCLEVBQUUsQ0FBQyxDQUFDO0tBQ25HLENBQUE7SUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUEsZ0JBQVMsRUFBQyxJQUFBLGFBQU0sRUFBQyxnQkFBZ0IsQ0FBQyxFQUFFO1FBQ3JELE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1FBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ2hGLENBQUM7S0FDSCxDQUFDLENBQUE7SUFDRixJQUFBLHdCQUFZLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUseUJBQWEsQ0FBQyxDQUFBO0FBQ2hELENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY29tbWFuZGVyJ1xuaW1wb3J0IHsgYXBpVXJsLCBmZXRjaEpzb24gfSBmcm9tICcuLi9hdXRoJ1xuaW1wb3J0IHsgZm9ybWF0T3V0cHV0LCBlbmdpbmVDb2x1bW5zLCB0eXBlIE91dHB1dEZvcm1hdCB9IGZyb20gJy4uL2Zvcm1hdC5qcydcbmltcG9ydCB7IGludmFsaWRBcmd1bWVudCB9IGZyb20gJy4uL2Vycm9ycy5qcydcblxudHlwZSBQZXJtaXNzaW9uTW9kZSA9ICdyZWFkLW9ubHknIHwgJ3JlYWQtd3JpdGUnIHwgJ3dyaXRlLW9ubHknXG5cbmludGVyZmFjZSBTM0J1Y2tldFBlcm1pc3Npb24ge1xuICBidWNrZXROYW1lOiBzdHJpbmdcbiAgcHJlZml4Pzogc3RyaW5nXG4gIHBlcm1pc3Npb25Nb2RlOiBQZXJtaXNzaW9uTW9kZVxufVxuXG5mdW5jdGlvbiBwYXJzZVMzVXJpKHVyaTogc3RyaW5nKTogeyBidWNrZXROYW1lOiBzdHJpbmc7IHByZWZpeD86IHN0cmluZyB9IHtcbiAgY29uc3QgbWF0Y2ggPSB1cmkubWF0Y2goL15zMzpcXC9cXC8oW14vXSspKFxcLyguKykpPyQvKVxuICBpZiAoIW1hdGNoKSB0aHJvdyBpbnZhbGlkQXJndW1lbnQoYEludmFsaWQgUzMgVVJJOiBcIiR7dXJpfVwiLiBFeHBlY3RlZCBmb3JtYXQ6IHMzOi8vYnVja2V0IG9yIHMzOi8vYnVja2V0L3ByZWZpeGApXG4gIHJldHVybiB7IGJ1Y2tldE5hbWU6IG1hdGNoWzFdLCBwcmVmaXg6IG1hdGNoWzNdIHx8IHVuZGVmaW5lZCB9XG59XG5cbmNvbnN0IGNvbGxlY3QgPSAodmFsOiBzdHJpbmcsIHByZXY6IHN0cmluZ1tdKSA9PiBbLi4ucHJldiwgdmFsXVxuXG5leHBvcnQgY29uc3QgZW5naW5lQ29tbWFuZCA9IG5ldyBDb21tYW5kKCdlbmdpbmUnKVxuICAuZGVzY3JpcHRpb24oJ01hbmFnZSBlbmdpbmVzJylcblxuZW5naW5lQ29tbWFuZFxuICAuY29tbWFuZCgnbGlzdCcpXG4gIC5kZXNjcmlwdGlvbignTGlzdCBlbmdpbmVzJylcbiAgLm9wdGlvbignLS1zdGF0dXMgPHN0YXR1cz4nLCAnRmlsdGVyIGJ5IHN0YXR1cyAoZS5nLiBBQ1RJVkUsIFBFTkRJTkcsIEZBSUxFRCwgREVMRVRFRCknKVxuICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQnKS5jaG9pY2VzKFsndGFibGUnLCAnanNvbicsICdjc3YnXSkuZGVmYXVsdCgndGFibGUnKSlcbiAgLmFjdGlvbihhc3luYyAob3B0czogeyBzdGF0dXM/OiBzdHJpbmc7IGZvcm1hdDogT3V0cHV0Rm9ybWF0IH0pID0+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgICBpZiAob3B0cy5zdGF0dXMpIHBhcmFtcy5zZXQoJ3N0YXR1cycsIG9wdHMuc3RhdHVzKVxuICAgIGlmIChwcm9jZXNzLmVudi5HRU5JX1RFTkFOVF9JRCkgcGFyYW1zLnNldCgndGVuYW50SWQnLCBwcm9jZXNzLmVudi5HRU5JX1RFTkFOVF9JRClcbiAgICBjb25zdCBxdWVyeSA9IHBhcmFtcy5zaXplID8gYD8ke3BhcmFtc31gIDogJydcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgZmV0Y2hKc29uKGFwaVVybChgL2FkbWluL2VuZ2luZXMke3F1ZXJ5fWApKSBhcyB7IGl0ZW1zOiB1bmtub3duW10gfVxuICAgIGZvcm1hdE91dHB1dChvcHRzLmZvcm1hdCA9PT0gJ2pzb24nID8gZGF0YSA6IGRhdGEuaXRlbXMsIG9wdHMuZm9ybWF0LCBlbmdpbmVDb2x1bW5zKVxuICB9KVxuXG5lbmdpbmVDb21tYW5kXG4gIC5jb21tYW5kKCdnZXQgPGlkPicpXG4gIC5kZXNjcmlwdGlvbignR2V0IGFuIGVuZ2luZSBieSBJRCcpXG4gIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1mb3JtYXQgPGZvcm1hdD4nLCAnT3V0cHV0IGZvcm1hdCcpLmNob2ljZXMoWyd0YWJsZScsICdqc29uJywgJ2NzdiddKS5kZWZhdWx0KCd0YWJsZScpKVxuICAuYWN0aW9uKGFzeW5jIChpZDogc3RyaW5nLCBvcHRzOiB7IGZvcm1hdDogT3V0cHV0Rm9ybWF0IH0pID0+IHtcbiAgICBjb25zdCBxdWVyeSA9IHByb2Nlc3MuZW52LkdFTklfVEVOQU5UX0lEID8gYD90ZW5hbnRJZD0ke3Byb2Nlc3MuZW52LkdFTklfVEVOQU5UX0lEfWAgOiAnJ1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaEpzb24oYXBpVXJsKGAvYWRtaW4vZW5naW5lcy8ke2lkfSR7cXVlcnl9YCkpXG4gICAgZm9ybWF0T3V0cHV0KGRhdGEsIG9wdHMuZm9ybWF0LCBlbmdpbmVDb2x1bW5zKVxuICB9KVxuXG5lbmdpbmVDb21tYW5kXG4gIC5jb21tYW5kKCdkZWxldGUgPGlkPicpXG4gIC5kZXNjcmlwdGlvbignRGVsZXRlIGFuIGVuZ2luZScpXG4gIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1mb3JtYXQgPGZvcm1hdD4nLCAnT3V0cHV0IGZvcm1hdCcpLmNob2ljZXMoWyd0YWJsZScsICdqc29uJywgJ2NzdiddKS5kZWZhdWx0KCd0YWJsZScpKVxuICAuYWN0aW9uKGFzeW5jIChpZDogc3RyaW5nLCBvcHRzOiB7IGZvcm1hdDogT3V0cHV0Rm9ybWF0IH0pID0+IHtcbiAgICBjb25zdCBxdWVyeSA9IHByb2Nlc3MuZW52LkdFTklfVEVOQU5UX0lEID8gYD90ZW5hbnRJZD0ke3Byb2Nlc3MuZW52LkdFTklfVEVOQU5UX0lEfWAgOiAnJ1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaEpzb24oYXBpVXJsKGAvYWRtaW4vZW5naW5lcy8ke2lkfSR7cXVlcnl9YCksIHtcbiAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgfSlcbiAgICBmb3JtYXRPdXRwdXQoZGF0YSwgb3B0cy5mb3JtYXQsIGVuZ2luZUNvbHVtbnMpXG4gIH0pXG5cbmVuZ2luZUNvbW1hbmRcbiAgLmNvbW1hbmQoJ2NyZWF0ZScpXG4gIC5kZXNjcmlwdGlvbignQ3JlYXRlIGFuIGVuZ2luZScpXG4gIC5yZXF1aXJlZE9wdGlvbignLS1uYW1lIDxuYW1lPicsICdFbmdpbmUgbmFtZScpXG4gIC5yZXF1aXJlZE9wdGlvbignLS1lbnZpcm9ubWVudC1pZCA8aWQ+JywgJ0Vudmlyb25tZW50IElEJylcbiAgLm9wdGlvbignLS1lbmdpbmUgPGVuZ2luZT4nLCAnRW5naW5lIHR5cGUnLCAnbmV4dGZsb3cnKVxuICAub3B0aW9uKCctLWVuZ2luZS12ZXJzaW9uIDx2ZXJzaW9uPicsICdFbmdpbmUgdmVyc2lvbicsICcyNS4xMC40JylcbiAgLm9wdGlvbignLS1yZWFkLW9ubHkgPHVyaT4nLCAnUmVhZC1vbmx5IGFjY2VzcyB0byBTMyBidWNrZXQvcHJlZml4LCBlLmcuIHMzOi8vYnVja2V0L3ByZWZpeCAocmVwZWF0YWJsZSknLCBjb2xsZWN0LCBbXSBhcyBzdHJpbmdbXSlcbiAgLm9wdGlvbignLS1yZWFkLXdyaXRlIDx1cmk+JywgJ1JlYWQtd3JpdGUgYWNjZXNzIHRvIFMzIGJ1Y2tldC9wcmVmaXggKHJlcGVhdGFibGUpJywgY29sbGVjdCwgW10gYXMgc3RyaW5nW10pXG4gIC5vcHRpb24oJy0td3JpdGUtb25seSA8dXJpPicsICdXcml0ZS1vbmx5IGFjY2VzcyB0byBTMyBidWNrZXQvcHJlZml4IChyZXBlYXRhYmxlKScsIGNvbGxlY3QsIFtdIGFzIHN0cmluZ1tdKVxuICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQnKS5jaG9pY2VzKFsndGFibGUnLCAnanNvbicsICdjc3YnXSkuZGVmYXVsdCgndGFibGUnKSlcbiAgLmFjdGlvbihhc3luYyAob3B0czoge1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGVudmlyb25tZW50SWQ6IHN0cmluZ1xuICAgIGVuZ2luZTogc3RyaW5nXG4gICAgZW5naW5lVmVyc2lvbjogc3RyaW5nXG4gICAgcmVhZE9ubHk6IHN0cmluZ1tdXG4gICAgcmVhZFdyaXRlOiBzdHJpbmdbXVxuICAgIHdyaXRlT25seTogc3RyaW5nW11cbiAgICBmb3JtYXQ6IE91dHB1dEZvcm1hdFxuICB9KSA9PiB7XG4gICAgY29uc3QgczNCdWNrZXRzOiBTM0J1Y2tldFBlcm1pc3Npb25bXSA9IFtcbiAgICAgIC4uLm9wdHMucmVhZE9ubHkubWFwKHUgPT4gKHsgLi4ucGFyc2VTM1VyaSh1KSwgcGVybWlzc2lvbk1vZGU6ICdyZWFkLW9ubHknIGFzIFBlcm1pc3Npb25Nb2RlIH0pKSxcbiAgICAgIC4uLm9wdHMucmVhZFdyaXRlLm1hcCh1ID0+ICh7IC4uLnBhcnNlUzNVcmkodSksIHBlcm1pc3Npb25Nb2RlOiAncmVhZC13cml0ZScgYXMgUGVybWlzc2lvbk1vZGUgfSkpLFxuICAgICAgLi4ub3B0cy53cml0ZU9ubHkubWFwKHUgPT4gKHsgLi4ucGFyc2VTM1VyaSh1KSwgcGVybWlzc2lvbk1vZGU6ICd3cml0ZS1vbmx5JyBhcyBQZXJtaXNzaW9uTW9kZSB9KSksXG4gICAgXVxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaEpzb24oYXBpVXJsKCcvYWRtaW4vZW5naW5lcycpLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBuYW1lOiBvcHRzLm5hbWUsXG4gICAgICAgIGVudmlyb25tZW50SWQ6IG9wdHMuZW52aXJvbm1lbnRJZCxcbiAgICAgICAgZW5naW5lOiBvcHRzLmVuZ2luZSxcbiAgICAgICAgZW5naW5lVmVyc2lvbjogb3B0cy5lbmdpbmVWZXJzaW9uLFxuICAgICAgICAuLi4oczNCdWNrZXRzLmxlbmd0aCA+IDAgPyB7IHMzQnVja2V0cyB9IDoge30pLFxuICAgICAgICAuLi4ocHJvY2Vzcy5lbnYuR0VOSV9URU5BTlRfSUQgPyB7IHRlbmFudElkOiBwcm9jZXNzLmVudi5HRU5JX1RFTkFOVF9JRCB9IDoge30pLFxuICAgICAgfSksXG4gICAgfSlcbiAgICBmb3JtYXRPdXRwdXQoZGF0YSwgb3B0cy5mb3JtYXQsIGVuZ2luZUNvbHVtbnMpXG4gIH0pXG4iXX0=
|