alpic 0.0.0-dev.f2a3434 → 0.0.0-dev.f334f41

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 (146) 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 +111 -0
  6. package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -0
  7. package/dist/__tests__/deploy.e2e.test.js +37 -54
  8. package/dist/__tests__/deploy.e2e.test.js.map +1 -1
  9. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.d.ts +1 -0
  10. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js +250 -0
  11. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js.map +1 -0
  12. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.d.ts +1 -0
  13. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js +122 -0
  14. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js.map +1 -0
  15. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.d.ts +1 -0
  16. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js +139 -0
  17. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js.map +1 -0
  18. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.d.ts +1 -0
  19. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js +319 -0
  20. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js.map +1 -0
  21. package/dist/__tests__/environment-variable/environment-variable-validation.test.d.ts +1 -0
  22. package/dist/__tests__/environment-variable/environment-variable-validation.test.js +20 -0
  23. package/dist/__tests__/environment-variable/environment-variable-validation.test.js.map +1 -0
  24. package/dist/__tests__/fixtures/demo-project/index.js +1 -1
  25. package/dist/__tests__/fixtures/demo-project/index.js.map +1 -1
  26. package/dist/__tests__/git-flags.e2e.test.d.ts +1 -0
  27. package/dist/__tests__/git-flags.e2e.test.js +124 -0
  28. package/dist/__tests__/git-flags.e2e.test.js.map +1 -0
  29. package/dist/__tests__/git.e2e.test.js +57 -16
  30. package/dist/__tests__/git.e2e.test.js.map +1 -1
  31. package/dist/__tests__/logs.e2e.test.d.ts +1 -0
  32. package/dist/__tests__/logs.e2e.test.js +197 -0
  33. package/dist/__tests__/logs.e2e.test.js.map +1 -0
  34. package/dist/__tests__/mock-server.d.ts +4 -0
  35. package/dist/__tests__/mock-server.js +176 -5
  36. package/dist/__tests__/mock-server.js.map +1 -1
  37. package/dist/__tests__/utils.d.ts +16 -4
  38. package/dist/__tests__/utils.js +95 -14
  39. package/dist/__tests__/utils.js.map +1 -1
  40. package/dist/api.d.ts +0 -1
  41. package/dist/api.js +5 -9
  42. package/dist/api.js.map +1 -1
  43. package/dist/commands/deploy.d.ts +5 -2
  44. package/dist/commands/deploy.js +37 -23
  45. package/dist/commands/deploy.js.map +1 -1
  46. package/dist/commands/environment-variable/add.d.ts +14 -0
  47. package/dist/commands/environment-variable/add.js +46 -0
  48. package/dist/commands/environment-variable/add.js.map +1 -0
  49. package/dist/commands/environment-variable/list.d.ts +9 -0
  50. package/dist/commands/environment-variable/list.js +44 -0
  51. package/dist/commands/environment-variable/list.js.map +1 -0
  52. package/dist/commands/environment-variable/remove.d.ts +11 -0
  53. package/dist/commands/environment-variable/remove.js +32 -0
  54. package/dist/commands/environment-variable/remove.js.map +1 -0
  55. package/dist/commands/environment-variable/update.d.ts +13 -0
  56. package/dist/commands/environment-variable/update.js +40 -0
  57. package/dist/commands/environment-variable/update.js.map +1 -0
  58. package/dist/commands/git/connect.d.ts +3 -2
  59. package/dist/commands/git/connect.js +26 -33
  60. package/dist/commands/git/connect.js.map +1 -1
  61. package/dist/commands/git/disconnect.d.ts +2 -2
  62. package/dist/commands/git/disconnect.js +16 -30
  63. package/dist/commands/git/disconnect.js.map +1 -1
  64. package/dist/commands/git.js +3 -3
  65. package/dist/commands/git.js.map +1 -1
  66. package/dist/commands/login.d.ts +6 -0
  67. package/dist/commands/login.js +34 -0
  68. package/dist/commands/login.js.map +1 -0
  69. package/dist/commands/logout.d.ts +6 -0
  70. package/dist/commands/logout.js +20 -0
  71. package/dist/commands/logout.js.map +1 -0
  72. package/dist/commands/logs.d.ts +16 -0
  73. package/dist/commands/logs.js +96 -0
  74. package/dist/commands/logs.js.map +1 -0
  75. package/dist/commands/whoami.d.ts +6 -0
  76. package/dist/commands/whoami.js +13 -0
  77. package/dist/commands/whoami.js.map +1 -0
  78. package/dist/env.d.ts +4 -0
  79. package/dist/env.js +10 -0
  80. package/dist/env.js.map +1 -0
  81. package/dist/lib/alpic-command.d.ts +2 -0
  82. package/dist/lib/alpic-command.js +12 -5
  83. package/dist/lib/alpic-command.js.map +1 -1
  84. package/dist/lib/archive.d.ts +3 -3
  85. package/dist/lib/archive.js +11 -15
  86. package/dist/lib/archive.js.map +1 -1
  87. package/dist/lib/auth/auth.d.ts +2 -0
  88. package/dist/lib/auth/auth.js +21 -0
  89. package/dist/lib/auth/auth.js.map +1 -0
  90. package/dist/lib/auth/oauth/client.d.ts +28 -0
  91. package/dist/lib/auth/oauth/client.js +110 -0
  92. package/dist/lib/auth/oauth/client.js.map +1 -0
  93. package/dist/lib/auth/oauth/constants.d.ts +2 -0
  94. package/dist/lib/auth/oauth/constants.js +3 -0
  95. package/dist/lib/auth/oauth/constants.js.map +1 -0
  96. package/dist/lib/auth/oauth/server/assets/alpic-mountain.png +0 -0
  97. package/dist/lib/auth/oauth/server/assets/authorize.html +195 -0
  98. package/dist/lib/auth/oauth/server/assets/callback.html +88 -0
  99. package/dist/lib/auth/oauth/server/index.d.ts +8 -0
  100. package/dist/lib/auth/oauth/server/index.js +102 -0
  101. package/dist/lib/auth/oauth/server/index.js.map +1 -0
  102. package/dist/lib/auth/whoami.d.ts +1 -0
  103. package/dist/lib/auth/whoami.js +41 -0
  104. package/dist/lib/auth/whoami.js.map +1 -0
  105. package/dist/lib/base-workflow.d.ts +10 -0
  106. package/dist/lib/base-workflow.js +22 -0
  107. package/dist/lib/base-workflow.js.map +1 -0
  108. package/dist/lib/config.d.ts +2 -2
  109. package/dist/lib/config.js +7 -7
  110. package/dist/lib/config.js.map +1 -1
  111. package/dist/lib/deployment.d.ts +2 -3
  112. package/dist/lib/deployment.js +12 -8
  113. package/dist/lib/deployment.js.map +1 -1
  114. package/dist/lib/environment-variable.d.ts +41 -0
  115. package/dist/lib/environment-variable.js +304 -0
  116. package/dist/lib/environment-variable.js.map +1 -0
  117. package/dist/lib/git.d.ts +12 -4
  118. package/dist/lib/git.js +51 -26
  119. package/dist/lib/git.js.map +1 -1
  120. package/dist/lib/global-store.d.ts +28 -0
  121. package/dist/lib/global-store.js +76 -0
  122. package/dist/lib/global-store.js.map +1 -0
  123. package/dist/lib/logs.d.ts +19 -0
  124. package/dist/lib/logs.js +83 -0
  125. package/dist/lib/logs.js.map +1 -0
  126. package/dist/lib/project.d.ts +65 -61
  127. package/dist/lib/project.js +264 -254
  128. package/dist/lib/project.js.map +1 -1
  129. package/dist/lib/table.d.ts +8 -0
  130. package/dist/lib/table.js +27 -0
  131. package/dist/lib/table.js.map +1 -0
  132. package/dist/lib/telemetry.js +6 -6
  133. package/dist/lib/telemetry.js.map +1 -1
  134. package/dist/lib/utils.d.ts +1 -0
  135. package/dist/lib/utils.js +17 -0
  136. package/dist/lib/utils.js.map +1 -0
  137. package/dist/lib/utils.test.d.ts +1 -0
  138. package/dist/lib/utils.test.js +14 -0
  139. package/dist/lib/utils.test.js.map +1 -0
  140. package/package.json +29 -19
  141. package/dist/lib/auth.d.ts +0 -1
  142. package/dist/lib/auth.js +0 -10
  143. package/dist/lib/auth.js.map +0 -1
  144. package/dist/lib/global-config.d.ts +0 -9
  145. package/dist/lib/global-config.js +0 -48
  146. package/dist/lib/global-config.js.map +0 -1
@@ -0,0 +1,195 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Sign in to Alpic</title>
7
+ <link
8
+ href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Mozilla+Text:wght@200..700&display=swap"
9
+ rel="stylesheet"
10
+ />
11
+ <style>
12
+ *,
13
+ *::before,
14
+ *::after {
15
+ margin: 0;
16
+ padding: 0;
17
+ box-sizing: border-box;
18
+ }
19
+
20
+ :root {
21
+ --midnight: #051413;
22
+ }
23
+
24
+ body {
25
+ font-family: "Inter", system-ui, sans-serif;
26
+ background-color: var(--midnight);
27
+ min-height: 100vh;
28
+ display: flex;
29
+ background-image: url("/assets/alpic-mountain.png");
30
+ background-repeat: no-repeat;
31
+ background-position: right bottom;
32
+ background-size: auto;
33
+ padding: 64px;
34
+ }
35
+
36
+ .card {
37
+ background: #fff;
38
+ border-radius: 2px;
39
+ padding: 48px;
40
+ width: 50%;
41
+ min-height: calc(100vh - 128px);
42
+ display: flex;
43
+ flex-direction: column;
44
+ align-items: center;
45
+ justify-content: center;
46
+ }
47
+
48
+ h1 {
49
+ font-family: "Mozilla Text", system-ui, sans-serif;
50
+ font-weight: 400;
51
+ font-size: 48px;
52
+ color: var(--midnight);
53
+ margin-bottom: 8px;
54
+ }
55
+
56
+ .subtitle {
57
+ font-size: 20px;
58
+ color: var(--midnight);
59
+ margin-bottom: 32px;
60
+ }
61
+
62
+ .buttons {
63
+ display: flex;
64
+ flex-direction: column;
65
+ gap: 12px;
66
+ }
67
+
68
+ .btn {
69
+ display: flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ gap: 8px;
73
+ height: 48px;
74
+ width: 256px;
75
+ padding: 0 16px;
76
+ border-radius: 2px;
77
+ border: 1px solid var(--midnight);
78
+ font-family: "Inter", system-ui, sans-serif;
79
+ font-size: 16px;
80
+ font-weight: 500;
81
+ cursor: pointer;
82
+ transition: background 0.15s;
83
+ }
84
+
85
+ .btn:focus-visible {
86
+ outline: none;
87
+ box-shadow: 0 0 0 2px var(--midnight);
88
+ }
89
+
90
+ .btn svg {
91
+ width: 20px;
92
+ height: 20px;
93
+ flex-shrink: 0;
94
+ }
95
+
96
+ .btn-github {
97
+ background: var(--midnight);
98
+ color: #fff;
99
+ }
100
+ .btn-github svg {
101
+ fill: #fff;
102
+ }
103
+ .btn-github:hover {
104
+ background: rgba(5, 20, 19, 0.9);
105
+ }
106
+
107
+ .btn-google {
108
+ background: #fff;
109
+ color: var(--midnight);
110
+ }
111
+ .btn-google svg {
112
+ fill: var(--midnight);
113
+ }
114
+ .btn-google:hover {
115
+ background: rgba(5, 20, 19, 0.1);
116
+ }
117
+
118
+ .btn-loading {
119
+ opacity: 0.7;
120
+ pointer-events: none;
121
+ cursor: default;
122
+ transition: opacity 0.2s;
123
+ }
124
+ .spinner {
125
+ width: 20px;
126
+ height: 20px;
127
+ animation: spin 0.8s linear infinite;
128
+ }
129
+ @keyframes spin {
130
+ to {
131
+ transform: rotate(360deg);
132
+ }
133
+ }
134
+
135
+ @media (max-width: 768px) {
136
+ body {
137
+ padding: 16px;
138
+ }
139
+ .card {
140
+ width: 100%;
141
+ height: auto;
142
+ padding: 24px;
143
+ }
144
+ h1 {
145
+ font-size: 36px;
146
+ }
147
+ .subtitle {
148
+ font-size: 18px;
149
+ }
150
+ }
151
+ </style>
152
+ </head>
153
+ <body>
154
+ <div class="card">
155
+ <h1>Welcome to Alpic</h1>
156
+ <p class="subtitle">Sign in to use Alpic CLI</p>
157
+ <div class="buttons">
158
+ <button class="btn btn-github" onclick="login('Github', this)" type="button">
159
+ <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
160
+ <title>GitHub</title>
161
+ <path
162
+ d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"
163
+ />
164
+ </svg>
165
+ Sign in with GitHub
166
+ </button>
167
+ <button class="btn btn-google" onclick="login('google', this)" type="button">
168
+ <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
169
+ <title>Google</title>
170
+ <path
171
+ d="M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.8 4.133-1.147 1.147-2.933 2.4-6.04 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z"
172
+ />
173
+ </svg>
174
+ Sign in with Google
175
+ </button>
176
+ </div>
177
+ </div>
178
+ <script>
179
+ var loaderSvg =
180
+ '<svg class="spinner" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2v4"/><path d="m16.2 7.8 2.9-2.9"/><path d="M18 12h4"/><path d="m16.2 16.2 2.9 2.9"/><path d="M12 18v4"/><path d="m4.9 19.1 2.9-2.9"/><path d="M2 12h4"/><path d="m4.9 4.9 2.9 2.9"/></svg>';
181
+ // biome-ignore lint/correctness/noUnusedVariables: The function is used within the buttons onclick handlers
182
+ function login(provider, btn) {
183
+ const icon = btn.querySelector("svg");
184
+ const wrap = document.createElement("div");
185
+ wrap.innerHTML = loaderSvg;
186
+ icon.replaceWith(wrap.firstChild);
187
+ btn.classList.add("btn-loading");
188
+ btn.disabled = true;
189
+ const url = new URL("%AUTH_BASE_URL%");
190
+ url.searchParams.set("identity_provider", provider);
191
+ window.location.href = url.toString();
192
+ }
193
+ </script>
194
+ </body>
195
+ </html>
@@ -0,0 +1,88 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Sign in to Alpic</title>
7
+ <link
8
+ href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Mozilla+Text:wght@200..700&display=swap"
9
+ rel="stylesheet"
10
+ />
11
+ <style>
12
+ *,
13
+ *::before,
14
+ *::after {
15
+ margin: 0;
16
+ padding: 0;
17
+ box-sizing: border-box;
18
+ }
19
+
20
+ :root {
21
+ --midnight: #051413;
22
+ }
23
+
24
+ body {
25
+ font-family: "Inter", system-ui, sans-serif;
26
+ background-color: var(--midnight);
27
+ min-height: 100vh;
28
+ display: flex;
29
+ align-items: center;
30
+ justify-content: center;
31
+ padding: 64px;
32
+ }
33
+
34
+ .card {
35
+ background: #fff;
36
+ border-radius: 2px;
37
+ padding: 48px;
38
+ display: flex;
39
+ flex-direction: column;
40
+ align-items: center;
41
+ justify-content: center;
42
+ }
43
+
44
+ .message {
45
+ text-align: center;
46
+ }
47
+
48
+ .message-title {
49
+ font-size: 28px;
50
+ color: var(--midnight);
51
+ display: block;
52
+ }
53
+
54
+ .message-sub {
55
+ display: block;
56
+ margin-top: 0.5em;
57
+ color: #6b7280;
58
+ }
59
+
60
+ .message.error .message-title {
61
+ color: #b91c1c;
62
+ }
63
+
64
+ .message.error .message-sub {
65
+ display: none;
66
+ }
67
+
68
+ @media (max-width: 768px) {
69
+ body {
70
+ padding: 16px;
71
+ }
72
+ .card {
73
+ width: 100%;
74
+ height: auto;
75
+ padding: 24px;
76
+ }
77
+ }
78
+ </style>
79
+ </head>
80
+ <body>
81
+ <div class="card">
82
+ <p class="message __CALLBACK_STATUS__">
83
+ <span class="message-title">__CALLBACK_TITLE__</span>
84
+ <span class="message-sub">__CALLBACK_SUB__</span>
85
+ </p>
86
+ </div>
87
+ </body>
88
+ </html>
@@ -0,0 +1,8 @@
1
+ import type { Credentials } from "../../../global-store.js";
2
+ export declare const getLoginPageUrl: () => string;
3
+ export declare const listenToOAuthCallback: ({ state, nonce, codeVerifier, authorizeUrl, }: {
4
+ state: string;
5
+ nonce: string;
6
+ codeVerifier: string;
7
+ authorizeUrl?: string;
8
+ }) => Promise<Credentials>;
@@ -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,11 @@
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
6
  projectName: string;
7
7
  environmentId: string | undefined;
8
8
  environmentName: string | undefined;
9
9
  } | null;
10
- save: (config: ProjectConfig, deployDir: string) => void;
10
+ save: (projectConfig: ProjectConfig) => void;
11
11
  };
@@ -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
  }
@@ -22,10 +22,10 @@ export const config = {
22
22
  environmentName: raw.environmentName,
23
23
  };
24
24
  },
25
- save: (config, deployDir) => {
26
- const path = getProjectJsonPath(deployDir);
27
- mkdirSync(join(deployDir, ".alpic"), { recursive: true });
28
- writeFileSync(path, JSON.stringify(config, null, 2));
25
+ save: (projectConfig) => {
26
+ const path = getProjectJsonPath();
27
+ mkdirSync(join(process.cwd(), ".alpic"), { recursive: true });
28
+ writeFileSync(path, JSON.stringify(projectConfig, null, 2));
29
29
  },
30
30
  };
31
31
  //# 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,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,8 @@
1
1
  import type { RouterOutput } from "@alpic-ai/api";
2
2
  export declare function formatElapsed(ms: number): string;
3
- export declare function deployAndWait({ initial, startedAt, teamId, projectId, }: {
3
+ export declare function deployAndWait({ initial, startedAt, }: {
4
4
  initial: RouterOutput["deployments"]["get"]["v1"];
5
5
  startedAt: number;
6
- teamId: string;
7
- projectId: string;
8
6
  }): Promise<{
9
7
  deployment: {
10
8
  id: string;
@@ -16,6 +14,7 @@ export declare function deployAndWait({ initial, startedAt, teamId, projectId, }
16
14
  authorAvatarUrl: string | null;
17
15
  startedAt: Date | null;
18
16
  completedAt: Date | null;
17
+ deploymentPageUrl: string | null;
19
18
  };
20
19
  elapsedMs: number;
21
20
  }>;
@@ -1,31 +1,35 @@
1
1
  import * as p from "@clack/prompts";
2
2
  import chalk from "chalk";
3
- import { api, getFrontendBaseUrl } from "../api.js";
3
+ import { api } from "../api.js";
4
4
  export function formatElapsed(ms) {
5
5
  const totalSeconds = Math.floor(ms / 1000);
6
6
  const minutes = Math.floor(totalSeconds / 60);
7
7
  const seconds = totalSeconds % 60;
8
8
  return minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;
9
9
  }
10
- export async function deployAndWait({ initial, startedAt, teamId, projectId, }) {
10
+ export async function deployAndWait({ initial, startedAt, }) {
11
11
  const spinner = p.spinner();
12
+ let deployment = initial;
13
+ const deploymentPageUrl = deployment.deploymentPageUrl;
14
+ if (deploymentPageUrl) {
15
+ p.note(`🔗 ${deploymentPageUrl}`, "View deployment details:", { format: (line) => line });
16
+ }
12
17
  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 });
18
+ const FIFTEEN_MINUTES_IN_MS = 15 * 60 * 1000; // 15 minutes
15
19
  const elapsedInterval = setInterval(() => {
16
20
  const elapsed = formatElapsed(Date.now() - startedAt);
17
21
  spinner.message(`Deployment in progress — ${elapsed}`);
18
22
  }, 1000);
19
- const timeoutMs = 15 * 60 * 1000; // 15 minutes
20
- let deployment = await api.deployments.get.v1({ deploymentId: initial.id });
21
23
  try {
22
24
  while (deployment.status === "ongoing") {
23
25
  const elapsedMs = Date.now() - startedAt;
24
- if (elapsedMs >= timeoutMs) {
26
+ if (elapsedMs >= FIFTEEN_MINUTES_IN_MS) {
25
27
  throw new Error(`Deployment aborted after 15 minutes. View status: ${deploymentPageUrl}`);
26
28
  }
27
29
  deployment = await api.deployments.get.v1({ deploymentId: deployment.id });
28
- await new Promise((resolve) => setTimeout(resolve, 10_000));
30
+ if (deployment.status === "ongoing") {
31
+ await new Promise((resolve) => setTimeout(resolve, 10_000));
32
+ }
29
33
  }
30
34
  return { deployment, elapsedMs: Date.now() - startedAt };
31
35
  }
@@ -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":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,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,GAIV;IACC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAE5B,IAAI,UAAU,GAAG,OAAO,CAAC;IACzB,MAAM,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,CAAC;IACvD,IAAI,iBAAiB,EAAE,CAAC;QACtB,CAAC,CAAC,IAAI,CAAC,MAAM,iBAAiB,EAAE,EAAE,0BAA0B,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACxC,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;IAC3D,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;IACT,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,qBAAqB,EAAE,CAAC;gBACvC,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,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACpC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,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"}
@@ -0,0 +1,41 @@
1
+ import { BaseWorkflow } from "./base-workflow.js";
2
+ export type EnvironmentVariableFlags = {
3
+ "environment-id"?: string;
4
+ };
5
+ export declare const resolveEnvironmentId: (flags: EnvironmentVariableFlags) => string;
6
+ export type EnvVar = {
7
+ key: string;
8
+ value: string;
9
+ isSecret: boolean;
10
+ };
11
+ export type EnvironmentVariableWorkflowFlags = {
12
+ "non-interactive"?: boolean;
13
+ key?: string;
14
+ value?: string;
15
+ secret?: boolean;
16
+ "env-file"?: string;
17
+ };
18
+ export declare function isValidEnvironmentVariableKey(key: string): boolean;
19
+ export declare function fetchEnvironmentVariables(environmentId: string): Promise<{
20
+ id: string;
21
+ key: string;
22
+ value: string;
23
+ isSecret: boolean;
24
+ createdAt: Date;
25
+ }[]>;
26
+ export declare class EnvironmentVariableWorkflow extends BaseWorkflow<EnvironmentVariableWorkflowFlags> {
27
+ protected isNonInteractive(): boolean;
28
+ add(environmentId: string): Promise<void>;
29
+ update(environmentId: string): Promise<void>;
30
+ remove(environmentId: string): Promise<void>;
31
+ private resolveEnvironmentVariablesForAdd;
32
+ private resolveAddKey;
33
+ private resolveAddValue;
34
+ private resolveAddSecret;
35
+ private resolveUpdateInput;
36
+ private resolveUpdateKey;
37
+ private resolveUpdateValue;
38
+ private resolveUpdateSecret;
39
+ private resolveRemoveKey;
40
+ private promptRemoveKey;
41
+ }