alpic 0.0.0-dev.f12e22c → 0.0.0-dev.f2f58a6
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__/deploy.e2e.test.d.ts +1 -0
- package/dist/__tests__/deploy.e2e.test.js +267 -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__/mock-server.d.ts +22 -0
- package/dist/__tests__/mock-server.js +313 -0
- package/dist/__tests__/mock-server.js.map +1 -0
- package/dist/__tests__/utils.d.ts +29 -0
- package/dist/__tests__/utils.js +88 -0
- package/dist/__tests__/utils.js.map +1 -0
- package/dist/api.d.ts +4 -0
- package/dist/api.js +19 -0
- package/dist/api.js.map +1 -0
- package/dist/commands/deploy.d.ts +9 -0
- package/dist/commands/deploy.js +86 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/{hello.d.ts → telemetry/disable.d.ts} +1 -2
- 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/lib/archive.d.ts +7 -0
- package/dist/lib/archive.js +55 -0
- package/dist/lib/archive.js.map +1 -0
- package/dist/lib/config.d.ts +11 -0
- package/dist/lib/config.js +31 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/deployment.d.ts +21 -0
- package/dist/lib/deployment.js +39 -0
- package/dist/lib/deployment.js.map +1 -0
- package/dist/lib/global-config.d.ts +9 -0
- package/dist/lib/global-config.js +48 -0
- package/dist/lib/global-config.js.map +1 -0
- package/dist/lib/project.d.ts +67 -0
- package/dist/lib/project.js +281 -0
- package/dist/lib/project.js.map +1 -0
- 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/lib/upload.d.ts +1 -0
- package/dist/lib/upload.js +14 -0
- package/dist/lib/upload.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 +7 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +33 -4
- package/dist/commands/hello.js +0 -10
- package/dist/commands/hello.js.map +0 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
type Expectable = string | RegExp;
|
|
2
|
+
export type CliSessionOptions = {
|
|
3
|
+
cwd?: string;
|
|
4
|
+
env?: Record<string, string | undefined>;
|
|
5
|
+
cols?: number;
|
|
6
|
+
rows?: number;
|
|
7
|
+
timeoutMs?: number;
|
|
8
|
+
};
|
|
9
|
+
export type CliController = {
|
|
10
|
+
/** Wait until stdout/stderr contains a string or matches a regex */
|
|
11
|
+
expect: (pattern: Expectable, opts?: {
|
|
12
|
+
timeoutMs?: number;
|
|
13
|
+
}) => Promise<void>;
|
|
14
|
+
/** Send a line (adds newline) */
|
|
15
|
+
send: (line: string) => Promise<void>;
|
|
16
|
+
/** Send raw data (no newline) */
|
|
17
|
+
write: (data: string) => void;
|
|
18
|
+
/** Current accumulated output */
|
|
19
|
+
output: () => string;
|
|
20
|
+
/** Clear accumulated output (handy between phases) */
|
|
21
|
+
clear: () => void;
|
|
22
|
+
/** End session (SIGTERM) */
|
|
23
|
+
stop: () => void;
|
|
24
|
+
};
|
|
25
|
+
export declare function cliSession(cmd: string, args: string[], options: CliSessionOptions, fn: (cli: CliController) => Promise<void>): Promise<{
|
|
26
|
+
exitCode: number | null;
|
|
27
|
+
output: string;
|
|
28
|
+
}>;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// cliSession.ts
|
|
2
|
+
import pty from "node-pty";
|
|
3
|
+
import { expect } from "vitest";
|
|
4
|
+
export async function cliSession(cmd, args, options, fn) {
|
|
5
|
+
const { cwd, env, cols = 100, rows = 30, timeoutMs = 8000 } = options;
|
|
6
|
+
const mergedEnv = {
|
|
7
|
+
...process.env,
|
|
8
|
+
NO_COLOR: "1",
|
|
9
|
+
...Object.fromEntries(Object.entries(env ?? {}).filter(([, v]) => v !== undefined)),
|
|
10
|
+
};
|
|
11
|
+
for (const [k, v] of Object.entries(mergedEnv)) {
|
|
12
|
+
if (typeof v !== "string") {
|
|
13
|
+
console.error("[pty] bad env entry:", k, v, typeof v);
|
|
14
|
+
throw new Error(`env value for ${k} is not a string`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const term = pty.spawn(cmd, args, {
|
|
18
|
+
cwd,
|
|
19
|
+
env: mergedEnv,
|
|
20
|
+
name: "xterm-256color",
|
|
21
|
+
cols,
|
|
22
|
+
rows,
|
|
23
|
+
});
|
|
24
|
+
let buf = "";
|
|
25
|
+
const append = (data) => {
|
|
26
|
+
buf += data;
|
|
27
|
+
};
|
|
28
|
+
term.onData(append);
|
|
29
|
+
let exitCode = null;
|
|
30
|
+
const exitPromise = new Promise((resolve) => {
|
|
31
|
+
term.onExit((e) => {
|
|
32
|
+
exitCode = e.exitCode ?? null;
|
|
33
|
+
resolve();
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
const controller = {
|
|
37
|
+
expect: (pattern, opts) => waitFor(() => matches(buf, pattern), opts?.timeoutMs ?? timeoutMs, () => buf, pattern),
|
|
38
|
+
send: async (line) => {
|
|
39
|
+
term.write(line + "\r");
|
|
40
|
+
},
|
|
41
|
+
write: (data) => term.write(data),
|
|
42
|
+
output: () => buf,
|
|
43
|
+
clear: () => {
|
|
44
|
+
buf = "";
|
|
45
|
+
},
|
|
46
|
+
stop: () => {
|
|
47
|
+
try {
|
|
48
|
+
term.kill();
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// ignore
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
try {
|
|
56
|
+
await fn(controller);
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
controller.stop();
|
|
60
|
+
await Promise.race([exitPromise, sleep(200)]);
|
|
61
|
+
}
|
|
62
|
+
return { exitCode, output: buf };
|
|
63
|
+
}
|
|
64
|
+
function matches(text, pattern) {
|
|
65
|
+
if (typeof pattern === "string")
|
|
66
|
+
return text.includes(pattern);
|
|
67
|
+
return pattern.test(text);
|
|
68
|
+
}
|
|
69
|
+
async function waitFor(predicate, timeoutMs, getOutput, pattern) {
|
|
70
|
+
const start = Date.now();
|
|
71
|
+
while (true) {
|
|
72
|
+
if (predicate())
|
|
73
|
+
return;
|
|
74
|
+
if (Date.now() - start > timeoutMs) {
|
|
75
|
+
const out = getOutput();
|
|
76
|
+
throw new Error(`Timed out after ${timeoutMs}ms waiting for: ${patternToString(pattern)}\n\n` +
|
|
77
|
+
`--- current output ---\n${out}\n--- end output ---\n`);
|
|
78
|
+
}
|
|
79
|
+
await sleep(20);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function patternToString(p) {
|
|
83
|
+
return typeof p === "string" ? JSON.stringify(p) : `/${p.source}/${p.flags}`;
|
|
84
|
+
}
|
|
85
|
+
function sleep(ms) {
|
|
86
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
87
|
+
}
|
|
88
|
+
//# 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
ADDED
package/dist/api.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
function getApiBaseUrl() {
|
|
6
|
+
return process.env.ALPIC_API_BASE_URL ?? "https://api.alpic.ai";
|
|
7
|
+
}
|
|
8
|
+
export function getFrontendBaseUrl() {
|
|
9
|
+
return process.env.ALPIC_FRONTEND_BASE_URL ?? "https://app.alpic.ai";
|
|
10
|
+
}
|
|
11
|
+
const link = new OpenAPILink(contract, {
|
|
12
|
+
url: getApiBaseUrl(),
|
|
13
|
+
headers: {
|
|
14
|
+
Authorization: `Bearer ${process.env.ALPIC_API_KEY}`,
|
|
15
|
+
},
|
|
16
|
+
plugins: [new ResponseValidationPlugin(contract)],
|
|
17
|
+
});
|
|
18
|
+
export const api = createORPCClient(link);
|
|
19
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +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,SAAS,aAAa;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,sBAAsB,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,sBAAsB,CAAC;AACvE,CAAC;AAED,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE;IACrC,GAAG,EAAE,aAAa,EAAE;IACpB,OAAO,EAAE;QACP,aAAa,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE;KACrD;IACD,OAAO,EAAE,CAAC,IAAI,wBAAwB,CAAC,QAAQ,CAAC,CAAC;CAClD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,GAAG,GAA0C,gBAAgB,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Command } from "@oclif/core";
|
|
2
|
+
export declare class Deploy extends Command {
|
|
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,86 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import { Args, Command } from "@oclif/core";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { readFileSync, rmSync } from "node:fs";
|
|
5
|
+
import { api } from "../api.js";
|
|
6
|
+
import { createTarArchive, getFilesToPack } from "../lib/archive.js";
|
|
7
|
+
import { deployAndWait, formatElapsed } from "../lib/deployment.js";
|
|
8
|
+
import { resolveDeployDir, resolveProjectForDeploy } from "../lib/project.js";
|
|
9
|
+
import { uploadToPresignedUrl } from "../lib/upload.js";
|
|
10
|
+
export class Deploy extends Command {
|
|
11
|
+
static description = "Deploy a project to Alpic";
|
|
12
|
+
static examples = ["<%= config.bin %> deploy", "<%= config.bin %> deploy ./my-app"];
|
|
13
|
+
static args = {
|
|
14
|
+
directory: Args.string({
|
|
15
|
+
description: "Directory to deploy (default: current directory)",
|
|
16
|
+
required: false,
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
async run() {
|
|
20
|
+
const { args } = await this.parse(Deploy);
|
|
21
|
+
p.intro("Deploying to Alpic");
|
|
22
|
+
const apiKey = process.env.ALPIC_API_KEY;
|
|
23
|
+
if (!apiKey) {
|
|
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);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const deployDir = resolveDeployDir(args.directory);
|
|
29
|
+
const config = await resolveProjectForDeploy(deployDir);
|
|
30
|
+
if (!config) {
|
|
31
|
+
p.cancel("Deploy cancelled");
|
|
32
|
+
this.exit(1);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const spinner = p.spinner();
|
|
36
|
+
let tmpDir;
|
|
37
|
+
try {
|
|
38
|
+
spinner.start("Collecting source files...");
|
|
39
|
+
const files = getFilesToPack(deployDir);
|
|
40
|
+
spinner.stop(`Collected ${files.length} file${files.length === 1 ? "" : "s"}`);
|
|
41
|
+
const result = await createTarArchive(files, deployDir);
|
|
42
|
+
tmpDir = result.tmpDir;
|
|
43
|
+
const archivePath = result.archivePath;
|
|
44
|
+
const { uploadUrl, token } = await api.deployments.uploadArtifact.v1();
|
|
45
|
+
spinner.start("Uploading source...");
|
|
46
|
+
const buffer = readFileSync(archivePath);
|
|
47
|
+
await uploadToPresignedUrl(uploadUrl, buffer);
|
|
48
|
+
spinner.stop("Upload complete");
|
|
49
|
+
spinner.start("Triggering deployment...");
|
|
50
|
+
const deployStartedAt = Date.now();
|
|
51
|
+
const initialDeployment = await api.environments.deploy.v1({ environmentId: config.environmentId, token });
|
|
52
|
+
spinner.stop("Deployment started");
|
|
53
|
+
const { deployment, elapsedMs } = await deployAndWait({
|
|
54
|
+
initial: initialDeployment,
|
|
55
|
+
startedAt: deployStartedAt,
|
|
56
|
+
teamId: config.teamId,
|
|
57
|
+
projectId: config.projectId,
|
|
58
|
+
});
|
|
59
|
+
const elapsedStr = formatElapsed(elapsedMs);
|
|
60
|
+
if (deployment.status !== "deployed") {
|
|
61
|
+
throw new Error("Deployment failed");
|
|
62
|
+
}
|
|
63
|
+
const environment = await api.environments.get.v1({ environmentId: config.environmentId });
|
|
64
|
+
const urls = environment.mcpServerUrl ? [environment.mcpServerUrl] : environment.domains;
|
|
65
|
+
p.box([...urls.map((url) => chalk.bold(`🔗 ${url}`)), "", `Completed in ${elapsedStr}`].join("\n"), "Deployment summary:", {
|
|
66
|
+
contentAlign: "center",
|
|
67
|
+
titleAlign: "center",
|
|
68
|
+
width: "auto",
|
|
69
|
+
rounded: true,
|
|
70
|
+
contentPadding: 3,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
spinner.stop();
|
|
75
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
76
|
+
p.cancel(`Error: ${message}`);
|
|
77
|
+
this.exit(1);
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
if (tmpDir) {
|
|
81
|
+
rmSync(tmpDir, { recursive: true, force: true });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command } from "@oclif/core";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { setEnabled } from "../../lib/telemetry.js";
|
|
4
|
+
export default class TelemetryDisable extends Command {
|
|
5
|
+
static description = "Disable Alpic telemetry on this machine";
|
|
6
|
+
async run() {
|
|
7
|
+
await this.parse(TelemetryDisable);
|
|
8
|
+
setEnabled(false);
|
|
9
|
+
console.log(chalk.yellow("✓"), "Telemetry has been", chalk.yellow.bold("disabled"));
|
|
10
|
+
console.log(chalk.gray("Config saved to ~/.alpic/config.json"));
|
|
11
|
+
console.log(chalk.gray("Alpic never collects Personally Identifiable Information (PII). If you'd like to help us improve Alpic by allowing anonymous CLI usage data, please re-enable telemetry with: alpic telemetry enable"));
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=disable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disable.js","sourceRoot":"","sources":["../../../src/commands/telemetry/disable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,OAAO;IACnD,MAAM,CAAU,WAAW,GAAG,yCAAyC,CAAC;IAExE,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACnC,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,oBAAoB,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,sMAAsM,CACvM,CACF,CAAC;IACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from "@oclif/core";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { setEnabled } from "../../lib/telemetry.js";
|
|
4
|
+
export default class TelemetryEnable extends Command {
|
|
5
|
+
static description = "Enable Alpic telemetry on this machine";
|
|
6
|
+
async run() {
|
|
7
|
+
await this.parse(TelemetryEnable);
|
|
8
|
+
setEnabled(true);
|
|
9
|
+
console.log(chalk.green("✓"), "Telemetry has been", chalk.green.bold("enabled"));
|
|
10
|
+
console.log(chalk.gray("Config saved to ~/.alpic/config.json"));
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=enable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enable.js","sourceRoot":"","sources":["../../../src/commands/telemetry/enable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,OAAO;IAClD,MAAM,CAAU,WAAW,GAAG,wCAAwC,CAAC;IAEvE,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAClC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,oBAAoB,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAClE,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Command } from "@oclif/core";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { getMachineId, isEnabled } from "../../lib/telemetry.js";
|
|
4
|
+
export default class TelemetryStatus extends Command {
|
|
5
|
+
static description = "Show Alpic telemetry settings for this machine";
|
|
6
|
+
async run() {
|
|
7
|
+
await this.parse(TelemetryStatus);
|
|
8
|
+
const enabled = isEnabled();
|
|
9
|
+
console.log(chalk.bold.underline("Alpic Telemetry"));
|
|
10
|
+
console.log();
|
|
11
|
+
console.log("Status:", enabled ? chalk.green.bold("Enabled") : chalk.yellow.bold("Disabled"));
|
|
12
|
+
console.log(chalk.gray("Machine ID:"), getMachineId());
|
|
13
|
+
console.log();
|
|
14
|
+
console.log(chalk.gray("To opt out, run: alpic telemetry disable"));
|
|
15
|
+
console.log(chalk.gray("Or set: ALPIC_TELEMETRY_DISABLED=1"));
|
|
16
|
+
console.log(chalk.gray("Debug mode: ALPIC_TELEMETRY_DEBUG=1"));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/telemetry/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEjE,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,OAAO;IAClD,MAAM,CAAU,WAAW,GAAG,gDAAgD,CAAC;IAE/E,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;IACjE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function ensureGitAvailable(): void;
|
|
2
|
+
export declare function getGitFiles(deployDir: string): string[];
|
|
3
|
+
export declare function getFilesToPack(deployDir: string): string[];
|
|
4
|
+
export declare function createTarArchive(files: string[], deployDir: string): Promise<{
|
|
5
|
+
tmpDir: string;
|
|
6
|
+
archivePath: string;
|
|
7
|
+
}>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { existsSync, mkdtempSync, rmSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join, resolve } from "node:path";
|
|
5
|
+
import { create as tarCreate } from "tar";
|
|
6
|
+
const GIT_FILES_MAX_BUFFER = 10 * 1024 * 1024;
|
|
7
|
+
function isGitRepository(dir) {
|
|
8
|
+
return existsSync(join(resolve(dir), ".git"));
|
|
9
|
+
}
|
|
10
|
+
export function ensureGitAvailable() {
|
|
11
|
+
try {
|
|
12
|
+
execSync("git --version", { stdio: "ignore" });
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
throw new Error("Git is required to deploy. Please install git and ensure it is available in your PATH.");
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function getGitFiles(deployDir) {
|
|
19
|
+
const dir = resolve(deployDir);
|
|
20
|
+
const output = execSync("git ls-files -z --cached --others --exclude-standard -- .", {
|
|
21
|
+
cwd: dir,
|
|
22
|
+
encoding: "utf8",
|
|
23
|
+
maxBuffer: GIT_FILES_MAX_BUFFER,
|
|
24
|
+
});
|
|
25
|
+
const files = output.split("\0").filter(Boolean);
|
|
26
|
+
if (files.length === 0) {
|
|
27
|
+
throw new Error("No tracked or untracked files found. Ensure you are in a git repository with files to deploy.");
|
|
28
|
+
}
|
|
29
|
+
return files;
|
|
30
|
+
}
|
|
31
|
+
export function getFilesToPack(deployDir) {
|
|
32
|
+
const dir = resolve(deployDir);
|
|
33
|
+
if (isGitRepository(dir)) {
|
|
34
|
+
return getGitFiles(deployDir);
|
|
35
|
+
}
|
|
36
|
+
ensureGitAvailable();
|
|
37
|
+
execSync("git init", { cwd: dir });
|
|
38
|
+
try {
|
|
39
|
+
return getGitFiles(deployDir);
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
rmSync(join(dir, ".git"), { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export async function createTarArchive(files, deployDir) {
|
|
46
|
+
const tmpDir = mkdtempSync(join(tmpdir(), "alpic-deploy-"));
|
|
47
|
+
const archivePath = join(tmpDir, "source.tar.gz");
|
|
48
|
+
await tarCreate({
|
|
49
|
+
gzip: true,
|
|
50
|
+
file: archivePath,
|
|
51
|
+
cwd: deployDir,
|
|
52
|
+
}, files);
|
|
53
|
+
return { tmpDir, archivePath };
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/lib/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,KAAK,CAAC;AAE1C,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC;QACH,QAAQ,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;IAC5G,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,2DAA2D,EAAE;QACnF,GAAG,EAAE,GAAG;QACR,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,oBAAoB;KAChC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,+FAA+F,CAAC,CAAC;IACnH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IACD,kBAAkB,EAAE,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAe,EAAE,SAAiB;IACvE,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAClD,MAAM,SAAS,CACb;QACE,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,SAAS;KACf,EACD,KAAK,CACN,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ProjectConfig } from "../types.js";
|
|
2
|
+
export declare const config: {
|
|
3
|
+
load: (deployDir: string) => {
|
|
4
|
+
projectId: string;
|
|
5
|
+
teamId: string;
|
|
6
|
+
projectName: string;
|
|
7
|
+
environmentId: string | undefined;
|
|
8
|
+
environmentName: string | undefined;
|
|
9
|
+
} | null;
|
|
10
|
+
save: (config: ProjectConfig, deployDir: string) => void;
|
|
11
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
const getProjectJsonPath = (deployDir) => join(deployDir, ".alpic", "project.json");
|
|
4
|
+
export const config = {
|
|
5
|
+
load: (deployDir) => {
|
|
6
|
+
const path = getProjectJsonPath(deployDir);
|
|
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
|
+
projectName: raw.projectName ?? raw.projectId,
|
|
21
|
+
environmentId: raw.environmentId,
|
|
22
|
+
environmentName: raw.environmentName,
|
|
23
|
+
};
|
|
24
|
+
},
|
|
25
|
+
save: (config, deployDir) => {
|
|
26
|
+
const path = getProjectJsonPath(deployDir);
|
|
27
|
+
mkdirSync(join(deployDir, ".alpic"), { recursive: true });
|
|
28
|
+
writeFileSync(path, JSON.stringify(config, null, 2));
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,kBAAkB,GAAG,CAAC,SAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;AAE5F,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,SAAiB,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,GAAmE,CAAC;QACxE,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAG1C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,kCAAmC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,OAAO;YACL,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS;YAC7C,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,eAAe,EAAE,GAAG,CAAC,eAAe;SACrC,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC,MAAqB,EAAE,SAAiB,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC3C,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { RouterOutput } from "@alpic-ai/api";
|
|
2
|
+
export declare function formatElapsed(ms: number): string;
|
|
3
|
+
export declare function deployAndWait({ initial, startedAt, teamId, projectId, }: {
|
|
4
|
+
initial: RouterOutput["deployments"]["get"]["v1"];
|
|
5
|
+
startedAt: number;
|
|
6
|
+
teamId: string;
|
|
7
|
+
projectId: string;
|
|
8
|
+
}): Promise<{
|
|
9
|
+
deployment: {
|
|
10
|
+
id: string;
|
|
11
|
+
status: "ongoing" | "deployed" | "failed" | "canceled";
|
|
12
|
+
sourceRef: string | null;
|
|
13
|
+
sourceCommitId: string | null;
|
|
14
|
+
sourceCommitMessage: string | null;
|
|
15
|
+
authorUsername: string | null;
|
|
16
|
+
authorAvatarUrl: string | null;
|
|
17
|
+
startedAt: Date | null;
|
|
18
|
+
completedAt: Date | null;
|
|
19
|
+
};
|
|
20
|
+
elapsedMs: number;
|
|
21
|
+
}>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { api, getFrontendBaseUrl } from "../api.js";
|
|
4
|
+
const POLL_INTERVAL = Number(process.env.ALPIC_POLL_INTERVAL) || 10_000;
|
|
5
|
+
export function formatElapsed(ms) {
|
|
6
|
+
const totalSeconds = Math.floor(ms / 1000);
|
|
7
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
8
|
+
const seconds = totalSeconds % 60;
|
|
9
|
+
return minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;
|
|
10
|
+
}
|
|
11
|
+
export async function deployAndWait({ initial, startedAt, teamId, projectId, }) {
|
|
12
|
+
const spinner = p.spinner();
|
|
13
|
+
spinner.start("Deployment in progress");
|
|
14
|
+
const deploymentPageUrl = `${getFrontendBaseUrl()}/team/${teamId}/project/${projectId}/deployments/${initial.id}`;
|
|
15
|
+
p.note(deploymentPageUrl, "View deployment details:");
|
|
16
|
+
const elapsedInterval = setInterval(() => {
|
|
17
|
+
const elapsed = formatElapsed(Date.now() - startedAt);
|
|
18
|
+
spinner.message(`Deployment in progress — ${elapsed}`);
|
|
19
|
+
}, 1000);
|
|
20
|
+
const timeoutMs = 15 * 60 * 1000; // 15 minutes
|
|
21
|
+
let deployment = initial;
|
|
22
|
+
try {
|
|
23
|
+
while (deployment.status === "ongoing") {
|
|
24
|
+
const elapsedMs = Date.now() - startedAt;
|
|
25
|
+
if (elapsedMs >= timeoutMs) {
|
|
26
|
+
throw new Error(`Deployment aborted after 15 minutes. View status: ${deploymentPageUrl}`);
|
|
27
|
+
}
|
|
28
|
+
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL));
|
|
29
|
+
deployment = await api.deployments.get.v1({ deploymentId: deployment.id });
|
|
30
|
+
}
|
|
31
|
+
return { deployment, elapsedMs: Date.now() - startedAt };
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
const message = deployment.status === "deployed" ? chalk.green("Deployment completed") : chalk.red("Deployment failed");
|
|
35
|
+
spinner.stop(message);
|
|
36
|
+
clearInterval(elapsedInterval);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=deployment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment.js","sourceRoot":"","sources":["../../src/lib/deployment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEpD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,MAAM,CAAC;AAExE,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAClC,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAClC,OAAO,EACP,SAAS,EACT,MAAM,EACN,SAAS,GAMV;IACC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAE5B,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAExC,MAAM,iBAAiB,GAAG,GAAG,kBAAkB,EAAE,SAAS,MAAM,YAAY,SAAS,gBAAgB,OAAO,CAAC,EAAE,EAAE,CAAC;IAClH,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,0BAA0B,CAAC,CAAC;IAEtD,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;QACtD,OAAO,CAAC,OAAO,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC,EAAE,IAAI,CAAC,CAAC;IAET,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;IAC/C,IAAI,UAAU,GAAG,OAAO,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACzC,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,qDAAqD,iBAAiB,EAAE,CAAC,CAAC;YAC5F,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;YACnE,UAAU,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;IAC3D,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,GACX,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAC1G,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,aAAa,CAAC,eAAe,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const GLOBAL_CONFIG_FILE: string;
|
|
2
|
+
export interface GlobalConfig {
|
|
3
|
+
machineId: string;
|
|
4
|
+
telemetry: {
|
|
5
|
+
enabled: boolean;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export declare function getGlobalConfig(): GlobalConfig;
|
|
9
|
+
export declare function saveGlobalConfig(config: GlobalConfig): void;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
const GLOBAL_CONFIG_DIR = join(homedir(), ".alpic");
|
|
6
|
+
export const GLOBAL_CONFIG_FILE = join(GLOBAL_CONFIG_DIR, "config.json");
|
|
7
|
+
function readJsonFile(filePath) {
|
|
8
|
+
try {
|
|
9
|
+
if (existsSync(filePath)) {
|
|
10
|
+
const content = readFileSync(filePath, "utf-8");
|
|
11
|
+
return JSON.parse(content);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// Ignore errors reading config
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
function writeJsonFile(filePath, data) {
|
|
20
|
+
try {
|
|
21
|
+
const dir = join(filePath, "..");
|
|
22
|
+
if (!existsSync(dir)) {
|
|
23
|
+
mkdirSync(dir, { recursive: true });
|
|
24
|
+
}
|
|
25
|
+
writeFileSync(filePath, JSON.stringify(data, null, 2), "utf-8");
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Ignore errors writing config
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function getGlobalConfig() {
|
|
32
|
+
const existing = readJsonFile(GLOBAL_CONFIG_FILE);
|
|
33
|
+
if (existing?.machineId && existing?.telemetry !== undefined) {
|
|
34
|
+
return existing;
|
|
35
|
+
}
|
|
36
|
+
const config = {
|
|
37
|
+
machineId: existing?.machineId ?? crypto.randomUUID(),
|
|
38
|
+
telemetry: {
|
|
39
|
+
enabled: existing?.telemetry?.enabled ?? true,
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
writeJsonFile(GLOBAL_CONFIG_FILE, config);
|
|
43
|
+
return config;
|
|
44
|
+
}
|
|
45
|
+
export function saveGlobalConfig(config) {
|
|
46
|
+
writeJsonFile(GLOBAL_CONFIG_FILE, config);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=global-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-config.js","sourceRoot":"","sources":["../../src/lib/global-config.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AACpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;AASzE,SAAS,YAAY,CAAI,QAAgB;IACvC,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;QAClC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,IAAa;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,QAAQ,GAAG,YAAY,CAAe,kBAAkB,CAAC,CAAC;IAChE,IAAI,QAAQ,EAAE,SAAS,IAAI,QAAQ,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;QAC7D,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAiB;QAC3B,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE;QACrD,SAAS,EAAE;YACT,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,IAAI,IAAI;SAC9C;KACF,CAAC;IACF,aAAa,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAoB;IACnD,aAAa,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC"}
|