@aptos-labs/aptos-cli 1.1.1 → 3.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/tasks/install.js +110 -32
- package/dist/tasks/install.js.map +1 -1
- package/dist/tasks/run.js +13 -8
- package/dist/tasks/run.js.map +1 -1
- package/dist/tasks/update.js +56 -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/consts.js.map +1 -1
- package/dist/utils/execSyncShell.js +3 -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 +79 -23
- package/dist/utils/getLocalBinPath.js.map +1 -1
- package/dist/utils/getUserOs.js +78 -6
- package/dist/utils/getUserOs.js.map +1 -1
- package/dist/utils/ghOperations.js +104 -6
- package/dist/utils/ghOperations.js.map +1 -1
- package/dist/utils/parseCommandOptions.js +4 -4
- package/dist/utils/parseCommandOptions.js.map +1 -1
- package/dist/utils/windowsPackageManagers.js +103 -0
- package/dist/utils/windowsPackageManagers.js.map +1 -0
- package/package.json +35 -8
- 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
|
@@ -1,30 +1,86 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
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 { getPlatformInfo } from "./getUserOs.js";
|
|
6
|
+
import { getCliPathChoco, getCliPathWinget, isInstalledViaChoco, isInstalledViaWinget, } from "./windowsPackageManagers.js";
|
|
7
|
+
const getCachePath = () => {
|
|
8
|
+
if (getPlatformInfo().os === "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 } = getPlatformInfo();
|
|
42
|
+
if (os === "windows") {
|
|
43
|
+
return join(homedir(), ".aptoscli", "bin");
|
|
44
|
+
}
|
|
45
|
+
return join(homedir(), ".local", "bin");
|
|
46
|
+
};
|
|
7
47
|
export const getLocalBinPath = () => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
48
|
+
const cached = readCachedBinPath();
|
|
49
|
+
if (cached) {
|
|
50
|
+
return cached;
|
|
51
|
+
}
|
|
52
|
+
const { os } = getPlatformInfo();
|
|
53
|
+
if (os === "macos") {
|
|
54
|
+
if (isInstalledViaBrew()) {
|
|
55
|
+
try {
|
|
56
|
+
const brewPath = getCliPathBrew();
|
|
57
|
+
writeCachedBinPath(brewPath);
|
|
58
|
+
return brewPath;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
}
|
|
14
62
|
}
|
|
15
|
-
|
|
16
|
-
|
|
63
|
+
}
|
|
64
|
+
if (os === "windows") {
|
|
65
|
+
if (isInstalledViaWinget()) {
|
|
66
|
+
const wingetPath = getCliPathWinget();
|
|
67
|
+
if (wingetPath) {
|
|
68
|
+
writeCachedBinPath(wingetPath);
|
|
69
|
+
return wingetPath;
|
|
70
|
+
}
|
|
17
71
|
}
|
|
18
|
-
|
|
19
|
-
|
|
72
|
+
if (isInstalledViaChoco()) {
|
|
73
|
+
const chocoPath = getCliPathChoco();
|
|
74
|
+
if (chocoPath) {
|
|
75
|
+
writeCachedBinPath(chocoPath);
|
|
76
|
+
return chocoPath;
|
|
77
|
+
}
|
|
20
78
|
}
|
|
21
79
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
return path;
|
|
80
|
+
const binDir = getBinDir();
|
|
81
|
+
const binaryName = os === "windows" ? "aptos.exe" : "aptos";
|
|
82
|
+
const defaultPath = join(binDir, binaryName);
|
|
83
|
+
writeCachedBinPath(defaultPath);
|
|
84
|
+
return defaultPath;
|
|
29
85
|
};
|
|
30
86
|
//# sourceMappingURL=getLocalBinPath.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLocalBinPath.js","sourceRoot":"","sources":["../../bin/utils/getLocalBinPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,
|
|
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 { getPlatformInfo } 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 (getPlatformInfo().os === \"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 } = getPlatformInfo();\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 } = getPlatformInfo();\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"]}
|
package/dist/utils/getUserOs.js
CHANGED
|
@@ -1,15 +1,87 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { arch, platform } from "node:os";
|
|
3
|
+
export const getPlatformInfo = () => {
|
|
3
4
|
const osPlatform = platform();
|
|
5
|
+
const osArch = arch();
|
|
6
|
+
let os;
|
|
4
7
|
switch (osPlatform) {
|
|
5
8
|
case "darwin":
|
|
6
|
-
|
|
9
|
+
os = "macos";
|
|
10
|
+
break;
|
|
7
11
|
case "linux":
|
|
8
|
-
|
|
12
|
+
os = "linux";
|
|
13
|
+
break;
|
|
9
14
|
case "win32":
|
|
10
|
-
|
|
15
|
+
os = "windows";
|
|
16
|
+
break;
|
|
11
17
|
default:
|
|
12
|
-
throw new Error(`Unsupported
|
|
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
|
+
return "Windows-x86_64";
|
|
83
|
+
default:
|
|
84
|
+
throw new Error(`Unsupported OS: ${os}`);
|
|
13
85
|
}
|
|
14
86
|
};
|
|
15
87
|
//# sourceMappingURL=getUserOs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getUserOs.js","sourceRoot":"","sources":["../../bin/utils/getUserOs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"getUserOs.js","sourceRoot":"","sources":["../../bin/utils/getUserOs.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { arch, platform } from \"node:os\";\n\nexport type SupportedOS = \"macos\" | \"linux\" | \"windows\";\nexport type SupportedArch = \"x86_64\" | \"aarch64\";\n\nexport interface PlatformInfo {\n os: SupportedOS;\n arch: SupportedArch;\n}\n\n/**\n * Target strings that match the official Aptos CLI release artifacts.\n * These are derived from the official install scripts at:\n * - https://aptos.dev/scripts/install_cli.sh\n * - https://aptos.dev/scripts/install_cli.ps1\n */\nexport type TargetPlatform =\n | \"macos-x86_64\"\n | \"macos-arm64\"\n | \"Ubuntu-22.04-x86_64\"\n | \"Ubuntu-24.04-x86_64\"\n | \"Linux-x86_64\"\n | \"Linux-aarch64\"\n | \"Windows-x86_64\";\n\n/**\n * Get basic OS and architecture information.\n */\nexport const getPlatformInfo = (): PlatformInfo => {\n const osPlatform = platform();\n const osArch = arch();\n\n let os: SupportedOS;\n switch (osPlatform) {\n case \"darwin\":\n os = \"macos\";\n break;\n case \"linux\":\n os = \"linux\";\n break;\n case \"win32\":\n os = \"windows\";\n break;\n default:\n throw new Error(`Unsupported operating system: ${osPlatform}`);\n }\n\n let architecture: SupportedArch;\n switch (osArch) {\n case \"x64\":\n case \"x86_64\":\n architecture = \"x86_64\";\n break;\n case \"arm64\":\n case \"aarch64\":\n architecture = \"aarch64\";\n break;\n default:\n throw new Error(`Unsupported architecture: ${osArch}`);\n }\n\n return { os, arch: architecture };\n};\n\n/**\n * Parse /etc/os-release file to get distribution info.\n * Returns null if file doesn't exist or can't be parsed.\n */\nconst getLinuxDistroInfo = (): { id: string; versionId: string } | null => {\n const osReleasePath = \"/etc/os-release\";\n if (!existsSync(osReleasePath)) {\n return null;\n }\n\n try {\n const content = readFileSync(osReleasePath, \"utf8\");\n const lines = content.split(\"\\n\");\n\n let id = \"\";\n let versionId = \"\";\n\n for (const line of lines) {\n const [key, ...valueParts] = line.split(\"=\");\n const value = valueParts.join(\"=\").replace(/^[\"']|[\"']$/g, \"\");\n\n if (key === \"ID\") {\n id = value.toLowerCase();\n } else if (key === \"VERSION_ID\") {\n versionId = value;\n }\n }\n\n return { id, versionId };\n } catch {\n return null;\n }\n};\n\n/**\n * Determine the target platform string for downloading the CLI binary.\n * This matches the naming convention used in official Aptos CLI releases.\n */\nexport const getTargetPlatform = (): TargetPlatform => {\n const { os, arch: architecture } = getPlatformInfo();\n\n switch (os) {\n case \"macos\":\n // macOS supports both x86_64 and arm64\n return architecture === \"aarch64\" ? \"macos-arm64\" : \"macos-x86_64\";\n\n case \"linux\": {\n // Check for ARM64 first\n if (architecture === \"aarch64\") {\n return \"Linux-aarch64\";\n }\n\n // For x86_64, check if we're on Ubuntu and what version\n const distroInfo = getLinuxDistroInfo();\n if (distroInfo?.id === \"ubuntu\") {\n if (distroInfo.versionId.startsWith(\"24.04\")) {\n return \"Ubuntu-24.04-x86_64\";\n }\n if (distroInfo.versionId.startsWith(\"22.04\")) {\n return \"Ubuntu-22.04-x86_64\";\n }\n }\n\n // Default to generic Linux for non-Ubuntu or older Ubuntu versions\n return \"Linux-x86_64\";\n }\n\n case \"windows\":\n // Windows ARM64 uses x86_64 binary via built-in emulation\n return \"Windows-x86_64\";\n\n default:\n throw new Error(`Unsupported OS: ${os}`);\n }\n};\n"]}
|
|
@@ -1,12 +1,110 @@
|
|
|
1
|
-
import { PNAME } from "./consts.js";
|
|
1
|
+
import { GH_CLI_DOWNLOAD_URL, PNAME } from "./consts.js";
|
|
2
|
+
const getGitHubHeaders = () => {
|
|
3
|
+
const headers = {
|
|
4
|
+
Accept: "application/vnd.github.v3+json",
|
|
5
|
+
"User-Agent": "aptos-cli-npm",
|
|
6
|
+
};
|
|
7
|
+
const token = process.env.GITHUB_TOKEN;
|
|
8
|
+
if (token) {
|
|
9
|
+
headers.Authorization = `Bearer ${token}`;
|
|
10
|
+
}
|
|
11
|
+
return headers;
|
|
12
|
+
};
|
|
13
|
+
export const getUserSpecifiedVersion = () => {
|
|
14
|
+
const version = process.env.APTOS_CLI_VERSION;
|
|
15
|
+
if (!version) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const stripped = version.replace(/^v/, "");
|
|
19
|
+
if (!/^\d+\.\d+\.\d+(-[a-zA-Z0-9.]+)?$/.test(stripped)) {
|
|
20
|
+
throw new Error(`Invalid APTOS_CLI_VERSION: "${version}". Must match MAJOR.MINOR.PATCH (e.g. "4.5.0" or "v4.5.0").`);
|
|
21
|
+
}
|
|
22
|
+
return stripped;
|
|
23
|
+
};
|
|
24
|
+
export const hasUserSpecifiedVersion = () => {
|
|
25
|
+
return !!process.env.APTOS_CLI_VERSION;
|
|
26
|
+
};
|
|
27
|
+
export const validateVersionExists = async (version, targetPlatform) => {
|
|
28
|
+
const url = `${GH_CLI_DOWNLOAD_URL}/${PNAME}-v${version}/${PNAME}-${version}-${targetPlatform}.zip`;
|
|
29
|
+
try {
|
|
30
|
+
const response = await fetch(url, {
|
|
31
|
+
method: "HEAD",
|
|
32
|
+
headers: getGitHubHeaders(),
|
|
33
|
+
});
|
|
34
|
+
return response.ok;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
export const getCliVersion = async (targetPlatform) => {
|
|
41
|
+
const userVersion = getUserSpecifiedVersion();
|
|
42
|
+
if (userVersion) {
|
|
43
|
+
if (targetPlatform) {
|
|
44
|
+
const exists = await validateVersionExists(userVersion, targetPlatform);
|
|
45
|
+
if (!exists) {
|
|
46
|
+
throw new Error(`Specified version ${userVersion} does not exist or is not available for ${targetPlatform}. ` +
|
|
47
|
+
`Check https://github.com/aptos-labs/aptos-core/releases for available versions.`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return userVersion;
|
|
51
|
+
}
|
|
52
|
+
return getLatestVersionGh();
|
|
53
|
+
};
|
|
2
54
|
export const getLatestVersionGh = async () => {
|
|
3
55
|
const prefix = `${PNAME}-v`;
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
56
|
+
const url = "https://api.github.com/repos/aptos-labs/aptos-core/releases?per_page=100";
|
|
57
|
+
let response;
|
|
58
|
+
try {
|
|
59
|
+
response = await fetch(url, { headers: getGitHubHeaders() });
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
throw new Error(`Failed to fetch releases from GitHub: ${error instanceof Error ? error.message : String(error)}`);
|
|
63
|
+
}
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
if (response.status === 403 || response.status === 429) {
|
|
66
|
+
throw new Error("GitHub API rate limit exceeded. Please try again later or set a GITHUB_TOKEN environment variable.");
|
|
67
|
+
}
|
|
68
|
+
throw new Error(`GitHub API request failed with status ${response.status}: ${response.statusText}`);
|
|
69
|
+
}
|
|
70
|
+
let releases;
|
|
71
|
+
try {
|
|
72
|
+
releases = await response.json();
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
throw new Error("Failed to parse GitHub API response as JSON");
|
|
76
|
+
}
|
|
77
|
+
if (!Array.isArray(releases)) {
|
|
78
|
+
throw new Error("Unexpected response format from GitHub API");
|
|
79
|
+
}
|
|
80
|
+
for (const release of releases) {
|
|
81
|
+
if (release.tag_name?.startsWith(prefix)) {
|
|
82
|
+
return release.tag_name.replace(prefix, "");
|
|
8
83
|
}
|
|
9
84
|
}
|
|
10
|
-
throw "Could not determine latest version of Aptos CLI";
|
|
85
|
+
throw new Error("Could not determine latest version of Aptos CLI. No matching release found in the last 100 releases.");
|
|
86
|
+
};
|
|
87
|
+
export const getAssetDigest = async (version, assetName) => {
|
|
88
|
+
const tag = `${PNAME}-v${version}`;
|
|
89
|
+
const url = `https://api.github.com/repos/aptos-labs/aptos-core/releases/tags/${tag}`;
|
|
90
|
+
try {
|
|
91
|
+
const response = await fetch(url, { headers: getGitHubHeaders() });
|
|
92
|
+
if (!response.ok) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
const release = await response.json();
|
|
96
|
+
const asset = release.assets?.find((a) => a.name === assetName);
|
|
97
|
+
if (!asset?.digest) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const digest = asset.digest;
|
|
101
|
+
if (digest.startsWith("sha256:")) {
|
|
102
|
+
return digest.slice(7);
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
11
109
|
};
|
|
12
110
|
//# sourceMappingURL=ghOperations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ghOperations.js","sourceRoot":"","sources":["../../bin/utils/ghOperations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ghOperations.js","sourceRoot":"","sources":["../../bin/utils/ghOperations.ts"],"names":[],"mappings":"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","sourcesContent":["import { GH_CLI_DOWNLOAD_URL, PNAME } from \"./consts.js\";\n\ninterface GitHubAsset {\n name: string;\n digest: string | null;\n [key: string]: unknown;\n}\n\ninterface GitHubRelease {\n tag_name: string;\n assets?: GitHubAsset[];\n [key: string]: unknown;\n}\n\n/**\n * Build headers for GitHub API requests.\n * Uses GITHUB_TOKEN environment variable if available for authenticated requests.\n */\nconst getGitHubHeaders = (): Record<string, string> => {\n const headers: Record<string, string> = {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": \"aptos-cli-npm\",\n };\n\n // Use GITHUB_TOKEN if available for higher rate limits\n const token = process.env.GITHUB_TOKEN;\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n return headers;\n};\n\n/**\n * Get the user-specified CLI version from environment variable.\n * Returns undefined if not set.\n */\nexport const getUserSpecifiedVersion = (): string | undefined => {\n const version = process.env.APTOS_CLI_VERSION;\n if (!version) {\n return undefined;\n }\n // Strip 'v' prefix if present (e.g., \"v1.2.3\" -> \"1.2.3\")\n const stripped = version.replace(/^v/, \"\");\n if (!/^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.]+)?$/.test(stripped)) {\n throw new Error(\n `Invalid APTOS_CLI_VERSION: \"${version}\". Must match MAJOR.MINOR.PATCH (e.g. \"4.5.0\" or \"v4.5.0\").`,\n );\n }\n return stripped;\n};\n\n/**\n * Check if a user has specified a CLI version via environment variable.\n */\nexport const hasUserSpecifiedVersion = (): boolean => {\n return !!process.env.APTOS_CLI_VERSION;\n};\n\n/**\n * Validate that a specific version exists by checking if the release assets are accessible.\n * Uses a HEAD request to avoid downloading the actual file.\n *\n * @param version - The version to validate (without 'v' prefix)\n * @param targetPlatform - The target platform string (e.g., \"Ubuntu-22.04-x86_64\")\n */\nexport const validateVersionExists = async (\n version: string,\n targetPlatform: string,\n): Promise<boolean> => {\n const url = `${GH_CLI_DOWNLOAD_URL}/${PNAME}-v${version}/${PNAME}-${version}-${targetPlatform}.zip`;\n\n try {\n const response = await fetch(url, {\n method: \"HEAD\",\n headers: getGitHubHeaders(),\n });\n return response.ok;\n } catch {\n return false;\n }\n};\n\n/**\n * Get the CLI version to use.\n * If APTOS_CLI_VERSION is set, returns that version (after validation).\n * Otherwise, returns the latest version from GitHub.\n *\n * @param targetPlatform - Optional target platform for version validation\n */\nexport const getCliVersion = async (\n targetPlatform?: string,\n): Promise<string> => {\n const userVersion = getUserSpecifiedVersion();\n\n if (userVersion) {\n // If a target platform is provided, validate the version exists\n if (targetPlatform) {\n const exists = await validateVersionExists(userVersion, targetPlatform);\n if (!exists) {\n throw new Error(\n `Specified version ${userVersion} does not exist or is not available for ${targetPlatform}. ` +\n `Check https://github.com/aptos-labs/aptos-core/releases for available versions.`,\n );\n }\n }\n return userVersion;\n }\n\n return getLatestVersionGh();\n};\n\n/**\n * Query the GitHub API to find the latest CLI release. We assume that the CLI is in\n * the last 100 releases so we don't paginate through the releases.\n *\n * Set GITHUB_TOKEN environment variable for higher rate limits.\n */\nexport const getLatestVersionGh = async (): Promise<string> => {\n const prefix = `${PNAME}-v`;\n const url =\n \"https://api.github.com/repos/aptos-labs/aptos-core/releases?per_page=100\";\n\n let response: Response;\n try {\n response = await fetch(url, { headers: getGitHubHeaders() });\n } catch (error) {\n throw new Error(\n `Failed to fetch releases from GitHub: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n if (!response.ok) {\n if (response.status === 403 || response.status === 429) {\n throw new Error(\n \"GitHub API rate limit exceeded. Please try again later or set a GITHUB_TOKEN environment variable.\",\n );\n }\n throw new Error(\n `GitHub API request failed with status ${response.status}: ${response.statusText}`,\n );\n }\n\n let releases: GitHubRelease[];\n try {\n releases = await response.json();\n } catch {\n throw new Error(\"Failed to parse GitHub API response as JSON\");\n }\n\n if (!Array.isArray(releases)) {\n throw new Error(\"Unexpected response format from GitHub API\");\n }\n\n for (const release of releases) {\n if (release.tag_name?.startsWith(prefix)) {\n return release.tag_name.replace(prefix, \"\");\n }\n }\n\n throw new Error(\n \"Could not determine latest version of Aptos CLI. No matching release found in the last 100 releases.\",\n );\n};\n\n/**\n * Fetch the SHA256 digest for a specific release asset from the GitHub API.\n * Returns the hex digest string, or null if unavailable.\n */\nexport const getAssetDigest = async (\n version: string,\n assetName: string,\n): Promise<string | null> => {\n const tag = `${PNAME}-v${version}`;\n const url = `https://api.github.com/repos/aptos-labs/aptos-core/releases/tags/${tag}`;\n\n try {\n const response = await fetch(url, { headers: getGitHubHeaders() });\n if (!response.ok) {\n return null;\n }\n\n const release: GitHubRelease = await response.json();\n const asset = release.assets?.find((a) => a.name === assetName);\n if (!asset?.digest) {\n return null;\n }\n\n // Digest format is \"sha256:<hex>\" — strip the prefix\n const digest = asset.digest;\n if (digest.startsWith(\"sha256:\")) {\n return digest.slice(7);\n }\n return null;\n } catch {\n return null;\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,103 @@
|
|
|
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 localAppData = process.env.LOCALAPPDATA;
|
|
42
|
+
const programFiles = process.env.PROGRAMFILES;
|
|
43
|
+
const possiblePaths = [
|
|
44
|
+
localAppData &&
|
|
45
|
+
`${localAppData}\\Microsoft\\WinGet\\Packages\\Aptos.Aptos_Microsoft.Winget.Source_8wekyb3d8bbwe\\aptos.exe`,
|
|
46
|
+
programFiles && `${programFiles}\\Aptos\\aptos.exe`,
|
|
47
|
+
localAppData && `${localAppData}\\Aptos\\aptos.exe`,
|
|
48
|
+
];
|
|
49
|
+
for (const path of possiblePaths) {
|
|
50
|
+
if (path && existsSync(path)) {
|
|
51
|
+
return path;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const output = execSync("where aptos", {
|
|
56
|
+
encoding: "utf8",
|
|
57
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
58
|
+
}).trim();
|
|
59
|
+
if (output && existsSync(output.split("\n")[0])) {
|
|
60
|
+
return output.split("\n")[0];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
};
|
|
67
|
+
export const getCliPathChoco = () => {
|
|
68
|
+
const chocoPath = `${process.env.ChocolateyInstall || "C:\\ProgramData\\chocolatey"}\\bin\\aptos.exe`;
|
|
69
|
+
if (existsSync(chocoPath)) {
|
|
70
|
+
return chocoPath;
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
};
|
|
74
|
+
export const installViaWinget = () => {
|
|
75
|
+
console.log("Installing Aptos CLI via winget...");
|
|
76
|
+
execSync("winget install --id Aptos.Aptos --silent --accept-package-agreements --accept-source-agreements", {
|
|
77
|
+
stdio: "inherit",
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
export const installViaChoco = () => {
|
|
81
|
+
console.log("Installing Aptos CLI via Chocolatey...");
|
|
82
|
+
execSync("choco install aptos -y", { stdio: "inherit" });
|
|
83
|
+
};
|
|
84
|
+
export const updateViaWinget = () => {
|
|
85
|
+
console.log("Updating Aptos CLI via winget...");
|
|
86
|
+
execSync("winget upgrade --id Aptos.Aptos --silent --accept-package-agreements --accept-source-agreements", {
|
|
87
|
+
stdio: "inherit",
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
export const updateViaChoco = () => {
|
|
91
|
+
console.log("Updating Aptos CLI via Chocolatey...");
|
|
92
|
+
execSync("choco upgrade aptos -y", { stdio: "inherit" });
|
|
93
|
+
};
|
|
94
|
+
export const detectWindowsPackageManager = () => {
|
|
95
|
+
if (isInstalledViaWinget()) {
|
|
96
|
+
return "winget";
|
|
97
|
+
}
|
|
98
|
+
if (isInstalledViaChoco()) {
|
|
99
|
+
return "choco";
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
};
|
|
103
|
+
//# 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 localAppData = process.env.LOCALAPPDATA;\n const programFiles = process.env.PROGRAMFILES;\n const possiblePaths = [\n localAppData &&\n `${localAppData}\\\\Microsoft\\\\WinGet\\\\Packages\\\\Aptos.Aptos_Microsoft.Winget.Source_8wekyb3d8bbwe\\\\aptos.exe`,\n programFiles && `${programFiles}\\\\Aptos\\\\aptos.exe`,\n localAppData && `${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"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aptos-labs/aptos-cli",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Aptos CLI available from npmjs",
|
|
5
|
+
"packageManager": "pnpm@10.30.1",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=22"
|
|
8
|
+
},
|
|
5
9
|
"bin": {
|
|
6
10
|
"aptos": "./dist/aptos.js"
|
|
7
11
|
},
|
|
@@ -20,19 +24,42 @@
|
|
|
20
24
|
},
|
|
21
25
|
"license": "Apache-2.0",
|
|
22
26
|
"scripts": {
|
|
23
|
-
"clean": "
|
|
24
|
-
"build": "
|
|
25
|
-
"dev": "
|
|
27
|
+
"clean": "node -e \"import('node:fs').then(({rmSync})=>rmSync('dist',{recursive:true,force:true})).catch(e=>{console.error(e);process.exit(1)})\"",
|
|
28
|
+
"build": "pnpm run clean && tsc",
|
|
29
|
+
"dev": "pnpm run build && node ./dist/aptos.js",
|
|
30
|
+
"test": "vitest run",
|
|
31
|
+
"test:watch": "vitest",
|
|
32
|
+
"check": "biome check",
|
|
33
|
+
"check:fix": "biome check --fix",
|
|
34
|
+
"format": "biome format --fix"
|
|
26
35
|
},
|
|
36
|
+
"os": [
|
|
37
|
+
"darwin",
|
|
38
|
+
"linux",
|
|
39
|
+
"win32"
|
|
40
|
+
],
|
|
41
|
+
"cpu": [
|
|
42
|
+
"x64",
|
|
43
|
+
"arm64"
|
|
44
|
+
],
|
|
45
|
+
"sideEffects": false,
|
|
46
|
+
"exports": {},
|
|
27
47
|
"files": [
|
|
28
|
-
"bin",
|
|
29
48
|
"dist"
|
|
30
49
|
],
|
|
31
50
|
"dependencies": {
|
|
32
|
-
"commander": "^
|
|
51
|
+
"commander": "^14.0.3"
|
|
33
52
|
},
|
|
34
53
|
"devDependencies": {
|
|
35
|
-
"@
|
|
36
|
-
"
|
|
54
|
+
"@biomejs/biome": "^2.4.6",
|
|
55
|
+
"@types/node": "^22",
|
|
56
|
+
"typescript": "^6.0.2",
|
|
57
|
+
"vitest": "^4.0.18"
|
|
58
|
+
},
|
|
59
|
+
"pnpm": {
|
|
60
|
+
"overrides": {
|
|
61
|
+
"picomatch": ">=4.0.4",
|
|
62
|
+
"vite": ">=7.3.2"
|
|
63
|
+
}
|
|
37
64
|
}
|
|
38
65
|
}
|
package/bin/.gitkeep
DELETED
|
File without changes
|