alpic 0.0.0-dev.fdfada2 → 0.0.0-dev.fe3e667
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/auth.e2e.test.d.ts +1 -0
- package/dist/__tests__/auth.e2e.test.js +142 -0
- package/dist/__tests__/auth.e2e.test.js.map +1 -0
- package/dist/__tests__/deploy.e2e.test.d.ts +1 -0
- package/dist/__tests__/deploy.e2e.test.js +217 -0
- package/dist/__tests__/deploy.e2e.test.js.map +1 -0
- package/dist/__tests__/fixtures/demo-project/index.d.ts +1 -0
- package/dist/__tests__/fixtures/demo-project/index.js +4 -0
- package/dist/__tests__/fixtures/demo-project/index.js.map +1 -0
- package/dist/__tests__/git.e2e.test.d.ts +1 -0
- package/dist/__tests__/git.e2e.test.js +218 -0
- package/dist/__tests__/git.e2e.test.js.map +1 -0
- package/dist/__tests__/mock-server.d.ts +22 -0
- package/dist/__tests__/mock-server.js +492 -0
- package/dist/__tests__/mock-server.js.map +1 -0
- package/dist/__tests__/utils.d.ts +61 -0
- package/dist/__tests__/utils.js +197 -0
- package/dist/__tests__/utils.js.map +1 -0
- package/dist/api.d.ts +0 -1
- package/dist/api.js +5 -9
- package/dist/api.js.map +1 -1
- package/dist/commands/deploy.d.ts +2 -2
- package/dist/commands/deploy.js +6 -10
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/git/connect.d.ts +9 -0
- package/dist/commands/git/connect.js +59 -0
- package/dist/commands/git/connect.js.map +1 -0
- package/dist/commands/git/disconnect.d.ts +9 -0
- package/dist/commands/git/disconnect.js +51 -0
- package/dist/commands/git/disconnect.js.map +1 -0
- package/dist/commands/git.d.ts +6 -0
- package/dist/commands/git.js +17 -0
- package/dist/commands/git.js.map +1 -0
- package/dist/commands/login.d.ts +6 -0
- package/dist/commands/login.js +39 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +6 -0
- package/dist/commands/logout.js +20 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/whoami.d.ts +6 -0
- package/dist/commands/whoami.js +25 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/env.d.ts +4 -0
- package/dist/env.js +10 -0
- package/dist/env.js.map +1 -0
- package/dist/lib/alpic-command.d.ts +4 -0
- package/dist/lib/alpic-command.js +17 -0
- package/dist/lib/alpic-command.js.map +1 -0
- package/dist/lib/auth/auth.d.ts +2 -0
- package/dist/lib/auth/auth.js +21 -0
- package/dist/lib/auth/auth.js.map +1 -0
- package/dist/lib/auth/oauth/client.d.ts +28 -0
- package/dist/lib/auth/oauth/client.js +110 -0
- package/dist/lib/auth/oauth/client.js.map +1 -0
- package/dist/lib/auth/oauth/constants.d.ts +2 -0
- package/dist/lib/auth/oauth/constants.js +3 -0
- package/dist/lib/auth/oauth/constants.js.map +1 -0
- package/dist/lib/auth/oauth/server/assets/alpic-mountain.png +0 -0
- package/dist/lib/auth/oauth/server/assets/authorize.html +195 -0
- package/dist/lib/auth/oauth/server/assets/callback.html +88 -0
- package/dist/lib/auth/oauth/server/index.d.ts +8 -0
- package/dist/lib/auth/oauth/server/index.js +102 -0
- package/dist/lib/auth/oauth/server/index.js.map +1 -0
- package/dist/lib/auth/whoami.d.ts +28 -0
- package/dist/lib/auth/whoami.js +35 -0
- package/dist/lib/auth/whoami.js.map +1 -0
- package/dist/lib/deployment.d.ts +2 -3
- package/dist/lib/deployment.js +13 -8
- package/dist/lib/deployment.js.map +1 -1
- package/dist/lib/git.d.ts +14 -0
- package/dist/lib/git.js +105 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/global-store.d.ts +28 -0
- package/dist/lib/global-store.js +75 -0
- package/dist/lib/global-store.js.map +1 -0
- package/dist/lib/project.js +6 -2
- package/dist/lib/project.js.map +1 -1
- package/dist/lib/telemetry.js +6 -6
- package/dist/lib/telemetry.js.map +1 -1
- package/package.json +26 -27
- package/dist/lib/global-config.d.ts +0 -9
- package/dist/lib/global-config.js +0 -48
- package/dist/lib/global-config.js.map +0 -1
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import pty from "node-pty";
|
|
2
|
+
import { execFileSync } from "node:child_process";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { cp, mkdtemp } from "node:fs/promises";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
import { dirname, join } from "node:path";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
import { expect } from "vitest";
|
|
10
|
+
const __testDirname = dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
export async function cliSession(cmd, args, options, fn) {
|
|
12
|
+
const { cwd, env, cols = 100, rows = 30, timeoutMs = 8000 } = options;
|
|
13
|
+
const mergedEnv = {
|
|
14
|
+
...process.env,
|
|
15
|
+
NO_COLOR: "1",
|
|
16
|
+
// Resolve @alpic-ai/api to TypeScript source via the "development" export condition,
|
|
17
|
+
// so e2e tests run without building the api package first.
|
|
18
|
+
NODE_OPTIONS: [process.env.NODE_OPTIONS, "--conditions=development"].filter(Boolean).join(" "),
|
|
19
|
+
NODE_TLS_REJECT_UNAUTHORIZED: "0",
|
|
20
|
+
...Object.fromEntries(Object.entries(env ?? {}).filter(([, v]) => v !== undefined)),
|
|
21
|
+
};
|
|
22
|
+
for (const [k, v] of Object.entries(mergedEnv)) {
|
|
23
|
+
if (typeof v !== "string") {
|
|
24
|
+
console.error("[pty] bad env entry:", k, v, typeof v);
|
|
25
|
+
throw new Error(`env value for ${k} is not a string`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const term = pty.spawn(cmd, args, {
|
|
29
|
+
cwd,
|
|
30
|
+
env: mergedEnv,
|
|
31
|
+
name: "xterm-256color",
|
|
32
|
+
cols,
|
|
33
|
+
rows,
|
|
34
|
+
});
|
|
35
|
+
let buf = "";
|
|
36
|
+
const append = (data) => {
|
|
37
|
+
buf += data;
|
|
38
|
+
};
|
|
39
|
+
term.onData(append);
|
|
40
|
+
let exitCode = null;
|
|
41
|
+
const exitPromise = new Promise((resolve) => {
|
|
42
|
+
term.onExit((e) => {
|
|
43
|
+
exitCode = e.exitCode ?? null;
|
|
44
|
+
resolve();
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
const controller = {
|
|
48
|
+
expect: (pattern, opts) => waitFor(() => matches(buf, pattern), opts?.timeoutMs ?? timeoutMs, () => buf, pattern),
|
|
49
|
+
send: async (line) => {
|
|
50
|
+
term.write(line + "\r");
|
|
51
|
+
},
|
|
52
|
+
write: (data) => term.write(data),
|
|
53
|
+
output: () => buf,
|
|
54
|
+
clear: () => {
|
|
55
|
+
buf = "";
|
|
56
|
+
},
|
|
57
|
+
stop: () => {
|
|
58
|
+
try {
|
|
59
|
+
term.kill();
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// ignore
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
try {
|
|
67
|
+
await fn(controller);
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
await Promise.race([exitPromise, sleep(1500)]);
|
|
71
|
+
controller.stop();
|
|
72
|
+
await Promise.race([exitPromise, sleep(200)]);
|
|
73
|
+
}
|
|
74
|
+
return { exitCode, output: buf };
|
|
75
|
+
}
|
|
76
|
+
function matches(text, pattern) {
|
|
77
|
+
if (typeof pattern === "string")
|
|
78
|
+
return text.includes(pattern);
|
|
79
|
+
return pattern.test(text);
|
|
80
|
+
}
|
|
81
|
+
async function waitFor(predicate, timeoutMs, getOutput, pattern) {
|
|
82
|
+
const start = Date.now();
|
|
83
|
+
while (true) {
|
|
84
|
+
if (predicate())
|
|
85
|
+
return;
|
|
86
|
+
if (Date.now() - start > timeoutMs) {
|
|
87
|
+
const out = getOutput();
|
|
88
|
+
throw new Error(`Timed out after ${timeoutMs}ms waiting for: ${patternToString(pattern)}\n\n` +
|
|
89
|
+
`--- current output ---\n${out}\n--- end output ---\n`);
|
|
90
|
+
}
|
|
91
|
+
await sleep(20);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function patternToString(p) {
|
|
95
|
+
return typeof p === "string" ? JSON.stringify(p) : `/${p.source}/${p.flags}`;
|
|
96
|
+
}
|
|
97
|
+
function sleep(ms) {
|
|
98
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
99
|
+
}
|
|
100
|
+
export function buildMockProject(params) {
|
|
101
|
+
const { projectId, teamId, projectName, environmentId, environmentName, sourceRepository = null, sourceBranch = null, } = params;
|
|
102
|
+
const mcpServerUrl = `https://mcp-${projectId}.alpic.ai`;
|
|
103
|
+
return {
|
|
104
|
+
id: projectId,
|
|
105
|
+
name: projectName,
|
|
106
|
+
teamId,
|
|
107
|
+
environments: [
|
|
108
|
+
{
|
|
109
|
+
id: environmentId,
|
|
110
|
+
name: environmentName,
|
|
111
|
+
sourceBranch,
|
|
112
|
+
mcpServerUrl,
|
|
113
|
+
createdAt: new Date(),
|
|
114
|
+
projectId,
|
|
115
|
+
latestDeployment: null,
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
productionEnvironment: {
|
|
119
|
+
id: environmentId,
|
|
120
|
+
name: environmentName,
|
|
121
|
+
mcpServerUrl,
|
|
122
|
+
latestDeployment: null,
|
|
123
|
+
},
|
|
124
|
+
sourceRepository,
|
|
125
|
+
runtime: "node24",
|
|
126
|
+
transport: null,
|
|
127
|
+
rootDirectory: null,
|
|
128
|
+
buildCommand: null,
|
|
129
|
+
buildOutputDir: null,
|
|
130
|
+
installCommand: null,
|
|
131
|
+
startCommand: null,
|
|
132
|
+
createdAt: new Date(),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
export async function setupTestDirectory(options = {}) {
|
|
136
|
+
const { prefix = "alpic-cli-e2e", initGit = false } = options;
|
|
137
|
+
const uniqueId = randomUUID();
|
|
138
|
+
const cwd = await mkdtemp(join(tmpdir(), `${prefix}-${uniqueId}-`));
|
|
139
|
+
const fixturePath = join(__testDirname, "fixtures", "demo-project");
|
|
140
|
+
await cp(fixturePath, cwd, { recursive: true });
|
|
141
|
+
if (initGit) {
|
|
142
|
+
runGit(["init"], cwd);
|
|
143
|
+
runGit(["remote", "add", "origin", "git@github.com:acme/frontend.git"], cwd);
|
|
144
|
+
runGit(["remote", "add", "upstream", "https://github.com/acme/backend.git"], cwd);
|
|
145
|
+
}
|
|
146
|
+
const binPath = join(process.cwd(), "bin", "dev.js");
|
|
147
|
+
return { cwd, binPath };
|
|
148
|
+
}
|
|
149
|
+
export function createConfigFile(cwd, projectId, teamId, projectName, environmentId, environmentName) {
|
|
150
|
+
const configDir = join(cwd, ".alpic");
|
|
151
|
+
mkdirSync(configDir, { recursive: true });
|
|
152
|
+
const configPath = join(configDir, "project.json");
|
|
153
|
+
writeFileSync(configPath, JSON.stringify({
|
|
154
|
+
projectId,
|
|
155
|
+
teamId,
|
|
156
|
+
projectName,
|
|
157
|
+
environmentId,
|
|
158
|
+
environmentName,
|
|
159
|
+
}));
|
|
160
|
+
}
|
|
161
|
+
export function runGit(args, cwd) {
|
|
162
|
+
execFileSync("git", args, {
|
|
163
|
+
cwd,
|
|
164
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
export function expectSuccessfulApiCall(call, customAssertions) {
|
|
168
|
+
expect(call).toBeDefined();
|
|
169
|
+
expect(call?.responseStatus).toBe(200);
|
|
170
|
+
if (customAssertions && call) {
|
|
171
|
+
customAssertions(call);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Create OAuth credentials in a temp config dir and return env for CLI subprocess.
|
|
176
|
+
* Use this to run commands with OAuth auth (no ALPIC_API_KEY).
|
|
177
|
+
* Caller must pass serverUrl so userinfo can be pointed at the mock server.
|
|
178
|
+
*/
|
|
179
|
+
export function createOAuthEnv(cwd, serverUrl) {
|
|
180
|
+
const configHome = join(cwd, ".config");
|
|
181
|
+
const alpicConfigDir = join(configHome, "alpic");
|
|
182
|
+
mkdirSync(alpicConfigDir, { recursive: true });
|
|
183
|
+
const credentialsPath = join(alpicConfigDir, "credentials.json");
|
|
184
|
+
const expiresAt = Math.floor(Date.now() / 1000) + 3600; // seconds
|
|
185
|
+
writeFileSync(credentialsPath, JSON.stringify({
|
|
186
|
+
access_token: "test-oauth-token",
|
|
187
|
+
refresh_token: "test-refresh-token",
|
|
188
|
+
expires_at: expiresAt,
|
|
189
|
+
sub: "test-sub",
|
|
190
|
+
}), "utf-8");
|
|
191
|
+
return {
|
|
192
|
+
XDG_CONFIG_HOME: configHome,
|
|
193
|
+
ALPIC_COGNITO_URL: serverUrl,
|
|
194
|
+
ALPIC_API_BASE_URL: serverUrl,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/__tests__/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/api.d.ts
CHANGED
package/dist/api.js
CHANGED
|
@@ -2,16 +2,12 @@ import { createORPCClient } from "@orpc/client";
|
|
|
2
2
|
import { ResponseValidationPlugin } from "@orpc/contract/plugins";
|
|
3
3
|
import { OpenAPILink } from "@orpc/openapi-client/fetch";
|
|
4
4
|
import { contract } from "@alpic-ai/api";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
export function getFrontendBaseUrl() {
|
|
9
|
-
return process.env.ALPIC_FRONTEND_BASE_URL ?? "https://app.alpic.ai";
|
|
10
|
-
}
|
|
5
|
+
import { env } from "./env.js";
|
|
6
|
+
import { getApiToken } from "./lib/auth/auth.js";
|
|
11
7
|
const link = new OpenAPILink(contract, {
|
|
12
|
-
url:
|
|
13
|
-
headers: {
|
|
14
|
-
Authorization: `Bearer ${
|
|
8
|
+
url: env.ALPIC_API_BASE_URL,
|
|
9
|
+
headers: async () => {
|
|
10
|
+
return getApiToken().then((token) => (token ? { Authorization: `Bearer ${token}` } : {}));
|
|
15
11
|
},
|
|
16
12
|
plugins: [new ResponseValidationPlugin(contract)],
|
|
17
13
|
});
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE;IACrC,GAAG,EAAE,GAAG,CAAC,kBAAkB;IAC3B,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,OAAO,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,EAAE,CAAC,IAAI,wBAAwB,CAAC,QAAQ,CAAC,CAAC;CAClD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,GAAG,GAA0C,gBAAgB,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare class Deploy extends
|
|
1
|
+
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
2
|
+
export declare class Deploy extends AlpicCommand {
|
|
3
3
|
static description: string;
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static args: {
|
package/dist/commands/deploy.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
|
-
import { Args
|
|
2
|
+
import { Args } from "@oclif/core";
|
|
3
3
|
import chalk from "chalk";
|
|
4
4
|
import { readFileSync, rmSync } from "node:fs";
|
|
5
5
|
import { api } from "../api.js";
|
|
6
|
+
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
6
7
|
import { createTarArchive, getFilesToPack } from "../lib/archive.js";
|
|
8
|
+
import { isAuthenticated } from "../lib/auth/auth.js";
|
|
7
9
|
import { deployAndWait, formatElapsed } from "../lib/deployment.js";
|
|
8
10
|
import { resolveDeployDir, resolveProjectForDeploy } from "../lib/project.js";
|
|
9
11
|
import { uploadToPresignedUrl } from "../lib/upload.js";
|
|
10
|
-
export class Deploy extends
|
|
12
|
+
export class Deploy extends AlpicCommand {
|
|
11
13
|
static description = "Deploy a project to Alpic";
|
|
12
14
|
static examples = ["<%= config.bin %> deploy", "<%= config.bin %> deploy ./my-app"];
|
|
13
15
|
static args = {
|
|
@@ -19,17 +21,14 @@ export class Deploy extends Command {
|
|
|
19
21
|
async run() {
|
|
20
22
|
const { args } = await this.parse(Deploy);
|
|
21
23
|
p.intro("Deploying to Alpic");
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
p.cancel("ALPIC_API_KEY environment variable is required. Get your API key from Team settings in the Alpic dashboard.");
|
|
25
|
-
this.exit(1);
|
|
24
|
+
if (!(await isAuthenticated())) {
|
|
25
|
+
p.cancel("Not authenticated. Run `alpic login` or set ALPIC_API_KEY. Get an API key from Team settings in the Alpic dashboard.");
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
28
|
const deployDir = resolveDeployDir(args.directory);
|
|
29
29
|
const config = await resolveProjectForDeploy(deployDir);
|
|
30
30
|
if (!config) {
|
|
31
31
|
p.cancel("Deploy cancelled");
|
|
32
|
-
this.exit(1);
|
|
33
32
|
return;
|
|
34
33
|
}
|
|
35
34
|
const spinner = p.spinner();
|
|
@@ -53,8 +52,6 @@ export class Deploy extends Command {
|
|
|
53
52
|
const { deployment, elapsedMs } = await deployAndWait({
|
|
54
53
|
initial: initialDeployment,
|
|
55
54
|
startedAt: deployStartedAt,
|
|
56
|
-
teamId: config.teamId,
|
|
57
|
-
projectId: config.projectId,
|
|
58
55
|
});
|
|
59
56
|
const elapsedStr = formatElapsed(elapsedMs);
|
|
60
57
|
if (deployment.status !== "deployed") {
|
|
@@ -74,7 +71,6 @@ export class Deploy extends Command {
|
|
|
74
71
|
spinner.stop();
|
|
75
72
|
const message = error instanceof Error ? error.message : String(error);
|
|
76
73
|
p.cancel(`Error: ${message}`);
|
|
77
|
-
this.exit(1);
|
|
78
74
|
}
|
|
79
75
|
finally {
|
|
80
76
|
if (tmpDir) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AlpicCommand } from "../../lib/alpic-command.js";
|
|
2
|
+
export default class GitConnect extends AlpicCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
directory: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import { Args } from "@oclif/core";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { api } from "../../api.js";
|
|
5
|
+
import { AlpicCommand } from "../../lib/alpic-command.js";
|
|
6
|
+
import { isAuthenticated } from "../../lib/auth/auth.js";
|
|
7
|
+
import { config } from "../../lib/config.js";
|
|
8
|
+
import { confirmLinkAnotherIfAlreadyConnected, isGitRepository, listGithubRemotes, selectRemoteSourceRepository, showGitSetupInstructions, } from "../../lib/git.js";
|
|
9
|
+
import { resolveDeployDir } from "../../lib/project.js";
|
|
10
|
+
export default class GitConnect extends AlpicCommand {
|
|
11
|
+
static description = "Connect a linked Alpic project to a git remote source";
|
|
12
|
+
static examples = ["<%= config.bin %> git connect", "<%= config.bin %> git connect ./my-app"];
|
|
13
|
+
static args = {
|
|
14
|
+
directory: Args.string({
|
|
15
|
+
description: "Directory to connect (default: current directory)",
|
|
16
|
+
required: false,
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
async run() {
|
|
20
|
+
const { args } = await this.parse(GitConnect);
|
|
21
|
+
p.intro("Connecting git repository to Alpic");
|
|
22
|
+
if (!(await isAuthenticated())) {
|
|
23
|
+
p.cancel("Not authenticated. Run `alpic login` or set ALPIC_API_KEY. Get an API key from Team settings in the Alpic dashboard.");
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const deployDir = resolveDeployDir(args.directory);
|
|
27
|
+
const linkedConfig = config.load(deployDir);
|
|
28
|
+
if (!linkedConfig) {
|
|
29
|
+
p.cancel("This directory is not linked to an Alpic project. Link it first using `alpic deploy`.");
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (!isGitRepository(deployDir)) {
|
|
33
|
+
p.log.message("This directory is not a git repository.");
|
|
34
|
+
showGitSetupInstructions();
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const remotes = listGithubRemotes(deployDir);
|
|
38
|
+
if (remotes.length === 0) {
|
|
39
|
+
p.log.message("This git repository has no remotes configured.");
|
|
40
|
+
showGitSetupInstructions();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const project = await api.projects.get.v1({ projectId: linkedConfig.projectId });
|
|
44
|
+
if (!(await confirmLinkAnotherIfAlreadyConnected(project))) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const selectedSourceRepository = await selectRemoteSourceRepository(remotes);
|
|
48
|
+
if (selectedSourceRepository === null) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
await api.projects.update.v1({
|
|
52
|
+
projectId: linkedConfig.projectId,
|
|
53
|
+
sourceRepository: selectedSourceRepository,
|
|
54
|
+
});
|
|
55
|
+
p.log.info("To automatically trigger deployments on every push,\nmake sure to install the Alpic GitHub App on this repository.");
|
|
56
|
+
p.outro(`✅ Connected ${chalk.bold(selectedSourceRepository)} to project ${chalk.bold(project.name)}.`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=connect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/commands/git/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AlpicCommand } from "../../lib/alpic-command.js";
|
|
2
|
+
export default class GitDisconnect extends AlpicCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
directory: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import { Args } from "@oclif/core";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { api } from "../../api.js";
|
|
5
|
+
import { AlpicCommand } from "../../lib/alpic-command.js";
|
|
6
|
+
import { isAuthenticated } from "../../lib/auth/auth.js";
|
|
7
|
+
import { config } from "../../lib/config.js";
|
|
8
|
+
import { resolveDeployDir } from "../../lib/project.js";
|
|
9
|
+
export default class GitDisconnect extends AlpicCommand {
|
|
10
|
+
static description = "Disconnect a linked Alpic project from its git remote source";
|
|
11
|
+
static examples = ["<%= config.bin %> git disconnect", "<%= config.bin %> git disconnect ./my-app"];
|
|
12
|
+
static args = {
|
|
13
|
+
directory: Args.string({
|
|
14
|
+
description: "Directory to disconnect (default: current directory)",
|
|
15
|
+
required: false,
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
async run() {
|
|
19
|
+
const { args } = await this.parse(GitDisconnect);
|
|
20
|
+
p.intro("Disconnecting git repository from Alpic");
|
|
21
|
+
if (!(await isAuthenticated())) {
|
|
22
|
+
p.cancel("Not authenticated. Run `alpic login` or set ALPIC_API_KEY. Get an API key from Team settings in the Alpic dashboard.");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const deployDir = resolveDeployDir(args.directory);
|
|
26
|
+
const linkedConfig = config.load(deployDir);
|
|
27
|
+
if (!linkedConfig) {
|
|
28
|
+
p.cancel("This directory is not linked to an Alpic project. Link it first using `alpic deploy`.");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const project = await api.projects.get.v1({ projectId: linkedConfig.projectId });
|
|
32
|
+
if (!project.sourceRepository) {
|
|
33
|
+
p.cancel(`Project "${project.name}" is not connected to any repository.`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const confirm = await p.confirm({
|
|
37
|
+
message: `Are you sure you want to disconnect ${chalk.bold(project.sourceRepository)} from project ${chalk.bold(project.name)}?`,
|
|
38
|
+
initialValue: false,
|
|
39
|
+
});
|
|
40
|
+
if (p.isCancel(confirm) || !confirm) {
|
|
41
|
+
p.cancel("Git disconnect cancelled");
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
await api.projects.update.v1({
|
|
45
|
+
projectId: linkedConfig.projectId,
|
|
46
|
+
sourceRepository: null,
|
|
47
|
+
});
|
|
48
|
+
p.outro(`✅ Disconnected ${chalk.bold(project.sourceRepository)} from project ${chalk.bold(project.name)}.`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=disconnect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disconnect.js","sourceRoot":"","sources":["../../../src/commands/git/disconnect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,YAAY;IACrD,MAAM,CAAU,WAAW,GAAG,8DAA8D,CAAC;IAE7F,MAAM,CAAU,QAAQ,GAAG,CAAC,kCAAkC,EAAE,2CAA2C,CAAC,CAAC;IAE7G,MAAM,CAAU,IAAI,GAAG;QACrB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC;YACrB,WAAW,EAAE,sDAAsD;YACnE,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACjD,CAAC,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAEnD,IAAI,CAAC,CAAC,MAAM,eAAe,EAAE,CAAC,EAAE,CAAC;YAC/B,CAAC,CAAC,MAAM,CACN,sHAAsH,CACvH,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,CAAC,CAAC,MAAM,CAAC,uFAAuF,CAAC,CAAC;YAClG,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC9B,CAAC,CAAC,MAAM,CAAC,YAAY,OAAO,CAAC,IAAI,uCAAuC,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;YAC9B,OAAO,EAAE,uCAAuC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG;YAChI,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,CAAC,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,SAAS,EAAE,YAAY,CAAC,SAAS;YACjC,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC;QAEH,CAAC,CAAC,KAAK,CAAC,kBAAkB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9G,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Command } from "@oclif/core";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
export default class Git extends Command {
|
|
4
|
+
static description = "Manage git repository connection for a linked Alpic project";
|
|
5
|
+
static examples = ["<%= config.bin %> git connect", "<%= config.bin %> git disconnect"];
|
|
6
|
+
async run() {
|
|
7
|
+
await this.parse(Git);
|
|
8
|
+
this.log(chalk.bold("Usage:"));
|
|
9
|
+
this.log(" alpic git connect [directory]");
|
|
10
|
+
this.log(" alpic git disconnect [directory]");
|
|
11
|
+
this.log("");
|
|
12
|
+
this.log(chalk.bold("Commands:"));
|
|
13
|
+
this.log(" connect Connect the linked Alpic project to a git remote source");
|
|
14
|
+
this.log(" disconnect Disconnect the linked Alpic project from its git remote source");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/commands/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,OAAO;IACtC,MAAM,CAAU,WAAW,GAAG,6DAA6D,CAAC;IAE5F,MAAM,CAAU,QAAQ,GAAG,CAAC,+BAA+B,EAAE,kCAAkC,CAAC,CAAC;IAEjG,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEtB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;QAClF,IAAI,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;IAC3F,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import open from "open";
|
|
4
|
+
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
5
|
+
import { oAuthClient } from "../lib/auth/oauth/client.js";
|
|
6
|
+
import { getLoginPageUrl, listenToOAuthCallback } from "../lib/auth/oauth/server/index.js";
|
|
7
|
+
import { getWhoamiInfo } from "../lib/auth/whoami.js";
|
|
8
|
+
import { globalStore } from "../lib/global-store.js";
|
|
9
|
+
export class Login extends AlpicCommand {
|
|
10
|
+
static description = "Log in to Alpic (opens browser, stores tokens)";
|
|
11
|
+
static examples = ["<%= config.bin %> login"];
|
|
12
|
+
async run() {
|
|
13
|
+
await this.parse(Login);
|
|
14
|
+
p.intro("Log in to Alpic");
|
|
15
|
+
const token = await oAuthClient.getValidAccessToken();
|
|
16
|
+
if (token) {
|
|
17
|
+
p.outro("Already logged in.");
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const { authorizeUrl, state, nonce, codeVerifier } = await oAuthClient.prepareOAuthConfig();
|
|
21
|
+
p.log.message("Opening browser to log in…");
|
|
22
|
+
await open(getLoginPageUrl());
|
|
23
|
+
const storedToken = await listenToOAuthCallback({
|
|
24
|
+
state,
|
|
25
|
+
nonce,
|
|
26
|
+
codeVerifier,
|
|
27
|
+
authorizeUrl: authorizeUrl.toString(),
|
|
28
|
+
});
|
|
29
|
+
globalStore.saveCredentials(storedToken);
|
|
30
|
+
const info = await getWhoamiInfo();
|
|
31
|
+
if (!info) {
|
|
32
|
+
p.cancel("Failed to get user information.");
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const msg = `Authenticated as ${chalk.green(info.name)} (${chalk.cyan(info.email)})`;
|
|
36
|
+
p.outro(msg);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,OAAO,KAAM,SAAQ,YAAY;IACrC,MAAM,CAAU,WAAW,GAAG,gDAAgD,CAAC;IAE/E,MAAM,CAAU,QAAQ,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAEvD,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAExB,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAE3B,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,mBAAmB,EAAE,CAAC;QACtD,IAAI,KAAK,EAAE,CAAC;YACV,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,WAAW,CAAC,kBAAkB,EAAE,CAAC;QAE5F,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAC5C,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QAE9B,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC;YAC9C,KAAK;YACL,KAAK;YACL,YAAY;YACZ,YAAY,EAAE,YAAY,CAAC,QAAQ,EAAE;SACtC,CAAC,CAAC;QAEH,WAAW,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAEzC,MAAM,IAAI,GAAG,MAAM,aAAa,EAAE,CAAC;QAEnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,CAAC,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,oBAAoB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QACrF,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACf,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
3
|
+
import { globalStore } from "../lib/global-store.js";
|
|
4
|
+
export class Logout extends AlpicCommand {
|
|
5
|
+
static description = "Log out from Alpic (removes stored OAuth credentials)";
|
|
6
|
+
static examples = ["<%= config.bin %> logout"];
|
|
7
|
+
async run() {
|
|
8
|
+
await this.parse(Logout);
|
|
9
|
+
p.intro("Log out from Alpic");
|
|
10
|
+
const hasCredentials = globalStore.getCredentials() !== null;
|
|
11
|
+
if (!hasCredentials) {
|
|
12
|
+
p.outro("You are not logged in.");
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
globalStore.clearCredentials();
|
|
16
|
+
p.log.success("✅ User authentication cleared.");
|
|
17
|
+
p.outro("You are logged out.");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,OAAO,MAAO,SAAQ,YAAY;IACtC,MAAM,CAAU,WAAW,GAAG,uDAAuD,CAAC;IAEtF,MAAM,CAAU,QAAQ,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAExD,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEzB,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAE9B,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC;QAE7D,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,WAAW,CAAC,gBAAgB,EAAE,CAAC;QAE/B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;QAEhD,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACjC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
4
|
+
import { getWhoamiInfo } from "../lib/auth/whoami.js";
|
|
5
|
+
export class Whoami extends AlpicCommand {
|
|
6
|
+
static description = "Show the current Alpic identity (API key or logged-in user)";
|
|
7
|
+
static examples = ["<%= config.bin %> whoami"];
|
|
8
|
+
async run() {
|
|
9
|
+
await this.parse(Whoami);
|
|
10
|
+
p.intro("Reading authentication status…");
|
|
11
|
+
const info = await getWhoamiInfo();
|
|
12
|
+
if (!info) {
|
|
13
|
+
p.cancel("Not logged in. Run `alpic login` or set ALPIC_API_KEY.");
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (info.method === "api_key") {
|
|
17
|
+
const msg = `Authenticated via API key — Team: ${chalk.green(info.team?.name ?? "unknown")}`;
|
|
18
|
+
p.outro(msg);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const msg = `Authenticated as ${chalk.green(info.name)} (${chalk.cyan(info.email)})`;
|
|
22
|
+
p.outro(msg);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,OAAO,MAAO,SAAQ,YAAY;IACtC,MAAM,CAAU,WAAW,GAAG,6DAA6D,CAAC;IAE5F,MAAM,CAAU,QAAQ,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAExD,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEzB,CAAC,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAE1C,MAAM,IAAI,GAAG,MAAM,aAAa,EAAE,CAAC;QAEnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,CAAC,CAAC,MAAM,CAAC,wDAAwD,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,qCAAqC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,SAAS,CAAC,EAAE,CAAC;YAC7F,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACb,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,oBAAoB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QACrF,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACf,CAAC"}
|
package/dist/env.d.ts
ADDED