@aptos-labs/aptos-cli
Advanced tools
| import { existsSync, readFileSync } from "node:fs"; | ||
| import { join } from "node:path"; | ||
| import { describe, expect, it } from "vitest"; | ||
| const WORKSPACE_ROOT = join(__dirname, "../.."); | ||
| const EXAMPLES_DIR = join(WORKSPACE_ROOT, "examples"); | ||
| const HELLO_BLOCKCHAIN_DIR = join(EXAMPLES_DIR, "hello_blockchain"); | ||
| describe("Example Move Projects", () => { | ||
| describe("hello_blockchain example", () => { | ||
| it("should have Move.toml configuration file", () => { | ||
| const moveTomlPath = join(HELLO_BLOCKCHAIN_DIR, "Move.toml"); | ||
| expect(existsSync(moveTomlPath)).toBe(true); | ||
| const content = readFileSync(moveTomlPath, "utf-8"); | ||
| expect(content).toContain("[package]"); | ||
| expect(content).toContain('name = "HelloBlockchain"'); | ||
| expect(content).toContain("[addresses]"); | ||
| expect(content).toContain("hello_blockchain"); | ||
| expect(content).toContain("[dependencies.AptosFramework]"); | ||
| }); | ||
| it("should have source files", () => { | ||
| const sourcesDir = join(HELLO_BLOCKCHAIN_DIR, "sources"); | ||
| expect(existsSync(sourcesDir)).toBe(true); | ||
| const messageMovePath = join(sourcesDir, "message.move"); | ||
| expect(existsSync(messageMovePath)).toBe(true); | ||
| }); | ||
| it("should have valid Move module structure", () => { | ||
| const messageMovePath = join(HELLO_BLOCKCHAIN_DIR, "sources/message.move"); | ||
| const content = readFileSync(messageMovePath, "utf-8"); | ||
| expect(content).toContain("module hello_blockchain::message"); | ||
| expect(content).toContain("public entry fun"); | ||
| expect(content).toContain("has key"); | ||
| expect(content).toContain("#[test"); | ||
| }); | ||
| }); | ||
| }); | ||
| describe("Build Move Artifacts Workflow", () => { | ||
| const workflowPath = join(WORKSPACE_ROOT, ".github/workflows/build-move-artifacts.yaml"); | ||
| it("should have the workflow file", () => { | ||
| expect(existsSync(workflowPath)).toBe(true); | ||
| }); | ||
| it("should contain required workflow configuration", () => { | ||
| const content = readFileSync(workflowPath, "utf-8"); | ||
| expect(content).toContain("name: Build Move Artifacts"); | ||
| expect(content).toContain("on:"); | ||
| expect(content).toContain("jobs:"); | ||
| expect(content).toContain("Install Aptos CLI"); | ||
| expect(content).toContain("--install"); | ||
| expect(content).toContain("Build Move package"); | ||
| expect(content).toContain("move compile"); | ||
| expect(content).toContain("--named-addresses"); | ||
| expect(content).toContain("--save-metadata"); | ||
| expect(content).toContain("Generate publish payload"); | ||
| expect(content).toContain("build-publish-payload"); | ||
| expect(content).toContain("--json-output-file"); | ||
| expect(content).toContain("Upload build artifacts"); | ||
| expect(content).toContain("actions/upload-artifact"); | ||
| }); | ||
| it("should have artifact download job for downstream usage", () => { | ||
| const content = readFileSync(workflowPath, "utf-8"); | ||
| expect(content).toContain("use-artifacts"); | ||
| expect(content).toContain("needs: build-artifacts"); | ||
| expect(content).toContain("actions/download-artifact"); | ||
| }); | ||
| it("should demonstrate upgrade payload generation", () => { | ||
| const content = readFileSync(workflowPath, "utf-8"); | ||
| expect(content).toContain("build-upgrade-payload"); | ||
| expect(content).toContain("--object-address"); | ||
| }); | ||
| }); | ||
| //# sourceMappingURL=examples.test.js.map |
| {"version":3,"file":"examples.test.js","sourceRoot":"","sources":["../../bin/examples/examples.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { describe, expect, it } from \"vitest\";\n\nconst WORKSPACE_ROOT = join(__dirname, \"../..\");\nconst EXAMPLES_DIR = join(WORKSPACE_ROOT, \"examples\");\nconst HELLO_BLOCKCHAIN_DIR = join(EXAMPLES_DIR, \"hello_blockchain\");\n\ndescribe(\"Example Move Projects\", () => {\n describe(\"hello_blockchain example\", () => {\n it(\"should have Move.toml configuration file\", () => {\n const moveTomlPath = join(HELLO_BLOCKCHAIN_DIR, \"Move.toml\");\n expect(existsSync(moveTomlPath)).toBe(true);\n\n const content = readFileSync(moveTomlPath, \"utf-8\");\n expect(content).toContain(\"[package]\");\n expect(content).toContain('name = \"HelloBlockchain\"');\n expect(content).toContain(\"[addresses]\");\n expect(content).toContain(\"hello_blockchain\");\n expect(content).toContain(\"[dependencies.AptosFramework]\");\n });\n\n it(\"should have source files\", () => {\n const sourcesDir = join(HELLO_BLOCKCHAIN_DIR, \"sources\");\n expect(existsSync(sourcesDir)).toBe(true);\n\n const messageMovePath = join(sourcesDir, \"message.move\");\n expect(existsSync(messageMovePath)).toBe(true);\n });\n\n it(\"should have valid Move module structure\", () => {\n const messageMovePath = join(\n HELLO_BLOCKCHAIN_DIR,\n \"sources/message.move\",\n );\n const content = readFileSync(messageMovePath, \"utf-8\");\n\n // Verify module declaration\n expect(content).toContain(\"module hello_blockchain::message\");\n\n // Verify it has required components for a deployable module\n expect(content).toContain(\"public entry fun\");\n expect(content).toContain(\"has key\");\n\n // Verify it has a test\n expect(content).toContain(\"#[test\");\n });\n });\n});\n\ndescribe(\"Build Move Artifacts Workflow\", () => {\n const workflowPath = join(\n WORKSPACE_ROOT,\n \".github/workflows/build-move-artifacts.yaml\",\n );\n\n it(\"should have the workflow file\", () => {\n expect(existsSync(workflowPath)).toBe(true);\n });\n\n it(\"should contain required workflow configuration\", () => {\n const content = readFileSync(workflowPath, \"utf-8\");\n\n // Verify workflow structure\n expect(content).toContain(\"name: Build Move Artifacts\");\n expect(content).toContain(\"on:\");\n expect(content).toContain(\"jobs:\");\n\n // Verify it installs the CLI\n expect(content).toContain(\"Install Aptos CLI\");\n expect(content).toContain(\"--install\");\n\n // Verify it builds Move package\n expect(content).toContain(\"Build Move package\");\n expect(content).toContain(\"move compile\");\n expect(content).toContain(\"--named-addresses\");\n expect(content).toContain(\"--save-metadata\");\n\n // Verify it generates publish payload\n expect(content).toContain(\"Generate publish payload\");\n expect(content).toContain(\"build-publish-payload\");\n expect(content).toContain(\"--json-output-file\");\n\n // Verify artifact upload step\n expect(content).toContain(\"Upload build artifacts\");\n expect(content).toContain(\"actions/upload-artifact\");\n });\n\n it(\"should have artifact download job for downstream usage\", () => {\n const content = readFileSync(workflowPath, \"utf-8\");\n\n // Verify there's a job that uses artifacts\n expect(content).toContain(\"use-artifacts\");\n expect(content).toContain(\"needs: build-artifacts\");\n expect(content).toContain(\"actions/download-artifact\");\n });\n\n it(\"should demonstrate upgrade payload generation\", () => {\n const content = readFileSync(workflowPath, \"utf-8\");\n\n // Verify upgrade payload example is present\n expect(content).toContain(\"build-upgrade-payload\");\n expect(content).toContain(\"--object-address\");\n });\n});\n"]} |
| import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; | ||
| vi.mock("child_process", () => ({ | ||
| execSync: vi.fn(), | ||
| })); | ||
| vi.mock("fs", () => ({ | ||
| existsSync: vi.fn(), | ||
| chmodSync: vi.fn(), | ||
| mkdirSync: vi.fn(), | ||
| })); | ||
| vi.mock("os", () => ({ | ||
| tmpdir: () => "/tmp", | ||
| homedir: () => "/home/user", | ||
| platform: vi.fn(() => "linux"), | ||
| arch: vi.fn(() => "x64"), | ||
| })); | ||
| vi.mock("../utils/getUserOs.js", () => ({ | ||
| getOS: vi.fn(), | ||
| getTargetPlatform: vi.fn(), | ||
| })); | ||
| vi.mock("../utils/getLocalBinPath.js", () => ({ | ||
| getLocalBinPath: vi.fn(), | ||
| getBinDir: vi.fn(), | ||
| invalidateBinPathCache: vi.fn(), | ||
| })); | ||
| vi.mock("../utils/ghOperations.js", () => ({ | ||
| getCliVersion: vi.fn(), | ||
| hasUserSpecifiedVersion: vi.fn(), | ||
| })); | ||
| vi.mock("../utils/brewOperations.js", () => ({ | ||
| isBrewAvailable: vi.fn(), | ||
| isInstalledViaBrew: vi.fn(), | ||
| installViaBrew: vi.fn(), | ||
| })); | ||
| vi.mock("../utils/windowsPackageManagers.js", () => ({ | ||
| isWingetAvailable: vi.fn(), | ||
| isChocoAvailable: vi.fn(), | ||
| isInstalledViaWinget: vi.fn(), | ||
| isInstalledViaChoco: vi.fn(), | ||
| installViaWinget: vi.fn(), | ||
| installViaChoco: vi.fn(), | ||
| })); | ||
| import { execSync } from "node:child_process"; | ||
| import { existsSync, mkdirSync } from "node:fs"; | ||
| import { installViaBrew, isBrewAvailable, isInstalledViaBrew, } from "../utils/brewOperations.js"; | ||
| import { getBinDir, getLocalBinPath } from "../utils/getLocalBinPath.js"; | ||
| import { getOS, getTargetPlatform } from "../utils/getUserOs.js"; | ||
| import { getCliVersion, hasUserSpecifiedVersion, } from "../utils/ghOperations.js"; | ||
| import { installViaChoco, installViaWinget, isChocoAvailable, isInstalledViaChoco, isInstalledViaWinget, isWingetAvailable, } from "../utils/windowsPackageManagers.js"; | ||
| import { installCli } from "./install.js"; | ||
| describe("install", () => { | ||
| beforeEach(() => { | ||
| vi.clearAllMocks(); | ||
| vi.mocked(getLocalBinPath).mockReturnValue("/home/user/.local/bin/aptos"); | ||
| vi.mocked(getBinDir).mockReturnValue("/home/user/.local/bin"); | ||
| vi.mocked(getCliVersion).mockResolvedValue("1.0.0"); | ||
| vi.mocked(hasUserSpecifiedVersion).mockReturnValue(false); | ||
| vi.mocked(getTargetPlatform).mockReturnValue("Linux-x86_64"); | ||
| }); | ||
| afterEach(() => { | ||
| vi.restoreAllMocks(); | ||
| }); | ||
| describe("macOS with Homebrew", () => { | ||
| beforeEach(() => { | ||
| vi.mocked(getOS).mockReturnValue("MacOS"); | ||
| vi.mocked(isBrewAvailable).mockReturnValue(true); | ||
| }); | ||
| it("should use Homebrew when available", async () => { | ||
| vi.mocked(isInstalledViaBrew).mockReturnValue(false); | ||
| await installCli(); | ||
| expect(installViaBrew).toHaveBeenCalled(); | ||
| expect(execSync).not.toHaveBeenCalled(); | ||
| }); | ||
| it("should skip if already installed via Homebrew", async () => { | ||
| vi.mocked(isInstalledViaBrew).mockReturnValue(true); | ||
| await installCli(); | ||
| expect(installViaBrew).not.toHaveBeenCalled(); | ||
| }); | ||
| it("should skip Homebrew when directDownload is true", async () => { | ||
| vi.mocked(isInstalledViaBrew).mockReturnValue(false); | ||
| vi.mocked(existsSync).mockReturnValue(false); | ||
| vi.mocked(execSync).mockReturnValue(Buffer.from("")); | ||
| vi.mocked(getTargetPlatform).mockReturnValue("macos-x86_64"); | ||
| await installCli(true); | ||
| expect(installViaBrew).not.toHaveBeenCalled(); | ||
| expect(execSync).toHaveBeenCalled(); | ||
| }); | ||
| }); | ||
| describe("Windows with winget", () => { | ||
| beforeEach(() => { | ||
| vi.mocked(getOS).mockReturnValue("Windows"); | ||
| vi.mocked(isBrewAvailable).mockReturnValue(false); | ||
| vi.mocked(isWingetAvailable).mockReturnValue(true); | ||
| vi.mocked(isChocoAvailable).mockReturnValue(false); | ||
| }); | ||
| it("should use winget when available", async () => { | ||
| vi.mocked(isInstalledViaWinget).mockReturnValue(false); | ||
| await installCli(); | ||
| expect(installViaWinget).toHaveBeenCalled(); | ||
| expect(installViaChoco).not.toHaveBeenCalled(); | ||
| }); | ||
| it("should skip if already installed via winget", async () => { | ||
| vi.mocked(isInstalledViaWinget).mockReturnValue(true); | ||
| await installCli(); | ||
| expect(installViaWinget).not.toHaveBeenCalled(); | ||
| }); | ||
| }); | ||
| describe("Windows with Chocolatey", () => { | ||
| beforeEach(() => { | ||
| vi.mocked(getOS).mockReturnValue("Windows"); | ||
| vi.mocked(isBrewAvailable).mockReturnValue(false); | ||
| vi.mocked(isWingetAvailable).mockReturnValue(false); | ||
| vi.mocked(isChocoAvailable).mockReturnValue(true); | ||
| }); | ||
| it("should use Chocolatey when winget is not available", async () => { | ||
| vi.mocked(isInstalledViaChoco).mockReturnValue(false); | ||
| await installCli(); | ||
| expect(installViaChoco).toHaveBeenCalled(); | ||
| expect(installViaWinget).not.toHaveBeenCalled(); | ||
| }); | ||
| it("should skip if already installed via Chocolatey", async () => { | ||
| vi.mocked(isInstalledViaChoco).mockReturnValue(true); | ||
| await installCli(); | ||
| expect(installViaChoco).not.toHaveBeenCalled(); | ||
| }); | ||
| }); | ||
| describe("Windows direct download", () => { | ||
| beforeEach(() => { | ||
| vi.mocked(getOS).mockReturnValue("Windows"); | ||
| vi.mocked(isBrewAvailable).mockReturnValue(false); | ||
| vi.mocked(isWingetAvailable).mockReturnValue(false); | ||
| vi.mocked(isChocoAvailable).mockReturnValue(false); | ||
| vi.mocked(existsSync).mockReturnValue(false); | ||
| vi.mocked(getTargetPlatform).mockReturnValue("Windows-x86_64"); | ||
| }); | ||
| it("should download directly when no package manager available", async () => { | ||
| vi.mocked(execSync).mockReturnValue(Buffer.from("")); | ||
| await installCli(); | ||
| expect(installViaWinget).not.toHaveBeenCalled(); | ||
| expect(installViaChoco).not.toHaveBeenCalled(); | ||
| expect(execSync).toHaveBeenCalledWith(expect.stringContaining("powershell"), expect.any(Object)); | ||
| }); | ||
| it("should skip package managers when directDownload is true", async () => { | ||
| vi.mocked(isWingetAvailable).mockReturnValue(true); | ||
| vi.mocked(isChocoAvailable).mockReturnValue(true); | ||
| vi.mocked(execSync).mockReturnValue(Buffer.from("")); | ||
| await installCli(true); | ||
| expect(installViaWinget).not.toHaveBeenCalled(); | ||
| expect(installViaChoco).not.toHaveBeenCalled(); | ||
| expect(execSync).toHaveBeenCalled(); | ||
| }); | ||
| }); | ||
| describe("Linux direct download", () => { | ||
| beforeEach(() => { | ||
| vi.mocked(getOS).mockReturnValue("Linux"); | ||
| vi.mocked(isBrewAvailable).mockReturnValue(false); | ||
| vi.mocked(existsSync).mockReturnValue(false); | ||
| vi.mocked(getTargetPlatform).mockReturnValue("Ubuntu-22.04-x86_64"); | ||
| }); | ||
| it("should download directly on Linux", async () => { | ||
| vi.mocked(execSync).mockReturnValue(Buffer.from("")); | ||
| await installCli(); | ||
| expect(execSync).toHaveBeenCalledWith(expect.stringContaining("curl"), expect.any(Object)); | ||
| }); | ||
| it("should create bin directory if it doesn't exist", async () => { | ||
| vi.mocked(existsSync).mockImplementation((path) => { | ||
| if (path === "/home/user/.local/bin") | ||
| return false; | ||
| return false; | ||
| }); | ||
| vi.mocked(execSync).mockReturnValue(Buffer.from("")); | ||
| await installCli(); | ||
| expect(mkdirSync).toHaveBeenCalledWith("/home/user/.local/bin", { | ||
| recursive: true, | ||
| }); | ||
| }); | ||
| }); | ||
| describe("already installed", () => { | ||
| it("should skip if binary already exists", async () => { | ||
| vi.mocked(getOS).mockReturnValue("Linux"); | ||
| vi.mocked(isBrewAvailable).mockReturnValue(false); | ||
| vi.mocked(existsSync).mockReturnValue(true); | ||
| await installCli(); | ||
| expect(execSync).not.toHaveBeenCalled(); | ||
| expect(getCliVersion).not.toHaveBeenCalled(); | ||
| }); | ||
| }); | ||
| describe("specific version via APTOS_CLI_VERSION", () => { | ||
| beforeEach(() => { | ||
| vi.mocked(hasUserSpecifiedVersion).mockReturnValue(true); | ||
| vi.mocked(getCliVersion).mockResolvedValue("4.5.0"); | ||
| }); | ||
| it("should skip package managers when specific version is set", async () => { | ||
| vi.mocked(getOS).mockReturnValue("MacOS"); | ||
| vi.mocked(isBrewAvailable).mockReturnValue(true); | ||
| vi.mocked(isInstalledViaBrew).mockReturnValue(false); | ||
| vi.mocked(existsSync).mockReturnValue(false); | ||
| vi.mocked(execSync).mockReturnValue(Buffer.from("")); | ||
| vi.mocked(getTargetPlatform).mockReturnValue("macos-x86_64"); | ||
| await installCli(); | ||
| expect(installViaBrew).not.toHaveBeenCalled(); | ||
| expect(execSync).toHaveBeenCalled(); | ||
| }); | ||
| it("should skip winget when specific version is set on Windows", async () => { | ||
| vi.mocked(getOS).mockReturnValue("Windows"); | ||
| vi.mocked(isBrewAvailable).mockReturnValue(false); | ||
| vi.mocked(isWingetAvailable).mockReturnValue(true); | ||
| vi.mocked(isChocoAvailable).mockReturnValue(true); | ||
| vi.mocked(existsSync).mockReturnValue(false); | ||
| vi.mocked(execSync).mockReturnValue(Buffer.from("")); | ||
| vi.mocked(getTargetPlatform).mockReturnValue("Windows-x86_64"); | ||
| await installCli(); | ||
| expect(installViaWinget).not.toHaveBeenCalled(); | ||
| expect(installViaChoco).not.toHaveBeenCalled(); | ||
| expect(execSync).toHaveBeenCalled(); | ||
| }); | ||
| it("should use specific version in download URL", async () => { | ||
| vi.mocked(getOS).mockReturnValue("Linux"); | ||
| vi.mocked(isBrewAvailable).mockReturnValue(false); | ||
| vi.mocked(existsSync).mockReturnValue(false); | ||
| vi.mocked(execSync).mockReturnValue(Buffer.from("")); | ||
| vi.mocked(getTargetPlatform).mockReturnValue("Ubuntu-22.04-x86_64"); | ||
| await installCli(); | ||
| expect(execSync).toHaveBeenCalledWith(expect.stringContaining("4.5.0"), expect.any(Object)); | ||
| }); | ||
| }); | ||
| }); | ||
| //# sourceMappingURL=install.test.js.map |
| {"version":3,"file":"install.test.js","sourceRoot":"","sources":["../../bin/tasks/install.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\n\n// Mock all dependencies before importing the module under test\nvi.mock(\"child_process\", () => ({\n execSync: vi.fn(),\n}));\n\nvi.mock(\"fs\", () => ({\n existsSync: vi.fn(),\n chmodSync: vi.fn(),\n mkdirSync: vi.fn(),\n}));\n\nvi.mock(\"os\", () => ({\n tmpdir: () => \"/tmp\",\n homedir: () => \"/home/user\",\n platform: vi.fn(() => \"linux\"),\n arch: vi.fn(() => \"x64\"),\n}));\n\nvi.mock(\"../utils/getUserOs.js\", () => ({\n getOS: vi.fn(),\n getTargetPlatform: vi.fn(),\n}));\n\nvi.mock(\"../utils/getLocalBinPath.js\", () => ({\n getLocalBinPath: vi.fn(),\n getBinDir: vi.fn(),\n invalidateBinPathCache: vi.fn(),\n}));\n\nvi.mock(\"../utils/ghOperations.js\", () => ({\n getCliVersion: vi.fn(),\n hasUserSpecifiedVersion: vi.fn(),\n}));\n\nvi.mock(\"../utils/brewOperations.js\", () => ({\n isBrewAvailable: vi.fn(),\n isInstalledViaBrew: vi.fn(),\n installViaBrew: vi.fn(),\n}));\n\nvi.mock(\"../utils/windowsPackageManagers.js\", () => ({\n isWingetAvailable: vi.fn(),\n isChocoAvailable: vi.fn(),\n isInstalledViaWinget: vi.fn(),\n isInstalledViaChoco: vi.fn(),\n installViaWinget: vi.fn(),\n installViaChoco: vi.fn(),\n}));\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport {\n installViaBrew,\n isBrewAvailable,\n isInstalledViaBrew,\n} from \"../utils/brewOperations.js\";\nimport { getBinDir, getLocalBinPath } from \"../utils/getLocalBinPath.js\";\nimport { getOS, getTargetPlatform } from \"../utils/getUserOs.js\";\nimport {\n getCliVersion,\n hasUserSpecifiedVersion,\n} from \"../utils/ghOperations.js\";\nimport {\n installViaChoco,\n installViaWinget,\n isChocoAvailable,\n isInstalledViaChoco,\n isInstalledViaWinget,\n isWingetAvailable,\n} from \"../utils/windowsPackageManagers.js\";\nimport { installCli } from \"./install.js\";\n\ndescribe(\"install\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.mocked(getLocalBinPath).mockReturnValue(\"/home/user/.local/bin/aptos\");\n vi.mocked(getBinDir).mockReturnValue(\"/home/user/.local/bin\");\n vi.mocked(getCliVersion).mockResolvedValue(\"1.0.0\");\n vi.mocked(hasUserSpecifiedVersion).mockReturnValue(false);\n vi.mocked(getTargetPlatform).mockReturnValue(\"Linux-x86_64\");\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n });\n\n describe(\"macOS with Homebrew\", () => {\n beforeEach(() => {\n vi.mocked(getOS).mockReturnValue(\"MacOS\");\n vi.mocked(isBrewAvailable).mockReturnValue(true);\n });\n\n it(\"should use Homebrew when available\", async () => {\n vi.mocked(isInstalledViaBrew).mockReturnValue(false);\n\n await installCli();\n\n expect(installViaBrew).toHaveBeenCalled();\n expect(execSync).not.toHaveBeenCalled();\n });\n\n it(\"should skip if already installed via Homebrew\", async () => {\n vi.mocked(isInstalledViaBrew).mockReturnValue(true);\n\n await installCli();\n\n expect(installViaBrew).not.toHaveBeenCalled();\n });\n\n it(\"should skip Homebrew when directDownload is true\", async () => {\n vi.mocked(isInstalledViaBrew).mockReturnValue(false);\n vi.mocked(existsSync).mockReturnValue(false);\n vi.mocked(execSync).mockReturnValue(Buffer.from(\"\"));\n vi.mocked(getTargetPlatform).mockReturnValue(\"macos-x86_64\");\n\n await installCli(true);\n\n expect(installViaBrew).not.toHaveBeenCalled();\n expect(execSync).toHaveBeenCalled();\n });\n });\n\n describe(\"Windows with winget\", () => {\n beforeEach(() => {\n vi.mocked(getOS).mockReturnValue(\"Windows\");\n vi.mocked(isBrewAvailable).mockReturnValue(false);\n vi.mocked(isWingetAvailable).mockReturnValue(true);\n vi.mocked(isChocoAvailable).mockReturnValue(false);\n });\n\n it(\"should use winget when available\", async () => {\n vi.mocked(isInstalledViaWinget).mockReturnValue(false);\n\n await installCli();\n\n expect(installViaWinget).toHaveBeenCalled();\n expect(installViaChoco).not.toHaveBeenCalled();\n });\n\n it(\"should skip if already installed via winget\", async () => {\n vi.mocked(isInstalledViaWinget).mockReturnValue(true);\n\n await installCli();\n\n expect(installViaWinget).not.toHaveBeenCalled();\n });\n });\n\n describe(\"Windows with Chocolatey\", () => {\n beforeEach(() => {\n vi.mocked(getOS).mockReturnValue(\"Windows\");\n vi.mocked(isBrewAvailable).mockReturnValue(false);\n vi.mocked(isWingetAvailable).mockReturnValue(false);\n vi.mocked(isChocoAvailable).mockReturnValue(true);\n });\n\n it(\"should use Chocolatey when winget is not available\", async () => {\n vi.mocked(isInstalledViaChoco).mockReturnValue(false);\n\n await installCli();\n\n expect(installViaChoco).toHaveBeenCalled();\n expect(installViaWinget).not.toHaveBeenCalled();\n });\n\n it(\"should skip if already installed via Chocolatey\", async () => {\n vi.mocked(isInstalledViaChoco).mockReturnValue(true);\n\n await installCli();\n\n expect(installViaChoco).not.toHaveBeenCalled();\n });\n });\n\n describe(\"Windows direct download\", () => {\n beforeEach(() => {\n vi.mocked(getOS).mockReturnValue(\"Windows\");\n vi.mocked(isBrewAvailable).mockReturnValue(false);\n vi.mocked(isWingetAvailable).mockReturnValue(false);\n vi.mocked(isChocoAvailable).mockReturnValue(false);\n vi.mocked(existsSync).mockReturnValue(false);\n vi.mocked(getTargetPlatform).mockReturnValue(\"Windows-x86_64\");\n });\n\n it(\"should download directly when no package manager available\", async () => {\n vi.mocked(execSync).mockReturnValue(Buffer.from(\"\"));\n\n await installCli();\n\n expect(installViaWinget).not.toHaveBeenCalled();\n expect(installViaChoco).not.toHaveBeenCalled();\n expect(execSync).toHaveBeenCalledWith(\n expect.stringContaining(\"powershell\"),\n expect.any(Object),\n );\n });\n\n it(\"should skip package managers when directDownload is true\", async () => {\n vi.mocked(isWingetAvailable).mockReturnValue(true);\n vi.mocked(isChocoAvailable).mockReturnValue(true);\n vi.mocked(execSync).mockReturnValue(Buffer.from(\"\"));\n\n await installCli(true);\n\n expect(installViaWinget).not.toHaveBeenCalled();\n expect(installViaChoco).not.toHaveBeenCalled();\n expect(execSync).toHaveBeenCalled();\n });\n });\n\n describe(\"Linux direct download\", () => {\n beforeEach(() => {\n vi.mocked(getOS).mockReturnValue(\"Linux\");\n vi.mocked(isBrewAvailable).mockReturnValue(false);\n vi.mocked(existsSync).mockReturnValue(false);\n vi.mocked(getTargetPlatform).mockReturnValue(\"Ubuntu-22.04-x86_64\");\n });\n\n it(\"should download directly on Linux\", async () => {\n vi.mocked(execSync).mockReturnValue(Buffer.from(\"\"));\n\n await installCli();\n\n expect(execSync).toHaveBeenCalledWith(\n expect.stringContaining(\"curl\"),\n expect.any(Object),\n );\n });\n\n it(\"should create bin directory if it doesn't exist\", async () => {\n vi.mocked(existsSync).mockImplementation((path) => {\n if (path === \"/home/user/.local/bin\") return false;\n return false;\n });\n vi.mocked(execSync).mockReturnValue(Buffer.from(\"\"));\n\n await installCli();\n\n expect(mkdirSync).toHaveBeenCalledWith(\"/home/user/.local/bin\", {\n recursive: true,\n });\n });\n });\n\n describe(\"already installed\", () => {\n it(\"should skip if binary already exists\", async () => {\n vi.mocked(getOS).mockReturnValue(\"Linux\");\n vi.mocked(isBrewAvailable).mockReturnValue(false);\n vi.mocked(existsSync).mockReturnValue(true);\n\n await installCli();\n\n expect(execSync).not.toHaveBeenCalled();\n expect(getCliVersion).not.toHaveBeenCalled();\n });\n });\n\n describe(\"specific version via APTOS_CLI_VERSION\", () => {\n beforeEach(() => {\n vi.mocked(hasUserSpecifiedVersion).mockReturnValue(true);\n vi.mocked(getCliVersion).mockResolvedValue(\"4.5.0\");\n });\n\n it(\"should skip package managers when specific version is set\", async () => {\n vi.mocked(getOS).mockReturnValue(\"MacOS\");\n vi.mocked(isBrewAvailable).mockReturnValue(true);\n vi.mocked(isInstalledViaBrew).mockReturnValue(false);\n vi.mocked(existsSync).mockReturnValue(false);\n vi.mocked(execSync).mockReturnValue(Buffer.from(\"\"));\n vi.mocked(getTargetPlatform).mockReturnValue(\"macos-x86_64\");\n\n await installCli();\n\n // Should NOT use Homebrew even though it's available\n expect(installViaBrew).not.toHaveBeenCalled();\n // Should download directly\n expect(execSync).toHaveBeenCalled();\n });\n\n it(\"should skip winget when specific version is set on Windows\", async () => {\n vi.mocked(getOS).mockReturnValue(\"Windows\");\n vi.mocked(isBrewAvailable).mockReturnValue(false);\n vi.mocked(isWingetAvailable).mockReturnValue(true);\n vi.mocked(isChocoAvailable).mockReturnValue(true);\n vi.mocked(existsSync).mockReturnValue(false);\n vi.mocked(execSync).mockReturnValue(Buffer.from(\"\"));\n vi.mocked(getTargetPlatform).mockReturnValue(\"Windows-x86_64\");\n\n await installCli();\n\n expect(installViaWinget).not.toHaveBeenCalled();\n expect(installViaChoco).not.toHaveBeenCalled();\n expect(execSync).toHaveBeenCalled();\n });\n\n it(\"should use specific version in download URL\", async () => {\n vi.mocked(getOS).mockReturnValue(\"Linux\");\n vi.mocked(isBrewAvailable).mockReturnValue(false);\n vi.mocked(existsSync).mockReturnValue(false);\n vi.mocked(execSync).mockReturnValue(Buffer.from(\"\"));\n vi.mocked(getTargetPlatform).mockReturnValue(\"Ubuntu-22.04-x86_64\");\n\n await installCli();\n\n // Verify the URL contains the specific version\n expect(execSync).toHaveBeenCalledWith(\n expect.stringContaining(\"4.5.0\"),\n expect.any(Object),\n );\n });\n });\n});\n"]} |
| import { EventEmitter } from "node:events"; | ||
| import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; | ||
| const createMockChildProcess = () => { | ||
| const emitter = new EventEmitter(); | ||
| return emitter; | ||
| }; | ||
| let mockChildProcess; | ||
| vi.mock("child_process", () => ({ | ||
| spawn: vi.fn(() => mockChildProcess), | ||
| })); | ||
| vi.mock("fs", () => ({ | ||
| existsSync: vi.fn(), | ||
| })); | ||
| vi.mock("../utils/getUserOs.js", () => ({ | ||
| getPlatformInfo: vi.fn(() => ({ os: "linux", arch: "x64" })), | ||
| })); | ||
| vi.mock("../utils/getLocalBinPath.js", () => ({ | ||
| getLocalBinPath: vi.fn(() => "/home/user/.local/bin/aptos"), | ||
| })); | ||
| import { spawn } from "node:child_process"; | ||
| import { existsSync } from "node:fs"; | ||
| import { runCLI } from "./run.js"; | ||
| describe("run", () => { | ||
| const mockExit = vi.fn(); | ||
| beforeEach(() => { | ||
| vi.clearAllMocks(); | ||
| mockChildProcess = createMockChildProcess(); | ||
| vi.stubGlobal("process", { | ||
| ...process, | ||
| exit: mockExit, | ||
| }); | ||
| }); | ||
| afterEach(() => { | ||
| vi.unstubAllGlobals(); | ||
| }); | ||
| describe("runCLI", () => { | ||
| it("should spawn the CLI with provided arguments", async () => { | ||
| vi.mocked(existsSync).mockReturnValue(true); | ||
| await runCLI(["info", "--verbose"]); | ||
| expect(spawn).toHaveBeenCalledWith("/home/user/.local/bin/aptos", ["info", "--verbose"], expect.objectContaining({ | ||
| stdio: "inherit", | ||
| })); | ||
| }); | ||
| it("should use custom binary path when provided", async () => { | ||
| vi.mocked(existsSync).mockReturnValue(true); | ||
| await runCLI(["info"], "/custom/path/aptos"); | ||
| expect(spawn).toHaveBeenCalledWith("/custom/path/aptos", ["info"], expect.any(Object)); | ||
| }); | ||
| it("should exit with non-zero code when child process exits with non-zero code", async () => { | ||
| vi.mocked(existsSync).mockReturnValue(true); | ||
| await runCLI(["invalid-command"]); | ||
| mockChildProcess.emit("exit", 1); | ||
| expect(mockExit).toHaveBeenCalledWith(1); | ||
| }); | ||
| it("should exit with the exact exit code from child process", async () => { | ||
| vi.mocked(existsSync).mockReturnValue(true); | ||
| await runCLI(["some-command"]); | ||
| mockChildProcess.emit("exit", 42); | ||
| expect(mockExit).toHaveBeenCalledWith(42); | ||
| }); | ||
| it("should not call process.exit when child process exits with code 0", async () => { | ||
| vi.mocked(existsSync).mockReturnValue(true); | ||
| await runCLI(["info"]); | ||
| mockChildProcess.emit("exit", 0); | ||
| expect(mockExit).not.toHaveBeenCalled(); | ||
| }); | ||
| it("should not call process.exit when child process exits with null code", async () => { | ||
| vi.mocked(existsSync).mockReturnValue(true); | ||
| await runCLI(["info"]); | ||
| mockChildProcess.emit("exit", null); | ||
| expect(mockExit).not.toHaveBeenCalled(); | ||
| }); | ||
| it("should print error and exit if custom binary path does not exist", async () => { | ||
| vi.mocked(existsSync).mockReturnValue(false); | ||
| const consoleSpy = vi | ||
| .spyOn(console, "error") | ||
| .mockImplementation(() => { }); | ||
| await runCLI(["info"], "/nonexistent/path/aptos"); | ||
| expect(consoleSpy).toHaveBeenCalledWith("Error: Binary not found at specified path: /nonexistent/path/aptos"); | ||
| expect(mockExit).toHaveBeenCalledWith(1); | ||
| expect(spawn).not.toHaveBeenCalled(); | ||
| }); | ||
| it("should print install message if default binary does not exist", async () => { | ||
| vi.mocked(existsSync).mockReturnValue(false); | ||
| const consoleSpy = vi.spyOn(console, "log").mockImplementation(() => { }); | ||
| await runCLI(["info"]); | ||
| expect(consoleSpy).toHaveBeenCalledWith("Aptos CLI not installed, run `npx aptos --install` to install"); | ||
| expect(spawn).not.toHaveBeenCalled(); | ||
| }); | ||
| }); | ||
| }); | ||
| //# sourceMappingURL=run.test.js.map |
| {"version":3,"file":"run.test.js","sourceRoot":"","sources":["../../bin/tasks/run.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from \"node:events\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\n\n// Create a mock child process that can emit events\nconst createMockChildProcess = () => {\n const emitter = new EventEmitter();\n return emitter;\n};\n\nlet mockChildProcess: EventEmitter;\n\nvi.mock(\"child_process\", () => ({\n spawn: vi.fn(() => mockChildProcess),\n}));\n\nvi.mock(\"fs\", () => ({\n existsSync: vi.fn(),\n}));\n\nvi.mock(\"../utils/getUserOs.js\", () => ({\n getPlatformInfo: vi.fn(() => ({ os: \"linux\", arch: \"x64\" })),\n}));\n\nvi.mock(\"../utils/getLocalBinPath.js\", () => ({\n getLocalBinPath: vi.fn(() => \"/home/user/.local/bin/aptos\"),\n}));\n\nimport { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { runCLI } from \"./run.js\";\n\ndescribe(\"run\", () => {\n const mockExit = vi.fn<(code?: number) => never>();\n\n beforeEach(() => {\n vi.clearAllMocks();\n mockChildProcess = createMockChildProcess();\n vi.stubGlobal(\"process\", {\n ...process,\n exit: mockExit,\n });\n });\n\n afterEach(() => {\n vi.unstubAllGlobals();\n });\n\n describe(\"runCLI\", () => {\n it(\"should spawn the CLI with provided arguments\", async () => {\n vi.mocked(existsSync).mockReturnValue(true);\n\n await runCLI([\"info\", \"--verbose\"]);\n\n expect(spawn).toHaveBeenCalledWith(\n \"/home/user/.local/bin/aptos\",\n [\"info\", \"--verbose\"],\n expect.objectContaining({\n stdio: \"inherit\",\n }),\n );\n });\n\n it(\"should use custom binary path when provided\", async () => {\n vi.mocked(existsSync).mockReturnValue(true);\n\n await runCLI([\"info\"], \"/custom/path/aptos\");\n\n expect(spawn).toHaveBeenCalledWith(\n \"/custom/path/aptos\",\n [\"info\"],\n expect.any(Object),\n );\n });\n\n it(\"should exit with non-zero code when child process exits with non-zero code\", async () => {\n vi.mocked(existsSync).mockReturnValue(true);\n\n await runCLI([\"invalid-command\"]);\n\n // Simulate child process exiting with code 1\n mockChildProcess.emit(\"exit\", 1);\n\n expect(mockExit).toHaveBeenCalledWith(1);\n });\n\n it(\"should exit with the exact exit code from child process\", async () => {\n vi.mocked(existsSync).mockReturnValue(true);\n\n await runCLI([\"some-command\"]);\n\n // Simulate child process exiting with code 42\n mockChildProcess.emit(\"exit\", 42);\n\n expect(mockExit).toHaveBeenCalledWith(42);\n });\n\n it(\"should not call process.exit when child process exits with code 0\", async () => {\n vi.mocked(existsSync).mockReturnValue(true);\n\n await runCLI([\"info\"]);\n\n // Simulate child process exiting with code 0 (success)\n mockChildProcess.emit(\"exit\", 0);\n\n expect(mockExit).not.toHaveBeenCalled();\n });\n\n it(\"should not call process.exit when child process exits with null code\", async () => {\n vi.mocked(existsSync).mockReturnValue(true);\n\n await runCLI([\"info\"]);\n\n // Simulate child process exiting with null (e.g., killed by signal)\n mockChildProcess.emit(\"exit\", null);\n\n expect(mockExit).not.toHaveBeenCalled();\n });\n\n it(\"should print error and exit if custom binary path does not exist\", async () => {\n vi.mocked(existsSync).mockReturnValue(false);\n const consoleSpy = vi\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n await runCLI([\"info\"], \"/nonexistent/path/aptos\");\n\n expect(consoleSpy).toHaveBeenCalledWith(\n \"Error: Binary not found at specified path: /nonexistent/path/aptos\",\n );\n expect(mockExit).toHaveBeenCalledWith(1);\n expect(spawn).not.toHaveBeenCalled();\n });\n\n it(\"should print install message if default binary does not exist\", async () => {\n vi.mocked(existsSync).mockReturnValue(false);\n const consoleSpy = vi.spyOn(console, \"log\").mockImplementation(() => {});\n\n await runCLI([\"info\"]);\n\n expect(consoleSpy).toHaveBeenCalledWith(\n \"Aptos CLI not installed, run `npx aptos --install` to install\",\n );\n expect(spawn).not.toHaveBeenCalled();\n });\n });\n});\n"]} |
| import { execSync } from "node:child_process"; | ||
| import { existsSync } from "node:fs"; | ||
| import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; | ||
| vi.mock("child_process", () => ({ | ||
| execSync: vi.fn(), | ||
| })); | ||
| vi.mock("fs", () => ({ | ||
| existsSync: vi.fn(), | ||
| })); | ||
| vi.mock("./executableIsAvailable.js", () => ({ | ||
| executableIsAvailable: vi.fn(), | ||
| })); | ||
| import { getCliPathBrew, installViaBrew, isBrewAvailable, isInstalledViaBrew, updateViaBrew, } from "./brewOperations.js"; | ||
| import { executableIsAvailable } from "./executableIsAvailable.js"; | ||
| describe("brewOperations", () => { | ||
| beforeEach(() => { | ||
| vi.clearAllMocks(); | ||
| }); | ||
| afterEach(() => { | ||
| vi.restoreAllMocks(); | ||
| }); | ||
| describe("isBrewAvailable", () => { | ||
| it("should return true when brew is available", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(true); | ||
| expect(isBrewAvailable()).toBe(true); | ||
| expect(executableIsAvailable).toHaveBeenCalledWith("brew"); | ||
| }); | ||
| it("should return false when brew is not available", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(false); | ||
| expect(isBrewAvailable()).toBe(false); | ||
| }); | ||
| }); | ||
| describe("isInstalledViaBrew", () => { | ||
| it("should return true when aptos is installed via brew", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(true); | ||
| vi.mocked(execSync).mockReturnValue("/opt/homebrew/Cellar/aptos"); | ||
| vi.mocked(existsSync).mockReturnValue(true); | ||
| expect(isInstalledViaBrew()).toBe(true); | ||
| }); | ||
| it("should return false when brew is not available", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(false); | ||
| expect(isInstalledViaBrew()).toBe(false); | ||
| }); | ||
| it("should return false when aptos path doesn't exist", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(true); | ||
| vi.mocked(execSync).mockReturnValue("/opt/homebrew/Cellar/aptos"); | ||
| vi.mocked(existsSync).mockReturnValue(false); | ||
| expect(isInstalledViaBrew()).toBe(false); | ||
| }); | ||
| it("should return false when brew --prefix throws", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(true); | ||
| vi.mocked(execSync).mockImplementation(() => { | ||
| throw new Error("aptos not installed"); | ||
| }); | ||
| expect(isInstalledViaBrew()).toBe(false); | ||
| }); | ||
| }); | ||
| describe("getCliPathBrew", () => { | ||
| it("should return the correct path", () => { | ||
| vi.mocked(execSync).mockReturnValue("/opt/homebrew/Cellar/aptos\n"); | ||
| expect(getCliPathBrew()).toBe("/opt/homebrew/Cellar/aptos/bin/aptos"); | ||
| }); | ||
| }); | ||
| describe("installViaBrew", () => { | ||
| it("should call brew install aptos", () => { | ||
| vi.mocked(execSync).mockReturnValue(Buffer.from("")); | ||
| installViaBrew(); | ||
| expect(execSync).toHaveBeenCalledWith("brew install aptos", { | ||
| stdio: "inherit", | ||
| }); | ||
| }); | ||
| }); | ||
| describe("updateViaBrew", () => { | ||
| it("should call brew upgrade aptos", () => { | ||
| vi.mocked(execSync).mockReturnValue(Buffer.from("")); | ||
| updateViaBrew(); | ||
| expect(execSync).toHaveBeenCalledWith("brew upgrade aptos", { | ||
| stdio: "inherit", | ||
| }); | ||
| }); | ||
| }); | ||
| }); | ||
| //# sourceMappingURL=brewOperations.test.js.map |
| {"version":3,"file":"brewOperations.test.js","sourceRoot":"","sources":["../../bin/utils/brewOperations.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { execSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\n\nvi.mock(\"child_process\", () => ({\n execSync: vi.fn(),\n}));\n\nvi.mock(\"fs\", () => ({\n existsSync: vi.fn(),\n}));\n\nvi.mock(\"./executableIsAvailable.js\", () => ({\n executableIsAvailable: vi.fn(),\n}));\n\nimport {\n getCliPathBrew,\n installViaBrew,\n isBrewAvailable,\n isInstalledViaBrew,\n updateViaBrew,\n} from \"./brewOperations.js\";\nimport { executableIsAvailable } from \"./executableIsAvailable.js\";\n\ndescribe(\"brewOperations\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n });\n\n describe(\"isBrewAvailable\", () => {\n it(\"should return true when brew is available\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(true);\n\n expect(isBrewAvailable()).toBe(true);\n expect(executableIsAvailable).toHaveBeenCalledWith(\"brew\");\n });\n\n it(\"should return false when brew is not available\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(false);\n\n expect(isBrewAvailable()).toBe(false);\n });\n });\n\n describe(\"isInstalledViaBrew\", () => {\n it(\"should return true when aptos is installed via brew\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(true);\n vi.mocked(execSync).mockReturnValue(\"/opt/homebrew/Cellar/aptos\");\n vi.mocked(existsSync).mockReturnValue(true);\n\n expect(isInstalledViaBrew()).toBe(true);\n });\n\n it(\"should return false when brew is not available\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(false);\n\n expect(isInstalledViaBrew()).toBe(false);\n });\n\n it(\"should return false when aptos path doesn't exist\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(true);\n vi.mocked(execSync).mockReturnValue(\"/opt/homebrew/Cellar/aptos\");\n vi.mocked(existsSync).mockReturnValue(false);\n\n expect(isInstalledViaBrew()).toBe(false);\n });\n\n it(\"should return false when brew --prefix throws\", () => {\n vi.mocked(executableIsAvailable).mockReturnValue(true);\n vi.mocked(execSync).mockImplementation(() => {\n throw new Error(\"aptos not installed\");\n });\n\n expect(isInstalledViaBrew()).toBe(false);\n });\n });\n\n describe(\"getCliPathBrew\", () => {\n it(\"should return the correct path\", () => {\n vi.mocked(execSync).mockReturnValue(\"/opt/homebrew/Cellar/aptos\\n\");\n\n expect(getCliPathBrew()).toBe(\"/opt/homebrew/Cellar/aptos/bin/aptos\");\n });\n });\n\n describe(\"installViaBrew\", () => {\n it(\"should call brew install aptos\", () => {\n vi.mocked(execSync).mockReturnValue(Buffer.from(\"\"));\n\n installViaBrew();\n\n expect(execSync).toHaveBeenCalledWith(\"brew install aptos\", {\n stdio: \"inherit\",\n });\n });\n });\n\n describe(\"updateViaBrew\", () => {\n it(\"should call brew upgrade aptos\", () => {\n vi.mocked(execSync).mockReturnValue(Buffer.from(\"\"));\n\n updateViaBrew();\n\n expect(execSync).toHaveBeenCalledWith(\"brew upgrade aptos\", {\n stdio: \"inherit\",\n });\n });\n });\n});\n"]} |
| import { execSync } from "node:child_process"; | ||
| export const executableIsAvailable = (name) => { | ||
| try { | ||
| const command = process.platform === "win32" ? `where ${name}` : `which ${name}`; | ||
| execSync(command, { encoding: "utf8", stdio: "pipe" }); | ||
| return true; | ||
| } | ||
| catch { | ||
| return false; | ||
| } | ||
| }; | ||
| //# sourceMappingURL=executableIsAvailable.js.map |
| {"version":3,"file":"executableIsAvailable.js","sourceRoot":"","sources":["../../bin/utils/executableIsAvailable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAM9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAAW,EAAE;IAC7D,IAAI,CAAC;QACH,MAAM,OAAO,GACX,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;QACnE,QAAQ,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC","sourcesContent":["import { execSync } from \"node:child_process\";\n\n/**\n * Check if an executable is available on the system.\n * Uses `which` on Unix systems (macOS/Linux) and `where` on Windows.\n */\nexport const executableIsAvailable = (name: string): boolean => {\n try {\n const command =\n process.platform === \"win32\" ? `where ${name}` : `which ${name}`;\n execSync(command, { encoding: \"utf8\", stdio: \"pipe\" });\n return true;\n } catch {\n return false;\n }\n};\n"]} |
| import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; | ||
| vi.mock("os", async () => { | ||
| const actual = await vi.importActual("os"); | ||
| return { | ||
| ...actual, | ||
| platform: vi.fn(), | ||
| arch: vi.fn(), | ||
| }; | ||
| }); | ||
| vi.mock("fs", async () => { | ||
| const actual = await vi.importActual("fs"); | ||
| return { | ||
| ...actual, | ||
| existsSync: vi.fn(), | ||
| readFileSync: vi.fn(), | ||
| }; | ||
| }); | ||
| import { existsSync, readFileSync } from "node:fs"; | ||
| import { arch, platform } from "node:os"; | ||
| import { getOS, getPlatformInfo, getTargetPlatform } from "./getUserOs.js"; | ||
| describe("getUserOs", () => { | ||
| beforeEach(() => { | ||
| vi.clearAllMocks(); | ||
| }); | ||
| afterEach(() => { | ||
| vi.restoreAllMocks(); | ||
| }); | ||
| describe("getPlatformInfo", () => { | ||
| it("should detect macOS x86_64", () => { | ||
| vi.mocked(platform).mockReturnValue("darwin"); | ||
| vi.mocked(arch).mockReturnValue("x64"); | ||
| const result = getPlatformInfo(); | ||
| expect(result).toEqual({ os: "macos", arch: "x86_64" }); | ||
| }); | ||
| it("should detect macOS ARM64", () => { | ||
| vi.mocked(platform).mockReturnValue("darwin"); | ||
| vi.mocked(arch).mockReturnValue("arm64"); | ||
| const result = getPlatformInfo(); | ||
| expect(result).toEqual({ os: "macos", arch: "aarch64" }); | ||
| }); | ||
| it("should detect Linux x86_64", () => { | ||
| vi.mocked(platform).mockReturnValue("linux"); | ||
| vi.mocked(arch).mockReturnValue("x64"); | ||
| const result = getPlatformInfo(); | ||
| expect(result).toEqual({ os: "linux", arch: "x86_64" }); | ||
| }); | ||
| it("should detect Linux ARM64", () => { | ||
| vi.mocked(platform).mockReturnValue("linux"); | ||
| vi.mocked(arch).mockReturnValue("arm64"); | ||
| const result = getPlatformInfo(); | ||
| expect(result).toEqual({ os: "linux", arch: "aarch64" }); | ||
| }); | ||
| it("should detect Windows x86_64", () => { | ||
| vi.mocked(platform).mockReturnValue("win32"); | ||
| vi.mocked(arch).mockReturnValue("x64"); | ||
| const result = getPlatformInfo(); | ||
| expect(result).toEqual({ os: "windows", arch: "x86_64" }); | ||
| }); | ||
| it("should throw for unsupported OS", () => { | ||
| vi.mocked(platform).mockReturnValue("freebsd"); | ||
| vi.mocked(arch).mockReturnValue("x64"); | ||
| expect(() => getPlatformInfo()).toThrow("Unsupported operating system"); | ||
| }); | ||
| it("should throw for unsupported architecture", () => { | ||
| vi.mocked(platform).mockReturnValue("linux"); | ||
| vi.mocked(arch).mockReturnValue("mips"); | ||
| expect(() => getPlatformInfo()).toThrow("Unsupported architecture"); | ||
| }); | ||
| }); | ||
| describe("getTargetPlatform", () => { | ||
| it("should return macos-x86_64 for Intel Mac", () => { | ||
| vi.mocked(platform).mockReturnValue("darwin"); | ||
| vi.mocked(arch).mockReturnValue("x64"); | ||
| expect(getTargetPlatform()).toBe("macos-x86_64"); | ||
| }); | ||
| it("should return macos-arm64 for Apple Silicon Mac", () => { | ||
| vi.mocked(platform).mockReturnValue("darwin"); | ||
| vi.mocked(arch).mockReturnValue("arm64"); | ||
| expect(getTargetPlatform()).toBe("macos-arm64"); | ||
| }); | ||
| it("should return Ubuntu-24.04-x86_64 for Ubuntu 24.04", () => { | ||
| vi.mocked(platform).mockReturnValue("linux"); | ||
| vi.mocked(arch).mockReturnValue("x64"); | ||
| vi.mocked(existsSync).mockReturnValue(true); | ||
| vi.mocked(readFileSync).mockReturnValue('ID=ubuntu\nVERSION_ID="24.04"\n'); | ||
| expect(getTargetPlatform()).toBe("Ubuntu-24.04-x86_64"); | ||
| }); | ||
| it("should return Ubuntu-22.04-x86_64 for Ubuntu 22.04", () => { | ||
| vi.mocked(platform).mockReturnValue("linux"); | ||
| vi.mocked(arch).mockReturnValue("x64"); | ||
| vi.mocked(existsSync).mockReturnValue(true); | ||
| vi.mocked(readFileSync).mockReturnValue('ID=ubuntu\nVERSION_ID="22.04"\n'); | ||
| expect(getTargetPlatform()).toBe("Ubuntu-22.04-x86_64"); | ||
| }); | ||
| it("should return Linux-x86_64 for non-Ubuntu Linux", () => { | ||
| vi.mocked(platform).mockReturnValue("linux"); | ||
| vi.mocked(arch).mockReturnValue("x64"); | ||
| vi.mocked(existsSync).mockReturnValue(true); | ||
| vi.mocked(readFileSync).mockReturnValue('ID=fedora\nVERSION_ID="39"\n'); | ||
| expect(getTargetPlatform()).toBe("Linux-x86_64"); | ||
| }); | ||
| it("should return Linux-x86_64 when /etc/os-release doesn't exist", () => { | ||
| vi.mocked(platform).mockReturnValue("linux"); | ||
| vi.mocked(arch).mockReturnValue("x64"); | ||
| vi.mocked(existsSync).mockReturnValue(false); | ||
| expect(getTargetPlatform()).toBe("Linux-x86_64"); | ||
| }); | ||
| it("should return Linux-aarch64 for ARM64 Linux", () => { | ||
| vi.mocked(platform).mockReturnValue("linux"); | ||
| vi.mocked(arch).mockReturnValue("arm64"); | ||
| vi.mocked(existsSync).mockReturnValue(false); | ||
| expect(getTargetPlatform()).toBe("Linux-aarch64"); | ||
| }); | ||
| it("should return Windows-x86_64 for Windows", () => { | ||
| vi.mocked(platform).mockReturnValue("win32"); | ||
| vi.mocked(arch).mockReturnValue("x64"); | ||
| expect(getTargetPlatform()).toBe("Windows-x86_64"); | ||
| }); | ||
| it("should throw for Windows ARM64", () => { | ||
| vi.mocked(platform).mockReturnValue("win32"); | ||
| vi.mocked(arch).mockReturnValue("arm64"); | ||
| expect(() => getTargetPlatform()).toThrow("Windows ARM64 is not currently supported"); | ||
| }); | ||
| }); | ||
| describe("getOS", () => { | ||
| it("should return MacOS for darwin", () => { | ||
| vi.mocked(platform).mockReturnValue("darwin"); | ||
| vi.mocked(arch).mockReturnValue("x64"); | ||
| expect(getOS()).toBe("MacOS"); | ||
| }); | ||
| it("should return Linux for linux", () => { | ||
| vi.mocked(platform).mockReturnValue("linux"); | ||
| vi.mocked(arch).mockReturnValue("x64"); | ||
| expect(getOS()).toBe("Linux"); | ||
| }); | ||
| it("should return Windows for win32", () => { | ||
| vi.mocked(platform).mockReturnValue("win32"); | ||
| vi.mocked(arch).mockReturnValue("x64"); | ||
| expect(getOS()).toBe("Windows"); | ||
| }); | ||
| }); | ||
| }); | ||
| //# sourceMappingURL=getUserOs.test.js.map |
| {"version":3,"file":"getUserOs.test.js","sourceRoot":"","sources":["../../bin/utils/getUserOs.test.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as os from \"node:os\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\n\n// We need to mock the os module before importing the module under test\nvi.mock(\"os\", async () => {\n const actual = await vi.importActual<typeof os>(\"os\");\n return {\n ...actual,\n platform: vi.fn(),\n arch: vi.fn(),\n };\n});\n\n// We need to mock fs for the Linux distro detection\nvi.mock(\"fs\", async () => {\n const actual = await vi.importActual<typeof import(\"fs\")>(\"fs\");\n return {\n ...actual,\n existsSync: vi.fn(),\n readFileSync: vi.fn(),\n };\n});\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { arch, platform } from \"node:os\";\nimport { getOS, getPlatformInfo, getTargetPlatform } from \"./getUserOs.js\";\n\ndescribe(\"getUserOs\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n });\n\n describe(\"getPlatformInfo\", () => {\n it(\"should detect macOS x86_64\", () => {\n vi.mocked(platform).mockReturnValue(\"darwin\");\n vi.mocked(arch).mockReturnValue(\"x64\");\n\n const result = getPlatformInfo();\n expect(result).toEqual({ os: \"macos\", arch: \"x86_64\" });\n });\n\n it(\"should detect macOS ARM64\", () => {\n vi.mocked(platform).mockReturnValue(\"darwin\");\n vi.mocked(arch).mockReturnValue(\"arm64\");\n\n const result = getPlatformInfo();\n expect(result).toEqual({ os: \"macos\", arch: \"aarch64\" });\n });\n\n it(\"should detect Linux x86_64\", () => {\n vi.mocked(platform).mockReturnValue(\"linux\");\n vi.mocked(arch).mockReturnValue(\"x64\");\n\n const result = getPlatformInfo();\n expect(result).toEqual({ os: \"linux\", arch: \"x86_64\" });\n });\n\n it(\"should detect Linux ARM64\", () => {\n vi.mocked(platform).mockReturnValue(\"linux\");\n vi.mocked(arch).mockReturnValue(\"arm64\");\n\n const result = getPlatformInfo();\n expect(result).toEqual({ os: \"linux\", arch: \"aarch64\" });\n });\n\n it(\"should detect Windows x86_64\", () => {\n vi.mocked(platform).mockReturnValue(\"win32\");\n vi.mocked(arch).mockReturnValue(\"x64\");\n\n const result = getPlatformInfo();\n expect(result).toEqual({ os: \"windows\", arch: \"x86_64\" });\n });\n\n it(\"should throw for unsupported OS\", () => {\n vi.mocked(platform).mockReturnValue(\"freebsd\");\n vi.mocked(arch).mockReturnValue(\"x64\");\n\n expect(() => getPlatformInfo()).toThrow(\"Unsupported operating system\");\n });\n\n it(\"should throw for unsupported architecture\", () => {\n vi.mocked(platform).mockReturnValue(\"linux\");\n vi.mocked(arch).mockReturnValue(\"mips\");\n\n expect(() => getPlatformInfo()).toThrow(\"Unsupported architecture\");\n });\n });\n\n describe(\"getTargetPlatform\", () => {\n it(\"should return macos-x86_64 for Intel Mac\", () => {\n vi.mocked(platform).mockReturnValue(\"darwin\");\n vi.mocked(arch).mockReturnValue(\"x64\");\n\n expect(getTargetPlatform()).toBe(\"macos-x86_64\");\n });\n\n it(\"should return macos-arm64 for Apple Silicon Mac\", () => {\n vi.mocked(platform).mockReturnValue(\"darwin\");\n vi.mocked(arch).mockReturnValue(\"arm64\");\n\n expect(getTargetPlatform()).toBe(\"macos-arm64\");\n });\n\n it(\"should return Ubuntu-24.04-x86_64 for Ubuntu 24.04\", () => {\n vi.mocked(platform).mockReturnValue(\"linux\");\n vi.mocked(arch).mockReturnValue(\"x64\");\n vi.mocked(existsSync).mockReturnValue(true);\n vi.mocked(readFileSync).mockReturnValue(\n 'ID=ubuntu\\nVERSION_ID=\"24.04\"\\n',\n );\n\n expect(getTargetPlatform()).toBe(\"Ubuntu-24.04-x86_64\");\n });\n\n it(\"should return Ubuntu-22.04-x86_64 for Ubuntu 22.04\", () => {\n vi.mocked(platform).mockReturnValue(\"linux\");\n vi.mocked(arch).mockReturnValue(\"x64\");\n vi.mocked(existsSync).mockReturnValue(true);\n vi.mocked(readFileSync).mockReturnValue(\n 'ID=ubuntu\\nVERSION_ID=\"22.04\"\\n',\n );\n\n expect(getTargetPlatform()).toBe(\"Ubuntu-22.04-x86_64\");\n });\n\n it(\"should return Linux-x86_64 for non-Ubuntu Linux\", () => {\n vi.mocked(platform).mockReturnValue(\"linux\");\n vi.mocked(arch).mockReturnValue(\"x64\");\n vi.mocked(existsSync).mockReturnValue(true);\n vi.mocked(readFileSync).mockReturnValue('ID=fedora\\nVERSION_ID=\"39\"\\n');\n\n expect(getTargetPlatform()).toBe(\"Linux-x86_64\");\n });\n\n it(\"should return Linux-x86_64 when /etc/os-release doesn't exist\", () => {\n vi.mocked(platform).mockReturnValue(\"linux\");\n vi.mocked(arch).mockReturnValue(\"x64\");\n vi.mocked(existsSync).mockReturnValue(false);\n\n expect(getTargetPlatform()).toBe(\"Linux-x86_64\");\n });\n\n it(\"should return Linux-aarch64 for ARM64 Linux\", () => {\n vi.mocked(platform).mockReturnValue(\"linux\");\n vi.mocked(arch).mockReturnValue(\"arm64\");\n vi.mocked(existsSync).mockReturnValue(false);\n\n expect(getTargetPlatform()).toBe(\"Linux-aarch64\");\n });\n\n it(\"should return Windows-x86_64 for Windows\", () => {\n vi.mocked(platform).mockReturnValue(\"win32\");\n vi.mocked(arch).mockReturnValue(\"x64\");\n\n expect(getTargetPlatform()).toBe(\"Windows-x86_64\");\n });\n\n it(\"should throw for Windows ARM64\", () => {\n vi.mocked(platform).mockReturnValue(\"win32\");\n vi.mocked(arch).mockReturnValue(\"arm64\");\n\n expect(() => getTargetPlatform()).toThrow(\n \"Windows ARM64 is not currently supported\",\n );\n });\n });\n\n describe(\"getOS\", () => {\n it(\"should return MacOS for darwin\", () => {\n vi.mocked(platform).mockReturnValue(\"darwin\");\n vi.mocked(arch).mockReturnValue(\"x64\");\n\n expect(getOS()).toBe(\"MacOS\");\n });\n\n it(\"should return Linux for linux\", () => {\n vi.mocked(platform).mockReturnValue(\"linux\");\n vi.mocked(arch).mockReturnValue(\"x64\");\n\n expect(getOS()).toBe(\"Linux\");\n });\n\n it(\"should return Windows for win32\", () => {\n vi.mocked(platform).mockReturnValue(\"win32\");\n vi.mocked(arch).mockReturnValue(\"x64\");\n\n expect(getOS()).toBe(\"Windows\");\n });\n });\n});\n"]} |
| import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; | ||
| const mockFetch = vi.fn(); | ||
| global.fetch = mockFetch; | ||
| import { getCliVersion, getLatestVersionGh, getUserSpecifiedVersion, hasUserSpecifiedVersion, validateVersionExists, } from "./ghOperations.js"; | ||
| describe("ghOperations", () => { | ||
| beforeEach(() => { | ||
| vi.clearAllMocks(); | ||
| delete process.env.GITHUB_TOKEN; | ||
| delete process.env.APTOS_CLI_VERSION; | ||
| }); | ||
| afterEach(() => { | ||
| vi.restoreAllMocks(); | ||
| }); | ||
| describe("getLatestVersionGh", () => { | ||
| it("should return the latest version", async () => { | ||
| mockFetch.mockResolvedValue({ | ||
| ok: true, | ||
| json: () => Promise.resolve([ | ||
| { tag_name: "aptos-cli-v1.2.3" }, | ||
| { tag_name: "aptos-cli-v1.2.2" }, | ||
| ]), | ||
| }); | ||
| const version = await getLatestVersionGh(); | ||
| expect(version).toBe("1.2.3"); | ||
| expect(mockFetch).toHaveBeenCalledWith("https://api.github.com/repos/aptos-labs/aptos-core/releases?per_page=100", expect.objectContaining({ | ||
| headers: expect.objectContaining({ | ||
| Accept: "application/vnd.github.v3+json", | ||
| "User-Agent": "aptos-cli-npm", | ||
| }), | ||
| })); | ||
| }); | ||
| it("should use GITHUB_TOKEN when available", async () => { | ||
| process.env.GITHUB_TOKEN = "test-token"; | ||
| mockFetch.mockResolvedValue({ | ||
| ok: true, | ||
| json: () => Promise.resolve([{ tag_name: "aptos-cli-v1.0.0" }]), | ||
| }); | ||
| await getLatestVersionGh(); | ||
| expect(mockFetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({ | ||
| headers: expect.objectContaining({ | ||
| Authorization: "Bearer test-token", | ||
| }), | ||
| })); | ||
| }); | ||
| it("should skip non-CLI releases", async () => { | ||
| mockFetch.mockResolvedValue({ | ||
| ok: true, | ||
| json: () => Promise.resolve([ | ||
| { tag_name: "other-release-v2.0.0" }, | ||
| { tag_name: "aptos-cli-v1.5.0" }, | ||
| ]), | ||
| }); | ||
| const version = await getLatestVersionGh(); | ||
| expect(version).toBe("1.5.0"); | ||
| }); | ||
| it("should throw on rate limit (403)", async () => { | ||
| mockFetch.mockResolvedValue({ | ||
| ok: false, | ||
| status: 403, | ||
| statusText: "Forbidden", | ||
| }); | ||
| await expect(getLatestVersionGh()).rejects.toThrow("GitHub API rate limit exceeded"); | ||
| }); | ||
| it("should throw on rate limit (429)", async () => { | ||
| mockFetch.mockResolvedValue({ | ||
| ok: false, | ||
| status: 429, | ||
| statusText: "Too Many Requests", | ||
| }); | ||
| await expect(getLatestVersionGh()).rejects.toThrow("GitHub API rate limit exceeded"); | ||
| }); | ||
| it("should throw on other HTTP errors", async () => { | ||
| mockFetch.mockResolvedValue({ | ||
| ok: false, | ||
| status: 500, | ||
| statusText: "Internal Server Error", | ||
| }); | ||
| await expect(getLatestVersionGh()).rejects.toThrow("GitHub API request failed with status 500"); | ||
| }); | ||
| it("should throw on network error", async () => { | ||
| mockFetch.mockRejectedValue(new Error("Network error")); | ||
| await expect(getLatestVersionGh()).rejects.toThrow("Failed to fetch releases from GitHub"); | ||
| }); | ||
| it("should throw when no CLI release found", async () => { | ||
| mockFetch.mockResolvedValue({ | ||
| ok: true, | ||
| json: () => Promise.resolve([ | ||
| { tag_name: "other-release-v1.0.0" }, | ||
| { tag_name: "another-release-v2.0.0" }, | ||
| ]), | ||
| }); | ||
| await expect(getLatestVersionGh()).rejects.toThrow("Could not determine latest version of Aptos CLI"); | ||
| }); | ||
| it("should throw on invalid JSON response", async () => { | ||
| mockFetch.mockResolvedValue({ | ||
| ok: true, | ||
| json: () => Promise.reject(new Error("Invalid JSON")), | ||
| }); | ||
| await expect(getLatestVersionGh()).rejects.toThrow("Failed to parse GitHub API response"); | ||
| }); | ||
| it("should throw when response is not an array", async () => { | ||
| mockFetch.mockResolvedValue({ | ||
| ok: true, | ||
| json: () => Promise.resolve({ message: "not an array" }), | ||
| }); | ||
| await expect(getLatestVersionGh()).rejects.toThrow("Unexpected response format"); | ||
| }); | ||
| }); | ||
| describe("getUserSpecifiedVersion", () => { | ||
| it("should return undefined when APTOS_CLI_VERSION is not set", () => { | ||
| delete process.env.APTOS_CLI_VERSION; | ||
| expect(getUserSpecifiedVersion()).toBeUndefined(); | ||
| }); | ||
| it("should return the version when APTOS_CLI_VERSION is set", () => { | ||
| process.env.APTOS_CLI_VERSION = "1.2.3"; | ||
| expect(getUserSpecifiedVersion()).toBe("1.2.3"); | ||
| }); | ||
| it("should strip v prefix from version", () => { | ||
| process.env.APTOS_CLI_VERSION = "v1.2.3"; | ||
| expect(getUserSpecifiedVersion()).toBe("1.2.3"); | ||
| }); | ||
| it("should handle version without v prefix", () => { | ||
| process.env.APTOS_CLI_VERSION = "2.0.0"; | ||
| expect(getUserSpecifiedVersion()).toBe("2.0.0"); | ||
| }); | ||
| it("should accept pre-release versions", () => { | ||
| process.env.APTOS_CLI_VERSION = "v1.2.3-rc.1"; | ||
| expect(getUserSpecifiedVersion()).toBe("1.2.3-rc.1"); | ||
| }); | ||
| it("should reject invalid version strings", () => { | ||
| process.env.APTOS_CLI_VERSION = "not-a-version"; | ||
| expect(() => getUserSpecifiedVersion()).toThrow("Invalid APTOS_CLI_VERSION"); | ||
| }); | ||
| it("should reject version with shell metacharacters", () => { | ||
| process.env.APTOS_CLI_VERSION = '1.0.0"; rm -rf /; echo "'; | ||
| expect(() => getUserSpecifiedVersion()).toThrow("Invalid APTOS_CLI_VERSION"); | ||
| }); | ||
| }); | ||
| describe("hasUserSpecifiedVersion", () => { | ||
| it("should return false when APTOS_CLI_VERSION is not set", () => { | ||
| delete process.env.APTOS_CLI_VERSION; | ||
| expect(hasUserSpecifiedVersion()).toBe(false); | ||
| }); | ||
| it("should return true when APTOS_CLI_VERSION is set", () => { | ||
| process.env.APTOS_CLI_VERSION = "1.0.0"; | ||
| expect(hasUserSpecifiedVersion()).toBe(true); | ||
| }); | ||
| it("should return false when APTOS_CLI_VERSION is empty string", () => { | ||
| process.env.APTOS_CLI_VERSION = ""; | ||
| expect(hasUserSpecifiedVersion()).toBe(false); | ||
| }); | ||
| }); | ||
| describe("validateVersionExists", () => { | ||
| it("should return true when version exists", async () => { | ||
| mockFetch.mockResolvedValue({ ok: true }); | ||
| const result = await validateVersionExists("1.0.0", "Linux-x86_64"); | ||
| expect(result).toBe(true); | ||
| 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" })); | ||
| }); | ||
| it("should return false when version does not exist", async () => { | ||
| mockFetch.mockResolvedValue({ ok: false }); | ||
| const result = await validateVersionExists("99.99.99", "Linux-x86_64"); | ||
| expect(result).toBe(false); | ||
| }); | ||
| it("should return false on network error", async () => { | ||
| mockFetch.mockRejectedValue(new Error("Network error")); | ||
| const result = await validateVersionExists("1.0.0", "Linux-x86_64"); | ||
| expect(result).toBe(false); | ||
| }); | ||
| it("should use GITHUB_TOKEN when available", async () => { | ||
| process.env.GITHUB_TOKEN = "test-token"; | ||
| mockFetch.mockResolvedValue({ ok: true }); | ||
| await validateVersionExists("1.0.0", "Linux-x86_64"); | ||
| expect(mockFetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({ | ||
| headers: expect.objectContaining({ | ||
| Authorization: "Bearer test-token", | ||
| }), | ||
| })); | ||
| }); | ||
| }); | ||
| describe("getCliVersion", () => { | ||
| it("should return latest version when APTOS_CLI_VERSION is not set", async () => { | ||
| delete process.env.APTOS_CLI_VERSION; | ||
| mockFetch.mockResolvedValue({ | ||
| ok: true, | ||
| json: () => Promise.resolve([{ tag_name: "aptos-cli-v2.0.0" }]), | ||
| }); | ||
| const version = await getCliVersion(); | ||
| expect(version).toBe("2.0.0"); | ||
| }); | ||
| it("should return user-specified version when APTOS_CLI_VERSION is set", async () => { | ||
| process.env.APTOS_CLI_VERSION = "1.5.0"; | ||
| const version = await getCliVersion(); | ||
| expect(version).toBe("1.5.0"); | ||
| expect(mockFetch).not.toHaveBeenCalled(); | ||
| }); | ||
| it("should validate version when targetPlatform is provided", async () => { | ||
| process.env.APTOS_CLI_VERSION = "1.5.0"; | ||
| mockFetch.mockResolvedValue({ ok: true }); | ||
| const version = await getCliVersion("Linux-x86_64"); | ||
| expect(version).toBe("1.5.0"); | ||
| expect(mockFetch).toHaveBeenCalledWith(expect.stringContaining("1.5.0"), expect.objectContaining({ method: "HEAD" })); | ||
| }); | ||
| it("should throw error when specified version does not exist", async () => { | ||
| process.env.APTOS_CLI_VERSION = "99.99.99"; | ||
| mockFetch.mockResolvedValue({ ok: false }); | ||
| await expect(getCliVersion("Linux-x86_64")).rejects.toThrow("Specified version 99.99.99 does not exist"); | ||
| }); | ||
| it("should strip v prefix and validate version", async () => { | ||
| process.env.APTOS_CLI_VERSION = "v1.5.0"; | ||
| mockFetch.mockResolvedValue({ ok: true }); | ||
| const version = await getCliVersion("Linux-x86_64"); | ||
| expect(version).toBe("1.5.0"); | ||
| }); | ||
| }); | ||
| }); | ||
| //# sourceMappingURL=ghOperations.test.js.map |
| {"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"]} |
| import { execSync } from "node:child_process"; | ||
| import { existsSync } from "node:fs"; | ||
| import { executableIsAvailable } from "./executableIsAvailable.js"; | ||
| export const isWingetAvailable = () => { | ||
| return executableIsAvailable("winget"); | ||
| }; | ||
| export const isChocoAvailable = () => { | ||
| return executableIsAvailable("choco"); | ||
| }; | ||
| export const isInstalledViaWinget = () => { | ||
| if (!isWingetAvailable()) { | ||
| return false; | ||
| } | ||
| try { | ||
| const output = execSync("winget list --id Aptos.Aptos", { | ||
| encoding: "utf8", | ||
| stdio: ["pipe", "pipe", "pipe"], | ||
| }); | ||
| return output.includes("Aptos.Aptos"); | ||
| } | ||
| catch { | ||
| return false; | ||
| } | ||
| }; | ||
| export const isInstalledViaChoco = () => { | ||
| if (!isChocoAvailable()) { | ||
| return false; | ||
| } | ||
| try { | ||
| const output = execSync("choco list aptos", { | ||
| encoding: "utf8", | ||
| stdio: ["pipe", "pipe", "pipe"], | ||
| }); | ||
| return output.toLowerCase().includes("aptos"); | ||
| } | ||
| catch { | ||
| return false; | ||
| } | ||
| }; | ||
| export const getCliPathWinget = () => { | ||
| const possiblePaths = [ | ||
| `${process.env.LOCALAPPDATA}\\Microsoft\\WinGet\\Packages\\Aptos.Aptos_Microsoft.Winget.Source_8wekyb3d8bbwe\\aptos.exe`, | ||
| `${process.env.PROGRAMFILES}\\Aptos\\aptos.exe`, | ||
| `${process.env.LOCALAPPDATA}\\Aptos\\aptos.exe`, | ||
| ]; | ||
| for (const path of possiblePaths) { | ||
| if (path && existsSync(path)) { | ||
| return path; | ||
| } | ||
| } | ||
| try { | ||
| const output = execSync("where aptos", { | ||
| encoding: "utf8", | ||
| stdio: ["pipe", "pipe", "pipe"], | ||
| }).trim(); | ||
| if (output && existsSync(output.split("\n")[0])) { | ||
| return output.split("\n")[0]; | ||
| } | ||
| } | ||
| catch { | ||
| } | ||
| return null; | ||
| }; | ||
| export const getCliPathChoco = () => { | ||
| const chocoPath = `${process.env.ChocolateyInstall || "C:\\ProgramData\\chocolatey"}\\bin\\aptos.exe`; | ||
| if (existsSync(chocoPath)) { | ||
| return chocoPath; | ||
| } | ||
| return null; | ||
| }; | ||
| export const installViaWinget = () => { | ||
| console.log("Installing Aptos CLI via winget..."); | ||
| execSync("winget install --id Aptos.Aptos --silent --accept-package-agreements --accept-source-agreements", { | ||
| stdio: "inherit", | ||
| }); | ||
| }; | ||
| export const installViaChoco = () => { | ||
| console.log("Installing Aptos CLI via Chocolatey..."); | ||
| execSync("choco install aptos -y", { stdio: "inherit" }); | ||
| }; | ||
| export const updateViaWinget = () => { | ||
| console.log("Updating Aptos CLI via winget..."); | ||
| execSync("winget upgrade --id Aptos.Aptos --silent --accept-package-agreements --accept-source-agreements", { | ||
| stdio: "inherit", | ||
| }); | ||
| }; | ||
| export const updateViaChoco = () => { | ||
| console.log("Updating Aptos CLI via Chocolatey..."); | ||
| execSync("choco upgrade aptos -y", { stdio: "inherit" }); | ||
| }; | ||
| export const detectWindowsPackageManager = () => { | ||
| if (isInstalledViaWinget()) { | ||
| return "winget"; | ||
| } | ||
| if (isInstalledViaChoco()) { | ||
| return "choco"; | ||
| } | ||
| return null; | ||
| }; | ||
| //# sourceMappingURL=windowsPackageManagers.js.map |
| {"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"]} |
| import { execSync } from "node:child_process"; | ||
| import { existsSync } from "node:fs"; | ||
| import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; | ||
| vi.mock("child_process", () => ({ | ||
| execSync: vi.fn(), | ||
| })); | ||
| vi.mock("fs", () => ({ | ||
| existsSync: vi.fn(), | ||
| })); | ||
| vi.mock("./executableIsAvailable.js", () => ({ | ||
| executableIsAvailable: vi.fn(), | ||
| })); | ||
| import { executableIsAvailable } from "./executableIsAvailable.js"; | ||
| import { detectWindowsPackageManager, getCliPathChoco, getCliPathWinget, installViaChoco, installViaWinget, isChocoAvailable, isInstalledViaChoco, isInstalledViaWinget, isWingetAvailable, updateViaChoco, updateViaWinget, } from "./windowsPackageManagers.js"; | ||
| describe("windowsPackageManagers", () => { | ||
| beforeEach(() => { | ||
| vi.clearAllMocks(); | ||
| process.env.LOCALAPPDATA = "C:\\Users\\Test\\AppData\\Local"; | ||
| process.env.PROGRAMFILES = "C:\\Program Files"; | ||
| process.env.ChocolateyInstall = "C:\\ProgramData\\chocolatey"; | ||
| }); | ||
| afterEach(() => { | ||
| vi.restoreAllMocks(); | ||
| }); | ||
| describe("isWingetAvailable", () => { | ||
| it("should return true when winget is available", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(true); | ||
| expect(isWingetAvailable()).toBe(true); | ||
| expect(executableIsAvailable).toHaveBeenCalledWith("winget"); | ||
| }); | ||
| it("should return false when winget is not available", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(false); | ||
| expect(isWingetAvailable()).toBe(false); | ||
| }); | ||
| }); | ||
| describe("isChocoAvailable", () => { | ||
| it("should return true when choco is available", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(true); | ||
| expect(isChocoAvailable()).toBe(true); | ||
| expect(executableIsAvailable).toHaveBeenCalledWith("choco"); | ||
| }); | ||
| it("should return false when choco is not available", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(false); | ||
| expect(isChocoAvailable()).toBe(false); | ||
| }); | ||
| }); | ||
| describe("isInstalledViaWinget", () => { | ||
| it("should return true when aptos is installed via winget", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(true); | ||
| vi.mocked(execSync).mockReturnValue("Aptos.Aptos 1.0.0"); | ||
| expect(isInstalledViaWinget()).toBe(true); | ||
| }); | ||
| it("should return false when winget is not available", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(false); | ||
| expect(isInstalledViaWinget()).toBe(false); | ||
| }); | ||
| it("should return false when aptos is not in winget list", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(true); | ||
| vi.mocked(execSync).mockReturnValue("No packages found"); | ||
| expect(isInstalledViaWinget()).toBe(false); | ||
| }); | ||
| it("should return false when winget list throws", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(true); | ||
| vi.mocked(execSync).mockImplementation(() => { | ||
| throw new Error("winget error"); | ||
| }); | ||
| expect(isInstalledViaWinget()).toBe(false); | ||
| }); | ||
| }); | ||
| describe("isInstalledViaChoco", () => { | ||
| it("should return true when aptos is installed via choco", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(true); | ||
| vi.mocked(execSync).mockReturnValue("aptos 1.0.0"); | ||
| expect(isInstalledViaChoco()).toBe(true); | ||
| }); | ||
| it("should return false when choco is not available", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(false); | ||
| expect(isInstalledViaChoco()).toBe(false); | ||
| }); | ||
| it("should return false when aptos is not in choco list", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(true); | ||
| vi.mocked(execSync).mockReturnValue("0 packages installed"); | ||
| expect(isInstalledViaChoco()).toBe(false); | ||
| }); | ||
| }); | ||
| describe("getCliPathWinget", () => { | ||
| it("should return path when found via where command", () => { | ||
| vi.mocked(existsSync).mockImplementation((path) => { | ||
| return path === "C:\\found\\aptos.exe"; | ||
| }); | ||
| vi.mocked(execSync).mockReturnValue("C:\\found\\aptos.exe\n"); | ||
| expect(getCliPathWinget()).toBe("C:\\found\\aptos.exe"); | ||
| }); | ||
| it("should return null when not found", () => { | ||
| vi.mocked(existsSync).mockReturnValue(false); | ||
| vi.mocked(execSync).mockImplementation(() => { | ||
| throw new Error("not found"); | ||
| }); | ||
| expect(getCliPathWinget()).toBeNull(); | ||
| }); | ||
| }); | ||
| describe("getCliPathChoco", () => { | ||
| it("should return path when exists", () => { | ||
| vi.mocked(existsSync).mockReturnValue(true); | ||
| expect(getCliPathChoco()).toBe("C:\\ProgramData\\chocolatey\\bin\\aptos.exe"); | ||
| }); | ||
| it("should return null when not found", () => { | ||
| vi.mocked(existsSync).mockReturnValue(false); | ||
| expect(getCliPathChoco()).toBeNull(); | ||
| }); | ||
| }); | ||
| describe("installViaWinget", () => { | ||
| it("should call winget install", () => { | ||
| vi.mocked(execSync).mockReturnValue(Buffer.from("")); | ||
| installViaWinget(); | ||
| expect(execSync).toHaveBeenCalledWith("winget install --id Aptos.Aptos --silent --accept-package-agreements --accept-source-agreements", { stdio: "inherit" }); | ||
| }); | ||
| }); | ||
| describe("installViaChoco", () => { | ||
| it("should call choco install", () => { | ||
| vi.mocked(execSync).mockReturnValue(Buffer.from("")); | ||
| installViaChoco(); | ||
| expect(execSync).toHaveBeenCalledWith("choco install aptos -y", { | ||
| stdio: "inherit", | ||
| }); | ||
| }); | ||
| }); | ||
| describe("updateViaWinget", () => { | ||
| it("should call winget upgrade", () => { | ||
| vi.mocked(execSync).mockReturnValue(Buffer.from("")); | ||
| updateViaWinget(); | ||
| expect(execSync).toHaveBeenCalledWith("winget upgrade --id Aptos.Aptos --silent --accept-package-agreements --accept-source-agreements", { stdio: "inherit" }); | ||
| }); | ||
| }); | ||
| describe("updateViaChoco", () => { | ||
| it("should call choco upgrade", () => { | ||
| vi.mocked(execSync).mockReturnValue(Buffer.from("")); | ||
| updateViaChoco(); | ||
| expect(execSync).toHaveBeenCalledWith("choco upgrade aptos -y", { | ||
| stdio: "inherit", | ||
| }); | ||
| }); | ||
| }); | ||
| describe("detectWindowsPackageManager", () => { | ||
| it("should return winget when installed via winget", () => { | ||
| vi.mocked(executableIsAvailable).mockImplementation((name) => { | ||
| return name === "winget"; | ||
| }); | ||
| vi.mocked(execSync).mockReturnValue("Aptos.Aptos 1.0.0"); | ||
| expect(detectWindowsPackageManager()).toBe("winget"); | ||
| }); | ||
| it("should return choco when installed via choco", () => { | ||
| vi.mocked(executableIsAvailable).mockImplementation((name) => { | ||
| if (name === "winget") | ||
| return false; | ||
| if (name === "choco") | ||
| return true; | ||
| return false; | ||
| }); | ||
| vi.mocked(execSync).mockReturnValue("aptos 1.0.0"); | ||
| expect(detectWindowsPackageManager()).toBe("choco"); | ||
| }); | ||
| it("should return null when not installed via package manager", () => { | ||
| vi.mocked(executableIsAvailable).mockReturnValue(false); | ||
| expect(detectWindowsPackageManager()).toBeNull(); | ||
| }); | ||
| }); | ||
| }); | ||
| //# sourceMappingURL=windowsPackageManagers.test.js.map |
| {"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"]} |
+7
-2
| #!/usr/bin/env node | ||
| import { program } from "commander"; | ||
| import { runCLI } from "./tasks/run.js"; | ||
| import { parseCommandOptions } from "./utils/parseCommandOptions.js"; | ||
| import { runCLI } from "./tasks/run.js"; | ||
| program | ||
@@ -11,3 +11,5 @@ .name("aptos") | ||
| .option("-b, --binary-path <path>", "path to an existing Aptos CLI binary") | ||
| .allowUnknownOption(); | ||
| .option("-d, --direct-download", "skip package managers and download directly from GitHub") | ||
| .allowUnknownOption() | ||
| .allowExcessArguments(true); | ||
| program.parse(process.argv); | ||
@@ -19,2 +21,5 @@ const main = async () => { | ||
| binaryPath: program.opts().binaryPath, | ||
| directDownload: program.opts().directDownload || | ||
| process.env.APTOS_DIRECT_DOWNLOAD === "1" || | ||
| process.env.APTOS_DIRECT_DOWNLOAD === "true", | ||
| }; | ||
@@ -21,0 +26,0 @@ const unknownOptions = program.args; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"aptos.js","sourceRoot":"","sources":["../bin/aptos.ts"],"names":[],"mappings":";AAWA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,UAAU,CAAC,KAAK,CAAC;KACjB,MAAM,CAAC,eAAe,EAAE,uCAAuC,CAAC;KAChE,MAAM,CAAC,cAAc,EAAE,sCAAsC,CAAC;KAC9D,MAAM,CAAC,0BAA0B,EAAE,sCAAsC,CAAC;KAC1E,kBAAkB,EAAE,CAAC;AAExB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;IACtB,MAAM,OAAO,GAAG;QACd,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO;QAC/B,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM;QAC7B,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,UAAU;KACtC,CAAC;IACF,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAGpC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAEpC,OAAO,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AACrD,CAAC,CAAC;AAEF,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"} | ||
| {"version":3,"file":"aptos.js","sourceRoot":"","sources":["../bin/aptos.ts"],"names":[],"mappings":";AAkBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,UAAU,CAAC,KAAK,CAAC;KACjB,MAAM,CAAC,eAAe,EAAE,uCAAuC,CAAC;KAChE,MAAM,CAAC,cAAc,EAAE,sCAAsC,CAAC;KAC9D,MAAM,CAAC,0BAA0B,EAAE,sCAAsC,CAAC;KAC1E,MAAM,CACL,uBAAuB,EACvB,yDAAyD,CAC1D;KACA,kBAAkB,EAAE;KACpB,oBAAoB,CAAC,IAAI,CAAC,CAAC;AAE9B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;IACtB,MAAM,OAAO,GAAG;QACd,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO;QAC/B,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM;QAC7B,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,UAAU;QACrC,cAAc,EACZ,OAAO,CAAC,IAAI,EAAE,CAAC,cAAc;YAC7B,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,GAAG;YACzC,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,MAAM;KAC/C,CAAC;IACF,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAGpC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAEpC,OAAO,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AACrD,CAAC,CAAC;AAEF,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\n\n// Installation priorities by platform:\n//\n// macOS:\n// 1. Homebrew (if available) - builds for native CPU architecture\n// 2. Direct download from GitHub releases\n//\n// Windows:\n// 1. winget (if available)\n// 2. Chocolatey (if available)\n// 3. Direct download from GitHub releases\n//\n// Linux:\n// - Direct download from GitHub releases (with Ubuntu version detection)\n//\n// Use --direct-download or set APTOS_DIRECT_DOWNLOAD=1 to skip package managers.\n\nimport { program } from \"commander\";\nimport { runCLI } from \"./tasks/run.js\";\nimport { parseCommandOptions } from \"./utils/parseCommandOptions.js\";\n\nprogram\n .name(\"aptos\")\n .helpOption(false)\n .option(\"-i, --install\", \"install the latest version of the CLI\")\n .option(\"-u, --update\", \"update the CLI to the latest version\")\n .option(\"-b, --binary-path <path>\", \"path to an existing Aptos CLI binary\")\n .option(\n \"-d, --direct-download\",\n \"skip package managers and download directly from GitHub\",\n )\n .allowUnknownOption()\n .allowExcessArguments(true);\n\nprogram.parse(process.argv);\n\nconst main = async () => {\n const options = {\n install: program.opts().install,\n update: program.opts().update,\n binaryPath: program.opts().binaryPath,\n directDownload:\n program.opts().directDownload ||\n process.env.APTOS_DIRECT_DOWNLOAD === \"1\" ||\n process.env.APTOS_DIRECT_DOWNLOAD === \"true\",\n };\n const unknownOptions = program.args;\n\n // Manually check for `--help` and handle the CLI `--help`\n if (process.argv.includes(\"--help\")) {\n // Forward to the CLI\n return runCLI(unknownOptions, options.binaryPath);\n }\n\n await parseCommandOptions(options, unknownOptions);\n};\n\nmain().catch(console.error);\n"]} |
+82
-31
@@ -1,42 +0,93 @@ | ||
| import { execSync } from "child_process"; | ||
| import { existsSync } from "fs"; | ||
| import { execSync } from "node:child_process"; | ||
| import { chmodSync, existsSync, mkdirSync } from "node:fs"; | ||
| import { tmpdir } from "node:os"; | ||
| import { join } from "node:path"; | ||
| import { installViaBrew, isBrewAvailable, isInstalledViaBrew, } from "../utils/brewOperations.js"; | ||
| import { GH_CLI_DOWNLOAD_URL, PNAME } from "../utils/consts.js"; | ||
| import { execSyncShell } from "../utils/execSyncShell.js"; | ||
| import { getCurrentOpenSSLVersion } from "../utils/versions.js"; | ||
| import { getOS } from "../utils/getUserOs.js"; | ||
| import { getLocalBinPath } from "../utils/getLocalBinPath.js"; | ||
| import { getLatestVersionGh } from "../utils/ghOperations.js"; | ||
| export const installCli = async () => { | ||
| const path = getLocalBinPath(); | ||
| if (existsSync(path)) { | ||
| import { getBinDir, getLocalBinPath, invalidateBinPathCache, } from "../utils/getLocalBinPath.js"; | ||
| import { getOS, getTargetPlatform } from "../utils/getUserOs.js"; | ||
| import { getCliVersion, hasUserSpecifiedVersion, } from "../utils/ghOperations.js"; | ||
| import { installViaChoco, installViaWinget, isChocoAvailable, isInstalledViaChoco, isInstalledViaWinget, isWingetAvailable, } from "../utils/windowsPackageManagers.js"; | ||
| export const installCli = async (directDownload = false) => { | ||
| invalidateBinPathCache(); | ||
| const os = getOS(); | ||
| const useDirectDownload = directDownload || hasUserSpecifiedVersion(); | ||
| if (useDirectDownload && hasUserSpecifiedVersion()) { | ||
| console.log(`Using specified version from APTOS_CLI_VERSION: ${process.env.APTOS_CLI_VERSION}`); | ||
| } | ||
| if (!useDirectDownload) { | ||
| if (os === "MacOS" && isBrewAvailable()) { | ||
| if (isInstalledViaBrew()) { | ||
| console.log("Aptos CLI is already installed via Homebrew"); | ||
| return; | ||
| } | ||
| installViaBrew(); | ||
| return; | ||
| } | ||
| if (os === "Windows") { | ||
| if (isWingetAvailable()) { | ||
| if (isInstalledViaWinget()) { | ||
| console.log("Aptos CLI is already installed via winget"); | ||
| return; | ||
| } | ||
| installViaWinget(); | ||
| return; | ||
| } | ||
| if (isChocoAvailable()) { | ||
| if (isInstalledViaChoco()) { | ||
| console.log("Aptos CLI is already installed via Chocolatey"); | ||
| return; | ||
| } | ||
| installViaChoco(); | ||
| return; | ||
| } | ||
| } | ||
| } | ||
| const binaryPath = getLocalBinPath(); | ||
| if (existsSync(binaryPath)) { | ||
| console.log("Aptos CLI is already installed"); | ||
| return; | ||
| } | ||
| const latestCLIVersion = await getLatestVersionGh(); | ||
| console.log(`Downloading aptos CLI version ${latestCLIVersion}`); | ||
| const os = getOS(); | ||
| if (os === "Windows") { | ||
| const url = `${GH_CLI_DOWNLOAD_URL}/${PNAME}-v${latestCLIVersion}/${PNAME}-${latestCLIVersion}-${os}-x86_64.zip`; | ||
| execSync(`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}\""`); | ||
| const binDir = getBinDir(); | ||
| if (!existsSync(binDir)) { | ||
| mkdirSync(binDir, { recursive: true }); | ||
| } | ||
| else if (os === "MacOS") { | ||
| execSyncShell("brew install aptos", { encoding: "utf8" }); | ||
| } | ||
| else { | ||
| let osVersion = "x86_64"; | ||
| let opensSslVersion = "1.0.0"; | ||
| try { | ||
| opensSslVersion = getCurrentOpenSSLVersion(); | ||
| const targetPlatform = getTargetPlatform(); | ||
| const version = await getCliVersion(targetPlatform); | ||
| console.log(`Downloading Aptos CLI version ${version} for ${targetPlatform}...`); | ||
| const url = `${GH_CLI_DOWNLOAD_URL}/${PNAME}-v${version}/${PNAME}-${version}-${targetPlatform}.zip`; | ||
| const tempDir = tmpdir(); | ||
| try { | ||
| if (os === "Windows") { | ||
| const zipPath = join(tempDir, "aptos-cli.zip"); | ||
| execSync(`powershell -Command "` + | ||
| `Invoke-WebRequest -Uri '${url}' -OutFile '${zipPath}'; ` + | ||
| `Expand-Archive -Path '${zipPath}' -DestinationPath '${binDir}' -Force; ` + | ||
| `Remove-Item -Path '${zipPath}' -Force"`, { stdio: "inherit" }); | ||
| } | ||
| catch (error) { | ||
| console.log("Could not determine OpenSSL version, assuming older version (1.x.x)"); | ||
| else { | ||
| const zipPath = join(tempDir, "aptos-cli.zip"); | ||
| execSync(`curl -L -o "${zipPath}" "${url}"`, { stdio: "inherit" }); | ||
| execSync(`unzip -o -q "${zipPath}" -d "${tempDir}"`, { | ||
| stdio: "inherit", | ||
| }); | ||
| const extractedBinary = join(tempDir, "aptos"); | ||
| execSync(`mv "${extractedBinary}" "${binaryPath}"`, { stdio: "inherit" }); | ||
| chmodSync(binaryPath, 0o755); | ||
| try { | ||
| execSync(`rm -f "${zipPath}"`, { stdio: "ignore" }); | ||
| } | ||
| catch { | ||
| } | ||
| } | ||
| if (opensSslVersion.startsWith("3.")) { | ||
| osVersion = "22.04-x86_64"; | ||
| console.log(`Aptos CLI installed successfully to ${binaryPath}`); | ||
| if (os !== "Windows") { | ||
| console.log(`\nMake sure ${binDir} is in your PATH. You can add it by running:`); | ||
| console.log(` export PATH="${binDir}:$PATH"`); | ||
| } | ||
| console.log(`Downloading CLI binary ${os}-${osVersion}`); | ||
| const url = `${GH_CLI_DOWNLOAD_URL}/${PNAME}-v${latestCLIVersion}/${PNAME}-${latestCLIVersion}-${os}-${osVersion}.zip`; | ||
| execSync(`curl -L -o /tmp/aptos.zip ${url}; unzip -o -q /tmp/aptos.zip -d /tmp; mv /tmp/aptos ${path};`); | ||
| } | ||
| catch (error) { | ||
| throw new Error(`Failed to install Aptos CLI: ${error instanceof Error ? error.message : String(error)}`); | ||
| } | ||
| }; | ||
| //# sourceMappingURL=install.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"install.js","sourceRoot":"","sources":["../../bin/tasks/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG9D,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;IACnC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,iCAAiC,gBAAgB,EAAE,CAAC,CAAC;IACjE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnB,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,GAAG,mBAAmB,IAAI,KAAK,KAAK,gBAAgB,IAAI,KAAK,IAAI,gBAAgB,IAAI,EAAE,aAAa,CAAC;QAEjH,QAAQ,CACN,oIAAoI,GAAG,4JAA4J,IAAI,KAAK,CAC7S,CAAC;IACJ,CAAC;SAAM,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QAE1B,aAAa,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QAGN,IAAI,SAAS,GAAG,QAAQ,CAAC;QACzB,IAAI,eAAe,GAAG,OAAO,CAAC;QAC9B,IAAI,CAAC;YACH,eAAe,GAAG,wBAAwB,EAAE,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CACT,qEAAqE,CACtE,CAAC;QACJ,CAAC;QAED,IAAI,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,SAAS,GAAG,cAAc,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,IAAI,SAAS,EAAE,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,GAAG,mBAAmB,IAAI,KAAK,KAAK,gBAAgB,IAAI,KAAK,IAAI,gBAAgB,IAAI,EAAE,IAAI,SAAS,MAAM,CAAC;QAEvH,QAAQ,CACN,6BAA6B,GAAG,uDAAuD,IAAI,GAAG,CAC/F,CAAC;IACJ,CAAC;AACH,CAAC,CAAC"} | ||
| {"version":3,"file":"install.js","sourceRoot":"","sources":["../../bin/tasks/install.ts"],"names":[],"mappings":"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","sourcesContent":["import { execSync } from \"node:child_process\";\nimport { chmodSync, existsSync, mkdirSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n installViaBrew,\n isBrewAvailable,\n isInstalledViaBrew,\n} from \"../utils/brewOperations.js\";\nimport { GH_CLI_DOWNLOAD_URL, PNAME } from \"../utils/consts.js\";\nimport {\n getBinDir,\n getLocalBinPath,\n invalidateBinPathCache,\n} from \"../utils/getLocalBinPath.js\";\nimport { getOS, getTargetPlatform } from \"../utils/getUserOs.js\";\nimport {\n getCliVersion,\n hasUserSpecifiedVersion,\n} from \"../utils/ghOperations.js\";\nimport {\n installViaChoco,\n installViaWinget,\n isChocoAvailable,\n isInstalledViaChoco,\n isInstalledViaWinget,\n isWingetAvailable,\n} from \"../utils/windowsPackageManagers.js\";\n\n/**\n * Install the Aptos CLI.\n *\n * Installation priority:\n *\n * macOS:\n * 1. Homebrew (if available)\n * 2. Direct download from GitHub releases\n *\n * Windows:\n * 1. winget (if available)\n * 2. Chocolatey (if available)\n * 3. Direct download from GitHub releases\n *\n * Linux:\n * - Direct download from GitHub releases\n *\n * Note: When APTOS_CLI_VERSION is set, package managers are skipped and the\n * specified version is downloaded directly from GitHub releases.\n *\n * @param directDownload - If true, skip package managers and download directly\n */\nexport const installCli = async (\n directDownload: boolean = false,\n): Promise<void> => {\n invalidateBinPathCache();\n const os = getOS();\n\n // If a specific version is requested, force direct download\n // Package managers don't support installing specific versions\n const useDirectDownload = directDownload || hasUserSpecifiedVersion();\n\n if (useDirectDownload && hasUserSpecifiedVersion()) {\n console.log(\n `Using specified version from APTOS_CLI_VERSION: ${process.env.APTOS_CLI_VERSION}`,\n );\n }\n\n // Skip package managers if directDownload is set or specific version requested\n if (!useDirectDownload) {\n // On macOS, prefer Homebrew if available\n if (os === \"MacOS\" && isBrewAvailable()) {\n if (isInstalledViaBrew()) {\n console.log(\"Aptos CLI is already installed via Homebrew\");\n return;\n }\n installViaBrew();\n return;\n }\n\n // On Windows, prefer winget, then Chocolatey\n if (os === \"Windows\") {\n if (isWingetAvailable()) {\n if (isInstalledViaWinget()) {\n console.log(\"Aptos CLI is already installed via winget\");\n return;\n }\n installViaWinget();\n return;\n }\n\n if (isChocoAvailable()) {\n if (isInstalledViaChoco()) {\n console.log(\"Aptos CLI is already installed via Chocolatey\");\n return;\n }\n installViaChoco();\n return;\n }\n }\n }\n\n // Direct download installation\n const binaryPath = getLocalBinPath();\n if (existsSync(binaryPath)) {\n console.log(\"Aptos CLI is already installed\");\n return;\n }\n\n // Ensure the bin directory exists\n const binDir = getBinDir();\n if (!existsSync(binDir)) {\n mkdirSync(binDir, { recursive: true });\n }\n\n // Get target platform first for version validation\n const targetPlatform = getTargetPlatform();\n\n // Get the version to install (user-specified or latest)\n const version = await getCliVersion(targetPlatform);\n\n console.log(\n `Downloading Aptos CLI version ${version} for ${targetPlatform}...`,\n );\n\n // Build download URL matching official release artifact naming\n const url = `${GH_CLI_DOWNLOAD_URL}/${PNAME}-v${version}/${PNAME}-${version}-${targetPlatform}.zip`;\n\n const tempDir = tmpdir();\n\n try {\n if (os === \"Windows\") {\n // Windows installation using PowerShell\n const zipPath = join(tempDir, \"aptos-cli.zip\");\n execSync(\n `powershell -Command \"` +\n `Invoke-WebRequest -Uri '${url}' -OutFile '${zipPath}'; ` +\n `Expand-Archive -Path '${zipPath}' -DestinationPath '${binDir}' -Force; ` +\n `Remove-Item -Path '${zipPath}' -Force\"`,\n { stdio: \"inherit\" },\n );\n } else {\n // macOS (without Homebrew) and Linux installation using curl/unzip\n const zipPath = join(tempDir, \"aptos-cli.zip\");\n\n // Download\n execSync(`curl -L -o \"${zipPath}\" \"${url}\"`, { stdio: \"inherit\" });\n\n // Extract\n execSync(`unzip -o -q \"${zipPath}\" -d \"${tempDir}\"`, {\n stdio: \"inherit\",\n });\n\n // Move binary to bin directory\n const extractedBinary = join(tempDir, \"aptos\");\n execSync(`mv \"${extractedBinary}\" \"${binaryPath}\"`, { stdio: \"inherit\" });\n\n // Set executable permissions\n chmodSync(binaryPath, 0o755);\n\n // Clean up\n try {\n execSync(`rm -f \"${zipPath}\"`, { stdio: \"ignore\" });\n } catch {\n // Ignore cleanup errors\n }\n }\n\n console.log(`Aptos CLI installed successfully to ${binaryPath}`);\n\n // Remind user about PATH if needed\n if (os !== \"Windows\") {\n console.log(\n `\\nMake sure ${binDir} is in your PATH. You can add it by running:`,\n );\n console.log(` export PATH=\"${binDir}:$PATH\"`);\n }\n } catch (error) {\n throw new Error(\n `Failed to install Aptos CLI: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n};\n"]} |
+13
-8
@@ -1,8 +0,8 @@ | ||
| import { spawn } from "child_process"; | ||
| import { existsSync } from "fs"; | ||
| import { getOS } from "../utils/getUserOs.js"; | ||
| import { spawn } from "node:child_process"; | ||
| import { existsSync } from "node:fs"; | ||
| import { getLocalBinPath } from "../utils/getLocalBinPath.js"; | ||
| import { getPlatformInfo } from "../utils/getUserOs.js"; | ||
| export const runCLI = async (args = [], binaryPath) => { | ||
| const path = binaryPath || getLocalBinPath(); | ||
| if (!existsSync(path)) { | ||
| const cliPath = binaryPath || getLocalBinPath(); | ||
| if (!existsSync(cliPath)) { | ||
| if (binaryPath) { | ||
@@ -15,8 +15,13 @@ console.error(`Error: Binary not found at specified path: ${binaryPath}`); | ||
| } | ||
| const os = getOS(); | ||
| spawn(path, args, { | ||
| const { os } = getPlatformInfo(); | ||
| const child = spawn(cliPath, args, { | ||
| stdio: "inherit", | ||
| shell: os === "Windows", | ||
| shell: os === "windows", | ||
| }); | ||
| child.on("exit", (code) => { | ||
| if (code !== null && code !== 0) { | ||
| process.exit(code); | ||
| } | ||
| }); | ||
| }; | ||
| //# sourceMappingURL=run.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"run.js","sourceRoot":"","sources":["../../bin/tasks/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAAE,OAAiB,EAAE,EAAE,UAAmB,EAAE,EAAE;IACvE,MAAM,IAAI,GAAG,UAAU,IAAI,eAAe,EAAE,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8CAA8C,UAAU,EAAE,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CACT,+DAA+D,CAChE,CAAC;QACF,OAAO;IACT,CAAC;IACD,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAInB,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE;QAChB,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,EAAE,KAAK,SAAS;KACxB,CAAC,CAAC;AACL,CAAC,CAAC"} | ||
| {"version":3,"file":"run.js","sourceRoot":"","sources":["../../bin/tasks/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAOxD,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EACzB,OAAiB,EAAE,EACnB,UAAmB,EACJ,EAAE;IACjB,MAAM,OAAO,GAAG,UAAU,IAAI,eAAe,EAAE,CAAC;IAEhD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8CAA8C,UAAU,EAAE,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CACT,+DAA+D,CAChE,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,EAAE,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;IAGjC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;QACjC,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,EAAE,KAAK,SAAS;KACxB,CAAC,CAAC;IAGH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { getLocalBinPath } from \"../utils/getLocalBinPath.js\";\nimport { getPlatformInfo } from \"../utils/getUserOs.js\";\n\n/**\n * Run the Aptos CLI with the provided arguments.\n * @param args - Arguments to pass to the CLI\n * @param binaryPath - Optional path to a custom binary\n */\nexport const runCLI = async (\n args: string[] = [],\n binaryPath?: string,\n): Promise<void> => {\n const cliPath = binaryPath || getLocalBinPath();\n\n if (!existsSync(cliPath)) {\n if (binaryPath) {\n console.error(`Error: Binary not found at specified path: ${binaryPath}`);\n process.exit(1);\n }\n console.log(\n \"Aptos CLI not installed, run `npx aptos --install` to install\",\n );\n return;\n }\n\n const { os } = getPlatformInfo();\n\n // Spawn a child process to run the real CLI executable with the forwarded arguments\n const child = spawn(cliPath, args, {\n stdio: \"inherit\", // Forward the stdio so output is visible\n shell: os === \"windows\", // Use shell on Windows for proper path handling\n });\n\n // Forward the exit code from the child process to the parent\n child.on(\"exit\", (code) => {\n if (code !== null && code !== 0) {\n process.exit(code);\n }\n });\n};\n"]} |
+55
-20
@@ -1,33 +0,68 @@ | ||
| import { existsSync } from "fs"; | ||
| import { getLocalBinPath } from "../utils/getLocalBinPath.js"; | ||
| import { execSync } from "child_process"; | ||
| import { getOS } from "../utils/getUserOs.js"; | ||
| import { getLatestVersionGh } from "../utils/ghOperations.js"; | ||
| import { existsSync, unlinkSync } from "node:fs"; | ||
| import { isInstalledViaBrew, updateViaBrew } from "../utils/brewOperations.js"; | ||
| import { execSyncShell } from "../utils/execSyncShell.js"; | ||
| import { getLocalBinPath, invalidateBinPathCache, } from "../utils/getLocalBinPath.js"; | ||
| import { getTargetPlatform } from "../utils/getUserOs.js"; | ||
| import { getCliVersion, hasUserSpecifiedVersion, } from "../utils/ghOperations.js"; | ||
| import { isInstalledViaChoco, isInstalledViaWinget, updateViaChoco, updateViaWinget, } from "../utils/windowsPackageManagers.js"; | ||
| import { installCli } from "./install.js"; | ||
| export const updateCli = async () => { | ||
| const path = getLocalBinPath(); | ||
| if (!existsSync(path)) { | ||
| export const updateCli = async (directDownload = false) => { | ||
| invalidateBinPathCache(); | ||
| const binaryPath = getLocalBinPath(); | ||
| if (!existsSync(binaryPath)) { | ||
| console.log("Aptos CLI not installed, run `npx aptos --install` to install"); | ||
| return; | ||
| } | ||
| if (getOS() === "MacOS") { | ||
| return execSync("brew upgrade aptos"); | ||
| const useDirectDownload = directDownload || hasUserSpecifiedVersion(); | ||
| if (useDirectDownload && hasUserSpecifiedVersion()) { | ||
| console.log(`Using specified version from APTOS_CLI_VERSION: ${process.env.APTOS_CLI_VERSION}`); | ||
| } | ||
| else { | ||
| const latestVersion = await getLatestVersionGh(); | ||
| const currentVersion = execSyncShell(`${path} --version`, { | ||
| if (!useDirectDownload) { | ||
| if (isInstalledViaBrew()) { | ||
| updateViaBrew(); | ||
| return; | ||
| } | ||
| if (isInstalledViaWinget()) { | ||
| updateViaWinget(); | ||
| return; | ||
| } | ||
| if (isInstalledViaChoco()) { | ||
| updateViaChoco(); | ||
| return; | ||
| } | ||
| } | ||
| const targetPlatform = getTargetPlatform(); | ||
| const targetVersion = await getCliVersion(targetPlatform); | ||
| let currentVersion; | ||
| try { | ||
| const versionOutput = String(execSyncShell(`"${binaryPath}" --version`, { | ||
| encoding: "utf8", | ||
| }) | ||
| .trim() | ||
| .split(" ")[1]; | ||
| if (currentVersion !== latestVersion) { | ||
| console.log(`A newer version of the CLI is available: ${latestVersion}, installing...`); | ||
| await installCli(); | ||
| })).trim(); | ||
| currentVersion = versionOutput.split(" ")[1] || ""; | ||
| } | ||
| catch { | ||
| console.error("Warning: Could not determine current CLI version"); | ||
| currentVersion = ""; | ||
| } | ||
| if (currentVersion === targetVersion) { | ||
| if (hasUserSpecifiedVersion()) { | ||
| console.log(`CLI is already at the specified version (${currentVersion})`); | ||
| } | ||
| else { | ||
| console.log(`CLI is up to date`); | ||
| console.log(`CLI is up to date (version ${currentVersion})`); | ||
| } | ||
| return; | ||
| } | ||
| const updateDescription = hasUserSpecifiedVersion() | ||
| ? `Switching CLI from version ${currentVersion || "unknown"} to ${targetVersion}...` | ||
| : `Updating CLI from version ${currentVersion || "unknown"} to ${targetVersion}...`; | ||
| console.log(updateDescription); | ||
| try { | ||
| unlinkSync(binaryPath); | ||
| } | ||
| catch { | ||
| console.error(`Warning: Could not remove old binary at ${binaryPath}`); | ||
| } | ||
| await installCli(useDirectDownload); | ||
| }; | ||
| //# sourceMappingURL=update.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"update.js","sourceRoot":"","sources":["../../bin/tasks/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;IAClC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAE/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CACT,+DAA+D,CAChE,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,KAAK,EAAE,KAAK,OAAO,EAAE,CAAC;QAExB,OAAO,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,MAAM,aAAa,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAEjD,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,IAAI,YAAY,EAAE;YACxD,QAAQ,EAAE,MAAM;SACjB,CAAC;aACC,IAAI,EAAE;aACN,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjB,IAAI,cAAc,KAAK,aAAa,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CACT,4CAA4C,aAAa,iBAAiB,CAC3E,CAAC;YACF,MAAM,UAAU,EAAE,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;AACH,CAAC,CAAC"} | ||
| {"version":3,"file":"update.js","sourceRoot":"","sources":["../../bin/tasks/update.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, unlinkSync } from \"node:fs\";\nimport { isInstalledViaBrew, updateViaBrew } from \"../utils/brewOperations.js\";\nimport { execSyncShell } from \"../utils/execSyncShell.js\";\nimport {\n getLocalBinPath,\n invalidateBinPathCache,\n} from \"../utils/getLocalBinPath.js\";\nimport { getTargetPlatform } from \"../utils/getUserOs.js\";\nimport {\n getCliVersion,\n hasUserSpecifiedVersion,\n} from \"../utils/ghOperations.js\";\nimport {\n isInstalledViaChoco,\n isInstalledViaWinget,\n updateViaChoco,\n updateViaWinget,\n} from \"../utils/windowsPackageManagers.js\";\nimport { installCli } from \"./install.js\";\n\n/**\n * Update the Aptos CLI to the latest version (or a specific version if APTOS_CLI_VERSION is set).\n *\n * Update methods by installation type:\n * - Homebrew: `brew upgrade aptos`\n * - winget: `winget upgrade`\n * - Chocolatey: `choco upgrade`\n * - Direct download: Compare versions and reinstall if newer/different\n *\n * Note: When APTOS_CLI_VERSION is set, package managers are skipped and the\n * specified version is downloaded directly from GitHub releases.\n *\n * @param directDownload - If true, skip package manager updates and force direct download\n */\nexport const updateCli = async (\n directDownload: boolean = false,\n): Promise<void> => {\n invalidateBinPathCache();\n const binaryPath = getLocalBinPath();\n\n if (!existsSync(binaryPath)) {\n console.log(\n \"Aptos CLI not installed, run `npx aptos --install` to install\",\n );\n return;\n }\n\n // If a specific version is requested, force direct download\n const useDirectDownload = directDownload || hasUserSpecifiedVersion();\n\n if (useDirectDownload && hasUserSpecifiedVersion()) {\n console.log(\n `Using specified version from APTOS_CLI_VERSION: ${process.env.APTOS_CLI_VERSION}`,\n );\n }\n\n // Check for package manager installations (unless directDownload is set or specific version requested)\n if (!useDirectDownload) {\n // If installed via Homebrew, use brew upgrade\n if (isInstalledViaBrew()) {\n updateViaBrew();\n return;\n }\n\n // If installed via winget, use winget upgrade\n if (isInstalledViaWinget()) {\n updateViaWinget();\n return;\n }\n\n // If installed via Chocolatey, use choco upgrade\n if (isInstalledViaChoco()) {\n updateViaChoco();\n return;\n }\n }\n\n // Get target platform for version validation\n const targetPlatform = getTargetPlatform();\n\n // Get the target version (user-specified or latest)\n const targetVersion = await getCliVersion(targetPlatform);\n\n // Get the current version of the CLI\n let currentVersion: string;\n try {\n const versionOutput = String(\n execSyncShell(`\"${binaryPath}\" --version`, {\n encoding: \"utf8\",\n }),\n ).trim();\n // Version output format: \"aptos X.Y.Z\"\n currentVersion = versionOutput.split(\" \")[1] || \"\";\n } catch {\n console.error(\"Warning: Could not determine current CLI version\");\n currentVersion = \"\";\n }\n\n // Check if the installed version matches the target version\n if (currentVersion === targetVersion) {\n if (hasUserSpecifiedVersion()) {\n console.log(\n `CLI is already at the specified version (${currentVersion})`,\n );\n } else {\n console.log(`CLI is up to date (version ${currentVersion})`);\n }\n return;\n }\n\n const updateDescription = hasUserSpecifiedVersion()\n ? `Switching CLI from version ${currentVersion || \"unknown\"} to ${targetVersion}...`\n : `Updating CLI from version ${currentVersion || \"unknown\"} to ${targetVersion}...`;\n\n console.log(updateDescription);\n\n // Remove the old binary before installing the new one\n try {\n unlinkSync(binaryPath);\n } catch {\n console.error(`Warning: Could not remove old binary at ${binaryPath}`);\n }\n\n await installCli(useDirectDownload);\n};\n"]} |
@@ -1,8 +0,34 @@ | ||
| import { execSyncShell } from "./execSyncShell.js"; | ||
| import { execSync } from "node:child_process"; | ||
| import { existsSync } from "node:fs"; | ||
| import { executableIsAvailable } from "./executableIsAvailable.js"; | ||
| export const isBrewAvailable = () => { | ||
| return executableIsAvailable("brew"); | ||
| }; | ||
| export const isInstalledViaBrew = () => { | ||
| if (!isBrewAvailable()) { | ||
| return false; | ||
| } | ||
| try { | ||
| const path = getCliPathBrew(); | ||
| return existsSync(path); | ||
| } | ||
| catch { | ||
| return false; | ||
| } | ||
| }; | ||
| export const getCliPathBrew = () => { | ||
| const directory = execSyncShell("brew --prefix aptos", { encoding: "utf8" }) | ||
| .toString() | ||
| .trim(); | ||
| const directory = execSync("brew --prefix aptos", { | ||
| encoding: "utf8", | ||
| stdio: ["pipe", "pipe", "pipe"], | ||
| }).trim(); | ||
| return `${directory}/bin/aptos`; | ||
| }; | ||
| export const installViaBrew = () => { | ||
| console.log("Installing Aptos CLI via Homebrew..."); | ||
| execSync("brew install aptos", { stdio: "inherit" }); | ||
| }; | ||
| export const updateViaBrew = () => { | ||
| console.log("Updating Aptos CLI via Homebrew..."); | ||
| execSync("brew upgrade aptos", { stdio: "inherit" }); | ||
| }; | ||
| //# sourceMappingURL=brewOperations.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"brewOperations.js","sourceRoot":"","sources":["../../bin/utils/brewOperations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMnD,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IACjC,MAAM,SAAS,GAAG,aAAa,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;SACzE,QAAQ,EAAE;SACV,IAAI,EAAE,CAAC;IACV,OAAO,GAAG,SAAS,YAAY,CAAC;AAClC,CAAC,CAAC"} | ||
| {"version":3,"file":"brewOperations.js","sourceRoot":"","sources":["../../bin/utils/brewOperations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAKnE,MAAM,CAAC,MAAM,eAAe,GAAG,GAAY,EAAE;IAC3C,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAY,EAAE;IAC9C,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAW,EAAE;IACzC,MAAM,SAAS,GAAG,QAAQ,CAAC,qBAAqB,EAAE;QAChD,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;KAChC,CAAC,CAAC,IAAI,EAAE,CAAC;IACV,OAAO,GAAG,SAAS,YAAY,CAAC;AAClC,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAS,EAAE;IACvC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,QAAQ,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACvD,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,aAAa,GAAG,GAAS,EAAE;IACtC,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,QAAQ,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACvD,CAAC,CAAC","sourcesContent":["import { execSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { executableIsAvailable } from \"./executableIsAvailable.js\";\n\n/**\n * Check if Homebrew is available on the system.\n */\nexport const isBrewAvailable = (): boolean => {\n return executableIsAvailable(\"brew\");\n};\n\n/**\n * Check if the Aptos CLI was installed via Homebrew.\n */\nexport const isInstalledViaBrew = (): boolean => {\n if (!isBrewAvailable()) {\n return false;\n }\n try {\n const path = getCliPathBrew();\n return existsSync(path);\n } catch {\n return false;\n }\n};\n\n/**\n * Get the path to the Aptos CLI binary installed via Homebrew.\n * Based on the installation path of the aptos formula.\n */\nexport const getCliPathBrew = (): string => {\n const directory = execSync(\"brew --prefix aptos\", {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n return `${directory}/bin/aptos`;\n};\n\n/**\n * Install the Aptos CLI via Homebrew.\n */\nexport const installViaBrew = (): void => {\n console.log(\"Installing Aptos CLI via Homebrew...\");\n execSync(\"brew install aptos\", { stdio: \"inherit\" });\n};\n\n/**\n * Update the Aptos CLI via Homebrew.\n */\nexport const updateViaBrew = (): void => {\n console.log(\"Updating Aptos CLI via Homebrew...\");\n execSync(\"brew upgrade aptos\", { stdio: \"inherit\" });\n};\n"]} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"consts.js","sourceRoot":"","sources":["../../bin/utils/consts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAAC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAC9B,4DAA4D,CAAC"} | ||
| {"version":3,"file":"consts.js","sourceRoot":"","sources":["../../bin/utils/consts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAAC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAC9B,4DAA4D,CAAC","sourcesContent":["export const PNAME = \"aptos-cli\";\nexport const GH_CLI_DOWNLOAD_URL =\n \"https://github.com/aptos-labs/aptos-core/releases/download\";\n"]} |
@@ -1,5 +0,9 @@ | ||
| import { execSync } from "child_process"; | ||
| import { execSync } from "node:child_process"; | ||
| export const execSyncShell = (command, options) => { | ||
| return execSync(command, { shell: true, ...options }); | ||
| const execOptions = { | ||
| ...options, | ||
| shell: true, | ||
| }; | ||
| return execSync(command, execOptions); | ||
| }; | ||
| //# sourceMappingURL=execSyncShell.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"execSyncShell.js","sourceRoot":"","sources":["../../bin/utils/execSyncShell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAKzC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;IAChD,OAAO,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AACxD,CAAC,CAAC"} | ||
| {"version":3,"file":"execSyncShell.js","sourceRoot":"","sources":["../../bin/utils/execSyncShell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAQpE,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAAe,EACf,OAA8B,EACb,EAAE;IAGnB,MAAM,WAAW,GAAG;QAClB,GAAG,OAAO;QACV,KAAK,EAAE,IAAI;KACkB,CAAC;IAChC,OAAO,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACxC,CAAC,CAAC","sourcesContent":["import { type ExecSyncOptions, execSync } from \"node:child_process\";\n\ntype ExecSyncShellOptions = Omit<ExecSyncOptions, \"shell\">;\n\n/**\n * Wrapper around execSync that uses the shell.\n * This always executes with shell: true for cross-platform compatibility.\n */\nexport const execSyncShell = (\n command: string,\n options?: ExecSyncShellOptions,\n): Buffer | string => {\n // Type assertion needed due to @types/node ExecSyncOptions overload complexity\n // where shell is typed as string | boolean but overloads expect specific types\n const execOptions = {\n ...options,\n shell: true,\n } as unknown as ExecSyncOptions;\n return execSync(command, execOptions);\n};\n"]} |
@@ -1,30 +0,86 @@ | ||
| import { dirname } from "path"; | ||
| import { executableIsAvailable } from "./aptosExecutableIsAvailable.js"; | ||
| import { getCliPathBrew } from "./brewOperations.js"; | ||
| import { PNAME } from "./consts.js"; | ||
| import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync, } from "node:fs"; | ||
| import { homedir } from "node:os"; | ||
| import { dirname, join } from "node:path"; | ||
| import { getCliPathBrew, isInstalledViaBrew } from "./brewOperations.js"; | ||
| import { getOS } from "./getUserOs.js"; | ||
| import { fileURLToPath } from "url"; | ||
| import { getCliPathChoco, getCliPathWinget, isInstalledViaChoco, isInstalledViaWinget, } from "./windowsPackageManagers.js"; | ||
| const getCachePath = () => { | ||
| if (getOS() === "Windows") { | ||
| return join(homedir(), ".aptoscli", ".bin-path-cache"); | ||
| } | ||
| return join(homedir(), ".local", "share", "aptos-cli", ".bin-path-cache"); | ||
| }; | ||
| const readCachedBinPath = () => { | ||
| try { | ||
| const cached = readFileSync(getCachePath(), "utf8").trim(); | ||
| if (cached && existsSync(cached)) { | ||
| return cached; | ||
| } | ||
| } | ||
| catch { | ||
| } | ||
| return undefined; | ||
| }; | ||
| const writeCachedBinPath = (binPath) => { | ||
| try { | ||
| const cachePath = getCachePath(); | ||
| mkdirSync(dirname(cachePath), { recursive: true }); | ||
| writeFileSync(cachePath, binPath, "utf8"); | ||
| } | ||
| catch { | ||
| } | ||
| }; | ||
| export const invalidateBinPathCache = () => { | ||
| try { | ||
| unlinkSync(getCachePath()); | ||
| } | ||
| catch { | ||
| } | ||
| }; | ||
| export const getBinDir = () => { | ||
| const os = getOS(); | ||
| if (os === "Windows") { | ||
| return join(homedir(), ".aptoscli", "bin"); | ||
| } | ||
| return join(homedir(), ".local", "bin"); | ||
| }; | ||
| export const getLocalBinPath = () => { | ||
| let path; | ||
| const cached = readCachedBinPath(); | ||
| if (cached) { | ||
| return cached; | ||
| } | ||
| const os = getOS(); | ||
| if (os === "MacOS") { | ||
| const brewInstalled = executableIsAvailable("brew"); | ||
| if (!brewInstalled) { | ||
| throw "Please install brew to continue: https://brew.sh/"; | ||
| if (isInstalledViaBrew()) { | ||
| try { | ||
| const brewPath = getCliPathBrew(); | ||
| writeCachedBinPath(brewPath); | ||
| return brewPath; | ||
| } | ||
| catch { | ||
| } | ||
| } | ||
| try { | ||
| path = getCliPathBrew(); | ||
| } | ||
| if (os === "Windows") { | ||
| if (isInstalledViaWinget()) { | ||
| const wingetPath = getCliPathWinget(); | ||
| if (wingetPath) { | ||
| writeCachedBinPath(wingetPath); | ||
| return wingetPath; | ||
| } | ||
| } | ||
| catch (e) { | ||
| path = ""; | ||
| if (isInstalledViaChoco()) { | ||
| const chocoPath = getCliPathChoco(); | ||
| if (chocoPath) { | ||
| writeCachedBinPath(chocoPath); | ||
| return chocoPath; | ||
| } | ||
| } | ||
| } | ||
| else if (os === "Windows") { | ||
| path = `${dirname(fileURLToPath(import.meta.url))}\\${PNAME}.exe`; | ||
| } | ||
| else { | ||
| path = `${dirname(fileURLToPath(import.meta.url))}/${PNAME}`; | ||
| } | ||
| return path; | ||
| const binDir = getBinDir(); | ||
| const binaryName = os === "Windows" ? "aptos.exe" : "aptos"; | ||
| const defaultPath = join(binDir, binaryName); | ||
| writeCachedBinPath(defaultPath); | ||
| return defaultPath; | ||
| }; | ||
| //# sourceMappingURL=getLocalBinPath.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"getLocalBinPath.js","sourceRoot":"","sources":["../../bin/utils/getLocalBinPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE;IAClC,IAAI,IAAI,CAAC;IACT,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QAEnB,MAAM,aAAa,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,mDAAmD,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC;YACH,IAAI,GAAG,cAAc,EAAE,CAAC;QAC1B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,GAAG,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;SAAM,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;IAC/D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"} | ||
| {"version":3,"file":"getLocalBinPath.js","sourceRoot":"","sources":["../../bin/utils/getLocalBinPath.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n existsSync,\n mkdirSync,\n readFileSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { getCliPathBrew, isInstalledViaBrew } from \"./brewOperations.js\";\nimport { getOS } from \"./getUserOs.js\";\nimport {\n getCliPathChoco,\n getCliPathWinget,\n isInstalledViaChoco,\n isInstalledViaWinget,\n} from \"./windowsPackageManagers.js\";\n\n/**\n * Path to the cached binary location file.\n * Avoids expensive shell spawns (brew --prefix, winget list) on every run.\n */\nconst getCachePath = (): string => {\n if (getOS() === \"Windows\") {\n return join(homedir(), \".aptoscli\", \".bin-path-cache\");\n }\n return join(homedir(), \".local\", \"share\", \"aptos-cli\", \".bin-path-cache\");\n};\n\nconst readCachedBinPath = (): string | undefined => {\n try {\n const cached = readFileSync(getCachePath(), \"utf8\").trim();\n if (cached && existsSync(cached)) {\n return cached;\n }\n } catch {\n // No cache or unreadable\n }\n return undefined;\n};\n\nconst writeCachedBinPath = (binPath: string): void => {\n try {\n const cachePath = getCachePath();\n mkdirSync(dirname(cachePath), { recursive: true });\n writeFileSync(cachePath, binPath, \"utf8\");\n } catch {\n // Non-fatal — caching is best-effort\n }\n};\n\n/**\n * Invalidate the cached binary path.\n * Call this when install or update changes the binary location.\n */\nexport const invalidateBinPathCache = (): void => {\n try {\n unlinkSync(getCachePath());\n } catch {\n // No cache to invalidate\n }\n};\n\n/**\n * Get the binary directory path where the CLI should be installed.\n * Matches the official Aptos CLI install scripts:\n * - macOS/Linux: ~/.local/bin\n * - Windows: $USERPROFILE\\.aptoscli\\bin\n */\nexport const getBinDir = (): string => {\n const os = getOS();\n\n if (os === \"Windows\") {\n // Match official Windows script: $env:USERPROFILE\\.aptoscli\\bin\n return join(homedir(), \".aptoscli\", \"bin\");\n }\n\n // Match official Unix script: $HOME/.local/bin\n return join(homedir(), \".local\", \"bin\");\n};\n\n/**\n * Get the full path to the Aptos CLI binary.\n *\n * Uses a file-based cache to avoid expensive shell spawns (brew --prefix,\n * winget list) on every invocation. The cache is invalidated by install\n * and update tasks.\n *\n * Checks for package manager installations first:\n * - macOS: Homebrew\n * - Windows: winget, then Chocolatey\n *\n * Otherwise uses the standard paths:\n * - macOS/Linux: ~/.local/bin/aptos\n * - Windows: $USERPROFILE\\.aptoscli\\bin\\aptos.exe\n */\nexport const getLocalBinPath = (): string => {\n // Fast path: return cached binary location if still valid\n const cached = readCachedBinPath();\n if (cached) {\n return cached;\n }\n\n const os = getOS();\n\n // On macOS, prefer Homebrew installation if it exists\n if (os === \"MacOS\") {\n if (isInstalledViaBrew()) {\n try {\n const brewPath = getCliPathBrew();\n writeCachedBinPath(brewPath);\n return brewPath;\n } catch {\n // Fall through to default path\n }\n }\n }\n\n // On Windows, check for winget or Chocolatey installations\n if (os === \"Windows\") {\n if (isInstalledViaWinget()) {\n const wingetPath = getCliPathWinget();\n if (wingetPath) {\n writeCachedBinPath(wingetPath);\n return wingetPath;\n }\n }\n\n if (isInstalledViaChoco()) {\n const chocoPath = getCliPathChoco();\n if (chocoPath) {\n writeCachedBinPath(chocoPath);\n return chocoPath;\n }\n }\n }\n\n const binDir = getBinDir();\n const binaryName = os === \"Windows\" ? \"aptos.exe\" : \"aptos\";\n const defaultPath = join(binDir, binaryName);\n writeCachedBinPath(defaultPath);\n return defaultPath;\n};\n"]} |
@@ -1,15 +0,101 @@ | ||
| import { platform } from "os"; | ||
| export const getOS = () => { | ||
| import { existsSync, readFileSync } from "node:fs"; | ||
| import { arch, platform } from "node:os"; | ||
| export const getPlatformInfo = () => { | ||
| const osPlatform = platform(); | ||
| const osArch = arch(); | ||
| let os; | ||
| switch (osPlatform) { | ||
| case "darwin": | ||
| return "MacOS"; | ||
| os = "macos"; | ||
| break; | ||
| case "linux": | ||
| return "Ubuntu"; | ||
| os = "linux"; | ||
| break; | ||
| case "win32": | ||
| return "Windows"; | ||
| os = "windows"; | ||
| break; | ||
| default: | ||
| throw new Error(`Unsupported OS ${osPlatform}`); | ||
| throw new Error(`Unsupported operating system: ${osPlatform}`); | ||
| } | ||
| let architecture; | ||
| switch (osArch) { | ||
| case "x64": | ||
| case "x86_64": | ||
| architecture = "x86_64"; | ||
| break; | ||
| case "arm64": | ||
| case "aarch64": | ||
| architecture = "aarch64"; | ||
| break; | ||
| default: | ||
| throw new Error(`Unsupported architecture: ${osArch}`); | ||
| } | ||
| return { os, arch: architecture }; | ||
| }; | ||
| const getLinuxDistroInfo = () => { | ||
| const osReleasePath = "/etc/os-release"; | ||
| if (!existsSync(osReleasePath)) { | ||
| return null; | ||
| } | ||
| try { | ||
| const content = readFileSync(osReleasePath, "utf8"); | ||
| const lines = content.split("\n"); | ||
| let id = ""; | ||
| let versionId = ""; | ||
| for (const line of lines) { | ||
| const [key, ...valueParts] = line.split("="); | ||
| const value = valueParts.join("=").replace(/^["']|["']$/g, ""); | ||
| if (key === "ID") { | ||
| id = value.toLowerCase(); | ||
| } | ||
| else if (key === "VERSION_ID") { | ||
| versionId = value; | ||
| } | ||
| } | ||
| return { id, versionId }; | ||
| } | ||
| catch { | ||
| return null; | ||
| } | ||
| }; | ||
| export const getTargetPlatform = () => { | ||
| const { os, arch: architecture } = getPlatformInfo(); | ||
| switch (os) { | ||
| case "macos": | ||
| return architecture === "aarch64" ? "macos-arm64" : "macos-x86_64"; | ||
| case "linux": { | ||
| if (architecture === "aarch64") { | ||
| return "Linux-aarch64"; | ||
| } | ||
| const distroInfo = getLinuxDistroInfo(); | ||
| if (distroInfo?.id === "ubuntu") { | ||
| if (distroInfo.versionId.startsWith("24.04")) { | ||
| return "Ubuntu-24.04-x86_64"; | ||
| } | ||
| if (distroInfo.versionId.startsWith("22.04")) { | ||
| return "Ubuntu-22.04-x86_64"; | ||
| } | ||
| } | ||
| return "Linux-x86_64"; | ||
| } | ||
| case "windows": | ||
| if (architecture === "aarch64") { | ||
| throw new Error("Windows ARM64 is not currently supported. Please use x86_64 emulation or build from source."); | ||
| } | ||
| return "Windows-x86_64"; | ||
| default: | ||
| throw new Error(`Unsupported OS: ${os}`); | ||
| } | ||
| }; | ||
| export const getOS = () => { | ||
| const { os } = getPlatformInfo(); | ||
| switch (os) { | ||
| case "macos": | ||
| return "MacOS"; | ||
| case "linux": | ||
| return "Linux"; | ||
| case "windows": | ||
| return "Windows"; | ||
| } | ||
| }; | ||
| //# sourceMappingURL=getUserOs.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"getUserOs.js","sourceRoot":"","sources":["../../bin/utils/getUserOs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAK9B,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,EAAE;IACxB,MAAM,UAAU,GAAG,QAAQ,EAAE,CAAC;IAC9B,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,OAAO,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,SAAS,CAAC;QACnB;YACE,MAAM,IAAI,KAAK,CAAC,kBAAkB,UAAU,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC,CAAC"} | ||
| {"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 only supports x86_64 currently\n if (architecture === \"aarch64\") {\n throw new Error(\n \"Windows ARM64 is not currently supported. Please use x86_64 emulation or build from source.\",\n );\n }\n return \"Windows-x86_64\";\n\n default:\n throw new Error(`Unsupported OS: ${os}`);\n }\n};\n\n/**\n * Get simple OS identifier for branching logic.\n * @deprecated Use getPlatformInfo() or getTargetPlatform() instead for more precise platform detection.\n */\nexport const getOS = (): \"MacOS\" | \"Linux\" | \"Windows\" => {\n const { os } = getPlatformInfo();\n switch (os) {\n case \"macos\":\n return \"MacOS\";\n case \"linux\":\n return \"Linux\";\n case \"windows\":\n return \"Windows\";\n }\n};\n"]} |
@@ -1,12 +0,87 @@ | ||
| import { PNAME } from "./consts.js"; | ||
| import { GH_CLI_DOWNLOAD_URL, PNAME } from "./consts.js"; | ||
| const getGitHubHeaders = () => { | ||
| const headers = { | ||
| Accept: "application/vnd.github.v3+json", | ||
| "User-Agent": "aptos-cli-npm", | ||
| }; | ||
| const token = process.env.GITHUB_TOKEN; | ||
| if (token) { | ||
| headers.Authorization = `Bearer ${token}`; | ||
| } | ||
| return headers; | ||
| }; | ||
| export const getUserSpecifiedVersion = () => { | ||
| const version = process.env.APTOS_CLI_VERSION; | ||
| if (!version) { | ||
| return undefined; | ||
| } | ||
| const stripped = version.replace(/^v/, ""); | ||
| if (!/^\d+\.\d+\.\d+(-[a-zA-Z0-9.]+)?$/.test(stripped)) { | ||
| throw new Error(`Invalid APTOS_CLI_VERSION: "${version}". Must match MAJOR.MINOR.PATCH (e.g. "4.5.0" or "v4.5.0").`); | ||
| } | ||
| return stripped; | ||
| }; | ||
| export const hasUserSpecifiedVersion = () => { | ||
| return !!process.env.APTOS_CLI_VERSION; | ||
| }; | ||
| export const validateVersionExists = async (version, targetPlatform) => { | ||
| const url = `${GH_CLI_DOWNLOAD_URL}/${PNAME}-v${version}/${PNAME}-${version}-${targetPlatform}.zip`; | ||
| try { | ||
| const response = await fetch(url, { | ||
| method: "HEAD", | ||
| headers: getGitHubHeaders(), | ||
| }); | ||
| return response.ok; | ||
| } | ||
| catch { | ||
| return false; | ||
| } | ||
| }; | ||
| export const getCliVersion = async (targetPlatform) => { | ||
| const userVersion = getUserSpecifiedVersion(); | ||
| if (userVersion) { | ||
| if (targetPlatform) { | ||
| const exists = await validateVersionExists(userVersion, targetPlatform); | ||
| if (!exists) { | ||
| throw new Error(`Specified version ${userVersion} does not exist or is not available for ${targetPlatform}. ` + | ||
| `Check https://github.com/aptos-labs/aptos-core/releases for available versions.`); | ||
| } | ||
| } | ||
| return userVersion; | ||
| } | ||
| return getLatestVersionGh(); | ||
| }; | ||
| export const getLatestVersionGh = async () => { | ||
| const prefix = `${PNAME}-v`; | ||
| const response = await (await fetch("https://api.github.com/repos/aptos-labs/aptos-core/releases?per_page=100")).json(); | ||
| for (const release of response) { | ||
| if (release["tag_name"].startsWith(`${prefix}`)) { | ||
| return release.tag_name.replace(`${prefix}`, ""); | ||
| const url = "https://api.github.com/repos/aptos-labs/aptos-core/releases?per_page=100"; | ||
| let response; | ||
| try { | ||
| response = await fetch(url, { headers: getGitHubHeaders() }); | ||
| } | ||
| catch (error) { | ||
| throw new Error(`Failed to fetch releases from GitHub: ${error instanceof Error ? error.message : String(error)}`); | ||
| } | ||
| if (!response.ok) { | ||
| if (response.status === 403 || response.status === 429) { | ||
| throw new Error("GitHub API rate limit exceeded. Please try again later or set a GITHUB_TOKEN environment variable."); | ||
| } | ||
| throw new Error(`GitHub API request failed with status ${response.status}: ${response.statusText}`); | ||
| } | ||
| throw "Could not determine latest version of Aptos CLI"; | ||
| let releases; | ||
| try { | ||
| releases = await response.json(); | ||
| } | ||
| catch { | ||
| throw new Error("Failed to parse GitHub API response as JSON"); | ||
| } | ||
| if (!Array.isArray(releases)) { | ||
| throw new Error("Unexpected response format from GitHub API"); | ||
| } | ||
| for (const release of releases) { | ||
| if (release.tag_name?.startsWith(prefix)) { | ||
| return release.tag_name.replace(prefix, ""); | ||
| } | ||
| } | ||
| throw new Error("Could not determine latest version of Aptos CLI. No matching release found in the last 100 releases."); | ||
| }; | ||
| //# sourceMappingURL=ghOperations.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"ghOperations.js","sourceRoot":"","sources":["../../bin/utils/ghOperations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAMpC,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,IAAI,EAAE;IAC3C,MAAM,MAAM,GAAG,GAAG,KAAK,IAAI,CAAC;IAC5B,MAAM,QAAQ,GAAG,MAAM,CACrB,MAAM,KAAK,CACT,0EAA0E,CAC3E,CACF,CAAC,IAAI,EAAE,CAAC;IACT,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;YAChD,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,MAAM,iDAAiD,CAAC;AAC1D,CAAC,CAAC"} | ||
| {"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 GitHubRelease {\n tag_name: string;\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"]} |
@@ -1,2 +0,2 @@ | ||
| import { existsSync } from "fs"; | ||
| import { existsSync } from "node:fs"; | ||
| import { installCli } from "../tasks/install.js"; | ||
@@ -8,7 +8,7 @@ import { runCLI } from "../tasks/run.js"; | ||
| if (options.install) { | ||
| await installCli(); | ||
| await installCli(options.directDownload); | ||
| return; | ||
| } | ||
| if (options.update) { | ||
| await updateCli(); | ||
| await updateCli(options.directDownload); | ||
| return; | ||
@@ -18,3 +18,3 @@ } | ||
| if (!options.binaryPath && !existsSync(path)) { | ||
| await installCli(); | ||
| await installCli(options.directDownload); | ||
| } | ||
@@ -21,0 +21,0 @@ await runCLI(unknownOptions, options.binaryPath); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"parseCommandOptions.js","sourceRoot":"","sources":["../../bin/utils/parseCommandOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,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;AAEvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,OAAmE,EACnE,cAAwB,EACxB,EAAE;IAEF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,UAAU,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,SAAS,EAAE,CAAC;QAClB,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,EAAE,CAAC;IACrB,CAAC;IACD,MAAM,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;AACnD,CAAC,CAAC"} | ||
| {"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"]} |
+22
-11
| { | ||
| "name": "@aptos-labs/aptos-cli", | ||
| "version": "1.1.1", | ||
| "version": "2.0.0", | ||
| "description": "Aptos CLI available from npmjs", | ||
| "engines": { | ||
| "node": ">=22" | ||
| }, | ||
| "bin": { | ||
@@ -22,18 +25,26 @@ "aptos": "./dist/aptos.js" | ||
| "license": "Apache-2.0", | ||
| "scripts": { | ||
| "clean": "rm -rf dist", | ||
| "build": "npm run clean && tsc", | ||
| "dev": "npm run build && node ./dist/aptos.js" | ||
| }, | ||
| "sideEffects": false, | ||
| "exports": {}, | ||
| "files": [ | ||
| "bin", | ||
| "dist" | ||
| ], | ||
| "dependencies": { | ||
| "commander": "^12.1.0" | ||
| "commander": "^14.0.3" | ||
| }, | ||
| "devDependencies": { | ||
| "@types/node": "^20.5.0", | ||
| "typescript": "^5.6.2" | ||
| "@biomejs/biome": "^2.4.6", | ||
| "@types/node": "^22", | ||
| "typescript": "^5.9.3", | ||
| "vitest": "^4.0.18" | ||
| }, | ||
| "scripts": { | ||
| "clean": "node --input-type=commonjs -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"", | ||
| "build": "pnpm run clean && tsc", | ||
| "dev": "pnpm run build && node ./dist/aptos.js", | ||
| "test": "vitest run", | ||
| "test:watch": "vitest", | ||
| "check": "biome check", | ||
| "check:fix": "biome check --fix", | ||
| "format": "biome format --fix" | ||
| } | ||
| } | ||
| } |
+109
-0
@@ -45,2 +45,24 @@ # Aptos CLI | ||
| ### Installing a Specific Version | ||
| You can install a specific version of the Aptos CLI by setting the `APTOS_CLI_VERSION` environment variable: | ||
| ```bash | ||
| # Install version 4.5.0 | ||
| APTOS_CLI_VERSION=4.5.0 npx aptos --install | ||
| # Or with the v prefix | ||
| APTOS_CLI_VERSION=v4.5.0 npx aptos --install | ||
| ``` | ||
| When `APTOS_CLI_VERSION` is set: | ||
| - The specified version is downloaded directly from GitHub releases (package managers are bypassed) | ||
| - The version is validated to ensure it exists before downloading | ||
| - This works for both `--install` and `--update` commands | ||
| This is useful for: | ||
| - Pinning to a known working version | ||
| - Testing against specific CLI versions | ||
| - Reproducible builds in CI/CD pipelines | ||
| ## Updating the Aptos CLI | ||
@@ -77,1 +99,88 @@ | ||
| ``` | ||
| ## Building Move Artifacts in CI/CD | ||
| The Aptos CLI can be used in CI/CD pipelines to build Move packages and generate deployment payloads. This is useful for automated deployments and multi-step workflows. | ||
| ### Example: Building Publish Payload | ||
| ```yaml | ||
| # In your GitHub Actions workflow | ||
| # Prerequisites: Set up Node.js first | ||
| - name: Setup Node.js | ||
| uses: actions/setup-node@v4 | ||
| with: | ||
| node-version: "20" | ||
| - name: Install Aptos CLI npm package | ||
| run: npm install @aptos-labs/aptos-cli | ||
| - name: Install Aptos CLI | ||
| run: npx aptos --install | ||
| - name: Build Move package | ||
| working-directory: your-move-project | ||
| run: | | ||
| ~/.local/bin/aptos move compile \ | ||
| --named-addresses your_module=0x1 \ | ||
| --save-metadata | ||
| - name: Generate publish payload | ||
| working-directory: your-move-project | ||
| run: | | ||
| ~/.local/bin/aptos move build-publish-payload \ | ||
| --named-addresses your_module=0x1 \ | ||
| --json-output-file publish-payload.json \ | ||
| --assume-yes | ||
| - name: Upload artifact for later steps | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: move-artifacts | ||
| path: your-move-project/publish-payload.json | ||
| ``` | ||
| ### Example: Building Upgrade Payload (Object Code Deployment) | ||
| For upgrading existing object-deployed contracts: | ||
| ```yaml | ||
| - name: Generate upgrade payload | ||
| working-directory: your-move-project | ||
| run: | | ||
| ~/.local/bin/aptos move build-upgrade-payload \ | ||
| --named-addresses your_module=0x1 \ | ||
| --object-address 0xYOUR_OBJECT_ADDRESS \ | ||
| --json-output-file upgrade-payload.json \ | ||
| --assume-yes | ||
| ``` | ||
| ### Using Artifacts in Subsequent Jobs | ||
| ```yaml | ||
| jobs: | ||
| build: | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| # ... build steps above ... | ||
| - uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: move-artifacts | ||
| path: your-move-project/publish-payload.json | ||
| deploy: | ||
| needs: build | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/download-artifact@v4 | ||
| with: | ||
| name: move-artifacts | ||
| - name: Use the payload | ||
| run: | | ||
| # The payload JSON can be used for deployment | ||
| cat publish-payload.json | ||
| ``` | ||
| See the [build-move-artifacts.yaml](.github/workflows/build-move-artifacts.yaml) workflow for a complete working example. |
Sorry, the diff of this file is not supported yet
-44
| #!/usr/bin/env node | ||
| // On MacOS we install the CLI with brew. There are two main reasons for this: | ||
| // 1. Brew builds the CLI for the native CPU architecture for the user, which | ||
| // eliminates any issues arising from using x86 binaries on ARM machines. | ||
| // 2. Brew handles dependency management for us. This isn't relevant right now but | ||
| // might become necessary later if we reintroduce OpenSSL as a dep for the CLI. | ||
| // | ||
| // On Linux and Windows we just query the GH API for the latest CLI release and | ||
| // download and extract that. | ||
| import { program } from "commander"; | ||
| import { parseCommandOptions } from "./utils/parseCommandOptions.js"; | ||
| import { runCLI } from "./tasks/run.js"; | ||
| program | ||
| .name("aptos") | ||
| .helpOption(false) | ||
| .option("-i, --install", "install the latest version of the CLI") | ||
| .option("-u, --update", "update the CLI to the latest version") | ||
| .option("-b, --binary-path <path>", "path to an existing Aptos CLI binary") | ||
| .allowUnknownOption(); | ||
| program.parse(process.argv); | ||
| const main = async () => { | ||
| const options = { | ||
| install: program.opts().install, | ||
| update: program.opts().update, | ||
| binaryPath: program.opts().binaryPath, | ||
| }; | ||
| const unknownOptions = program.args; | ||
| // Manually check for `--help` and handle the CLI `--help` | ||
| if (process.argv.includes("--help")) { | ||
| // Forward to the CLI | ||
| return runCLI(unknownOptions, options.binaryPath); | ||
| } | ||
| await parseCommandOptions(options, unknownOptions); | ||
| }; | ||
| main().catch(console.error); |
| import { execSync } from "child_process"; | ||
| import { existsSync } from "fs"; | ||
| import { GH_CLI_DOWNLOAD_URL, PNAME } from "../utils/consts.js"; | ||
| import { execSyncShell } from "../utils/execSyncShell.js"; | ||
| import { getCurrentOpenSSLVersion } from "../utils/versions.js"; | ||
| import { getOS } from "../utils/getUserOs.js"; | ||
| import { getLocalBinPath } from "../utils/getLocalBinPath.js"; | ||
| import { getLatestVersionGh } from "../utils/ghOperations.js"; | ||
| // Install the CLI. | ||
| export const installCli = async () => { | ||
| const path = getLocalBinPath(); | ||
| if (existsSync(path)) { | ||
| console.log("Aptos CLI is already installed"); | ||
| return; | ||
| } | ||
| // Look up the latest version. | ||
| const latestCLIVersion = await getLatestVersionGh(); | ||
| console.log(`Downloading aptos CLI version ${latestCLIVersion}`); | ||
| const os = getOS(); | ||
| if (os === "Windows") { | ||
| const url = `${GH_CLI_DOWNLOAD_URL}/${PNAME}-v${latestCLIVersion}/${PNAME}-${latestCLIVersion}-${os}-x86_64.zip`; | ||
| // Download the zip file, extract it, and move the binary to the correct location. | ||
| execSync( | ||
| `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}\""` | ||
| ); | ||
| } else if (os === "MacOS") { | ||
| // Install the CLI with brew. | ||
| execSyncShell("brew install aptos", { encoding: "utf8" }); | ||
| } else { | ||
| // On Linux, we check what version of OpenSSL we're working with to figure out | ||
| // which binary to download. | ||
| let osVersion = "x86_64"; | ||
| let opensSslVersion = "1.0.0"; | ||
| try { | ||
| opensSslVersion = getCurrentOpenSSLVersion(); | ||
| } catch (error) { | ||
| console.log( | ||
| "Could not determine OpenSSL version, assuming older version (1.x.x)" | ||
| ); | ||
| } | ||
| if (opensSslVersion.startsWith("3.")) { | ||
| osVersion = "22.04-x86_64"; | ||
| } | ||
| console.log(`Downloading CLI binary ${os}-${osVersion}`); | ||
| const url = `${GH_CLI_DOWNLOAD_URL}/${PNAME}-v${latestCLIVersion}/${PNAME}-${latestCLIVersion}-${os}-${osVersion}.zip`; | ||
| // Download the zip file, extract it, and move the binary to the correct location. | ||
| execSync( | ||
| `curl -L -o /tmp/aptos.zip ${url}; unzip -o -q /tmp/aptos.zip -d /tmp; mv /tmp/aptos ${path};` | ||
| ); | ||
| } | ||
| }; |
| import { spawn } from "child_process"; | ||
| import { existsSync } from "fs"; | ||
| import { getOS } from "../utils/getUserOs.js"; | ||
| import { getLocalBinPath } from "../utils/getLocalBinPath.js"; | ||
| export const runCLI = async (args: string[] = [], binaryPath?: string) => { | ||
| const path = binaryPath || getLocalBinPath(); | ||
| if (!existsSync(path)) { | ||
| if (binaryPath) { | ||
| console.error(`Error: Binary not found at specified path: ${binaryPath}`); | ||
| process.exit(1); | ||
| } | ||
| console.log( | ||
| "Aptos CLI not installed, run `npx aptos --install` to install" | ||
| ); | ||
| return; | ||
| } | ||
| const os = getOS(); | ||
| // Spawn a child process to execute the binary with the provided arguments. | ||
| // Spawn the child process to run the real CLI executable with the forwarded arguments | ||
| spawn(path, args, { | ||
| stdio: "inherit", // Forward the stdio so output is visible | ||
| shell: os === "Windows", // Use shell on Windows | ||
| }); | ||
| }; |
| import { existsSync } from "fs"; | ||
| import { getLocalBinPath } from "../utils/getLocalBinPath.js"; | ||
| import { execSync } from "child_process"; | ||
| import { getOS } from "../utils/getUserOs.js"; | ||
| import { getLatestVersionGh } from "../utils/ghOperations.js"; | ||
| import { execSyncShell } from "../utils/execSyncShell.js"; | ||
| import { installCli } from "./install.js"; | ||
| export const updateCli = async () => { | ||
| const path = getLocalBinPath(); | ||
| if (!existsSync(path)) { | ||
| console.log( | ||
| "Aptos CLI not installed, run `npx aptos --install` to install" | ||
| ); | ||
| return; | ||
| } | ||
| if (getOS() === "MacOS") { | ||
| // Upgrade aptos via brew. | ||
| return execSync("brew upgrade aptos"); | ||
| } else { | ||
| const latestVersion = await getLatestVersionGh(); | ||
| // Get the current version of the CLI. | ||
| const currentVersion = execSyncShell(`${path} --version`, { | ||
| encoding: "utf8", | ||
| }) | ||
| .trim() | ||
| .split(" ")[1]; | ||
| // Check if the installed version is the latest version. | ||
| if (currentVersion !== latestVersion) { | ||
| console.log( | ||
| `A newer version of the CLI is available: ${latestVersion}, installing...` | ||
| ); | ||
| await installCli(); | ||
| } else { | ||
| console.log(`CLI is up to date`); | ||
| } | ||
| } | ||
| }; |
| import { execSyncShell } from "./execSyncShell.js"; | ||
| /** | ||
| * Only works on Unix systems. This is fine because we only need to check for brew on | ||
| * MacOS. | ||
| */ | ||
| export const executableIsAvailable = (name) => { | ||
| try { | ||
| execSyncShell(`which ${name}`, { encoding: "utf8" }); | ||
| return true; | ||
| } catch (error) { | ||
| return false; | ||
| } | ||
| }; |
| import { execSyncShell } from "./execSyncShell.js"; | ||
| /** | ||
| * Based on the installation path of the aptos formula, determine the path where the | ||
| * CLI should be installed. | ||
| */ | ||
| export const getCliPathBrew = () => { | ||
| const directory = execSyncShell("brew --prefix aptos", { encoding: "utf8" }) | ||
| .toString() | ||
| .trim(); | ||
| return `${directory}/bin/aptos`; | ||
| }; |
| export const PNAME = "aptos-cli"; | ||
| export const GH_CLI_DOWNLOAD_URL = | ||
| "https://github.com/aptos-labs/aptos-core/releases/download"; |
| import { execSync } from "child_process"; | ||
| /** | ||
| * Wrapper around execSync that uses the shell. | ||
| */ | ||
| export const execSyncShell = (command, options) => { | ||
| return execSync(command, { shell: true, ...options }); | ||
| }; |
| import { dirname } from "path"; | ||
| import { executableIsAvailable } from "./aptosExecutableIsAvailable.js"; | ||
| import { getCliPathBrew } from "./brewOperations.js"; | ||
| import { PNAME } from "./consts.js"; | ||
| import { getOS } from "./getUserOs.js"; | ||
| import { fileURLToPath } from "url"; | ||
| export const getLocalBinPath = () => { | ||
| let path; | ||
| const os = getOS(); | ||
| if (os === "MacOS") { | ||
| // Confirm brew is installed. | ||
| const brewInstalled = executableIsAvailable("brew"); | ||
| if (!brewInstalled) { | ||
| throw "Please install brew to continue: https://brew.sh/"; | ||
| } | ||
| try { | ||
| path = getCliPathBrew(); | ||
| } catch (e) { | ||
| path = ""; | ||
| } | ||
| } else if (os === "Windows") { | ||
| path = `${dirname(fileURLToPath(import.meta.url))}\\${PNAME}.exe`; | ||
| } else { | ||
| path = `${dirname(fileURLToPath(import.meta.url))}/${PNAME}`; | ||
| } | ||
| return path; | ||
| }; |
| import { platform } from "os"; | ||
| /** | ||
| * Determine what OS we're running on. | ||
| */ | ||
| export const getOS = () => { | ||
| const osPlatform = platform(); | ||
| switch (osPlatform) { | ||
| case "darwin": | ||
| return "MacOS"; | ||
| case "linux": | ||
| return "Ubuntu"; | ||
| case "win32": | ||
| return "Windows"; | ||
| default: | ||
| throw new Error(`Unsupported OS ${osPlatform}`); | ||
| } | ||
| }; |
| import { PNAME } from "./consts.js"; | ||
| /** | ||
| * Query the GitHub API to find the latest CLI release. We assume that the CLI is in | ||
| * the last 100 releases so we don't paginate through the releases. | ||
| */ | ||
| export const getLatestVersionGh = async () => { | ||
| const prefix = `${PNAME}-v`; | ||
| const response = await ( | ||
| await fetch( | ||
| "https://api.github.com/repos/aptos-labs/aptos-core/releases?per_page=100" | ||
| ) | ||
| ).json(); | ||
| for (const release of response) { | ||
| if (release["tag_name"].startsWith(`${prefix}`)) { | ||
| return release.tag_name.replace(`${prefix}`, ""); | ||
| } | ||
| } | ||
| throw "Could not determine latest version of Aptos CLI"; | ||
| }; |
| import { spawnSync } from "child_process"; | ||
| import { Command } from "commander"; | ||
| /** | ||
| * Handle the `--help` option for the Aptos CLI. This function is used to combine | ||
| * the Aptos CLI help output with the Commander help output. | ||
| * @param program - The Commander program instance. | ||
| * @param unknownOptions - The unknown options passed to the CLI. | ||
| * @returns void | ||
| */ | ||
| export const handleHelpOptions = ( | ||
| program: Command, | ||
| unknownOptions: string[] | ||
| ) => { | ||
| // Capture the Aptos CLI help output | ||
| const cliHelp = spawnSync(`aptos`, unknownOptions, { | ||
| stdio: "pipe", | ||
| encoding: "utf-8", | ||
| }); | ||
| // Generate Commander help text | ||
| const commanderHelp = program.helpInformation(); | ||
| // Remove the "Usage" and "Options" lines from the Commander output | ||
| const commanderOptionsOnly = commanderHelp | ||
| .split("\n") | ||
| .filter((line) => !line.startsWith("Usage") && !line.startsWith("Options")) | ||
| .join("\n"); | ||
| // Find where the CLI options start and append the Commander options to the existing CLI options | ||
| const combinedHelp = cliHelp.stdout.replace( | ||
| "Options:", | ||
| `Options:\n${commanderOptionsOnly.trim()}` | ||
| ); | ||
| // Output the combined help | ||
| console.log(combinedHelp); | ||
| return; | ||
| }; |
| import { existsSync } from "fs"; | ||
| import { installCli } from "../tasks/install.js"; | ||
| import { runCLI } from "../tasks/run.js"; | ||
| import { updateCli } from "../tasks/update.js"; | ||
| import { getLocalBinPath } from "./getLocalBinPath.js"; | ||
| export const parseCommandOptions = async ( | ||
| options: { install: boolean; update: boolean; binaryPath?: string }, | ||
| unknownOptions: string[] | ||
| ) => { | ||
| // if `--install` flag is set, only install the cli and dont run it | ||
| if (options.install) { | ||
| await installCli(); | ||
| return; | ||
| } | ||
| // if `--update` flag is set, update the cli and dont run it | ||
| if (options.update) { | ||
| await updateCli(); | ||
| return; | ||
| } | ||
| // if no flags are set, install and run the cli | ||
| const path = options.binaryPath || getLocalBinPath(); | ||
| if (!options.binaryPath && !existsSync(path)) { | ||
| await installCli(); | ||
| } | ||
| await runCLI(unknownOptions, options.binaryPath); | ||
| }; |
| import { execSyncShell } from "./execSyncShell.js"; | ||
| /** | ||
| * Determine the current SSL version | ||
| */ | ||
| export const getCurrentOpenSSLVersion = () => { | ||
| const out = execSyncShell("openssl version", { encoding: "utf8" }); | ||
| return out.split(" ")[1].trim(); | ||
| }; |
| #!/usr/bin/env node | ||
| export {}; |
| export declare const installCli: () => Promise<void>; |
| export declare const runCLI: (args?: string[], binaryPath?: string) => Promise<void>; |
| export declare const updateCli: () => Promise<NonSharedBuffer | undefined>; |
| export declare const executableIsAvailable: (name: any) => boolean; |
| import { execSyncShell } from "./execSyncShell.js"; | ||
| export const executableIsAvailable = (name) => { | ||
| try { | ||
| execSyncShell(`which ${name}`, { encoding: "utf8" }); | ||
| return true; | ||
| } | ||
| catch (error) { | ||
| return false; | ||
| } | ||
| }; | ||
| //# sourceMappingURL=aptosExecutableIsAvailable.js.map |
| {"version":3,"file":"aptosExecutableIsAvailable.js","sourceRoot":"","sources":["../../bin/utils/aptosExecutableIsAvailable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMnD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,EAAE;IAC5C,IAAI,CAAC;QACH,aAAa,CAAC,SAAS,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC"} |
| export declare const getCliPathBrew: () => string; |
| export declare const PNAME = "aptos-cli"; | ||
| export declare const GH_CLI_DOWNLOAD_URL = "https://github.com/aptos-labs/aptos-core/releases/download"; |
| export declare const execSyncShell: (command: any, options: any) => string; |
| export declare const getLocalBinPath: () => any; |
| export declare const getOS: () => "MacOS" | "Ubuntu" | "Windows"; |
| export declare const getLatestVersionGh: () => Promise<any>; |
| import { Command } from "commander"; | ||
| export declare const handleHelpOptions: (program: Command, unknownOptions: string[]) => void; |
| import { spawnSync } from "child_process"; | ||
| export const handleHelpOptions = (program, unknownOptions) => { | ||
| const cliHelp = spawnSync(`aptos`, unknownOptions, { | ||
| stdio: "pipe", | ||
| encoding: "utf-8", | ||
| }); | ||
| const commanderHelp = program.helpInformation(); | ||
| const commanderOptionsOnly = commanderHelp | ||
| .split("\n") | ||
| .filter((line) => !line.startsWith("Usage") && !line.startsWith("Options")) | ||
| .join("\n"); | ||
| const combinedHelp = cliHelp.stdout.replace("Options:", `Options:\n${commanderOptionsOnly.trim()}`); | ||
| console.log(combinedHelp); | ||
| return; | ||
| }; | ||
| //# sourceMappingURL=handleHelpOptions.js.map |
| {"version":3,"file":"handleHelpOptions.js","sourceRoot":"","sources":["../../bin/utils/handleHelpOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAU1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAAgB,EAChB,cAAwB,EACxB,EAAE;IAEF,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE;QACjD,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,OAAO;KAClB,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAGhD,MAAM,oBAAoB,GAAG,aAAa;SACvC,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;SAC1E,IAAI,CAAC,IAAI,CAAC,CAAC;IAGd,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CACzC,UAAU,EACV,aAAa,oBAAoB,CAAC,IAAI,EAAE,EAAE,CAC3C,CAAC;IAGF,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1B,OAAO;AACT,CAAC,CAAC"} |
| export declare const parseCommandOptions: (options: { | ||
| install: boolean; | ||
| update: boolean; | ||
| binaryPath?: string; | ||
| }, unknownOptions: string[]) => Promise<void>; |
| export declare const getCurrentOpenSSLVersion: () => string; |
| import { execSyncShell } from "./execSyncShell.js"; | ||
| export const getCurrentOpenSSLVersion = () => { | ||
| const out = execSyncShell("openssl version", { encoding: "utf8" }); | ||
| return out.split(" ")[1].trim(); | ||
| }; | ||
| //# sourceMappingURL=versions.js.map |
| {"version":3,"file":"versions.js","sourceRoot":"","sources":["../../bin/utils/versions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKnD,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,EAAE;IAC3C,MAAM,GAAG,GAAG,aAAa,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACnE,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAClC,CAAC,CAAC"} |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 6 instances
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
No tests
QualityPackage does not have any tests. This is a strong signal of a poorly maintained or low quality package.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
234985
418.91%1651
189.65%1
-50%185
143.42%4
100%43
-28.33%48
433.33%14
16.67%+ Added
- Removed
Updated