alpic 0.0.0-dev.ff063bb → 0.0.0-dev.ff6c5b5
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-flags.e2e.test.d.ts +1 -0
- package/dist/__tests__/deploy-flags.e2e.test.js +87 -0
- package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -0
- package/dist/__tests__/deploy.e2e.test.d.ts +1 -0
- package/dist/__tests__/deploy.e2e.test.js +168 -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-flags.e2e.test.d.ts +1 -0
- package/dist/__tests__/git-flags.e2e.test.js +124 -0
- package/dist/__tests__/git-flags.e2e.test.js.map +1 -0
- package/dist/__tests__/git.e2e.test.d.ts +1 -0
- package/dist/__tests__/git.e2e.test.js +221 -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 +493 -0
- package/dist/__tests__/mock-server.js.map +1 -0
- package/dist/__tests__/utils.d.ts +67 -0
- package/dist/__tests__/utils.js +243 -0
- package/dist/__tests__/utils.js.map +1 -0
- package/dist/api.d.ts +3 -9
- package/dist/api.js +14 -32
- package/dist/api.js.map +1 -1
- package/dist/commands/deploy.d.ts +8 -2
- package/dist/commands/deploy.js +65 -23
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/git/connect.d.ts +13 -0
- package/dist/commands/git/connect.js +70 -0
- package/dist/commands/git/connect.js.map +1 -0
- package/dist/commands/git/disconnect.d.ts +12 -0
- package/dist/commands/git/disconnect.js +57 -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 +32 -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/telemetry/disable.d.ts +5 -0
- package/dist/commands/telemetry/disable.js +14 -0
- package/dist/commands/telemetry/disable.js.map +1 -0
- package/dist/commands/telemetry/enable.d.ts +5 -0
- package/dist/commands/telemetry/enable.js +13 -0
- package/dist/commands/telemetry/enable.js.map +1 -0
- package/dist/commands/telemetry/status.d.ts +5 -0
- package/dist/commands/telemetry/status.js +19 -0
- package/dist/commands/telemetry/status.js.map +1 -0
- package/dist/commands/whoami.d.ts +6 -0
- package/dist/commands/whoami.js +13 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/env.d.ts +4 -0
- package/dist/env.js +10 -0
- package/dist/env.js.map +1 -0
- package/dist/lib/alpic-command.d.ts +6 -0
- package/dist/lib/alpic-command.js +27 -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 +1 -0
- package/dist/lib/auth/whoami.js +41 -0
- package/dist/lib/auth/whoami.js.map +1 -0
- package/dist/lib/base-workflow.d.ts +10 -0
- package/dist/lib/base-workflow.js +22 -0
- package/dist/lib/base-workflow.js.map +1 -0
- package/dist/lib/deployment.d.ts +21 -0
- package/dist/lib/deployment.js +54 -0
- package/dist/lib/deployment.js.map +1 -0
- package/dist/lib/git.d.ts +22 -0
- package/dist/lib/git.js +134 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/global-store.d.ts +28 -0
- package/dist/lib/global-store.js +76 -0
- package/dist/lib/global-store.js.map +1 -0
- package/dist/lib/project.d.ts +71 -10
- package/dist/lib/project.js +278 -124
- package/dist/lib/project.js.map +1 -1
- package/dist/lib/telemetry.d.ts +7 -0
- package/dist/lib/telemetry.js +66 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/dist/posthog.d.ts +3 -0
- package/dist/posthog.js +10 -0
- package/dist/posthog.js.map +1 -0
- package/dist/types.d.ts +0 -34
- package/package.json +34 -11
|
@@ -0,0 +1,243 @@
|
|
|
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, readFile } 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 = async () => { }) {
|
|
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
|
+
domains: [],
|
|
123
|
+
latestDeployment: null,
|
|
124
|
+
},
|
|
125
|
+
sourceRepository,
|
|
126
|
+
runtime: "node24",
|
|
127
|
+
transport: null,
|
|
128
|
+
rootDirectory: null,
|
|
129
|
+
buildCommand: null,
|
|
130
|
+
buildOutputDir: null,
|
|
131
|
+
installCommand: null,
|
|
132
|
+
startCommand: null,
|
|
133
|
+
createdAt: new Date(),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
export async function setupTestDirectory(options = {}) {
|
|
137
|
+
const { initGit = false } = options;
|
|
138
|
+
const uniqueId = randomUUID();
|
|
139
|
+
const cwd = await mkdtemp(join(tmpdir(), `alpic-cli-e2e-${uniqueId}-`));
|
|
140
|
+
const fixturePath = join(__testDirname, "fixtures", "demo-project");
|
|
141
|
+
await cp(fixturePath, cwd, { recursive: true });
|
|
142
|
+
if (initGit) {
|
|
143
|
+
runGit(["init"], cwd);
|
|
144
|
+
runGit(["remote", "add", "origin", "git@github.com:acme/frontend.git"], cwd);
|
|
145
|
+
runGit(["remote", "add", "upstream", "https://github.com/acme/backend.git"], cwd);
|
|
146
|
+
}
|
|
147
|
+
const binPath = join(process.cwd(), "bin", "dev.js");
|
|
148
|
+
return { cwd, binPath };
|
|
149
|
+
}
|
|
150
|
+
export function createConfigFile(cwd, projectId, teamId, projectName, environmentId, environmentName) {
|
|
151
|
+
const configDir = join(cwd, ".alpic");
|
|
152
|
+
mkdirSync(configDir, { recursive: true });
|
|
153
|
+
const configPath = join(configDir, "project.json");
|
|
154
|
+
writeFileSync(configPath, JSON.stringify({
|
|
155
|
+
projectId,
|
|
156
|
+
teamId,
|
|
157
|
+
projectName,
|
|
158
|
+
environmentId,
|
|
159
|
+
environmentName,
|
|
160
|
+
}));
|
|
161
|
+
}
|
|
162
|
+
export function runGit(args, cwd) {
|
|
163
|
+
execFileSync("git", args, {
|
|
164
|
+
cwd,
|
|
165
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
export function expectSuccessfulApiCall(call, customAssertions) {
|
|
169
|
+
expect(call).toBeDefined();
|
|
170
|
+
expect(call?.responseStatus).toBe(200);
|
|
171
|
+
if (customAssertions && call) {
|
|
172
|
+
customAssertions(call);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Create OAuth credentials in a temp config dir and return env for CLI subprocess.
|
|
177
|
+
* Use this to run commands with OAuth auth (no ALPIC_API_KEY).
|
|
178
|
+
* Caller must pass serverUrl so userinfo can be pointed at the mock server.
|
|
179
|
+
*/
|
|
180
|
+
export function createOAuthEnv(cwd, serverUrl) {
|
|
181
|
+
const alpicConfigDir = join(cwd, ".config", "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
|
+
ALPIC_GLOBAL_CONFIG_DIR: alpicConfigDir,
|
|
193
|
+
ALPIC_COGNITO_URL: serverUrl,
|
|
194
|
+
ALPIC_API_BASE_URL: serverUrl,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
export async function verifyConfigFile(cwd, output, expected) {
|
|
198
|
+
const cfgPath = join(cwd, ".alpic", "project.json");
|
|
199
|
+
const cfg = await readFile(cfgPath, "utf8");
|
|
200
|
+
const config = JSON.parse(cfg);
|
|
201
|
+
expect(config.projectName).toBe(expected.projectName);
|
|
202
|
+
if (expected.projectId !== undefined) {
|
|
203
|
+
expect(config.projectId).toBe(expected.projectId);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
expect(config.projectId).toBeDefined();
|
|
207
|
+
}
|
|
208
|
+
if (expected.teamId !== undefined) {
|
|
209
|
+
expect(config.teamId).toBe(expected.teamId);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
expect(config.teamId).toBeDefined();
|
|
213
|
+
}
|
|
214
|
+
if (expected.environmentId !== undefined) {
|
|
215
|
+
expect(config.environmentId).toBe(expected.environmentId);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
expect(config.environmentId).toBeDefined();
|
|
219
|
+
}
|
|
220
|
+
if (expected.environmentName !== undefined) {
|
|
221
|
+
expect(config.environmentName).toBe(expected.environmentName);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
expect(config.environmentName).toBeDefined();
|
|
225
|
+
}
|
|
226
|
+
expect(output).toMatch(/Deployment completed|Deployment summary/);
|
|
227
|
+
}
|
|
228
|
+
export async function verifyDeploymentFlow(cli, mockServer) {
|
|
229
|
+
await cli.expect(/Collected \d+ file/);
|
|
230
|
+
await cli.expect("Upload complete");
|
|
231
|
+
const uploadCall = mockServer.getLastCall("POST", "/v1/deployments/upload");
|
|
232
|
+
expectSuccessfulApiCall(uploadCall);
|
|
233
|
+
await cli.expect("Deployment started");
|
|
234
|
+
const deployCall = mockServer.getLastCall("POST", /\/v1\/environments\/.*\/deploy/);
|
|
235
|
+
expectSuccessfulApiCall(deployCall);
|
|
236
|
+
await cli.expect("View deployment details:");
|
|
237
|
+
await cli.expect("Deployment summary:");
|
|
238
|
+
const deploymentStatusCalls = mockServer.getCalls("GET", /\/v1\/deployments\/.*/);
|
|
239
|
+
expect(deploymentStatusCalls.length).toBeGreaterThan(0);
|
|
240
|
+
const envCall = mockServer.getLastCall("GET", /\/v1\/environments\/.*/);
|
|
241
|
+
expectSuccessfulApiCall(envCall);
|
|
242
|
+
}
|
|
243
|
+
//# 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
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
getProject: (projectId: string) => Promise<ApiProject>;
|
|
5
|
-
getPresignedUploadUrl: () => Promise<PresignedUploadResponse>;
|
|
6
|
-
deployEnvironment: (environmentId: string, body?: {
|
|
7
|
-
token?: string;
|
|
8
|
-
}) => Promise<ApiDeployment>;
|
|
9
|
-
};
|
|
1
|
+
import type { ContractRouterClient } from "@orpc/contract";
|
|
2
|
+
import { contract } from "@alpic-ai/api";
|
|
3
|
+
export declare const api: ContractRouterClient<typeof contract>;
|
package/dist/api.js
CHANGED
|
@@ -1,33 +1,15 @@
|
|
|
1
|
-
import {} from "
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
export const api = {
|
|
16
|
-
listProjects: async () => {
|
|
17
|
-
return doFetch("/v1/projects", { method: "GET" });
|
|
18
|
-
},
|
|
19
|
-
getProject: async (projectId) => {
|
|
20
|
-
return doFetch(`/v1/projects/${projectId}`, { method: "GET" });
|
|
21
|
-
},
|
|
22
|
-
getPresignedUploadUrl: async () => {
|
|
23
|
-
return doFetch("/v1/deployments/upload", { method: "POST" });
|
|
24
|
-
},
|
|
25
|
-
deployEnvironment: async (environmentId, body) => {
|
|
26
|
-
return doFetch(`/v1/environments/${environmentId}/deploy`, {
|
|
27
|
-
method: "POST",
|
|
28
|
-
body: JSON.stringify(body ?? {}),
|
|
29
|
-
headers: { "Content-Type": "application/json" },
|
|
30
|
-
});
|
|
31
|
-
},
|
|
32
|
-
};
|
|
1
|
+
import { createORPCClient } from "@orpc/client";
|
|
2
|
+
import { ResponseValidationPlugin } from "@orpc/contract/plugins";
|
|
3
|
+
import { OpenAPILink } from "@orpc/openapi-client/fetch";
|
|
4
|
+
import { contract } from "@alpic-ai/api";
|
|
5
|
+
import { env } from "./env.js";
|
|
6
|
+
import { getApiToken } from "./lib/auth/auth.js";
|
|
7
|
+
const link = new OpenAPILink(contract, {
|
|
8
|
+
url: env.ALPIC_API_BASE_URL,
|
|
9
|
+
headers: async () => {
|
|
10
|
+
return getApiToken().then((token) => (token ? { Authorization: `Bearer ${token}` } : {}));
|
|
11
|
+
},
|
|
12
|
+
plugins: [new ResponseValidationPlugin(contract)],
|
|
13
|
+
});
|
|
14
|
+
export const api = createORPCClient(link);
|
|
33
15
|
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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,9 +1,15 @@
|
|
|
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: {
|
|
6
6
|
directory: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
7
|
};
|
|
8
|
+
static flags: {
|
|
9
|
+
yes: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
runtime: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
"root-dir": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
"project-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
};
|
|
8
14
|
run(): Promise<void>;
|
|
9
15
|
}
|
package/dist/commands/deploy.js
CHANGED
|
@@ -1,33 +1,62 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
|
-
import { Args,
|
|
2
|
+
import { Args, Flags } from "@oclif/core";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { readFileSync, rmSync } from "node:fs";
|
|
3
5
|
import { api } from "../api.js";
|
|
6
|
+
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
4
7
|
import { createTarArchive, getFilesToPack } from "../lib/archive.js";
|
|
5
|
-
import {
|
|
8
|
+
import { deployAndWait, formatElapsed, resolveDeployDir } from "../lib/deployment.js";
|
|
9
|
+
import { ProjectWorkflow } from "../lib/project.js";
|
|
6
10
|
import { uploadToPresignedUrl } from "../lib/upload.js";
|
|
7
|
-
|
|
8
|
-
export class Deploy extends
|
|
11
|
+
const RUNTIMES = ["node24", "node22", "python3.14", "python3.13"];
|
|
12
|
+
export class Deploy extends AlpicCommand {
|
|
9
13
|
static description = "Deploy a project to Alpic";
|
|
10
|
-
static examples = [
|
|
14
|
+
static examples = [
|
|
15
|
+
"<%= config.bin %> deploy",
|
|
16
|
+
"<%= config.bin %> deploy ./my-app",
|
|
17
|
+
"<%= config.bin %> deploy --yes --project-name my-app --runtime node24",
|
|
18
|
+
];
|
|
11
19
|
static args = {
|
|
12
20
|
directory: Args.string({
|
|
13
21
|
description: "Directory to deploy (default: current directory)",
|
|
14
22
|
required: false,
|
|
15
23
|
}),
|
|
16
24
|
};
|
|
25
|
+
static flags = {
|
|
26
|
+
yes: Flags.boolean({
|
|
27
|
+
char: "y",
|
|
28
|
+
description: "Skip all confirmation prompts",
|
|
29
|
+
required: false,
|
|
30
|
+
}),
|
|
31
|
+
runtime: Flags.string({
|
|
32
|
+
description: "Runtime (node24, node22, python3.14, python3.13)",
|
|
33
|
+
required: false,
|
|
34
|
+
options: RUNTIMES,
|
|
35
|
+
}),
|
|
36
|
+
"root-dir": Flags.string({
|
|
37
|
+
description: "Root directory (defaults to .)",
|
|
38
|
+
required: false,
|
|
39
|
+
}),
|
|
40
|
+
"project-name": Flags.string({
|
|
41
|
+
description: "Name for a new project",
|
|
42
|
+
required: false,
|
|
43
|
+
}),
|
|
44
|
+
};
|
|
17
45
|
async run() {
|
|
18
|
-
const { args } = await this.parse(Deploy);
|
|
46
|
+
const { args, flags } = await this.parse(Deploy);
|
|
47
|
+
const projectFlags = {
|
|
48
|
+
yes: flags.yes,
|
|
49
|
+
projectName: flags["project-name"],
|
|
50
|
+
runtime: flags.runtime,
|
|
51
|
+
rootDir: flags["root-dir"],
|
|
52
|
+
};
|
|
19
53
|
p.intro("Deploying to Alpic");
|
|
20
|
-
|
|
21
|
-
if (!apiKey) {
|
|
22
|
-
p.cancel("ALPIC_API_KEY environment variable is required");
|
|
23
|
-
this.exit(1);
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
54
|
+
await this.ensureAuthenticated();
|
|
26
55
|
const deployDir = resolveDeployDir(args.directory);
|
|
27
|
-
const
|
|
56
|
+
const workflow = new ProjectWorkflow(projectFlags);
|
|
57
|
+
const config = await workflow.resolveProjectForDeploy(deployDir);
|
|
28
58
|
if (!config) {
|
|
29
59
|
p.cancel("Deploy cancelled");
|
|
30
|
-
this.exit(1);
|
|
31
60
|
return;
|
|
32
61
|
}
|
|
33
62
|
const spinner = p.spinner();
|
|
@@ -36,27 +65,40 @@ export class Deploy extends Command {
|
|
|
36
65
|
spinner.start("Collecting source files...");
|
|
37
66
|
const files = getFilesToPack(deployDir);
|
|
38
67
|
spinner.stop(`Collected ${files.length} file${files.length === 1 ? "" : "s"}`);
|
|
39
|
-
spinner.start("Creating archive...");
|
|
40
68
|
const result = await createTarArchive(files, deployDir);
|
|
41
69
|
tmpDir = result.tmpDir;
|
|
42
70
|
const archivePath = result.archivePath;
|
|
43
|
-
|
|
44
|
-
spinner.start("Getting upload URL...");
|
|
45
|
-
const { uploadUrl, token } = await api.getPresignedUploadUrl();
|
|
46
|
-
spinner.stop("Upload URL received");
|
|
71
|
+
const { uploadUrl, token } = await api.deployments.uploadArtifact.v1();
|
|
47
72
|
spinner.start("Uploading source...");
|
|
48
73
|
const buffer = readFileSync(archivePath);
|
|
49
74
|
await uploadToPresignedUrl(uploadUrl, buffer);
|
|
50
75
|
spinner.stop("Upload complete");
|
|
51
76
|
spinner.start("Triggering deployment...");
|
|
52
|
-
const
|
|
77
|
+
const deployStartedAt = Date.now();
|
|
78
|
+
const initialDeployment = await api.environments.deploy.v1({ environmentId: config.environmentId, token });
|
|
53
79
|
spinner.stop("Deployment started");
|
|
54
|
-
|
|
80
|
+
const { deployment, elapsedMs } = await deployAndWait({
|
|
81
|
+
initial: initialDeployment,
|
|
82
|
+
startedAt: deployStartedAt,
|
|
83
|
+
});
|
|
84
|
+
const elapsedStr = formatElapsed(elapsedMs);
|
|
85
|
+
if (deployment.status !== "deployed") {
|
|
86
|
+
throw new Error("Deployment failed");
|
|
87
|
+
}
|
|
88
|
+
const environment = await api.environments.get.v1({ environmentId: config.environmentId });
|
|
89
|
+
const urls = environment.mcpServerUrl ? [environment.mcpServerUrl] : environment.domains;
|
|
90
|
+
p.box([...urls.map((url) => chalk.bold(`🔗 ${url}`)), "", `Completed in ${elapsedStr}`].join("\n"), "Deployment summary:", {
|
|
91
|
+
contentAlign: "center",
|
|
92
|
+
titleAlign: "center",
|
|
93
|
+
width: "auto",
|
|
94
|
+
rounded: true,
|
|
95
|
+
contentPadding: 3,
|
|
96
|
+
});
|
|
55
97
|
}
|
|
56
98
|
catch (error) {
|
|
57
99
|
spinner.stop();
|
|
58
|
-
|
|
59
|
-
|
|
100
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
101
|
+
p.cancel(`Error: ${message}`);
|
|
60
102
|
}
|
|
61
103
|
finally {
|
|
62
104
|
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,13 @@
|
|
|
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
|
+
static flags: {
|
|
9
|
+
yes: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
"remote-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import { Args, Flags } from "@oclif/core";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { api } from "../../api.js";
|
|
5
|
+
import { AlpicCommand } from "../../lib/alpic-command.js";
|
|
6
|
+
import { config } from "../../lib/config.js";
|
|
7
|
+
import { resolveDeployDir } from "../../lib/deployment.js";
|
|
8
|
+
import { GitWorkflow, confirmLinkAnotherIfAlreadyConnected, isGitRepository, listGithubRemotes, showGitSetupInstructions, } from "../../lib/git.js";
|
|
9
|
+
export default class GitConnect extends AlpicCommand {
|
|
10
|
+
static description = "Connect a linked Alpic project to a git remote source";
|
|
11
|
+
static examples = [
|
|
12
|
+
"<%= config.bin %> git connect",
|
|
13
|
+
"<%= config.bin %> git connect ./my-app",
|
|
14
|
+
"<%= config.bin %> git connect --yes",
|
|
15
|
+
"<%= config.bin %> git connect --remote-name origin",
|
|
16
|
+
];
|
|
17
|
+
static args = {
|
|
18
|
+
directory: Args.string({
|
|
19
|
+
description: "Directory to connect (default: current directory)",
|
|
20
|
+
required: false,
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
static flags = {
|
|
24
|
+
yes: Flags.boolean({
|
|
25
|
+
char: "y",
|
|
26
|
+
description: "Automatically select the remote when only one is available",
|
|
27
|
+
default: false,
|
|
28
|
+
}),
|
|
29
|
+
"remote-name": Flags.string({
|
|
30
|
+
description: "Name of the remote to connect",
|
|
31
|
+
}),
|
|
32
|
+
};
|
|
33
|
+
async run() {
|
|
34
|
+
const { args, flags } = await this.parse(GitConnect);
|
|
35
|
+
p.intro("Connecting git repository to Alpic");
|
|
36
|
+
await this.ensureAuthenticated();
|
|
37
|
+
const deployDir = resolveDeployDir(args.directory);
|
|
38
|
+
const linkedConfig = config.load(deployDir);
|
|
39
|
+
if (!linkedConfig) {
|
|
40
|
+
throw new Error("This directory is not linked to an Alpic project. Link it first using `alpic deploy`.");
|
|
41
|
+
}
|
|
42
|
+
if (!isGitRepository(deployDir)) {
|
|
43
|
+
p.log.message("This directory is not a git repository.");
|
|
44
|
+
showGitSetupInstructions();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const remotes = listGithubRemotes(deployDir);
|
|
48
|
+
if (remotes.length === 0) {
|
|
49
|
+
p.log.message("This git repository has no remotes configured.");
|
|
50
|
+
showGitSetupInstructions();
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const project = await api.projects.get.v1({ projectId: linkedConfig.projectId });
|
|
54
|
+
if (!(await confirmLinkAnotherIfAlreadyConnected(project))) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const workflow = new GitWorkflow({ yes: flags.yes, remoteName: flags["remote-name"] });
|
|
58
|
+
const selectedSourceRepository = await workflow.selectRemoteSourceRepository(remotes);
|
|
59
|
+
if (selectedSourceRepository === null) {
|
|
60
|
+
throw new Error("No remote source repository selected.");
|
|
61
|
+
}
|
|
62
|
+
await api.projects.update.v1({
|
|
63
|
+
projectId: linkedConfig.projectId,
|
|
64
|
+
sourceRepository: selectedSourceRepository,
|
|
65
|
+
});
|
|
66
|
+
p.log.info("To automatically trigger deployments on every push,\nmake sure to install the Alpic GitHub App on this repository.");
|
|
67
|
+
p.outro(`✅ Connected ${chalk.bold(selectedSourceRepository)} to project ${chalk.bold(project.name)}.`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# 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,12 @@
|
|
|
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
|
+
static flags: {
|
|
9
|
+
yes: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
};
|
|
11
|
+
run(): Promise<void>;
|
|
12
|
+
}
|