@aptos-labs/aptos-cli 1.1.1 → 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.
- package/README.md +109 -0
- package/dist/aptos.js +7 -2
- package/dist/aptos.js.map +1 -1
- package/dist/examples/examples.test.js +69 -0
- package/dist/examples/examples.test.js.map +1 -0
- package/dist/tasks/install.js +82 -31
- package/dist/tasks/install.js.map +1 -1
- package/dist/tasks/install.test.js +227 -0
- package/dist/tasks/install.test.js.map +1 -0
- package/dist/tasks/run.js +13 -8
- package/dist/tasks/run.js.map +1 -1
- package/dist/tasks/run.test.js +92 -0
- package/dist/tasks/run.test.js.map +1 -0
- package/dist/tasks/update.js +55 -20
- package/dist/tasks/update.js.map +1 -1
- package/dist/utils/brewOperations.js +30 -4
- package/dist/utils/brewOperations.js.map +1 -1
- package/dist/utils/brewOperations.test.js +83 -0
- package/dist/utils/brewOperations.test.js.map +1 -0
- package/dist/utils/consts.js.map +1 -1
- package/dist/utils/execSyncShell.js +6 -2
- package/dist/utils/execSyncShell.js.map +1 -1
- package/dist/utils/executableIsAvailable.js +12 -0
- package/dist/utils/executableIsAvailable.js.map +1 -0
- package/dist/utils/getLocalBinPath.js +76 -20
- package/dist/utils/getLocalBinPath.js.map +1 -1
- package/dist/utils/getUserOs.js +92 -6
- package/dist/utils/getUserOs.js.map +1 -1
- package/dist/utils/getUserOs.test.js +143 -0
- package/dist/utils/getUserOs.test.js.map +1 -0
- package/dist/utils/ghOperations.js +81 -6
- package/dist/utils/ghOperations.js.map +1 -1
- package/dist/utils/ghOperations.test.js +217 -0
- package/dist/utils/ghOperations.test.js.map +1 -0
- package/dist/utils/parseCommandOptions.js +4 -4
- package/dist/utils/parseCommandOptions.js.map +1 -1
- package/dist/utils/windowsPackageManagers.js +100 -0
- package/dist/utils/windowsPackageManagers.js.map +1 -0
- package/dist/utils/windowsPackageManagers.test.js +169 -0
- package/dist/utils/windowsPackageManagers.test.js.map +1 -0
- package/package.json +22 -11
- package/bin/.gitkeep +0 -0
- package/bin/aptos.ts +0 -44
- package/bin/tasks/install.ts +0 -55
- package/bin/tasks/run.ts +0 -27
- package/bin/tasks/update.ts +0 -41
- package/bin/utils/aptosExecutableIsAvailable.ts +0 -14
- package/bin/utils/brewOperations.ts +0 -12
- package/bin/utils/consts.ts +0 -3
- package/bin/utils/execSyncShell.ts +0 -8
- package/bin/utils/getLocalBinPath.ts +0 -28
- package/bin/utils/getUserOs.ts +0 -18
- package/bin/utils/ghOperations.ts +0 -20
- package/bin/utils/handleHelpOptions.ts +0 -38
- package/bin/utils/parseCommandOptions.ts +0 -28
- package/bin/utils/versions.ts +0 -9
- package/dist/aptos.d.ts +0 -2
- package/dist/tasks/install.d.ts +0 -1
- package/dist/tasks/run.d.ts +0 -1
- package/dist/tasks/update.d.ts +0 -1
- package/dist/utils/aptosExecutableIsAvailable.d.ts +0 -1
- package/dist/utils/aptosExecutableIsAvailable.js +0 -11
- package/dist/utils/aptosExecutableIsAvailable.js.map +0 -1
- package/dist/utils/brewOperations.d.ts +0 -1
- package/dist/utils/consts.d.ts +0 -2
- package/dist/utils/execSyncShell.d.ts +0 -1
- package/dist/utils/getLocalBinPath.d.ts +0 -1
- package/dist/utils/getUserOs.d.ts +0 -1
- package/dist/utils/ghOperations.d.ts +0 -1
- package/dist/utils/handleHelpOptions.d.ts +0 -2
- package/dist/utils/handleHelpOptions.js +0 -16
- package/dist/utils/handleHelpOptions.js.map +0 -1
- package/dist/utils/parseCommandOptions.d.ts +0 -5
- package/dist/utils/versions.d.ts +0 -1
- package/dist/utils/versions.js +0 -6
- package/dist/utils/versions.js.map +0 -1
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
const mockFetch = vi.fn();
|
|
3
|
+
global.fetch = mockFetch;
|
|
4
|
+
import { getCliVersion, getLatestVersionGh, getUserSpecifiedVersion, hasUserSpecifiedVersion, validateVersionExists, } from "./ghOperations.js";
|
|
5
|
+
describe("ghOperations", () => {
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
vi.clearAllMocks();
|
|
8
|
+
delete process.env.GITHUB_TOKEN;
|
|
9
|
+
delete process.env.APTOS_CLI_VERSION;
|
|
10
|
+
});
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
vi.restoreAllMocks();
|
|
13
|
+
});
|
|
14
|
+
describe("getLatestVersionGh", () => {
|
|
15
|
+
it("should return the latest version", async () => {
|
|
16
|
+
mockFetch.mockResolvedValue({
|
|
17
|
+
ok: true,
|
|
18
|
+
json: () => Promise.resolve([
|
|
19
|
+
{ tag_name: "aptos-cli-v1.2.3" },
|
|
20
|
+
{ tag_name: "aptos-cli-v1.2.2" },
|
|
21
|
+
]),
|
|
22
|
+
});
|
|
23
|
+
const version = await getLatestVersionGh();
|
|
24
|
+
expect(version).toBe("1.2.3");
|
|
25
|
+
expect(mockFetch).toHaveBeenCalledWith("https://api.github.com/repos/aptos-labs/aptos-core/releases?per_page=100", expect.objectContaining({
|
|
26
|
+
headers: expect.objectContaining({
|
|
27
|
+
Accept: "application/vnd.github.v3+json",
|
|
28
|
+
"User-Agent": "aptos-cli-npm",
|
|
29
|
+
}),
|
|
30
|
+
}));
|
|
31
|
+
});
|
|
32
|
+
it("should use GITHUB_TOKEN when available", async () => {
|
|
33
|
+
process.env.GITHUB_TOKEN = "test-token";
|
|
34
|
+
mockFetch.mockResolvedValue({
|
|
35
|
+
ok: true,
|
|
36
|
+
json: () => Promise.resolve([{ tag_name: "aptos-cli-v1.0.0" }]),
|
|
37
|
+
});
|
|
38
|
+
await getLatestVersionGh();
|
|
39
|
+
expect(mockFetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
|
|
40
|
+
headers: expect.objectContaining({
|
|
41
|
+
Authorization: "Bearer test-token",
|
|
42
|
+
}),
|
|
43
|
+
}));
|
|
44
|
+
});
|
|
45
|
+
it("should skip non-CLI releases", async () => {
|
|
46
|
+
mockFetch.mockResolvedValue({
|
|
47
|
+
ok: true,
|
|
48
|
+
json: () => Promise.resolve([
|
|
49
|
+
{ tag_name: "other-release-v2.0.0" },
|
|
50
|
+
{ tag_name: "aptos-cli-v1.5.0" },
|
|
51
|
+
]),
|
|
52
|
+
});
|
|
53
|
+
const version = await getLatestVersionGh();
|
|
54
|
+
expect(version).toBe("1.5.0");
|
|
55
|
+
});
|
|
56
|
+
it("should throw on rate limit (403)", async () => {
|
|
57
|
+
mockFetch.mockResolvedValue({
|
|
58
|
+
ok: false,
|
|
59
|
+
status: 403,
|
|
60
|
+
statusText: "Forbidden",
|
|
61
|
+
});
|
|
62
|
+
await expect(getLatestVersionGh()).rejects.toThrow("GitHub API rate limit exceeded");
|
|
63
|
+
});
|
|
64
|
+
it("should throw on rate limit (429)", async () => {
|
|
65
|
+
mockFetch.mockResolvedValue({
|
|
66
|
+
ok: false,
|
|
67
|
+
status: 429,
|
|
68
|
+
statusText: "Too Many Requests",
|
|
69
|
+
});
|
|
70
|
+
await expect(getLatestVersionGh()).rejects.toThrow("GitHub API rate limit exceeded");
|
|
71
|
+
});
|
|
72
|
+
it("should throw on other HTTP errors", async () => {
|
|
73
|
+
mockFetch.mockResolvedValue({
|
|
74
|
+
ok: false,
|
|
75
|
+
status: 500,
|
|
76
|
+
statusText: "Internal Server Error",
|
|
77
|
+
});
|
|
78
|
+
await expect(getLatestVersionGh()).rejects.toThrow("GitHub API request failed with status 500");
|
|
79
|
+
});
|
|
80
|
+
it("should throw on network error", async () => {
|
|
81
|
+
mockFetch.mockRejectedValue(new Error("Network error"));
|
|
82
|
+
await expect(getLatestVersionGh()).rejects.toThrow("Failed to fetch releases from GitHub");
|
|
83
|
+
});
|
|
84
|
+
it("should throw when no CLI release found", async () => {
|
|
85
|
+
mockFetch.mockResolvedValue({
|
|
86
|
+
ok: true,
|
|
87
|
+
json: () => Promise.resolve([
|
|
88
|
+
{ tag_name: "other-release-v1.0.0" },
|
|
89
|
+
{ tag_name: "another-release-v2.0.0" },
|
|
90
|
+
]),
|
|
91
|
+
});
|
|
92
|
+
await expect(getLatestVersionGh()).rejects.toThrow("Could not determine latest version of Aptos CLI");
|
|
93
|
+
});
|
|
94
|
+
it("should throw on invalid JSON response", async () => {
|
|
95
|
+
mockFetch.mockResolvedValue({
|
|
96
|
+
ok: true,
|
|
97
|
+
json: () => Promise.reject(new Error("Invalid JSON")),
|
|
98
|
+
});
|
|
99
|
+
await expect(getLatestVersionGh()).rejects.toThrow("Failed to parse GitHub API response");
|
|
100
|
+
});
|
|
101
|
+
it("should throw when response is not an array", async () => {
|
|
102
|
+
mockFetch.mockResolvedValue({
|
|
103
|
+
ok: true,
|
|
104
|
+
json: () => Promise.resolve({ message: "not an array" }),
|
|
105
|
+
});
|
|
106
|
+
await expect(getLatestVersionGh()).rejects.toThrow("Unexpected response format");
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe("getUserSpecifiedVersion", () => {
|
|
110
|
+
it("should return undefined when APTOS_CLI_VERSION is not set", () => {
|
|
111
|
+
delete process.env.APTOS_CLI_VERSION;
|
|
112
|
+
expect(getUserSpecifiedVersion()).toBeUndefined();
|
|
113
|
+
});
|
|
114
|
+
it("should return the version when APTOS_CLI_VERSION is set", () => {
|
|
115
|
+
process.env.APTOS_CLI_VERSION = "1.2.3";
|
|
116
|
+
expect(getUserSpecifiedVersion()).toBe("1.2.3");
|
|
117
|
+
});
|
|
118
|
+
it("should strip v prefix from version", () => {
|
|
119
|
+
process.env.APTOS_CLI_VERSION = "v1.2.3";
|
|
120
|
+
expect(getUserSpecifiedVersion()).toBe("1.2.3");
|
|
121
|
+
});
|
|
122
|
+
it("should handle version without v prefix", () => {
|
|
123
|
+
process.env.APTOS_CLI_VERSION = "2.0.0";
|
|
124
|
+
expect(getUserSpecifiedVersion()).toBe("2.0.0");
|
|
125
|
+
});
|
|
126
|
+
it("should accept pre-release versions", () => {
|
|
127
|
+
process.env.APTOS_CLI_VERSION = "v1.2.3-rc.1";
|
|
128
|
+
expect(getUserSpecifiedVersion()).toBe("1.2.3-rc.1");
|
|
129
|
+
});
|
|
130
|
+
it("should reject invalid version strings", () => {
|
|
131
|
+
process.env.APTOS_CLI_VERSION = "not-a-version";
|
|
132
|
+
expect(() => getUserSpecifiedVersion()).toThrow("Invalid APTOS_CLI_VERSION");
|
|
133
|
+
});
|
|
134
|
+
it("should reject version with shell metacharacters", () => {
|
|
135
|
+
process.env.APTOS_CLI_VERSION = '1.0.0"; rm -rf /; echo "';
|
|
136
|
+
expect(() => getUserSpecifiedVersion()).toThrow("Invalid APTOS_CLI_VERSION");
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
describe("hasUserSpecifiedVersion", () => {
|
|
140
|
+
it("should return false when APTOS_CLI_VERSION is not set", () => {
|
|
141
|
+
delete process.env.APTOS_CLI_VERSION;
|
|
142
|
+
expect(hasUserSpecifiedVersion()).toBe(false);
|
|
143
|
+
});
|
|
144
|
+
it("should return true when APTOS_CLI_VERSION is set", () => {
|
|
145
|
+
process.env.APTOS_CLI_VERSION = "1.0.0";
|
|
146
|
+
expect(hasUserSpecifiedVersion()).toBe(true);
|
|
147
|
+
});
|
|
148
|
+
it("should return false when APTOS_CLI_VERSION is empty string", () => {
|
|
149
|
+
process.env.APTOS_CLI_VERSION = "";
|
|
150
|
+
expect(hasUserSpecifiedVersion()).toBe(false);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
describe("validateVersionExists", () => {
|
|
154
|
+
it("should return true when version exists", async () => {
|
|
155
|
+
mockFetch.mockResolvedValue({ ok: true });
|
|
156
|
+
const result = await validateVersionExists("1.0.0", "Linux-x86_64");
|
|
157
|
+
expect(result).toBe(true);
|
|
158
|
+
expect(mockFetch).toHaveBeenCalledWith("https://github.com/aptos-labs/aptos-core/releases/download/aptos-cli-v1.0.0/aptos-cli-1.0.0-Linux-x86_64.zip", expect.objectContaining({ method: "HEAD" }));
|
|
159
|
+
});
|
|
160
|
+
it("should return false when version does not exist", async () => {
|
|
161
|
+
mockFetch.mockResolvedValue({ ok: false });
|
|
162
|
+
const result = await validateVersionExists("99.99.99", "Linux-x86_64");
|
|
163
|
+
expect(result).toBe(false);
|
|
164
|
+
});
|
|
165
|
+
it("should return false on network error", async () => {
|
|
166
|
+
mockFetch.mockRejectedValue(new Error("Network error"));
|
|
167
|
+
const result = await validateVersionExists("1.0.0", "Linux-x86_64");
|
|
168
|
+
expect(result).toBe(false);
|
|
169
|
+
});
|
|
170
|
+
it("should use GITHUB_TOKEN when available", async () => {
|
|
171
|
+
process.env.GITHUB_TOKEN = "test-token";
|
|
172
|
+
mockFetch.mockResolvedValue({ ok: true });
|
|
173
|
+
await validateVersionExists("1.0.0", "Linux-x86_64");
|
|
174
|
+
expect(mockFetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
|
|
175
|
+
headers: expect.objectContaining({
|
|
176
|
+
Authorization: "Bearer test-token",
|
|
177
|
+
}),
|
|
178
|
+
}));
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
describe("getCliVersion", () => {
|
|
182
|
+
it("should return latest version when APTOS_CLI_VERSION is not set", async () => {
|
|
183
|
+
delete process.env.APTOS_CLI_VERSION;
|
|
184
|
+
mockFetch.mockResolvedValue({
|
|
185
|
+
ok: true,
|
|
186
|
+
json: () => Promise.resolve([{ tag_name: "aptos-cli-v2.0.0" }]),
|
|
187
|
+
});
|
|
188
|
+
const version = await getCliVersion();
|
|
189
|
+
expect(version).toBe("2.0.0");
|
|
190
|
+
});
|
|
191
|
+
it("should return user-specified version when APTOS_CLI_VERSION is set", async () => {
|
|
192
|
+
process.env.APTOS_CLI_VERSION = "1.5.0";
|
|
193
|
+
const version = await getCliVersion();
|
|
194
|
+
expect(version).toBe("1.5.0");
|
|
195
|
+
expect(mockFetch).not.toHaveBeenCalled();
|
|
196
|
+
});
|
|
197
|
+
it("should validate version when targetPlatform is provided", async () => {
|
|
198
|
+
process.env.APTOS_CLI_VERSION = "1.5.0";
|
|
199
|
+
mockFetch.mockResolvedValue({ ok: true });
|
|
200
|
+
const version = await getCliVersion("Linux-x86_64");
|
|
201
|
+
expect(version).toBe("1.5.0");
|
|
202
|
+
expect(mockFetch).toHaveBeenCalledWith(expect.stringContaining("1.5.0"), expect.objectContaining({ method: "HEAD" }));
|
|
203
|
+
});
|
|
204
|
+
it("should throw error when specified version does not exist", async () => {
|
|
205
|
+
process.env.APTOS_CLI_VERSION = "99.99.99";
|
|
206
|
+
mockFetch.mockResolvedValue({ ok: false });
|
|
207
|
+
await expect(getCliVersion("Linux-x86_64")).rejects.toThrow("Specified version 99.99.99 does not exist");
|
|
208
|
+
});
|
|
209
|
+
it("should strip v prefix and validate version", async () => {
|
|
210
|
+
process.env.APTOS_CLI_VERSION = "v1.5.0";
|
|
211
|
+
mockFetch.mockResolvedValue({ ok: true });
|
|
212
|
+
const version = await getCliVersion("Linux-x86_64");
|
|
213
|
+
expect(version).toBe("1.5.0");
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
//# sourceMappingURL=ghOperations.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ghOperations.test.js","sourceRoot":"","sources":["../../bin/utils/ghOperations.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\n\n// Mock global fetch\nconst mockFetch = vi.fn();\nglobal.fetch = mockFetch;\n\nimport {\n getCliVersion,\n getLatestVersionGh,\n getUserSpecifiedVersion,\n hasUserSpecifiedVersion,\n validateVersionExists,\n} from \"./ghOperations.js\";\n\ndescribe(\"ghOperations\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n delete process.env.GITHUB_TOKEN;\n delete process.env.APTOS_CLI_VERSION;\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n });\n\n describe(\"getLatestVersionGh\", () => {\n it(\"should return the latest version\", async () => {\n mockFetch.mockResolvedValue({\n ok: true,\n json: () =>\n Promise.resolve([\n { tag_name: \"aptos-cli-v1.2.3\" },\n { tag_name: \"aptos-cli-v1.2.2\" },\n ]),\n });\n\n const version = await getLatestVersionGh();\n\n expect(version).toBe(\"1.2.3\");\n expect(mockFetch).toHaveBeenCalledWith(\n \"https://api.github.com/repos/aptos-labs/aptos-core/releases?per_page=100\",\n expect.objectContaining({\n headers: expect.objectContaining({\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": \"aptos-cli-npm\",\n }),\n }),\n );\n });\n\n it(\"should use GITHUB_TOKEN when available\", async () => {\n process.env.GITHUB_TOKEN = \"test-token\";\n\n mockFetch.mockResolvedValue({\n ok: true,\n json: () => Promise.resolve([{ tag_name: \"aptos-cli-v1.0.0\" }]),\n });\n\n await getLatestVersionGh();\n\n expect(mockFetch).toHaveBeenCalledWith(\n expect.any(String),\n expect.objectContaining({\n headers: expect.objectContaining({\n Authorization: \"Bearer test-token\",\n }),\n }),\n );\n });\n\n it(\"should skip non-CLI releases\", async () => {\n mockFetch.mockResolvedValue({\n ok: true,\n json: () =>\n Promise.resolve([\n { tag_name: \"other-release-v2.0.0\" },\n { tag_name: \"aptos-cli-v1.5.0\" },\n ]),\n });\n\n const version = await getLatestVersionGh();\n\n expect(version).toBe(\"1.5.0\");\n });\n\n it(\"should throw on rate limit (403)\", async () => {\n mockFetch.mockResolvedValue({\n ok: false,\n status: 403,\n statusText: \"Forbidden\",\n });\n\n await expect(getLatestVersionGh()).rejects.toThrow(\n \"GitHub API rate limit exceeded\",\n );\n });\n\n it(\"should throw on rate limit (429)\", async () => {\n mockFetch.mockResolvedValue({\n ok: false,\n status: 429,\n statusText: \"Too Many Requests\",\n });\n\n await expect(getLatestVersionGh()).rejects.toThrow(\n \"GitHub API rate limit exceeded\",\n );\n });\n\n it(\"should throw on other HTTP errors\", async () => {\n mockFetch.mockResolvedValue({\n ok: false,\n status: 500,\n statusText: \"Internal Server Error\",\n });\n\n await expect(getLatestVersionGh()).rejects.toThrow(\n \"GitHub API request failed with status 500\",\n );\n });\n\n it(\"should throw on network error\", async () => {\n mockFetch.mockRejectedValue(new Error(\"Network error\"));\n\n await expect(getLatestVersionGh()).rejects.toThrow(\n \"Failed to fetch releases from GitHub\",\n );\n });\n\n it(\"should throw when no CLI release found\", async () => {\n mockFetch.mockResolvedValue({\n ok: true,\n json: () =>\n Promise.resolve([\n { tag_name: \"other-release-v1.0.0\" },\n { tag_name: \"another-release-v2.0.0\" },\n ]),\n });\n\n await expect(getLatestVersionGh()).rejects.toThrow(\n \"Could not determine latest version of Aptos CLI\",\n );\n });\n\n it(\"should throw on invalid JSON response\", async () => {\n mockFetch.mockResolvedValue({\n ok: true,\n json: () => Promise.reject(new Error(\"Invalid JSON\")),\n });\n\n await expect(getLatestVersionGh()).rejects.toThrow(\n \"Failed to parse GitHub API response\",\n );\n });\n\n it(\"should throw when response is not an array\", async () => {\n mockFetch.mockResolvedValue({\n ok: true,\n json: () => Promise.resolve({ message: \"not an array\" }),\n });\n\n await expect(getLatestVersionGh()).rejects.toThrow(\n \"Unexpected response format\",\n );\n });\n });\n\n describe(\"getUserSpecifiedVersion\", () => {\n it(\"should return undefined when APTOS_CLI_VERSION is not set\", () => {\n delete process.env.APTOS_CLI_VERSION;\n expect(getUserSpecifiedVersion()).toBeUndefined();\n });\n\n it(\"should return the version when APTOS_CLI_VERSION is set\", () => {\n process.env.APTOS_CLI_VERSION = \"1.2.3\";\n expect(getUserSpecifiedVersion()).toBe(\"1.2.3\");\n });\n\n it(\"should strip v prefix from version\", () => {\n process.env.APTOS_CLI_VERSION = \"v1.2.3\";\n expect(getUserSpecifiedVersion()).toBe(\"1.2.3\");\n });\n\n it(\"should handle version without v prefix\", () => {\n process.env.APTOS_CLI_VERSION = \"2.0.0\";\n expect(getUserSpecifiedVersion()).toBe(\"2.0.0\");\n });\n\n it(\"should accept pre-release versions\", () => {\n process.env.APTOS_CLI_VERSION = \"v1.2.3-rc.1\";\n expect(getUserSpecifiedVersion()).toBe(\"1.2.3-rc.1\");\n });\n\n it(\"should reject invalid version strings\", () => {\n process.env.APTOS_CLI_VERSION = \"not-a-version\";\n expect(() => getUserSpecifiedVersion()).toThrow(\n \"Invalid APTOS_CLI_VERSION\",\n );\n });\n\n it(\"should reject version with shell metacharacters\", () => {\n process.env.APTOS_CLI_VERSION = '1.0.0\"; rm -rf /; echo \"';\n expect(() => getUserSpecifiedVersion()).toThrow(\n \"Invalid APTOS_CLI_VERSION\",\n );\n });\n });\n\n describe(\"hasUserSpecifiedVersion\", () => {\n it(\"should return false when APTOS_CLI_VERSION is not set\", () => {\n delete process.env.APTOS_CLI_VERSION;\n expect(hasUserSpecifiedVersion()).toBe(false);\n });\n\n it(\"should return true when APTOS_CLI_VERSION is set\", () => {\n process.env.APTOS_CLI_VERSION = \"1.0.0\";\n expect(hasUserSpecifiedVersion()).toBe(true);\n });\n\n it(\"should return false when APTOS_CLI_VERSION is empty string\", () => {\n process.env.APTOS_CLI_VERSION = \"\";\n expect(hasUserSpecifiedVersion()).toBe(false);\n });\n });\n\n describe(\"validateVersionExists\", () => {\n it(\"should return true when version exists\", async () => {\n mockFetch.mockResolvedValue({ ok: true });\n\n const result = await validateVersionExists(\"1.0.0\", \"Linux-x86_64\");\n\n expect(result).toBe(true);\n expect(mockFetch).toHaveBeenCalledWith(\n \"https://github.com/aptos-labs/aptos-core/releases/download/aptos-cli-v1.0.0/aptos-cli-1.0.0-Linux-x86_64.zip\",\n expect.objectContaining({ method: \"HEAD\" }),\n );\n });\n\n it(\"should return false when version does not exist\", async () => {\n mockFetch.mockResolvedValue({ ok: false });\n\n const result = await validateVersionExists(\"99.99.99\", \"Linux-x86_64\");\n\n expect(result).toBe(false);\n });\n\n it(\"should return false on network error\", async () => {\n mockFetch.mockRejectedValue(new Error(\"Network error\"));\n\n const result = await validateVersionExists(\"1.0.0\", \"Linux-x86_64\");\n\n expect(result).toBe(false);\n });\n\n it(\"should use GITHUB_TOKEN when available\", async () => {\n process.env.GITHUB_TOKEN = \"test-token\";\n mockFetch.mockResolvedValue({ ok: true });\n\n await validateVersionExists(\"1.0.0\", \"Linux-x86_64\");\n\n expect(mockFetch).toHaveBeenCalledWith(\n expect.any(String),\n expect.objectContaining({\n headers: expect.objectContaining({\n Authorization: \"Bearer test-token\",\n }),\n }),\n );\n });\n });\n\n describe(\"getCliVersion\", () => {\n it(\"should return latest version when APTOS_CLI_VERSION is not set\", async () => {\n delete process.env.APTOS_CLI_VERSION;\n mockFetch.mockResolvedValue({\n ok: true,\n json: () => Promise.resolve([{ tag_name: \"aptos-cli-v2.0.0\" }]),\n });\n\n const version = await getCliVersion();\n\n expect(version).toBe(\"2.0.0\");\n });\n\n it(\"should return user-specified version when APTOS_CLI_VERSION is set\", async () => {\n process.env.APTOS_CLI_VERSION = \"1.5.0\";\n // Don't validate when no targetPlatform is provided\n const version = await getCliVersion();\n\n expect(version).toBe(\"1.5.0\");\n // Should not call fetch for releases API\n expect(mockFetch).not.toHaveBeenCalled();\n });\n\n it(\"should validate version when targetPlatform is provided\", async () => {\n process.env.APTOS_CLI_VERSION = \"1.5.0\";\n mockFetch.mockResolvedValue({ ok: true });\n\n const version = await getCliVersion(\"Linux-x86_64\");\n\n expect(version).toBe(\"1.5.0\");\n expect(mockFetch).toHaveBeenCalledWith(\n expect.stringContaining(\"1.5.0\"),\n expect.objectContaining({ method: \"HEAD\" }),\n );\n });\n\n it(\"should throw error when specified version does not exist\", async () => {\n process.env.APTOS_CLI_VERSION = \"99.99.99\";\n mockFetch.mockResolvedValue({ ok: false });\n\n await expect(getCliVersion(\"Linux-x86_64\")).rejects.toThrow(\n \"Specified version 99.99.99 does not exist\",\n );\n });\n\n it(\"should strip v prefix and validate version\", async () => {\n process.env.APTOS_CLI_VERSION = \"v1.5.0\";\n mockFetch.mockResolvedValue({ ok: true });\n\n const version = await getCliVersion(\"Linux-x86_64\");\n\n expect(version).toBe(\"1.5.0\");\n });\n });\n});\n"]}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { existsSync } from "fs";
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
2
|
import { installCli } from "../tasks/install.js";
|
|
3
3
|
import { runCLI } from "../tasks/run.js";
|
|
4
4
|
import { updateCli } from "../tasks/update.js";
|
|
5
5
|
import { getLocalBinPath } from "./getLocalBinPath.js";
|
|
6
6
|
export const parseCommandOptions = async (options, unknownOptions) => {
|
|
7
7
|
if (options.install) {
|
|
8
|
-
await installCli();
|
|
8
|
+
await installCli(options.directDownload);
|
|
9
9
|
return;
|
|
10
10
|
}
|
|
11
11
|
if (options.update) {
|
|
12
|
-
await updateCli();
|
|
12
|
+
await updateCli(options.directDownload);
|
|
13
13
|
return;
|
|
14
14
|
}
|
|
15
15
|
const path = options.binaryPath || getLocalBinPath();
|
|
16
16
|
if (!options.binaryPath && !existsSync(path)) {
|
|
17
|
-
await installCli();
|
|
17
|
+
await installCli(options.directDownload);
|
|
18
18
|
}
|
|
19
19
|
await runCLI(unknownOptions, options.binaryPath);
|
|
20
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseCommandOptions.js","sourceRoot":"","sources":["../../bin/utils/parseCommandOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"parseCommandOptions.js","sourceRoot":"","sources":["../../bin/utils/parseCommandOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAcvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,OAAuB,EACvB,cAAwB,EACT,EAAE;IAEjB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAGD,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,IAAI,eAAe,EAAE,CAAC;IACrD,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;AACnD,CAAC,CAAC","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { installCli } from \"../tasks/install.js\";\nimport { runCLI } from \"../tasks/run.js\";\nimport { updateCli } from \"../tasks/update.js\";\nimport { getLocalBinPath } from \"./getLocalBinPath.js\";\n\ninterface CommandOptions {\n install: boolean;\n update: boolean;\n binaryPath?: string;\n directDownload?: boolean;\n}\n\n/**\n * Parse and handle command options for the Aptos CLI wrapper.\n * @param options - The parsed command options\n * @param unknownOptions - Additional arguments to pass through to the CLI\n */\nexport const parseCommandOptions = async (\n options: CommandOptions,\n unknownOptions: string[],\n): Promise<void> => {\n // if `--install` flag is set, only install the cli and don't run it\n if (options.install) {\n await installCli(options.directDownload);\n return;\n }\n // if `--update` flag is set, update the cli and don't run it\n if (options.update) {\n await updateCli(options.directDownload);\n return;\n }\n\n // if no flags are set, install and run the cli\n const path = options.binaryPath || getLocalBinPath();\n if (!options.binaryPath && !existsSync(path)) {\n await installCli(options.directDownload);\n }\n await runCLI(unknownOptions, options.binaryPath);\n};\n"]}
|
|
@@ -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":"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","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"]}
|