alpic 0.0.0-dev.97d4256 → 0.0.0-dev.97ff947

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 (75) hide show
  1. package/dist/__tests__/deploy.e2e.test.d.ts +1 -0
  2. package/dist/__tests__/deploy.e2e.test.js +250 -0
  3. package/dist/__tests__/deploy.e2e.test.js.map +1 -0
  4. package/dist/__tests__/fixtures/demo-project/index.d.ts +1 -0
  5. package/dist/__tests__/fixtures/demo-project/index.js +4 -0
  6. package/dist/__tests__/fixtures/demo-project/index.js.map +1 -0
  7. package/dist/__tests__/git.e2e.test.d.ts +1 -0
  8. package/dist/__tests__/git.e2e.test.js +250 -0
  9. package/dist/__tests__/git.e2e.test.js.map +1 -0
  10. package/dist/__tests__/mock-server.d.ts +22 -0
  11. package/dist/__tests__/mock-server.js +367 -0
  12. package/dist/__tests__/mock-server.js.map +1 -0
  13. package/dist/__tests__/utils.d.ts +29 -0
  14. package/dist/__tests__/utils.js +89 -0
  15. package/dist/__tests__/utils.js.map +1 -0
  16. package/dist/api.d.ts +4 -0
  17. package/dist/api.js +19 -0
  18. package/dist/api.js.map +1 -0
  19. package/dist/commands/deploy.d.ts +9 -0
  20. package/dist/commands/deploy.js +85 -0
  21. package/dist/commands/deploy.js.map +1 -0
  22. package/dist/commands/git/connect.d.ts +9 -0
  23. package/dist/commands/git/connect.js +104 -0
  24. package/dist/commands/git/connect.js.map +1 -0
  25. package/dist/commands/git/disconnect.d.ts +9 -0
  26. package/dist/commands/git/disconnect.js +65 -0
  27. package/dist/commands/git/disconnect.js.map +1 -0
  28. package/dist/commands/{hello.d.ts → git.d.ts} +1 -1
  29. package/dist/commands/git.js +17 -0
  30. package/dist/commands/git.js.map +1 -0
  31. package/dist/commands/telemetry/disable.d.ts +5 -0
  32. package/dist/commands/telemetry/disable.js +14 -0
  33. package/dist/commands/telemetry/disable.js.map +1 -0
  34. package/dist/commands/telemetry/enable.d.ts +5 -0
  35. package/dist/commands/telemetry/enable.js +13 -0
  36. package/dist/commands/telemetry/enable.js.map +1 -0
  37. package/dist/commands/telemetry/status.d.ts +5 -0
  38. package/dist/commands/telemetry/status.js +19 -0
  39. package/dist/commands/telemetry/status.js.map +1 -0
  40. package/dist/lib/archive.d.ts +7 -0
  41. package/dist/lib/archive.js +55 -0
  42. package/dist/lib/archive.js.map +1 -0
  43. package/dist/lib/auth.d.ts +1 -0
  44. package/dist/lib/auth.js +10 -0
  45. package/dist/lib/auth.js.map +1 -0
  46. package/dist/lib/config.d.ts +11 -0
  47. package/dist/lib/config.js +31 -0
  48. package/dist/lib/config.js.map +1 -0
  49. package/dist/lib/deployment.d.ts +21 -0
  50. package/dist/lib/deployment.js +38 -0
  51. package/dist/lib/deployment.js.map +1 -0
  52. package/dist/lib/git.d.ts +8 -0
  53. package/dist/lib/git.js +69 -0
  54. package/dist/lib/git.js.map +1 -0
  55. package/dist/lib/global-config.d.ts +9 -0
  56. package/dist/lib/global-config.js +48 -0
  57. package/dist/lib/global-config.js.map +1 -0
  58. package/dist/lib/project.d.ts +67 -0
  59. package/dist/lib/project.js +285 -0
  60. package/dist/lib/project.js.map +1 -0
  61. package/dist/lib/telemetry.d.ts +7 -0
  62. package/dist/lib/telemetry.js +66 -0
  63. package/dist/lib/telemetry.js.map +1 -0
  64. package/dist/lib/upload.d.ts +1 -0
  65. package/dist/lib/upload.js +14 -0
  66. package/dist/lib/upload.js.map +1 -0
  67. package/dist/posthog.d.ts +3 -0
  68. package/dist/posthog.js +10 -0
  69. package/dist/posthog.js.map +1 -0
  70. package/dist/types.d.ts +7 -0
  71. package/dist/types.js +2 -0
  72. package/dist/types.js.map +1 -0
  73. package/package.json +25 -5
  74. package/dist/commands/hello.js +0 -10
  75. package/dist/commands/hello.js.map +0 -1
@@ -0,0 +1,104 @@
1
+ import * as p from "@clack/prompts";
2
+ import { Args, Command } from "@oclif/core";
3
+ import chalk from "chalk";
4
+ import { api } from "../../api.js";
5
+ import { ensureApiKey } from "../../lib/auth.js";
6
+ import { config } from "../../lib/config.js";
7
+ import { isGitRepository, listGitRemotes } from "../../lib/git.js";
8
+ import { resolveDeployDir } from "../../lib/project.js";
9
+ export default class GitConnect extends Command {
10
+ static description = "Connect a linked Alpic project to a git remote source";
11
+ static examples = ["<%= config.bin %> git connect", "<%= config.bin %> git connect ./my-app"];
12
+ static args = {
13
+ directory: Args.string({
14
+ description: "Directory to connect (default: current directory)",
15
+ required: false,
16
+ }),
17
+ };
18
+ async run() {
19
+ const { args } = await this.parse(GitConnect);
20
+ p.intro("Connecting git repository to Alpic");
21
+ if (!ensureApiKey()) {
22
+ this.exit(1);
23
+ return;
24
+ }
25
+ const deployDir = resolveDeployDir(args.directory);
26
+ const linkedConfig = config.load(deployDir);
27
+ if (!linkedConfig) {
28
+ p.cancel("This directory is not linked to an Alpic project. Link it first using `alpic deploy`.");
29
+ this.exit(1);
30
+ return;
31
+ }
32
+ const showGitInstructions = () => p.note([
33
+ `Run ${chalk.cyan("git init")} in this directory`,
34
+ `Add a remote: ${chalk.cyan("git remote add origin <your-repo-url>")}`,
35
+ `Then run ${chalk.cyan("alpic git connect")} again`,
36
+ ].join("\n"), "To set up a git repository:", { format: (line) => line });
37
+ if (!isGitRepository(deployDir)) {
38
+ p.log.message("This directory is not a git repository.");
39
+ showGitInstructions();
40
+ this.exit(1);
41
+ return;
42
+ }
43
+ const remotes = listGitRemotes(deployDir);
44
+ if (remotes.length === 0) {
45
+ p.log.message("This git repository has no remotes configured.");
46
+ showGitInstructions();
47
+ this.exit(1);
48
+ return;
49
+ }
50
+ const remoteSources = remotes
51
+ .filter((remote) => remote.sourceRepository)
52
+ .map((remote) => ({
53
+ name: remote.name,
54
+ url: remote.url,
55
+ sourceRepository: remote.sourceRepository,
56
+ }))
57
+ .filter((remote, index, all) => all.findIndex((candidate) => candidate.sourceRepository === remote.sourceRepository) === index);
58
+ if (remoteSources.length === 0) {
59
+ p.cancel("No GitHub remote source found. Only GitHub remotes can be connected to Alpic.");
60
+ this.exit(1);
61
+ return;
62
+ }
63
+ const project = await api.projects.get.v1({ projectId: linkedConfig.projectId });
64
+ if (project.sourceRepository) {
65
+ p.log.info(`Project "${project.name}" is already connected to "${project.sourceRepository}".`);
66
+ const confirm = await p.confirm({
67
+ message: chalk.bold("Do you want to link another repository?"),
68
+ initialValue: false,
69
+ });
70
+ if (p.isCancel(confirm) || !confirm) {
71
+ p.cancel("Git connect cancelled");
72
+ this.exit(1);
73
+ return;
74
+ }
75
+ }
76
+ let selectedSourceRepository;
77
+ if (remoteSources.length === 1) {
78
+ selectedSourceRepository = remoteSources[0].sourceRepository;
79
+ }
80
+ else {
81
+ const selected = await p.select({
82
+ message: chalk.bold("Choose the remote source to connect"),
83
+ options: remoteSources.map((remote) => ({
84
+ value: remote.sourceRepository,
85
+ label: `${remote.sourceRepository} (${remote.name})`,
86
+ hint: remote.url,
87
+ })),
88
+ });
89
+ if (p.isCancel(selected)) {
90
+ p.cancel("Git connect cancelled");
91
+ this.exit(1);
92
+ return;
93
+ }
94
+ selectedSourceRepository = selected;
95
+ }
96
+ await api.projects.update.v1({
97
+ projectId: linkedConfig.projectId,
98
+ sourceRepository: selectedSourceRepository,
99
+ });
100
+ p.log.info("To automatically trigger deployments on every push,\nmake sure to install the Alpic GitHub App on this repository.");
101
+ p.outro(`✅ Connected ${chalk.bold(selectedSourceRepository)} to project ${chalk.bold(project.name)}.`);
102
+ }
103
+ }
104
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/commands/git/connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class GitDisconnect extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ directory: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
@@ -0,0 +1,65 @@
1
+ import * as p from "@clack/prompts";
2
+ import { Args, Command } from "@oclif/core";
3
+ import chalk from "chalk";
4
+ import { api } from "../../api.js";
5
+ import { ensureApiKey } from "../../lib/auth.js";
6
+ import { config } from "../../lib/config.js";
7
+ import { isGitRepository, listGitRemotes } from "../../lib/git.js";
8
+ import { resolveDeployDir } from "../../lib/project.js";
9
+ export default class GitDisconnect extends Command {
10
+ static description = "Disconnect a linked Alpic project from its git remote source";
11
+ static examples = ["<%= config.bin %> git disconnect", "<%= config.bin %> git disconnect ./my-app"];
12
+ static args = {
13
+ directory: Args.string({
14
+ description: "Directory to disconnect (default: current directory)",
15
+ required: false,
16
+ }),
17
+ };
18
+ async run() {
19
+ const { args } = await this.parse(GitDisconnect);
20
+ p.intro("Disconnecting git repository from Alpic");
21
+ if (!ensureApiKey()) {
22
+ this.exit(1);
23
+ return;
24
+ }
25
+ const deployDir = resolveDeployDir(args.directory);
26
+ const linkedConfig = config.load(deployDir);
27
+ if (!linkedConfig) {
28
+ p.cancel("This directory is not linked to an Alpic project. Link it first using `alpic deploy`.");
29
+ this.exit(1);
30
+ return;
31
+ }
32
+ if (!isGitRepository(deployDir)) {
33
+ p.cancel("This directory is not a git repository.");
34
+ this.exit(1);
35
+ return;
36
+ }
37
+ const remotes = listGitRemotes(deployDir);
38
+ if (remotes.length === 0) {
39
+ p.cancel("This git repository has no remotes configured.");
40
+ this.exit(1);
41
+ return;
42
+ }
43
+ const project = await api.projects.get.v1({ projectId: linkedConfig.projectId });
44
+ if (!project.sourceRepository) {
45
+ p.cancel(`Project "${project.name}" is not connected to any repository.`);
46
+ this.exit(1);
47
+ return;
48
+ }
49
+ const confirm = await p.confirm({
50
+ message: chalk.bold(`Are you sure you want to disconnect ${chalk.bold(project.sourceRepository)} from project ${chalk.bold(project.name)}?`),
51
+ initialValue: true,
52
+ });
53
+ if (p.isCancel(confirm) || !confirm) {
54
+ p.cancel("Git disconnect cancelled");
55
+ this.exit(1);
56
+ return;
57
+ }
58
+ await api.projects.update.v1({
59
+ projectId: linkedConfig.projectId,
60
+ sourceRepository: null,
61
+ });
62
+ p.outro(`✅ Disconnected ${chalk.bold(project.sourceRepository)} from project ${chalk.bold(project.name)}.`);
63
+ }
64
+ }
65
+ //# sourceMappingURL=disconnect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disconnect.js","sourceRoot":"","sources":["../../../src/commands/git/disconnect.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Command } from "@oclif/core";
2
- export declare class Hello extends Command {
2
+ export default class Git extends Command {
3
3
  static description: string;
4
4
  static examples: string[];
5
5
  run(): Promise<void>;
@@ -0,0 +1,17 @@
1
+ import { Command } from "@oclif/core";
2
+ import chalk from "chalk";
3
+ export default class Git extends Command {
4
+ static description = "Manage git repository connection for a linked Alpic project";
5
+ static examples = ["<%= config.bin %> git connect", "<%= config.bin %> git disconnect"];
6
+ async run() {
7
+ const { args } = await this.parse(Git);
8
+ this.log(chalk.bold("Usage:"));
9
+ this.log(" alpic git connect [directory]");
10
+ this.log(" alpic git disconnect [directory]");
11
+ this.log("");
12
+ this.log(chalk.bold("Commands:"));
13
+ this.log(" connect Connect the linked Alpic project to a git remote source");
14
+ this.log(" disconnect Disconnect the linked Alpic project from its git remote source");
15
+ }
16
+ }
17
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/commands/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,OAAO;IACtC,MAAM,CAAU,WAAW,GAAG,6DAA6D,CAAC;IAE5F,MAAM,CAAU,QAAQ,GAAG,CAAC,+BAA+B,EAAE,kCAAkC,CAAC,CAAC;IAEjG,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;QAClF,IAAI,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;IAC3F,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class TelemetryDisable extends Command {
3
+ static description: string;
4
+ run(): Promise<void>;
5
+ }
@@ -0,0 +1,14 @@
1
+ import { Command } from "@oclif/core";
2
+ import chalk from "chalk";
3
+ import { setEnabled } from "../../lib/telemetry.js";
4
+ export default class TelemetryDisable extends Command {
5
+ static description = "Disable Alpic telemetry on this machine";
6
+ async run() {
7
+ await this.parse(TelemetryDisable);
8
+ setEnabled(false);
9
+ console.log(chalk.yellow("✓"), "Telemetry has been", chalk.yellow.bold("disabled"));
10
+ console.log(chalk.gray("Config saved to ~/.alpic/config.json"));
11
+ console.log(chalk.gray("Alpic never collects Personally Identifiable Information (PII). If you'd like to help us improve Alpic by allowing anonymous CLI usage data, please re-enable telemetry with: alpic telemetry enable"));
12
+ }
13
+ }
14
+ //# sourceMappingURL=disable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disable.js","sourceRoot":"","sources":["../../../src/commands/telemetry/disable.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,gBAAiB,SAAQ,OAAO;IACnD,MAAM,CAAU,WAAW,GAAG,yCAAyC,CAAC;IAExE,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACnC,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,oBAAoB,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,sMAAsM,CACvM,CACF,CAAC;IACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class TelemetryEnable extends Command {
3
+ static description: string;
4
+ run(): Promise<void>;
5
+ }
@@ -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,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 @@
1
+ export declare function ensureApiKey(): string | null;
@@ -0,0 +1,10 @@
1
+ import * as p from "@clack/prompts";
2
+ export function ensureApiKey() {
3
+ const apiKey = process.env.ALPIC_API_KEY;
4
+ if (!apiKey) {
5
+ p.cancel("ALPIC_API_KEY environment variable is required. Get your API key from Team settings in the Alpic dashboard.");
6
+ return null;
7
+ }
8
+ return apiKey;
9
+ }
10
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAEpC,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,CAAC,CAAC,MAAM,CACN,6GAA6G,CAC9G,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ProjectConfig } from "../types.js";
2
+ export declare const config: {
3
+ load: (deployDir: string) => {
4
+ projectId: string;
5
+ teamId: string;
6
+ projectName: string;
7
+ environmentId: string | undefined;
8
+ environmentName: string | undefined;
9
+ } | null;
10
+ save: (config: ProjectConfig, deployDir: string) => void;
11
+ };
@@ -0,0 +1,31 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ const getProjectJsonPath = (deployDir) => join(deployDir, ".alpic", "project.json");
4
+ export const config = {
5
+ load: (deployDir) => {
6
+ const path = getProjectJsonPath(deployDir);
7
+ if (!existsSync(path)) {
8
+ return null;
9
+ }
10
+ let raw;
11
+ try {
12
+ raw = JSON.parse(readFileSync(path, "utf8"));
13
+ }
14
+ catch (error) {
15
+ throw new Error(`Failed to load project config: ${error.message}`);
16
+ }
17
+ return {
18
+ projectId: raw.projectId,
19
+ teamId: raw.teamId,
20
+ projectName: raw.projectName ?? raw.projectId,
21
+ environmentId: raw.environmentId,
22
+ environmentName: raw.environmentName,
23
+ };
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));
29
+ },
30
+ };
31
+ //# sourceMappingURL=config.js.map
@@ -0,0 +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"}
@@ -0,0 +1,21 @@
1
+ import type { RouterOutput } from "@alpic-ai/api";
2
+ export declare function formatElapsed(ms: number): string;
3
+ export declare function deployAndWait({ initial, startedAt, teamId, projectId, }: {
4
+ initial: RouterOutput["deployments"]["get"]["v1"];
5
+ startedAt: number;
6
+ teamId: string;
7
+ projectId: string;
8
+ }): Promise<{
9
+ deployment: {
10
+ id: string;
11
+ status: "ongoing" | "deployed" | "failed" | "canceled";
12
+ sourceRef: string | null;
13
+ sourceCommitId: string | null;
14
+ sourceCommitMessage: string | null;
15
+ authorUsername: string | null;
16
+ authorAvatarUrl: string | null;
17
+ startedAt: Date | null;
18
+ completedAt: Date | null;
19
+ };
20
+ elapsedMs: number;
21
+ }>;
@@ -0,0 +1,38 @@
1
+ import * as p from "@clack/prompts";
2
+ import chalk from "chalk";
3
+ import { api, getFrontendBaseUrl } 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, teamId, projectId, }) {
11
+ const spinner = p.spinner();
12
+ spinner.start("Deployment in progress");
13
+ const deploymentPageUrl = `${getFrontendBaseUrl()}/team/${teamId}/project/${projectId}/deployments/${initial.id}`;
14
+ p.note(deploymentPageUrl, "View deployment details:", { format: (line) => line });
15
+ const elapsedInterval = setInterval(() => {
16
+ const elapsed = formatElapsed(Date.now() - startedAt);
17
+ spinner.message(`Deployment in progress — ${elapsed}`);
18
+ }, 1000);
19
+ const timeoutMs = 15 * 60 * 1000; // 15 minutes
20
+ let deployment = await api.deployments.get.v1({ deploymentId: initial.id });
21
+ try {
22
+ while (deployment.status === "ongoing") {
23
+ const elapsedMs = Date.now() - startedAt;
24
+ if (elapsedMs >= timeoutMs) {
25
+ throw new Error(`Deployment aborted after 15 minutes. View status: ${deploymentPageUrl}`);
26
+ }
27
+ deployment = await api.deployments.get.v1({ deploymentId: deployment.id });
28
+ await new Promise((resolve) => setTimeout(resolve, 10_000));
29
+ }
30
+ return { deployment, elapsedMs: Date.now() - startedAt };
31
+ }
32
+ finally {
33
+ const message = deployment.status === "deployed" ? chalk.green("Deployment completed") : chalk.red("Deployment failed");
34
+ spinner.stop(message);
35
+ clearInterval(elapsedInterval);
36
+ }
37
+ }
38
+ //# 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,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEpD,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,EACT,MAAM,EACN,SAAS,GAMV;IACC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAE5B,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAExC,MAAM,iBAAiB,GAAG,GAAG,kBAAkB,EAAE,SAAS,MAAM,YAAY,SAAS,gBAAgB,OAAO,CAAC,EAAE,EAAE,CAAC;IAClH,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,0BAA0B,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IAElF,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;IAET,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;IAC/C,IAAI,UAAU,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5E,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,SAAS,EAAE,CAAC;gBAC3B,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,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9D,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,8 @@
1
+ export type GitRemote = {
2
+ name: string;
3
+ url: string;
4
+ sourceRepository: string | null;
5
+ };
6
+ export declare function isGitRepository(cwd: string): boolean;
7
+ export declare function getCurrentBranch(cwd: string): string | null;
8
+ export declare function listGitRemotes(cwd: string): GitRemote[];
@@ -0,0 +1,69 @@
1
+ import { execFileSync } from "node:child_process";
2
+ function runGit(args, cwd) {
3
+ return execFileSync("git", args, {
4
+ cwd,
5
+ encoding: "utf8",
6
+ stdio: ["ignore", "pipe", "pipe"],
7
+ }).trim();
8
+ }
9
+ export function isGitRepository(cwd) {
10
+ try {
11
+ return runGit(["rev-parse", "--is-inside-work-tree"], cwd) === "true";
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ export function getCurrentBranch(cwd) {
18
+ try {
19
+ const branch = runGit(["symbolic-ref", "--short", "HEAD"], cwd);
20
+ return branch || null;
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ export function listGitRemotes(cwd) {
27
+ let output;
28
+ try {
29
+ output = runGit(["remote", "-v"], cwd);
30
+ }
31
+ catch {
32
+ return [];
33
+ }
34
+ const remotes = new Map();
35
+ for (const line of output.split(/\r?\n/)) {
36
+ const match = line.match(/^(\S+)\s+(\S+)\s+\((fetch|push)\)$/);
37
+ if (!match)
38
+ continue;
39
+ const name = match[1];
40
+ const url = match[2];
41
+ const kind = match[3];
42
+ if (!name || !url || !kind)
43
+ continue;
44
+ if (kind !== "fetch")
45
+ continue;
46
+ const key = `${name}:${url}`;
47
+ remotes.set(key, {
48
+ name,
49
+ url,
50
+ sourceRepository: parseGitHubSourceRepository(url),
51
+ });
52
+ }
53
+ return [...remotes.values()];
54
+ }
55
+ function parseGitHubSourceRepository(url) {
56
+ const patterns = [
57
+ /^git@github\.com:([^/\s]+\/[^/\s]+?)(?:\.git)?$/,
58
+ /^https:\/\/github\.com\/([^/\s]+\/[^/\s]+?)(?:\.git)?\/?$/,
59
+ /^ssh:\/\/git@github\.com\/([^/\s]+\/[^/\s]+?)(?:\.git)?\/?$/,
60
+ ];
61
+ for (const pattern of patterns) {
62
+ const match = url.match(pattern);
63
+ if (match) {
64
+ return match[1] ?? null;
65
+ }
66
+ }
67
+ return null;
68
+ }
69
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/lib/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD,SAAS,MAAM,CAAC,IAAc,EAAE,GAAW;IACzC,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;QAC/B,GAAG;QACH,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;KAClC,CAAC,CAAC,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;QAChE,OAAO,MAAM,IAAI,IAAI,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC/D,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI;YAAE,SAAS;QACrC,IAAI,IAAI,KAAK,OAAO;YAAE,SAAS;QAE/B,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;YACf,IAAI;YACJ,GAAG;YACH,gBAAgB,EAAE,2BAA2B,CAAC,GAAG,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,2BAA2B,CAAC,GAAW;IAC9C,MAAM,QAAQ,GAAG;QACf,iDAAiD;QACjD,2DAA2D;QAC3D,6DAA6D;KAC9D,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const GLOBAL_CONFIG_FILE: string;
2
+ export interface GlobalConfig {
3
+ machineId: string;
4
+ telemetry: {
5
+ enabled: boolean;
6
+ };
7
+ }
8
+ export declare function getGlobalConfig(): GlobalConfig;
9
+ export declare function saveGlobalConfig(config: GlobalConfig): void;