alpic 0.0.0-dev.ff063bb → 0.0.0-dev.ff13ae5

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 (149) 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-flags.e2e.test.d.ts +1 -0
  5. package/dist/__tests__/deploy-flags.e2e.test.js +111 -0
  6. package/dist/__tests__/deploy-flags.e2e.test.js.map +1 -0
  7. package/dist/__tests__/deploy.e2e.test.d.ts +1 -0
  8. package/dist/__tests__/deploy.e2e.test.js +168 -0
  9. package/dist/__tests__/deploy.e2e.test.js.map +1 -0
  10. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.d.ts +1 -0
  11. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js +250 -0
  12. package/dist/__tests__/environment-variable/environment-variable-add.e2e.test.js.map +1 -0
  13. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.d.ts +1 -0
  14. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js +121 -0
  15. package/dist/__tests__/environment-variable/environment-variable-list.e2e.test.js.map +1 -0
  16. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.d.ts +1 -0
  17. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js +139 -0
  18. package/dist/__tests__/environment-variable/environment-variable-remove.e2e.test.js.map +1 -0
  19. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.d.ts +1 -0
  20. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js +319 -0
  21. package/dist/__tests__/environment-variable/environment-variable-update.e2e.test.js.map +1 -0
  22. package/dist/__tests__/environment-variable/environment-variable-validation.test.d.ts +1 -0
  23. package/dist/__tests__/environment-variable/environment-variable-validation.test.js +20 -0
  24. package/dist/__tests__/environment-variable/environment-variable-validation.test.js.map +1 -0
  25. package/dist/__tests__/fixtures/demo-project/index.d.ts +1 -0
  26. package/dist/__tests__/fixtures/demo-project/index.js +4 -0
  27. package/dist/__tests__/fixtures/demo-project/index.js.map +1 -0
  28. package/dist/__tests__/git-flags.e2e.test.d.ts +1 -0
  29. package/dist/__tests__/git-flags.e2e.test.js +124 -0
  30. package/dist/__tests__/git-flags.e2e.test.js.map +1 -0
  31. package/dist/__tests__/git.e2e.test.d.ts +1 -0
  32. package/dist/__tests__/git.e2e.test.js +221 -0
  33. package/dist/__tests__/git.e2e.test.js.map +1 -0
  34. package/dist/__tests__/mock-server.d.ts +23 -0
  35. package/dist/__tests__/mock-server.js +583 -0
  36. package/dist/__tests__/mock-server.js.map +1 -0
  37. package/dist/__tests__/utils.d.ts +67 -0
  38. package/dist/__tests__/utils.js +255 -0
  39. package/dist/__tests__/utils.js.map +1 -0
  40. package/dist/api.d.ts +3 -9
  41. package/dist/api.js +14 -32
  42. package/dist/api.js.map +1 -1
  43. package/dist/commands/deploy.d.ts +7 -4
  44. package/dist/commands/deploy.js +63 -31
  45. package/dist/commands/deploy.js.map +1 -1
  46. package/dist/commands/environment-variable/add.d.ts +14 -0
  47. package/dist/commands/environment-variable/add.js +46 -0
  48. package/dist/commands/environment-variable/add.js.map +1 -0
  49. package/dist/commands/environment-variable/list.d.ts +9 -0
  50. package/dist/commands/environment-variable/list.js +44 -0
  51. package/dist/commands/environment-variable/list.js.map +1 -0
  52. package/dist/commands/environment-variable/remove.d.ts +11 -0
  53. package/dist/commands/environment-variable/remove.js +32 -0
  54. package/dist/commands/environment-variable/remove.js.map +1 -0
  55. package/dist/commands/environment-variable/update.d.ts +13 -0
  56. package/dist/commands/environment-variable/update.js +40 -0
  57. package/dist/commands/environment-variable/update.js.map +1 -0
  58. package/dist/commands/git/connect.d.ts +10 -0
  59. package/dist/commands/git/connect.js +58 -0
  60. package/dist/commands/git/connect.js.map +1 -0
  61. package/dist/commands/git/disconnect.d.ts +9 -0
  62. package/dist/commands/git/disconnect.js +41 -0
  63. package/dist/commands/git/disconnect.js.map +1 -0
  64. package/dist/commands/git.d.ts +6 -0
  65. package/dist/commands/git.js +17 -0
  66. package/dist/commands/git.js.map +1 -0
  67. package/dist/commands/login.d.ts +6 -0
  68. package/dist/commands/login.js +32 -0
  69. package/dist/commands/login.js.map +1 -0
  70. package/dist/commands/logout.d.ts +6 -0
  71. package/dist/commands/logout.js +20 -0
  72. package/dist/commands/logout.js.map +1 -0
  73. package/dist/commands/telemetry/disable.d.ts +5 -0
  74. package/dist/commands/telemetry/disable.js +14 -0
  75. package/dist/commands/telemetry/disable.js.map +1 -0
  76. package/dist/commands/telemetry/enable.d.ts +5 -0
  77. package/dist/commands/telemetry/enable.js +13 -0
  78. package/dist/commands/telemetry/enable.js.map +1 -0
  79. package/dist/commands/telemetry/status.d.ts +5 -0
  80. package/dist/commands/telemetry/status.js +19 -0
  81. package/dist/commands/telemetry/status.js.map +1 -0
  82. package/dist/commands/whoami.d.ts +6 -0
  83. package/dist/commands/whoami.js +13 -0
  84. package/dist/commands/whoami.js.map +1 -0
  85. package/dist/env.d.ts +4 -0
  86. package/dist/env.js +10 -0
  87. package/dist/env.js.map +1 -0
  88. package/dist/lib/alpic-command.d.ts +6 -0
  89. package/dist/lib/alpic-command.js +27 -0
  90. package/dist/lib/alpic-command.js.map +1 -0
  91. package/dist/lib/archive.d.ts +3 -3
  92. package/dist/lib/archive.js +11 -15
  93. package/dist/lib/archive.js.map +1 -1
  94. package/dist/lib/auth/auth.d.ts +2 -0
  95. package/dist/lib/auth/auth.js +21 -0
  96. package/dist/lib/auth/auth.js.map +1 -0
  97. package/dist/lib/auth/oauth/client.d.ts +28 -0
  98. package/dist/lib/auth/oauth/client.js +110 -0
  99. package/dist/lib/auth/oauth/client.js.map +1 -0
  100. package/dist/lib/auth/oauth/constants.d.ts +2 -0
  101. package/dist/lib/auth/oauth/constants.js +3 -0
  102. package/dist/lib/auth/oauth/constants.js.map +1 -0
  103. package/dist/lib/auth/oauth/server/assets/alpic-mountain.png +0 -0
  104. package/dist/lib/auth/oauth/server/assets/authorize.html +195 -0
  105. package/dist/lib/auth/oauth/server/assets/callback.html +88 -0
  106. package/dist/lib/auth/oauth/server/index.d.ts +8 -0
  107. package/dist/lib/auth/oauth/server/index.js +102 -0
  108. package/dist/lib/auth/oauth/server/index.js.map +1 -0
  109. package/dist/lib/auth/whoami.d.ts +1 -0
  110. package/dist/lib/auth/whoami.js +41 -0
  111. package/dist/lib/auth/whoami.js.map +1 -0
  112. package/dist/lib/base-workflow.d.ts +10 -0
  113. package/dist/lib/base-workflow.js +22 -0
  114. package/dist/lib/base-workflow.js.map +1 -0
  115. package/dist/lib/config.d.ts +2 -2
  116. package/dist/lib/config.js +7 -7
  117. package/dist/lib/config.js.map +1 -1
  118. package/dist/lib/deployment.d.ts +20 -0
  119. package/dist/lib/deployment.js +42 -0
  120. package/dist/lib/deployment.js.map +1 -0
  121. package/dist/lib/environment-variable.d.ts +41 -0
  122. package/dist/lib/environment-variable.js +304 -0
  123. package/dist/lib/environment-variable.js.map +1 -0
  124. package/dist/lib/git.d.ts +22 -0
  125. package/dist/lib/git.js +131 -0
  126. package/dist/lib/git.js.map +1 -0
  127. package/dist/lib/global-store.d.ts +28 -0
  128. package/dist/lib/global-store.js +76 -0
  129. package/dist/lib/global-store.js.map +1 -0
  130. package/dist/lib/project.d.ts +71 -10
  131. package/dist/lib/project.js +274 -124
  132. package/dist/lib/project.js.map +1 -1
  133. package/dist/lib/table.d.ts +8 -0
  134. package/dist/lib/table.js +27 -0
  135. package/dist/lib/table.js.map +1 -0
  136. package/dist/lib/telemetry.d.ts +7 -0
  137. package/dist/lib/telemetry.js +66 -0
  138. package/dist/lib/telemetry.js.map +1 -0
  139. package/dist/lib/utils.d.ts +1 -0
  140. package/dist/lib/utils.js +17 -0
  141. package/dist/lib/utils.js.map +1 -0
  142. package/dist/lib/utils.test.d.ts +1 -0
  143. package/dist/lib/utils.test.js +14 -0
  144. package/dist/lib/utils.test.js.map +1 -0
  145. package/dist/posthog.d.ts +3 -0
  146. package/dist/posthog.js +10 -0
  147. package/dist/posthog.js.map +1 -0
  148. package/dist/types.d.ts +0 -34
  149. package/package.json +35 -11
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/lib/auth/oauth/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function getWhoamiInfoMessage(): Promise<string>;
@@ -0,0 +1,41 @@
1
+ import chalk from "chalk";
2
+ import { api } from "../../api.js";
3
+ import { oAuthClient } from "./oauth/client.js";
4
+ export async function getWhoamiInfoMessage() {
5
+ const info = (await getWhoamiInfoFromApiKey()) ?? (await getWhoamiInfoFromOAuth());
6
+ if (info === null) {
7
+ return "Not logged in. Run `alpic login` or set ALPIC_API_KEY.";
8
+ }
9
+ if (info.method === "api_key") {
10
+ return `Authenticated via API key — Team: ${chalk.green(info.team?.name ?? "unknown")}`;
11
+ }
12
+ return `Authenticated as ${chalk.green(info.name)} (${chalk.cyan(info.email)})`;
13
+ }
14
+ async function getWhoamiInfoFromApiKey() {
15
+ if (process.env.ALPIC_API_KEY === undefined) {
16
+ return null;
17
+ }
18
+ const team = await getApiKeyTeam();
19
+ return {
20
+ method: "api_key",
21
+ team,
22
+ };
23
+ }
24
+ async function getWhoamiInfoFromOAuth() {
25
+ const token = await oAuthClient.getValidAccessToken();
26
+ if (!token)
27
+ return null;
28
+ const userInfo = await oAuthClient.fetchUserInfo(token);
29
+ if (!userInfo)
30
+ return null;
31
+ return {
32
+ method: "oauth",
33
+ email: userInfo.email ?? "unknown",
34
+ name: userInfo.name ?? "unknown",
35
+ };
36
+ }
37
+ async function getApiKeyTeam() {
38
+ const teams = await api.teams.list.v1();
39
+ return teams[0];
40
+ }
41
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/lib/auth/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAahD,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,IAAI,GAAG,CAAC,MAAM,uBAAuB,EAAE,CAAC,IAAI,CAAC,MAAM,sBAAsB,EAAE,CAAC,CAAC;IAEnF,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,wDAAwD,CAAC;IAClE,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,qCAAqC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,SAAS,CAAC,EAAE,CAAC;IAC1F,CAAC;IAED,OAAO,oBAAoB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAClF,CAAC;AAED,KAAK,UAAU,uBAAuB;IACpC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,aAAa,EAAE,CAAC;IACnC,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,IAAI;KACL,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,sBAAsB;IACnC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,mBAAmB,EAAE,CAAC;IACtD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,OAAO;QACL,MAAM,EAAE,OAAO;QACf,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,SAAS;QAClC,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,SAAS;KACjC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IACxC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import * as p from "@clack/prompts";
2
+ export type Flags = {
3
+ "non-interactive"?: boolean;
4
+ };
5
+ export declare abstract class BaseWorkflow<F extends Flags = Flags> {
6
+ readonly flags: F;
7
+ constructor(flags: F);
8
+ protected confirm(options: p.ConfirmOptions, defaultValue?: boolean): Promise<boolean | symbol>;
9
+ protected isNonInteractive(): boolean;
10
+ }
@@ -0,0 +1,22 @@
1
+ import * as p from "@clack/prompts";
2
+ import * as ci from "ci-info";
3
+ export class BaseWorkflow {
4
+ flags;
5
+ constructor(flags) {
6
+ this.flags = flags;
7
+ }
8
+ confirm(options, defaultValue = true) {
9
+ if (this.isNonInteractive()) {
10
+ return Promise.resolve(defaultValue);
11
+ }
12
+ return p.confirm(options);
13
+ }
14
+ isNonInteractive() {
15
+ if (this.flags["non-interactive"])
16
+ return true;
17
+ if (process.env.VITEST)
18
+ return false;
19
+ return ci.isCI ?? false;
20
+ }
21
+ }
22
+ //# sourceMappingURL=base-workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-workflow.js","sourceRoot":"","sources":["../../src/lib/base-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAM9B,MAAM,OAAgB,YAAY;IACJ;IAA5B,YAA4B,KAAQ;QAAR,UAAK,GAAL,KAAK,CAAG;IAAG,CAAC;IAE9B,OAAO,CAAC,OAAyB,EAAE,eAAwB,IAAI;QACvE,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC5B,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAES,gBAAgB;QACxB,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAErC,OAAO,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC;IAC1B,CAAC;CACF"}
@@ -1,11 +1,11 @@
1
1
  import type { ProjectConfig } from "../types.js";
2
2
  export declare const config: {
3
- load: (deployDir: string) => {
3
+ load: () => {
4
4
  projectId: string;
5
5
  teamId: string;
6
6
  projectName: string;
7
7
  environmentId: string | undefined;
8
8
  environmentName: string | undefined;
9
9
  } | null;
10
- save: (config: ProjectConfig, deployDir: string) => void;
10
+ save: (projectConfig: ProjectConfig) => void;
11
11
  };
@@ -1,9 +1,9 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- const getProjectJsonPath = (deployDir) => join(deployDir, ".alpic", "project.json");
3
+ const getProjectJsonPath = () => join(process.cwd(), ".alpic", "project.json");
4
4
  export const config = {
5
- load: (deployDir) => {
6
- const path = getProjectJsonPath(deployDir);
5
+ load: () => {
6
+ const path = getProjectJsonPath();
7
7
  if (!existsSync(path)) {
8
8
  return null;
9
9
  }
@@ -22,10 +22,10 @@ export const config = {
22
22
  environmentName: raw.environmentName,
23
23
  };
24
24
  },
25
- save: (config, deployDir) => {
26
- const path = getProjectJsonPath(deployDir);
27
- mkdirSync(join(deployDir, ".alpic"), { recursive: true });
28
- writeFileSync(path, JSON.stringify(config, null, 2));
25
+ save: (projectConfig) => {
26
+ const path = getProjectJsonPath();
27
+ mkdirSync(join(process.cwd(), ".alpic"), { recursive: true });
28
+ writeFileSync(path, JSON.stringify(projectConfig, null, 2));
29
29
  },
30
30
  };
31
31
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,kBAAkB,GAAG,CAAC,SAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;AAE5F,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,SAAiB,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,GAAmE,CAAC;QACxE,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAG1C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,kCAAmC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,OAAO;YACL,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS;YAC7C,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,eAAe,EAAE,GAAG,CAAC,eAAe;SACrC,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC,MAAqB,EAAE,SAAiB,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC3C,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;AAE/E,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,GAAG,EAAE;QACT,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;QAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,GAAmE,CAAC;QACxE,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAG1C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,kCAAmC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,OAAO;YACL,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS;YAC7C,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,eAAe,EAAE,GAAG,CAAC,eAAe;SACrC,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC,aAA4B,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;QAClC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;CACF,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { RouterOutput } from "@alpic-ai/api";
2
+ export declare function formatElapsed(ms: number): string;
3
+ export declare function deployAndWait({ initial, startedAt, }: {
4
+ initial: RouterOutput["deployments"]["get"]["v1"];
5
+ startedAt: number;
6
+ }): Promise<{
7
+ deployment: {
8
+ id: string;
9
+ status: "ongoing" | "deployed" | "failed" | "canceled";
10
+ sourceRef: string | null;
11
+ sourceCommitId: string | null;
12
+ sourceCommitMessage: string | null;
13
+ authorUsername: string | null;
14
+ authorAvatarUrl: string | null;
15
+ startedAt: Date | null;
16
+ completedAt: Date | null;
17
+ deploymentPageUrl: string | null;
18
+ };
19
+ elapsedMs: number;
20
+ }>;
@@ -0,0 +1,42 @@
1
+ import * as p from "@clack/prompts";
2
+ import chalk from "chalk";
3
+ import { api } from "../api.js";
4
+ export function formatElapsed(ms) {
5
+ const totalSeconds = Math.floor(ms / 1000);
6
+ const minutes = Math.floor(totalSeconds / 60);
7
+ const seconds = totalSeconds % 60;
8
+ return minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;
9
+ }
10
+ export async function deployAndWait({ initial, startedAt, }) {
11
+ const spinner = p.spinner();
12
+ let deployment = initial;
13
+ const deploymentPageUrl = deployment.deploymentPageUrl;
14
+ if (deploymentPageUrl) {
15
+ p.note(`🔗 ${deploymentPageUrl}`, "View deployment details:", { format: (line) => line });
16
+ }
17
+ spinner.start("Deployment in progress");
18
+ const FIFTEEN_MINUTES_IN_MS = 15 * 60 * 1000; // 15 minutes
19
+ const elapsedInterval = setInterval(() => {
20
+ const elapsed = formatElapsed(Date.now() - startedAt);
21
+ spinner.message(`Deployment in progress — ${elapsed}`);
22
+ }, 1000);
23
+ try {
24
+ while (deployment.status === "ongoing") {
25
+ const elapsedMs = Date.now() - startedAt;
26
+ if (elapsedMs >= FIFTEEN_MINUTES_IN_MS) {
27
+ throw new Error(`Deployment aborted after 15 minutes. View status: ${deploymentPageUrl}`);
28
+ }
29
+ deployment = await api.deployments.get.v1({ deploymentId: deployment.id });
30
+ if (deployment.status === "ongoing") {
31
+ await new Promise((resolve) => setTimeout(resolve, 10_000));
32
+ }
33
+ }
34
+ return { deployment, elapsedMs: Date.now() - startedAt };
35
+ }
36
+ finally {
37
+ const message = deployment.status === "deployed" ? chalk.green("Deployment completed") : chalk.red("Deployment failed");
38
+ spinner.stop(message);
39
+ clearInterval(elapsedInterval);
40
+ }
41
+ }
42
+ //# sourceMappingURL=deployment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment.js","sourceRoot":"","sources":["../../src/lib/deployment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAClC,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAClC,OAAO,EACP,SAAS,GAIV;IACC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAE5B,IAAI,UAAU,GAAG,OAAO,CAAC;IACzB,MAAM,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,CAAC;IACvD,IAAI,iBAAiB,EAAE,CAAC;QACtB,CAAC,CAAC,IAAI,CAAC,MAAM,iBAAiB,EAAE,EAAE,0BAA0B,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACxC,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;IAC3D,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;QACtD,OAAO,CAAC,OAAO,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC,EAAE,IAAI,CAAC,CAAC;IACT,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACzC,IAAI,SAAS,IAAI,qBAAqB,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CAAC,qDAAqD,iBAAiB,EAAE,CAAC,CAAC;YAC5F,CAAC;YACD,UAAU,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3E,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACpC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;IAC3D,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,GACX,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAC1G,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,aAAa,CAAC,eAAe,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { BaseWorkflow } from "./base-workflow.js";
2
+ export type EnvironmentVariableFlags = {
3
+ "environment-id"?: string;
4
+ };
5
+ export declare const resolveEnvironmentId: (flags: EnvironmentVariableFlags) => string;
6
+ export type EnvVar = {
7
+ key: string;
8
+ value: string;
9
+ isSecret: boolean;
10
+ };
11
+ export type EnvironmentVariableWorkflowFlags = {
12
+ "non-interactive"?: boolean;
13
+ key?: string;
14
+ value?: string;
15
+ secret?: boolean;
16
+ "env-file"?: string;
17
+ };
18
+ export declare function isValidEnvironmentVariableKey(key: string): boolean;
19
+ export declare function fetchEnvironmentVariables(environmentId: string): Promise<{
20
+ id: string;
21
+ key: string;
22
+ value: string;
23
+ isSecret: boolean;
24
+ createdAt: Date;
25
+ }[]>;
26
+ export declare class EnvironmentVariableWorkflow extends BaseWorkflow<EnvironmentVariableWorkflowFlags> {
27
+ protected isNonInteractive(): boolean;
28
+ add(environmentId: string): Promise<void>;
29
+ update(environmentId: string): Promise<void>;
30
+ remove(environmentId: string): Promise<void>;
31
+ private resolveEnvironmentVariablesForAdd;
32
+ private resolveAddKey;
33
+ private resolveAddValue;
34
+ private resolveAddSecret;
35
+ private resolveUpdateInput;
36
+ private resolveUpdateKey;
37
+ private resolveUpdateValue;
38
+ private resolveUpdateSecret;
39
+ private resolveRemoveKey;
40
+ private promptRemoveKey;
41
+ }
@@ -0,0 +1,304 @@
1
+ import * as p from "@clack/prompts";
2
+ import chalk from "chalk";
3
+ import { parse as parseEnvFile } from "envfile";
4
+ import { readFileSync } from "node:fs";
5
+ import { environmentVariableSchema } from "@alpic-ai/api";
6
+ import { api } from "../api.js";
7
+ import { BaseWorkflow } from "./base-workflow.js";
8
+ import { config } from "./config.js";
9
+ export const resolveEnvironmentId = (flags) => {
10
+ if (flags["environment-id"]) {
11
+ return flags["environment-id"];
12
+ }
13
+ const environmentId = config.load()?.environmentId;
14
+ if (environmentId !== undefined) {
15
+ p.log.info(`Using environment id from .alpic config: ${chalk.bold(environmentId)}`);
16
+ return environmentId;
17
+ }
18
+ throw new Error("No environment specified. Use --environment-id <environmentId> or run from a linked directory.");
19
+ };
20
+ export function isValidEnvironmentVariableKey(key) {
21
+ return environmentVariableSchema.shape.key.safeParse(key).success;
22
+ }
23
+ function pluralizeEnvVars(count) {
24
+ return `environment variable${count === 1 ? "" : "s"}`;
25
+ }
26
+ export async function fetchEnvironmentVariables(environmentId) {
27
+ const spinner = p.spinner();
28
+ spinner.start("Fetching environment variables...");
29
+ const environmentVariables = await api.environmentVariables.list.v1({ environmentId });
30
+ spinner.stop(`Found ${environmentVariables.length} ${pluralizeEnvVars(environmentVariables.length)}`);
31
+ return environmentVariables;
32
+ }
33
+ export class EnvironmentVariableWorkflow extends BaseWorkflow {
34
+ isNonInteractive() {
35
+ return this.flags["non-interactive"] || super.isNonInteractive();
36
+ }
37
+ async add(environmentId) {
38
+ const { "env-file": envFile, key, value } = this.flags;
39
+ if (envFile && (key || value)) {
40
+ throw new Error("--env-file cannot be used together with --key or --value.");
41
+ }
42
+ const environmentVariables = await this.resolveEnvironmentVariablesForAdd();
43
+ const spinner = p.spinner();
44
+ spinner.start(`Adding ${environmentVariables.length} ${pluralizeEnvVars(environmentVariables.length)}...`);
45
+ await api.environmentVariables.create.v1({ environmentId, environmentVariables });
46
+ const count = environmentVariables.length;
47
+ spinner.stop(`Successfully added ${count} ${pluralizeEnvVars(count)}. ✅`);
48
+ }
49
+ async update(environmentId) {
50
+ const environmentVariables = await fetchEnvironmentVariables(environmentId);
51
+ if (environmentVariables.length === 0) {
52
+ throw new Error("No environment variables found in this environment.");
53
+ }
54
+ const updateInput = await this.resolveUpdateInput(environmentVariables);
55
+ const variable = environmentVariables.find((v) => v.key === updateInput.key);
56
+ if (!variable) {
57
+ throw new Error(`Environment variable "${updateInput.key}" not found.`);
58
+ }
59
+ const spinner = p.spinner();
60
+ spinner.start("Updating environment variable...");
61
+ await api.environmentVariables.update.v1({
62
+ environmentVariableId: variable.id,
63
+ key: variable.key,
64
+ value: updateInput.value,
65
+ isSecret: updateInput.isSecret ?? variable.isSecret,
66
+ });
67
+ spinner.stop(`Successfully updated ${chalk.cyan(updateInput.key)}. ✅`);
68
+ }
69
+ async remove(environmentId) {
70
+ const environmentVariables = await fetchEnvironmentVariables(environmentId);
71
+ if (environmentVariables.length === 0) {
72
+ throw new Error("No environment variables found in this environment.");
73
+ }
74
+ const resolvedKey = await this.resolveRemoveKey(environmentVariables);
75
+ const variable = environmentVariables.find((v) => v.key === resolvedKey);
76
+ if (!variable) {
77
+ throw new Error(`Environment variable "${resolvedKey}" not found.`);
78
+ }
79
+ const spinner = p.spinner();
80
+ spinner.start("Removing environment variable...");
81
+ await api.environmentVariables.delete.v1({ environmentVariableId: variable.id });
82
+ spinner.stop(`Successfully removed ${chalk.cyan(resolvedKey)}. ✅`);
83
+ }
84
+ async resolveEnvironmentVariablesForAdd() {
85
+ const { "env-file": envFile, key, value, secret } = this.flags;
86
+ if (envFile) {
87
+ const parsed = parseEnvFile(readFileSync(envFile, "utf8"));
88
+ const environmentVariables = Object.entries(parsed).map(([key, value]) => {
89
+ if (!isValidEnvironmentVariableKey(key)) {
90
+ throw new Error(`Invalid key "${key}" in env file: must start with a letter and contain only letters, numbers, and underscores.`);
91
+ }
92
+ return {
93
+ key,
94
+ value,
95
+ isSecret: secret ?? true,
96
+ };
97
+ });
98
+ if (environmentVariables.length === 0) {
99
+ throw new Error("No valid environment variables found in the provided file.");
100
+ }
101
+ return environmentVariables;
102
+ }
103
+ if (this.isNonInteractive()) {
104
+ if (!key || value === undefined) {
105
+ throw new Error("--key and --value are required in non-interactive mode.");
106
+ }
107
+ if (value.trim() === "") {
108
+ throw new Error("Value cannot be empty.");
109
+ }
110
+ if (!isValidEnvironmentVariableKey(key)) {
111
+ throw new Error(`Invalid key "${key}": must start with a letter and contain only letters, numbers, and underscores.`);
112
+ }
113
+ return [{ key, value, isSecret: secret ?? true }];
114
+ }
115
+ const resolvedKey = await this.resolveAddKey(key);
116
+ const resolvedValue = await this.resolveAddValue(value);
117
+ const isSecret = await this.resolveAddSecret();
118
+ return [{ key: resolvedKey, value: resolvedValue, isSecret }];
119
+ }
120
+ async resolveAddKey(key) {
121
+ const trimmed = key?.trim();
122
+ if (trimmed !== undefined && trimmed !== "") {
123
+ if (!isValidEnvironmentVariableKey(trimmed)) {
124
+ throw new Error(`Invalid key "${trimmed}": must start with a letter and contain only letters, numbers, and underscores.`);
125
+ }
126
+ return trimmed;
127
+ }
128
+ const resolvedKey = await p.text({
129
+ message: "Variable key",
130
+ validate: (v) => {
131
+ const trimmed = v?.trim();
132
+ if (trimmed === undefined || trimmed === "") {
133
+ return "Key is required";
134
+ }
135
+ if (!isValidEnvironmentVariableKey(trimmed)) {
136
+ return "Key must start with a letter and contain only letters, numbers, and underscores";
137
+ }
138
+ return undefined;
139
+ },
140
+ });
141
+ if (p.isCancel(resolvedKey)) {
142
+ throw new Error("Cancelled.");
143
+ }
144
+ return resolvedKey.trim();
145
+ }
146
+ async resolveAddValue(value) {
147
+ const trimmed = value?.trim();
148
+ if (trimmed === "") {
149
+ throw new Error("Value cannot be empty.");
150
+ }
151
+ if (trimmed !== undefined) {
152
+ return trimmed;
153
+ }
154
+ const resolvedValue = await p.password({
155
+ message: "Variable value",
156
+ validate: (v) => (v === undefined || v.trim() === "" ? "Value is required" : undefined),
157
+ });
158
+ if (p.isCancel(resolvedValue)) {
159
+ throw new Error("Cancelled.");
160
+ }
161
+ return resolvedValue.trim();
162
+ }
163
+ async resolveAddSecret() {
164
+ if (this.flags.secret !== undefined) {
165
+ return this.flags.secret;
166
+ }
167
+ const secretAnswer = await p.confirm({
168
+ message: "Mark as secret?",
169
+ initialValue: true,
170
+ });
171
+ if (p.isCancel(secretAnswer)) {
172
+ throw new Error("Cancelled.");
173
+ }
174
+ return secretAnswer;
175
+ }
176
+ async resolveUpdateInput(environmentVariables) {
177
+ const { key, value, secret } = this.flags;
178
+ if (this.isNonInteractive()) {
179
+ if (key === undefined || (value === undefined && secret === undefined)) {
180
+ throw new Error("--key and one of --value or --secret/--no-secret are required in non-interactive mode.");
181
+ }
182
+ if (value !== undefined && value.trim() === "") {
183
+ throw new Error("Value cannot be empty.");
184
+ }
185
+ return { key, value, isSecret: secret };
186
+ }
187
+ const resolvedKey = await this.resolveUpdateKey(environmentVariables);
188
+ const resolvedValue = await this.resolveUpdateValue(resolvedKey);
189
+ const resolvedSecret = await this.resolveUpdateSecret(environmentVariables, resolvedKey);
190
+ return { key: resolvedKey, value: resolvedValue, isSecret: resolvedSecret };
191
+ }
192
+ async resolveUpdateKey(environmentVariables) {
193
+ const { key } = this.flags;
194
+ const trimmed = key?.trim();
195
+ if (trimmed !== undefined && trimmed !== "") {
196
+ return trimmed;
197
+ }
198
+ const selectedKey = await p.select({
199
+ message: "Select a variable to update",
200
+ options: environmentVariables.map((variable) => ({
201
+ value: variable.key,
202
+ label: variable.key,
203
+ hint: variable.isSecret ? "<secret>" : variable.value,
204
+ })),
205
+ });
206
+ if (p.isCancel(selectedKey)) {
207
+ throw new Error("Cancelled.");
208
+ }
209
+ return selectedKey;
210
+ }
211
+ async resolveUpdateValue(resolvedKey) {
212
+ const { value } = this.flags;
213
+ if (this.isNonInteractive()) {
214
+ if (value === undefined) {
215
+ p.log.info("No value provided, keeping the current value.");
216
+ return undefined;
217
+ }
218
+ const trimmed = value.trim();
219
+ if (trimmed === "") {
220
+ throw new Error("Value cannot be empty.");
221
+ }
222
+ return trimmed;
223
+ }
224
+ if (value !== undefined) {
225
+ const trimmed = value.trim();
226
+ if (trimmed === "") {
227
+ throw new Error("Value cannot be empty.");
228
+ }
229
+ return trimmed;
230
+ }
231
+ const resolvedValue = (await p.password({
232
+ message: `New value for ${chalk.cyan(resolvedKey)}`,
233
+ })); // When user doesn't provide a value, the prompt returns undefined.
234
+ if (p.isCancel(resolvedValue)) {
235
+ throw new Error("Cancelled.");
236
+ }
237
+ if (resolvedValue === undefined || resolvedValue.trim() === "") {
238
+ p.log.info("No value provided, keeping the current value.");
239
+ return undefined;
240
+ }
241
+ return resolvedValue.trim();
242
+ }
243
+ async resolveUpdateSecret(environmentVariables, key) {
244
+ const { secret } = this.flags;
245
+ if (this.isNonInteractive()) {
246
+ return secret;
247
+ }
248
+ const variable = environmentVariables.find((item) => item.key === key);
249
+ if (!variable) {
250
+ throw new Error(`Environment variable "${key}" not found.`);
251
+ }
252
+ const secretAnswer = await p.select({
253
+ message: "Mark as secret?",
254
+ initialValue: variable.isSecret,
255
+ options: [
256
+ {
257
+ value: true,
258
+ label: variable.isSecret ? "Yes (current)" : "Yes",
259
+ },
260
+ {
261
+ value: false,
262
+ label: variable.isSecret ? "No" : "No (current)",
263
+ },
264
+ ],
265
+ });
266
+ if (p.isCancel(secretAnswer)) {
267
+ throw new Error("Cancelled.");
268
+ }
269
+ return secretAnswer;
270
+ }
271
+ async resolveRemoveKey(environmentVariables) {
272
+ const { key } = this.flags;
273
+ if (this.isNonInteractive()) {
274
+ if (!key) {
275
+ throw new Error("--key is required in non-interactive mode.");
276
+ }
277
+ return key;
278
+ }
279
+ const selectedKey = key ?? (await this.promptRemoveKey(environmentVariables));
280
+ const confirmed = await p.confirm({
281
+ message: `Remove ${chalk.cyan(selectedKey)}?`,
282
+ initialValue: false,
283
+ });
284
+ if (p.isCancel(confirmed) || !confirmed) {
285
+ throw new Error("Cancelled.");
286
+ }
287
+ return selectedKey;
288
+ }
289
+ async promptRemoveKey(environmentVariables) {
290
+ const selectedKey = await p.select({
291
+ message: "Select a variable to remove",
292
+ options: environmentVariables.map((variable) => ({
293
+ value: variable.key,
294
+ label: variable.key,
295
+ hint: variable.isSecret ? "<secret>" : variable.value,
296
+ })),
297
+ });
298
+ if (p.isCancel(selectedKey)) {
299
+ throw new Error("Cancelled.");
300
+ }
301
+ return selectedKey;
302
+ }
303
+ }
304
+ //# sourceMappingURL=environment-variable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-variable.js","sourceRoot":"","sources":["../../src/lib/environment-variable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { BaseWorkflow } from "./base-workflow.js";
2
+ export type GitRemote = {
3
+ name: string;
4
+ url: string;
5
+ sourceRepository: string;
6
+ };
7
+ export declare function isGitRepository(): boolean;
8
+ export declare function listGithubRemotes(): GitRemote[];
9
+ export type ProjectWithSourceRepository = {
10
+ name: string;
11
+ sourceRepository: string | null;
12
+ };
13
+ export declare function confirmLinkAnotherIfAlreadyConnected(project: ProjectWithSourceRepository): Promise<void>;
14
+ export type GitFlags = {
15
+ "non-interactive"?: boolean;
16
+ remoteName?: string;
17
+ };
18
+ export declare class GitWorkflow extends BaseWorkflow<GitFlags> {
19
+ confirmDisconnect(sourceRepository: string, projectName: string): Promise<boolean>;
20
+ selectRemoteSourceRepository(remotes: GitRemote[]): Promise<string>;
21
+ }
22
+ export declare function showGitSetupInstructions(): void;