@aptos-labs/aptos-cli 1.1.0 → 2.0.0

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 (57) hide show
  1. package/README.md +117 -0
  2. package/dist/aptos.js +31 -0
  3. package/dist/aptos.js.map +1 -0
  4. package/dist/examples/examples.test.js +69 -0
  5. package/dist/examples/examples.test.js.map +1 -0
  6. package/dist/tasks/install.js +93 -0
  7. package/dist/tasks/install.js.map +1 -0
  8. package/dist/tasks/install.test.js +227 -0
  9. package/dist/tasks/install.test.js.map +1 -0
  10. package/dist/tasks/run.js +26 -0
  11. package/dist/tasks/run.js.map +1 -0
  12. package/dist/tasks/run.test.js +92 -0
  13. package/dist/tasks/run.test.js.map +1 -0
  14. package/dist/tasks/update.js +68 -0
  15. package/dist/tasks/update.js.map +1 -0
  16. package/dist/utils/brewOperations.js +34 -0
  17. package/dist/utils/brewOperations.js.map +1 -0
  18. package/dist/utils/brewOperations.test.js +83 -0
  19. package/dist/utils/brewOperations.test.js.map +1 -0
  20. package/dist/utils/consts.js +3 -0
  21. package/dist/utils/consts.js.map +1 -0
  22. package/dist/utils/execSyncShell.js +9 -0
  23. package/dist/utils/execSyncShell.js.map +1 -0
  24. package/dist/utils/executableIsAvailable.js +12 -0
  25. package/dist/utils/executableIsAvailable.js.map +1 -0
  26. package/dist/utils/getLocalBinPath.js +86 -0
  27. package/dist/utils/getLocalBinPath.js.map +1 -0
  28. package/dist/utils/getUserOs.js +101 -0
  29. package/dist/utils/getUserOs.js.map +1 -0
  30. package/dist/utils/getUserOs.test.js +143 -0
  31. package/dist/utils/getUserOs.test.js.map +1 -0
  32. package/dist/utils/ghOperations.js +87 -0
  33. package/dist/utils/ghOperations.js.map +1 -0
  34. package/dist/utils/ghOperations.test.js +217 -0
  35. package/dist/utils/ghOperations.test.js.map +1 -0
  36. package/dist/utils/parseCommandOptions.js +21 -0
  37. package/dist/utils/parseCommandOptions.js.map +1 -0
  38. package/dist/utils/windowsPackageManagers.js +100 -0
  39. package/dist/utils/windowsPackageManagers.js.map +1 -0
  40. package/dist/utils/windowsPackageManagers.test.js +169 -0
  41. package/dist/utils/windowsPackageManagers.test.js.map +1 -0
  42. package/package.json +22 -11
  43. package/bin/.gitkeep +0 -0
  44. package/bin/aptos.ts +0 -42
  45. package/bin/tasks/install.ts +0 -55
  46. package/bin/tasks/run.ts +0 -23
  47. package/bin/tasks/update.ts +0 -41
  48. package/bin/utils/aptosExecutableIsAvailable.ts +0 -14
  49. package/bin/utils/brewOperations.ts +0 -12
  50. package/bin/utils/consts.ts +0 -3
  51. package/bin/utils/execSyncShell.ts +0 -8
  52. package/bin/utils/getLocalBinPath.ts +0 -28
  53. package/bin/utils/getUserOs.ts +0 -18
  54. package/bin/utils/ghOperations.ts +0 -20
  55. package/bin/utils/handleHelpOptions.ts +0 -38
  56. package/bin/utils/parseCommandOptions.ts +0 -28
  57. package/bin/utils/versions.ts +0 -9
@@ -0,0 +1,26 @@
1
+ import { spawn } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { getLocalBinPath } from "../utils/getLocalBinPath.js";
4
+ import { getPlatformInfo } from "../utils/getUserOs.js";
5
+ export const runCLI = async (args = [], binaryPath) => {
6
+ const cliPath = binaryPath || getLocalBinPath();
7
+ if (!existsSync(cliPath)) {
8
+ if (binaryPath) {
9
+ console.error(`Error: Binary not found at specified path: ${binaryPath}`);
10
+ process.exit(1);
11
+ }
12
+ console.log("Aptos CLI not installed, run `npx aptos --install` to install");
13
+ return;
14
+ }
15
+ const { os } = getPlatformInfo();
16
+ const child = spawn(cliPath, args, {
17
+ stdio: "inherit",
18
+ shell: os === "windows",
19
+ });
20
+ child.on("exit", (code) => {
21
+ if (code !== null && code !== 0) {
22
+ process.exit(code);
23
+ }
24
+ });
25
+ };
26
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../bin/tasks/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAOxD,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EACzB,OAAiB,EAAE,EACnB,UAAmB,EACJ,EAAE;IACjB,MAAM,OAAO,GAAG,UAAU,IAAI,eAAe,EAAE,CAAC;IAEhD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8CAA8C,UAAU,EAAE,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CACT,+DAA+D,CAChE,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,EAAE,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;IAGjC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;QACjC,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,EAAE,KAAK,SAAS;KACxB,CAAC,CAAC;IAGH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { getLocalBinPath } from \"../utils/getLocalBinPath.js\";\nimport { getPlatformInfo } from \"../utils/getUserOs.js\";\n\n/**\n * Run the Aptos CLI with the provided arguments.\n * @param args - Arguments to pass to the CLI\n * @param binaryPath - Optional path to a custom binary\n */\nexport const runCLI = async (\n args: string[] = [],\n binaryPath?: string,\n): Promise<void> => {\n const cliPath = binaryPath || getLocalBinPath();\n\n if (!existsSync(cliPath)) {\n if (binaryPath) {\n console.error(`Error: Binary not found at specified path: ${binaryPath}`);\n process.exit(1);\n }\n console.log(\n \"Aptos CLI not installed, run `npx aptos --install` to install\",\n );\n return;\n }\n\n const { os } = getPlatformInfo();\n\n // Spawn a child process to run the real CLI executable with the forwarded arguments\n const child = spawn(cliPath, args, {\n stdio: \"inherit\", // Forward the stdio so output is visible\n shell: os === \"windows\", // Use shell on Windows for proper path handling\n });\n\n // Forward the exit code from the child process to the parent\n child.on(\"exit\", (code) => {\n if (code !== null && code !== 0) {\n process.exit(code);\n }\n });\n};\n"]}
@@ -0,0 +1,92 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
+ const createMockChildProcess = () => {
4
+ const emitter = new EventEmitter();
5
+ return emitter;
6
+ };
7
+ let mockChildProcess;
8
+ vi.mock("child_process", () => ({
9
+ spawn: vi.fn(() => mockChildProcess),
10
+ }));
11
+ vi.mock("fs", () => ({
12
+ existsSync: vi.fn(),
13
+ }));
14
+ vi.mock("../utils/getUserOs.js", () => ({
15
+ getPlatformInfo: vi.fn(() => ({ os: "linux", arch: "x64" })),
16
+ }));
17
+ vi.mock("../utils/getLocalBinPath.js", () => ({
18
+ getLocalBinPath: vi.fn(() => "/home/user/.local/bin/aptos"),
19
+ }));
20
+ import { spawn } from "node:child_process";
21
+ import { existsSync } from "node:fs";
22
+ import { runCLI } from "./run.js";
23
+ describe("run", () => {
24
+ const mockExit = vi.fn();
25
+ beforeEach(() => {
26
+ vi.clearAllMocks();
27
+ mockChildProcess = createMockChildProcess();
28
+ vi.stubGlobal("process", {
29
+ ...process,
30
+ exit: mockExit,
31
+ });
32
+ });
33
+ afterEach(() => {
34
+ vi.unstubAllGlobals();
35
+ });
36
+ describe("runCLI", () => {
37
+ it("should spawn the CLI with provided arguments", async () => {
38
+ vi.mocked(existsSync).mockReturnValue(true);
39
+ await runCLI(["info", "--verbose"]);
40
+ expect(spawn).toHaveBeenCalledWith("/home/user/.local/bin/aptos", ["info", "--verbose"], expect.objectContaining({
41
+ stdio: "inherit",
42
+ }));
43
+ });
44
+ it("should use custom binary path when provided", async () => {
45
+ vi.mocked(existsSync).mockReturnValue(true);
46
+ await runCLI(["info"], "/custom/path/aptos");
47
+ expect(spawn).toHaveBeenCalledWith("/custom/path/aptos", ["info"], expect.any(Object));
48
+ });
49
+ it("should exit with non-zero code when child process exits with non-zero code", async () => {
50
+ vi.mocked(existsSync).mockReturnValue(true);
51
+ await runCLI(["invalid-command"]);
52
+ mockChildProcess.emit("exit", 1);
53
+ expect(mockExit).toHaveBeenCalledWith(1);
54
+ });
55
+ it("should exit with the exact exit code from child process", async () => {
56
+ vi.mocked(existsSync).mockReturnValue(true);
57
+ await runCLI(["some-command"]);
58
+ mockChildProcess.emit("exit", 42);
59
+ expect(mockExit).toHaveBeenCalledWith(42);
60
+ });
61
+ it("should not call process.exit when child process exits with code 0", async () => {
62
+ vi.mocked(existsSync).mockReturnValue(true);
63
+ await runCLI(["info"]);
64
+ mockChildProcess.emit("exit", 0);
65
+ expect(mockExit).not.toHaveBeenCalled();
66
+ });
67
+ it("should not call process.exit when child process exits with null code", async () => {
68
+ vi.mocked(existsSync).mockReturnValue(true);
69
+ await runCLI(["info"]);
70
+ mockChildProcess.emit("exit", null);
71
+ expect(mockExit).not.toHaveBeenCalled();
72
+ });
73
+ it("should print error and exit if custom binary path does not exist", async () => {
74
+ vi.mocked(existsSync).mockReturnValue(false);
75
+ const consoleSpy = vi
76
+ .spyOn(console, "error")
77
+ .mockImplementation(() => { });
78
+ await runCLI(["info"], "/nonexistent/path/aptos");
79
+ expect(consoleSpy).toHaveBeenCalledWith("Error: Binary not found at specified path: /nonexistent/path/aptos");
80
+ expect(mockExit).toHaveBeenCalledWith(1);
81
+ expect(spawn).not.toHaveBeenCalled();
82
+ });
83
+ it("should print install message if default binary does not exist", async () => {
84
+ vi.mocked(existsSync).mockReturnValue(false);
85
+ const consoleSpy = vi.spyOn(console, "log").mockImplementation(() => { });
86
+ await runCLI(["info"]);
87
+ expect(consoleSpy).toHaveBeenCalledWith("Aptos CLI not installed, run `npx aptos --install` to install");
88
+ expect(spawn).not.toHaveBeenCalled();
89
+ });
90
+ });
91
+ });
92
+ //# sourceMappingURL=run.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.test.js","sourceRoot":"","sources":["../../bin/tasks/run.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from \"node:events\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\n\n// Create a mock child process that can emit events\nconst createMockChildProcess = () => {\n const emitter = new EventEmitter();\n return emitter;\n};\n\nlet mockChildProcess: EventEmitter;\n\nvi.mock(\"child_process\", () => ({\n spawn: vi.fn(() => mockChildProcess),\n}));\n\nvi.mock(\"fs\", () => ({\n existsSync: vi.fn(),\n}));\n\nvi.mock(\"../utils/getUserOs.js\", () => ({\n getPlatformInfo: vi.fn(() => ({ os: \"linux\", arch: \"x64\" })),\n}));\n\nvi.mock(\"../utils/getLocalBinPath.js\", () => ({\n getLocalBinPath: vi.fn(() => \"/home/user/.local/bin/aptos\"),\n}));\n\nimport { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { runCLI } from \"./run.js\";\n\ndescribe(\"run\", () => {\n const mockExit = vi.fn<(code?: number) => never>();\n\n beforeEach(() => {\n vi.clearAllMocks();\n mockChildProcess = createMockChildProcess();\n vi.stubGlobal(\"process\", {\n ...process,\n exit: mockExit,\n });\n });\n\n afterEach(() => {\n vi.unstubAllGlobals();\n });\n\n describe(\"runCLI\", () => {\n it(\"should spawn the CLI with provided arguments\", async () => {\n vi.mocked(existsSync).mockReturnValue(true);\n\n await runCLI([\"info\", \"--verbose\"]);\n\n expect(spawn).toHaveBeenCalledWith(\n \"/home/user/.local/bin/aptos\",\n [\"info\", \"--verbose\"],\n expect.objectContaining({\n stdio: \"inherit\",\n }),\n );\n });\n\n it(\"should use custom binary path when provided\", async () => {\n vi.mocked(existsSync).mockReturnValue(true);\n\n await runCLI([\"info\"], \"/custom/path/aptos\");\n\n expect(spawn).toHaveBeenCalledWith(\n \"/custom/path/aptos\",\n [\"info\"],\n expect.any(Object),\n );\n });\n\n it(\"should exit with non-zero code when child process exits with non-zero code\", async () => {\n vi.mocked(existsSync).mockReturnValue(true);\n\n await runCLI([\"invalid-command\"]);\n\n // Simulate child process exiting with code 1\n mockChildProcess.emit(\"exit\", 1);\n\n expect(mockExit).toHaveBeenCalledWith(1);\n });\n\n it(\"should exit with the exact exit code from child process\", async () => {\n vi.mocked(existsSync).mockReturnValue(true);\n\n await runCLI([\"some-command\"]);\n\n // Simulate child process exiting with code 42\n mockChildProcess.emit(\"exit\", 42);\n\n expect(mockExit).toHaveBeenCalledWith(42);\n });\n\n it(\"should not call process.exit when child process exits with code 0\", async () => {\n vi.mocked(existsSync).mockReturnValue(true);\n\n await runCLI([\"info\"]);\n\n // Simulate child process exiting with code 0 (success)\n mockChildProcess.emit(\"exit\", 0);\n\n expect(mockExit).not.toHaveBeenCalled();\n });\n\n it(\"should not call process.exit when child process exits with null code\", async () => {\n vi.mocked(existsSync).mockReturnValue(true);\n\n await runCLI([\"info\"]);\n\n // Simulate child process exiting with null (e.g., killed by signal)\n mockChildProcess.emit(\"exit\", null);\n\n expect(mockExit).not.toHaveBeenCalled();\n });\n\n it(\"should print error and exit if custom binary path does not exist\", async () => {\n vi.mocked(existsSync).mockReturnValue(false);\n const consoleSpy = vi\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n await runCLI([\"info\"], \"/nonexistent/path/aptos\");\n\n expect(consoleSpy).toHaveBeenCalledWith(\n \"Error: Binary not found at specified path: /nonexistent/path/aptos\",\n );\n expect(mockExit).toHaveBeenCalledWith(1);\n expect(spawn).not.toHaveBeenCalled();\n });\n\n it(\"should print install message if default binary does not exist\", async () => {\n vi.mocked(existsSync).mockReturnValue(false);\n const consoleSpy = vi.spyOn(console, \"log\").mockImplementation(() => {});\n\n await runCLI([\"info\"]);\n\n expect(consoleSpy).toHaveBeenCalledWith(\n \"Aptos CLI not installed, run `npx aptos --install` to install\",\n );\n expect(spawn).not.toHaveBeenCalled();\n });\n });\n});\n"]}
@@ -0,0 +1,68 @@
1
+ import { existsSync, unlinkSync } from "node:fs";
2
+ import { isInstalledViaBrew, updateViaBrew } from "../utils/brewOperations.js";
3
+ import { execSyncShell } from "../utils/execSyncShell.js";
4
+ import { getLocalBinPath, invalidateBinPathCache, } from "../utils/getLocalBinPath.js";
5
+ import { getTargetPlatform } from "../utils/getUserOs.js";
6
+ import { getCliVersion, hasUserSpecifiedVersion, } from "../utils/ghOperations.js";
7
+ import { isInstalledViaChoco, isInstalledViaWinget, updateViaChoco, updateViaWinget, } from "../utils/windowsPackageManagers.js";
8
+ import { installCli } from "./install.js";
9
+ export const updateCli = async (directDownload = false) => {
10
+ invalidateBinPathCache();
11
+ const binaryPath = getLocalBinPath();
12
+ if (!existsSync(binaryPath)) {
13
+ console.log("Aptos CLI not installed, run `npx aptos --install` to install");
14
+ return;
15
+ }
16
+ const useDirectDownload = directDownload || hasUserSpecifiedVersion();
17
+ if (useDirectDownload && hasUserSpecifiedVersion()) {
18
+ console.log(`Using specified version from APTOS_CLI_VERSION: ${process.env.APTOS_CLI_VERSION}`);
19
+ }
20
+ if (!useDirectDownload) {
21
+ if (isInstalledViaBrew()) {
22
+ updateViaBrew();
23
+ return;
24
+ }
25
+ if (isInstalledViaWinget()) {
26
+ updateViaWinget();
27
+ return;
28
+ }
29
+ if (isInstalledViaChoco()) {
30
+ updateViaChoco();
31
+ return;
32
+ }
33
+ }
34
+ const targetPlatform = getTargetPlatform();
35
+ const targetVersion = await getCliVersion(targetPlatform);
36
+ let currentVersion;
37
+ try {
38
+ const versionOutput = String(execSyncShell(`"${binaryPath}" --version`, {
39
+ encoding: "utf8",
40
+ })).trim();
41
+ currentVersion = versionOutput.split(" ")[1] || "";
42
+ }
43
+ catch {
44
+ console.error("Warning: Could not determine current CLI version");
45
+ currentVersion = "";
46
+ }
47
+ if (currentVersion === targetVersion) {
48
+ if (hasUserSpecifiedVersion()) {
49
+ console.log(`CLI is already at the specified version (${currentVersion})`);
50
+ }
51
+ else {
52
+ console.log(`CLI is up to date (version ${currentVersion})`);
53
+ }
54
+ return;
55
+ }
56
+ const updateDescription = hasUserSpecifiedVersion()
57
+ ? `Switching CLI from version ${currentVersion || "unknown"} to ${targetVersion}...`
58
+ : `Updating CLI from version ${currentVersion || "unknown"} to ${targetVersion}...`;
59
+ console.log(updateDescription);
60
+ try {
61
+ unlinkSync(binaryPath);
62
+ }
63
+ catch {
64
+ console.error(`Warning: Could not remove old binary at ${binaryPath}`);
65
+ }
66
+ await installCli(useDirectDownload);
67
+ };
68
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../bin/tasks/update.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, unlinkSync } from \"node:fs\";\nimport { isInstalledViaBrew, updateViaBrew } from \"../utils/brewOperations.js\";\nimport { execSyncShell } from \"../utils/execSyncShell.js\";\nimport {\n getLocalBinPath,\n invalidateBinPathCache,\n} from \"../utils/getLocalBinPath.js\";\nimport { getTargetPlatform } from \"../utils/getUserOs.js\";\nimport {\n getCliVersion,\n hasUserSpecifiedVersion,\n} from \"../utils/ghOperations.js\";\nimport {\n isInstalledViaChoco,\n isInstalledViaWinget,\n updateViaChoco,\n updateViaWinget,\n} from \"../utils/windowsPackageManagers.js\";\nimport { installCli } from \"./install.js\";\n\n/**\n * Update the Aptos CLI to the latest version (or a specific version if APTOS_CLI_VERSION is set).\n *\n * Update methods by installation type:\n * - Homebrew: `brew upgrade aptos`\n * - winget: `winget upgrade`\n * - Chocolatey: `choco upgrade`\n * - Direct download: Compare versions and reinstall if newer/different\n *\n * Note: When APTOS_CLI_VERSION is set, package managers are skipped and the\n * specified version is downloaded directly from GitHub releases.\n *\n * @param directDownload - If true, skip package manager updates and force direct download\n */\nexport const updateCli = async (\n directDownload: boolean = false,\n): Promise<void> => {\n invalidateBinPathCache();\n const binaryPath = getLocalBinPath();\n\n if (!existsSync(binaryPath)) {\n console.log(\n \"Aptos CLI not installed, run `npx aptos --install` to install\",\n );\n return;\n }\n\n // If a specific version is requested, force direct download\n const useDirectDownload = directDownload || hasUserSpecifiedVersion();\n\n if (useDirectDownload && hasUserSpecifiedVersion()) {\n console.log(\n `Using specified version from APTOS_CLI_VERSION: ${process.env.APTOS_CLI_VERSION}`,\n );\n }\n\n // Check for package manager installations (unless directDownload is set or specific version requested)\n if (!useDirectDownload) {\n // If installed via Homebrew, use brew upgrade\n if (isInstalledViaBrew()) {\n updateViaBrew();\n return;\n }\n\n // If installed via winget, use winget upgrade\n if (isInstalledViaWinget()) {\n updateViaWinget();\n return;\n }\n\n // If installed via Chocolatey, use choco upgrade\n if (isInstalledViaChoco()) {\n updateViaChoco();\n return;\n }\n }\n\n // Get target platform for version validation\n const targetPlatform = getTargetPlatform();\n\n // Get the target version (user-specified or latest)\n const targetVersion = await getCliVersion(targetPlatform);\n\n // Get the current version of the CLI\n let currentVersion: string;\n try {\n const versionOutput = String(\n execSyncShell(`\"${binaryPath}\" --version`, {\n encoding: \"utf8\",\n }),\n ).trim();\n // Version output format: \"aptos X.Y.Z\"\n currentVersion = versionOutput.split(\" \")[1] || \"\";\n } catch {\n console.error(\"Warning: Could not determine current CLI version\");\n currentVersion = \"\";\n }\n\n // Check if the installed version matches the target version\n if (currentVersion === targetVersion) {\n if (hasUserSpecifiedVersion()) {\n console.log(\n `CLI is already at the specified version (${currentVersion})`,\n );\n } else {\n console.log(`CLI is up to date (version ${currentVersion})`);\n }\n return;\n }\n\n const updateDescription = hasUserSpecifiedVersion()\n ? `Switching CLI from version ${currentVersion || \"unknown\"} to ${targetVersion}...`\n : `Updating CLI from version ${currentVersion || \"unknown\"} to ${targetVersion}...`;\n\n console.log(updateDescription);\n\n // Remove the old binary before installing the new one\n try {\n unlinkSync(binaryPath);\n } catch {\n console.error(`Warning: Could not remove old binary at ${binaryPath}`);\n }\n\n await installCli(useDirectDownload);\n};\n"]}
@@ -0,0 +1,34 @@
1
+ import { execSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { executableIsAvailable } from "./executableIsAvailable.js";
4
+ export const isBrewAvailable = () => {
5
+ return executableIsAvailable("brew");
6
+ };
7
+ export const isInstalledViaBrew = () => {
8
+ if (!isBrewAvailable()) {
9
+ return false;
10
+ }
11
+ try {
12
+ const path = getCliPathBrew();
13
+ return existsSync(path);
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ };
19
+ export const getCliPathBrew = () => {
20
+ const directory = execSync("brew --prefix aptos", {
21
+ encoding: "utf8",
22
+ stdio: ["pipe", "pipe", "pipe"],
23
+ }).trim();
24
+ return `${directory}/bin/aptos`;
25
+ };
26
+ export const installViaBrew = () => {
27
+ console.log("Installing Aptos CLI via Homebrew...");
28
+ execSync("brew install aptos", { stdio: "inherit" });
29
+ };
30
+ export const updateViaBrew = () => {
31
+ console.log("Updating Aptos CLI via Homebrew...");
32
+ execSync("brew upgrade aptos", { stdio: "inherit" });
33
+ };
34
+ //# sourceMappingURL=brewOperations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brewOperations.js","sourceRoot":"","sources":["../../bin/utils/brewOperations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAKnE,MAAM,CAAC,MAAM,eAAe,GAAG,GAAY,EAAE;IAC3C,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAY,EAAE;IAC9C,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAW,EAAE;IACzC,MAAM,SAAS,GAAG,QAAQ,CAAC,qBAAqB,EAAE;QAChD,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;KAChC,CAAC,CAAC,IAAI,EAAE,CAAC;IACV,OAAO,GAAG,SAAS,YAAY,CAAC;AAClC,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAS,EAAE;IACvC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,QAAQ,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACvD,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,aAAa,GAAG,GAAS,EAAE;IACtC,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,QAAQ,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACvD,CAAC,CAAC","sourcesContent":["import { execSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { executableIsAvailable } from \"./executableIsAvailable.js\";\n\n/**\n * Check if Homebrew is available on the system.\n */\nexport const isBrewAvailable = (): boolean => {\n return executableIsAvailable(\"brew\");\n};\n\n/**\n * Check if the Aptos CLI was installed via Homebrew.\n */\nexport const isInstalledViaBrew = (): boolean => {\n if (!isBrewAvailable()) {\n return false;\n }\n try {\n const path = getCliPathBrew();\n return existsSync(path);\n } catch {\n return false;\n }\n};\n\n/**\n * Get the path to the Aptos CLI binary installed via Homebrew.\n * Based on the installation path of the aptos formula.\n */\nexport const getCliPathBrew = (): string => {\n const directory = execSync(\"brew --prefix aptos\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n return `${directory}/bin/aptos`;\n};\n\n/**\n * Install the Aptos CLI via Homebrew.\n */\nexport const installViaBrew = (): void => {\n console.log(\"Installing Aptos CLI via Homebrew...\");\n execSync(\"brew install aptos\", { stdio: \"inherit\" });\n};\n\n/**\n * Update the Aptos CLI via Homebrew.\n */\nexport const updateViaBrew = (): void => {\n console.log(\"Updating Aptos CLI via Homebrew...\");\n execSync(\"brew upgrade aptos\", { stdio: \"inherit\" });\n};\n"]}
@@ -0,0 +1,83 @@
1
+ import { execSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
+ vi.mock("child_process", () => ({
5
+ execSync: vi.fn(),
6
+ }));
7
+ vi.mock("fs", () => ({
8
+ existsSync: vi.fn(),
9
+ }));
10
+ vi.mock("./executableIsAvailable.js", () => ({
11
+ executableIsAvailable: vi.fn(),
12
+ }));
13
+ import { getCliPathBrew, installViaBrew, isBrewAvailable, isInstalledViaBrew, updateViaBrew, } from "./brewOperations.js";
14
+ import { executableIsAvailable } from "./executableIsAvailable.js";
15
+ describe("brewOperations", () => {
16
+ beforeEach(() => {
17
+ vi.clearAllMocks();
18
+ });
19
+ afterEach(() => {
20
+ vi.restoreAllMocks();
21
+ });
22
+ describe("isBrewAvailable", () => {
23
+ it("should return true when brew is available", () => {
24
+ vi.mocked(executableIsAvailable).mockReturnValue(true);
25
+ expect(isBrewAvailable()).toBe(true);
26
+ expect(executableIsAvailable).toHaveBeenCalledWith("brew");
27
+ });
28
+ it("should return false when brew is not available", () => {
29
+ vi.mocked(executableIsAvailable).mockReturnValue(false);
30
+ expect(isBrewAvailable()).toBe(false);
31
+ });
32
+ });
33
+ describe("isInstalledViaBrew", () => {
34
+ it("should return true when aptos is installed via brew", () => {
35
+ vi.mocked(executableIsAvailable).mockReturnValue(true);
36
+ vi.mocked(execSync).mockReturnValue("/opt/homebrew/Cellar/aptos");
37
+ vi.mocked(existsSync).mockReturnValue(true);
38
+ expect(isInstalledViaBrew()).toBe(true);
39
+ });
40
+ it("should return false when brew is not available", () => {
41
+ vi.mocked(executableIsAvailable).mockReturnValue(false);
42
+ expect(isInstalledViaBrew()).toBe(false);
43
+ });
44
+ it("should return false when aptos path doesn't exist", () => {
45
+ vi.mocked(executableIsAvailable).mockReturnValue(true);
46
+ vi.mocked(execSync).mockReturnValue("/opt/homebrew/Cellar/aptos");
47
+ vi.mocked(existsSync).mockReturnValue(false);
48
+ expect(isInstalledViaBrew()).toBe(false);
49
+ });
50
+ it("should return false when brew --prefix throws", () => {
51
+ vi.mocked(executableIsAvailable).mockReturnValue(true);
52
+ vi.mocked(execSync).mockImplementation(() => {
53
+ throw new Error("aptos not installed");
54
+ });
55
+ expect(isInstalledViaBrew()).toBe(false);
56
+ });
57
+ });
58
+ describe("getCliPathBrew", () => {
59
+ it("should return the correct path", () => {
60
+ vi.mocked(execSync).mockReturnValue("/opt/homebrew/Cellar/aptos\n");
61
+ expect(getCliPathBrew()).toBe("/opt/homebrew/Cellar/aptos/bin/aptos");
62
+ });
63
+ });
64
+ describe("installViaBrew", () => {
65
+ it("should call brew install aptos", () => {
66
+ vi.mocked(execSync).mockReturnValue(Buffer.from(""));
67
+ installViaBrew();
68
+ expect(execSync).toHaveBeenCalledWith("brew install aptos", {
69
+ stdio: "inherit",
70
+ });
71
+ });
72
+ });
73
+ describe("updateViaBrew", () => {
74
+ it("should call brew upgrade aptos", () => {
75
+ vi.mocked(execSync).mockReturnValue(Buffer.from(""));
76
+ updateViaBrew();
77
+ expect(execSync).toHaveBeenCalledWith("brew upgrade aptos", {
78
+ stdio: "inherit",
79
+ });
80
+ });
81
+ });
82
+ });
83
+ //# sourceMappingURL=brewOperations.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brewOperations.test.js","sourceRoot":"","sources":["../../bin/utils/brewOperations.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { execSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\n\nvi.mock(\"child_process\", () => ({\n execSync: vi.fn(),\n}));\n\nvi.mock(\"fs\", () => ({\n existsSync: vi.fn(),\n}));\n\nvi.mock(\"./executableIsAvailable.js\", () => ({\n executableIsAvailable: vi.fn(),\n}));\n\nimport {\n getCliPathBrew,\n installViaBrew,\n isBrewAvailable,\n isInstalledViaBrew,\n updateViaBrew,\n} from \"./brewOperations.js\";\nimport { executableIsAvailable } from \"./executableIsAvailable.js\";\n\ndescribe(\"brewOperations\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n });\n\n describe(\"isBrewAvailable\", () => {\n it(\"should return true when brew is available\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(true);\n\n expect(isBrewAvailable()).toBe(true);\n expect(executableIsAvailable).toHaveBeenCalledWith(\"brew\");\n });\n\n it(\"should return false when brew is not available\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(false);\n\n expect(isBrewAvailable()).toBe(false);\n });\n });\n\n describe(\"isInstalledViaBrew\", () => {\n it(\"should return true when aptos is installed via brew\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(true);\n vi.mocked(execSync).mockReturnValue(\"/opt/homebrew/Cellar/aptos\");\n vi.mocked(existsSync).mockReturnValue(true);\n\n expect(isInstalledViaBrew()).toBe(true);\n });\n\n it(\"should return false when brew is not available\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(false);\n\n expect(isInstalledViaBrew()).toBe(false);\n });\n\n it(\"should return false when aptos path doesn't exist\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(true);\n vi.mocked(execSync).mockReturnValue(\"/opt/homebrew/Cellar/aptos\");\n vi.mocked(existsSync).mockReturnValue(false);\n\n expect(isInstalledViaBrew()).toBe(false);\n });\n\n it(\"should return false when brew --prefix throws\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(true);\n vi.mocked(execSync).mockImplementation(() => {\n throw new Error(\"aptos not installed\");\n });\n\n expect(isInstalledViaBrew()).toBe(false);\n });\n });\n\n describe(\"getCliPathBrew\", () => {\n it(\"should return the correct path\", () => {\n vi.mocked(execSync).mockReturnValue(\"/opt/homebrew/Cellar/aptos\\n\");\n\n expect(getCliPathBrew()).toBe(\"/opt/homebrew/Cellar/aptos/bin/aptos\");\n });\n });\n\n describe(\"installViaBrew\", () => {\n it(\"should call brew install aptos\", () => {\n vi.mocked(execSync).mockReturnValue(Buffer.from(\"\"));\n\n installViaBrew();\n\n expect(execSync).toHaveBeenCalledWith(\"brew install aptos\", {\n stdio: \"inherit\",\n });\n });\n });\n\n describe(\"updateViaBrew\", () => {\n it(\"should call brew upgrade aptos\", () => {\n vi.mocked(execSync).mockReturnValue(Buffer.from(\"\"));\n\n updateViaBrew();\n\n expect(execSync).toHaveBeenCalledWith(\"brew upgrade aptos\", {\n stdio: \"inherit\",\n });\n });\n });\n});\n"]}
@@ -0,0 +1,3 @@
1
+ export const PNAME = "aptos-cli";
2
+ export const GH_CLI_DOWNLOAD_URL = "https://github.com/aptos-labs/aptos-core/releases/download";
3
+ //# sourceMappingURL=consts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.js","sourceRoot":"","sources":["../../bin/utils/consts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAAC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAC9B,4DAA4D,CAAC","sourcesContent":["export const PNAME = \"aptos-cli\";\nexport const GH_CLI_DOWNLOAD_URL =\n \"https://github.com/aptos-labs/aptos-core/releases/download\";\n"]}
@@ -0,0 +1,9 @@
1
+ import { execSync } from "node:child_process";
2
+ export const execSyncShell = (command, options) => {
3
+ const execOptions = {
4
+ ...options,
5
+ shell: true,
6
+ };
7
+ return execSync(command, execOptions);
8
+ };
9
+ //# sourceMappingURL=execSyncShell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execSyncShell.js","sourceRoot":"","sources":["../../bin/utils/execSyncShell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAQpE,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAAe,EACf,OAA8B,EACb,EAAE;IAGnB,MAAM,WAAW,GAAG;QAClB,GAAG,OAAO;QACV,KAAK,EAAE,IAAI;KACkB,CAAC;IAChC,OAAO,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACxC,CAAC,CAAC","sourcesContent":["import { type ExecSyncOptions, execSync } from \"node:child_process\";\n\ntype ExecSyncShellOptions = Omit<ExecSyncOptions, \"shell\">;\n\n/**\n * Wrapper around execSync that uses the shell.\n * This always executes with shell: true for cross-platform compatibility.\n */\nexport const execSyncShell = (\n command: string,\n options?: ExecSyncShellOptions,\n): Buffer | string => {\n // Type assertion needed due to @types/node ExecSyncOptions overload complexity\n // where shell is typed as string | boolean but overloads expect specific types\n const execOptions = {\n ...options,\n shell: true,\n } as unknown as ExecSyncOptions;\n return execSync(command, execOptions);\n};\n"]}
@@ -0,0 +1,12 @@
1
+ import { execSync } from "node:child_process";
2
+ export const executableIsAvailable = (name) => {
3
+ try {
4
+ const command = process.platform === "win32" ? `where ${name}` : `which ${name}`;
5
+ execSync(command, { encoding: "utf8", stdio: "pipe" });
6
+ return true;
7
+ }
8
+ catch {
9
+ return false;
10
+ }
11
+ };
12
+ //# sourceMappingURL=executableIsAvailable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executableIsAvailable.js","sourceRoot":"","sources":["../../bin/utils/executableIsAvailable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAM9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAAW,EAAE;IAC7D,IAAI,CAAC;QACH,MAAM,OAAO,GACX,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;QACnE,QAAQ,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC","sourcesContent":["import { execSync } from \"node:child_process\";\n\n/**\n * Check if an executable is available on the system.\n * Uses `which` on Unix systems (macOS/Linux) and `where` on Windows.\n */\nexport const executableIsAvailable = (name: string): boolean => {\n try {\n const command =\n process.platform === \"win32\" ? `where ${name}` : `which ${name}`;\n execSync(command, { encoding: \"utf8\", stdio: \"pipe\" });\n return true;\n } catch {\n return false;\n }\n};\n"]}
@@ -0,0 +1,86 @@
1
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync, } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ import { getCliPathBrew, isInstalledViaBrew } from "./brewOperations.js";
5
+ import { getOS } from "./getUserOs.js";
6
+ import { getCliPathChoco, getCliPathWinget, isInstalledViaChoco, isInstalledViaWinget, } from "./windowsPackageManagers.js";
7
+ const getCachePath = () => {
8
+ if (getOS() === "Windows") {
9
+ return join(homedir(), ".aptoscli", ".bin-path-cache");
10
+ }
11
+ return join(homedir(), ".local", "share", "aptos-cli", ".bin-path-cache");
12
+ };
13
+ const readCachedBinPath = () => {
14
+ try {
15
+ const cached = readFileSync(getCachePath(), "utf8").trim();
16
+ if (cached && existsSync(cached)) {
17
+ return cached;
18
+ }
19
+ }
20
+ catch {
21
+ }
22
+ return undefined;
23
+ };
24
+ const writeCachedBinPath = (binPath) => {
25
+ try {
26
+ const cachePath = getCachePath();
27
+ mkdirSync(dirname(cachePath), { recursive: true });
28
+ writeFileSync(cachePath, binPath, "utf8");
29
+ }
30
+ catch {
31
+ }
32
+ };
33
+ export const invalidateBinPathCache = () => {
34
+ try {
35
+ unlinkSync(getCachePath());
36
+ }
37
+ catch {
38
+ }
39
+ };
40
+ export const getBinDir = () => {
41
+ const os = getOS();
42
+ if (os === "Windows") {
43
+ return join(homedir(), ".aptoscli", "bin");
44
+ }
45
+ return join(homedir(), ".local", "bin");
46
+ };
47
+ export const getLocalBinPath = () => {
48
+ const cached = readCachedBinPath();
49
+ if (cached) {
50
+ return cached;
51
+ }
52
+ const os = getOS();
53
+ if (os === "MacOS") {
54
+ if (isInstalledViaBrew()) {
55
+ try {
56
+ const brewPath = getCliPathBrew();
57
+ writeCachedBinPath(brewPath);
58
+ return brewPath;
59
+ }
60
+ catch {
61
+ }
62
+ }
63
+ }
64
+ if (os === "Windows") {
65
+ if (isInstalledViaWinget()) {
66
+ const wingetPath = getCliPathWinget();
67
+ if (wingetPath) {
68
+ writeCachedBinPath(wingetPath);
69
+ return wingetPath;
70
+ }
71
+ }
72
+ if (isInstalledViaChoco()) {
73
+ const chocoPath = getCliPathChoco();
74
+ if (chocoPath) {
75
+ writeCachedBinPath(chocoPath);
76
+ return chocoPath;
77
+ }
78
+ }
79
+ }
80
+ const binDir = getBinDir();
81
+ const binaryName = os === "Windows" ? "aptos.exe" : "aptos";
82
+ const defaultPath = join(binDir, binaryName);
83
+ writeCachedBinPath(defaultPath);
84
+ return defaultPath;
85
+ };
86
+ //# sourceMappingURL=getLocalBinPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getLocalBinPath.js","sourceRoot":"","sources":["../../bin/utils/getLocalBinPath.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n existsSync,\n mkdirSync,\n readFileSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { getCliPathBrew, isInstalledViaBrew } from \"./brewOperations.js\";\nimport { getOS } from \"./getUserOs.js\";\nimport {\n getCliPathChoco,\n getCliPathWinget,\n isInstalledViaChoco,\n isInstalledViaWinget,\n} from \"./windowsPackageManagers.js\";\n\n/**\n * Path to the cached binary location file.\n * Avoids expensive shell spawns (brew --prefix, winget list) on every run.\n */\nconst getCachePath = (): string => {\n if (getOS() === \"Windows\") {\n return join(homedir(), \".aptoscli\", \".bin-path-cache\");\n }\n return join(homedir(), \".local\", \"share\", \"aptos-cli\", \".bin-path-cache\");\n};\n\nconst readCachedBinPath = (): string | undefined => {\n try {\n const cached = readFileSync(getCachePath(), \"utf8\").trim();\n if (cached && existsSync(cached)) {\n return cached;\n }\n } catch {\n // No cache or unreadable\n }\n return undefined;\n};\n\nconst writeCachedBinPath = (binPath: string): void => {\n try {\n const cachePath = getCachePath();\n mkdirSync(dirname(cachePath), { recursive: true });\n writeFileSync(cachePath, binPath, \"utf8\");\n } catch {\n // Non-fatal — caching is best-effort\n }\n};\n\n/**\n * Invalidate the cached binary path.\n * Call this when install or update changes the binary location.\n */\nexport const invalidateBinPathCache = (): void => {\n try {\n unlinkSync(getCachePath());\n } catch {\n // No cache to invalidate\n }\n};\n\n/**\n * Get the binary directory path where the CLI should be installed.\n * Matches the official Aptos CLI install scripts:\n * - macOS/Linux: ~/.local/bin\n * - Windows: $USERPROFILE\\.aptoscli\\bin\n */\nexport const getBinDir = (): string => {\n const os = getOS();\n\n if (os === \"Windows\") {\n // Match official Windows script: $env:USERPROFILE\\.aptoscli\\bin\n return join(homedir(), \".aptoscli\", \"bin\");\n }\n\n // Match official Unix script: $HOME/.local/bin\n return join(homedir(), \".local\", \"bin\");\n};\n\n/**\n * Get the full path to the Aptos CLI binary.\n *\n * Uses a file-based cache to avoid expensive shell spawns (brew --prefix,\n * winget list) on every invocation. The cache is invalidated by install\n * and update tasks.\n *\n * Checks for package manager installations first:\n * - macOS: Homebrew\n * - Windows: winget, then Chocolatey\n *\n * Otherwise uses the standard paths:\n * - macOS/Linux: ~/.local/bin/aptos\n * - Windows: $USERPROFILE\\.aptoscli\\bin\\aptos.exe\n */\nexport const getLocalBinPath = (): string => {\n // Fast path: return cached binary location if still valid\n const cached = readCachedBinPath();\n if (cached) {\n return cached;\n }\n\n const os = getOS();\n\n // On macOS, prefer Homebrew installation if it exists\n if (os === \"MacOS\") {\n if (isInstalledViaBrew()) {\n try {\n const brewPath = getCliPathBrew();\n writeCachedBinPath(brewPath);\n return brewPath;\n } catch {\n // Fall through to default path\n }\n }\n }\n\n // On Windows, check for winget or Chocolatey installations\n if (os === \"Windows\") {\n if (isInstalledViaWinget()) {\n const wingetPath = getCliPathWinget();\n if (wingetPath) {\n writeCachedBinPath(wingetPath);\n return wingetPath;\n }\n }\n\n if (isInstalledViaChoco()) {\n const chocoPath = getCliPathChoco();\n if (chocoPath) {\n writeCachedBinPath(chocoPath);\n return chocoPath;\n }\n }\n }\n\n const binDir = getBinDir();\n const binaryName = os === \"Windows\" ? \"aptos.exe\" : \"aptos\";\n const defaultPath = join(binDir, binaryName);\n writeCachedBinPath(defaultPath);\n return defaultPath;\n};\n"]}
@@ -0,0 +1,101 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { arch, platform } from "node:os";
3
+ export const getPlatformInfo = () => {
4
+ const osPlatform = platform();
5
+ const osArch = arch();
6
+ let os;
7
+ switch (osPlatform) {
8
+ case "darwin":
9
+ os = "macos";
10
+ break;
11
+ case "linux":
12
+ os = "linux";
13
+ break;
14
+ case "win32":
15
+ os = "windows";
16
+ break;
17
+ default:
18
+ throw new Error(`Unsupported operating system: ${osPlatform}`);
19
+ }
20
+ let architecture;
21
+ switch (osArch) {
22
+ case "x64":
23
+ case "x86_64":
24
+ architecture = "x86_64";
25
+ break;
26
+ case "arm64":
27
+ case "aarch64":
28
+ architecture = "aarch64";
29
+ break;
30
+ default:
31
+ throw new Error(`Unsupported architecture: ${osArch}`);
32
+ }
33
+ return { os, arch: architecture };
34
+ };
35
+ const getLinuxDistroInfo = () => {
36
+ const osReleasePath = "/etc/os-release";
37
+ if (!existsSync(osReleasePath)) {
38
+ return null;
39
+ }
40
+ try {
41
+ const content = readFileSync(osReleasePath, "utf8");
42
+ const lines = content.split("\n");
43
+ let id = "";
44
+ let versionId = "";
45
+ for (const line of lines) {
46
+ const [key, ...valueParts] = line.split("=");
47
+ const value = valueParts.join("=").replace(/^["']|["']$/g, "");
48
+ if (key === "ID") {
49
+ id = value.toLowerCase();
50
+ }
51
+ else if (key === "VERSION_ID") {
52
+ versionId = value;
53
+ }
54
+ }
55
+ return { id, versionId };
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ };
61
+ export const getTargetPlatform = () => {
62
+ const { os, arch: architecture } = getPlatformInfo();
63
+ switch (os) {
64
+ case "macos":
65
+ return architecture === "aarch64" ? "macos-arm64" : "macos-x86_64";
66
+ case "linux": {
67
+ if (architecture === "aarch64") {
68
+ return "Linux-aarch64";
69
+ }
70
+ const distroInfo = getLinuxDistroInfo();
71
+ if (distroInfo?.id === "ubuntu") {
72
+ if (distroInfo.versionId.startsWith("24.04")) {
73
+ return "Ubuntu-24.04-x86_64";
74
+ }
75
+ if (distroInfo.versionId.startsWith("22.04")) {
76
+ return "Ubuntu-22.04-x86_64";
77
+ }
78
+ }
79
+ return "Linux-x86_64";
80
+ }
81
+ case "windows":
82
+ if (architecture === "aarch64") {
83
+ throw new Error("Windows ARM64 is not currently supported. Please use x86_64 emulation or build from source.");
84
+ }
85
+ return "Windows-x86_64";
86
+ default:
87
+ throw new Error(`Unsupported OS: ${os}`);
88
+ }
89
+ };
90
+ export const getOS = () => {
91
+ const { os } = getPlatformInfo();
92
+ switch (os) {
93
+ case "macos":
94
+ return "MacOS";
95
+ case "linux":
96
+ return "Linux";
97
+ case "windows":
98
+ return "Windows";
99
+ }
100
+ };
101
+ //# sourceMappingURL=getUserOs.js.map