@alpic-ai/sdk 0.0.0-dev.g22f10d7 → 0.0.0-dev.g22fdcbb
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/auth/index.d.ts +4 -0
- package/dist/auth/index.js +11 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/client.d.ts +6 -0
- package/dist/client.js +10 -0
- package/dist/client.js.map +1 -1
- package/dist/deploy/archive.d.ts +7 -0
- package/dist/deploy/archive.js +54 -0
- package/dist/deploy/archive.js.map +1 -0
- package/dist/deploy/deployments.d.ts +43 -0
- package/dist/deploy/deployments.js +89 -0
- package/dist/deploy/deployments.js.map +1 -0
- package/dist/deploy/poll.d.ts +2 -0
- package/dist/deploy/poll.js +10 -0
- package/dist/deploy/poll.js.map +1 -0
- package/dist/deploy/upload.d.ts +1 -0
- package/dist/deploy/upload.js +13 -0
- package/dist/deploy/upload.js.map +1 -0
- package/dist/index.d.ts +4 -0
- 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/dist/vendor/pipenet.js +8 -16
- package/dist/vendor/pipenet.js.map +3 -3
- package/dist/whoami.d.ts +15 -0
- package/dist/whoami.js +12 -0
- package/dist/whoami.js.map +1 -0
- package/package.json +4 -3
package/dist/auth/index.d.ts
CHANGED
|
@@ -14,6 +14,10 @@ export declare class AlpicAuth {
|
|
|
14
14
|
isAuthenticated(): Promise<boolean>;
|
|
15
15
|
getToken(): Promise<string | undefined>;
|
|
16
16
|
getUserAccessToken(): Promise<string | undefined>;
|
|
17
|
+
getUserInfo(): Promise<{
|
|
18
|
+
email: string | undefined;
|
|
19
|
+
name: string | undefined;
|
|
20
|
+
} | null>;
|
|
17
21
|
login(opts?: LoginOptions): Promise<{
|
|
18
22
|
sub: string;
|
|
19
23
|
}>;
|
package/dist/auth/index.js
CHANGED
|
@@ -22,6 +22,17 @@ export class AlpicAuth {
|
|
|
22
22
|
async getUserAccessToken() {
|
|
23
23
|
return (await getOAuthClient().getValidAccessToken())?.access_token;
|
|
24
24
|
}
|
|
25
|
+
async getUserInfo() {
|
|
26
|
+
const credentials = await getOAuthClient().getValidAccessToken();
|
|
27
|
+
if (!credentials) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const userInfo = await getOAuthClient().fetchUserInfo(credentials);
|
|
31
|
+
if (!userInfo) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
return { email: userInfo.email, name: userInfo.name };
|
|
35
|
+
}
|
|
25
36
|
async login(opts) {
|
|
26
37
|
const result = await oauthLogin(opts);
|
|
27
38
|
this.events.emit("authenticated", { sub: result.sub });
|
package/dist/auth/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAqB,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAoB,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ3D,MAAM,OAAO,SAAS;IACH,MAAM,GAAG,IAAI,iBAAiB,EAAc,CAAC;IAE9D,EAAE,CAA6B,KAAQ,EAAE,QAA0C;QACjF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,GAAG,CAA6B,KAAQ,EAAE,QAA0C;QAClF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,OAAO,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,SAAS,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,MAAM,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAE,YAAY,CAAC;IACnG,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,OAAO,CAAC,MAAM,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAE,YAAY,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAmB;QAC7B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,WAAW,CAAC,gBAAgB,EAAE,CAAC;IACjC,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAqB,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAoB,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ3D,MAAM,OAAO,SAAS;IACH,MAAM,GAAG,IAAI,iBAAiB,EAAc,CAAC;IAE9D,EAAE,CAA6B,KAAQ,EAAE,QAA0C;QACjF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,GAAG,CAA6B,KAAQ,EAAE,QAA0C;QAClF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,OAAO,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,SAAS,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,MAAM,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAE,YAAY,CAAC;IACnG,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,OAAO,CAAC,MAAM,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAE,YAAY,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC;QACjE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,cAAc,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAmB;QAC7B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,WAAW,CAAC,gBAAgB,EAAE,CAAC;IACjC,CAAC;CACF"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import { type AlpicApi } from "./api/client.js";
|
|
2
2
|
import { AlpicAuth } from "./auth/index.js";
|
|
3
|
+
import { Deployments } from "./deploy/deployments.js";
|
|
4
|
+
import { Projects } from "./project/projects.js";
|
|
3
5
|
import { Tunnel } from "./tunnel/tunnel.js";
|
|
6
|
+
import { type WhoamiInfo } from "./whoami.js";
|
|
4
7
|
export declare class Alpic {
|
|
5
8
|
readonly auth: AlpicAuth;
|
|
6
9
|
readonly api: AlpicApi;
|
|
7
10
|
readonly tunnel: Tunnel;
|
|
11
|
+
readonly deployments: Deployments;
|
|
12
|
+
readonly projects: Projects;
|
|
8
13
|
constructor();
|
|
14
|
+
whoami(): Promise<WhoamiInfo>;
|
|
9
15
|
}
|
package/dist/client.js
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { createApiClient } from "./api/client.js";
|
|
2
2
|
import { AlpicAuth } from "./auth/index.js";
|
|
3
|
+
import { Deployments } from "./deploy/deployments.js";
|
|
3
4
|
import { env } from "./env.js";
|
|
5
|
+
import { Projects } from "./project/projects.js";
|
|
4
6
|
import { Tunnel } from "./tunnel/tunnel.js";
|
|
7
|
+
import { whoami } from "./whoami.js";
|
|
5
8
|
export class Alpic {
|
|
6
9
|
auth;
|
|
7
10
|
api;
|
|
8
11
|
tunnel;
|
|
12
|
+
deployments;
|
|
13
|
+
projects;
|
|
9
14
|
constructor() {
|
|
10
15
|
this.auth = new AlpicAuth();
|
|
11
16
|
this.api = createApiClient({
|
|
@@ -13,6 +18,11 @@ export class Alpic {
|
|
|
13
18
|
auth: this.auth,
|
|
14
19
|
});
|
|
15
20
|
this.tunnel = new Tunnel({ api: this.api });
|
|
21
|
+
this.deployments = new Deployments({ api: this.api });
|
|
22
|
+
this.projects = new Projects({ api: this.api });
|
|
23
|
+
}
|
|
24
|
+
whoami() {
|
|
25
|
+
return whoami(this.auth, this.api);
|
|
16
26
|
}
|
|
17
27
|
}
|
|
18
28
|
//# sourceMappingURL=client.js.map
|
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,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function ensureGitAvailable(): void;
|
|
2
|
+
export declare function getGitFiles(): string[];
|
|
3
|
+
export declare function getFilesToPack(): string[];
|
|
4
|
+
export declare function createTarArchive(files: string[]): Promise<{
|
|
5
|
+
tmpDir: string;
|
|
6
|
+
archivePath: string;
|
|
7
|
+
}>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { existsSync, mkdtempSync, rmSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { create as tarCreate } from "tar";
|
|
6
|
+
const GIT_FILES_MAX_BUFFER = 10 * 1024 * 1024;
|
|
7
|
+
function isGitRepository() {
|
|
8
|
+
return existsSync(join(process.cwd(), ".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() {
|
|
19
|
+
const output = execSync("git ls-files -z --cached --others --exclude-standard -- .", {
|
|
20
|
+
encoding: "utf8",
|
|
21
|
+
maxBuffer: GIT_FILES_MAX_BUFFER,
|
|
22
|
+
});
|
|
23
|
+
const files = output.split("\0").filter(Boolean);
|
|
24
|
+
if (files.length === 0) {
|
|
25
|
+
throw new Error("No tracked or untracked files found. Ensure you are in a git repository with files to deploy.");
|
|
26
|
+
}
|
|
27
|
+
return files;
|
|
28
|
+
}
|
|
29
|
+
export function getFilesToPack() {
|
|
30
|
+
if (isGitRepository()) {
|
|
31
|
+
return getGitFiles();
|
|
32
|
+
}
|
|
33
|
+
ensureGitAvailable();
|
|
34
|
+
execSync("git init", { stdio: "ignore" });
|
|
35
|
+
try {
|
|
36
|
+
return getGitFiles();
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
rmSync(join(process.cwd(), ".git"), { recursive: true, force: true });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function createTarArchive(files) {
|
|
43
|
+
const tmpDir = mkdtempSync(join(tmpdir(), "alpic-deploy-"));
|
|
44
|
+
const archivePath = join(tmpDir, "source.tar.gz");
|
|
45
|
+
try {
|
|
46
|
+
await tarCreate({ gzip: true, file: archivePath }, files);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
rmSync(tmpDir, { recursive: true, force: true });
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
return { tmpDir, archivePath };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/deploy/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,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,KAAK,CAAC;AAE1C,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C,SAAS,eAAe;IACtB,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;AACjD,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;IACzB,MAAM,MAAM,GAAG,QAAQ,CAAC,2DAA2D,EAAE;QACnF,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;IAC5B,IAAI,eAAe,EAAE,EAAE,CAAC;QACtB,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;IACD,kBAAkB,EAAE,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAe;IACpD,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,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { RouterOutput } from "@alpic-ai/api";
|
|
2
|
+
import type { AlpicApi } from "../api/client.js";
|
|
3
|
+
export type Deployment = RouterOutput["deployments"]["get"]["v1"];
|
|
4
|
+
export type DeploymentStatus = Deployment["status"];
|
|
5
|
+
export type DeployOptions = {
|
|
6
|
+
environmentId: string;
|
|
7
|
+
teamId: string;
|
|
8
|
+
onProgress?: (event: DeployEvent) => void;
|
|
9
|
+
};
|
|
10
|
+
export type DeployResult = {
|
|
11
|
+
deploymentId: string;
|
|
12
|
+
status: DeploymentStatus;
|
|
13
|
+
mcpServerUrl: string;
|
|
14
|
+
domains: string[];
|
|
15
|
+
deploymentPageUrl: string | null;
|
|
16
|
+
elapsedMs: number;
|
|
17
|
+
};
|
|
18
|
+
export type DeployEvent = {
|
|
19
|
+
type: "collecting";
|
|
20
|
+
} | {
|
|
21
|
+
type: "collected";
|
|
22
|
+
fileCount: number;
|
|
23
|
+
} | {
|
|
24
|
+
type: "uploading";
|
|
25
|
+
} | {
|
|
26
|
+
type: "triggering";
|
|
27
|
+
} | {
|
|
28
|
+
type: "deploying";
|
|
29
|
+
status: DeploymentStatus;
|
|
30
|
+
elapsedMs: number;
|
|
31
|
+
deploymentPageUrl: string | null;
|
|
32
|
+
};
|
|
33
|
+
export type DeploymentsDeps = {
|
|
34
|
+
api: AlpicApi;
|
|
35
|
+
};
|
|
36
|
+
export declare class Deployments {
|
|
37
|
+
private readonly api;
|
|
38
|
+
constructor(deps: DeploymentsDeps);
|
|
39
|
+
getLatestForEnvironment(environmentId: string): Promise<Deployment>;
|
|
40
|
+
watch(deploymentId: string): Promise<Deployment>;
|
|
41
|
+
private pollUntilFinal;
|
|
42
|
+
deploy({ environmentId, teamId, onProgress }: DeployOptions): Promise<DeployResult>;
|
|
43
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { readFileSync, rmSync } from "node:fs";
|
|
2
|
+
import { createTarArchive, getFilesToPack } from "./archive.js";
|
|
3
|
+
import { pollIntervalMs, sleep } from "./poll.js";
|
|
4
|
+
import { uploadToPresignedUrl } from "./upload.js";
|
|
5
|
+
const FINAL_STATUSES = new Set(["deployed", "failed", "canceled"]);
|
|
6
|
+
const TIMEOUT_MS = 15 * 60 * 1000;
|
|
7
|
+
const DEPLOY_POLL_MS = 10_000;
|
|
8
|
+
const WATCH_POLL_MS = 3_000;
|
|
9
|
+
export class Deployments {
|
|
10
|
+
api;
|
|
11
|
+
constructor(deps) {
|
|
12
|
+
this.api = deps.api;
|
|
13
|
+
}
|
|
14
|
+
async getLatestForEnvironment(environmentId) {
|
|
15
|
+
const environment = await this.api.environments.get.v1({ environmentId });
|
|
16
|
+
const deployments = await this.api.deployments.list.v1({
|
|
17
|
+
projectId: environment.projectId,
|
|
18
|
+
environmentId,
|
|
19
|
+
});
|
|
20
|
+
const latest = deployments[0];
|
|
21
|
+
if (!latest) {
|
|
22
|
+
throw new Error(`No deployments found for environment ${environmentId}.`);
|
|
23
|
+
}
|
|
24
|
+
return latest;
|
|
25
|
+
}
|
|
26
|
+
watch(deploymentId) {
|
|
27
|
+
return this.pollUntilFinal(deploymentId, WATCH_POLL_MS);
|
|
28
|
+
}
|
|
29
|
+
async pollUntilFinal(deploymentId, intervalMs) {
|
|
30
|
+
const startedAt = Date.now();
|
|
31
|
+
let current = await this.api.deployments.get.v1({ deploymentId });
|
|
32
|
+
while (!FINAL_STATUSES.has(current.status)) {
|
|
33
|
+
if (Date.now() - startedAt >= TIMEOUT_MS) {
|
|
34
|
+
throw new Error("Deployment did not reach a final state within 15 minutes.");
|
|
35
|
+
}
|
|
36
|
+
await sleep(pollIntervalMs(intervalMs));
|
|
37
|
+
current = await this.api.deployments.get.v1({ deploymentId });
|
|
38
|
+
}
|
|
39
|
+
return current;
|
|
40
|
+
}
|
|
41
|
+
async deploy({ environmentId, teamId, onProgress }) {
|
|
42
|
+
const emit = onProgress ?? (() => { });
|
|
43
|
+
let tmpDir;
|
|
44
|
+
const startedAt = Date.now();
|
|
45
|
+
try {
|
|
46
|
+
emit({ type: "collecting" });
|
|
47
|
+
const files = getFilesToPack();
|
|
48
|
+
emit({ type: "collected", fileCount: files.length });
|
|
49
|
+
const archive = await createTarArchive(files);
|
|
50
|
+
tmpDir = archive.tmpDir;
|
|
51
|
+
const { uploadUrl, token } = await this.api.deployments.uploadArtifact.v1({ teamId });
|
|
52
|
+
emit({ type: "uploading" });
|
|
53
|
+
await uploadToPresignedUrl(uploadUrl, readFileSync(archive.archivePath));
|
|
54
|
+
emit({ type: "triggering" });
|
|
55
|
+
const initial = await this.api.environments.deploy.v1({ environmentId, token });
|
|
56
|
+
let deployment = initial;
|
|
57
|
+
const deploymentPageUrl = deployment.deploymentPageUrl ?? null;
|
|
58
|
+
const emitDeploying = () => emit({ type: "deploying", status: deployment.status, elapsedMs: Date.now() - startedAt, deploymentPageUrl });
|
|
59
|
+
emitDeploying();
|
|
60
|
+
while (deployment.status === "ongoing") {
|
|
61
|
+
if (Date.now() - startedAt >= TIMEOUT_MS) {
|
|
62
|
+
throw new Error(deploymentPageUrl
|
|
63
|
+
? `Deployment aborted after 15 minutes. View status: ${deploymentPageUrl}`
|
|
64
|
+
: "Deployment aborted after 15 minutes.");
|
|
65
|
+
}
|
|
66
|
+
deployment = await this.api.deployments.get.v1({ deploymentId: deployment.id });
|
|
67
|
+
emitDeploying();
|
|
68
|
+
if (deployment.status === "ongoing") {
|
|
69
|
+
await sleep(pollIntervalMs(DEPLOY_POLL_MS));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const environment = await this.api.environments.get.v1({ environmentId });
|
|
73
|
+
return {
|
|
74
|
+
deploymentId: deployment.id,
|
|
75
|
+
status: deployment.status,
|
|
76
|
+
mcpServerUrl: environment.mcpServerUrl,
|
|
77
|
+
domains: environment.domains,
|
|
78
|
+
deploymentPageUrl: deployment.deploymentPageUrl ?? null,
|
|
79
|
+
elapsedMs: Date.now() - startedAt,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
if (tmpDir) {
|
|
84
|
+
rmSync(tmpDir, { recursive: true, force: true });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=deployments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployments.js","sourceRoot":"","sources":["../../src/deploy/deployments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function pollIntervalMs(defaultMs) {
|
|
2
|
+
const override = process.env.ALPIC_POLL_INTERVAL_MS;
|
|
3
|
+
if (override !== undefined) {
|
|
4
|
+
const parsed = Number.parseInt(override, 10);
|
|
5
|
+
return Number.isNaN(parsed) ? defaultMs : parsed;
|
|
6
|
+
}
|
|
7
|
+
return defaultMs;
|
|
8
|
+
}
|
|
9
|
+
export const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
10
|
+
//# sourceMappingURL=poll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poll.js","sourceRoot":"","sources":["../../src/deploy/poll.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACpD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IACnD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function uploadToPresignedUrl(uploadUrl: string, buffer: Buffer): Promise<void>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export async function uploadToPresignedUrl(uploadUrl, buffer) {
|
|
2
|
+
const res = await fetch(uploadUrl, {
|
|
3
|
+
method: "PUT",
|
|
4
|
+
headers: {
|
|
5
|
+
"Content-Type": "application/gzip",
|
|
6
|
+
},
|
|
7
|
+
body: new Uint8Array(buffer),
|
|
8
|
+
});
|
|
9
|
+
if (!res.ok) {
|
|
10
|
+
throw new Error(`Upload failed: ${res.status} ${res.statusText}`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/deploy/upload.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,SAAiB,EAAE,MAAc;IAC1E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;QACjC,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC;KAC7B,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,4 +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, 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";
|
|
7
10
|
export type { OpenTunnelOptions, TunnelCloseInfo, TunnelHandle, TunnelRequest } from "./tunnel/tunnel.js";
|
|
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/dist/vendor/pipenet.js
CHANGED
|
@@ -16585,18 +16585,18 @@ var {
|
|
|
16585
16585
|
create
|
|
16586
16586
|
} = axios_default;
|
|
16587
16587
|
|
|
16588
|
-
// ../../node_modules/.pnpm/pipenet@1.4.
|
|
16588
|
+
// ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/Tunnel.js
|
|
16589
16589
|
var import_debug2 = __toESM(require_src(), 1);
|
|
16590
16590
|
import { EventEmitter as EventEmitter3 } from "events";
|
|
16591
16591
|
|
|
16592
|
-
// ../../node_modules/.pnpm/pipenet@1.4.
|
|
16592
|
+
// ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/TunnelCluster.js
|
|
16593
16593
|
var import_debug = __toESM(require_src(), 1);
|
|
16594
16594
|
import { EventEmitter as EventEmitter2 } from "events";
|
|
16595
16595
|
import fs from "fs";
|
|
16596
16596
|
import net from "net";
|
|
16597
16597
|
import tls from "tls";
|
|
16598
16598
|
|
|
16599
|
-
// ../../node_modules/.pnpm/pipenet@1.4.
|
|
16599
|
+
// ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/HeaderHostTransformer.js
|
|
16600
16600
|
import { Transform } from "stream";
|
|
16601
16601
|
var HeaderHostTransformer = class extends Transform {
|
|
16602
16602
|
host;
|
|
@@ -16614,7 +16614,7 @@ var HeaderHostTransformer = class extends Transform {
|
|
|
16614
16614
|
}
|
|
16615
16615
|
};
|
|
16616
16616
|
|
|
16617
|
-
// ../../node_modules/.pnpm/pipenet@1.4.
|
|
16617
|
+
// ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/TunnelCluster.js
|
|
16618
16618
|
var log = (0, import_debug.default)("pipenet:client");
|
|
16619
16619
|
var TunnelCluster = class extends EventEmitter2 {
|
|
16620
16620
|
opts;
|
|
@@ -16647,18 +16647,10 @@ var TunnelCluster = class extends EventEmitter2 {
|
|
|
16647
16647
|
}
|
|
16648
16648
|
remote.end();
|
|
16649
16649
|
});
|
|
16650
|
-
let deadEmitted = false;
|
|
16651
|
-
const emitDead = () => {
|
|
16652
|
-
if (deadEmitted) {
|
|
16653
|
-
return;
|
|
16654
|
-
}
|
|
16655
|
-
deadEmitted = true;
|
|
16656
|
-
this.emit("dead", remote);
|
|
16657
|
-
};
|
|
16658
16650
|
const connLocal = () => {
|
|
16659
16651
|
if (remote.destroyed) {
|
|
16660
16652
|
log("remote destroyed");
|
|
16661
|
-
|
|
16653
|
+
this.emit("dead", remote);
|
|
16662
16654
|
return;
|
|
16663
16655
|
}
|
|
16664
16656
|
log("connecting locally to %s://%s:%d", localProtocol, localHost, localPort);
|
|
@@ -16674,7 +16666,7 @@ var TunnelCluster = class extends EventEmitter2 {
|
|
|
16674
16666
|
const local = opt.localHttps ? tls.connect({ host: localHost, port: localPort, ...getLocalCertOpts() }) : net.connect({ host: localHost, port: localPort });
|
|
16675
16667
|
const remoteClose = () => {
|
|
16676
16668
|
log("remote close");
|
|
16677
|
-
|
|
16669
|
+
this.emit("dead", remote);
|
|
16678
16670
|
local.end();
|
|
16679
16671
|
};
|
|
16680
16672
|
remote.once("close", remoteClose);
|
|
@@ -16722,7 +16714,7 @@ var TunnelCluster = class extends EventEmitter2 {
|
|
|
16722
16714
|
}
|
|
16723
16715
|
};
|
|
16724
16716
|
|
|
16725
|
-
// ../../node_modules/.pnpm/pipenet@1.4.
|
|
16717
|
+
// ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/Tunnel.js
|
|
16726
16718
|
var log2 = (0, import_debug2.default)("pipenet:client");
|
|
16727
16719
|
var Tunnel = class extends EventEmitter3 {
|
|
16728
16720
|
cachedUrl;
|
|
@@ -16870,7 +16862,7 @@ var Tunnel = class extends EventEmitter3 {
|
|
|
16870
16862
|
}
|
|
16871
16863
|
};
|
|
16872
16864
|
|
|
16873
|
-
// ../../node_modules/.pnpm/pipenet@1.4.
|
|
16865
|
+
// ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/pipenet.js
|
|
16874
16866
|
function pipenet(arg1, arg2, arg3) {
|
|
16875
16867
|
const options = typeof arg1 === "object" ? arg1 : { ...arg2, port: arg1 };
|
|
16876
16868
|
const callback = typeof arg1 === "object" ? arg2 : arg3;
|