@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,100 @@
1
+ import { execSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { executableIsAvailable } from "./executableIsAvailable.js";
4
+ export const isWingetAvailable = () => {
5
+ return executableIsAvailable("winget");
6
+ };
7
+ export const isChocoAvailable = () => {
8
+ return executableIsAvailable("choco");
9
+ };
10
+ export const isInstalledViaWinget = () => {
11
+ if (!isWingetAvailable()) {
12
+ return false;
13
+ }
14
+ try {
15
+ const output = execSync("winget list --id Aptos.Aptos", {
16
+ encoding: "utf8",
17
+ stdio: ["pipe", "pipe", "pipe"],
18
+ });
19
+ return output.includes("Aptos.Aptos");
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ };
25
+ export const isInstalledViaChoco = () => {
26
+ if (!isChocoAvailable()) {
27
+ return false;
28
+ }
29
+ try {
30
+ const output = execSync("choco list aptos", {
31
+ encoding: "utf8",
32
+ stdio: ["pipe", "pipe", "pipe"],
33
+ });
34
+ return output.toLowerCase().includes("aptos");
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ };
40
+ export const getCliPathWinget = () => {
41
+ const possiblePaths = [
42
+ `${process.env.LOCALAPPDATA}\\Microsoft\\WinGet\\Packages\\Aptos.Aptos_Microsoft.Winget.Source_8wekyb3d8bbwe\\aptos.exe`,
43
+ `${process.env.PROGRAMFILES}\\Aptos\\aptos.exe`,
44
+ `${process.env.LOCALAPPDATA}\\Aptos\\aptos.exe`,
45
+ ];
46
+ for (const path of possiblePaths) {
47
+ if (path && existsSync(path)) {
48
+ return path;
49
+ }
50
+ }
51
+ try {
52
+ const output = execSync("where aptos", {
53
+ encoding: "utf8",
54
+ stdio: ["pipe", "pipe", "pipe"],
55
+ }).trim();
56
+ if (output && existsSync(output.split("\n")[0])) {
57
+ return output.split("\n")[0];
58
+ }
59
+ }
60
+ catch {
61
+ }
62
+ return null;
63
+ };
64
+ export const getCliPathChoco = () => {
65
+ const chocoPath = `${process.env.ChocolateyInstall || "C:\\ProgramData\\chocolatey"}\\bin\\aptos.exe`;
66
+ if (existsSync(chocoPath)) {
67
+ return chocoPath;
68
+ }
69
+ return null;
70
+ };
71
+ export const installViaWinget = () => {
72
+ console.log("Installing Aptos CLI via winget...");
73
+ execSync("winget install --id Aptos.Aptos --silent --accept-package-agreements --accept-source-agreements", {
74
+ stdio: "inherit",
75
+ });
76
+ };
77
+ export const installViaChoco = () => {
78
+ console.log("Installing Aptos CLI via Chocolatey...");
79
+ execSync("choco install aptos -y", { stdio: "inherit" });
80
+ };
81
+ export const updateViaWinget = () => {
82
+ console.log("Updating Aptos CLI via winget...");
83
+ execSync("winget upgrade --id Aptos.Aptos --silent --accept-package-agreements --accept-source-agreements", {
84
+ stdio: "inherit",
85
+ });
86
+ };
87
+ export const updateViaChoco = () => {
88
+ console.log("Updating Aptos CLI via Chocolatey...");
89
+ execSync("choco upgrade aptos -y", { stdio: "inherit" });
90
+ };
91
+ export const detectWindowsPackageManager = () => {
92
+ if (isInstalledViaWinget()) {
93
+ return "winget";
94
+ }
95
+ if (isInstalledViaChoco()) {
96
+ return "choco";
97
+ }
98
+ return null;
99
+ };
100
+ //# sourceMappingURL=windowsPackageManagers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windowsPackageManagers.js","sourceRoot":"","sources":["../../bin/utils/windowsPackageManagers.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,iBAAiB,GAAG,GAAY,EAAE;IAC7C,OAAO,qBAAqB,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAY,EAAE;IAC5C,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAY,EAAE;IAChD,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,8BAA8B,EAAE;YACtD,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAY,EAAE;IAC/C,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,kBAAkB,EAAE;YAC1C,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAkB,EAAE;IAElD,MAAM,aAAa,GAAG;QACpB,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,6FAA6F;QACxH,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,oBAAoB;QAC/C,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,oBAAoB;KAChD,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,IAAI,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAGD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,EAAE;YACrC,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAkB,EAAE;IACjD,MAAM,SAAS,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,6BAA6B,kBAAkB,CAAC;IACtG,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAS,EAAE;IACzC,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,QAAQ,CACN,iGAAiG,EACjG;QACE,KAAK,EAAE,SAAS;KACjB,CACF,CAAC;AACJ,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAS,EAAE;IACxC,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,QAAQ,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AAC3D,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAS,EAAE;IACxC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,QAAQ,CACN,iGAAiG,EACjG;QACE,KAAK,EAAE,SAAS;KACjB,CACF,CAAC;AACJ,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAS,EAAE;IACvC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,QAAQ,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AAC3D,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAA8B,EAAE;IACzE,IAAI,oBAAoB,EAAE,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,mBAAmB,EAAE,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC","sourcesContent":["import { execSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { executableIsAvailable } from \"./executableIsAvailable.js\";\n\n/**\n * Check if winget is available on the system.\n */\nexport const isWingetAvailable = (): boolean => {\n return executableIsAvailable(\"winget\");\n};\n\n/**\n * Check if Chocolatey is available on the system.\n */\nexport const isChocoAvailable = (): boolean => {\n return executableIsAvailable(\"choco\");\n};\n\n/**\n * Check if the Aptos CLI was installed via winget.\n */\nexport const isInstalledViaWinget = (): boolean => {\n if (!isWingetAvailable()) {\n return false;\n }\n try {\n const output = execSync(\"winget list --id Aptos.Aptos\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return output.includes(\"Aptos.Aptos\");\n } catch {\n return false;\n }\n};\n\n/**\n * Check if the Aptos CLI was installed via Chocolatey.\n */\nexport const isInstalledViaChoco = (): boolean => {\n if (!isChocoAvailable()) {\n return false;\n }\n try {\n const output = execSync(\"choco list aptos\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return output.toLowerCase().includes(\"aptos\");\n } catch {\n return false;\n }\n};\n\n/**\n * Get the path to the Aptos CLI binary installed via winget.\n * Winget typically installs to the user's local app data or program files.\n */\nexport const getCliPathWinget = (): string | null => {\n // Winget installs to various locations, try common ones\n const possiblePaths = [\n `${process.env.LOCALAPPDATA}\\\\Microsoft\\\\WinGet\\\\Packages\\\\Aptos.Aptos_Microsoft.Winget.Source_8wekyb3d8bbwe\\\\aptos.exe`,\n `${process.env.PROGRAMFILES}\\\\Aptos\\\\aptos.exe`,\n `${process.env.LOCALAPPDATA}\\\\Aptos\\\\aptos.exe`,\n ];\n\n for (const path of possiblePaths) {\n if (path && existsSync(path)) {\n return path;\n }\n }\n\n // Try to find it via where command\n try {\n const output = execSync(\"where aptos\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n if (output && existsSync(output.split(\"\\n\")[0])) {\n return output.split(\"\\n\")[0];\n }\n } catch {\n // Not found via where\n }\n\n return null;\n};\n\n/**\n * Get the path to the Aptos CLI binary installed via Chocolatey.\n */\nexport const getCliPathChoco = (): string | null => {\n const chocoPath = `${process.env.ChocolateyInstall || \"C:\\\\ProgramData\\\\chocolatey\"}\\\\bin\\\\aptos.exe`;\n if (existsSync(chocoPath)) {\n return chocoPath;\n }\n return null;\n};\n\n/**\n * Install the Aptos CLI via winget.\n */\nexport const installViaWinget = (): void => {\n console.log(\"Installing Aptos CLI via winget...\");\n execSync(\n \"winget install --id Aptos.Aptos --silent --accept-package-agreements --accept-source-agreements\",\n {\n stdio: \"inherit\",\n },\n );\n};\n\n/**\n * Install the Aptos CLI via Chocolatey.\n */\nexport const installViaChoco = (): void => {\n console.log(\"Installing Aptos CLI via Chocolatey...\");\n execSync(\"choco install aptos -y\", { stdio: \"inherit\" });\n};\n\n/**\n * Update the Aptos CLI via winget.\n */\nexport const updateViaWinget = (): void => {\n console.log(\"Updating Aptos CLI via winget...\");\n execSync(\n \"winget upgrade --id Aptos.Aptos --silent --accept-package-agreements --accept-source-agreements\",\n {\n stdio: \"inherit\",\n },\n );\n};\n\n/**\n * Update the Aptos CLI via Chocolatey.\n */\nexport const updateViaChoco = (): void => {\n console.log(\"Updating Aptos CLI via Chocolatey...\");\n execSync(\"choco upgrade aptos -y\", { stdio: \"inherit\" });\n};\n\n/**\n * Detect which Windows package manager was used to install the CLI.\n * Returns the package manager name or null if not installed via a package manager.\n */\nexport const detectWindowsPackageManager = (): \"winget\" | \"choco\" | null => {\n if (isInstalledViaWinget()) {\n return \"winget\";\n }\n if (isInstalledViaChoco()) {\n return \"choco\";\n }\n return null;\n};\n"]}
@@ -0,0 +1,169 @@
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 { executableIsAvailable } from "./executableIsAvailable.js";
14
+ import { detectWindowsPackageManager, getCliPathChoco, getCliPathWinget, installViaChoco, installViaWinget, isChocoAvailable, isInstalledViaChoco, isInstalledViaWinget, isWingetAvailable, updateViaChoco, updateViaWinget, } from "./windowsPackageManagers.js";
15
+ describe("windowsPackageManagers", () => {
16
+ beforeEach(() => {
17
+ vi.clearAllMocks();
18
+ process.env.LOCALAPPDATA = "C:\\Users\\Test\\AppData\\Local";
19
+ process.env.PROGRAMFILES = "C:\\Program Files";
20
+ process.env.ChocolateyInstall = "C:\\ProgramData\\chocolatey";
21
+ });
22
+ afterEach(() => {
23
+ vi.restoreAllMocks();
24
+ });
25
+ describe("isWingetAvailable", () => {
26
+ it("should return true when winget is available", () => {
27
+ vi.mocked(executableIsAvailable).mockReturnValue(true);
28
+ expect(isWingetAvailable()).toBe(true);
29
+ expect(executableIsAvailable).toHaveBeenCalledWith("winget");
30
+ });
31
+ it("should return false when winget is not available", () => {
32
+ vi.mocked(executableIsAvailable).mockReturnValue(false);
33
+ expect(isWingetAvailable()).toBe(false);
34
+ });
35
+ });
36
+ describe("isChocoAvailable", () => {
37
+ it("should return true when choco is available", () => {
38
+ vi.mocked(executableIsAvailable).mockReturnValue(true);
39
+ expect(isChocoAvailable()).toBe(true);
40
+ expect(executableIsAvailable).toHaveBeenCalledWith("choco");
41
+ });
42
+ it("should return false when choco is not available", () => {
43
+ vi.mocked(executableIsAvailable).mockReturnValue(false);
44
+ expect(isChocoAvailable()).toBe(false);
45
+ });
46
+ });
47
+ describe("isInstalledViaWinget", () => {
48
+ it("should return true when aptos is installed via winget", () => {
49
+ vi.mocked(executableIsAvailable).mockReturnValue(true);
50
+ vi.mocked(execSync).mockReturnValue("Aptos.Aptos 1.0.0");
51
+ expect(isInstalledViaWinget()).toBe(true);
52
+ });
53
+ it("should return false when winget is not available", () => {
54
+ vi.mocked(executableIsAvailable).mockReturnValue(false);
55
+ expect(isInstalledViaWinget()).toBe(false);
56
+ });
57
+ it("should return false when aptos is not in winget list", () => {
58
+ vi.mocked(executableIsAvailable).mockReturnValue(true);
59
+ vi.mocked(execSync).mockReturnValue("No packages found");
60
+ expect(isInstalledViaWinget()).toBe(false);
61
+ });
62
+ it("should return false when winget list throws", () => {
63
+ vi.mocked(executableIsAvailable).mockReturnValue(true);
64
+ vi.mocked(execSync).mockImplementation(() => {
65
+ throw new Error("winget error");
66
+ });
67
+ expect(isInstalledViaWinget()).toBe(false);
68
+ });
69
+ });
70
+ describe("isInstalledViaChoco", () => {
71
+ it("should return true when aptos is installed via choco", () => {
72
+ vi.mocked(executableIsAvailable).mockReturnValue(true);
73
+ vi.mocked(execSync).mockReturnValue("aptos 1.0.0");
74
+ expect(isInstalledViaChoco()).toBe(true);
75
+ });
76
+ it("should return false when choco is not available", () => {
77
+ vi.mocked(executableIsAvailable).mockReturnValue(false);
78
+ expect(isInstalledViaChoco()).toBe(false);
79
+ });
80
+ it("should return false when aptos is not in choco list", () => {
81
+ vi.mocked(executableIsAvailable).mockReturnValue(true);
82
+ vi.mocked(execSync).mockReturnValue("0 packages installed");
83
+ expect(isInstalledViaChoco()).toBe(false);
84
+ });
85
+ });
86
+ describe("getCliPathWinget", () => {
87
+ it("should return path when found via where command", () => {
88
+ vi.mocked(existsSync).mockImplementation((path) => {
89
+ return path === "C:\\found\\aptos.exe";
90
+ });
91
+ vi.mocked(execSync).mockReturnValue("C:\\found\\aptos.exe\n");
92
+ expect(getCliPathWinget()).toBe("C:\\found\\aptos.exe");
93
+ });
94
+ it("should return null when not found", () => {
95
+ vi.mocked(existsSync).mockReturnValue(false);
96
+ vi.mocked(execSync).mockImplementation(() => {
97
+ throw new Error("not found");
98
+ });
99
+ expect(getCliPathWinget()).toBeNull();
100
+ });
101
+ });
102
+ describe("getCliPathChoco", () => {
103
+ it("should return path when exists", () => {
104
+ vi.mocked(existsSync).mockReturnValue(true);
105
+ expect(getCliPathChoco()).toBe("C:\\ProgramData\\chocolatey\\bin\\aptos.exe");
106
+ });
107
+ it("should return null when not found", () => {
108
+ vi.mocked(existsSync).mockReturnValue(false);
109
+ expect(getCliPathChoco()).toBeNull();
110
+ });
111
+ });
112
+ describe("installViaWinget", () => {
113
+ it("should call winget install", () => {
114
+ vi.mocked(execSync).mockReturnValue(Buffer.from(""));
115
+ installViaWinget();
116
+ expect(execSync).toHaveBeenCalledWith("winget install --id Aptos.Aptos --silent --accept-package-agreements --accept-source-agreements", { stdio: "inherit" });
117
+ });
118
+ });
119
+ describe("installViaChoco", () => {
120
+ it("should call choco install", () => {
121
+ vi.mocked(execSync).mockReturnValue(Buffer.from(""));
122
+ installViaChoco();
123
+ expect(execSync).toHaveBeenCalledWith("choco install aptos -y", {
124
+ stdio: "inherit",
125
+ });
126
+ });
127
+ });
128
+ describe("updateViaWinget", () => {
129
+ it("should call winget upgrade", () => {
130
+ vi.mocked(execSync).mockReturnValue(Buffer.from(""));
131
+ updateViaWinget();
132
+ expect(execSync).toHaveBeenCalledWith("winget upgrade --id Aptos.Aptos --silent --accept-package-agreements --accept-source-agreements", { stdio: "inherit" });
133
+ });
134
+ });
135
+ describe("updateViaChoco", () => {
136
+ it("should call choco upgrade", () => {
137
+ vi.mocked(execSync).mockReturnValue(Buffer.from(""));
138
+ updateViaChoco();
139
+ expect(execSync).toHaveBeenCalledWith("choco upgrade aptos -y", {
140
+ stdio: "inherit",
141
+ });
142
+ });
143
+ });
144
+ describe("detectWindowsPackageManager", () => {
145
+ it("should return winget when installed via winget", () => {
146
+ vi.mocked(executableIsAvailable).mockImplementation((name) => {
147
+ return name === "winget";
148
+ });
149
+ vi.mocked(execSync).mockReturnValue("Aptos.Aptos 1.0.0");
150
+ expect(detectWindowsPackageManager()).toBe("winget");
151
+ });
152
+ it("should return choco when installed via choco", () => {
153
+ vi.mocked(executableIsAvailable).mockImplementation((name) => {
154
+ if (name === "winget")
155
+ return false;
156
+ if (name === "choco")
157
+ return true;
158
+ return false;
159
+ });
160
+ vi.mocked(execSync).mockReturnValue("aptos 1.0.0");
161
+ expect(detectWindowsPackageManager()).toBe("choco");
162
+ });
163
+ it("should return null when not installed via package manager", () => {
164
+ vi.mocked(executableIsAvailable).mockReturnValue(false);
165
+ expect(detectWindowsPackageManager()).toBeNull();
166
+ });
167
+ });
168
+ });
169
+ //# sourceMappingURL=windowsPackageManagers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windowsPackageManagers.test.js","sourceRoot":"","sources":["../../bin/utils/windowsPackageManagers.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 { executableIsAvailable } from \"./executableIsAvailable.js\";\nimport {\n detectWindowsPackageManager,\n getCliPathChoco,\n getCliPathWinget,\n installViaChoco,\n installViaWinget,\n isChocoAvailable,\n isInstalledViaChoco,\n isInstalledViaWinget,\n isWingetAvailable,\n updateViaChoco,\n updateViaWinget,\n} from \"./windowsPackageManagers.js\";\n\ndescribe(\"windowsPackageManagers\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n // Set up default environment variables\n process.env.LOCALAPPDATA = \"C:\\\\Users\\\\Test\\\\AppData\\\\Local\";\n process.env.PROGRAMFILES = \"C:\\\\Program Files\";\n process.env.ChocolateyInstall = \"C:\\\\ProgramData\\\\chocolatey\";\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n });\n\n describe(\"isWingetAvailable\", () => {\n it(\"should return true when winget is available\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(true);\n\n expect(isWingetAvailable()).toBe(true);\n expect(executableIsAvailable).toHaveBeenCalledWith(\"winget\");\n });\n\n it(\"should return false when winget is not available\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(false);\n\n expect(isWingetAvailable()).toBe(false);\n });\n });\n\n describe(\"isChocoAvailable\", () => {\n it(\"should return true when choco is available\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(true);\n\n expect(isChocoAvailable()).toBe(true);\n expect(executableIsAvailable).toHaveBeenCalledWith(\"choco\");\n });\n\n it(\"should return false when choco is not available\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(false);\n\n expect(isChocoAvailable()).toBe(false);\n });\n });\n\n describe(\"isInstalledViaWinget\", () => {\n it(\"should return true when aptos is installed via winget\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(true);\n vi.mocked(execSync).mockReturnValue(\"Aptos.Aptos 1.0.0\");\n\n expect(isInstalledViaWinget()).toBe(true);\n });\n\n it(\"should return false when winget is not available\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(false);\n\n expect(isInstalledViaWinget()).toBe(false);\n });\n\n it(\"should return false when aptos is not in winget list\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(true);\n vi.mocked(execSync).mockReturnValue(\"No packages found\");\n\n expect(isInstalledViaWinget()).toBe(false);\n });\n\n it(\"should return false when winget list throws\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(true);\n vi.mocked(execSync).mockImplementation(() => {\n throw new Error(\"winget error\");\n });\n\n expect(isInstalledViaWinget()).toBe(false);\n });\n });\n\n describe(\"isInstalledViaChoco\", () => {\n it(\"should return true when aptos is installed via choco\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(true);\n vi.mocked(execSync).mockReturnValue(\"aptos 1.0.0\");\n\n expect(isInstalledViaChoco()).toBe(true);\n });\n\n it(\"should return false when choco is not available\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(false);\n\n expect(isInstalledViaChoco()).toBe(false);\n });\n\n it(\"should return false when aptos is not in choco list\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(true);\n vi.mocked(execSync).mockReturnValue(\"0 packages installed\");\n\n expect(isInstalledViaChoco()).toBe(false);\n });\n });\n\n describe(\"getCliPathWinget\", () => {\n it(\"should return path when found via where command\", () => {\n vi.mocked(existsSync).mockImplementation((path) => {\n return path === \"C:\\\\found\\\\aptos.exe\";\n });\n vi.mocked(execSync).mockReturnValue(\"C:\\\\found\\\\aptos.exe\\n\");\n\n expect(getCliPathWinget()).toBe(\"C:\\\\found\\\\aptos.exe\");\n });\n\n it(\"should return null when not found\", () => {\n vi.mocked(existsSync).mockReturnValue(false);\n vi.mocked(execSync).mockImplementation(() => {\n throw new Error(\"not found\");\n });\n\n expect(getCliPathWinget()).toBeNull();\n });\n });\n\n describe(\"getCliPathChoco\", () => {\n it(\"should return path when exists\", () => {\n vi.mocked(existsSync).mockReturnValue(true);\n\n expect(getCliPathChoco()).toBe(\n \"C:\\\\ProgramData\\\\chocolatey\\\\bin\\\\aptos.exe\",\n );\n });\n\n it(\"should return null when not found\", () => {\n vi.mocked(existsSync).mockReturnValue(false);\n\n expect(getCliPathChoco()).toBeNull();\n });\n });\n\n describe(\"installViaWinget\", () => {\n it(\"should call winget install\", () => {\n vi.mocked(execSync).mockReturnValue(Buffer.from(\"\"));\n\n installViaWinget();\n\n expect(execSync).toHaveBeenCalledWith(\n \"winget install --id Aptos.Aptos --silent --accept-package-agreements --accept-source-agreements\",\n { stdio: \"inherit\" },\n );\n });\n });\n\n describe(\"installViaChoco\", () => {\n it(\"should call choco install\", () => {\n vi.mocked(execSync).mockReturnValue(Buffer.from(\"\"));\n\n installViaChoco();\n\n expect(execSync).toHaveBeenCalledWith(\"choco install aptos -y\", {\n stdio: \"inherit\",\n });\n });\n });\n\n describe(\"updateViaWinget\", () => {\n it(\"should call winget upgrade\", () => {\n vi.mocked(execSync).mockReturnValue(Buffer.from(\"\"));\n\n updateViaWinget();\n\n expect(execSync).toHaveBeenCalledWith(\n \"winget upgrade --id Aptos.Aptos --silent --accept-package-agreements --accept-source-agreements\",\n { stdio: \"inherit\" },\n );\n });\n });\n\n describe(\"updateViaChoco\", () => {\n it(\"should call choco upgrade\", () => {\n vi.mocked(execSync).mockReturnValue(Buffer.from(\"\"));\n\n updateViaChoco();\n\n expect(execSync).toHaveBeenCalledWith(\"choco upgrade aptos -y\", {\n stdio: \"inherit\",\n });\n });\n });\n\n describe(\"detectWindowsPackageManager\", () => {\n it(\"should return winget when installed via winget\", () => {\n vi.mocked(executableIsAvailable).mockImplementation((name) => {\n return name === \"winget\";\n });\n vi.mocked(execSync).mockReturnValue(\"Aptos.Aptos 1.0.0\");\n\n expect(detectWindowsPackageManager()).toBe(\"winget\");\n });\n\n it(\"should return choco when installed via choco\", () => {\n vi.mocked(executableIsAvailable).mockImplementation((name) => {\n if (name === \"winget\") return false;\n if (name === \"choco\") return true;\n return false;\n });\n vi.mocked(execSync).mockReturnValue(\"aptos 1.0.0\");\n\n expect(detectWindowsPackageManager()).toBe(\"choco\");\n });\n\n it(\"should return null when not installed via package manager\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(false);\n\n expect(detectWindowsPackageManager()).toBeNull();\n });\n });\n});\n"]}
package/package.json CHANGED
@@ -1,7 +1,10 @@
1
1
  {
2
2
  "name": "@aptos-labs/aptos-cli",
3
- "version": "1.1.0",
3
+ "version": "2.0.0",
4
4
  "description": "Aptos CLI available from npmjs",
5
+ "engines": {
6
+ "node": ">=22"
7
+ },
5
8
  "bin": {
6
9
  "aptos": "./dist/aptos.js"
7
10
  },
@@ -19,20 +22,28 @@
19
22
  "url": "https://github.com/aptos-labs/aptos-cli/issues"
20
23
  },
21
24
  "license": "Apache-2.0",
22
- "scripts": {
23
- "clean": "rm -rf dist",
24
- "build": "npm run clean && tsc",
25
- "dev": "npm run build && node ./dist/aptos.js"
26
- },
25
+ "sideEffects": false,
26
+ "exports": {},
27
27
  "files": [
28
- "bin",
29
28
  "dist"
30
29
  ],
31
30
  "dependencies": {
32
- "commander": "^12.1.0"
31
+ "commander": "^14.0.3"
33
32
  },
34
33
  "devDependencies": {
35
- "@types/node": "^20.5.0",
36
- "typescript": "^5.6.2"
34
+ "@biomejs/biome": "^2.4.6",
35
+ "@types/node": "^22",
36
+ "typescript": "^5.9.3",
37
+ "vitest": "^4.0.18"
38
+ },
39
+ "scripts": {
40
+ "clean": "node --input-type=commonjs -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
41
+ "build": "pnpm run clean && tsc",
42
+ "dev": "pnpm run build && node ./dist/aptos.js",
43
+ "test": "vitest run",
44
+ "test:watch": "vitest",
45
+ "check": "biome check",
46
+ "check:fix": "biome check --fix",
47
+ "format": "biome format --fix"
37
48
  }
38
- }
49
+ }
package/bin/.gitkeep DELETED
File without changes
package/bin/aptos.ts DELETED
@@ -1,42 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // On MacOS we install the CLI with brew. There are two main reasons for this:
4
- // 1. Brew builds the CLI for the native CPU architecture for the user, which
5
- // eliminates any issues arising from using x86 binaries on ARM machines.
6
- // 2. Brew handles dependency management for us. This isn't relevant right now but
7
- // might become necessary later if we reintroduce OpenSSL as a dep for the CLI.
8
- //
9
- // On Linux and Windows we just query the GH API for the latest CLI release and
10
- // download and extract that.
11
-
12
- import { program } from "commander";
13
-
14
- import { parseCommandOptions } from "./utils/parseCommandOptions.js";
15
- import { runCLI } from "./tasks/run.js";
16
-
17
- program
18
- .name("aptos")
19
- .helpOption(false)
20
- .option("-i, --install", "install the latest version of the CLI")
21
- .option("-u, --update", "update the CLI to the latest version")
22
- .allowUnknownOption();
23
-
24
- program.parse(process.argv);
25
-
26
- const main = async () => {
27
- const options = {
28
- install: program.opts().install,
29
- update: program.opts().update,
30
- };
31
- const unknownOptions = program.args;
32
-
33
- // Manually check for `--help` and handle the CLI `--help`
34
- if (process.argv.includes("--help")) {
35
- // Forward to the CLI
36
- return runCLI(unknownOptions);
37
- }
38
-
39
- await parseCommandOptions(options, unknownOptions);
40
- };
41
-
42
- main().catch(console.error);
@@ -1,55 +0,0 @@
1
- import { execSync } from "child_process";
2
- import { existsSync } from "fs";
3
-
4
- import { GH_CLI_DOWNLOAD_URL, PNAME } from "../utils/consts.js";
5
- import { execSyncShell } from "../utils/execSyncShell.js";
6
- import { getCurrentOpenSSLVersion } from "../utils/versions.js";
7
- import { getOS } from "../utils/getUserOs.js";
8
- import { getLocalBinPath } from "../utils/getLocalBinPath.js";
9
- import { getLatestVersionGh } from "../utils/ghOperations.js";
10
-
11
- // Install the CLI.
12
- export const installCli = async () => {
13
- const path = getLocalBinPath();
14
- if (existsSync(path)) {
15
- console.log("Aptos CLI is already installed");
16
- return;
17
- }
18
- // Look up the latest version.
19
- const latestCLIVersion = await getLatestVersionGh();
20
- console.log(`Downloading aptos CLI version ${latestCLIVersion}`);
21
- const os = getOS();
22
-
23
- if (os === "Windows") {
24
- const url = `${GH_CLI_DOWNLOAD_URL}/${PNAME}-v${latestCLIVersion}/${PNAME}-${latestCLIVersion}-${os}-x86_64.zip`;
25
- // Download the zip file, extract it, and move the binary to the correct location.
26
- execSync(
27
- `powershell -Command "if (!(Test-Path -Path 'C:\\tmp')) { New-Item -ItemType Directory -Path 'C:\\tmp' } ; Invoke-RestMethod -Uri ${url} -OutFile C:\\tmp\\aptos.zip; Expand-Archive -Path C:\\tmp\\aptos.zip -DestinationPath C:\\tmp -Force; Move-Item -Path C:\\tmp\\aptos.exe -Destination \"${path}\""`
28
- );
29
- } else if (os === "MacOS") {
30
- // Install the CLI with brew.
31
- execSyncShell("brew install aptos", { encoding: "utf8" });
32
- } else {
33
- // On Linux, we check what version of OpenSSL we're working with to figure out
34
- // which binary to download.
35
- let osVersion = "x86_64";
36
- let opensSslVersion = "1.0.0";
37
- try {
38
- opensSslVersion = getCurrentOpenSSLVersion();
39
- } catch (error) {
40
- console.log(
41
- "Could not determine OpenSSL version, assuming older version (1.x.x)"
42
- );
43
- }
44
-
45
- if (opensSslVersion.startsWith("3.")) {
46
- osVersion = "22.04-x86_64";
47
- }
48
- console.log(`Downloading CLI binary ${os}-${osVersion}`);
49
- const url = `${GH_CLI_DOWNLOAD_URL}/${PNAME}-v${latestCLIVersion}/${PNAME}-${latestCLIVersion}-${os}-${osVersion}.zip`;
50
- // Download the zip file, extract it, and move the binary to the correct location.
51
- execSync(
52
- `curl -L -o /tmp/aptos.zip ${url}; unzip -o -q /tmp/aptos.zip -d /tmp; mv /tmp/aptos ${path};`
53
- );
54
- }
55
- };
package/bin/tasks/run.ts DELETED
@@ -1,23 +0,0 @@
1
- import { spawn } from "child_process";
2
- import { existsSync } from "fs";
3
-
4
- import { getOS } from "../utils/getUserOs.js";
5
- import { getLocalBinPath } from "../utils/getLocalBinPath.js";
6
-
7
- export const runCLI = async (args: string[] = []) => {
8
- const path = getLocalBinPath();
9
- if (!existsSync(path)) {
10
- console.log(
11
- "Aptos CLI not installed, run `npx aptos --install` to install"
12
- );
13
- return;
14
- }
15
- const os = getOS();
16
-
17
- // Spawn a child process to execute the binary with the provided arguments.
18
- // Spawn the child process to run the real CLI executable with the forwarded arguments
19
- spawn(path, args, {
20
- stdio: "inherit", // Forward the stdio so output is visible
21
- shell: os === "Windows", // Use shell on Windows
22
- });
23
- };
@@ -1,41 +0,0 @@
1
- import { existsSync } from "fs";
2
-
3
- import { getLocalBinPath } from "../utils/getLocalBinPath.js";
4
- import { execSync } from "child_process";
5
- import { getOS } from "../utils/getUserOs.js";
6
- import { getLatestVersionGh } from "../utils/ghOperations.js";
7
- import { execSyncShell } from "../utils/execSyncShell.js";
8
- import { installCli } from "./install.js";
9
-
10
- export const updateCli = async () => {
11
- const path = getLocalBinPath();
12
-
13
- if (!existsSync(path)) {
14
- console.log(
15
- "Aptos CLI not installed, run `npx aptos --install` to install"
16
- );
17
- return;
18
- }
19
-
20
- if (getOS() === "MacOS") {
21
- // Upgrade aptos via brew.
22
- return execSync("brew upgrade aptos");
23
- } else {
24
- const latestVersion = await getLatestVersionGh();
25
- // Get the current version of the CLI.
26
- const currentVersion = execSyncShell(`${path} --version`, {
27
- encoding: "utf8",
28
- })
29
- .trim()
30
- .split(" ")[1];
31
- // Check if the installed version is the latest version.
32
- if (currentVersion !== latestVersion) {
33
- console.log(
34
- `A newer version of the CLI is available: ${latestVersion}, installing...`
35
- );
36
- await installCli();
37
- } else {
38
- console.log(`CLI is up to date`);
39
- }
40
- }
41
- };
@@ -1,14 +0,0 @@
1
- import { execSyncShell } from "./execSyncShell.js";
2
-
3
- /**
4
- * Only works on Unix systems. This is fine because we only need to check for brew on
5
- * MacOS.
6
- */
7
- export const executableIsAvailable = (name) => {
8
- try {
9
- execSyncShell(`which ${name}`, { encoding: "utf8" });
10
- return true;
11
- } catch (error) {
12
- return false;
13
- }
14
- };
@@ -1,12 +0,0 @@
1
- import { execSyncShell } from "./execSyncShell.js";
2
-
3
- /**
4
- * Based on the installation path of the aptos formula, determine the path where the
5
- * CLI should be installed.
6
- */
7
- export const getCliPathBrew = () => {
8
- const directory = execSyncShell("brew --prefix aptos", { encoding: "utf8" })
9
- .toString()
10
- .trim();
11
- return `${directory}/bin/aptos`;
12
- };
@@ -1,3 +0,0 @@
1
- export const PNAME = "aptos-cli";
2
- export const GH_CLI_DOWNLOAD_URL =
3
- "https://github.com/aptos-labs/aptos-core/releases/download";
@@ -1,8 +0,0 @@
1
- import { execSync } from "child_process";
2
-
3
- /**
4
- * Wrapper around execSync that uses the shell.
5
- */
6
- export const execSyncShell = (command, options) => {
7
- return execSync(command, { shell: true, ...options });
8
- };
@@ -1,28 +0,0 @@
1
- import { dirname } from "path";
2
- import { executableIsAvailable } from "./aptosExecutableIsAvailable.js";
3
- import { getCliPathBrew } from "./brewOperations.js";
4
- import { PNAME } from "./consts.js";
5
- import { getOS } from "./getUserOs.js";
6
- import { fileURLToPath } from "url";
7
-
8
- export const getLocalBinPath = () => {
9
- let path;
10
- const os = getOS();
11
- if (os === "MacOS") {
12
- // Confirm brew is installed.
13
- const brewInstalled = executableIsAvailable("brew");
14
- if (!brewInstalled) {
15
- throw "Please install brew to continue: https://brew.sh/";
16
- }
17
- try {
18
- path = getCliPathBrew();
19
- } catch (e) {
20
- path = "";
21
- }
22
- } else if (os === "Windows") {
23
- path = `${dirname(fileURLToPath(import.meta.url))}\\${PNAME}.exe`;
24
- } else {
25
- path = `${dirname(fileURLToPath(import.meta.url))}/${PNAME}`;
26
- }
27
- return path;
28
- };
@@ -1,18 +0,0 @@
1
- import { platform } from "os";
2
-
3
- /**
4
- * Determine what OS we're running on.
5
- */
6
- export const getOS = () => {
7
- const osPlatform = platform();
8
- switch (osPlatform) {
9
- case "darwin":
10
- return "MacOS";
11
- case "linux":
12
- return "Ubuntu";
13
- case "win32":
14
- return "Windows";
15
- default:
16
- throw new Error(`Unsupported OS ${osPlatform}`);
17
- }
18
- };
@@ -1,20 +0,0 @@
1
- import { PNAME } from "./consts.js";
2
-
3
- /**
4
- * Query the GitHub API to find the latest CLI release. We assume that the CLI is in
5
- * the last 100 releases so we don't paginate through the releases.
6
- */
7
- export const getLatestVersionGh = async () => {
8
- const prefix = `${PNAME}-v`;
9
- const response = await (
10
- await fetch(
11
- "https://api.github.com/repos/aptos-labs/aptos-core/releases?per_page=100"
12
- )
13
- ).json();
14
- for (const release of response) {
15
- if (release["tag_name"].startsWith(`${prefix}`)) {
16
- return release.tag_name.replace(`${prefix}`, "");
17
- }
18
- }
19
- throw "Could not determine latest version of Aptos CLI";
20
- };