@alpic-ai/sdk 0.0.0-dev.gb58f99a → 0.0.0-dev.gb78c242
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/client.d.ts +2 -0
- package/dist/client.js +4 -1
- package/dist/client.js.map +1 -1
- package/dist/deploy/deployments.d.ts +6 -18
- package/dist/deploy/deployments.js +6 -19
- package/dist/deploy/deployments.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/project/config.d.ts +10 -0
- package/dist/project/config.js +29 -0
- package/dist/project/config.js.map +1 -0
- package/dist/project/detect-runtime.d.ts +2 -0
- package/dist/project/detect-runtime.js +25 -0
- package/dist/project/detect-runtime.js.map +1 -0
- package/dist/project/projects.d.ts +21 -0
- package/dist/project/projects.js +52 -0
- package/dist/project/projects.js.map +1 -0
- package/package.json +2 -2
package/dist/client.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type AlpicApi } from "./api/client.js";
|
|
2
2
|
import { AlpicAuth } from "./auth/index.js";
|
|
3
3
|
import { Deployments } from "./deploy/deployments.js";
|
|
4
|
+
import { Projects } from "./project/projects.js";
|
|
4
5
|
import { Tunnel } from "./tunnel/tunnel.js";
|
|
5
6
|
import { type WhoamiInfo } from "./whoami.js";
|
|
6
7
|
export declare class Alpic {
|
|
@@ -8,6 +9,7 @@ export declare class Alpic {
|
|
|
8
9
|
readonly api: AlpicApi;
|
|
9
10
|
readonly tunnel: Tunnel;
|
|
10
11
|
readonly deployments: Deployments;
|
|
12
|
+
readonly projects: Projects;
|
|
11
13
|
constructor();
|
|
12
14
|
whoami(): Promise<WhoamiInfo>;
|
|
13
15
|
}
|
package/dist/client.js
CHANGED
|
@@ -2,6 +2,7 @@ import { createApiClient } from "./api/client.js";
|
|
|
2
2
|
import { AlpicAuth } from "./auth/index.js";
|
|
3
3
|
import { Deployments } from "./deploy/deployments.js";
|
|
4
4
|
import { env } from "./env.js";
|
|
5
|
+
import { Projects } from "./project/projects.js";
|
|
5
6
|
import { Tunnel } from "./tunnel/tunnel.js";
|
|
6
7
|
import { whoami } from "./whoami.js";
|
|
7
8
|
export class Alpic {
|
|
@@ -9,6 +10,7 @@ export class Alpic {
|
|
|
9
10
|
api;
|
|
10
11
|
tunnel;
|
|
11
12
|
deployments;
|
|
13
|
+
projects;
|
|
12
14
|
constructor() {
|
|
13
15
|
this.auth = new AlpicAuth();
|
|
14
16
|
this.api = createApiClient({
|
|
@@ -16,7 +18,8 @@ export class Alpic {
|
|
|
16
18
|
auth: this.auth,
|
|
17
19
|
});
|
|
18
20
|
this.tunnel = new Tunnel({ api: this.api });
|
|
19
|
-
this.deployments = new Deployments(this.api);
|
|
21
|
+
this.deployments = new Deployments({ api: this.api });
|
|
22
|
+
this.projects = new Projects({ api: this.api });
|
|
20
23
|
}
|
|
21
24
|
whoami() {
|
|
22
25
|
return whoami(this.auth, this.api);
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAmB,MAAM,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,OAAO,KAAK;IACP,IAAI,CAAY;IAChB,GAAG,CAAW;IACd,MAAM,CAAS;IACf,WAAW,CAAc;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAmB,MAAM,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,OAAO,KAAK;IACP,IAAI,CAAY;IAChB,GAAG,CAAW;IACd,MAAM,CAAS;IACf,WAAW,CAAc;IACzB,QAAQ,CAAW;IAE5B;QACE,IAAI,CAAC,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,GAAG,eAAe,CAAC;YACzB,UAAU,EAAE,GAAG,CAAC,kBAAkB;YAClC,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM;QACJ,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -5,6 +5,7 @@ export type DeploymentStatus = Deployment["status"];
|
|
|
5
5
|
export type DeployOptions = {
|
|
6
6
|
environmentId: string;
|
|
7
7
|
teamId: string;
|
|
8
|
+
onProgress?: (event: DeployEvent) => void;
|
|
8
9
|
};
|
|
9
10
|
export type DeployResult = {
|
|
10
11
|
deploymentId: string;
|
|
@@ -29,27 +30,14 @@ export type DeployEvent = {
|
|
|
29
30
|
elapsedMs: number;
|
|
30
31
|
deploymentPageUrl: string | null;
|
|
31
32
|
};
|
|
32
|
-
type
|
|
33
|
-
|
|
34
|
-
error: Error;
|
|
35
|
-
done: Result;
|
|
33
|
+
export type DeploymentsDeps = {
|
|
34
|
+
api: AlpicApi;
|
|
36
35
|
};
|
|
37
|
-
export type ProgressHandle<Event, Result> = {
|
|
38
|
-
on<K extends keyof HandleEvents<Event, Result>>(event: K, listener: (payload: HandleEvents<Event, Result>[K]) => void): void;
|
|
39
|
-
readonly done: Promise<Result>;
|
|
40
|
-
};
|
|
41
|
-
export type DeployHandle = ProgressHandle<DeployEvent, DeployResult>;
|
|
42
|
-
export type WatchHandle = ProgressHandle<{
|
|
43
|
-
status: DeploymentStatus;
|
|
44
|
-
elapsedMs: number;
|
|
45
|
-
}, Deployment>;
|
|
46
36
|
export declare class Deployments {
|
|
47
37
|
private readonly api;
|
|
48
|
-
constructor(
|
|
38
|
+
constructor(deps: DeploymentsDeps);
|
|
49
39
|
getLatestForEnvironment(environmentId: string): Promise<Deployment>;
|
|
50
|
-
watch(deploymentId: string):
|
|
51
|
-
deploy(options: DeployOptions): DeployHandle;
|
|
40
|
+
watch(deploymentId: string): Promise<Deployment>;
|
|
52
41
|
private pollUntilFinal;
|
|
53
|
-
|
|
42
|
+
deploy({ environmentId, teamId, onProgress }: DeployOptions): Promise<DeployResult>;
|
|
54
43
|
}
|
|
55
|
-
export {};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { readFileSync, rmSync } from "node:fs";
|
|
2
|
-
import { TypedEventEmitter } from "../lib/emitter.js";
|
|
3
2
|
import { createTarArchive, getFilesToPack } from "./archive.js";
|
|
4
3
|
import { pollIntervalMs, sleep } from "./poll.js";
|
|
5
4
|
import { uploadToPresignedUrl } from "./upload.js";
|
|
@@ -7,19 +6,10 @@ const FINAL_STATUSES = new Set(["deployed", "failed", "canceled"]);
|
|
|
7
6
|
const TIMEOUT_MS = 15 * 60 * 1000;
|
|
8
7
|
const DEPLOY_POLL_MS = 10_000;
|
|
9
8
|
const WATCH_POLL_MS = 3_000;
|
|
10
|
-
function createHandle(run) {
|
|
11
|
-
const events = new TypedEventEmitter();
|
|
12
|
-
const done = Promise.resolve().then(() => run((event) => events.emit("progress", event)));
|
|
13
|
-
done.then((result) => events.emit("done", result), (error) => events.emit("error", error instanceof Error ? error : new Error(String(error))));
|
|
14
|
-
return {
|
|
15
|
-
on: (event, listener) => events.on(event, listener),
|
|
16
|
-
done,
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
9
|
export class Deployments {
|
|
20
10
|
api;
|
|
21
|
-
constructor(
|
|
22
|
-
this.api = api;
|
|
11
|
+
constructor(deps) {
|
|
12
|
+
this.api = deps.api;
|
|
23
13
|
}
|
|
24
14
|
async getLatestForEnvironment(environmentId) {
|
|
25
15
|
const environment = await this.api.environments.get.v1({ environmentId });
|
|
@@ -34,12 +24,9 @@ export class Deployments {
|
|
|
34
24
|
return latest;
|
|
35
25
|
}
|
|
36
26
|
watch(deploymentId) {
|
|
37
|
-
return
|
|
38
|
-
}
|
|
39
|
-
deploy(options) {
|
|
40
|
-
return createHandle((emit) => this.runDeploy(options, emit));
|
|
27
|
+
return this.pollUntilFinal(deploymentId, WATCH_POLL_MS);
|
|
41
28
|
}
|
|
42
|
-
async pollUntilFinal(deploymentId, intervalMs
|
|
29
|
+
async pollUntilFinal(deploymentId, intervalMs) {
|
|
43
30
|
const startedAt = Date.now();
|
|
44
31
|
let current = await this.api.deployments.get.v1({ deploymentId });
|
|
45
32
|
while (!FINAL_STATUSES.has(current.status)) {
|
|
@@ -48,11 +35,11 @@ export class Deployments {
|
|
|
48
35
|
}
|
|
49
36
|
await sleep(pollIntervalMs(intervalMs));
|
|
50
37
|
current = await this.api.deployments.get.v1({ deploymentId });
|
|
51
|
-
onPoll?.(current, Date.now() - startedAt);
|
|
52
38
|
}
|
|
53
39
|
return current;
|
|
54
40
|
}
|
|
55
|
-
async
|
|
41
|
+
async deploy({ environmentId, teamId, onProgress }) {
|
|
42
|
+
const emit = onProgress ?? (() => { });
|
|
56
43
|
let tmpDir;
|
|
57
44
|
const startedAt = Date.now();
|
|
58
45
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deployments.js","sourceRoot":"","sources":["../../src/deploy/deployments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAG/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"deployments.js","sourceRoot":"","sources":["../../src/deploy/deployments.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export { AlpicAuth } from "./auth/index.js";
|
|
|
4
4
|
export { getOAuthClient } from "./auth/oauth-client.js";
|
|
5
5
|
export { GlobalStore, globalStore } from "./auth/store.js";
|
|
6
6
|
export { Alpic } from "./client.js";
|
|
7
|
-
export type { DeployEvent,
|
|
7
|
+
export type { DeployEvent, Deployment, DeploymentStatus, DeployOptions, DeployResult } from "./deploy/deployments.js";
|
|
8
|
+
export type { ProjectConfig } from "./project/config.js";
|
|
9
|
+
export type { CreateLinkedProjectOptions, LinkedProjectConfig } from "./project/projects.js";
|
|
8
10
|
export type { OpenTunnelOptions, TunnelCloseInfo, TunnelHandle, TunnelRequest } from "./tunnel/tunnel.js";
|
|
9
11
|
export type { Team, WhoamiInfo } from "./whoami.js";
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type ProjectConfig = {
|
|
2
|
+
projectId: string;
|
|
3
|
+
teamId: string;
|
|
4
|
+
teamName?: string;
|
|
5
|
+
projectName: string;
|
|
6
|
+
environmentId?: string;
|
|
7
|
+
environmentName?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function loadProjectConfig(): ProjectConfig | null;
|
|
10
|
+
export declare function saveProjectConfig(projectConfig: ProjectConfig): void;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
const getProjectJsonPath = () => join(process.cwd(), ".alpic", "project.json");
|
|
4
|
+
export function loadProjectConfig() {
|
|
5
|
+
const path = getProjectJsonPath();
|
|
6
|
+
if (!existsSync(path)) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
let raw;
|
|
10
|
+
try {
|
|
11
|
+
raw = JSON.parse(readFileSync(path, "utf8"));
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
throw new Error(`Failed to load project config: ${error.message}`);
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
projectId: raw.projectId,
|
|
18
|
+
teamId: raw.teamId,
|
|
19
|
+
teamName: raw.teamName,
|
|
20
|
+
projectName: raw.projectName ?? raw.projectId,
|
|
21
|
+
environmentId: raw.environmentId,
|
|
22
|
+
environmentName: raw.environmentName,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function saveProjectConfig(projectConfig) {
|
|
26
|
+
mkdirSync(join(process.cwd(), ".alpic"), { recursive: true });
|
|
27
|
+
writeFileSync(getProjectJsonPath(), JSON.stringify(projectConfig, null, 2));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/project/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;AAWjC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;AAE/E,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,GAAmE,CAAC;IACxE,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAG1C,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,kCAAmC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS;QAC7C,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,eAAe,EAAE,GAAG,CAAC,eAAe;KACrC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,aAA4B;IAC5D,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,aAAa,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
export function detectRuntime() {
|
|
3
|
+
const has = (file) => existsSync(file);
|
|
4
|
+
const read = (file) => {
|
|
5
|
+
try {
|
|
6
|
+
return readFileSync(file, "utf8");
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return "";
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
if (has("pyproject.toml") || has("requirements.txt") || has("setup.py") || has(".python-version")) {
|
|
13
|
+
return "python3.13";
|
|
14
|
+
}
|
|
15
|
+
if (has("package.json")) {
|
|
16
|
+
const nvmrc = has(".nvmrc") ? (read(".nvmrc").trim().split(/\s/)[0] ?? "") : "";
|
|
17
|
+
const major = nvmrc.replace(/^v/i, "").match(/^(\d+)/)?.[1];
|
|
18
|
+
if (major === "22") {
|
|
19
|
+
return "node22";
|
|
20
|
+
}
|
|
21
|
+
return "node24";
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=detect-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-runtime.js","sourceRoot":"","sources":["../../src/project/detect-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGnD,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,CAAC,IAAY,EAAU,EAAE;QACpC,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAClG,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { RouterInput, Runtime } from "@alpic-ai/api";
|
|
2
|
+
import type { AlpicApi } from "../api/client.js";
|
|
3
|
+
import { type ProjectConfig } from "./config.js";
|
|
4
|
+
export type CreateLinkedProjectOptions = RouterInput["projects"]["create"]["v1"] & {
|
|
5
|
+
teamName?: string;
|
|
6
|
+
};
|
|
7
|
+
export type LinkedProjectConfig = ProjectConfig & {
|
|
8
|
+
environmentId: string;
|
|
9
|
+
};
|
|
10
|
+
export type ProjectsDeps = {
|
|
11
|
+
api: AlpicApi;
|
|
12
|
+
};
|
|
13
|
+
export declare class Projects {
|
|
14
|
+
private readonly api;
|
|
15
|
+
constructor(deps: ProjectsDeps);
|
|
16
|
+
loadConfig(): ProjectConfig | null;
|
|
17
|
+
saveConfig(projectConfig: ProjectConfig): void;
|
|
18
|
+
detectRuntime(): Runtime | null;
|
|
19
|
+
validateLink(projectConfig: ProjectConfig): Promise<ProjectConfig | null>;
|
|
20
|
+
createLinked({ teamName, ...input }: CreateLinkedProjectOptions): Promise<LinkedProjectConfig>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ORPCError } from "@orpc/client";
|
|
2
|
+
import { loadProjectConfig, saveProjectConfig } from "./config.js";
|
|
3
|
+
import { detectRuntime } from "./detect-runtime.js";
|
|
4
|
+
export class Projects {
|
|
5
|
+
api;
|
|
6
|
+
constructor(deps) {
|
|
7
|
+
this.api = deps.api;
|
|
8
|
+
}
|
|
9
|
+
loadConfig() {
|
|
10
|
+
return loadProjectConfig();
|
|
11
|
+
}
|
|
12
|
+
saveConfig(projectConfig) {
|
|
13
|
+
saveProjectConfig(projectConfig);
|
|
14
|
+
}
|
|
15
|
+
detectRuntime() {
|
|
16
|
+
return detectRuntime();
|
|
17
|
+
}
|
|
18
|
+
async validateLink(projectConfig) {
|
|
19
|
+
let project;
|
|
20
|
+
try {
|
|
21
|
+
project = await this.api.projects.get.v1({ projectId: projectConfig.projectId });
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (error instanceof ORPCError && error.code === "NOT_FOUND") {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
if (projectConfig.environmentId && !project.environments?.some((env) => env.id === projectConfig.environmentId)) {
|
|
30
|
+
return { ...projectConfig, environmentId: undefined, environmentName: undefined };
|
|
31
|
+
}
|
|
32
|
+
return projectConfig;
|
|
33
|
+
}
|
|
34
|
+
async createLinked({ teamName, ...input }) {
|
|
35
|
+
const created = await this.api.projects.create.v1(input);
|
|
36
|
+
const productionEnv = created.productionEnvironment;
|
|
37
|
+
if (!productionEnv) {
|
|
38
|
+
throw new Error("Project was created but has no Production environment.");
|
|
39
|
+
}
|
|
40
|
+
const projectConfig = {
|
|
41
|
+
projectId: created.id,
|
|
42
|
+
teamId: created.teamId,
|
|
43
|
+
teamName,
|
|
44
|
+
projectName: created.name,
|
|
45
|
+
environmentId: productionEnv.id,
|
|
46
|
+
environmentName: productionEnv.name,
|
|
47
|
+
};
|
|
48
|
+
saveProjectConfig(projectConfig);
|
|
49
|
+
return projectConfig;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/project/projects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAsB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAYpD,MAAM,OAAO,QAAQ;IACF,GAAG,CAAW;IAE/B,YAAY,IAAkB;QAC5B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACtB,CAAC;IAED,UAAU;QACR,OAAO,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAED,UAAU,CAAC,aAA4B;QACrC,iBAAiB,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;IAED,aAAa;QACX,OAAO,aAAa,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,aAA4B;QAC7C,IAAI,OAAgB,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC;QACnF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC7D,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,aAAa,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC;YAChH,OAAO,EAAE,GAAG,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;QACpF,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAA8B;QACnE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,OAAO,CAAC,qBAAqB,CAAC;QACpD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,aAAa,GAAwB;YACzC,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ;YACR,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,aAAa,EAAE,aAAa,CAAC,EAAE;YAC/B,eAAe,EAAE,aAAa,CAAC,IAAI;SACpC,CAAC;QACF,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACjC,OAAO,aAAa,CAAC;IACvB,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alpic-ai/sdk",
|
|
3
|
-
"version": "0.0.0-dev.
|
|
3
|
+
"version": "0.0.0-dev.gb78c242",
|
|
4
4
|
"description": "Programmatic SDK for Alpic (auth, API, tunnel)",
|
|
5
5
|
"homepage": "https://alpic.ai",
|
|
6
6
|
"repository": {
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"openid-client": "^6.8.4",
|
|
36
36
|
"tar": "^7.5.19",
|
|
37
37
|
"zod": "^4.4.3",
|
|
38
|
-
"@alpic-ai/api": "0.0.0-dev.
|
|
38
|
+
"@alpic-ai/api": "0.0.0-dev.gb78c242"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@total-typescript/tsconfig": "^1.0.4",
|