alpic 0.0.0-dev.fdd9dcb → 0.0.0-dev.fe594dc

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.
Files changed (117) hide show
  1. package/dist/__tests__/auth.e2e.test.d.ts +1 -0
  2. package/dist/__tests__/auth.e2e.test.js +142 -0
  3. package/dist/__tests__/auth.e2e.test.js.map +1 -0
  4. package/dist/__tests__/deploy.e2e.test.d.ts +1 -0
  5. package/dist/__tests__/deploy.e2e.test.js +217 -0
  6. package/dist/__tests__/deploy.e2e.test.js.map +1 -0
  7. package/dist/__tests__/fixtures/demo-project/index.d.ts +1 -0
  8. package/dist/__tests__/fixtures/demo-project/index.js +4 -0
  9. package/dist/__tests__/fixtures/demo-project/index.js.map +1 -0
  10. package/dist/__tests__/git.e2e.test.d.ts +1 -0
  11. package/dist/__tests__/git.e2e.test.js +218 -0
  12. package/dist/__tests__/git.e2e.test.js.map +1 -0
  13. package/dist/__tests__/mock-server.d.ts +22 -0
  14. package/dist/__tests__/mock-server.js +492 -0
  15. package/dist/__tests__/mock-server.js.map +1 -0
  16. package/dist/__tests__/utils.d.ts +61 -0
  17. package/dist/__tests__/utils.js +197 -0
  18. package/dist/__tests__/utils.js.map +1 -0
  19. package/dist/api.d.ts +3 -0
  20. package/dist/api.js +15 -0
  21. package/dist/api.js.map +1 -0
  22. package/dist/commands/deploy.d.ts +9 -0
  23. package/dist/commands/deploy.js +82 -0
  24. package/dist/commands/deploy.js.map +1 -0
  25. package/dist/commands/git/connect.d.ts +9 -0
  26. package/dist/commands/git/connect.js +59 -0
  27. package/dist/commands/git/connect.js.map +1 -0
  28. package/dist/commands/git/disconnect.d.ts +9 -0
  29. package/dist/commands/git/disconnect.js +51 -0
  30. package/dist/commands/git/disconnect.js.map +1 -0
  31. package/dist/commands/{hello.d.ts → git.d.ts} +1 -1
  32. package/dist/commands/git.js +17 -0
  33. package/dist/commands/git.js.map +1 -0
  34. package/dist/commands/login.d.ts +6 -0
  35. package/dist/commands/login.js +39 -0
  36. package/dist/commands/login.js.map +1 -0
  37. package/dist/commands/logout.d.ts +6 -0
  38. package/dist/commands/logout.js +20 -0
  39. package/dist/commands/logout.js.map +1 -0
  40. package/dist/commands/telemetry/disable.d.ts +5 -0
  41. package/dist/commands/telemetry/disable.js +14 -0
  42. package/dist/commands/telemetry/disable.js.map +1 -0
  43. package/dist/commands/telemetry/enable.d.ts +5 -0
  44. package/dist/commands/telemetry/enable.js +13 -0
  45. package/dist/commands/telemetry/enable.js.map +1 -0
  46. package/dist/commands/telemetry/status.d.ts +5 -0
  47. package/dist/commands/telemetry/status.js +19 -0
  48. package/dist/commands/telemetry/status.js.map +1 -0
  49. package/dist/commands/whoami.d.ts +6 -0
  50. package/dist/commands/whoami.js +25 -0
  51. package/dist/commands/whoami.js.map +1 -0
  52. package/dist/env.d.ts +4 -0
  53. package/dist/env.js +10 -0
  54. package/dist/env.js.map +1 -0
  55. package/dist/lib/alpic-command.d.ts +4 -0
  56. package/dist/lib/alpic-command.js +17 -0
  57. package/dist/lib/alpic-command.js.map +1 -0
  58. package/dist/lib/archive.d.ts +7 -0
  59. package/dist/lib/archive.js +55 -0
  60. package/dist/lib/archive.js.map +1 -0
  61. package/dist/lib/auth/auth.d.ts +2 -0
  62. package/dist/lib/auth/auth.js +21 -0
  63. package/dist/lib/auth/auth.js.map +1 -0
  64. package/dist/lib/auth/oauth/client.d.ts +29 -0
  65. package/dist/lib/auth/oauth/client.js +112 -0
  66. package/dist/lib/auth/oauth/client.js.map +1 -0
  67. package/dist/lib/auth/oauth/constants.d.ts +2 -0
  68. package/dist/lib/auth/oauth/constants.js +3 -0
  69. package/dist/lib/auth/oauth/constants.js.map +1 -0
  70. package/dist/lib/auth/oauth/pages/CallbackPage.d.ts +7 -0
  71. package/dist/lib/auth/oauth/pages/CallbackPage.js +6 -0
  72. package/dist/lib/auth/oauth/pages/CallbackPage.js.map +1 -0
  73. package/dist/lib/auth/oauth/pages/Layout.d.ts +7 -0
  74. package/dist/lib/auth/oauth/pages/Layout.js +6 -0
  75. package/dist/lib/auth/oauth/pages/Layout.js.map +1 -0
  76. package/dist/lib/auth/oauth/pages/PickerPage.d.ts +5 -0
  77. package/dist/lib/auth/oauth/pages/PickerPage.js +9 -0
  78. package/dist/lib/auth/oauth/pages/PickerPage.js.map +1 -0
  79. package/dist/lib/auth/oauth/pages/styles.d.ts +1 -0
  80. package/dist/lib/auth/oauth/pages/styles.js +145 -0
  81. package/dist/lib/auth/oauth/pages/styles.js.map +1 -0
  82. package/dist/lib/auth/oauth/server.d.ts +8 -0
  83. package/dist/lib/auth/oauth/server.js +76 -0
  84. package/dist/lib/auth/oauth/server.js.map +1 -0
  85. package/dist/lib/auth/whoami.d.ts +28 -0
  86. package/dist/lib/auth/whoami.js +35 -0
  87. package/dist/lib/auth/whoami.js.map +1 -0
  88. package/dist/lib/config.d.ts +11 -0
  89. package/dist/lib/config.js +31 -0
  90. package/dist/lib/config.js.map +1 -0
  91. package/dist/lib/deployment.d.ts +20 -0
  92. package/dist/lib/deployment.js +43 -0
  93. package/dist/lib/deployment.js.map +1 -0
  94. package/dist/lib/git.d.ts +14 -0
  95. package/dist/lib/git.js +105 -0
  96. package/dist/lib/git.js.map +1 -0
  97. package/dist/lib/global-store.d.ts +28 -0
  98. package/dist/lib/global-store.js +75 -0
  99. package/dist/lib/global-store.js.map +1 -0
  100. package/dist/lib/project.d.ts +67 -0
  101. package/dist/lib/project.js +285 -0
  102. package/dist/lib/project.js.map +1 -0
  103. package/dist/lib/telemetry.d.ts +7 -0
  104. package/dist/lib/telemetry.js +66 -0
  105. package/dist/lib/telemetry.js.map +1 -0
  106. package/dist/lib/upload.d.ts +1 -0
  107. package/dist/lib/upload.js +14 -0
  108. package/dist/lib/upload.js.map +1 -0
  109. package/dist/posthog.d.ts +3 -0
  110. package/dist/posthog.js +10 -0
  111. package/dist/posthog.js.map +1 -0
  112. package/dist/types.d.ts +7 -0
  113. package/dist/types.js +2 -0
  114. package/dist/types.js.map +1 -0
  115. package/package.json +35 -6
  116. package/dist/commands/hello.js +0 -10
  117. package/dist/commands/hello.js.map +0 -1
@@ -0,0 +1,13 @@
1
+ import { Command } from "@oclif/core";
2
+ import chalk from "chalk";
3
+ import { setEnabled } from "../../lib/telemetry.js";
4
+ export default class TelemetryEnable extends Command {
5
+ static description = "Enable Alpic telemetry on this machine";
6
+ async run() {
7
+ await this.parse(TelemetryEnable);
8
+ setEnabled(true);
9
+ console.log(chalk.green("✓"), "Telemetry has been", chalk.green.bold("enabled"));
10
+ console.log(chalk.gray("Config saved to ~/.alpic/config.json"));
11
+ }
12
+ }
13
+ //# sourceMappingURL=enable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enable.js","sourceRoot":"","sources":["../../../src/commands/telemetry/enable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,OAAO;IAClD,MAAM,CAAU,WAAW,GAAG,wCAAwC,CAAC;IAEvE,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAClC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,oBAAoB,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAClE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class TelemetryStatus extends Command {
3
+ static description: string;
4
+ run(): Promise<void>;
5
+ }
@@ -0,0 +1,19 @@
1
+ import { Command } from "@oclif/core";
2
+ import chalk from "chalk";
3
+ import { getMachineId, isEnabled } from "../../lib/telemetry.js";
4
+ export default class TelemetryStatus extends Command {
5
+ static description = "Show Alpic telemetry settings for this machine";
6
+ async run() {
7
+ await this.parse(TelemetryStatus);
8
+ const enabled = isEnabled();
9
+ console.log(chalk.bold.underline("Alpic Telemetry"));
10
+ console.log();
11
+ console.log("Status:", enabled ? chalk.green.bold("Enabled") : chalk.yellow.bold("Disabled"));
12
+ console.log(chalk.gray("Machine ID:"), getMachineId());
13
+ console.log();
14
+ console.log(chalk.gray("To opt out, run: alpic telemetry disable"));
15
+ console.log(chalk.gray("Or set: ALPIC_TELEMETRY_DISABLED=1"));
16
+ console.log(chalk.gray("Debug mode: ALPIC_TELEMETRY_DEBUG=1"));
17
+ }
18
+ }
19
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/telemetry/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEjE,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,OAAO;IAClD,MAAM,CAAU,WAAW,GAAG,gDAAgD,CAAC;IAE/E,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;IACjE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { AlpicCommand } from "../lib/alpic-command.js";
2
+ export declare class Whoami extends AlpicCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }
@@ -0,0 +1,25 @@
1
+ import * as p from "@clack/prompts";
2
+ import chalk from "chalk";
3
+ import { AlpicCommand } from "../lib/alpic-command.js";
4
+ import { getWhoamiInfo } from "../lib/auth/whoami.js";
5
+ export class Whoami extends AlpicCommand {
6
+ static description = "Show the current Alpic identity (API key or logged-in user)";
7
+ static examples = ["<%= config.bin %> whoami"];
8
+ async run() {
9
+ await this.parse(Whoami);
10
+ p.intro("Reading authentication status…");
11
+ const info = await getWhoamiInfo();
12
+ if (!info) {
13
+ p.cancel("Not logged in. Run `alpic login` or set ALPIC_API_KEY.");
14
+ return;
15
+ }
16
+ if (info.method === "api_key") {
17
+ const msg = `Authenticated via API key — Team: ${chalk.green(info.team?.name ?? "unknown")}`;
18
+ p.outro(msg);
19
+ return;
20
+ }
21
+ const msg = `Authenticated as ${chalk.green(info.name)} (${chalk.cyan(info.email)})`;
22
+ p.outro(msg);
23
+ }
24
+ }
25
+ //# 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;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,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,MAAM,IAAI,GAAG,MAAM,aAAa,EAAE,CAAC;QAEnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,CAAC,CAAC,MAAM,CAAC,wDAAwD,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,qCAAqC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,SAAS,CAAC,EAAE,CAAC;YAC7F,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACb,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,oBAAoB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QACrF,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACf,CAAC"}
package/dist/env.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export declare const env: Readonly<{
2
+ ALPIC_API_BASE_URL: string;
3
+ ALPIC_COGNITO_CLIENT_ID: string;
4
+ }>;
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("1023dpimab488tfv4sh4bdk2r"),
7
+ },
8
+ runtimeEnv: process.env,
9
+ });
10
+ //# sourceMappingURL=env.js.map
@@ -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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from "@oclif/core";
2
+ export declare abstract class AlpicCommand extends Command {
3
+ catch(error: unknown): Promise<void>;
4
+ }
@@ -0,0 +1,17 @@
1
+ import * as p from "@clack/prompts";
2
+ import { Command } from "@oclif/core";
3
+ import { ORPCError } from "@orpc/client";
4
+ export class AlpicCommand extends Command {
5
+ async catch(error) {
6
+ if (error instanceof ORPCError) {
7
+ p.cancel(`An error occurred while connecting to Alpic: ${error.message}`);
8
+ return;
9
+ }
10
+ if (error instanceof Error) {
11
+ p.cancel(error.message);
12
+ return;
13
+ }
14
+ p.cancel(String(error));
15
+ }
16
+ }
17
+ //# sourceMappingURL=alpic-command.js.map
@@ -0,0 +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,CAAC,CAAC,MAAM,CAAC,gDAAgD,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QACD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ export declare function ensureGitAvailable(): void;
2
+ export declare function getGitFiles(deployDir: string): string[];
3
+ export declare function getFilesToPack(deployDir: string): string[];
4
+ export declare function createTarArchive(files: string[], deployDir: string): Promise<{
5
+ tmpDir: string;
6
+ archivePath: string;
7
+ }>;
@@ -0,0 +1,55 @@
1
+ import { execSync } from "node:child_process";
2
+ import { existsSync, mkdtempSync, rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join, resolve } from "node:path";
5
+ import { create as tarCreate } from "tar";
6
+ const GIT_FILES_MAX_BUFFER = 10 * 1024 * 1024;
7
+ function isGitRepository(dir) {
8
+ return existsSync(join(resolve(dir), ".git"));
9
+ }
10
+ export function ensureGitAvailable() {
11
+ try {
12
+ execSync("git --version", { stdio: "ignore" });
13
+ }
14
+ catch {
15
+ throw new Error("Git is required to deploy. Please install git and ensure it is available in your PATH.");
16
+ }
17
+ }
18
+ export function getGitFiles(deployDir) {
19
+ const dir = resolve(deployDir);
20
+ const output = execSync("git ls-files -z --cached --others --exclude-standard -- .", {
21
+ cwd: dir,
22
+ encoding: "utf8",
23
+ maxBuffer: GIT_FILES_MAX_BUFFER,
24
+ });
25
+ const files = output.split("\0").filter(Boolean);
26
+ if (files.length === 0) {
27
+ throw new Error("No tracked or untracked files found. Ensure you are in a git repository with files to deploy.");
28
+ }
29
+ return files;
30
+ }
31
+ export function getFilesToPack(deployDir) {
32
+ const dir = resolve(deployDir);
33
+ if (isGitRepository(dir)) {
34
+ return getGitFiles(deployDir);
35
+ }
36
+ ensureGitAvailable();
37
+ execSync("git init", { cwd: dir });
38
+ try {
39
+ return getGitFiles(deployDir);
40
+ }
41
+ finally {
42
+ rmSync(join(dir, ".git"), { recursive: true });
43
+ }
44
+ }
45
+ export async function createTarArchive(files, deployDir) {
46
+ const tmpDir = mkdtempSync(join(tmpdir(), "alpic-deploy-"));
47
+ const archivePath = join(tmpDir, "source.tar.gz");
48
+ await tarCreate({
49
+ gzip: true,
50
+ file: archivePath,
51
+ cwd: deployDir,
52
+ }, files);
53
+ return { tmpDir, archivePath };
54
+ }
55
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/lib/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,KAAK,CAAC;AAE1C,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC;QACH,QAAQ,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;IAC5G,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,2DAA2D,EAAE;QACnF,GAAG,EAAE,GAAG;QACR,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,oBAAoB;KAChC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,+FAA+F,CAAC,CAAC;IACnH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IACD,kBAAkB,EAAE,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAe,EAAE,SAAiB;IACvE,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAClD,MAAM,SAAS,CACb;QACE,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,SAAS;KACf,EACD,KAAK,CACN,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function getApiToken(): Promise<string | undefined>;
2
+ export declare function isAuthenticated(): Promise<boolean>;
@@ -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,29 @@
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 getCallbackUrl;
24
+ private loadConfig;
25
+ private fetchOAuthProtectedResourceConfig;
26
+ private getConfig;
27
+ private isAccessTokenExpired;
28
+ }
29
+ export declare const oAuthClient: OAuthClient;
@@ -0,0 +1,112 @@
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 authorizeUrl = openid.buildAuthorizationUrl(this.config, {
55
+ redirect_uri: this.getCallbackUrl().toString(),
56
+ scope: SCOPES.join(" "),
57
+ code_challenge: codeChallenge,
58
+ code_challenge_method: "S256",
59
+ state,
60
+ nonce,
61
+ });
62
+ return { authorizeUrl, state, nonce, codeVerifier };
63
+ }
64
+ async exchangeAuthorizationCode({ url, codeVerifier, state, nonce, }) {
65
+ return await openid.authorizationCodeGrant(await this.getConfig(), url, {
66
+ pkceCodeVerifier: codeVerifier,
67
+ expectedState: state,
68
+ expectedNonce: nonce,
69
+ });
70
+ }
71
+ getExpiresAt(expires_in) {
72
+ return expires_in !== undefined ? Math.floor(Date.now() / 1000) + expires_in : Date.now() / 1000 + 3600;
73
+ }
74
+ getCallbackUrl() {
75
+ return new URL(`http://${LOOPBACK_HOST}:${LOOPBACK_PORT}/callback`);
76
+ }
77
+ async loadConfig() {
78
+ const protectedResourceConfig = await this.fetchOAuthProtectedResourceConfig();
79
+ const issuer = protectedResourceConfig.authorization_servers[0];
80
+ if (!issuer) {
81
+ throw new Error("No authorization server in OAuth protected resource config");
82
+ }
83
+ const issuerUrl = new URL(issuer);
84
+ try {
85
+ this.config = await openid.discovery(issuerUrl, env.ALPIC_COGNITO_CLIENT_ID);
86
+ }
87
+ catch {
88
+ throw new Error("Failed to discover OAuth config");
89
+ }
90
+ }
91
+ async fetchOAuthProtectedResourceConfig() {
92
+ const baseUrl = env.ALPIC_API_BASE_URL;
93
+ const response = await fetch(`${baseUrl}/.well-known/oauth-protected-resource`);
94
+ if (!response.ok) {
95
+ throw new Error(`Failed to load service config from ${baseUrl} (${response.status} ${response.statusText})`);
96
+ }
97
+ return (await response.json());
98
+ }
99
+ async getConfig() {
100
+ await this.initialize;
101
+ if (!this.config) {
102
+ throw new Error("Config not loaded");
103
+ }
104
+ return this.config;
105
+ }
106
+ isAccessTokenExpired(credentials) {
107
+ const EXPIRATION_WINDOW_IN_SECONDS = 300;
108
+ return Date.now() / 1000 + EXPIRATION_WINDOW_IN_SECONDS >= credentials.expires_at;
109
+ }
110
+ }
111
+ export const oAuthClient = new OAuthClient();
112
+ //# 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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"}
@@ -0,0 +1,2 @@
1
+ export declare const LOOPBACK_HOST = "127.0.0.1";
2
+ export declare const LOOPBACK_PORT = 38472;
@@ -0,0 +1,3 @@
1
+ export const LOOPBACK_HOST = "127.0.0.1";
2
+ export const LOOPBACK_PORT = 38472;
3
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/lib/auth/oauth/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;AACzC,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface CallbackPageProps {
2
+ title: string;
3
+ body: string;
4
+ success: boolean;
5
+ }
6
+ export declare function CallbackPage({ title, body, success }: CallbackPageProps): import("preact").JSX.Element;
7
+ export {};
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ import { Layout } from "./Layout.jsx";
3
+ export function CallbackPage({ title, body, success }) {
4
+ return (_jsx(Layout, { pageTitle: title, children: _jsxs("div", { class: success ? "callback callback--success" : "callback callback--error", children: [_jsx("h1", { children: title }), _jsx("p", { class: "subtitle", children: body })] }) }));
5
+ }
6
+ //# sourceMappingURL=CallbackPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CallbackPage.js","sourceRoot":"","sources":["../../../../../src/lib/auth/oauth/pages/CallbackPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAQtC,MAAM,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAqB;IACtE,OAAO,CACL,KAAC,MAAM,IAAC,SAAS,EAAE,KAAK,YACtB,eAAK,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,0BAA0B,aAC7E,uBAAK,KAAK,GAAM,EAChB,YAAG,KAAK,EAAC,UAAU,YAAE,IAAI,GAAK,IAC1B,GACC,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ComponentChildren } from "preact";
2
+ interface LayoutProps {
3
+ pageTitle: string;
4
+ children: ComponentChildren;
5
+ }
6
+ export declare function Layout({ pageTitle, children }: LayoutProps): import("preact").JSX.Element;
7
+ export {};
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ import { STYLES } from "./styles.js";
3
+ export function Layout({ pageTitle, children }) {
4
+ return (_jsxs("html", { lang: "en", children: [_jsxs("head", { children: [_jsx("meta", { charset: "UTF-8" }), _jsx("meta", { name: "viewport", content: "width=device-width, initial-scale=1.0" }), _jsx("title", { children: pageTitle }), _jsx("link", { href: "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Mozilla+Text:wght@200..700&display=swap", rel: "stylesheet" }), _jsx("style", { dangerouslySetInnerHTML: { __html: STYLES } })] }), _jsx("body", { children: _jsx("div", { class: "card", children: children }) })] }));
5
+ }
6
+ //# sourceMappingURL=Layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../../../../src/lib/auth/oauth/pages/Layout.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC,MAAM,UAAU,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAe;IACzD,OAAO,CACL,gBAAM,IAAI,EAAC,IAAI,aACb,2BACE,eAAM,OAAO,EAAC,OAAO,GAAG,EACxB,eAAM,IAAI,EAAC,UAAU,EAAC,OAAO,EAAC,uCAAuC,GAAG,EACxE,0BAAQ,SAAS,GAAS,EAC1B,eACE,IAAI,EAAC,gHAAgH,EACrH,GAAG,EAAC,YAAY,GAChB,EACF,gBAAO,uBAAuB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAI,IACjD,EACP,yBACE,cAAK,KAAK,EAAC,MAAM,YAAE,QAAQ,GAAO,GAC7B,IACF,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ interface PickerPageProps {
2
+ authorizeUrlEscaped: string;
3
+ }
4
+ export declare function PickerPage({ authorizeUrlEscaped }: PickerPageProps): import("preact").JSX.Element;
5
+ export {};
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ import { Layout } from "./Layout.jsx";
3
+ function providerHref(authorizeUrlEscaped, provider) {
4
+ return `${authorizeUrlEscaped}&identity_provider=${encodeURIComponent(provider)}`;
5
+ }
6
+ export function PickerPage({ authorizeUrlEscaped }) {
7
+ return (_jsxs(Layout, { pageTitle: "Sign in to Alpic", children: [_jsx("h1", { children: "Welcome to Alpic" }), _jsx("p", { class: "subtitle", children: "Sign in to manage your MCP Servers" }), _jsxs("div", { class: "buttons", children: [_jsxs("a", { href: providerHref(authorizeUrlEscaped, "Github"), class: "btn btn-github", children: [_jsxs("svg", { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: [_jsx("title", { children: "GitHub" }), _jsx("path", { d: "M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" })] }), "Sign in with GitHub"] }), _jsxs("a", { href: providerHref(authorizeUrlEscaped, "Google"), class: "btn btn-google", children: [_jsxs("svg", { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: [_jsx("title", { children: "Google" }), _jsx("path", { d: "M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.8 4.133-1.147 1.147-2.933 2.4-6.04 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z" })] }), "Sign in with Google"] })] })] }));
8
+ }
9
+ //# sourceMappingURL=PickerPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PickerPage.js","sourceRoot":"","sources":["../../../../../src/lib/auth/oauth/pages/PickerPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAMtC,SAAS,YAAY,CAAC,mBAA2B,EAAE,QAAgB;IACjE,OAAO,GAAG,mBAAmB,sBAAsB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,mBAAmB,EAAmB;IACjE,OAAO,CACL,MAAC,MAAM,IAAC,SAAS,EAAC,kBAAkB,aAClC,4CAAyB,EACzB,YAAG,KAAK,EAAC,UAAU,mDAAuC,EAC1D,eAAK,KAAK,EAAC,SAAS,aAClB,aAAG,IAAI,EAAE,YAAY,CAAC,mBAAmB,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAC,gBAAgB,aAC1E,eAAK,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,4BAA4B,aACzD,qCAAqB,EACrB,eAAM,CAAC,EAAC,0sBAA0sB,GAAG,IACjtB,2BAEJ,EACJ,aAAG,IAAI,EAAE,YAAY,CAAC,mBAAmB,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAC,gBAAgB,aAC1E,eAAK,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,4BAA4B,aACzD,qCAAqB,EACrB,eAAM,CAAC,EAAC,0VAA0V,GAAG,IACjW,2BAEJ,IACA,IACC,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const STYLES = "\n *,\n *::before,\n *::after {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n a {\n color: inherit;\n text-decoration: none;\n }\n\n :root {\n --midnight: #051413;\n }\n\n body {\n font-family: \"Inter\", system-ui, sans-serif;\n background-color: var(--midnight);\n min-height: 100vh;\n display: flex;\n padding: 64px;\n }\n\n .card {\n background: #fff;\n border-radius: 2px;\n padding: 48px;\n width: 50%;\n min-height: calc(100vh - 128px);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n }\n\n h1 {\n font-family: \"Mozilla Text\", system-ui, sans-serif;\n font-weight: 400;\n font-size: 48px;\n color: var(--midnight);\n margin-bottom: 8px;\n }\n\n .subtitle {\n font-size: 20px;\n color: var(--midnight);\n margin-bottom: 32px;\n }\n\n .buttons {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n height: 48px;\n width: 256px;\n padding: 0 16px;\n border-radius: 2px;\n border: 1px solid var(--midnight);\n font-family: \"Inter\", system-ui, sans-serif;\n font-size: 16px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .btn:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px var(--midnight);\n }\n\n .btn svg {\n width: 20px;\n height: 20px;\n flex-shrink: 0;\n }\n\n .btn-github {\n background: var(--midnight);\n color: #fff;\n }\n .btn-github svg {\n fill: #fff;\n }\n .btn-github:hover {\n background: rgba(5, 20, 19, 0.9);\n }\n\n .btn-google {\n background: #fff;\n color: var(--midnight);\n }\n .btn-google svg {\n fill: var(--midnight);\n }\n .btn-google:hover {\n background: rgba(5, 20, 19, 0.1);\n }\n\n .callback {\n padding-left: 24px;\n border-left: 4px solid var(--midnight);\n border-radius: 2px;\n }\n .callback--success {\n border-left-color: #10b981;\n }\n .callback--error {\n border-left-color: #ef4444;\n }\n .callback h1 {\n font-size: 36px;\n margin-bottom: 8px;\n }\n .callback .subtitle {\n margin-bottom: 0;\n }\n\n @media (max-width: 768px) {\n body {\n padding: 16px;\n }\n .card {\n width: 100%;\n height: auto;\n padding: 24px;\n }\n h1 {\n font-size: 36px;\n }\n .subtitle {\n font-size: 18px;\n }\n }\n";
@@ -0,0 +1,145 @@
1
+ export const STYLES = `
2
+ *,
3
+ *::before,
4
+ *::after {
5
+ margin: 0;
6
+ padding: 0;
7
+ box-sizing: border-box;
8
+ }
9
+
10
+ a {
11
+ color: inherit;
12
+ text-decoration: none;
13
+ }
14
+
15
+ :root {
16
+ --midnight: #051413;
17
+ }
18
+
19
+ body {
20
+ font-family: "Inter", system-ui, sans-serif;
21
+ background-color: var(--midnight);
22
+ min-height: 100vh;
23
+ display: flex;
24
+ padding: 64px;
25
+ }
26
+
27
+ .card {
28
+ background: #fff;
29
+ border-radius: 2px;
30
+ padding: 48px;
31
+ width: 50%;
32
+ min-height: calc(100vh - 128px);
33
+ display: flex;
34
+ flex-direction: column;
35
+ align-items: center;
36
+ justify-content: center;
37
+ }
38
+
39
+ h1 {
40
+ font-family: "Mozilla Text", system-ui, sans-serif;
41
+ font-weight: 400;
42
+ font-size: 48px;
43
+ color: var(--midnight);
44
+ margin-bottom: 8px;
45
+ }
46
+
47
+ .subtitle {
48
+ font-size: 20px;
49
+ color: var(--midnight);
50
+ margin-bottom: 32px;
51
+ }
52
+
53
+ .buttons {
54
+ display: flex;
55
+ flex-direction: column;
56
+ gap: 12px;
57
+ }
58
+
59
+ .btn {
60
+ display: flex;
61
+ align-items: center;
62
+ justify-content: center;
63
+ gap: 8px;
64
+ height: 48px;
65
+ width: 256px;
66
+ padding: 0 16px;
67
+ border-radius: 2px;
68
+ border: 1px solid var(--midnight);
69
+ font-family: "Inter", system-ui, sans-serif;
70
+ font-size: 16px;
71
+ font-weight: 500;
72
+ cursor: pointer;
73
+ transition: background 0.15s;
74
+ }
75
+
76
+ .btn:focus-visible {
77
+ outline: none;
78
+ box-shadow: 0 0 0 2px var(--midnight);
79
+ }
80
+
81
+ .btn svg {
82
+ width: 20px;
83
+ height: 20px;
84
+ flex-shrink: 0;
85
+ }
86
+
87
+ .btn-github {
88
+ background: var(--midnight);
89
+ color: #fff;
90
+ }
91
+ .btn-github svg {
92
+ fill: #fff;
93
+ }
94
+ .btn-github:hover {
95
+ background: rgba(5, 20, 19, 0.9);
96
+ }
97
+
98
+ .btn-google {
99
+ background: #fff;
100
+ color: var(--midnight);
101
+ }
102
+ .btn-google svg {
103
+ fill: var(--midnight);
104
+ }
105
+ .btn-google:hover {
106
+ background: rgba(5, 20, 19, 0.1);
107
+ }
108
+
109
+ .callback {
110
+ padding-left: 24px;
111
+ border-left: 4px solid var(--midnight);
112
+ border-radius: 2px;
113
+ }
114
+ .callback--success {
115
+ border-left-color: #10b981;
116
+ }
117
+ .callback--error {
118
+ border-left-color: #ef4444;
119
+ }
120
+ .callback h1 {
121
+ font-size: 36px;
122
+ margin-bottom: 8px;
123
+ }
124
+ .callback .subtitle {
125
+ margin-bottom: 0;
126
+ }
127
+
128
+ @media (max-width: 768px) {
129
+ body {
130
+ padding: 16px;
131
+ }
132
+ .card {
133
+ width: 100%;
134
+ height: auto;
135
+ padding: 24px;
136
+ }
137
+ h1 {
138
+ font-size: 36px;
139
+ }
140
+ .subtitle {
141
+ font-size: 18px;
142
+ }
143
+ }
144
+ `;
145
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../src/lib/auth/oauth/pages/styles.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+IrB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Credentials } from "../../global-store.js";
2
+ export declare const getLoginPageUrl: () => string;
3
+ export declare const listenToOAuthCallback: ({ state, nonce, codeVerifier, authorizeUrl, }: {
4
+ state: string;
5
+ nonce: string;
6
+ codeVerifier: string;
7
+ authorizeUrl?: string;
8
+ }) => Promise<Credentials>;