alpic 0.0.0-dev.f19a8ca → 0.0.0-dev.f1faa63
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 +158 -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 +111 -0
- package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -0
- package/dist/__tests__/deploy.e2e.test.js +37 -54
- package/dist/__tests__/deploy.e2e.test.js.map +1 -1
- package/dist/__tests__/deployment-inspect.e2e.test.d.ts +1 -0
- package/dist/__tests__/deployment-inspect.e2e.test.js +113 -0
- package/dist/__tests__/deployment-inspect.e2e.test.js.map +1 -0
- package/dist/__tests__/deployment-list.e2e.test.d.ts +1 -0
- package/dist/__tests__/deployment-list.e2e.test.js +108 -0
- package/dist/__tests__/deployment-list.e2e.test.js.map +1 -0
- package/dist/__tests__/deployment-logs.e2e.test.d.ts +1 -0
- package/dist/__tests__/deployment-logs.e2e.test.js +180 -0
- package/dist/__tests__/deployment-logs.e2e.test.js.map +1 -0
- package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.d.ts +1 -0
- package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js +250 -0
- package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js.map +1 -0
- package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.d.ts +1 -0
- package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js +122 -0
- package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js.map +1 -0
- package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.d.ts +1 -0
- package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js +139 -0
- package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js.map +1 -0
- package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.d.ts +1 -0
- package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js +319 -0
- package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js.map +1 -0
- package/dist/__tests__/environment-variable/environment-variable-validation.test.d.ts +1 -0
- package/dist/__tests__/environment-variable/environment-variable-validation.test.js +20 -0
- package/dist/__tests__/environment-variable/environment-variable-validation.test.js.map +1 -0
- package/dist/__tests__/fixtures/demo-project/index.js +1 -1
- package/dist/__tests__/fixtures/demo-project/index.js.map +1 -1
- 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.js +57 -16
- package/dist/__tests__/git.e2e.test.js.map +1 -1
- package/dist/__tests__/logs.e2e.test.d.ts +1 -0
- package/dist/__tests__/logs.e2e.test.js +197 -0
- package/dist/__tests__/logs.e2e.test.js.map +1 -0
- package/dist/__tests__/mock-server.d.ts +16 -0
- package/dist/__tests__/mock-server.js +253 -7
- package/dist/__tests__/mock-server.js.map +1 -1
- package/dist/__tests__/publish.e2e.test.d.ts +1 -0
- package/dist/__tests__/publish.e2e.test.js +485 -0
- package/dist/__tests__/publish.e2e.test.js.map +1 -0
- package/dist/__tests__/tunnel.e2e.test.d.ts +1 -0
- package/dist/__tests__/tunnel.e2e.test.js +64 -0
- package/dist/__tests__/tunnel.e2e.test.js.map +1 -0
- package/dist/__tests__/utils.d.ts +21 -4
- package/dist/__tests__/utils.js +113 -15
- package/dist/__tests__/utils.js.map +1 -1
- package/dist/api.d.ts +0 -1
- package/dist/api.js +5 -9
- package/dist/api.js.map +1 -1
- package/dist/commands/deploy.d.ts +5 -2
- package/dist/commands/deploy.js +37 -23
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/deployment/inspect.d.ts +11 -0
- package/dist/commands/deployment/inspect.js +68 -0
- package/dist/commands/deployment/inspect.js.map +1 -0
- package/dist/commands/deployment/list.d.ts +11 -0
- package/dist/commands/deployment/list.js +85 -0
- package/dist/commands/deployment/list.js.map +1 -0
- package/dist/commands/deployment/logs.d.ts +12 -0
- package/dist/commands/deployment/logs.js +48 -0
- package/dist/commands/deployment/logs.js.map +1 -0
- package/dist/commands/environment-variable/add.d.ts +14 -0
- package/dist/commands/environment-variable/add.js +46 -0
- package/dist/commands/environment-variable/add.js.map +1 -0
- package/dist/commands/environment-variable/list.d.ts +9 -0
- package/dist/commands/environment-variable/list.js +44 -0
- package/dist/commands/environment-variable/list.js.map +1 -0
- package/dist/commands/environment-variable/remove.d.ts +11 -0
- package/dist/commands/environment-variable/remove.js +32 -0
- package/dist/commands/environment-variable/remove.js.map +1 -0
- package/dist/commands/environment-variable/update.d.ts +13 -0
- package/dist/commands/environment-variable/update.js +40 -0
- package/dist/commands/environment-variable/update.js.map +1 -0
- package/dist/commands/git/connect.d.ts +3 -2
- package/dist/commands/git/connect.js +26 -33
- package/dist/commands/git/connect.js.map +1 -1
- package/dist/commands/git/disconnect.d.ts +2 -2
- package/dist/commands/git/disconnect.js +16 -30
- package/dist/commands/git/disconnect.js.map +1 -1
- package/dist/commands/git.js +3 -3
- package/dist/commands/git.js.map +1 -1
- package/dist/commands/login.d.ts +6 -0
- package/dist/commands/login.js +34 -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/logs.d.ts +16 -0
- package/dist/commands/logs.js +96 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/publish.d.ts +15 -0
- package/dist/commands/publish.js +51 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/tunnel.d.ts +9 -0
- package/dist/commands/tunnel.js +53 -0
- package/dist/commands/tunnel.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 +2 -0
- package/dist/lib/alpic-command.js +12 -5
- package/dist/lib/alpic-command.js.map +1 -1
- package/dist/lib/archive.d.ts +3 -3
- package/dist/lib/archive.js +11 -15
- package/dist/lib/archive.js.map +1 -1
- 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/config.d.ts +2 -2
- package/dist/lib/config.js +7 -7
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/deployment.d.ts +70 -3
- package/dist/lib/deployment.js +113 -8
- package/dist/lib/deployment.js.map +1 -1
- package/dist/lib/environment-variable.d.ts +41 -0
- package/dist/lib/environment-variable.js +304 -0
- package/dist/lib/environment-variable.js.map +1 -0
- package/dist/lib/git.d.ts +12 -4
- package/dist/lib/git.js +51 -26
- package/dist/lib/git.js.map +1 -1
- 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/logs.d.ts +20 -0
- package/dist/lib/logs.js +86 -0
- package/dist/lib/logs.js.map +1 -0
- package/dist/lib/project.d.ts +68 -61
- package/dist/lib/project.js +273 -252
- package/dist/lib/project.js.map +1 -1
- package/dist/lib/publish.d.ts +22 -0
- package/dist/lib/publish.js +181 -0
- package/dist/lib/publish.js.map +1 -0
- package/dist/lib/table.d.ts +8 -0
- package/dist/lib/table.js +27 -0
- package/dist/lib/table.js.map +1 -0
- package/dist/lib/telemetry.js +6 -6
- package/dist/lib/telemetry.js.map +1 -1
- package/dist/lib/utils.d.ts +4 -0
- package/dist/lib/utils.js +21 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/utils.test.d.ts +1 -0
- package/dist/lib/utils.test.js +21 -0
- package/dist/lib/utils.test.js.map +1 -0
- package/package.json +32 -19
- package/dist/lib/auth.d.ts +0 -1
- package/dist/lib/auth.js +0 -10
- package/dist/lib/auth.js.map +0 -1
- package/dist/lib/global-config.d.ts +0 -9
- package/dist/lib/global-config.js +0 -48
- package/dist/lib/global-config.js.map +0 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
2
|
+
export declare class Logs extends AlpicCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
"environment-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
since: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
until: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
limit: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
follow: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
level: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
search: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
"no-color": import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
};
|
|
15
|
+
run(): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { Flags } from "@oclif/core";
|
|
2
|
+
import { api } from "../api.js";
|
|
3
|
+
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
4
|
+
import { resolveEnvironmentId } from "../lib/environment-variable.js";
|
|
5
|
+
import { followEnvironmentLogs, parseLevel, printLog } from "../lib/logs.js";
|
|
6
|
+
export class Logs extends AlpicCommand {
|
|
7
|
+
static description = "Stream runtime logs for an environment";
|
|
8
|
+
static examples = [
|
|
9
|
+
"<%= config.bin %> logs --environment-id <environmentId>",
|
|
10
|
+
"<%= config.bin %> logs --environment-id <environmentId> --since 1h",
|
|
11
|
+
"<%= config.bin %> logs --environment-id <environmentId> --follow",
|
|
12
|
+
"<%= config.bin %> logs --environment-id <environmentId> --level ERROR --level WARNING",
|
|
13
|
+
"<%= config.bin %> logs --environment-id <environmentId> --search 'timeout' --limit 50",
|
|
14
|
+
"<%= config.bin %> logs --environment-id <environmentId> --no-color",
|
|
15
|
+
];
|
|
16
|
+
static flags = {
|
|
17
|
+
"environment-id": Flags.string({
|
|
18
|
+
description: "The ID of the environment",
|
|
19
|
+
required: false,
|
|
20
|
+
}),
|
|
21
|
+
since: Flags.string({
|
|
22
|
+
description: "Show logs after this time (e.g. 1h, 30m, 2024-01-01T00:00:00Z)",
|
|
23
|
+
required: false,
|
|
24
|
+
}),
|
|
25
|
+
until: Flags.string({
|
|
26
|
+
description: "Show logs before this time (e.g. 1h, 30m, 2024-01-01T00:00:00Z). Cannot be used with --follow",
|
|
27
|
+
required: false,
|
|
28
|
+
}),
|
|
29
|
+
limit: Flags.integer({
|
|
30
|
+
char: "n",
|
|
31
|
+
description: "Maximum number of log entries to fetch. Cannot be used with --follow",
|
|
32
|
+
required: false,
|
|
33
|
+
min: 1,
|
|
34
|
+
max: 1000,
|
|
35
|
+
}),
|
|
36
|
+
follow: Flags.boolean({
|
|
37
|
+
char: "f",
|
|
38
|
+
description: "Poll for new logs continuously",
|
|
39
|
+
required: false,
|
|
40
|
+
default: false,
|
|
41
|
+
}),
|
|
42
|
+
level: Flags.string({
|
|
43
|
+
description: "Filter by log level (INFO, ERROR, WARNING, DEBUG)",
|
|
44
|
+
required: false,
|
|
45
|
+
multiple: true,
|
|
46
|
+
}),
|
|
47
|
+
search: Flags.string({
|
|
48
|
+
description: "Filter logs. Accepts a regex-style pattern or plain text",
|
|
49
|
+
required: false,
|
|
50
|
+
}),
|
|
51
|
+
"no-color": Flags.boolean({
|
|
52
|
+
description: "Disable colorized output and show log levels as text",
|
|
53
|
+
required: false,
|
|
54
|
+
default: false,
|
|
55
|
+
}),
|
|
56
|
+
};
|
|
57
|
+
async run() {
|
|
58
|
+
const { flags } = await this.parse(Logs);
|
|
59
|
+
await this.ensureAuthenticated();
|
|
60
|
+
const environmentId = resolveEnvironmentId(flags);
|
|
61
|
+
const level = flags.level !== undefined ? parseLevel(flags.level) : undefined;
|
|
62
|
+
if (flags.follow && flags.until !== undefined) {
|
|
63
|
+
throw new Error("--until cannot be used with --follow");
|
|
64
|
+
}
|
|
65
|
+
if (flags.follow && flags.limit !== undefined) {
|
|
66
|
+
throw new Error("--limit cannot be used with --follow");
|
|
67
|
+
}
|
|
68
|
+
const options = {
|
|
69
|
+
environmentId,
|
|
70
|
+
since: flags.since ?? (flags.follow ? "10m" : undefined),
|
|
71
|
+
until: flags.until,
|
|
72
|
+
limit: flags.limit,
|
|
73
|
+
level,
|
|
74
|
+
search: flags.search,
|
|
75
|
+
};
|
|
76
|
+
const { logs, nextToken } = await api.environments.getLogs.v1(options);
|
|
77
|
+
const onLog = (log) => {
|
|
78
|
+
printLog(log, { noColor: flags["no-color"] });
|
|
79
|
+
};
|
|
80
|
+
for (const log of logs) {
|
|
81
|
+
onLog(log);
|
|
82
|
+
}
|
|
83
|
+
if (!flags.follow)
|
|
84
|
+
return;
|
|
85
|
+
await followEnvironmentLogs({
|
|
86
|
+
environmentId,
|
|
87
|
+
limit: flags.limit,
|
|
88
|
+
level,
|
|
89
|
+
search: flags.search,
|
|
90
|
+
nextToken,
|
|
91
|
+
initialLogs: logs,
|
|
92
|
+
onLog,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
2
|
+
export declare class Publish extends AlpicCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
"non-interactive": import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
domain: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
title: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
"website-url": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
"icon-src": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
"project-id": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
};
|
|
14
|
+
run(): Promise<void>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import { Flags } from "@oclif/core";
|
|
3
|
+
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
4
|
+
import { resolveProjectId } from "../lib/project.js";
|
|
5
|
+
import { PublishWorkflow } from "../lib/publish.js";
|
|
6
|
+
export class Publish extends AlpicCommand {
|
|
7
|
+
static description = "Publish your MCP server to the MCP registry";
|
|
8
|
+
static examples = [
|
|
9
|
+
"<%= config.bin %> publish",
|
|
10
|
+
"<%= config.bin %> publish --non-interactive --domain my.domain.com --title 'My Server' --description 'Does things'",
|
|
11
|
+
];
|
|
12
|
+
static flags = {
|
|
13
|
+
"non-interactive": Flags.boolean({
|
|
14
|
+
description: "Skip all prompts",
|
|
15
|
+
required: false,
|
|
16
|
+
}),
|
|
17
|
+
domain: Flags.string({
|
|
18
|
+
description: "Domain to publish for",
|
|
19
|
+
required: false,
|
|
20
|
+
}),
|
|
21
|
+
title: Flags.string({
|
|
22
|
+
description: "Server title (1-100 chars)",
|
|
23
|
+
required: false,
|
|
24
|
+
}),
|
|
25
|
+
description: Flags.string({
|
|
26
|
+
description: "Server description (1-100 chars)",
|
|
27
|
+
required: false,
|
|
28
|
+
}),
|
|
29
|
+
"website-url": Flags.string({
|
|
30
|
+
description: "Website URL",
|
|
31
|
+
required: false,
|
|
32
|
+
}),
|
|
33
|
+
"icon-src": Flags.string({
|
|
34
|
+
description: "Icon URL",
|
|
35
|
+
required: false,
|
|
36
|
+
}),
|
|
37
|
+
"project-id": Flags.string({
|
|
38
|
+
description: "Project ID",
|
|
39
|
+
required: false,
|
|
40
|
+
}),
|
|
41
|
+
};
|
|
42
|
+
async run() {
|
|
43
|
+
const { flags } = await this.parse(Publish);
|
|
44
|
+
p.intro("Publishing to MCP Registry");
|
|
45
|
+
await this.ensureAuthenticated();
|
|
46
|
+
const projectId = resolveProjectId(flags);
|
|
47
|
+
const workflow = new PublishWorkflow(flags);
|
|
48
|
+
await workflow.publish(projectId);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=publish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,OAAO,OAAQ,SAAQ,YAAY;IACvC,MAAM,CAAU,WAAW,GAAG,6CAA6C,CAAC;IAE5E,MAAM,CAAU,QAAQ,GAAG;QACzB,2BAA2B;QAC3B,oHAAoH;KACrH,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC;YAC/B,WAAW,EAAE,kBAAkB;YAC/B,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,uBAAuB;YACpC,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;YAClB,WAAW,EAAE,4BAA4B;YACzC,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC;YACxB,WAAW,EAAE,kCAAkC;YAC/C,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC;YAC1B,WAAW,EAAE,aAAa;YAC1B,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC;YACvB,WAAW,EAAE,UAAU;YACvB,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC;YACzB,WAAW,EAAE,YAAY;YACzB,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE5C,CAAC,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAEtC,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAEjC,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
2
|
+
export declare class Tunnel extends AlpicCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
port: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
};
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import { Flags } from "@oclif/core";
|
|
3
|
+
import { pipenet } from "pipenet";
|
|
4
|
+
import { api } from "../api.js";
|
|
5
|
+
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
6
|
+
export class Tunnel extends AlpicCommand {
|
|
7
|
+
static description = "Expose a local server to the internet through an Alpic tunnel";
|
|
8
|
+
static examples = ["<%= config.bin %> tunnel --port 3000"];
|
|
9
|
+
static flags = {
|
|
10
|
+
port: Flags.integer({
|
|
11
|
+
description: "Local port to tunnel",
|
|
12
|
+
required: true,
|
|
13
|
+
}),
|
|
14
|
+
};
|
|
15
|
+
async run() {
|
|
16
|
+
const { flags } = await this.parse(Tunnel);
|
|
17
|
+
await this.ensureAuthenticated();
|
|
18
|
+
const spinner = p.spinner();
|
|
19
|
+
spinner.start("Opening tunnel...");
|
|
20
|
+
const { ticket, tunnelHost, subdomain } = await api.tunnels.getTicket.v1();
|
|
21
|
+
// terrible ux but pipenet client retries forever on error
|
|
22
|
+
// I'll probably open an issue/pr on their repo once I'm sure about the fix
|
|
23
|
+
const tunnel = await Promise.race([
|
|
24
|
+
pipenet({
|
|
25
|
+
port: flags.port,
|
|
26
|
+
host: `https://${tunnelHost}`,
|
|
27
|
+
subdomain: subdomain,
|
|
28
|
+
headers: { Authorization: `Bearer ${ticket}` },
|
|
29
|
+
}),
|
|
30
|
+
new Promise((_, reject) => {
|
|
31
|
+
const id = setTimeout(() => reject(new Error("Failed to connect to tunnel server")), 10_000);
|
|
32
|
+
id.unref?.(); // don't keep the event loop alive just for this timer
|
|
33
|
+
}),
|
|
34
|
+
]);
|
|
35
|
+
spinner.stop(`Forwarding: https://${subdomain}.${tunnelHost} -> http://localhost:${flags.port}`);
|
|
36
|
+
p.log.info("Press Ctrl+C to close the tunnel");
|
|
37
|
+
// Keep the process alive until Ctrl+C
|
|
38
|
+
await new Promise((resolve) => {
|
|
39
|
+
process.once("SIGINT", () => {
|
|
40
|
+
tunnel.close();
|
|
41
|
+
resolve();
|
|
42
|
+
});
|
|
43
|
+
process.once("SIGTERM", () => {
|
|
44
|
+
tunnel.close();
|
|
45
|
+
resolve();
|
|
46
|
+
});
|
|
47
|
+
tunnel.on("error", (err) => p.log.error(err.message));
|
|
48
|
+
tunnel.on("close", resolve);
|
|
49
|
+
});
|
|
50
|
+
p.outro("Tunnel closed");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=tunnel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/commands/tunnel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,OAAO,MAAO,SAAQ,YAAY;IACtC,MAAM,CAAU,WAAW,GAAG,+DAA+D,CAAC;IAE9F,MAAM,CAAU,QAAQ,GAAG,CAAC,sCAAsC,CAAC,CAAC;IAEpE,MAAM,CAAU,KAAK,GAAG;QACtB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;YAClB,WAAW,EAAE,sBAAsB;YACnC,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAE3C,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAEjC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAEnC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAE3E,0DAA0D;QAC1D,2EAA2E;QAC3E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAChC,OAAO,CAAC;gBACN,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,WAAW,UAAU,EAAE;gBAC7B,SAAS,EAAE,SAAS;gBACpB,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE;aAC/C,CAAC;YACF,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC/B,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC7F,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,sDAAsD;YACtE,CAAC,CAAC;SACH,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,uBAAuB,SAAS,IAAI,UAAU,wBAAwB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAE/C,sCAAsC;QACtC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;gBAC1B,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;gBAC3B,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7D,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC3B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import { AlpicCommand } from "../lib/alpic-command.js";
|
|
3
|
+
import { getWhoamiInfoMessage } from "../lib/auth/whoami.js";
|
|
4
|
+
export class Whoami extends AlpicCommand {
|
|
5
|
+
static description = "Show the current Alpic identity (API key or logged-in user)";
|
|
6
|
+
static examples = ["<%= config.bin %> whoami"];
|
|
7
|
+
async run() {
|
|
8
|
+
await this.parse(Whoami);
|
|
9
|
+
p.intro("Reading authentication status…");
|
|
10
|
+
p.outro(await getWhoamiInfoMessage());
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,OAAO,MAAO,SAAQ,YAAY;IACtC,MAAM,CAAU,WAAW,GAAG,6DAA6D,CAAC;IAE5F,MAAM,CAAU,QAAQ,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAExD,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEzB,CAAC,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAE1C,CAAC,CAAC,KAAK,CAAC,MAAM,oBAAoB,EAAE,CAAC,CAAC;IACxC,CAAC"}
|
package/dist/env.d.ts
ADDED
package/dist/env.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createEnv } from "@t3-oss/env-core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export const env = createEnv({
|
|
4
|
+
server: {
|
|
5
|
+
ALPIC_API_BASE_URL: z.string().default("https://api.alpic.ai"),
|
|
6
|
+
ALPIC_COGNITO_CLIENT_ID: z.string().default("h9nqsttp8ddb40ddi1aoni91h"),
|
|
7
|
+
},
|
|
8
|
+
runtimeEnv: process.env,
|
|
9
|
+
});
|
|
10
|
+
//# sourceMappingURL=env.js.map
|
package/dist/env.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,CAAC;IAC3B,MAAM,EAAE;QACN,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,sBAAsB,CAAC;QAC9D,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC;KACzE;IACD,UAAU,EAAE,OAAO,CAAC,GAAG;CACxB,CAAC,CAAC"}
|
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
import * as p from "@clack/prompts";
|
|
2
2
|
import { Command } from "@oclif/core";
|
|
3
3
|
import { ORPCError } from "@orpc/client";
|
|
4
|
+
import { isAuthenticated } from "./auth/auth.js";
|
|
4
5
|
export class AlpicCommand extends Command {
|
|
5
6
|
async catch(error) {
|
|
6
7
|
if (error instanceof ORPCError) {
|
|
7
|
-
|
|
8
|
-
this.exit(1);
|
|
8
|
+
this.exitWithErrorMessage(`An error occurred while connecting to Alpic: ${error.message}`);
|
|
9
9
|
return;
|
|
10
10
|
}
|
|
11
11
|
if (error instanceof Error) {
|
|
12
|
-
|
|
13
|
-
this.exit(1);
|
|
12
|
+
this.exitWithErrorMessage(error.message);
|
|
14
13
|
return;
|
|
15
14
|
}
|
|
16
|
-
|
|
15
|
+
this.exitWithErrorMessage(String(error));
|
|
16
|
+
}
|
|
17
|
+
async ensureAuthenticated() {
|
|
18
|
+
if (!(await isAuthenticated())) {
|
|
19
|
+
this.exitWithErrorMessage("Not authenticated. Run `alpic login` or set ALPIC_API_KEY. Get an API key from Team settings in the Alpic dashboard.");
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exitWithErrorMessage(message) {
|
|
23
|
+
p.cancel(message);
|
|
17
24
|
this.exit(1);
|
|
18
25
|
}
|
|
19
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alpic-command.js","sourceRoot":"","sources":["../../src/lib/alpic-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,OAAgB,YAAa,SAAQ,OAAO;IACvC,KAAK,CAAC,KAAK,CAAC,KAAc;QACjC,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;YAC/B,
|
|
1
|
+
{"version":3,"file":"alpic-command.js","sourceRoot":"","sources":["../../src/lib/alpic-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,OAAgB,YAAa,SAAQ,OAAO;IACvC,KAAK,CAAC,KAAK,CAAC,KAAc;QACjC,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,oBAAoB,CAAC,gDAAgD,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3F,OAAO;QACT,CAAC;QACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,IAAI,CAAC,CAAC,MAAM,eAAe,EAAE,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,oBAAoB,CACvB,sHAAsH,CACvH,CAAC;QACJ,CAAC;IACH,CAAC;IAES,oBAAoB,CAAC,OAAe;QAC5C,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;CACF"}
|
package/dist/lib/archive.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export declare function ensureGitAvailable(): void;
|
|
2
|
-
export declare function getGitFiles(
|
|
3
|
-
export declare function getFilesToPack(
|
|
4
|
-
export declare function createTarArchive(files: string[]
|
|
2
|
+
export declare function getGitFiles(): string[];
|
|
3
|
+
export declare function getFilesToPack(): string[];
|
|
4
|
+
export declare function createTarArchive(files: string[]): Promise<{
|
|
5
5
|
tmpDir: string;
|
|
6
6
|
archivePath: string;
|
|
7
7
|
}>;
|
package/dist/lib/archive.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { execSync } from "node:child_process";
|
|
2
2
|
import { existsSync, mkdtempSync, rmSync } from "node:fs";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
|
-
import { join
|
|
4
|
+
import { join } from "node:path";
|
|
5
5
|
import { create as tarCreate } from "tar";
|
|
6
6
|
const GIT_FILES_MAX_BUFFER = 10 * 1024 * 1024;
|
|
7
|
-
function isGitRepository(
|
|
8
|
-
return existsSync(join(
|
|
7
|
+
function isGitRepository() {
|
|
8
|
+
return existsSync(join(process.cwd(), ".git"));
|
|
9
9
|
}
|
|
10
10
|
export function ensureGitAvailable() {
|
|
11
11
|
try {
|
|
@@ -15,10 +15,8 @@ export function ensureGitAvailable() {
|
|
|
15
15
|
throw new Error("Git is required to deploy. Please install git and ensure it is available in your PATH.");
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
|
-
export function getGitFiles(
|
|
19
|
-
const dir = resolve(deployDir);
|
|
18
|
+
export function getGitFiles() {
|
|
20
19
|
const output = execSync("git ls-files -z --cached --others --exclude-standard -- .", {
|
|
21
|
-
cwd: dir,
|
|
22
20
|
encoding: "utf8",
|
|
23
21
|
maxBuffer: GIT_FILES_MAX_BUFFER,
|
|
24
22
|
});
|
|
@@ -28,27 +26,25 @@ export function getGitFiles(deployDir) {
|
|
|
28
26
|
}
|
|
29
27
|
return files;
|
|
30
28
|
}
|
|
31
|
-
export function getFilesToPack(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
return getGitFiles(deployDir);
|
|
29
|
+
export function getFilesToPack() {
|
|
30
|
+
if (isGitRepository()) {
|
|
31
|
+
return getGitFiles();
|
|
35
32
|
}
|
|
36
33
|
ensureGitAvailable();
|
|
37
|
-
execSync("git init", {
|
|
34
|
+
execSync("git init", { stdio: "ignore" });
|
|
38
35
|
try {
|
|
39
|
-
return getGitFiles(
|
|
36
|
+
return getGitFiles();
|
|
40
37
|
}
|
|
41
38
|
finally {
|
|
42
|
-
rmSync(join(
|
|
39
|
+
rmSync(join(process.cwd(), ".git"), { recursive: true, force: true });
|
|
43
40
|
}
|
|
44
41
|
}
|
|
45
|
-
export async function createTarArchive(files
|
|
42
|
+
export async function createTarArchive(files) {
|
|
46
43
|
const tmpDir = mkdtempSync(join(tmpdir(), "alpic-deploy-"));
|
|
47
44
|
const archivePath = join(tmpDir, "source.tar.gz");
|
|
48
45
|
await tarCreate({
|
|
49
46
|
gzip: true,
|
|
50
47
|
file: archivePath,
|
|
51
|
-
cwd: deployDir,
|
|
52
48
|
}, files);
|
|
53
49
|
return { tmpDir, archivePath };
|
|
54
50
|
}
|
package/dist/lib/archive.js.map
CHANGED
|
@@ -1 +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,
|
|
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,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,MAAM,SAAS,CACb;QACE,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,WAAW;KAClB,EACD,KAAK,CACN,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { oAuthClient } from "./oauth/client.js";
|
|
2
|
+
export async function getApiToken() {
|
|
3
|
+
const token = process.env.ALPIC_API_KEY ?? (await oAuthClient.getValidAccessToken())?.access_token;
|
|
4
|
+
return token;
|
|
5
|
+
}
|
|
6
|
+
export async function isAuthenticated() {
|
|
7
|
+
const isAuthenticatedViaApiKey = hasApiKey();
|
|
8
|
+
if (isAuthenticatedViaApiKey)
|
|
9
|
+
return true;
|
|
10
|
+
const isAuthenticatedViaOAuth = await hasValidAccessToken();
|
|
11
|
+
if (isAuthenticatedViaOAuth)
|
|
12
|
+
return true;
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
function hasApiKey() {
|
|
16
|
+
return process.env.ALPIC_API_KEY !== undefined;
|
|
17
|
+
}
|
|
18
|
+
async function hasValidAccessToken() {
|
|
19
|
+
return (await oAuthClient.getValidAccessToken()) !== null;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/lib/auth/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,MAAM,WAAW,CAAC,mBAAmB,EAAE,CAAC,EAAE,YAAY,CAAC;IAEnG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,wBAAwB,GAAG,SAAS,EAAE,CAAC;IAC7C,IAAI,wBAAwB;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,uBAAuB,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAC5D,IAAI,uBAAuB;QAAE,OAAO,IAAI,CAAC;IAEzC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,mBAAmB;IAChC,OAAO,CAAC,MAAM,WAAW,CAAC,mBAAmB,EAAE,CAAC,KAAK,IAAI,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as openid from "openid-client";
|
|
2
|
+
import { type Credentials } from "../../global-store.js";
|
|
3
|
+
export declare class OAuthClient {
|
|
4
|
+
private config;
|
|
5
|
+
initialize: Promise<void>;
|
|
6
|
+
constructor();
|
|
7
|
+
getValidAccessToken(): Promise<Credentials | null>;
|
|
8
|
+
fetchUserInfo(credentials: Credentials): Promise<openid.UserInfoResponse>;
|
|
9
|
+
refreshAccessToken(credentials: Credentials): Promise<Credentials>;
|
|
10
|
+
prepareOAuthConfig(): Promise<{
|
|
11
|
+
authorizeUrl: URL;
|
|
12
|
+
state: string;
|
|
13
|
+
nonce: string;
|
|
14
|
+
codeVerifier: string;
|
|
15
|
+
}>;
|
|
16
|
+
exchangeAuthorizationCode({ url, codeVerifier, state, nonce, }: {
|
|
17
|
+
url: URL;
|
|
18
|
+
codeVerifier: string;
|
|
19
|
+
state: string;
|
|
20
|
+
nonce: string;
|
|
21
|
+
}): Promise<openid.TokenEndpointResponse & openid.TokenEndpointResponseHelpers>;
|
|
22
|
+
getExpiresAt(expires_in: number): number;
|
|
23
|
+
private loadConfig;
|
|
24
|
+
private fetchOAuthProtectedResourceConfig;
|
|
25
|
+
private getConfig;
|
|
26
|
+
private isAccessTokenExpired;
|
|
27
|
+
}
|
|
28
|
+
export declare const oAuthClient: OAuthClient;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import * as openid from "openid-client";
|
|
2
|
+
import { env } from "../../../env.js";
|
|
3
|
+
import { globalStore } from "../../global-store.js";
|
|
4
|
+
import { LOOPBACK_HOST, LOOPBACK_PORT } from "./constants.js";
|
|
5
|
+
const SCOPES = ["openid", "email", "profile"];
|
|
6
|
+
export class OAuthClient {
|
|
7
|
+
config = null;
|
|
8
|
+
initialize;
|
|
9
|
+
constructor() {
|
|
10
|
+
this.initialize = this.loadConfig();
|
|
11
|
+
}
|
|
12
|
+
async getValidAccessToken() {
|
|
13
|
+
await this.initialize;
|
|
14
|
+
const stored = globalStore.getCredentials();
|
|
15
|
+
if (!stored) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
if (this.isAccessTokenExpired(stored)) {
|
|
19
|
+
try {
|
|
20
|
+
return await this.refreshAccessToken(stored);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return stored;
|
|
27
|
+
}
|
|
28
|
+
async fetchUserInfo(credentials) {
|
|
29
|
+
return openid.fetchUserInfo(await this.getConfig(), credentials.access_token, credentials.sub);
|
|
30
|
+
}
|
|
31
|
+
async refreshAccessToken(credentials) {
|
|
32
|
+
if (!credentials.refresh_token) {
|
|
33
|
+
throw new Error("No refresh token available");
|
|
34
|
+
}
|
|
35
|
+
const response = await openid.refreshTokenGrant(await this.getConfig(), credentials.refresh_token);
|
|
36
|
+
const refreshed = {
|
|
37
|
+
access_token: response.access_token,
|
|
38
|
+
refresh_token: response.refresh_token ?? credentials.refresh_token,
|
|
39
|
+
expires_at: this.getExpiresAt(response.expires_in ?? 0),
|
|
40
|
+
sub: credentials.sub,
|
|
41
|
+
};
|
|
42
|
+
globalStore.saveCredentials(refreshed);
|
|
43
|
+
return refreshed;
|
|
44
|
+
}
|
|
45
|
+
async prepareOAuthConfig() {
|
|
46
|
+
await this.initialize;
|
|
47
|
+
if (!this.config) {
|
|
48
|
+
throw new Error("Config not loaded");
|
|
49
|
+
}
|
|
50
|
+
const codeVerifier = openid.randomPKCECodeVerifier();
|
|
51
|
+
const codeChallenge = await openid.calculatePKCECodeChallenge(codeVerifier);
|
|
52
|
+
const state = openid.randomState();
|
|
53
|
+
const nonce = openid.randomNonce();
|
|
54
|
+
const callbackUrl = new URL(`http://${LOOPBACK_HOST}:${LOOPBACK_PORT}/callback`);
|
|
55
|
+
const authorizeUrl = openid.buildAuthorizationUrl(this.config, {
|
|
56
|
+
redirect_uri: callbackUrl.toString(),
|
|
57
|
+
scope: SCOPES.join(" "),
|
|
58
|
+
code_challenge: codeChallenge,
|
|
59
|
+
code_challenge_method: "S256",
|
|
60
|
+
state,
|
|
61
|
+
nonce,
|
|
62
|
+
});
|
|
63
|
+
return { authorizeUrl, state, nonce, codeVerifier };
|
|
64
|
+
}
|
|
65
|
+
async exchangeAuthorizationCode({ url, codeVerifier, state, nonce, }) {
|
|
66
|
+
return await openid.authorizationCodeGrant(await this.getConfig(), url, {
|
|
67
|
+
pkceCodeVerifier: codeVerifier,
|
|
68
|
+
expectedState: state,
|
|
69
|
+
expectedNonce: nonce,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
getExpiresAt(expires_in) {
|
|
73
|
+
return expires_in !== undefined ? Math.floor(Date.now() / 1000) + expires_in : Date.now() / 1000 + 3600;
|
|
74
|
+
}
|
|
75
|
+
async loadConfig() {
|
|
76
|
+
const protectedResourceConfig = await this.fetchOAuthProtectedResourceConfig();
|
|
77
|
+
const issuer = protectedResourceConfig.authorization_servers[0];
|
|
78
|
+
if (!issuer) {
|
|
79
|
+
throw new Error("No authorization server in OAuth protected resource config");
|
|
80
|
+
}
|
|
81
|
+
const issuerUrl = new URL(issuer);
|
|
82
|
+
try {
|
|
83
|
+
this.config = await openid.discovery(issuerUrl, env.ALPIC_COGNITO_CLIENT_ID);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
throw new Error("Failed to discover OAuth config");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async fetchOAuthProtectedResourceConfig() {
|
|
90
|
+
const baseUrl = env.ALPIC_API_BASE_URL;
|
|
91
|
+
const response = await fetch(`${baseUrl}/.well-known/oauth-protected-resource`);
|
|
92
|
+
if (!response.ok) {
|
|
93
|
+
throw new Error(`Failed to load service config from ${baseUrl} (${response.status} ${response.statusText})`);
|
|
94
|
+
}
|
|
95
|
+
return (await response.json());
|
|
96
|
+
}
|
|
97
|
+
async getConfig() {
|
|
98
|
+
await this.initialize;
|
|
99
|
+
if (!this.config) {
|
|
100
|
+
throw new Error("Config not loaded");
|
|
101
|
+
}
|
|
102
|
+
return this.config;
|
|
103
|
+
}
|
|
104
|
+
isAccessTokenExpired(credentials) {
|
|
105
|
+
const EXPIRATION_WINDOW_IN_SECONDS = 300;
|
|
106
|
+
return Date.now() / 1000 + EXPIRATION_WINDOW_IN_SECONDS >= credentials.expires_at;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export const oAuthClient = new OAuthClient();
|
|
110
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/lib/auth/oauth/client.ts"],"names":[],"mappings":"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"}
|