diff --git a/.github/workflows/cli.yaml b/.github/workflows/cli.yaml index cae8532e..e485c0d2 100644 --- a/.github/workflows/cli.yaml +++ b/.github/workflows/cli.yaml @@ -36,10 +36,10 @@ jobs: run: bun run build --filter @cartesi/cli - name: Test - run: bun run test --filter @cartesi/cli + run: bun test --coverage --coverage-reporter=lcov --coverage-dir=coverage apps/cli/ - - name: "Report Coverage" + - name: Coverage Report + uses: 70-10/bun-coverage-report-action@6173866ce2a31456a726ff3f4c91f230bd94a9e9 # v1.0.3 if: always() - uses: davelosert/vitest-coverage-report-action@5a78cb16e761204097ad8a39369ea5d0ff7c8a5d # v2.8.0 with: - working-directory: ./apps/cli + lcov-path: coverage/lcov.info diff --git a/apps/cli/package.json b/apps/cli/package.json index 2ae2e9b7..be33ada6 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -60,8 +60,7 @@ "rimraf": "^6.0.1", "ts-node": "^10.9.2", "tslib": "^2.8.1", - "typescript": "^5.9.2", - "vitest": "^4.0.17" + "typescript": "^5.9.2" }, "scripts": { "build": "run-s clean codegen compile", @@ -71,7 +70,7 @@ "compile": "bun build.ts", "lint": "biome lint", "posttest": "bun lint", - "test": "vitest" + "test": "bun test" }, "engines": { "node": ">=20.0.0" diff --git a/apps/cli/src/template.ts b/apps/cli/src/template.ts index 38aed9cf..93b2b79a 100644 --- a/apps/cli/src/template.ts +++ b/apps/cli/src/template.ts @@ -1,9 +1,3 @@ -import { ensureDir } from "fs-extra"; -import { unpackTar } from "modern-tar/fs"; -import path from "node:path"; -import { pipeline } from "node:stream/promises"; -import { createGunzip } from "node:zlib"; - export interface DownloadTemplateResult { dir: string; source: string; @@ -17,37 +11,32 @@ export const download = async ( const repoUrl = "https://github.com/cartesi/application-templates"; const tarballUrl = `https://codeload.github.com/cartesi/application-templates/tar.gz/refs/heads/${branch}`; - // Ensure output directory exists - await ensureDir(out); - // Download the tarball const response = await fetch(tarballUrl); if (!response.ok) { throw new Error(`Failed to download template: ${response.statusText}`); } - // Stream download → gunzip → extract with filtering + // Create archive from downloaded tarball // GitHub tarball structure: application-templates-{branch}/{template}/... - // We need to extract only files within the template subdirectory - const extractStream = unpackTar(out, { - filter: (header) => { - // remove first path segment - const pathname = header.name.split("/").splice(1).join("/"); - return pathname.startsWith(template); - }, - map: (header) => { - // remove first path segment - const pathname = header.name.split("/").splice(1).join("/"); - header.name = path.relative(template, pathname); - return header; - }, - }); + const archive = new Bun.Archive(await response.blob()); - await pipeline( - response.body as ReadableStream, - createGunzip(), - extractStream, - ); + // Get all files matching the template subdirectory pattern + // The glob pattern matches: application-templates-{branch}/{template}/** + const pattern = `*/${template}/**`; + const files = await archive.files(pattern); + + // Write extracted files, stripping the prefix from paths + for (const [archivePath, file] of files) { + // Remove "application-templates-{branch}/{template}/" prefix + const segments = archivePath.split("/"); + const relativePath = segments.slice(2).join("/"); + + if (relativePath) { + const targetPath = `${out}/${relativePath}`; + await Bun.write(targetPath, file); + } + } return { dir: out, diff --git a/apps/cli/tests/integration/builder/data/.keep b/apps/cli/tests/integration/builder/data/.keep new file mode 100644 index 00000000..e69de29b diff --git a/apps/cli/tests/integration/builder/directory.test.ts b/apps/cli/tests/integration/builder/directory.test.ts index 574d1fa5..8f7242fa 100644 --- a/apps/cli/tests/integration/builder/directory.test.ts +++ b/apps/cli/tests/integration/builder/directory.test.ts @@ -1,18 +1,30 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "bun:test"; import fs from "fs-extra"; import path from "node:path"; -import { describe, expect } from "vitest"; import { build } from "../../../src/builder/directory.js"; import type { DirectoryDriveConfig } from "../../../src/config.js"; -import { TEST_SDK } from "../config.js"; -import { tmpdirTest } from "./tmpdirTest.js"; +import { setupIntegrationTests, TEST_SDK } from "../config.js"; +import { cleanupTempDir, createTempDir } from "../tmpdirTest.js"; + +beforeAll(async () => { + await setupIntegrationTests(); +}, { timeout: 60000 }); describe("when building with the directory builder", () => { const image = TEST_SDK; + let destination: string; + + beforeEach(async () => { + destination = await createTempDir(); + }); + + afterEach(async () => { + await cleanupTempDir(destination); + }); - tmpdirTest( + it( "should fail when the directory doesn't exists", - async ({ tmpdir }) => { - const destination = tmpdir; + async () => { const drive: DirectoryDriveConfig = { builder: "directory", directory: path.join(__dirname, "data", "invalid"), @@ -25,10 +37,9 @@ describe("when building with the directory builder", () => { }, ); - tmpdirTest( + it( "should fail when the directory is empty", - async ({ tmpdir }) => { - const destination = tmpdir; + async () => { const directory = path.join(__dirname, "data", "empty"); fs.ensureDirSync(directory); const drive: DirectoryDriveConfig = { @@ -43,10 +54,9 @@ describe("when building with the directory builder", () => { }, ); - tmpdirTest( + it( "should pass when the directory is empty but extra size is defined", - async ({ tmpdir }) => { - const destination = tmpdir; + async () => { const directory = path.join(__dirname, "data", "empty"); fs.ensureDirSync(directory); const drive: DirectoryDriveConfig = { @@ -62,10 +72,9 @@ describe("when building with the directory builder", () => { }, ); - tmpdirTest( + it( "should pass for a populated directory (ext2)", - async ({ tmpdir }) => { - const destination = tmpdir; + async () => { const drive: DirectoryDriveConfig = { builder: "directory", directory: path.join(__dirname, "fixtures", "sample1"), @@ -79,10 +88,9 @@ describe("when building with the directory builder", () => { }, ); - tmpdirTest( + it( "should pass for a populated directory (sqfs)", - async ({ tmpdir }) => { - const destination = tmpdir; + async () => { const drive: DirectoryDriveConfig = { builder: "directory", directory: path.join(__dirname, "fixtures", "sample1"), diff --git a/apps/cli/tests/integration/builder/docker.test.ts b/apps/cli/tests/integration/builder/docker.test.ts index ad4ce255..7b36fdad 100644 --- a/apps/cli/tests/integration/builder/docker.test.ts +++ b/apps/cli/tests/integration/builder/docker.test.ts @@ -1,21 +1,28 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "bun:test"; import fs from "fs-extra"; import path from "node:path"; -import { beforeEach } from "node:test"; -import { describe, expect } from "vitest"; import { build } from "../../../src/builder/docker.js"; import type { DockerDriveConfig } from "../../../src/config.js"; -import { TEST_SDK } from "../config.js"; -import { tmpdirTest } from "./tmpdirTest.js"; +import { setupIntegrationTests, TEST_SDK } from "../config.js"; +import { cleanupTempDir, createTempDir } from "./tmpdirTest.js"; + +beforeAll(async () => { + await setupIntegrationTests(); +}, { timeout: 60000 }); describe("when building with the docker builder", () => { const image = TEST_SDK; + let destination: string; + + beforeEach(async () => { + destination = await createTempDir(); + }); - beforeEach(({ name }) => { - fs.mkdirpSync(path.join(__dirname, "output", name)); + afterEach(async () => { + await cleanupTempDir(destination); }); - tmpdirTest("should fail without correct context", async ({ tmpdir }) => { - const destination = tmpdir; + it("should fail without correct context", async () => { const drive: DockerDriveConfig = { buildArgs: [], builder: "docker", @@ -32,8 +39,7 @@ describe("when building with the docker builder", () => { ).rejects.toThrow("exit code 1"); }); - tmpdirTest("should fail a non-riscv image", async ({ tmpdir }) => { - const destination = tmpdir; + it("should fail a non-riscv image", async () => { const drive: DockerDriveConfig = { buildArgs: [], builder: "docker", @@ -50,10 +56,9 @@ describe("when building with the docker builder", () => { ).rejects.toThrow(/no match for platform in manifest/); }); - tmpdirTest( + it( "should build an ext2 drive with a target definition", - async ({ tmpdir }) => { - const destination = tmpdir; + async () => { const drive: DockerDriveConfig = { buildArgs: [], builder: "docker", @@ -72,8 +77,7 @@ describe("when building with the docker builder", () => { }, ); - tmpdirTest("should build an ext2 drive", async ({ tmpdir }) => { - const destination = tmpdir; + it("should build an ext2 drive", async () => { const drive: DockerDriveConfig = { buildArgs: [], builder: "docker", @@ -91,8 +95,7 @@ describe("when building with the docker builder", () => { expect(stat.size).toEqual(93716480); }); - tmpdirTest.skip("should build a sqfs drive", async ({ tmpdir }) => { - const destination = tmpdir; + it.skip("should build a sqfs drive", async () => { const drive: DockerDriveConfig = { buildArgs: [], builder: "docker", diff --git a/apps/cli/tests/integration/builder/empty.test.ts b/apps/cli/tests/integration/builder/empty.test.ts index 1520e27c..0532f3d3 100644 --- a/apps/cli/tests/integration/builder/empty.test.ts +++ b/apps/cli/tests/integration/builder/empty.test.ts @@ -1,16 +1,28 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "bun:test"; import fs from "fs-extra"; import path from "node:path"; -import { describe, expect } from "vitest"; import { build } from "../../../src/builder/empty.js"; import type { EmptyDriveConfig } from "../../../src/config.js"; -import { TEST_SDK } from "../config.js"; -import { tmpdirTest } from "./tmpdirTest.js"; +import { setupIntegrationTests, TEST_SDK } from "../config.js"; +import { cleanupTempDir, createTempDir } from "./tmpdirTest.js"; + +beforeAll(async () => { + await setupIntegrationTests(); +}, { timeout: 60000 }); describe("when building with the empty builder", () => { const image = TEST_SDK; + let destination: string; + + beforeEach(async () => { + destination = await createTempDir(); + }); + + afterEach(async () => { + await cleanupTempDir(destination); + }); - tmpdirTest("should fail with an invalid size", async ({ tmpdir }) => { - const destination = tmpdir; + it("should fail with an invalid size", async () => { const drive: EmptyDriveConfig = { builder: "empty", format: "ext2", @@ -21,8 +33,7 @@ describe("when building with the empty builder", () => { ); }); - tmpdirTest("should pass and create ext2 drive", async ({ tmpdir }) => { - const destination = tmpdir; + it("should pass and create ext2 drive", async () => { const driveName = "root.ext2"; const drive: EmptyDriveConfig = { builder: "empty", @@ -38,8 +49,7 @@ describe("when building with the empty builder", () => { expect(stat.size).toEqual(1 * 1024 * 1024); }); - tmpdirTest("should pass and create raw drive", async ({ tmpdir }) => { - const destination = tmpdir; + it("should pass and create raw drive", async () => { const driveName = "root.raw"; const drive: EmptyDriveConfig = { builder: "empty", diff --git a/apps/cli/tests/integration/builder/none.test.ts b/apps/cli/tests/integration/builder/none.test.ts index 5784e617..666c39cd 100644 --- a/apps/cli/tests/integration/builder/none.test.ts +++ b/apps/cli/tests/integration/builder/none.test.ts @@ -1,13 +1,27 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "bun:test"; import fs from "fs-extra"; import path from "node:path"; -import { describe, expect } from "vitest"; import { build } from "../../../src/builder/none.js"; import type { ExistingDriveConfig } from "../../../src/config.js"; -import { tmpdirTest } from "./tmpdirTest.js"; +import { setupIntegrationTests } from "../config.js"; +import { cleanupTempDir, createTempDir } from "./tmpdirTest.js"; + +beforeAll(async () => { + await setupIntegrationTests(); +}, { timeout: 60000 }); describe("when building with the none builder", () => { - tmpdirTest("should not build a missing file", async ({ tmpdir }) => { - const destination = tmpdir; + let destination: string; + + beforeEach(async () => { + destination = await createTempDir(); + }); + + afterEach(async () => { + await cleanupTempDir(destination); + }); + + it("should not build a missing file", async () => { const drive: ExistingDriveConfig = { builder: "none", filename: path.join(__dirname, "data", "missing.ext2"), @@ -18,8 +32,7 @@ describe("when building with the none builder", () => { ); }); - tmpdirTest("should just copy an existing drive", async ({ tmpdir }) => { - const destination = tmpdir; + it("should just copy an existing drive", async () => { const filename = path.join(__dirname, "fixtures", "data.ext2"); const drive: ExistingDriveConfig = { builder: "none", diff --git a/apps/cli/tests/integration/builder/tar.test.ts b/apps/cli/tests/integration/builder/tar.test.ts index 7a8d4b4d..3c7af34b 100644 --- a/apps/cli/tests/integration/builder/tar.test.ts +++ b/apps/cli/tests/integration/builder/tar.test.ts @@ -1,16 +1,28 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "bun:test"; import fs from "fs-extra"; import path from "node:path"; -import { describe, expect } from "vitest"; import { build } from "../../../src/builder/tar.js"; import type { TarDriveConfig } from "../../../src/config.js"; -import { TEST_SDK } from "../config.js"; -import { tmpdirTest } from "./tmpdirTest.js"; +import { setupIntegrationTests, TEST_SDK } from "../config.js"; +import { cleanupTempDir, createTempDir } from "../tmpdirTest.js"; + +beforeAll(async () => { + await setupIntegrationTests(); +}, { timeout: 60000 }); describe("when building with the tar builder", () => { const image = TEST_SDK; + let destination: string; + + beforeEach(async () => { + destination = await createTempDir(); + }); + + afterEach(async () => { + await cleanupTempDir(destination); + }); - tmpdirTest("should not build a missing file", async ({ tmpdir }) => { - const destination = tmpdir; + it("should not build a missing file", async () => { const drive: TarDriveConfig = { builder: "tar", filename: path.join(__dirname, "data", "unexisting.tar"), @@ -22,8 +34,7 @@ describe("when building with the tar builder", () => { ); }); - tmpdirTest("should build a ext2 drive", async ({ tmpdir }) => { - const destination = tmpdir; + it("should build a ext2 drive", async () => { const drive: TarDriveConfig = { builder: "tar", filename: path.join(__dirname, "fixtures", "data.tar"), @@ -36,8 +47,7 @@ describe("when building with the tar builder", () => { expect(stat.size).toEqual(36864); }); - tmpdirTest("should build a sqfs drive", async ({ tmpdir }) => { - const destination = tmpdir; + it("should build a sqfs drive", async () => { const drive: TarDriveConfig = { builder: "tar", filename: path.join(__dirname, "fixtures", "data.tar"), diff --git a/apps/cli/tests/integration/builder/tmpdirTest.ts b/apps/cli/tests/integration/builder/tmpdirTest.ts deleted file mode 100644 index 91aa8906..00000000 --- a/apps/cli/tests/integration/builder/tmpdirTest.ts +++ /dev/null @@ -1,23 +0,0 @@ -import fs from "fs-extra"; -import os from "node:os"; -import path from "node:path"; -import { test } from "vitest"; - -interface TmpDirFixture { - tmpdir: string; -} - -const createTempDir = async () => { - const ostmpdir = os.tmpdir(); - const tmpdir = path.join(ostmpdir, "unit-test-"); - return await fs.mkdtemp(tmpdir); -}; - -export const tmpdirTest = test.extend({ - // biome-ignore lint/correctness/noEmptyPattern: test fixture pattern - tmpdir: async ({}, use) => { - const directory = await createTempDir(); - await use(directory); - await fs.rm(directory, { recursive: true }); - }, -}); diff --git a/apps/cli/tests/integration/config.ts b/apps/cli/tests/integration/config.ts index 814aaf64..b1d26e85 100644 --- a/apps/cli/tests/integration/config.ts +++ b/apps/cli/tests/integration/config.ts @@ -1 +1,43 @@ -export const TEST_SDK = "cartesi/sdk:0.12.0-alpha.23"; +import { execa } from "execa"; +import { + DEFAULT_SDK_IMAGE, + DEFAULT_SDK_VERSION +} from "../../src/config.js"; + +export const TEST_SDK = `${DEFAULT_SDK_IMAGE}:${DEFAULT_SDK_VERSION}`; + +/** + * Ensures the required Docker image is available locally. + * Checks if the image exists, and pulls it if not found. + */ +export async function ensureDockerImage(image: string): Promise { + try { + // Check if image exists locally + await execa("docker", ["inspect", image], { + reject: true, + }); + console.log(`✓ Docker image ${image} is available`); + } catch (_error) { + try { + // Image doesn't exist, pull it + console.log(`Pulling Docker image ${image}...`); + await execa("docker", ["image", "pull", image], { + stdio: "inherit", + reject: true, + }); + console.log(`✓ Docker image ${image} pulled successfully`); + } catch (error) { + console.error(`✗ Failed to pull Docker image ${image}`); + throw error; + } + } +} + +/** + * Global setup function for integration tests. + * Call this before running integration tests to ensure Docker image is ready. + */ +export async function setupIntegrationTests(): Promise { + await ensureDockerImage(TEST_SDK); + await ensureDockerImage("debian:bookworm-slim"); +} diff --git a/apps/cli/tests/integration/exec/cartesi-machine.test.ts b/apps/cli/tests/integration/exec/cartesi-machine.test.ts index 6708fedf..6bdbbf0c 100644 --- a/apps/cli/tests/integration/exec/cartesi-machine.test.ts +++ b/apps/cli/tests/integration/exec/cartesi-machine.test.ts @@ -1,7 +1,11 @@ +import { beforeAll, describe, expect, it } from "bun:test"; import { type SemVer, satisfies } from "semver"; -import { describe, expect, it } from "vitest"; import { cartesiMachine } from "../../../src/exec/index.js"; -import { TEST_SDK } from "../config.js"; +import { setupIntegrationTests, TEST_SDK } from "../config.js"; + +beforeAll(async () => { + await setupIntegrationTests(); +}, { timeout: 60000 }); describe("cartesi-machine", () => { it("should report version", async () => { diff --git a/apps/cli/tests/integration/exec/genext2fs.test.ts b/apps/cli/tests/integration/exec/genext2fs.test.ts index 7c3088c4..ea18a573 100644 --- a/apps/cli/tests/integration/exec/genext2fs.test.ts +++ b/apps/cli/tests/integration/exec/genext2fs.test.ts @@ -1,7 +1,11 @@ +import { beforeAll, describe, expect, it } from "bun:test"; import { type SemVer, satisfies } from "semver"; -import { describe, expect, it } from "vitest"; import { genext2fs } from "../../../src/exec/index.js"; -import { TEST_SDK } from "../config.js"; +import { setupIntegrationTests, TEST_SDK } from "../config.js"; + +beforeAll(async () => { + await setupIntegrationTests(); +}, { timeout: 60000 }); describe("genext2fs", () => { it("should report version", async () => { diff --git a/apps/cli/tests/integration/exec/mksquashfs.test.ts b/apps/cli/tests/integration/exec/mksquashfs.test.ts index 60a58491..55ee4eee 100644 --- a/apps/cli/tests/integration/exec/mksquashfs.test.ts +++ b/apps/cli/tests/integration/exec/mksquashfs.test.ts @@ -1,7 +1,11 @@ +import { beforeAll, describe, expect, it } from "bun:test"; import { type SemVer, satisfies } from "semver"; -import { describe, expect, it } from "vitest"; import { mksquashfs } from "../../../src/exec/index.js"; -import { TEST_SDK } from "../config.js"; +import { setupIntegrationTests, TEST_SDK } from "../config.js"; + +beforeAll(async () => { + await setupIntegrationTests(); +}, { timeout: 60000 }); describe("mksquashfs", () => { it("should report version", async () => { diff --git a/apps/cli/tests/integration/template.test.ts b/apps/cli/tests/integration/template.test.ts new file mode 100644 index 00000000..2ef6a2a6 --- /dev/null +++ b/apps/cli/tests/integration/template.test.ts @@ -0,0 +1,101 @@ +import { afterEach, beforeEach, describe, expect, it } from "bun:test"; +import { download } from "../../src/template.js"; +import { cleanupTempDir, createTempDir } from "./tmpdirTest.js"; + +describe("template.download", () => { + let testOutputDir: string; + + beforeEach(async () => { + testOutputDir = await createTempDir(); + }); + + afterEach(async () => { + await cleanupTempDir(testOutputDir); + }); + + it("should download and extract a template successfully", async () => { + const template = "python"; + const branch = "main"; + + const result = await download(template, branch, testOutputDir); + + expect(result.dir).toBe(testOutputDir); + expect(result.source).toBe( + "https://github.com/cartesi/application-templates", + ); + + // Verify files were extracted + const glob = new Bun.Glob("*"); + const files = await Array.fromAsync(glob.scan(testOutputDir)); + expect(files.length).toBeGreaterThan(0); + expect(files).toContain("requirements.txt"); + }); + + it("should extract only files from the specified template directory", async () => { + const template = "python"; + const branch = "main"; + + await download(template, branch, testOutputDir); + + // Check that common template files exist + const glob = new Bun.Glob("**/*"); + const fileNames = await Array.fromAsync(glob.scan(testOutputDir)); + + // Should contain typical template files + expect(fileNames.length).toBeGreaterThan(0); + + // Files should not contain the parent directory prefix + const hasInvalidPrefix = fileNames.some((f) => + f.includes("application-templates-"), + ); + expect(hasInvalidPrefix).toBe(false); + }); + + it("should throw an error when the download fails", async () => { + const template = "python"; + const branch = "nonexistent-branch-xyz123"; + + await expect( + download(template, branch, testOutputDir), + ).rejects.toThrow("Failed to download template:"); + }); + + it("should handle different template types", async () => { + const template = "cpp"; + const branch = "main"; + + const result = await download(template, branch, testOutputDir); + + expect(result.dir).toBe(testOutputDir); + + const glob = new Bun.Glob("*"); + const files = await Array.fromAsync(glob.scan(testOutputDir)); + expect(files.length).toBeGreaterThan(0); + expect(files).toContain("Makefile"); + }); + + it("should create output directory if it doesn't exist", async () => { + const template = "python"; + const branch = "main"; + const nestedDir = `${testOutputDir}/nested/path`; + + const result = await download(template, branch, nestedDir); + + expect(result.dir).toBe(nestedDir); + + const glob = new Bun.Glob("*"); + const files = await Array.fromAsync(glob.scan(nestedDir)); + expect(files.length).toBeGreaterThan(0); + }); + + it("should return correct source URL", async () => { + const template = "python"; + const branch = "main"; + + const result = await download(template, branch, testOutputDir); + + expect(result.source).toBe( + "https://github.com/cartesi/application-templates", + ); + }); +}); diff --git a/apps/cli/tests/integration/tmpdirTest.ts b/apps/cli/tests/integration/tmpdirTest.ts new file mode 100644 index 00000000..ead2d2f5 --- /dev/null +++ b/apps/cli/tests/integration/tmpdirTest.ts @@ -0,0 +1,13 @@ +import fs from "fs-extra"; +import os from "node:os"; +import path from "node:path"; + +export const createTempDir = async () => { + const ostmpdir = os.tmpdir(); + const tmpdir = path.join(ostmpdir, "unit-test-"); + return await fs.mkdtemp(tmpdir); +}; + +export const cleanupTempDir = async (dir: string) => { + await fs.rm(dir, { recursive: true }); +} diff --git a/apps/cli/tests/unit/config.test.ts b/apps/cli/tests/unit/config.test.ts index bf90071b..d57ace91 100644 --- a/apps/cli/tests/unit/config.test.ts +++ b/apps/cli/tests/unit/config.test.ts @@ -1,6 +1,6 @@ +import { describe, expect, it } from "bun:test"; import * as fs from "node:fs"; import * as path from "node:path"; -import { describe, expect, it } from "vitest"; import { defaultConfig, defaultMachineConfig, diff --git a/bun.lock b/bun.lock index 30f90e44..e7ee0799 100644 --- a/bun.lock +++ b/bun.lock @@ -14,7 +14,7 @@ }, "apps/cli": { "name": "@cartesi/cli", - "version": "2.0.0-alpha.23", + "version": "2.0.0-alpha.24", "bin": { "cartesi": "./dist/index.js", }, @@ -65,7 +65,6 @@ "ts-node": "^10.9.2", "tslib": "^2.8.1", "typescript": "^5.9.2", - "vitest": "^4.0.17", }, }, "packages/devnet": { @@ -1180,7 +1179,7 @@ "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], - "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="], + "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], @@ -1420,8 +1419,6 @@ "tsup/esbuild": ["esbuild@0.27.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.2", "@esbuild/android-arm": "0.27.2", "@esbuild/android-arm64": "0.27.2", "@esbuild/android-x64": "0.27.2", "@esbuild/darwin-arm64": "0.27.2", "@esbuild/darwin-x64": "0.27.2", "@esbuild/freebsd-arm64": "0.27.2", "@esbuild/freebsd-x64": "0.27.2", "@esbuild/linux-arm": "0.27.2", "@esbuild/linux-arm64": "0.27.2", "@esbuild/linux-ia32": "0.27.2", "@esbuild/linux-loong64": "0.27.2", "@esbuild/linux-mips64el": "0.27.2", "@esbuild/linux-ppc64": "0.27.2", "@esbuild/linux-riscv64": "0.27.2", "@esbuild/linux-s390x": "0.27.2", "@esbuild/linux-x64": "0.27.2", "@esbuild/netbsd-arm64": "0.27.2", "@esbuild/netbsd-x64": "0.27.2", "@esbuild/openbsd-arm64": "0.27.2", "@esbuild/openbsd-x64": "0.27.2", "@esbuild/openharmony-arm64": "0.27.2", "@esbuild/sunos-x64": "0.27.2", "@esbuild/win32-arm64": "0.27.2", "@esbuild/win32-ia32": "0.27.2", "@esbuild/win32-x64": "0.27.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw=="], - "tsup/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], - "vite/esbuild": ["esbuild@0.27.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.2", "@esbuild/android-arm": "0.27.2", "@esbuild/android-arm64": "0.27.2", "@esbuild/android-x64": "0.27.2", "@esbuild/darwin-arm64": "0.27.2", "@esbuild/darwin-x64": "0.27.2", "@esbuild/freebsd-arm64": "0.27.2", "@esbuild/freebsd-x64": "0.27.2", "@esbuild/linux-arm": "0.27.2", "@esbuild/linux-arm64": "0.27.2", "@esbuild/linux-ia32": "0.27.2", "@esbuild/linux-loong64": "0.27.2", "@esbuild/linux-mips64el": "0.27.2", "@esbuild/linux-ppc64": "0.27.2", "@esbuild/linux-riscv64": "0.27.2", "@esbuild/linux-s390x": "0.27.2", "@esbuild/linux-x64": "0.27.2", "@esbuild/netbsd-arm64": "0.27.2", "@esbuild/netbsd-x64": "0.27.2", "@esbuild/openbsd-arm64": "0.27.2", "@esbuild/openbsd-x64": "0.27.2", "@esbuild/openharmony-arm64": "0.27.2", "@esbuild/sunos-x64": "0.27.2", "@esbuild/win32-arm64": "0.27.2", "@esbuild/win32-ia32": "0.27.2", "@esbuild/win32-x64": "0.27.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw=="], "vite/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], @@ -1430,6 +1427,8 @@ "vitest/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "vitest/tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="], + "wait-port/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "wait-port/commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="],