alpic 0.0.0-dev.f2a3434 → 0.0.0-dev.f2c5492

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.
Files changed (192) hide show
  1. package/dist/__tests__/auth.e2e.test.d.ts +1 -0
  2. package/dist/__tests__/auth.e2e.test.js +158 -0
  3. package/dist/__tests__/auth.e2e.test.js.map +1 -0
  4. package/dist/__tests__/deploy-flags.e2e.test.d.ts +1 -0
  5. package/dist/__tests__/deploy-flags.e2e.test.js +180 -0
  6. package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -0
  7. package/dist/__tests__/deploy.e2e.test.js +56 -61
  8. package/dist/__tests__/deploy.e2e.test.js.map +1 -1
  9. package/dist/__tests__/deployment-inspect.e2e.test.d.ts +1 -0
  10. package/dist/__tests__/deployment-inspect.e2e.test.js +113 -0
  11. package/dist/__tests__/deployment-inspect.e2e.test.js.map +1 -0
  12. package/dist/__tests__/deployment-list.e2e.test.d.ts +1 -0
  13. package/dist/__tests__/deployment-list.e2e.test.js +108 -0
  14. package/dist/__tests__/deployment-list.e2e.test.js.map +1 -0
  15. package/dist/__tests__/deployment-logs.e2e.test.d.ts +1 -0
  16. package/dist/__tests__/deployment-logs.e2e.test.js +180 -0
  17. package/dist/__tests__/deployment-logs.e2e.test.js.map +1 -0
  18. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.d.ts +1 -0
  19. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js +250 -0
  20. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js.map +1 -0
  21. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.d.ts +1 -0
  22. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js +122 -0
  23. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js.map +1 -0
  24. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.d.ts +1 -0
  25. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js +139 -0
  26. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js.map +1 -0
  27. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.d.ts +1 -0
  28. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js +319 -0
  29. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js.map +1 -0
  30. package/dist/__tests__/environment-variable/environment-variable-validation.test.d.ts +1 -0
  31. package/dist/__tests__/environment-variable/environment-variable-validation.test.js +20 -0
  32. package/dist/__tests__/environment-variable/environment-variable-validation.test.js.map +1 -0
  33. package/dist/__tests__/fixtures/demo-project/index.js +1 -1
  34. package/dist/__tests__/fixtures/demo-project/index.js.map +1 -1
  35. package/dist/__tests__/git-flags.e2e.test.d.ts +1 -0
  36. package/dist/__tests__/git-flags.e2e.test.js +124 -0
  37. package/dist/__tests__/git-flags.e2e.test.js.map +1 -0
  38. package/dist/__tests__/git.e2e.test.js +57 -16
  39. package/dist/__tests__/git.e2e.test.js.map +1 -1
  40. package/dist/__tests__/link.e2e.test.d.ts +1 -0
  41. package/dist/__tests__/link.e2e.test.js +242 -0
  42. package/dist/__tests__/link.e2e.test.js.map +1 -0
  43. package/dist/__tests__/logs.e2e.test.d.ts +1 -0
  44. package/dist/__tests__/logs.e2e.test.js +197 -0
  45. package/dist/__tests__/logs.e2e.test.js.map +1 -0
  46. package/dist/__tests__/mock-server.d.ts +20 -0
  47. package/dist/__tests__/mock-server.js +264 -7
  48. package/dist/__tests__/mock-server.js.map +1 -1
  49. package/dist/__tests__/publish.e2e.test.d.ts +1 -0
  50. package/dist/__tests__/publish.e2e.test.js +485 -0
  51. package/dist/__tests__/publish.e2e.test.js.map +1 -0
  52. package/dist/__tests__/tunnel.e2e.test.d.ts +1 -0
  53. package/dist/__tests__/tunnel.e2e.test.js +64 -0
  54. package/dist/__tests__/tunnel.e2e.test.js.map +1 -0
  55. package/dist/__tests__/utils.d.ts +23 -5
  56. package/dist/__tests__/utils.js +122 -18
  57. package/dist/__tests__/utils.js.map +1 -1
  58. package/dist/api.d.ts +0 -1
  59. package/dist/api.js +5 -9
  60. package/dist/api.js.map +1 -1
  61. package/dist/commands/deploy.d.ts +8 -2
  62. package/dist/commands/deploy.js +62 -27
  63. package/dist/commands/deploy.js.map +1 -1
  64. package/dist/commands/deployment/inspect.d.ts +11 -0
  65. package/dist/commands/deployment/inspect.js +68 -0
  66. package/dist/commands/deployment/inspect.js.map +1 -0
  67. package/dist/commands/deployment/list.d.ts +11 -0
  68. package/dist/commands/deployment/list.js +85 -0
  69. package/dist/commands/deployment/list.js.map +1 -0
  70. package/dist/commands/deployment/logs.d.ts +12 -0
  71. package/dist/commands/deployment/logs.js +48 -0
  72. package/dist/commands/deployment/logs.js.map +1 -0
  73. package/dist/commands/environment-variable/add.d.ts +14 -0
  74. package/dist/commands/environment-variable/add.js +47 -0
  75. package/dist/commands/environment-variable/add.js.map +1 -0
  76. package/dist/commands/environment-variable/list.d.ts +9 -0
  77. package/dist/commands/environment-variable/list.js +45 -0
  78. package/dist/commands/environment-variable/list.js.map +1 -0
  79. package/dist/commands/environment-variable/remove.d.ts +11 -0
  80. package/dist/commands/environment-variable/remove.js +33 -0
  81. package/dist/commands/environment-variable/remove.js.map +1 -0
  82. package/dist/commands/environment-variable/update.d.ts +13 -0
  83. package/dist/commands/environment-variable/update.js +41 -0
  84. package/dist/commands/environment-variable/update.js.map +1 -0
  85. package/dist/commands/git/connect.d.ts +3 -2
  86. package/dist/commands/git/connect.js +26 -33
  87. package/dist/commands/git/connect.js.map +1 -1
  88. package/dist/commands/git/disconnect.d.ts +2 -2
  89. package/dist/commands/git/disconnect.js +16 -30
  90. package/dist/commands/git/disconnect.js.map +1 -1
  91. package/dist/commands/git.js +3 -3
  92. package/dist/commands/git.js.map +1 -1
  93. package/dist/commands/link.d.ts +15 -0
  94. package/dist/commands/link.js +88 -0
  95. package/dist/commands/link.js.map +1 -0
  96. package/dist/commands/login.d.ts +6 -0
  97. package/dist/commands/login.js +34 -0
  98. package/dist/commands/login.js.map +1 -0
  99. package/dist/commands/logout.d.ts +6 -0
  100. package/dist/commands/logout.js +20 -0
  101. package/dist/commands/logout.js.map +1 -0
  102. package/dist/commands/logs.d.ts +16 -0
  103. package/dist/commands/logs.js +96 -0
  104. package/dist/commands/logs.js.map +1 -0
  105. package/dist/commands/publish.d.ts +15 -0
  106. package/dist/commands/publish.js +51 -0
  107. package/dist/commands/publish.js.map +1 -0
  108. package/dist/commands/tunnel.d.ts +9 -0
  109. package/dist/commands/tunnel.js +45 -0
  110. package/dist/commands/tunnel.js.map +1 -0
  111. package/dist/commands/whoami.d.ts +6 -0
  112. package/dist/commands/whoami.js +13 -0
  113. package/dist/commands/whoami.js.map +1 -0
  114. package/dist/env.d.ts +4 -0
  115. package/dist/env.js +10 -0
  116. package/dist/env.js.map +1 -0
  117. package/dist/lib/alpic-command.d.ts +2 -0
  118. package/dist/lib/alpic-command.js +12 -5
  119. package/dist/lib/alpic-command.js.map +1 -1
  120. package/dist/lib/archive.d.ts +3 -3
  121. package/dist/lib/archive.js +11 -15
  122. package/dist/lib/archive.js.map +1 -1
  123. package/dist/lib/auth/auth.d.ts +2 -0
  124. package/dist/lib/auth/auth.js +21 -0
  125. package/dist/lib/auth/auth.js.map +1 -0
  126. package/dist/lib/auth/oauth/client.d.ts +28 -0
  127. package/dist/lib/auth/oauth/client.js +110 -0
  128. package/dist/lib/auth/oauth/client.js.map +1 -0
  129. package/dist/lib/auth/oauth/constants.d.ts +2 -0
  130. package/dist/lib/auth/oauth/constants.js +3 -0
  131. package/dist/lib/auth/oauth/constants.js.map +1 -0
  132. package/dist/lib/auth/oauth/server/assets/alpic-mountain.png +0 -0
  133. package/dist/lib/auth/oauth/server/assets/authorize.html +195 -0
  134. package/dist/lib/auth/oauth/server/assets/callback.html +88 -0
  135. package/dist/lib/auth/oauth/server/index.d.ts +8 -0
  136. package/dist/lib/auth/oauth/server/index.js +102 -0
  137. package/dist/lib/auth/oauth/server/index.js.map +1 -0
  138. package/dist/lib/auth/whoami.d.ts +1 -0
  139. package/dist/lib/auth/whoami.js +41 -0
  140. package/dist/lib/auth/whoami.js.map +1 -0
  141. package/dist/lib/base-workflow.d.ts +10 -0
  142. package/dist/lib/base-workflow.js +22 -0
  143. package/dist/lib/base-workflow.js.map +1 -0
  144. package/dist/lib/config.d.ts +3 -2
  145. package/dist/lib/config.js +8 -7
  146. package/dist/lib/config.js.map +1 -1
  147. package/dist/lib/deployment.d.ts +70 -3
  148. package/dist/lib/deployment.js +113 -8
  149. package/dist/lib/deployment.js.map +1 -1
  150. package/dist/lib/environment-variable.d.ts +37 -0
  151. package/dist/lib/environment-variable.js +292 -0
  152. package/dist/lib/environment-variable.js.map +1 -0
  153. package/dist/lib/git.d.ts +12 -4
  154. package/dist/lib/git.js +51 -26
  155. package/dist/lib/git.js.map +1 -1
  156. package/dist/lib/global-store.d.ts +28 -0
  157. package/dist/lib/global-store.js +76 -0
  158. package/dist/lib/global-store.js.map +1 -0
  159. package/dist/lib/link.d.ts +82 -0
  160. package/dist/lib/link.js +369 -0
  161. package/dist/lib/link.js.map +1 -0
  162. package/dist/lib/logs.d.ts +20 -0
  163. package/dist/lib/logs.js +86 -0
  164. package/dist/lib/logs.js.map +1 -0
  165. package/dist/lib/publish.d.ts +22 -0
  166. package/dist/lib/publish.js +181 -0
  167. package/dist/lib/publish.js.map +1 -0
  168. package/dist/lib/resolve.d.ts +6 -0
  169. package/dist/lib/resolve.js +26 -0
  170. package/dist/lib/resolve.js.map +1 -0
  171. package/dist/lib/table.d.ts +8 -0
  172. package/dist/lib/table.js +27 -0
  173. package/dist/lib/table.js.map +1 -0
  174. package/dist/lib/telemetry.js +6 -6
  175. package/dist/lib/telemetry.js.map +1 -1
  176. package/dist/lib/utils.d.ts +4 -0
  177. package/dist/lib/utils.js +21 -0
  178. package/dist/lib/utils.js.map +1 -0
  179. package/dist/lib/utils.test.d.ts +1 -0
  180. package/dist/lib/utils.test.js +21 -0
  181. package/dist/lib/utils.test.js.map +1 -0
  182. package/dist/types.d.ts +1 -0
  183. package/package.json +32 -19
  184. package/dist/lib/auth.d.ts +0 -1
  185. package/dist/lib/auth.js +0 -10
  186. package/dist/lib/auth.js.map +0 -1
  187. package/dist/lib/global-config.d.ts +0 -9
  188. package/dist/lib/global-config.js +0 -48
  189. package/dist/lib/global-config.js.map +0 -1
  190. package/dist/lib/project.d.ts +0 -67
  191. package/dist/lib/project.js +0 -285
  192. package/dist/lib/project.js.map +0 -1
@@ -0,0 +1,102 @@
1
+ import * as p from "@clack/prompts";
2
+ import { readFile } from "node:fs/promises";
3
+ import { createServer } from "node:http";
4
+ import path from "node:path";
5
+ import { fileURLToPath } from "node:url";
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, { "Content-Type": "text/html", Connection: "close" });
21
+ res.end(html);
22
+ return;
23
+ }
24
+ catch (e) {
25
+ p.log.error(e instanceof Error ? e.message : String(e));
26
+ res.writeHead(500).end();
27
+ return;
28
+ }
29
+ }
30
+ if (pathname === "/assets/alpic-mountain.png") {
31
+ const filePath = path.join(ASSETS_DIR, "alpic-mountain.png");
32
+ const content = await readFile(filePath);
33
+ res.writeHead(200, { "Content-Type": "image/png", Connection: "close" });
34
+ res.end(content);
35
+ return;
36
+ }
37
+ if (!url.startsWith("/callback")) {
38
+ res.writeHead(404).end();
39
+ return;
40
+ }
41
+ try {
42
+ const tokens = await oAuthClient.exchangeAuthorizationCode({
43
+ url: new URL(url, `http://${req.headers.host}`),
44
+ codeVerifier,
45
+ state,
46
+ nonce,
47
+ });
48
+ const sub = tokens.claims()?.sub;
49
+ if (!sub || !tokens.refresh_token) {
50
+ throw new Error("ID token did not contain sub");
51
+ }
52
+ const stored = {
53
+ access_token: tokens.access_token,
54
+ refresh_token: tokens.refresh_token,
55
+ expires_at: oAuthClient.getExpiresAt(tokens.expires_in ?? 0),
56
+ sub,
57
+ };
58
+ p.log.success("✅ Authentication successful");
59
+ const successHtmlPath = path.join(ASSETS_DIR, "callback.html");
60
+ let html = await readFile(successHtmlPath, "utf-8");
61
+ html = html
62
+ .replace(/__CALLBACK_STATUS__/g, "success")
63
+ .replace(/__CALLBACK_TITLE__/g, "You are logged in")
64
+ .replace(/__CALLBACK_SUB__/g, "You can close this page.");
65
+ res.writeHead(200, { "Content-Type": "text/html", Connection: "close" });
66
+ res.end(html);
67
+ onSuccess(stored);
68
+ }
69
+ catch (e) {
70
+ p.log.error(e instanceof Error ? e.message : String(e));
71
+ const callbackHtmlPath = path.join(ASSETS_DIR, "callback.html");
72
+ let html = await readFile(callbackHtmlPath, "utf-8");
73
+ html = html
74
+ .replace(/__CALLBACK_STATUS__/g, "error")
75
+ .replace(/__CALLBACK_TITLE__/g, "An error occurred. You can close this page.")
76
+ .replace(/__CALLBACK_SUB__/g, "");
77
+ res.writeHead(500, { "Content-Type": "text/html", Connection: "close" });
78
+ res.end(html);
79
+ onError(e instanceof Error ? e : new Error(String(e)));
80
+ }
81
+ });
82
+ export const getLoginPageUrl = () => `http://${LOOPBACK_HOST}:${LOOPBACK_PORT}/login`;
83
+ export const listenToOAuthCallback = ({ state, nonce, codeVerifier, authorizeUrl, }) => {
84
+ return new Promise((resolve, reject) => {
85
+ const callbackServer = createCallbackServer({
86
+ state,
87
+ nonce,
88
+ codeVerifier,
89
+ authorizeUrl,
90
+ onSuccess: (storedToken) => {
91
+ callbackServer.close();
92
+ resolve(storedToken);
93
+ },
94
+ onError: (err) => {
95
+ callbackServer.close();
96
+ reject(err);
97
+ },
98
+ });
99
+ callbackServer.listen(LOOPBACK_PORT, LOOPBACK_HOST);
100
+ });
101
+ };
102
+ //# 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"}
@@ -1,11 +1,12 @@
1
1
  import type { ProjectConfig } from "../types.js";
2
2
  export declare const config: {
3
- load: (deployDir: string) => {
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: (config: ProjectConfig, deployDir: string) => void;
11
+ save: (projectConfig: ProjectConfig) => void;
11
12
  };
@@ -1,9 +1,9 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- const getProjectJsonPath = (deployDir) => join(deployDir, ".alpic", "project.json");
3
+ const getProjectJsonPath = () => join(process.cwd(), ".alpic", "project.json");
4
4
  export const config = {
5
- load: (deployDir) => {
6
- const path = getProjectJsonPath(deployDir);
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: (config, deployDir) => {
26
- const path = getProjectJsonPath(deployDir);
27
- mkdirSync(join(deployDir, ".alpic"), { recursive: true });
28
- writeFileSync(path, JSON.stringify(config, null, 2));
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
@@ -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,CAAC,SAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;AAE5F,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,SAAiB,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC3C,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,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,MAAqB,EAAE,SAAiB,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC3C,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;CACF,CAAC"}
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"}
@@ -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 deployAndWait({ initial, startedAt, teamId, projectId, }: {
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 {};
@@ -1,31 +1,136 @@
1
1
  import * as p from "@clack/prompts";
2
2
  import chalk from "chalk";
3
- import { api, getFrontendBaseUrl } from "../api.js";
3
+ import { stripVTControlCharacters } from "node:util";
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 async function deployAndWait({ initial, startedAt, teamId, projectId, }) {
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({ projectId: environment.projectId, environmentId });
47
+ const latest = deployments[0];
48
+ if (!latest) {
49
+ spinner.stop("No deployments found");
50
+ throw new Error(`No deployments found for environment ${environmentId}.`);
51
+ }
52
+ spinner.stop("Deployment found");
53
+ return latest;
54
+ }
55
+ export async function resolveDeploymentId(flags) {
56
+ if (flags["deployment-id"]) {
57
+ return flags["deployment-id"];
58
+ }
59
+ const environmentId = resolveEnvironmentId(flags);
60
+ const deployment = await fetchLatestDeploymentForEnvironment(environmentId);
61
+ return deployment.id;
62
+ }
63
+ export async function waitForDeployment(deployment) {
64
+ if (FINAL_STATUSES.has(deployment.status)) {
65
+ return deployment;
66
+ }
67
+ const startedAt = deployment.startedAt?.getTime() ?? Date.now();
68
+ const waitStartedAt = Date.now();
69
+ let current = deployment;
70
+ const spinner = p.spinner();
71
+ spinner.start("Waiting for deployment to complete");
72
+ const elapsedInterval = setInterval(() => {
73
+ spinner.message(`Waiting for deployment to complete — ${formatElapsed(Date.now() - startedAt)}`);
74
+ }, 1000);
75
+ try {
76
+ while (!FINAL_STATUSES.has(current.status)) {
77
+ if (Date.now() - waitStartedAt >= FIFTEEN_MINUTES_IN_MS) {
78
+ throw new Error("Deployment did not reach a final state within 15 minutes.");
79
+ }
80
+ current = await api.deployments.get.v1({ deploymentId: current.id });
81
+ if (!FINAL_STATUSES.has(current.status)) {
82
+ await new Promise((resolve) => setTimeout(resolve, 3_000));
83
+ }
84
+ }
85
+ spinner.stop(`Deployment is ${colorizeDeploymentStatus(current.status)(current.status)}`);
86
+ return current;
87
+ }
88
+ finally {
89
+ clearInterval(elapsedInterval);
90
+ }
91
+ }
92
+ const DEPLOYMENT_LOG_POLL_INTERVAL_MS = 5_000;
93
+ export function printDeploymentLog(log, { noColor = false } = {}) {
94
+ const ts = formatLogTimestamp(log.timestamp, noColor);
95
+ const rawContent = (log.content ?? "").trimEnd();
96
+ const content = noColor ? stripVTControlCharacters(rawContent) : rawContent;
97
+ process.stdout.write(`${ts} ${content}\n`);
98
+ }
99
+ export async function followDeploymentLogs(deploymentId, initialLogs, { noColor = false } = {}) {
100
+ let printedCount = initialLogs.length;
101
+ while (true) {
102
+ await new Promise((resolve) => setTimeout(resolve, DEPLOYMENT_LOG_POLL_INTERVAL_MS));
103
+ const result = await api.deployments.getLogs.v1({ deploymentId });
104
+ for (const log of result.logs.slice(printedCount)) {
105
+ printDeploymentLog(log, { noColor });
106
+ }
107
+ printedCount = result.logs.length;
108
+ if (!result.hasMoreLogs)
109
+ break;
110
+ }
111
+ }
112
+ export async function deployAndWait({ initial, startedAt, }) {
113
+ const spinner = p.spinner();
114
+ let deployment = initial;
115
+ const deploymentPageUrl = deployment.deploymentPageUrl;
116
+ if (deploymentPageUrl) {
117
+ p.note(`🔗 ${deploymentPageUrl}`, "View deployment details:", { format: (line) => line });
118
+ }
12
119
  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
120
  const elapsedInterval = setInterval(() => {
16
121
  const elapsed = formatElapsed(Date.now() - startedAt);
17
122
  spinner.message(`Deployment in progress — ${elapsed}`);
18
123
  }, 1000);
19
- const timeoutMs = 15 * 60 * 1000; // 15 minutes
20
- let deployment = await api.deployments.get.v1({ deploymentId: initial.id });
21
124
  try {
22
125
  while (deployment.status === "ongoing") {
23
126
  const elapsedMs = Date.now() - startedAt;
24
- if (elapsedMs >= timeoutMs) {
127
+ if (elapsedMs >= FIFTEEN_MINUTES_IN_MS) {
25
128
  throw new Error(`Deployment aborted after 15 minutes. View status: ${deploymentPageUrl}`);
26
129
  }
27
130
  deployment = await api.deployments.get.v1({ deploymentId: deployment.id });
28
- await new Promise((resolve) => setTimeout(resolve, 10_000));
131
+ if (deployment.status === "ongoing") {
132
+ await new Promise((resolve) => setTimeout(resolve, 10_000));
133
+ }
29
134
  }
30
135
  return { deployment, elapsedMs: Date.now() - startedAt };
31
136
  }
@@ -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;AAI1B,OAAO,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEpD,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAClC,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAClC,OAAO,EACP,SAAS,EACT,MAAM,EACN,SAAS,GAMV;IACC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAE5B,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAExC,MAAM,iBAAiB,GAAG,GAAG,kBAAkB,EAAE,SAAS,MAAM,YAAY,SAAS,gBAAgB,OAAO,CAAC,EAAE,EAAE,CAAC;IAClH,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,0BAA0B,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IAElF,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;QACtD,OAAO,CAAC,OAAO,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC,EAAE,IAAI,CAAC,CAAC;IAET,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;IAC/C,IAAI,UAAU,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5E,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACzC,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,qDAAqD,iBAAiB,EAAE,CAAC,CAAC;YAC5F,CAAC;YACD,UAAU,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3E,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;IAC3D,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,GACX,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAC1G,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,aAAa,CAAC,eAAe,CAAC,CAAC;IACjC,CAAC;AACH,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
+ }