alpic 0.0.0-dev.geef385d → 0.0.0-dev.gefc16e2

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 (92) hide show
  1. package/dist/__tests__/alpic-command.test.js +8 -4
  2. package/dist/__tests__/alpic-command.test.js.map +1 -1
  3. package/dist/__tests__/auth.e2e.test.js +3 -1
  4. package/dist/__tests__/auth.e2e.test.js.map +1 -1
  5. package/dist/__tests__/environment-list.e2e.test.js +1 -1
  6. package/dist/__tests__/environment-list.e2e.test.js.map +1 -1
  7. package/dist/__tests__/mock-api.d.ts +6 -0
  8. package/dist/__tests__/mock-api.js +14 -8
  9. package/dist/__tests__/mock-api.js.map +1 -1
  10. package/dist/__tests__/playground/playground-example-prompt.e2e.test.js +6 -4
  11. package/dist/__tests__/playground/playground-example-prompt.e2e.test.js.map +1 -1
  12. package/dist/__tests__/tunnel.e2e.test.js +60 -0
  13. package/dist/__tests__/tunnel.e2e.test.js.map +1 -1
  14. package/dist/__tests__/utils.js +2 -2
  15. package/dist/__tests__/utils.js.map +1 -1
  16. package/dist/api.d.ts +1 -1
  17. package/dist/api.js +2 -21
  18. package/dist/api.js.map +1 -1
  19. package/dist/commands/deploy.js +66 -52
  20. package/dist/commands/deploy.js.map +1 -1
  21. package/dist/commands/git/connect.js +2 -2
  22. package/dist/commands/git/connect.js.map +1 -1
  23. package/dist/commands/git/disconnect.js +2 -2
  24. package/dist/commands/git/disconnect.js.map +1 -1
  25. package/dist/commands/link.js.map +1 -1
  26. package/dist/commands/login.js +7 -5
  27. package/dist/commands/login.js.map +1 -1
  28. package/dist/commands/logout.js +1 -1
  29. package/dist/commands/logout.js.map +1 -1
  30. package/dist/commands/playground/example-prompt/add.js +1 -1
  31. package/dist/commands/tunnel.js +27 -59
  32. package/dist/commands/tunnel.js.map +1 -1
  33. package/dist/commands/whoami.js +1 -1
  34. package/dist/commands/whoami.js.map +1 -1
  35. package/dist/lib/alpic-command.js +6 -5
  36. package/dist/lib/alpic-command.js.map +1 -1
  37. package/dist/lib/alpic-sdk.d.ts +2 -0
  38. package/dist/lib/alpic-sdk.js +9 -0
  39. package/dist/lib/alpic-sdk.js.map +1 -0
  40. package/dist/lib/audit.js +2 -2
  41. package/dist/lib/audit.js.map +1 -1
  42. package/dist/lib/deployment.d.ts +0 -21
  43. package/dist/lib/deployment.js +9 -58
  44. package/dist/lib/deployment.js.map +1 -1
  45. package/dist/lib/link.d.ts +1 -2
  46. package/dist/lib/link.js +9 -61
  47. package/dist/lib/link.js.map +1 -1
  48. package/dist/lib/playground.js +2 -2
  49. package/dist/lib/resolve.js +4 -4
  50. package/dist/lib/resolve.js.map +1 -1
  51. package/dist/lib/telemetry.js +1 -1
  52. package/dist/lib/telemetry.js.map +1 -1
  53. package/dist/lib/whoami.js +17 -0
  54. package/dist/lib/whoami.js.map +1 -0
  55. package/package.json +19 -23
  56. package/dist/lib/archive.d.ts +0 -7
  57. package/dist/lib/archive.js +0 -57
  58. package/dist/lib/archive.js.map +0 -1
  59. package/dist/lib/auth/auth.d.ts +0 -5
  60. package/dist/lib/auth/auth.js +0 -50
  61. package/dist/lib/auth/auth.js.map +0 -1
  62. package/dist/lib/auth/oauth/client.d.ts +0 -28
  63. package/dist/lib/auth/oauth/client.js +0 -116
  64. package/dist/lib/auth/oauth/client.js.map +0 -1
  65. package/dist/lib/auth/oauth/constants.d.ts +0 -2
  66. package/dist/lib/auth/oauth/constants.js +0 -3
  67. package/dist/lib/auth/oauth/constants.js.map +0 -1
  68. package/dist/lib/auth/oauth/server/assets/alpic-mountain.png +0 -0
  69. package/dist/lib/auth/oauth/server/assets/authorize.html +0 -234
  70. package/dist/lib/auth/oauth/server/assets/callback.html +0 -88
  71. package/dist/lib/auth/oauth/server/index.d.ts +0 -9
  72. package/dist/lib/auth/oauth/server/index.js +0 -128
  73. package/dist/lib/auth/oauth/server/index.js.map +0 -1
  74. package/dist/lib/auth/whoami.js +0 -47
  75. package/dist/lib/auth/whoami.js.map +0 -1
  76. package/dist/lib/config.d.ts +0 -12
  77. package/dist/lib/config.js +0 -32
  78. package/dist/lib/config.js.map +0 -1
  79. package/dist/lib/global-store.d.ts +0 -28
  80. package/dist/lib/global-store.js +0 -76
  81. package/dist/lib/global-store.js.map +0 -1
  82. package/dist/lib/upload.d.ts +0 -1
  83. package/dist/lib/upload.js +0 -13
  84. package/dist/lib/upload.js.map +0 -1
  85. package/dist/lib/vendor/pipenet.d.ts +0 -1
  86. package/dist/lib/vendor/pipenet.js +0 -15626
  87. package/dist/lib/vendor/pipenet.js.LEGAL.txt +0 -17
  88. package/dist/lib/vendor/pipenet.js.map +0 -7
  89. package/dist/types.d.ts +0 -8
  90. package/dist/types.js +0 -2
  91. package/dist/types.js.map +0 -1
  92. /package/dist/lib/{auth/whoami.d.ts → whoami.d.ts} +0 -0
@@ -1,234 +0,0 @@
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-sso {
119
- background: none;
120
- border: none;
121
- color: rgba(5, 20, 19, 0.6);
122
- font-size: 14px;
123
- font-weight: 500;
124
- height: 32px;
125
- width: auto;
126
- padding: 0 8px;
127
- gap: 4px;
128
- border-radius: 6px;
129
- }
130
- .btn-sso svg {
131
- width: 16px;
132
- height: 16px;
133
- stroke: rgba(5, 20, 19, 0.6);
134
- fill: none;
135
- }
136
- .btn-sso:hover {
137
- background: rgba(5, 20, 19, 0.06);
138
- color: var(--midnight);
139
- }
140
- .btn-sso:hover svg {
141
- stroke: var(--midnight);
142
- }
143
-
144
- .btn-loading {
145
- opacity: 0.7;
146
- pointer-events: none;
147
- cursor: default;
148
- transition: opacity 0.2s;
149
- }
150
- .spinner {
151
- width: 20px;
152
- height: 20px;
153
- animation: spin 0.8s linear infinite;
154
- }
155
- @keyframes spin {
156
- to {
157
- transform: rotate(360deg);
158
- }
159
- }
160
-
161
- @media (max-width: 768px) {
162
- body {
163
- padding: 16px;
164
- }
165
- .card {
166
- width: 100%;
167
- height: auto;
168
- padding: 24px;
169
- }
170
- h1 {
171
- font-size: 36px;
172
- }
173
- .subtitle {
174
- font-size: 18px;
175
- }
176
- }
177
- </style>
178
- </head>
179
- <body>
180
- <div class="card">
181
- <h1>Welcome to Alpic</h1>
182
- <p class="subtitle">Sign in to use Alpic CLI</p>
183
- <div class="buttons">
184
- <button class="btn btn-github" onclick="login('Github', this)" type="button">
185
- <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
186
- <title>GitHub</title>
187
- <path
188
- 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"
189
- />
190
- </svg>
191
- Sign in with GitHub
192
- </button>
193
- <button class="btn btn-google" onclick="login('google', this)" type="button">
194
- <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
195
- <title>Google</title>
196
- <path
197
- 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"
198
- />
199
- </svg>
200
- Sign in with Google
201
- </button>
202
- <button class="btn btn-sso" onclick="login('WorkOS', this)" type="button">
203
- <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
204
- <title>SSO</title>
205
- <path d="M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z" />
206
- <path d="M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2" />
207
- <path d="M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2" />
208
- <path d="M10 6h4" />
209
- <path d="M10 10h4" />
210
- <path d="M10 14h4" />
211
- <path d="M10 18h4" />
212
- </svg>
213
- Sign in with SSO
214
- </button>
215
- </div>
216
- </div>
217
- <script>
218
- var loaderSvg =
219
- '<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>';
220
- // biome-ignore lint/correctness/noUnusedVariables: The function is used within the buttons onclick handlers
221
- function login(provider, btn) {
222
- const icon = btn.querySelector("svg");
223
- const wrap = document.createElement("div");
224
- wrap.innerHTML = loaderSvg;
225
- icon.replaceWith(wrap.firstChild);
226
- btn.classList.add("btn-loading");
227
- btn.disabled = true;
228
- const url = new URL("%AUTH_BASE_URL%");
229
- url.searchParams.set("identity_provider", provider);
230
- window.location.href = url.toString();
231
- }
232
- </script>
233
- </body>
234
- </html>
@@ -1,88 +0,0 @@
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>
@@ -1,9 +0,0 @@
1
- import type { Credentials } from "../../../global-store.js";
2
- export declare const getLoginPageUrl: () => string;
3
- export declare const listenToOAuthCallback: ({ state, nonce, codeVerifier, authorizeUrl, isPlain, }: {
4
- state: string;
5
- nonce: string;
6
- codeVerifier: string;
7
- authorizeUrl?: string;
8
- isPlain?: boolean;
9
- }) => Promise<Credentials>;
@@ -1,128 +0,0 @@
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 { getOAuthClient } 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, isPlain, }) => 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
- const msg = e instanceof Error ? e.message : String(e);
29
- isPlain ? console.error(msg) : p.log.error(msg);
30
- res.writeHead(500).end();
31
- return;
32
- }
33
- }
34
- if (pathname === "/assets/alpic-mountain.png") {
35
- const filePath = path.join(ASSETS_DIR, "alpic-mountain.png");
36
- const content = await readFile(filePath);
37
- res.writeHead(200, { "Content-Type": "image/png", Connection: "close" });
38
- res.end(content);
39
- return;
40
- }
41
- if (!url.startsWith("/callback")) {
42
- res.writeHead(404).end();
43
- return;
44
- }
45
- try {
46
- const tokens = await getOAuthClient().exchangeAuthorizationCode({
47
- url: new URL(url, `http://${req.headers.host}`),
48
- codeVerifier,
49
- state,
50
- nonce,
51
- });
52
- const sub = tokens.claims()?.sub;
53
- if (!sub || !tokens.refresh_token) {
54
- throw new Error("ID token did not contain sub");
55
- }
56
- const stored = {
57
- access_token: tokens.access_token,
58
- refresh_token: tokens.refresh_token,
59
- expires_at: getOAuthClient().getExpiresAt(tokens.expires_in ?? 0),
60
- sub,
61
- };
62
- const msg = "Authentication successful";
63
- isPlain ? console.log(msg) : p.log.success(`✅ ${msg}`);
64
- const successHtmlPath = path.join(ASSETS_DIR, "callback.html");
65
- let html = await readFile(successHtmlPath, "utf-8");
66
- html = html
67
- .replace(/__CALLBACK_STATUS__/g, "success")
68
- .replace(/__CALLBACK_TITLE__/g, "You are logged in")
69
- .replace(/__CALLBACK_SUB__/g, "You can close this page.");
70
- res.writeHead(200, { "Content-Type": "text/html", Connection: "close" });
71
- res.end(html);
72
- onSuccess(stored);
73
- }
74
- catch (e) {
75
- const msg = e instanceof Error ? e.message : String(e);
76
- isPlain ? console.error(msg) : p.log.error(msg);
77
- const callbackHtmlPath = path.join(ASSETS_DIR, "callback.html");
78
- let html = await readFile(callbackHtmlPath, "utf-8");
79
- html = html
80
- .replace(/__CALLBACK_STATUS__/g, "error")
81
- .replace(/__CALLBACK_TITLE__/g, "An error occurred. You can close this page.")
82
- .replace(/__CALLBACK_SUB__/g, "");
83
- res.writeHead(500, { "Content-Type": "text/html", Connection: "close" });
84
- res.end(html);
85
- onError(e instanceof Error ? e : new Error(String(e)));
86
- }
87
- });
88
- export const getLoginPageUrl = () => `http://${LOOPBACK_HOST}:${LOOPBACK_PORT}/login`;
89
- const LOGIN_TIMEOUT_MS = 5 * 60 * 1000;
90
- export const listenToOAuthCallback = ({ state, nonce, codeVerifier, authorizeUrl, isPlain, }) => {
91
- return new Promise((resolve, reject) => {
92
- let timeoutHandle;
93
- const callbackServer = createCallbackServer({
94
- state,
95
- nonce,
96
- codeVerifier,
97
- authorizeUrl,
98
- isPlain,
99
- onSuccess: (storedToken) => {
100
- clearTimeout(timeoutHandle);
101
- callbackServer.close();
102
- resolve(storedToken);
103
- },
104
- onError: (err) => {
105
- clearTimeout(timeoutHandle);
106
- callbackServer.close();
107
- reject(err);
108
- },
109
- });
110
- callbackServer.on("error", (err) => {
111
- clearTimeout(timeoutHandle);
112
- callbackServer.close();
113
- if (err.code === "EADDRINUSE") {
114
- reject(new Error(`Port ${LOOPBACK_PORT} is already in use. Another login may be in progress. Please try again.`));
115
- }
116
- else {
117
- reject(err);
118
- }
119
- });
120
- timeoutHandle = setTimeout(() => {
121
- callbackServer.close();
122
- reject(new Error("Login timed out after 5 minutes. Please try again."));
123
- }, LOGIN_TIMEOUT_MS);
124
- timeoutHandle.unref();
125
- callbackServer.listen(LOOPBACK_PORT, LOOPBACK_HOST);
126
- });
127
- };
128
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/lib/auth/oauth/server/index.ts"],"names":[],"mappings":"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"}
@@ -1,47 +0,0 @@
1
- import chalk from "chalk";
2
- import { api } from "../../api.js";
3
- import { getOAuthClient } 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
- let label = chalk.cyan(info.email);
13
- if (info.name) {
14
- label = `${chalk.green(info.name)} (${label})`;
15
- }
16
- return `Authenticated as ${label}`;
17
- }
18
- async function getWhoamiInfoFromApiKey() {
19
- if (process.env.ALPIC_API_KEY === undefined) {
20
- return null;
21
- }
22
- const team = await getApiKeyTeam();
23
- return {
24
- method: "api_key",
25
- team,
26
- };
27
- }
28
- async function getWhoamiInfoFromOAuth() {
29
- const token = await getOAuthClient().getValidAccessToken();
30
- if (!token) {
31
- return null;
32
- }
33
- const userInfo = await getOAuthClient().fetchUserInfo(token);
34
- if (!userInfo) {
35
- return null;
36
- }
37
- return {
38
- method: "oauth",
39
- email: userInfo.email ?? "unknown",
40
- name: userInfo.name,
41
- };
42
- }
43
- async function getApiKeyTeam() {
44
- const teams = await api.teams.list.v1();
45
- return teams[0];
46
- }
47
- //# sourceMappingURL=whoami.js.map
@@ -1 +0,0 @@
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,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAanD,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,IAAI,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,KAAK,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC;IACjD,CAAC;IAED,OAAO,oBAAoB,KAAK,EAAE,CAAC;AACrC,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,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC;IAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,cAAc,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,MAAM,EAAE,OAAO;QACf,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,SAAS;QAClC,IAAI,EAAE,QAAQ,CAAC,IAAI;KACpB,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"}
@@ -1,12 +0,0 @@
1
- import type { ProjectConfig } from "../types.js";
2
- export declare const config: {
3
- load: () => {
4
- projectId: string;
5
- teamId: string;
6
- teamName: string | undefined;
7
- projectName: string;
8
- environmentId: string | undefined;
9
- environmentName: string | undefined;
10
- } | null;
11
- save: (projectConfig: ProjectConfig) => void;
12
- };
@@ -1,32 +0,0 @@
1
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
- import { join } from "node:path";
3
- const getProjectJsonPath = () => join(process.cwd(), ".alpic", "project.json");
4
- export const config = {
5
- load: () => {
6
- const path = getProjectJsonPath();
7
- if (!existsSync(path)) {
8
- return null;
9
- }
10
- let raw;
11
- try {
12
- raw = JSON.parse(readFileSync(path, "utf8"));
13
- }
14
- catch (error) {
15
- throw new Error(`Failed to load project config: ${error.message}`);
16
- }
17
- return {
18
- projectId: raw.projectId,
19
- teamId: raw.teamId,
20
- teamName: raw.teamName,
21
- projectName: raw.projectName ?? raw.projectId,
22
- environmentId: raw.environmentId,
23
- environmentName: raw.environmentName,
24
- };
25
- },
26
- save: (projectConfig) => {
27
- const path = getProjectJsonPath();
28
- mkdirSync(join(process.cwd(), ".alpic"), { recursive: true });
29
- writeFileSync(path, JSON.stringify(projectConfig, null, 2));
30
- },
31
- };
32
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
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,28 +0,0 @@
1
- export interface Credentials {
2
- access_token: string;
3
- refresh_token: string;
4
- expires_at: number;
5
- sub: string;
6
- }
7
- export interface Config {
8
- machineId: string;
9
- telemetry: {
10
- enabled: boolean;
11
- };
12
- }
13
- export declare class GlobalStore {
14
- private readonly configDir;
15
- constructor();
16
- getCredentials(): Credentials | null;
17
- saveCredentials(credentials: Credentials): void;
18
- clearCredentials(): void;
19
- getConfig(): Config;
20
- saveConfig(config: Config): void;
21
- clearConfig(): void;
22
- private getCredentialsFilePath;
23
- private getConfigFilePath;
24
- private parseJsonFile;
25
- private saveJsonFile;
26
- private clear;
27
- }
28
- export declare const globalStore: GlobalStore;
@@ -1,76 +0,0 @@
1
- import crypto from "node:crypto";
2
- import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
3
- import { join } from "node:path";
4
- import envPaths from "env-paths";
5
- export class GlobalStore {
6
- configDir;
7
- constructor() {
8
- const configDirOverride = process.env.ALPIC_GLOBAL_CONFIG_DIR;
9
- this.configDir = configDirOverride ?? envPaths("alpic", { suffix: "" }).config;
10
- }
11
- getCredentials() {
12
- const token = this.parseJsonFile(this.getCredentialsFilePath());
13
- if (!token) {
14
- return null;
15
- }
16
- return token;
17
- }
18
- saveCredentials(credentials) {
19
- this.saveJsonFile(this.getCredentialsFilePath(), credentials);
20
- }
21
- clearCredentials() {
22
- this.clear(this.getCredentialsFilePath());
23
- }
24
- getConfig() {
25
- const existing = this.parseJsonFile(this.getConfigFilePath());
26
- if (existing?.machineId && existing?.telemetry !== undefined) {
27
- return existing;
28
- }
29
- const config = {
30
- machineId: existing?.machineId ?? crypto.randomUUID(),
31
- telemetry: {
32
- enabled: existing?.telemetry?.enabled ?? true,
33
- },
34
- };
35
- this.saveConfig(config);
36
- return config;
37
- }
38
- saveConfig(config) {
39
- this.saveJsonFile(this.getConfigFilePath(), config);
40
- }
41
- clearConfig() {
42
- this.clear(this.getConfigFilePath());
43
- }
44
- getCredentialsFilePath() {
45
- return join(this.configDir, "credentials.json");
46
- }
47
- getConfigFilePath() {
48
- return join(this.configDir, "config.json");
49
- }
50
- parseJsonFile(filePath) {
51
- if (!existsSync(filePath)) {
52
- return null;
53
- }
54
- try {
55
- return JSON.parse(readFileSync(filePath, "utf-8"));
56
- }
57
- catch {
58
- this.clear(filePath);
59
- return null;
60
- }
61
- }
62
- saveJsonFile(filePath, data) {
63
- mkdirSync(this.configDir, { recursive: true });
64
- writeFileSync(filePath, JSON.stringify(data, null, 2), {
65
- encoding: "utf-8",
66
- mode: 0o600,
67
- });
68
- }
69
- clear(filePath) {
70
- if (existsSync(filePath)) {
71
- unlinkSync(filePath);
72
- }
73
- }
74
- }
75
- export const globalStore = new GlobalStore();
76
- //# sourceMappingURL=global-store.js.map