alpic 0.0.0-dev.f52c42d → 0.0.0-dev.f54dad0
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/bin/run.js +5 -0
- package/dist/__tests__/auth.e2e.test.d.ts +1 -0
- package/dist/__tests__/auth.e2e.test.js +157 -0
- package/dist/__tests__/auth.e2e.test.js.map +1 -0
- package/dist/__tests__/deploy-flags.e2e.test.d.ts +1 -0
- package/dist/__tests__/deploy-flags.e2e.test.js +188 -0
- package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -0
- package/dist/__tests__/deploy.e2e.test.js +56 -61
- package/dist/__tests__/deploy.e2e.test.js.map +1 -1
- package/dist/__tests__/deployment-inspect.e2e.test.d.ts +1 -0
- package/dist/__tests__/deployment-inspect.e2e.test.js +114 -0
- package/dist/__tests__/deployment-inspect.e2e.test.js.map +1 -0
- package/dist/__tests__/deployment-list.e2e.test.d.ts +1 -0
- package/dist/__tests__/deployment-list.e2e.test.js +116 -0
- package/dist/__tests__/deployment-list.e2e.test.js.map +1 -0
- package/dist/__tests__/deployment-logs.e2e.test.d.ts +1 -0
- package/dist/__tests__/deployment-logs.e2e.test.js +255 -0
- package/dist/__tests__/deployment-logs.e2e.test.js.map +1 -0
- package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.d.ts +1 -0
- package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js +259 -0
- package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js.map +1 -0
- package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.d.ts +1 -0
- package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js +139 -0
- package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js.map +1 -0
- package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.d.ts +1 -0
- package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js +150 -0
- package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js.map +1 -0
- package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.d.ts +1 -0
- package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js +342 -0
- package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js.map +1 -0
- package/dist/__tests__/environment-variable/environment-variable-validation.test.d.ts +1 -0
- package/dist/__tests__/environment-variable/environment-variable-validation.test.js +20 -0
- package/dist/__tests__/environment-variable/environment-variable-validation.test.js.map +1 -0
- package/dist/__tests__/fixtures/demo-project/index.js +1 -1
- package/dist/__tests__/fixtures/demo-project/index.js.map +1 -1
- package/dist/__tests__/git-flags.e2e.test.d.ts +1 -0
- package/dist/__tests__/git-flags.e2e.test.js +124 -0
- package/dist/__tests__/git-flags.e2e.test.js.map +1 -0
- package/dist/__tests__/git.e2e.test.js +59 -20
- package/dist/__tests__/git.e2e.test.js.map +1 -1
- package/dist/__tests__/link.e2e.test.d.ts +1 -0
- package/dist/__tests__/link.e2e.test.js +279 -0
- package/dist/__tests__/link.e2e.test.js.map +1 -0
- package/dist/__tests__/logs.e2e.test.d.ts +1 -0
- package/dist/__tests__/logs.e2e.test.js +227 -0
- package/dist/__tests__/logs.e2e.test.js.map +1 -0
- package/dist/__tests__/mock-server.d.ts +20 -0
- package/dist/__tests__/mock-server.js +386 -13
- package/dist/__tests__/mock-server.js.map +1 -1
- package/dist/__tests__/publish.e2e.test.d.ts +1 -0
- package/dist/__tests__/publish.e2e.test.js +505 -0
- package/dist/__tests__/publish.e2e.test.js.map +1 -0
- package/dist/__tests__/tunnel.e2e.test.d.ts +1 -0
- package/dist/__tests__/tunnel.e2e.test.js +64 -0
- package/dist/__tests__/tunnel.e2e.test.js.map +1 -0
- package/dist/__tests__/utils.d.ts +23 -5
- package/dist/__tests__/utils.js +124 -20
- package/dist/__tests__/utils.js.map +1 -1
- package/dist/api.d.ts +1 -2
- package/dist/api.js +6 -10
- package/dist/api.js.map +1 -1
- package/dist/commands/deploy.d.ts +8 -2
- package/dist/commands/deploy.js +63 -28
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/deployment/inspect.d.ts +11 -0
- package/dist/commands/deployment/inspect.js +91 -0
- package/dist/commands/deployment/inspect.js.map +1 -0
- package/dist/commands/deployment/list.d.ts +11 -0
- package/dist/commands/deployment/list.js +97 -0
- package/dist/commands/deployment/list.js.map +1 -0
- package/dist/commands/deployment/logs.d.ts +12 -0
- package/dist/commands/deployment/logs.js +50 -0
- package/dist/commands/deployment/logs.js.map +1 -0
- package/dist/commands/environment-variable/add.d.ts +14 -0
- package/dist/commands/environment-variable/add.js +47 -0
- package/dist/commands/environment-variable/add.js.map +1 -0
- package/dist/commands/environment-variable/list.d.ts +9 -0
- package/dist/commands/environment-variable/list.js +45 -0
- package/dist/commands/environment-variable/list.js.map +1 -0
- package/dist/commands/environment-variable/remove.d.ts +11 -0
- package/dist/commands/environment-variable/remove.js +33 -0
- package/dist/commands/environment-variable/remove.js.map +1 -0
- package/dist/commands/environment-variable/update.d.ts +13 -0
- package/dist/commands/environment-variable/update.js +41 -0
- package/dist/commands/environment-variable/update.js.map +1 -0
- package/dist/commands/git/connect.d.ts +3 -2
- package/dist/commands/git/connect.js +29 -34
- package/dist/commands/git/connect.js.map +1 -1
- package/dist/commands/git/disconnect.d.ts +2 -2
- package/dist/commands/git/disconnect.js +20 -30
- package/dist/commands/git/disconnect.js.map +1 -1
- package/dist/commands/git.js +3 -3
- package/dist/commands/git.js.map +1 -1
- package/dist/commands/link.d.ts +17 -0
- package/dist/commands/link.js +101 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/login.d.ts +6 -0
- package/dist/commands/login.js +34 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +6 -0
- package/dist/commands/logout.js +20 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/logs.d.ts +16 -0
- package/dist/commands/logs.js +96 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/publish.d.ts +15 -0
- package/dist/commands/publish.js +51 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/tunnel.d.ts +9 -0
- package/dist/commands/tunnel.js +78 -0
- package/dist/commands/tunnel.js.map +1 -0
- package/dist/commands/whoami.d.ts +6 -0
- package/dist/commands/whoami.js +13 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/env.d.ts +4 -0
- package/dist/env.js +10 -0
- package/dist/env.js.map +1 -0
- package/dist/lib/alpic-command.d.ts +2 -0
- package/dist/lib/alpic-command.js +12 -5
- package/dist/lib/alpic-command.js.map +1 -1
- package/dist/lib/archive.d.ts +3 -3
- package/dist/lib/archive.js +11 -15
- package/dist/lib/archive.js.map +1 -1
- package/dist/lib/auth/auth.d.ts +2 -0
- package/dist/lib/auth/auth.js +21 -0
- package/dist/lib/auth/auth.js.map +1 -0
- package/dist/lib/auth/oauth/client.d.ts +28 -0
- package/dist/lib/auth/oauth/client.js +110 -0
- package/dist/lib/auth/oauth/client.js.map +1 -0
- package/dist/lib/auth/oauth/constants.d.ts +2 -0
- package/dist/lib/auth/oauth/constants.js +3 -0
- package/dist/lib/auth/oauth/constants.js.map +1 -0
- package/dist/lib/auth/oauth/server/assets/alpic-mountain.png +0 -0
- package/dist/lib/auth/oauth/server/assets/authorize.html +195 -0
- package/dist/lib/auth/oauth/server/assets/callback.html +88 -0
- package/dist/lib/auth/oauth/server/index.d.ts +8 -0
- package/dist/lib/auth/oauth/server/index.js +105 -0
- package/dist/lib/auth/oauth/server/index.js.map +1 -0
- package/dist/lib/auth/whoami.d.ts +1 -0
- package/dist/lib/auth/whoami.js +41 -0
- package/dist/lib/auth/whoami.js.map +1 -0
- package/dist/lib/base-workflow.d.ts +10 -0
- package/dist/lib/base-workflow.js +22 -0
- package/dist/lib/base-workflow.js.map +1 -0
- package/dist/lib/config.d.ts +3 -2
- package/dist/lib/config.js +8 -7
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/deployment.d.ts +70 -3
- package/dist/lib/deployment.js +121 -9
- package/dist/lib/deployment.js.map +1 -1
- package/dist/lib/environment-variable.d.ts +37 -0
- package/dist/lib/environment-variable.js +299 -0
- package/dist/lib/environment-variable.js.map +1 -0
- package/dist/lib/git.d.ts +12 -4
- package/dist/lib/git.js +52 -27
- package/dist/lib/git.js.map +1 -1
- package/dist/lib/global-store.d.ts +28 -0
- package/dist/lib/global-store.js +76 -0
- package/dist/lib/global-store.js.map +1 -0
- package/dist/lib/link.d.ts +83 -0
- package/dist/lib/link.js +387 -0
- package/dist/lib/link.js.map +1 -0
- package/dist/lib/logs.d.ts +20 -0
- package/dist/lib/logs.js +86 -0
- package/dist/lib/logs.js.map +1 -0
- package/dist/lib/publish.d.ts +22 -0
- package/dist/lib/publish.js +185 -0
- package/dist/lib/publish.js.map +1 -0
- package/dist/lib/resolve.d.ts +6 -0
- package/dist/lib/resolve.js +26 -0
- package/dist/lib/resolve.js.map +1 -0
- package/dist/lib/table.d.ts +8 -0
- package/dist/lib/table.js +27 -0
- package/dist/lib/table.js.map +1 -0
- package/dist/lib/telemetry.js +7 -7
- package/dist/lib/telemetry.js.map +1 -1
- package/dist/lib/utils.d.ts +4 -0
- package/dist/lib/utils.js +45 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/utils.test.d.ts +1 -0
- package/dist/lib/utils.test.js +27 -0
- package/dist/lib/utils.test.js.map +1 -0
- package/dist/types.d.ts +1 -0
- package/package.json +35 -21
- package/dist/lib/auth.d.ts +0 -1
- package/dist/lib/auth.js +0 -10
- package/dist/lib/auth.js.map +0 -1
- package/dist/lib/global-config.d.ts +0 -9
- package/dist/lib/global-config.js +0 -48
- package/dist/lib/global-config.js.map +0 -1
- package/dist/lib/project.d.ts +0 -67
- package/dist/lib/project.js +0 -285
- package/dist/lib/project.js.map +0 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { createServer } from "node:http";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import * as p from "@clack/prompts";
|
|
6
|
+
import { oAuthClient } from "../client.js";
|
|
7
|
+
import { LOOPBACK_HOST, LOOPBACK_PORT } from "../constants.js";
|
|
8
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const ASSETS_DIR = path.join(__dirname, "assets");
|
|
10
|
+
const createCallbackServer = ({ state, nonce, codeVerifier, authorizeUrl, onSuccess, onError, }) => createServer(async (req, res) => {
|
|
11
|
+
const url = req.url ?? "/";
|
|
12
|
+
const pathname = url.split("?")[0] ?? "/";
|
|
13
|
+
if (pathname === "/login") {
|
|
14
|
+
try {
|
|
15
|
+
const htmlPath = path.join(ASSETS_DIR, "authorize.html");
|
|
16
|
+
let html = await readFile(htmlPath, "utf-8");
|
|
17
|
+
if (authorizeUrl) {
|
|
18
|
+
html = html.replace(/%AUTH_BASE_URL%/g, authorizeUrl);
|
|
19
|
+
}
|
|
20
|
+
res.writeHead(200, {
|
|
21
|
+
"Content-Type": "text/html",
|
|
22
|
+
Connection: "close",
|
|
23
|
+
});
|
|
24
|
+
res.end(html);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
p.log.error(e instanceof Error ? e.message : String(e));
|
|
29
|
+
res.writeHead(500).end();
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (pathname === "/assets/alpic-mountain.png") {
|
|
34
|
+
const filePath = path.join(ASSETS_DIR, "alpic-mountain.png");
|
|
35
|
+
const content = await readFile(filePath);
|
|
36
|
+
res.writeHead(200, { "Content-Type": "image/png", Connection: "close" });
|
|
37
|
+
res.end(content);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (!url.startsWith("/callback")) {
|
|
41
|
+
res.writeHead(404).end();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const tokens = await oAuthClient.exchangeAuthorizationCode({
|
|
46
|
+
url: new URL(url, `http://${req.headers.host}`),
|
|
47
|
+
codeVerifier,
|
|
48
|
+
state,
|
|
49
|
+
nonce,
|
|
50
|
+
});
|
|
51
|
+
const sub = tokens.claims()?.sub;
|
|
52
|
+
if (!sub || !tokens.refresh_token) {
|
|
53
|
+
throw new Error("ID token did not contain sub");
|
|
54
|
+
}
|
|
55
|
+
const stored = {
|
|
56
|
+
access_token: tokens.access_token,
|
|
57
|
+
refresh_token: tokens.refresh_token,
|
|
58
|
+
expires_at: oAuthClient.getExpiresAt(tokens.expires_in ?? 0),
|
|
59
|
+
sub,
|
|
60
|
+
};
|
|
61
|
+
p.log.success("✅ Authentication successful");
|
|
62
|
+
const successHtmlPath = path.join(ASSETS_DIR, "callback.html");
|
|
63
|
+
let html = await readFile(successHtmlPath, "utf-8");
|
|
64
|
+
html = html
|
|
65
|
+
.replace(/__CALLBACK_STATUS__/g, "success")
|
|
66
|
+
.replace(/__CALLBACK_TITLE__/g, "You are logged in")
|
|
67
|
+
.replace(/__CALLBACK_SUB__/g, "You can close this page.");
|
|
68
|
+
res.writeHead(200, { "Content-Type": "text/html", Connection: "close" });
|
|
69
|
+
res.end(html);
|
|
70
|
+
onSuccess(stored);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
p.log.error(e instanceof Error ? e.message : String(e));
|
|
74
|
+
const callbackHtmlPath = path.join(ASSETS_DIR, "callback.html");
|
|
75
|
+
let html = await readFile(callbackHtmlPath, "utf-8");
|
|
76
|
+
html = html
|
|
77
|
+
.replace(/__CALLBACK_STATUS__/g, "error")
|
|
78
|
+
.replace(/__CALLBACK_TITLE__/g, "An error occurred. You can close this page.")
|
|
79
|
+
.replace(/__CALLBACK_SUB__/g, "");
|
|
80
|
+
res.writeHead(500, { "Content-Type": "text/html", Connection: "close" });
|
|
81
|
+
res.end(html);
|
|
82
|
+
onError(e instanceof Error ? e : new Error(String(e)));
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
export const getLoginPageUrl = () => `http://${LOOPBACK_HOST}:${LOOPBACK_PORT}/login`;
|
|
86
|
+
export const listenToOAuthCallback = ({ state, nonce, codeVerifier, authorizeUrl, }) => {
|
|
87
|
+
return new Promise((resolve, reject) => {
|
|
88
|
+
const callbackServer = createCallbackServer({
|
|
89
|
+
state,
|
|
90
|
+
nonce,
|
|
91
|
+
codeVerifier,
|
|
92
|
+
authorizeUrl,
|
|
93
|
+
onSuccess: (storedToken) => {
|
|
94
|
+
callbackServer.close();
|
|
95
|
+
resolve(storedToken);
|
|
96
|
+
},
|
|
97
|
+
onError: (err) => {
|
|
98
|
+
callbackServer.close();
|
|
99
|
+
reject(err);
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
callbackServer.listen(LOOPBACK_PORT, LOOPBACK_HOST);
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/lib/auth/oauth/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getWhoamiInfoMessage(): Promise<string>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { api } from "../../api.js";
|
|
3
|
+
import { oAuthClient } from "./oauth/client.js";
|
|
4
|
+
export async function getWhoamiInfoMessage() {
|
|
5
|
+
const info = (await getWhoamiInfoFromApiKey()) ?? (await getWhoamiInfoFromOAuth());
|
|
6
|
+
if (info === null) {
|
|
7
|
+
return "Not logged in. Run `alpic login` or set ALPIC_API_KEY.";
|
|
8
|
+
}
|
|
9
|
+
if (info.method === "api_key") {
|
|
10
|
+
return `Authenticated via API key — Team: ${chalk.green(info.team?.name ?? "unknown")}`;
|
|
11
|
+
}
|
|
12
|
+
return `Authenticated as ${chalk.green(info.name)} (${chalk.cyan(info.email)})`;
|
|
13
|
+
}
|
|
14
|
+
async function getWhoamiInfoFromApiKey() {
|
|
15
|
+
if (process.env.ALPIC_API_KEY === undefined) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
const team = await getApiKeyTeam();
|
|
19
|
+
return {
|
|
20
|
+
method: "api_key",
|
|
21
|
+
team,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
async function getWhoamiInfoFromOAuth() {
|
|
25
|
+
const token = await oAuthClient.getValidAccessToken();
|
|
26
|
+
if (!token)
|
|
27
|
+
return null;
|
|
28
|
+
const userInfo = await oAuthClient.fetchUserInfo(token);
|
|
29
|
+
if (!userInfo)
|
|
30
|
+
return null;
|
|
31
|
+
return {
|
|
32
|
+
method: "oauth",
|
|
33
|
+
email: userInfo.email ?? "unknown",
|
|
34
|
+
name: userInfo.name ?? "unknown",
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async function getApiKeyTeam() {
|
|
38
|
+
const teams = await api.teams.list.v1();
|
|
39
|
+
return teams[0];
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/lib/auth/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAahD,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,IAAI,GAAG,CAAC,MAAM,uBAAuB,EAAE,CAAC,IAAI,CAAC,MAAM,sBAAsB,EAAE,CAAC,CAAC;IAEnF,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,wDAAwD,CAAC;IAClE,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,qCAAqC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,SAAS,CAAC,EAAE,CAAC;IAC1F,CAAC;IAED,OAAO,oBAAoB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAClF,CAAC;AAED,KAAK,UAAU,uBAAuB;IACpC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,aAAa,EAAE,CAAC;IACnC,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,IAAI;KACL,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,sBAAsB;IACnC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,mBAAmB,EAAE,CAAC;IACtD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,OAAO;QACL,MAAM,EAAE,OAAO;QACf,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,SAAS;QAClC,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,SAAS;KACjC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IACxC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
export type Flags = {
|
|
3
|
+
"non-interactive"?: boolean;
|
|
4
|
+
};
|
|
5
|
+
export declare abstract class BaseWorkflow<F extends Flags = Flags> {
|
|
6
|
+
readonly flags: F;
|
|
7
|
+
constructor(flags: F);
|
|
8
|
+
protected confirm(options: p.ConfirmOptions, defaultValue?: boolean): Promise<boolean | symbol>;
|
|
9
|
+
protected isNonInteractive(): boolean;
|
|
10
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import * as ci from "ci-info";
|
|
3
|
+
export class BaseWorkflow {
|
|
4
|
+
flags;
|
|
5
|
+
constructor(flags) {
|
|
6
|
+
this.flags = flags;
|
|
7
|
+
}
|
|
8
|
+
confirm(options, defaultValue = true) {
|
|
9
|
+
if (this.isNonInteractive()) {
|
|
10
|
+
return Promise.resolve(defaultValue);
|
|
11
|
+
}
|
|
12
|
+
return p.confirm(options);
|
|
13
|
+
}
|
|
14
|
+
isNonInteractive() {
|
|
15
|
+
if (this.flags["non-interactive"])
|
|
16
|
+
return true;
|
|
17
|
+
if (process.env.VITEST)
|
|
18
|
+
return false;
|
|
19
|
+
return ci.isCI ?? false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=base-workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-workflow.js","sourceRoot":"","sources":["../../src/lib/base-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAM9B,MAAM,OAAgB,YAAY;IACJ;IAA5B,YAA4B,KAAQ;QAAR,UAAK,GAAL,KAAK,CAAG;IAAG,CAAC;IAE9B,OAAO,CAAC,OAAyB,EAAE,eAAwB,IAAI;QACvE,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC5B,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAES,gBAAgB;QACxB,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAErC,OAAO,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC;IAC1B,CAAC;CACF"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { ProjectConfig } from "../types.js";
|
|
2
2
|
export declare const config: {
|
|
3
|
-
load: (
|
|
3
|
+
load: () => {
|
|
4
4
|
projectId: string;
|
|
5
5
|
teamId: string;
|
|
6
|
+
teamName: string | undefined;
|
|
6
7
|
projectName: string;
|
|
7
8
|
environmentId: string | undefined;
|
|
8
9
|
environmentName: string | undefined;
|
|
9
10
|
} | null;
|
|
10
|
-
save: (
|
|
11
|
+
save: (projectConfig: ProjectConfig) => void;
|
|
11
12
|
};
|
package/dist/lib/config.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
const getProjectJsonPath = (
|
|
3
|
+
const getProjectJsonPath = () => join(process.cwd(), ".alpic", "project.json");
|
|
4
4
|
export const config = {
|
|
5
|
-
load: (
|
|
6
|
-
const path = getProjectJsonPath(
|
|
5
|
+
load: () => {
|
|
6
|
+
const path = getProjectJsonPath();
|
|
7
7
|
if (!existsSync(path)) {
|
|
8
8
|
return null;
|
|
9
9
|
}
|
|
@@ -17,15 +17,16 @@ export const config = {
|
|
|
17
17
|
return {
|
|
18
18
|
projectId: raw.projectId,
|
|
19
19
|
teamId: raw.teamId,
|
|
20
|
+
teamName: raw.teamName,
|
|
20
21
|
projectName: raw.projectName ?? raw.projectId,
|
|
21
22
|
environmentId: raw.environmentId,
|
|
22
23
|
environmentName: raw.environmentName,
|
|
23
24
|
};
|
|
24
25
|
},
|
|
25
|
-
save: (
|
|
26
|
-
const path = getProjectJsonPath(
|
|
27
|
-
mkdirSync(join(
|
|
28
|
-
writeFileSync(path, JSON.stringify(
|
|
26
|
+
save: (projectConfig) => {
|
|
27
|
+
const path = getProjectJsonPath();
|
|
28
|
+
mkdirSync(join(process.cwd(), ".alpic"), { recursive: true });
|
|
29
|
+
writeFileSync(path, JSON.stringify(projectConfig, null, 2));
|
|
29
30
|
},
|
|
30
31
|
};
|
|
31
32
|
//# sourceMappingURL=config.js.map
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,kBAAkB,GAAG,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;AAE/E,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,GAAG,EAAE;QACT,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;QAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,GAAmE,CAAC;QACxE,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAG1C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,kCAAmC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,OAAO;YACL,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS;YAC7C,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,eAAe,EAAE,GAAG,CAAC,eAAe;SACrC,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC,aAA4B,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;QAClC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;CACF,CAAC"}
|
package/dist/lib/deployment.d.ts
CHANGED
|
@@ -1,10 +1,72 @@
|
|
|
1
1
|
import type { RouterOutput } from "@alpic-ai/api";
|
|
2
|
+
export declare const colorizeDeploymentStatus: (text: string) => import("chalk").ChalkInstance | ((value: string) => string);
|
|
2
3
|
export declare function formatElapsed(ms: number): string;
|
|
3
|
-
export declare function
|
|
4
|
+
export declare function calculateDeploymentDuration(deployment: {
|
|
5
|
+
startedAt?: Date | null;
|
|
6
|
+
completedAt?: Date | null;
|
|
7
|
+
}): number | null;
|
|
8
|
+
export declare function fetchDeployment(deploymentId: string): Promise<{
|
|
9
|
+
id: string;
|
|
10
|
+
status: "ongoing" | "deployed" | "failed" | "canceled";
|
|
11
|
+
sourceRef: string | null;
|
|
12
|
+
sourceCommitId: string | null;
|
|
13
|
+
sourceCommitMessage: string | null;
|
|
14
|
+
authorUsername: string | null;
|
|
15
|
+
authorAvatarUrl: string | null;
|
|
16
|
+
startedAt: Date | null;
|
|
17
|
+
completedAt: Date | null;
|
|
18
|
+
environmentId: string;
|
|
19
|
+
environmentName: string;
|
|
20
|
+
isCurrent: boolean;
|
|
21
|
+
deploymentPageUrl: string | null;
|
|
22
|
+
}>;
|
|
23
|
+
export declare function fetchLatestDeploymentForEnvironment(environmentId: string): Promise<{
|
|
24
|
+
id: string;
|
|
25
|
+
status: "ongoing" | "deployed" | "failed" | "canceled";
|
|
26
|
+
sourceRef: string | null;
|
|
27
|
+
sourceCommitId: string | null;
|
|
28
|
+
sourceCommitMessage: string | null;
|
|
29
|
+
authorUsername: string | null;
|
|
30
|
+
authorAvatarUrl: string | null;
|
|
31
|
+
startedAt: Date | null;
|
|
32
|
+
completedAt: Date | null;
|
|
33
|
+
environmentId: string;
|
|
34
|
+
environmentName: string;
|
|
35
|
+
isCurrent: boolean;
|
|
36
|
+
deploymentPageUrl: string | null;
|
|
37
|
+
}>;
|
|
38
|
+
export declare function resolveDeploymentId(flags: {
|
|
39
|
+
"deployment-id"?: string;
|
|
40
|
+
"environment-id"?: string;
|
|
41
|
+
}): Promise<string>;
|
|
42
|
+
export declare function waitForDeployment(deployment: RouterOutput["deployments"]["get"]["v1"]): Promise<{
|
|
43
|
+
id: string;
|
|
44
|
+
status: "ongoing" | "deployed" | "failed" | "canceled";
|
|
45
|
+
sourceRef: string | null;
|
|
46
|
+
sourceCommitId: string | null;
|
|
47
|
+
sourceCommitMessage: string | null;
|
|
48
|
+
authorUsername: string | null;
|
|
49
|
+
authorAvatarUrl: string | null;
|
|
50
|
+
startedAt: Date | null;
|
|
51
|
+
completedAt: Date | null;
|
|
52
|
+
environmentId: string;
|
|
53
|
+
environmentName: string;
|
|
54
|
+
isCurrent: boolean;
|
|
55
|
+
deploymentPageUrl: string | null;
|
|
56
|
+
}>;
|
|
57
|
+
type DeploymentLogEntry = {
|
|
58
|
+
timestamp?: Date;
|
|
59
|
+
content?: string;
|
|
60
|
+
};
|
|
61
|
+
export declare function printDeploymentLog(log: DeploymentLogEntry, { noColor }?: {
|
|
62
|
+
noColor?: boolean;
|
|
63
|
+
}): void;
|
|
64
|
+
export declare function followDeploymentLogs(deploymentId: string, initialLogs: DeploymentLogEntry[], { noColor }?: {
|
|
65
|
+
noColor?: boolean;
|
|
66
|
+
}): Promise<void>;
|
|
67
|
+
export declare function deployAndWait({ initial, startedAt, }: {
|
|
4
68
|
initial: RouterOutput["deployments"]["get"]["v1"];
|
|
5
69
|
startedAt: number;
|
|
6
|
-
teamId: string;
|
|
7
|
-
projectId: string;
|
|
8
70
|
}): Promise<{
|
|
9
71
|
deployment: {
|
|
10
72
|
id: string;
|
|
@@ -16,6 +78,11 @@ export declare function deployAndWait({ initial, startedAt, teamId, projectId, }
|
|
|
16
78
|
authorAvatarUrl: string | null;
|
|
17
79
|
startedAt: Date | null;
|
|
18
80
|
completedAt: Date | null;
|
|
81
|
+
environmentId: string;
|
|
82
|
+
environmentName: string;
|
|
83
|
+
isCurrent: boolean;
|
|
84
|
+
deploymentPageUrl: string | null;
|
|
19
85
|
};
|
|
20
86
|
elapsedMs: number;
|
|
21
87
|
}>;
|
|
88
|
+
export {};
|
package/dist/lib/deployment.js
CHANGED
|
@@ -1,31 +1,143 @@
|
|
|
1
|
+
import { stripVTControlCharacters } from "node:util";
|
|
1
2
|
import * as p from "@clack/prompts";
|
|
2
3
|
import chalk from "chalk";
|
|
3
|
-
import { api
|
|
4
|
+
import { api } from "../api.js";
|
|
5
|
+
import { formatLogTimestamp } from "./logs.js";
|
|
6
|
+
import { resolveEnvironmentId } from "./resolve.js";
|
|
7
|
+
export const colorizeDeploymentStatus = (text) => {
|
|
8
|
+
switch (text) {
|
|
9
|
+
case "deployed":
|
|
10
|
+
return chalk.green;
|
|
11
|
+
case "ongoing":
|
|
12
|
+
return chalk.yellow;
|
|
13
|
+
case "failed":
|
|
14
|
+
return chalk.red;
|
|
15
|
+
case "canceled":
|
|
16
|
+
return chalk.gray;
|
|
17
|
+
default:
|
|
18
|
+
return (value) => value;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const FINAL_STATUSES = new Set(["deployed", "failed", "canceled"]);
|
|
22
|
+
const FIFTEEN_MINUTES_IN_MS = 15 * 60 * 1000;
|
|
4
23
|
export function formatElapsed(ms) {
|
|
5
24
|
const totalSeconds = Math.floor(ms / 1000);
|
|
6
25
|
const minutes = Math.floor(totalSeconds / 60);
|
|
7
26
|
const seconds = totalSeconds % 60;
|
|
8
27
|
return minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;
|
|
9
28
|
}
|
|
10
|
-
export
|
|
29
|
+
export function calculateDeploymentDuration(deployment) {
|
|
30
|
+
if (!deployment.startedAt || !deployment.completedAt) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return deployment.completedAt.getTime() - deployment.startedAt.getTime();
|
|
34
|
+
}
|
|
35
|
+
export async function fetchDeployment(deploymentId) {
|
|
36
|
+
const spinner = p.spinner();
|
|
37
|
+
spinner.start("Fetching deployment...");
|
|
38
|
+
const deployment = await api.deployments.get.v1({ deploymentId });
|
|
39
|
+
spinner.stop("Deployment found");
|
|
40
|
+
return deployment;
|
|
41
|
+
}
|
|
42
|
+
export async function fetchLatestDeploymentForEnvironment(environmentId) {
|
|
11
43
|
const spinner = p.spinner();
|
|
44
|
+
spinner.start("Fetching latest deployment...");
|
|
45
|
+
const environment = await api.environments.get.v1({ environmentId });
|
|
46
|
+
const deployments = await api.deployments.list.v1({
|
|
47
|
+
projectId: environment.projectId,
|
|
48
|
+
environmentId,
|
|
49
|
+
});
|
|
50
|
+
const latest = deployments[0];
|
|
51
|
+
if (!latest) {
|
|
52
|
+
spinner.stop("No deployments found");
|
|
53
|
+
throw new Error(`No deployments found for environment ${environmentId}.`);
|
|
54
|
+
}
|
|
55
|
+
spinner.stop("Deployment found");
|
|
56
|
+
return latest;
|
|
57
|
+
}
|
|
58
|
+
export async function resolveDeploymentId(flags) {
|
|
59
|
+
if (flags["deployment-id"]) {
|
|
60
|
+
return flags["deployment-id"];
|
|
61
|
+
}
|
|
62
|
+
const environmentId = resolveEnvironmentId(flags);
|
|
63
|
+
const deployment = await fetchLatestDeploymentForEnvironment(environmentId);
|
|
64
|
+
return deployment.id;
|
|
65
|
+
}
|
|
66
|
+
export async function waitForDeployment(deployment) {
|
|
67
|
+
if (FINAL_STATUSES.has(deployment.status)) {
|
|
68
|
+
return deployment;
|
|
69
|
+
}
|
|
70
|
+
const startedAt = deployment.startedAt?.getTime() ?? Date.now();
|
|
71
|
+
const waitStartedAt = Date.now();
|
|
72
|
+
let current = deployment;
|
|
73
|
+
const spinner = p.spinner();
|
|
74
|
+
spinner.start("Waiting for deployment to complete");
|
|
75
|
+
const elapsedInterval = setInterval(() => {
|
|
76
|
+
spinner.message(`Waiting for deployment to complete — ${formatElapsed(Date.now() - startedAt)}`);
|
|
77
|
+
}, 1000);
|
|
78
|
+
try {
|
|
79
|
+
while (!FINAL_STATUSES.has(current.status)) {
|
|
80
|
+
if (Date.now() - waitStartedAt >= FIFTEEN_MINUTES_IN_MS) {
|
|
81
|
+
throw new Error("Deployment did not reach a final state within 15 minutes.");
|
|
82
|
+
}
|
|
83
|
+
current = await api.deployments.get.v1({ deploymentId: current.id });
|
|
84
|
+
if (!FINAL_STATUSES.has(current.status)) {
|
|
85
|
+
await new Promise((resolve) => setTimeout(resolve, 3_000));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
spinner.stop(`Deployment is ${colorizeDeploymentStatus(current.status)(current.status)}`);
|
|
89
|
+
return current;
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
clearInterval(elapsedInterval);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const DEPLOYMENT_LOG_POLL_INTERVAL_MS = 5_000;
|
|
96
|
+
export function printDeploymentLog(log, { noColor = false } = {}) {
|
|
97
|
+
const ts = formatLogTimestamp(log.timestamp, noColor);
|
|
98
|
+
const rawContent = (log.content ?? "").trimEnd();
|
|
99
|
+
const content = noColor ? stripVTControlCharacters(rawContent) : rawContent;
|
|
100
|
+
process.stdout.write(`${ts} ${content}\n`);
|
|
101
|
+
}
|
|
102
|
+
export async function followDeploymentLogs(deploymentId, initialLogs, { noColor = false } = {}) {
|
|
103
|
+
let printedCount = initialLogs.length;
|
|
104
|
+
while (true) {
|
|
105
|
+
await new Promise((resolve) => setTimeout(resolve, DEPLOYMENT_LOG_POLL_INTERVAL_MS));
|
|
106
|
+
const result = await api.deployments.getLogs.v1({ deploymentId });
|
|
107
|
+
for (const log of result.logs.slice(printedCount)) {
|
|
108
|
+
printDeploymentLog(log, { noColor });
|
|
109
|
+
}
|
|
110
|
+
printedCount = result.logs.length;
|
|
111
|
+
if (!result.hasMoreLogs)
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export async function deployAndWait({ initial, startedAt, }) {
|
|
116
|
+
const spinner = p.spinner();
|
|
117
|
+
let deployment = initial;
|
|
118
|
+
const deploymentPageUrl = deployment.deploymentPageUrl;
|
|
119
|
+
if (deploymentPageUrl) {
|
|
120
|
+
p.note(`🔗 ${deploymentPageUrl}`, "View deployment details:", {
|
|
121
|
+
format: (line) => line,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
12
124
|
spinner.start("Deployment in progress");
|
|
13
|
-
const deploymentPageUrl = `${getFrontendBaseUrl()}/team/${teamId}/project/${projectId}/deployments/${initial.id}`;
|
|
14
|
-
p.note(deploymentPageUrl, "View deployment details:", { format: (line) => line });
|
|
15
125
|
const elapsedInterval = setInterval(() => {
|
|
16
126
|
const elapsed = formatElapsed(Date.now() - startedAt);
|
|
17
127
|
spinner.message(`Deployment in progress — ${elapsed}`);
|
|
18
128
|
}, 1000);
|
|
19
|
-
const timeoutMs = 15 * 60 * 1000; // 15 minutes
|
|
20
|
-
let deployment = await api.deployments.get.v1({ deploymentId: initial.id });
|
|
21
129
|
try {
|
|
22
130
|
while (deployment.status === "ongoing") {
|
|
23
131
|
const elapsedMs = Date.now() - startedAt;
|
|
24
|
-
if (elapsedMs >=
|
|
132
|
+
if (elapsedMs >= FIFTEEN_MINUTES_IN_MS) {
|
|
25
133
|
throw new Error(`Deployment aborted after 15 minutes. View status: ${deploymentPageUrl}`);
|
|
26
134
|
}
|
|
27
|
-
deployment = await api.deployments.get.v1({
|
|
28
|
-
|
|
135
|
+
deployment = await api.deployments.get.v1({
|
|
136
|
+
deploymentId: deployment.id,
|
|
137
|
+
});
|
|
138
|
+
if (deployment.status === "ongoing") {
|
|
139
|
+
await new Promise((resolve) => setTimeout(resolve, 10_000));
|
|
140
|
+
}
|
|
29
141
|
}
|
|
30
142
|
return { deployment, elapsedMs: Date.now() - startedAt };
|
|
31
143
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deployment.js","sourceRoot":"","sources":["../../src/lib/deployment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"deployment.js","sourceRoot":"","sources":["../../src/lib/deployment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { BaseWorkflow } from "./base-workflow.js";
|
|
2
|
+
export type EnvVar = {
|
|
3
|
+
key: string;
|
|
4
|
+
value: string;
|
|
5
|
+
isSecret: boolean;
|
|
6
|
+
};
|
|
7
|
+
export type EnvironmentVariableWorkflowFlags = {
|
|
8
|
+
"non-interactive"?: boolean;
|
|
9
|
+
key?: string;
|
|
10
|
+
value?: string;
|
|
11
|
+
secret?: boolean;
|
|
12
|
+
"env-file"?: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function isValidEnvironmentVariableKey(key: string): boolean;
|
|
15
|
+
export declare function fetchEnvironmentVariables(environmentId: string): Promise<{
|
|
16
|
+
id: string;
|
|
17
|
+
key: string;
|
|
18
|
+
value: string;
|
|
19
|
+
isSecret: boolean;
|
|
20
|
+
createdAt: Date;
|
|
21
|
+
}[]>;
|
|
22
|
+
export declare class EnvironmentVariableWorkflow extends BaseWorkflow<EnvironmentVariableWorkflowFlags> {
|
|
23
|
+
protected isNonInteractive(): boolean;
|
|
24
|
+
add(environmentId: string): Promise<void>;
|
|
25
|
+
update(environmentId: string): Promise<void>;
|
|
26
|
+
remove(environmentId: string): Promise<void>;
|
|
27
|
+
private resolveEnvironmentVariablesForAdd;
|
|
28
|
+
private resolveAddKey;
|
|
29
|
+
private resolveAddValue;
|
|
30
|
+
private resolveAddSecret;
|
|
31
|
+
private resolveUpdateInput;
|
|
32
|
+
private resolveUpdateKey;
|
|
33
|
+
private resolveUpdateValue;
|
|
34
|
+
private resolveUpdateSecret;
|
|
35
|
+
private resolveRemoveKey;
|
|
36
|
+
private promptRemoveKey;
|
|
37
|
+
}
|