From adb69a16a5603cbdc7d9a2453aeee687c64a8526 Mon Sep 17 00:00:00 2001 From: o-az Date: Wed, 3 Sep 2025 11:09:11 -0700 Subject: [PATCH 1/5] feat: harden and make installer leaner --- .gitattributes | 2 + .github/workflows/npm.yml | 14 ++-- dprint.json | 4 +- npm/.env.example | 12 +++- npm/@foundry-rs/forge/package.json | 4 -- npm/README.md | 73 +------------------- npm/env.d.ts | 9 +-- npm/package.json | 1 - npm/scripts/prepublish.ts | 3 - npm/scripts/publish.ts | 4 +- npm/src/forge.ts | 44 +++--------- npm/src/index.ts | 24 ------- npm/src/install.ts | 102 ++++++++++++++++++++++++---- npm/test/workspace/.npmrc | 1 - npm/test/workspace/bunfig.toml | 4 -- npm/test/workspace/package.json | 8 --- npm/test/workspace/scripts/setup.sh | 12 ---- npm/tsdown.config.ts | 7 -- 18 files changed, 125 insertions(+), 203 deletions(-) delete mode 100644 npm/src/index.ts delete mode 100644 npm/test/workspace/.npmrc delete mode 100644 npm/test/workspace/bunfig.toml delete mode 100644 npm/test/workspace/package.json delete mode 100644 npm/test/workspace/scripts/setup.sh diff --git a/.gitattributes b/.gitattributes index 9f1c38cb8eaa2..077f620291111 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9,3 +9,5 @@ testdata/fixtures/**/* eol=lf dprint.json linguist-language=JSON-with-Comments .devcontainer/devcontainer.json linguist-language=JSON-with-Comments + +.env.example linguist-language=Dotenv \ No newline at end of file diff --git a/.github/workflows/npm.yml b/.github/workflows/npm.yml index 6d377de185359..a5064ced74349 100644 --- a/.github/workflows/npm.yml +++ b/.github/workflows/npm.yml @@ -1,4 +1,4 @@ -name: Publish NPM +name: npm on: workflow_dispatch: @@ -71,14 +71,12 @@ jobs: run-id: ${{ github.event.workflow_run.id || inputs.run_id }} - name: Setup Bun - uses: oven-sh/setup-bun@main + uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76 # v2.0.2 with: bun-version: latest - registries: | - https://registry.npmjs.org - name: Setup Node (for npm publish auth) - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: "24" registry-url: "https://registry.npmjs.org" @@ -202,14 +200,12 @@ jobs: uses: actions/checkout@v5 - name: Setup Bun - uses: oven-sh/setup-bun@main + uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76 # v2.0.2 with: bun-version: latest - registries: | - https://registry.npmjs.org - name: Setup Node (for npm publish auth) - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: "24" registry-url: "https://registry.npmjs.org" diff --git a/dprint.json b/dprint.json index b9b42a69b6378..f665622619dd4 100644 --- a/dprint.json +++ b/dprint.json @@ -26,9 +26,9 @@ "plugins": [ "https://plugins.dprint.dev/toml-0.7.0.wasm", "https://plugins.dprint.dev/json-0.20.0.wasm", - "https://plugins.dprint.dev/markdown-0.18.0.wasm", + "https://plugins.dprint.dev/markdown-0.19.0.wasm", "https://plugins.dprint.dev/dockerfile-0.3.3.wasm", - "https://plugins.dprint.dev/typescript-0.95.7.wasm", + "https://plugins.dprint.dev/typescript-0.95.11.wasm", "https://plugins.dprint.dev/g-plane/pretty_yaml-v0.5.1.wasm" ], "markdown": { diff --git a/npm/.env.example b/npm/.env.example index 1459b209934c9..1105a0019b3a3 100644 --- a/npm/.env.example +++ b/npm/.env.example @@ -1,8 +1,14 @@ NODE_ENV="development" NPM_TOKEN="" -NPM_REGISTRY_URL="" -NPM_USERNAME="foundry-rs" PLATFORM_NAME="" -ARCH="" \ No newline at end of file +ARCH="" + +# for testing purposes +NPM_EMAIL="" +NPM_PASSWORD="" +NPM_REGISTRY_URL="" +NPM_USER="foundry-rs" +ALLOW_NO_INTEGRITY=flase +ALLOW_INSECURE_REGISTRY=false diff --git a/npm/@foundry-rs/forge/package.json b/npm/@foundry-rs/forge/package.json index e613b3c65703d..707efd7f7f03b 100644 --- a/npm/@foundry-rs/forge/package.json +++ b/npm/@foundry-rs/forge/package.json @@ -4,10 +4,6 @@ "type": "module", "homepage": "https://getfoundry.sh/forge", "description": "Fast and flexible Ethereum testing framework", - "main": "./dist/index.mjs", - "engines": { - "node": ">=20" - }, "bin": { "forge": "./bin/forge.mjs" }, diff --git a/npm/README.md b/npm/README.md index 952d45435fdde..3e2bcc376f819 100644 --- a/npm/README.md +++ b/npm/README.md @@ -1,74 +1,5 @@ # @foundry-rs npm Packages -This folder contains the npm packages for the Foundry CLI. +The npm folder contains the meta packages for `forge` (`@foundry-rs/forge`) and per-arch packages (e.g. `@foundry-rs/forge-darwin-arm64`). -- `@foundry-rs/forge`, -- `@foundry-rs/anvil` (soon), - -## Local publish & Test - -The npm folder contains the meta package `@foundry-rs/forge` and per-arch packages (e.g. `@foundry-rs/forge-darwin-arm64`). This guide shows how to publish them to a local registry and test via npx/bunx. - -### Prerequisites - -- Node.js LTS, npm, and Bun installed (`bun -v`). -- Docker (recommended) or a local [Verdaccio](https://verdaccio.org) install. -- Optional: Rust toolchain if you want to build a fresh `forge` binary (`cargo build --release -p forge`). - -Start a local npm registry (Verdaccio) with Docker: - -- Docker: `docker run -it --rm --name verdaccio -p 4873:4873 verdaccio/verdaccio` -- Verify: open `http://localhost:4873` in a browser -- Note: you might need to bump `max_body_size` in [Verdaccio `config.yaml`](https://verdaccio.org/docs/configuration#max-body-size): - - ```yaml - max_body_size: 300mb # default is 10mb - ``` - - I enter the docker image then `echo 'max_body_size: 300mb' >> /verdaccio/conf/config.yaml` - -Authenticate npm to Verdaccio - -- Create a user/token: `npm adduser --registry http://localhost:4873 --scope=@foundry-rs` -- Ensure your auth token is present (either in `~/.npmrc` or a project `.npmrc`): - - `registry=http://localhost:4873` - - `//localhost:4873/:_authToken=YOUR_TOKEN` - -#### Quick publish (macOS arm64) - -- From `npm/` in this repo: - - `export NPM_REGISTRY_URL=http://localhost:4873` - - `export NPM_TOKEN=localtesttoken` # required by scripts; any non-empty value works - - `bun install` - - `./scripts/setup-local.sh` -- This publishes `@foundry-rs/forge-darwin-arm64` and then `@foundry-rs/forge` to your local registry. - -### Manual publish (any platform) - -- Build wrappers: `cd npm && bun install && npm run build` -- If you have a local `forge` binary, stage it for your platform: - - Example (macOS arm64): - - `cargo build --release -p forge` - - `cd npm` - - `ARCH=arm64 PLATFORM_NAME=darwin FORGE_BIN_PATH=../target/release/forge bun ./scripts/prepublish.ts` -- Publish the platform package, then the meta package (versions auto-synced from Cargo.toml unless overridden by `VERSION_NAME`): - - `export NPM_REGISTRY_URL=http://localhost:4873` - - `export NPM_TOKEN=localtesttoken` - - `bun run ./scripts/publish.ts ./@foundry-rs/forge--` - - `bun run ./scripts/publish.ts ./@foundry-rs/forge` - -#### Run from a test workspace - -- Use the provided workspace: `cd npm/test/workspace` -- Registry config is already set (`.npmrc` and `bunfig.toml` point to `http://localhost:4873`). -- With npm: `npx @foundry-rs/forge --version` -- With Bun: `bunx @foundry-rs/forge --version` -- Alternatively from anywhere, force the local registry: - - `npm_config_registry=http://localhost:4873 npx @foundry-rs/forge --version` - - `REGISTRY_URL=http://localhost:4873 bunx @foundry-rs/forge --version` - -#### Notes - -- The meta package’s `postinstall` either installs the platform-specific optionalDependency or downloads its tarball from the configured registry. -- Publish arch packages first, then the meta package; the publish script auto-updates `optionalDependencies` to the same version. -- If `npm publish` returns 401, ensure you ran `npm adduser` against `http://localhost:4873` and that your token is present in `.npmrc` or provided via `NODE_AUTH_TOKEN`. +A guide on how to publish to a local registry and test via `npx`/`bunx` is available in [./test/README.md](./test/README.md). diff --git a/npm/env.d.ts b/npm/env.d.ts index 057435555239f..6cbc82710acdb 100644 --- a/npm/env.d.ts +++ b/npm/env.d.ts @@ -18,17 +18,18 @@ interface ImportMetaEnv { | 'x86_64-pc-windows-msvc' // readonly ARCH: 'amd64' | 'arm64' - // `target/$TARGET/$PROFILE` - readonly OUT_DIR: `target/${TARGET}/${PROFILE}` readonly IS_NIGHTLY: 'true' | 'false' // `${(env.IS_NIGHTLY == 'true' && 'nightly') || needs.prepare.outputs.tag_name}` readonly VERSION_NAME: string // release.yml#jobs:release:strategy:matrix:include:-|platform readonly PLATFORM_NAME: 'linux' | 'alpine' | 'darwin' | 'win32' - // `$OUT_DIR/forge$ext # <- .exe or empty string` - readonly EXT: '.exe' | '' // `debug` / `release` / `maxperf` # <- always `maxperf` readonly PROFILE: 'debug' | 'release' | 'maxperf' + + // Used for local testing/development only + readonly REGISTRY_URL: string + readonly PACKAGE_PATH: string + readonly ALLOW_NO_INTEGRITY: 'true' | 'false' } declare namespace NodeJS { diff --git a/npm/package.json b/npm/package.json index 23094d0296938..ed9fd8e036ba8 100644 --- a/npm/package.json +++ b/npm/package.json @@ -2,7 +2,6 @@ "private": true, "scripts": { "build": "tsdown --config='tsdown.config.ts'", - "prepublishOnly": "bun build && bun run ./scripts/prepublish.ts", "clean": "rm -rf bin dist && rm -rf ./@foundry-rs/forge*/bin ./@foundry-rs/forge*/dist ./@foundry-rs/forge*/*.tgz" }, "dependencies": { diff --git a/npm/scripts/prepublish.ts b/npm/scripts/prepublish.ts index a1b0039f6c703..252ab64811910 100644 --- a/npm/scripts/prepublish.ts +++ b/npm/scripts/prepublish.ts @@ -8,16 +8,13 @@ import { colors } from '../src/const' const PRESERVED_FILES = ['package.json', 'README.md'] const PLATFORM_MAP = { linux: 'linux', - alpine: 'linux', darwin: 'darwin', win32: 'win32' } as const const TARGET_MAP = { 'amd64-linux': 'x86_64-unknown-linux-gnu', - 'amd64-alpine': 'x86_64-unknown-linux-musl', 'arm64-linux': 'aarch64-unknown-linux-gnu', - 'arm64-alpine': 'aarch64-unknown-linux-musl', 'amd64-darwin': 'x86_64-apple-darwin', 'arm64-darwin': 'aarch64-apple-darwin', 'amd64-win32': 'x86_64-pc-windows-msvc' diff --git a/npm/scripts/publish.ts b/npm/scripts/publish.ts index 3fa707782ac1a..9949b9a4c9e81 100644 --- a/npm/scripts/publish.ts +++ b/npm/scripts/publish.ts @@ -42,7 +42,7 @@ function getPublishVersion() { if (bump && isValidSemver(bump)) return bump const releaseVersion = (Bun.env.RELEASE_VERSION || '').replace(/^v/, '') - const isNightly = releaseVersion.toLowerCase() === 'nightly' + const isNightly = releaseVersion.toLowerCase() === 'nightly' || Bun.env.IS_NIGHTLY === 'true' const cargoToml = NodeFS.readFileSync( NodePath.join(import.meta.dirname, '..', '..', 'Cargo.toml'), @@ -52,7 +52,7 @@ function getPublishVersion() { const versionMatch = cargoToml.match(/^version\s*=\s*"([^"]+)"/m) if (!versionMatch) throw new Error('Version not found in Cargo.toml') - const base = versionMatch[1] + const [, base] = versionMatch if (!isNightly) return base const date = new Date() diff --git a/npm/src/forge.ts b/npm/src/forge.ts index e26b13dafdabf..ae84d55787fa8 100644 --- a/npm/src/forge.ts +++ b/npm/src/forge.ts @@ -3,53 +3,25 @@ import * as NodeFS from 'node:fs' import * as NodeModule from 'node:module' import * as NodePath from 'node:path' import { fileURLToPath } from 'node:url' -import { BINARY_NAME } from './const.js' +import { BINARY_NAME, colors, PLATFORM_SPECIFIC_PACKAGE_NAME } from './const.js' const require = NodeModule.createRequire(import.meta.url) const __dirname = NodePath.dirname(fileURLToPath(import.meta.url)) function getBinaryPath() { - const { platform, arch } = process - - let packageName: string | undefined - let binaryName = 'forge' - - switch (platform) { - case 'win32': - binaryName += '.exe' - if (arch === 'x64') packageName = '@foundry-rs/forge-win32-amd64' - break - case 'darwin': - if (arch === 'x64') packageName = '@foundry-rs/forge-darwin-amd64' - else if (arch === 'arm64') packageName = '@foundry-rs/forge-darwin-arm64' - break - case 'linux': - if (arch === 'x64') packageName = '@foundry-rs/forge-linux-amd64' - else if (arch === 'arm64') packageName = '@foundry-rs/forge-linux-arm64' - break - default: - throw new Error(`Unsupported platform: ${platform}-${arch}`) - } - - if (!packageName) { - console.error(`Unsupported platform: ${platform}-${arch}`) - process.exit(1) - } - - // Try to find the binary in the platform-specific package try { - const binaryPath = require.resolve(`${packageName}/bin/${binaryName}`) + const binaryPath = require.resolve(`${PLATFORM_SPECIFIC_PACKAGE_NAME}/bin/${BINARY_NAME}`) if (NodeFS.existsSync(binaryPath)) return binaryPath - } catch (error) { + } catch { // Fall back to the binary written by postinstall into dist/ return NodePath.join(__dirname, '..', 'dist', BINARY_NAME) } - console.error(`Platform-specific package ${packageName} not found.`) - console.error( - 'This usually means the installation failed or your platform is not supported.' - ) - console.error(`Platform: ${platform}, Architecture: ${arch}`) + console.error(colors.red, `Platform-specific package ${PLATFORM_SPECIFIC_PACKAGE_NAME} not found.`) + console.error(colors.yellow, 'This usually means the installation failed or your platform is not supported.') + console.error(colors.reset) + console.error(colors.yellow, `Platform: ${process.platform}, Architecture: ${process.arch}`) + console.error(colors.reset) process.exit(1) } diff --git a/npm/src/index.ts b/npm/src/index.ts deleted file mode 100644 index 9d45184e2fe0c..0000000000000 --- a/npm/src/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import NodeChildProcess from 'node:child_process' -import NodeModule from 'node:module' -import NodePath from 'node:path' -import { fileURLToPath } from 'node:url' -import { BINARY_NAME, PLATFORM_SPECIFIC_PACKAGE_NAME } from './const.js' - -const require = NodeModule.createRequire(import.meta.url) -const __dirname = NodePath.dirname(fileURLToPath(import.meta.url)) - -function getBinaryPath() { - try { - return require.resolve(`${PLATFORM_SPECIFIC_PACKAGE_NAME}/bin/${BINARY_NAME}`) - } catch (_error) { - return NodePath.join(__dirname, BINARY_NAME) - } -} - -if (import.meta.url === `file://${process.argv[1]}`) { - NodeChildProcess.execFileSync( - getBinaryPath(), - process.argv.slice(2), - { stdio: 'inherit' } - ) -} diff --git a/npm/src/install.ts b/npm/src/install.ts index 132e2855e7084..2fb20a9111cba 100644 --- a/npm/src/install.ts +++ b/npm/src/install.ts @@ -13,8 +13,38 @@ const fallbackBinaryPath = NodePath.join(__dirname, BINARY_NAME) const require = NodeModule.createRequire(import.meta.url) +function isLocalhostHost(hostname: string) { + // Accept typical localhost variants by default + return ( + hostname === 'localhost' + || hostname === '127.0.0.1' + || hostname === '::1' + ) +} + +function ensureSecureUrl(urlString: string, purpose: string) { + // Enforce HTTPS except for localhost, unless explicitly allowed + try { + const url = new URL(urlString) + if (url.protocol === 'http:') { + const allowInsecure = process.env.ALLOW_INSECURE_REGISTRY === 'true' + if (!isLocalhostHost(url.hostname) && !allowInsecure) { + throw new Error( + `Refusing to use insecure HTTP for ${purpose}: ${urlString}. ` + + `Set ALLOW_INSECURE_REGISTRY=true to override (not recommended).` + ) + } + } + } catch { + // If parsing fails, be conservative and do nothing here; request will likely fail anyway + } +} + function makeRequest(url: string): Promise { return new Promise((resolve, reject) => { + // Security guard: only allow http for localhost unless explicitly overridden + ensureSecureUrl(url, 'HTTP request') + const client = url.startsWith('https:') ? NodeHttps : NodeHttp client .get(url, response => { @@ -31,7 +61,14 @@ function makeRequest(url: string): Promise { && response.headers.location ) { // Follow redirects - makeRequest(response.headers.location).then(resolve, reject) + const redirected = (() => { + try { + return new URL(response.headers.location!, url).href + } catch { + return response.headers.location as string + } + })() + makeRequest(redirected).then(resolve, reject) } else { reject( new Error( @@ -80,6 +117,8 @@ function extractFileFromTarball( async function downloadBinaryFromNpm() { const registryUrl = getRegistryUrl().replace(/\/$/, '') + // Security guard: only allow http registries for localhost unless explicitly overridden + ensureSecureUrl(registryUrl, 'registry URL') const encodedName = encodePackageNameForRegistry(PLATFORM_SPECIFIC_PACKAGE_NAME) // Determine which version to fetch: prefer the version pinned in optionalDependencies @@ -104,6 +143,9 @@ async function downloadBinaryFromNpm() { ) } + // Guard tarball URL scheme + ensureSecureUrl(dist.tarball, 'tarball URL') + console.info( colors.green, 'Downloading binary from:\n', @@ -113,17 +155,53 @@ async function downloadBinaryFromNpm() { ) // Download the tarball of the right binary distribution package - const tarballDownloadBuffer = await makeRequest(dist.tarball) - - // Verify integrity if available - if (dist.integrity && dist.integrity.startsWith('sha512-')) { - const expected = dist.integrity.split('sha512-')[1] - const actual = NodeCrypto.createHash('sha512') - .update(tarballDownloadBuffer) - .digest('base64') - if (expected !== actual) - throw new Error('Downloaded tarball failed integrity check (sha512 mismatch)') - } + const tarballDownloadBuffer = await makeRequest(dist.tarball) // Verify integrity: prefer SRI integrity (sha512/sha256/sha1), + // fallback to legacy dist.shasum (sha1 hex). Fail if neither unless explicitly allowed. + ;(() => { + let verified = false + + const integrity = typeof dist.integrity === 'string' ? dist.integrity : '' + const sriMatch = integrity.match(/^([a-z0-9]+)-([A-Za-z0-9+/=]+)$/i) + if (sriMatch) { + const algo = sriMatch[1].toLowerCase() + const expected = sriMatch[2] + const allowed = new Set(['sha512', 'sha256', 'sha1']) + if (allowed.has(algo)) { + const actual = NodeCrypto.createHash(algo as 'sha512') + .update(tarballDownloadBuffer) + .digest('base64') + if (expected !== actual) + throw new Error(`Downloaded tarball failed integrity check (${algo} mismatch)`) + verified = true + } + } + + if (!verified && typeof dist.shasum === 'string' && dist.shasum.length === 40) { + const expectedSha1Hex = dist.shasum.toLowerCase() + const actualSha1Hex = NodeCrypto.createHash('sha1') + .update(tarballDownloadBuffer) + .digest('hex') + if (expectedSha1Hex !== actualSha1Hex) + throw new Error('Downloaded tarball failed integrity check (sha1 shasum mismatch)') + verified = true + } + + if (!verified) { + const allowNoIntegrity = process.env.ALLOW_NO_INTEGRITY === 'true' + || process.env.ALLOW_UNVERIFIED_TARBALL === 'true' + if (!allowNoIntegrity) { + throw new Error( + 'No integrity metadata found for downloaded tarball. ' + + 'Set ALLOW_NO_INTEGRITY=true to bypass (not recommended).' + ) + } + console.warn( + colors.yellow, + 'Warning: proceeding without integrity verification (explicitly allowed).', + colors.reset + ) + } + })() // Unpack and write binary const tarballBuffer = NodeZlib.gunzipSync(tarballDownloadBuffer) diff --git a/npm/test/workspace/.npmrc b/npm/test/workspace/.npmrc deleted file mode 100644 index 9ddac6ee0b8ba..0000000000000 --- a/npm/test/workspace/.npmrc +++ /dev/null @@ -1 +0,0 @@ -registry = "http://localhost:4873" \ No newline at end of file diff --git a/npm/test/workspace/bunfig.toml b/npm/test/workspace/bunfig.toml deleted file mode 100644 index c55a65072f7c6..0000000000000 --- a/npm/test/workspace/bunfig.toml +++ /dev/null @@ -1,4 +0,0 @@ -install.registry.url = "http://localhost:4873" - -[install.cache] -disable = true diff --git a/npm/test/workspace/package.json b/npm/test/workspace/package.json deleted file mode 100644 index 586501138747c..0000000000000 --- a/npm/test/workspace/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "private": true, - "trustedDependencies": [], - "type": "module", - "name": "workspace", - "description": "```bash docker run -it --rm --name verdaccio -p 4873:4873 verdaccio/verdaccio ```", - "dependencies": {} -} \ No newline at end of file diff --git a/npm/test/workspace/scripts/setup.sh b/npm/test/workspace/scripts/setup.sh deleted file mode 100644 index 5ab1db6af1f09..0000000000000 --- a/npm/test/workspace/scripts/setup.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -set -eou pipefail - -echo "Deleting node_modules and bun.lock..." - -rm -rf node_modules -rm -rf bun.lock - -bun remove @foundry-rs/forge - -echo "Cleanup complete." diff --git a/npm/tsdown.config.ts b/npm/tsdown.config.ts index 40e4d977b8c3c..fb11867871338 100644 --- a/npm/tsdown.config.ts +++ b/npm/tsdown.config.ts @@ -53,13 +53,6 @@ export default [ outDir: './@foundry-rs/forge/bin', entry: ['./src/forge.ts'] }), - defineConfig({ - ...config, - name: 'index', - outDir: './@foundry-rs/forge/dist', - outExtensions: () => ({ js: '.mjs' }), - entry: ['./src/index.ts'] - }), defineConfig({ ...config, name: 'install', From 30893fa20b6ffa030b76871d95f846e33b0cf671 Mon Sep 17 00:00:00 2001 From: o-az Date: Tue, 9 Sep 2025 22:49:47 -0700 Subject: [PATCH 2/5] chore: up deps --- npm/bun.lock | 70 +++++++++++++++++++++++++++--------------------- npm/package.json | 9 +++++-- 2 files changed, 47 insertions(+), 32 deletions(-) diff --git a/npm/bun.lock b/npm/bun.lock index 6869f688d2c40..577bb4e0e6e2f 100644 --- a/npm/bun.lock +++ b/npm/bun.lock @@ -3,10 +3,10 @@ "workspaces": { "": { "dependencies": { - "@types/bun": "^1.2.21", - "@types/node": "^24.3.0", - "tsdown": "^0.14.2", - "typescript": "^5.9.2", + "@types/bun": "latest", + "@types/node": "latest", + "tsdown": "latest", + "typescript": "latest", }, }, }, @@ -17,9 +17,9 @@ "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], - "@babel/parser": ["@babel/parser@7.28.3", "", { "dependencies": { "@babel/types": "^7.28.2" }, "bin": "./bin/babel-parser.js" }, "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA=="], + "@babel/parser": ["@babel/parser@7.28.4", "", { "dependencies": { "@babel/types": "^7.28.4" }, "bin": "./bin/babel-parser.js" }, "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg=="], - "@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="], + "@babel/types": ["@babel/types@7.28.4", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q=="], "@emnapi/core": ["@emnapi/core@1.4.5", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.4", "tslib": "^2.4.0" } }, "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q=="], @@ -37,47 +37,47 @@ "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.3", "", { "dependencies": { "@emnapi/core": "^1.4.5", "@emnapi/runtime": "^1.4.5", "@tybys/wasm-util": "^0.10.0" } }, "sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q=="], - "@oxc-project/runtime": ["@oxc-project/runtime@0.82.3", "", {}, "sha512-LNh5GlJvYHAnMurO+EyA8jJwN1rki7l3PSHuosDh2I7h00T6/u9rCkUjg/SvPmT1CZzvhuW0y+gf7jcqUy/Usg=="], + "@oxc-project/runtime": ["@oxc-project/runtime@0.87.0", "", {}, "sha512-ky2Hqi2q/uGX36UfY79zxMbUqiNIl1RyKKVJfFenG70lbn+/fcaKBVTbhmUwn8a2wPyv2gNtDQxuDytbKX9giQ=="], - "@oxc-project/types": ["@oxc-project/types@0.82.3", "", {}, "sha512-6nCUxBnGX0c6qfZW5MaF6/fmu5dHJDMiMPaioKHKs5mi5+8/FHQ7WGjgQIz1zxpmceMYfdIXkOaLYE+ejbuOtA=="], + "@oxc-project/types": ["@oxc-project/types@0.87.0", "", {}, "sha512-ipZFWVGE9fADBVXXWJWY/cxpysc41Gt5upKDeb32F6WMgFyO7XETUMVq8UuREKCih+Km5E6p2VhEvf6Fuhey6g=="], "@quansync/fs": ["@quansync/fs@0.1.5", "", { "dependencies": { "quansync": "^0.2.11" } }, "sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA=="], - "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-beta.34", "", { "os": "android", "cpu": "arm64" }, "sha512-jf5GNe5jP3Sr1Tih0WKvg2bzvh5T/1TA0fn1u32xSH7ca/p5t+/QRr4VRFCV/na5vjwKEhwWrChsL2AWlY+eoA=="], + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-beta.36", "", { "os": "android", "cpu": "arm64" }, "sha512-0y4+MDSw9GzX4VZtATiygDv+OtijxsRtNBZW6qA3OUGi0fq6Gq+MnvFHMjdJxz3mv/thIHMmJ0AL7d8urYBCUw=="], - "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.34", "", { "os": "darwin", "cpu": "arm64" }, "sha512-2F/TqH4QuJQ34tgWxqBjFL3XV1gMzeQgUO8YRtCPGBSP0GhxtoFzsp7KqmQEothsxztlv+KhhT9Dbg3HHwHViQ=="], + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.36", "", { "os": "darwin", "cpu": "arm64" }, "sha512-F/xv0vsxXuwpyecy3GMpXPhRLI4WogQkSYYl6hh61OfmyX4lxsemSoYQ5nlK/MopdVaT111wS1dRO2eXgzBHuA=="], - "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.34", "", { "os": "darwin", "cpu": "x64" }, "sha512-E1QuFslgLWbHQ8Qli/AqUKdfg0pockQPwRxVbhNQ74SciZEZpzLaujkdmOLSccMlSXDfFCF8RPnMoRAzQ9JV8Q=="], + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.36", "", { "os": "darwin", "cpu": "x64" }, "sha512-FX3x/GSybYRt4/fUljqIMuB7JRJThxnwzjK9Ka4qKwSw92RNmxRtw+NEkpuKq/Tzcq5qpnvSWudKmjcbBSMH1g=="], - "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.34", "", { "os": "freebsd", "cpu": "x64" }, "sha512-VS8VInNCwnkpI9WeQaWu3kVBq9ty6g7KrHdLxYMzeqz24+w9hg712TcWdqzdY6sn+24lUoMD9jTZrZ/qfVpk0g=="], + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.36", "", { "os": "freebsd", "cpu": "x64" }, "sha512-j7Y/OG4XxICRgGMLB7VVbROAzdnvtr0ZTBBYnv53KZESE97Ta4zXfGhEe+EiXLRKW8JWSMeNumOaBrWAXDMiZQ=="], - "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.34", "", { "os": "linux", "cpu": "arm" }, "sha512-4St4emjcnULnxJYb/5ZDrH/kK/j6PcUgc3eAqH5STmTrcF+I9m/X2xvSF2a2bWv1DOQhxBewThu0KkwGHdgu5w=="], + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.36", "", { "os": "linux", "cpu": "arm" }, "sha512-j3rDknokIJZ+iVGjWw2cVRgKLmk9boUoHtp2k3Ba6p7vWIv+D/YypQKHxAayyzvUkxTBZsw64Ojq5/zrytRODA=="], - "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.34", "", { "os": "linux", "cpu": "arm64" }, "sha512-a737FTqhFUoWfnebS2SnQ2BS50p0JdukdkUBwy2J06j4hZ6Eej0zEB8vTfAqoCjn8BQKkXBy+3Sx0IRkgwz1gA=="], + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.36", "", { "os": "linux", "cpu": "arm64" }, "sha512-7Ds2nl3ZhC0eaSJnw7dQ5uCK1cmaBKC+EL7IIpjTpzqY10y1xCn5w6gTFKzpqKhD2nSraY4MHOyAnE+zmSAZRA=="], - "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.34", "", { "os": "linux", "cpu": "arm64" }, "sha512-NH+FeQWKyuw0k+PbXqpFWNfvD8RPvfJk766B/njdaWz4TmiEcSB0Nb6guNw1rBpM1FmltQYb3fFnTumtC6pRfA=="], + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.36", "", { "os": "linux", "cpu": "arm64" }, "sha512-0Qa4b3gv956iSdJQplV1xdI9ALbEdNo5xsFpcLU4mW2A+CqWNenVHqcHbCvwvKTP07yX6yoUvUqZR1CBxxQShg=="], - "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.34", "", { "os": "linux", "cpu": "x64" }, "sha512-Q3RSCivp8pNadYK8ke3hLnQk08BkpZX9BmMjgwae2FWzdxhxxUiUzd9By7kneUL0vRQ4uRnhD9VkFQ+Haeqdvw=="], + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.36", "", { "os": "linux", "cpu": "x64" }, "sha512-wUdZljtx9W1V9KlnmwPgF0o2ZPFq2zffr/q+wM+GUrSFIJNmP9w0zgyl1coCt1ESnNyYYyJh8T1bqvx8+16SqA=="], - "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.34", "", { "os": "linux", "cpu": "x64" }, "sha512-wDd/HrNcVoBhWWBUW3evJHoo7GJE/RofssBy3Dsiip05YUBmokQVrYAyrboOY4dzs/lJ7HYeBtWQ9hj8wlyF0A=="], + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.36", "", { "os": "linux", "cpu": "x64" }, "sha512-Up56sJMDSKYi92/28lq9xB2wonuCwVnqBzjRnKmQauZJ5QOor9h1RtcMeCzSxg4ReMsNvrdYomBogewcZgKEww=="], - "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-beta.34", "", { "os": "none", "cpu": "arm64" }, "sha512-dH3FTEV6KTNWpYSgjSXZzeX7vLty9oBYn6R3laEdhwZftQwq030LKL+5wyQdlbX5pnbh4h127hpv3Hl1+sj8dg=="], + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-beta.36", "", { "os": "none", "cpu": "arm64" }, "sha512-qX3covX7EX00yrgQl3oi8GuRTS1XFe+YHm+sGsxQvPok+r7Ct2eDFpLmmw7wajZ2SuvAJYSo/9BXLSCGR0ve2w=="], - "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.34", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.3" }, "cpu": "none" }, "sha512-y5BUf+QtO0JsIDKA51FcGwvhJmv89BYjUl8AmN7jqD6k/eU55mH6RJYnxwCsODq5m7KSSTigVb6O7/GqB8wbPw=="], + "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.36", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.3" }, "cpu": "none" }, "sha512-phFsiR97/nbQEtyo5GTPX4h/Ootz0Pdd7P7+gTmkiashePwPUik5aoMAluvzY1tTUAfhdrFR2Y8WiWbnxnsSrQ=="], - "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.34", "", { "os": "win32", "cpu": "arm64" }, "sha512-ga5hFhdTwpaNxEiuxZHWnD3ed0GBAzbgzS5tRHpe0ObptxM1a9Xrq6TVfNQirBLwb5Y7T/FJmJi3pmdLy95ljg=="], + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.36", "", { "os": "win32", "cpu": "arm64" }, "sha512-dvvByfl7TRVhD9zY/VJ94hOVJmpN8Cfxl/A77yJ/oKV67IPEXx9hRUIhuL/V9eJ0RphNbLo4VKxdVuZ+wzEWTA=="], - "@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.34", "", { "os": "win32", "cpu": "ia32" }, "sha512-4/MBp9T9eRnZskxWr8EXD/xHvLhdjWaeX/qY9LPRG1JdCGV3DphkLTy5AWwIQ5jhAy2ZNJR5z2fYRlpWU0sIyQ=="], + "@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.36", "", { "os": "win32", "cpu": "ia32" }, "sha512-n7odfY4zatppNGY/EE8wE8B78wIxlQzBaY7Ycyjun+HvYu4dJgz8A4JCKHhyYYoEA8+VXO167Or4EJ9SyBLNnw=="], - "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.34", "", { "os": "win32", "cpu": "x64" }, "sha512-7O5iUBX6HSBKlQU4WykpUoEmb0wQmonb6ziKFr3dJTHud2kzDnWMqk344T0qm3uGv9Ddq6Re/94pInxo1G2d4w=="], + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.36", "", { "os": "win32", "cpu": "x64" }, "sha512-ik9dlOa/bhRk+8NmbqCEZm9BBPy5UfSOg/Y6cAQac29Aw2/uoyoBbFUBFUKMsvfLg8F0dNxUOsT3IcVlfOJu0g=="], - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.34", "", {}, "sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA=="], + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.36", "", {}, "sha512-qa+gfzhv0/Xv52zZInENLu6JbsnSjSExD7kTaNm7Qn5LUIH6IQb7l9pB+NrsU5/Bvt9aqcBTdRGc7x1DYMTiqQ=="], "@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="], "@types/bun": ["@types/bun@1.2.21", "", { "dependencies": { "bun-types": "1.2.21" } }, "sha512-NiDnvEqmbfQ6dmZ3EeUO577s4P5bf4HCTXtI6trMc6f6RzirY5IrF3aIookuSpyslFzrnvv2lmEWv5HyC1X79A=="], - "@types/node": ["@types/node@24.3.0", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow=="], + "@types/node": ["@types/node@24.3.1", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g=="], "@types/react": ["@types/react@19.1.8", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g=="], @@ -105,7 +105,7 @@ "empathic": ["empathic@2.0.0", "", {}, "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA=="], - "fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="], + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], "get-tsconfig": ["get-tsconfig@4.10.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ=="], @@ -119,7 +119,7 @@ "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], @@ -127,19 +127,19 @@ "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], - "rolldown": ["rolldown@1.0.0-beta.34", "", { "dependencies": { "@oxc-project/runtime": "=0.82.3", "@oxc-project/types": "=0.82.3", "@rolldown/pluginutils": "1.0.0-beta.34", "ansis": "^4.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.34", "@rolldown/binding-darwin-arm64": "1.0.0-beta.34", "@rolldown/binding-darwin-x64": "1.0.0-beta.34", "@rolldown/binding-freebsd-x64": "1.0.0-beta.34", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.34", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.34", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.34", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.34", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.34", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.34", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.34", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.34", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.34", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.34" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-Wwh7EwalMzzX3Yy3VN58VEajeR2Si8+HDNMf706jPLIqU7CxneRW+dQVfznf5O0TWTnJyu4npelwg2bzTXB1Nw=="], + "rolldown": ["rolldown@1.0.0-beta.36", "", { "dependencies": { "@oxc-project/runtime": "=0.87.0", "@oxc-project/types": "=0.87.0", "@rolldown/pluginutils": "1.0.0-beta.36", "ansis": "^4.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.36", "@rolldown/binding-darwin-arm64": "1.0.0-beta.36", "@rolldown/binding-darwin-x64": "1.0.0-beta.36", "@rolldown/binding-freebsd-x64": "1.0.0-beta.36", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.36", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.36", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.36", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.36", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.36", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.36", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.36", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.36", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.36", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.36" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-eethnJ/UfQWg2VWBDDMEu7IDvEh4WPbPb1azPWDCHcuOwoPT9C2NT4Y/ecZztCl9OBzXoA+CXXb5MS+qbukAig=="], - "rolldown-plugin-dts": ["rolldown-plugin-dts@0.15.10", "", { "dependencies": { "@babel/generator": "^7.28.3", "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "ast-kit": "^2.1.2", "birpc": "^2.5.0", "debug": "^4.4.1", "dts-resolver": "^2.1.2", "get-tsconfig": "^4.10.1" }, "peerDependencies": { "@typescript/native-preview": ">=7.0.0-dev.20250601.1", "rolldown": "^1.0.0-beta.9", "typescript": "^5.0.0", "vue-tsc": "~3.0.3" }, "optionalPeers": ["@typescript/native-preview", "typescript", "vue-tsc"] }, "sha512-8cPVAVQUo9tYAoEpc3jFV9RxSil13hrRRg8cHC9gLXxRMNtWPc1LNMSDXzjyD+5Vny49sDZH77JlXp/vlc4I3g=="], + "rolldown-plugin-dts": ["rolldown-plugin-dts@0.16.1", "", { "dependencies": { "@babel/generator": "^7.28.3", "@babel/parser": "^7.28.4", "@babel/types": "^7.28.4", "ast-kit": "^2.1.2", "birpc": "^2.5.0", "debug": "^4.4.1", "dts-resolver": "^2.1.2", "get-tsconfig": "^4.10.1" }, "peerDependencies": { "@typescript/native-preview": ">=7.0.0-dev.20250601.1", "rolldown": "^1.0.0-beta.9", "typescript": "^5.0.0", "vue-tsc": "~3.0.3" }, "optionalPeers": ["@typescript/native-preview", "typescript", "vue-tsc"] }, "sha512-bEfJpvhHm+h2cldNUbj8dT5tF9BJrJawPquScFdodob/55DqYkBis7iar8nkn8wSNIFKxwd2jP9ly/Z7lRME2w=="], "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], "tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="], - "tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], - "tsdown": ["tsdown@0.14.2", "", { "dependencies": { "ansis": "^4.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "debug": "^4.4.1", "diff": "^8.0.2", "empathic": "^2.0.0", "hookable": "^5.5.3", "rolldown": "latest", "rolldown-plugin-dts": "^0.15.8", "semver": "^7.7.2", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.14", "tree-kill": "^1.2.2", "unconfig": "^7.3.3" }, "peerDependencies": { "@arethetypeswrong/core": "^0.18.1", "publint": "^0.3.0", "typescript": "^5.0.0", "unplugin-lightningcss": "^0.4.0", "unplugin-unused": "^0.5.0" }, "optionalPeers": ["@arethetypeswrong/core", "publint", "typescript", "unplugin-lightningcss", "unplugin-unused"], "bin": { "tsdown": "dist/run.mjs" } }, "sha512-6ThtxVZoTlR5YJov5rYvH8N1+/S/rD/pGfehdCLGznGgbxz+73EASV1tsIIZkLw2n+SXcERqHhcB/OkyxdKv3A=="], + "tsdown": ["tsdown@0.15.0", "", { "dependencies": { "ansis": "^4.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "debug": "^4.4.1", "diff": "^8.0.2", "empathic": "^2.0.0", "hookable": "^5.5.3", "rolldown": "latest", "rolldown-plugin-dts": "^0.16.1", "semver": "^7.7.2", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.15", "tree-kill": "^1.2.2", "unconfig": "^7.3.3" }, "peerDependencies": { "@arethetypeswrong/core": "^0.18.1", "publint": "^0.3.0", "typescript": "^5.0.0", "unplugin-lightningcss": "^0.4.0", "unplugin-unused": "^0.5.0" }, "optionalPeers": ["@arethetypeswrong/core", "publint", "typescript", "unplugin-lightningcss", "unplugin-unused"], "bin": { "tsdown": "dist/run.mjs" } }, "sha512-xbz8tvdlB2wspocZWcJQhZNDLJC+sKV+sTIpiRgfUiQCUxLFGnUZUPc9KoKp3nfMeXQqTyMi6FM9/SasSj+csQ=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -148,5 +148,15 @@ "unconfig": ["unconfig@7.3.3", "", { "dependencies": { "@quansync/fs": "^0.1.5", "defu": "^6.1.4", "jiti": "^2.5.1", "quansync": "^0.2.11" } }, "sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA=="], "undici-types": ["undici-types@7.10.0", "", {}, "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag=="], + + "@babel/generator/@babel/parser": ["@babel/parser@7.28.3", "", { "dependencies": { "@babel/types": "^7.28.2" }, "bin": "./bin/babel-parser.js" }, "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA=="], + + "@babel/generator/@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="], + + "ast-kit/@babel/parser": ["@babel/parser@7.28.3", "", { "dependencies": { "@babel/types": "^7.28.2" }, "bin": "./bin/babel-parser.js" }, "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA=="], + + "bun-types/@types/node": ["@types/node@24.3.0", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow=="], + + "ast-kit/@babel/parser/@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="], } } diff --git a/npm/package.json b/npm/package.json index ed9fd8e036ba8..1bedd27e6b619 100644 --- a/npm/package.json +++ b/npm/package.json @@ -1,14 +1,19 @@ { "private": true, + "imports": { + "#src/*": "./src/*", + "#scripts/*": "./scripts/*", + "#package.json": "./package.json" + }, "scripts": { "build": "tsdown --config='tsdown.config.ts'", "clean": "rm -rf bin dist && rm -rf ./@foundry-rs/forge*/bin ./@foundry-rs/forge*/dist ./@foundry-rs/forge*/*.tgz" }, "dependencies": { - "tsdown": "^0.14.2", + "tsdown": "^0.15.0", "typescript": "^5.9.2", "@types/bun": "^1.2.21", - "@types/node": "^24.3.0" + "@types/node": "^24.3.1" }, "license": "MIT OR Apache-2.0", "$schema": "https://json.schemastore.org/package.json" From ca775742f457fd1d860ffeea5d30692e5510e1b1 Mon Sep 17 00:00:00 2001 From: o-az Date: Wed, 10 Sep 2025 01:31:40 -0700 Subject: [PATCH 3/5] chore: comments formatting --- npm/src/install.ts | 77 +++++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 39 deletions(-) diff --git a/npm/src/install.ts b/npm/src/install.ts index 2fb20a9111cba..b93a4e1d4ee54 100644 --- a/npm/src/install.ts +++ b/npm/src/install.ts @@ -1,3 +1,4 @@ +import { BINARY_NAME, colors, getRegistryUrl, PLATFORM_SPECIFIC_PACKAGE_NAME } from '#const.ts' import * as NodeCrypto from 'node:crypto' import * as NodeFS from 'node:fs' import * as NodeHttp from 'node:http' @@ -6,24 +7,21 @@ import * as NodeModule from 'node:module' import * as NodePath from 'node:path' import { fileURLToPath } from 'node:url' import * as NodeZlib from 'node:zlib' -import { BINARY_NAME, colors, getRegistryUrl, PLATFORM_SPECIFIC_PACKAGE_NAME } from './const.js' const __dirname = NodePath.dirname(fileURLToPath(import.meta.url)) const fallbackBinaryPath = NodePath.join(__dirname, BINARY_NAME) const require = NodeModule.createRequire(import.meta.url) -function isLocalhostHost(hostname: string) { - // Accept typical localhost variants by default - return ( - hostname === 'localhost' - || hostname === '127.0.0.1' - || hostname === '::1' - ) -} +// Accept typical localhost variants by default +const isLocalhostHost = (hostname: string) => ( + hostname === 'localhost' + || hostname === '127.0.0.1' + || hostname === '::1' +) +// Enforce HTTPS except for localhost, unless explicitly allowed function ensureSecureUrl(urlString: string, purpose: string) { - // Enforce HTTPS except for localhost, unless explicitly allowed try { const url = new URL(urlString) if (url.protocol === 'http:') { @@ -36,24 +34,22 @@ function ensureSecureUrl(urlString: string, purpose: string) { } } } catch { - // If parsing fails, be conservative and do nothing here; request will likely fail anyway + // If parsing fails, the request will fail so no need to do anything here } } function makeRequest(url: string): Promise { return new Promise((resolve, reject) => { - // Security guard: only allow http for localhost unless explicitly overridden ensureSecureUrl(url, 'HTTP request') const client = url.startsWith('https:') ? NodeHttps : NodeHttp client .get(url, response => { if (response?.statusCode && response.statusCode >= 200 && response.statusCode < 300) { - const chunks: Buffer[] = [] + const chunks: Array = [] + response.on('data', chunk => chunks.push(chunk)) - response.on('end', () => { - resolve(Buffer.concat(chunks)) - }) + response.on('end', () => resolve(Buffer.concat(chunks))) } else if ( response?.statusCode && response.statusCode >= 300 @@ -63,41 +59,41 @@ function makeRequest(url: string): Promise { // Follow redirects const redirected = (() => { try { - return new URL(response.headers.location!, url).href + return new URL(response.headers.location, url).href } catch { - return response.headers.location as string + return response.headers.location } })() makeRequest(redirected).then(resolve, reject) } else { reject( new Error( - `npm responded with status code ${response.statusCode} when downloading the package!` + `Package registry responded with status code ${response.statusCode} when downloading the package.` ) ) } }) - .on('error', error => { - reject(error) - }) + .on('error', error => reject(error)) }) } -function encodePackageNameForRegistry(name: string) { - // Scoped package names should be percent-encoded - // e.g. @scope/pkg -> %40scope%2Fpkg - return name.startsWith('@') ? encodeURIComponent(name) : name -} - +/** + * Scoped package names should be percent-encoded + * e.g. @scope/pkg -> %40scope%2Fpkg + */ +const encodePackageNameForRegistry = (name: string) => name.startsWith('@') ? encodeURIComponent(name) : name + +/** + * Tar archives are organized in 512 byte blocks. + * Blocks can either be header blocks or data blocks. + * Header blocks contain file names of the archive in the first 100 bytes, terminated by a null byte. + * The size of a file is contained in bytes 124-135 of a header block and in octal format. + * The following blocks will be data blocks containing the file. + */ function extractFileFromTarball( tarballBuffer: Buffer, filepath: string ): Buffer { - // Tar archives are organized in 512 byte blocks. - // Blocks can either be header blocks or data blocks. - // Header blocks contain file names of the archive in the first 100 bytes, terminated by a null byte. - // The size of a file is contained in bytes 124-135 of a header block and in octal format. - // The following blocks will be data blocks containing the file. let offset = 0 while (offset < tarballBuffer.length) { const header = tarballBuffer.subarray(offset, offset + 512) @@ -115,10 +111,10 @@ function extractFileFromTarball( throw new Error(`File ${filepath} not found in tarball`) } -async function downloadBinaryFromNpm() { +async function downloadBinaryFromRegistry() { const registryUrl = getRegistryUrl().replace(/\/$/, '') - // Security guard: only allow http registries for localhost unless explicitly overridden ensureSecureUrl(registryUrl, 'registry URL') + const encodedName = encodePackageNameForRegistry(PLATFORM_SPECIFIC_PACKAGE_NAME) // Determine which version to fetch: prefer the version pinned in optionalDependencies @@ -154,9 +150,12 @@ async function downloadBinaryFromNpm() { colors.reset ) - // Download the tarball of the right binary distribution package - const tarballDownloadBuffer = await makeRequest(dist.tarball) // Verify integrity: prefer SRI integrity (sha512/sha256/sha1), - // fallback to legacy dist.shasum (sha1 hex). Fail if neither unless explicitly allowed. + /** + * Download the tarball of the right binary distribution package + * Verify integrity: prefer SRI integrity (sha512/sha256/sha1), + * fallback to legacy dist.shasum (sha1 hex). Fail if neither unless explicitly allowed. + */ + const tarballDownloadBuffer = await makeRequest(dist.tarball) ;(() => { let verified = false @@ -229,7 +228,7 @@ if (!PLATFORM_SPECIFIC_PACKAGE_NAME) // Skip downloading the binary if it was already installed via optionalDependencies if (!isPlatformSpecificPackageInstalled()) { console.log('Platform specific package not found. Will manually download binary.') - downloadBinaryFromNpm() + downloadBinaryFromRegistry() } else { console.log('Platform specific package already installed. Skipping manual download.') } From c77a23834287d38e7077dbf53929339a68c08ff6 Mon Sep 17 00:00:00 2001 From: zerosnacks <95942363+zerosnacks@users.noreply.github.com> Date: Wed, 10 Sep 2025 18:24:12 +0200 Subject: [PATCH 4/5] Update npm/.env.example --- npm/.env.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/.env.example b/npm/.env.example index 1105a0019b3a3..4fe68567dfcbd 100644 --- a/npm/.env.example +++ b/npm/.env.example @@ -10,5 +10,5 @@ NPM_EMAIL="" NPM_PASSWORD="" NPM_REGISTRY_URL="" NPM_USER="foundry-rs" -ALLOW_NO_INTEGRITY=flase +ALLOW_NO_INTEGRITY=false ALLOW_INSECURE_REGISTRY=false From aeed0423a1e0e6e72d4f3e0710b154be296cdd1a Mon Sep 17 00:00:00 2001 From: o-az Date: Sun, 14 Sep 2025 23:44:53 -0700 Subject: [PATCH 5/5] chore: use temp dir in npm.yml --- .github/workflows/npm.yml | 37 ++++++----- .../forge-darwin-amd64/package.json | 2 +- .../forge-darwin-arm64/package.json | 2 +- .../forge-linux-amd64/package.json | 2 +- .../forge-linux-arm64/package.json | 2 +- .../forge-win32-amd64/package.json | 2 +- npm/@foundry-rs/forge/README.md | 6 +- npm/bun.lock | 62 ++++++++++--------- npm/package.json | 6 +- npm/scripts/prepublish.ts | 18 +++--- npm/scripts/publish.ts | 3 +- 11 files changed, 80 insertions(+), 62 deletions(-) diff --git a/.github/workflows/npm.yml b/.github/workflows/npm.yml index a5064ced74349..7fb5127726d00 100644 --- a/.github/workflows/npm.yml +++ b/.github/workflows/npm.yml @@ -22,6 +22,7 @@ defaults: env: ACTIONS_RUNNER_DEBUG: true NPM_CONFIG_PROVENANCE: true + NPM_REGISTRY_URL: "https://registry.npmjs.org" jobs: publish-arch: @@ -54,19 +55,28 @@ jobs: }} outputs: RELEASE_VERSION: ${{ steps.release-version.outputs.RELEASE_VERSION }} - env: - NPM_REGISTRY_URL: "https://registry.npmjs.org" steps: - name: Checkout uses: actions/checkout@v5 + - name: Set Isolated Artifact Directory + id: set-artifact-dir + # Use RUNNER_TEMP env var to persist ARTIFACT_DIR across steps + run: echo "ARTIFACT_DIR=$RUNNER_TEMP/foundry_artifacts" >> "$GITHUB_ENV" + + - name: Prepare Isolated Artifact Directory + run: | + mkdir -p "$ARTIFACT_DIR" + ls -la "$ARTIFACT_DIR" || true + - name: Download Release Assets uses: actions/download-artifact@v5 with: merge-multiple: true # Download all foundry artifacts from the triggering release run pattern: "foundry_*" - path: foundry_artifacts + # Extract artifacts into an isolated temp directory, not the workspace + path: ${{ runner.temp }}/foundry_artifacts github-token: ${{ secrets.GITHUB_TOKEN }} run-id: ${{ github.event.workflow_run.id || inputs.run_id }} @@ -100,12 +110,12 @@ jobs: run: | set -euo pipefail - echo "Artifacts in foundry_artifacts:" - ls -la ../foundry_artifacts || true + echo "Artifacts in $ARTIFACT_DIR:" + ls -la "$ARTIFACT_DIR" || true # Derive RELEASE_VERSION from any foundry artifact we downloaded # Expected names: foundry___.{tar.gz,zip} - first_file=$(ls ../foundry_artifacts/foundry_* 2>/dev/null | head -n1 || true) + first_file=$(ls "$ARTIFACT_DIR"/foundry_* 2>/dev/null | head -n1 || true) if [[ -z "${first_file}" ]]; then echo "No foundry artifacts found to publish" >&2 exit 1 @@ -123,20 +133,20 @@ jobs: RELEASE_VERSION: ${{ steps.release-version.outputs.RELEASE_VERSION }} run: | set -euo pipefail - mkdir -p tmp + mkdir -p "$ARTIFACT_DIR/tmp" - FILE_PREFIX="../foundry_artifacts/foundry_${RELEASE_VERSION}_${{ matrix.os }}_${{ matrix.arch }}" + FILE_PREFIX="$ARTIFACT_DIR/foundry_${RELEASE_VERSION}_${{ matrix.os }}_${{ matrix.arch }}" if [[ -f "${FILE_PREFIX}.zip" ]]; then echo "Extracting ${FILE_PREFIX}.zip" if ! command -v unzip >/dev/null 2>&1; then sudo apt-get update -y && sudo apt-get install -y unzip fi - unzip -o "${FILE_PREFIX}.zip" -d ./tmp - BIN=./tmp/forge.exe + unzip -o "${FILE_PREFIX}.zip" -d "$ARTIFACT_DIR/tmp" + BIN="$ARTIFACT_DIR/tmp/forge.exe" else echo "Extracting ${FILE_PREFIX}.tar.gz" - tar -xzf "${FILE_PREFIX}.tar.gz" -C ./tmp - BIN=./tmp/forge + tar -xzf "${FILE_PREFIX}.tar.gz" -C "$ARTIFACT_DIR/tmp" + BIN="$ARTIFACT_DIR/tmp/forge" fi echo "Staging binary $BIN into @foundry-rs/forge-${{ matrix.os }}-${{ matrix.arch }}" @@ -191,10 +201,9 @@ jobs: name: Publish Meta Package runs-on: ubuntu-latest env: - RELEASE_VERSION: ${{ needs.publish-arch.outputs.RELEASE_VERSION }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - NPM_REGISTRY_URL: "https://registry.npmjs.org" + RELEASE_VERSION: ${{ needs.publish-arch.outputs.RELEASE_VERSION }} steps: - name: Checkout uses: actions/checkout@v5 diff --git a/npm/@foundry-rs/forge-darwin-amd64/package.json b/npm/@foundry-rs/forge-darwin-amd64/package.json index 2b1b8ffffa2fc..f9785d7c0d161 100644 --- a/npm/@foundry-rs/forge-darwin-amd64/package.json +++ b/npm/@foundry-rs/forge-darwin-amd64/package.json @@ -1,6 +1,6 @@ { "name": "@foundry-rs/forge-darwin-amd64", - "version": "1.3.2", + "version": "0.0.0", "type": "module", "homepage": "https://getfoundry.sh/forge", "description": "Fast and flexible Ethereum testing framework (macOS amd64)", diff --git a/npm/@foundry-rs/forge-darwin-arm64/package.json b/npm/@foundry-rs/forge-darwin-arm64/package.json index fb6f890b6b223..e1a68b813c1fb 100644 --- a/npm/@foundry-rs/forge-darwin-arm64/package.json +++ b/npm/@foundry-rs/forge-darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@foundry-rs/forge-darwin-arm64", - "version": "1.3.2", + "version": "0.0.0", "type": "module", "homepage": "https://getfoundry.sh/forge", "description": "Fast and flexible Ethereum testing framework (macOS arm64)", diff --git a/npm/@foundry-rs/forge-linux-amd64/package.json b/npm/@foundry-rs/forge-linux-amd64/package.json index 4c382b97b2b18..477ee9ee32a63 100644 --- a/npm/@foundry-rs/forge-linux-amd64/package.json +++ b/npm/@foundry-rs/forge-linux-amd64/package.json @@ -1,6 +1,6 @@ { "name": "@foundry-rs/forge-linux-amd64", - "version": "1.3.2", + "version": "0.0.0", "type": "module", "homepage": "https://getfoundry.sh/forge", "description": "Fast and flexible Ethereum testing framework (Linux amd64)", diff --git a/npm/@foundry-rs/forge-linux-arm64/package.json b/npm/@foundry-rs/forge-linux-arm64/package.json index c344f47d83978..019bbd594945f 100644 --- a/npm/@foundry-rs/forge-linux-arm64/package.json +++ b/npm/@foundry-rs/forge-linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@foundry-rs/forge-linux-arm64", - "version": "1.3.2", + "version": "0.0.0", "type": "module", "homepage": "https://getfoundry.sh/forge", "description": "Fast and flexible Ethereum testing framework (Linux arm64)", diff --git a/npm/@foundry-rs/forge-win32-amd64/package.json b/npm/@foundry-rs/forge-win32-amd64/package.json index e2e85a5a10a63..f4a1476f854f5 100644 --- a/npm/@foundry-rs/forge-win32-amd64/package.json +++ b/npm/@foundry-rs/forge-win32-amd64/package.json @@ -1,6 +1,6 @@ { "name": "@foundry-rs/forge-win32-amd64", - "version": "1.3.2", + "version": "0.0.0", "type": "module", "homepage": "https://getfoundry.sh/forge", "description": "Fast and flexible Ethereum testing framework (Windows amd64)", diff --git a/npm/@foundry-rs/forge/README.md b/npm/@foundry-rs/forge/README.md index 459d0ac64956d..775539ffc3811 100644 --- a/npm/@foundry-rs/forge/README.md +++ b/npm/@foundry-rs/forge/README.md @@ -1,4 +1,4 @@ -# forge +# Forge -A CLI tool for testing, building, and deploying your smart contracts. -See for details. +Forge is a command-line tool that ships with Foundry. Forge tests, builds, and deploys your smart contracts. +Forge is part of the Foundry suite and is installed alongside `cast`, `chisel`, and `anvil`. diff --git a/npm/bun.lock b/npm/bun.lock index 577bb4e0e6e2f..b18f633ad448e 100644 --- a/npm/bun.lock +++ b/npm/bun.lock @@ -3,10 +3,10 @@ "workspaces": { "": { "dependencies": { - "@types/bun": "latest", - "@types/node": "latest", - "tsdown": "latest", - "typescript": "latest", + "@types/bun": "^1.2.22", + "@types/node": "^24.4.0", + "tsdown": "^0.15.1", + "typescript": "^5.9.2", }, }, }, @@ -31,7 +31,7 @@ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="], @@ -43,41 +43,41 @@ "@quansync/fs": ["@quansync/fs@0.1.5", "", { "dependencies": { "quansync": "^0.2.11" } }, "sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA=="], - "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-beta.36", "", { "os": "android", "cpu": "arm64" }, "sha512-0y4+MDSw9GzX4VZtATiygDv+OtijxsRtNBZW6qA3OUGi0fq6Gq+MnvFHMjdJxz3mv/thIHMmJ0AL7d8urYBCUw=="], + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-beta.37", "", { "os": "android", "cpu": "arm64" }, "sha512-Pdr3USGBdoYzcygfJTSATHd7x476vVF3rnQ6SuUAh4YjhgGoNaI/ZycQ0RsonptwwU5NmQRWxfWv+aUPL6JlJg=="], - "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.36", "", { "os": "darwin", "cpu": "arm64" }, "sha512-F/xv0vsxXuwpyecy3GMpXPhRLI4WogQkSYYl6hh61OfmyX4lxsemSoYQ5nlK/MopdVaT111wS1dRO2eXgzBHuA=="], + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.37", "", { "os": "darwin", "cpu": "arm64" }, "sha512-iDdmatSgbWhTYOq51G2CkJXwFayiuQpv/ywG7Bv3wKqy31L7d0LltUhWqAdfCl7eBG3gybfUm/iEXiTldH3jYA=="], - "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.36", "", { "os": "darwin", "cpu": "x64" }, "sha512-FX3x/GSybYRt4/fUljqIMuB7JRJThxnwzjK9Ka4qKwSw92RNmxRtw+NEkpuKq/Tzcq5qpnvSWudKmjcbBSMH1g=="], + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.37", "", { "os": "darwin", "cpu": "x64" }, "sha512-LQPpi3YJDtIprj6mwMbVM1gLM4BV2m9oqe9h3Y1UwAd20xs+imnzWJqWFpm4Hw9SiFmefIf3q4EPx2k6Nj2K7A=="], - "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.36", "", { "os": "freebsd", "cpu": "x64" }, "sha512-j7Y/OG4XxICRgGMLB7VVbROAzdnvtr0ZTBBYnv53KZESE97Ta4zXfGhEe+EiXLRKW8JWSMeNumOaBrWAXDMiZQ=="], + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.37", "", { "os": "freebsd", "cpu": "x64" }, "sha512-9JnfSWfYd/YrZOu4Sj3rb2THBrCj70nJB/2FOSdg0O9ZoRrdTeB8b7Futo6N7HLWZM5uqqnJBX6VTpA0RZD+ow=="], - "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.36", "", { "os": "linux", "cpu": "arm" }, "sha512-j3rDknokIJZ+iVGjWw2cVRgKLmk9boUoHtp2k3Ba6p7vWIv+D/YypQKHxAayyzvUkxTBZsw64Ojq5/zrytRODA=="], + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.37", "", { "os": "linux", "cpu": "arm" }, "sha512-eEmQTpvefEtHxc0vg5sOnWCqBcGQB/SIDlPkkzKR9ESKq9BsjQfHxssJWuNMyQ+rpr9CYaogddyQtZ9GHkp8vA=="], - "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.36", "", { "os": "linux", "cpu": "arm64" }, "sha512-7Ds2nl3ZhC0eaSJnw7dQ5uCK1cmaBKC+EL7IIpjTpzqY10y1xCn5w6gTFKzpqKhD2nSraY4MHOyAnE+zmSAZRA=="], + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.37", "", { "os": "linux", "cpu": "arm64" }, "sha512-Ekv4OjDzQUl0X9kHM7M23N9hVRiYCYr89neLBNITCp7P4IHs1f6SNZiCIvvBVy6NIFzO1w9LZJGEeJYK5cQBVQ=="], - "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.36", "", { "os": "linux", "cpu": "arm64" }, "sha512-0Qa4b3gv956iSdJQplV1xdI9ALbEdNo5xsFpcLU4mW2A+CqWNenVHqcHbCvwvKTP07yX6yoUvUqZR1CBxxQShg=="], + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.37", "", { "os": "linux", "cpu": "arm64" }, "sha512-z8Aa5Kar5mhh0RVZEL+zKJwNz1cgcDISmwUMcTk0w986T8JZJOJCfJ/u9e8pqUTIJjxdM8SZq9/24nMgMlx5ng=="], - "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.36", "", { "os": "linux", "cpu": "x64" }, "sha512-wUdZljtx9W1V9KlnmwPgF0o2ZPFq2zffr/q+wM+GUrSFIJNmP9w0zgyl1coCt1ESnNyYYyJh8T1bqvx8+16SqA=="], + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.37", "", { "os": "linux", "cpu": "x64" }, "sha512-e+fNseKhfE/socjOw6VrQcXrbNKfi2V/KZ+ssuLnmeaYNGuJWqPhvML56oYhGb3IgROEEc61lzr3Riy5BIqoMA=="], - "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.36", "", { "os": "linux", "cpu": "x64" }, "sha512-Up56sJMDSKYi92/28lq9xB2wonuCwVnqBzjRnKmQauZJ5QOor9h1RtcMeCzSxg4ReMsNvrdYomBogewcZgKEww=="], + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.37", "", { "os": "linux", "cpu": "x64" }, "sha512-dPZfB396PMIasd19X0ikpdCvjK/7SaJFO8y5/TxnozJEy70vOf4GESe/oKcsJPav/MSTWBYsHjJSO6vX0oAW8g=="], - "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-beta.36", "", { "os": "none", "cpu": "arm64" }, "sha512-qX3covX7EX00yrgQl3oi8GuRTS1XFe+YHm+sGsxQvPok+r7Ct2eDFpLmmw7wajZ2SuvAJYSo/9BXLSCGR0ve2w=="], + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-beta.37", "", { "os": "none", "cpu": "arm64" }, "sha512-rFjLXoHpRqxJqkSBXHuyt6bhyiIFnvLD9X2iPmCYlfpEkdTbrY1AXg4ZbF8UMO5LM7DAAZm/7vPYPO1TKTA7Sg=="], - "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.36", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.3" }, "cpu": "none" }, "sha512-phFsiR97/nbQEtyo5GTPX4h/Ootz0Pdd7P7+gTmkiashePwPUik5aoMAluvzY1tTUAfhdrFR2Y8WiWbnxnsSrQ=="], + "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.37", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.3" }, "cpu": "none" }, "sha512-oQAe3lMaBGX6q0GSic0l3Obmd6/rX8R6eHLnRC8kyy/CvPLiCMV82MPGT8fxpPTo/ULFGrupSu2nV1zmOFBt/w=="], - "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.36", "", { "os": "win32", "cpu": "arm64" }, "sha512-dvvByfl7TRVhD9zY/VJ94hOVJmpN8Cfxl/A77yJ/oKV67IPEXx9hRUIhuL/V9eJ0RphNbLo4VKxdVuZ+wzEWTA=="], + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.37", "", { "os": "win32", "cpu": "arm64" }, "sha512-ucO6CiZhpkNRiVAk7ybvA9pZaMreCtfHej3BtJcBL5S3aYmp4h0g6TvaXLD5YRJx5sXobp/9A//xU4wPMul3Bg=="], - "@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.36", "", { "os": "win32", "cpu": "ia32" }, "sha512-n7odfY4zatppNGY/EE8wE8B78wIxlQzBaY7Ycyjun+HvYu4dJgz8A4JCKHhyYYoEA8+VXO167Or4EJ9SyBLNnw=="], + "@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.37", "", { "os": "win32", "cpu": "ia32" }, "sha512-Ya9DBWJe1EGHwil7ielI8CdE0ELCg6KyDvDQqIFllnTJEYJ1Rb74DK6mvlZo273qz6Mw8WrMm26urfDeZhCc3Q=="], - "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.36", "", { "os": "win32", "cpu": "x64" }, "sha512-ik9dlOa/bhRk+8NmbqCEZm9BBPy5UfSOg/Y6cAQac29Aw2/uoyoBbFUBFUKMsvfLg8F0dNxUOsT3IcVlfOJu0g=="], + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.37", "", { "os": "win32", "cpu": "x64" }, "sha512-r+RI+wMReoTIF/uXqQWJcD8xGWXzCzUyGdpLmQ8FC+MCyPHlkjEsFRv8OFIYI6HhiGAmbfWVYEGf+aeLJzkHGw=="], - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.36", "", {}, "sha512-qa+gfzhv0/Xv52zZInENLu6JbsnSjSExD7kTaNm7Qn5LUIH6IQb7l9pB+NrsU5/Bvt9aqcBTdRGc7x1DYMTiqQ=="], + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.37", "", {}, "sha512-0taU1HpxFzrukvWIhLRI4YssJX2wOW5q1MxPXWztltsQ13TE51/larZIwhFdpyk7+K43TH7x6GJ8oEqAo+vDbA=="], "@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="], - "@types/bun": ["@types/bun@1.2.21", "", { "dependencies": { "bun-types": "1.2.21" } }, "sha512-NiDnvEqmbfQ6dmZ3EeUO577s4P5bf4HCTXtI6trMc6f6RzirY5IrF3aIookuSpyslFzrnvv2lmEWv5HyC1X79A=="], + "@types/bun": ["@types/bun@1.2.22", "", { "dependencies": { "bun-types": "1.2.22" } }, "sha512-5A/KrKos2ZcN0c6ljRSOa1fYIyCKhZfIVYeuyb4snnvomnpFqC0tTsEkdqNxbAgExV384OETQ//WAjl3XbYqQA=="], - "@types/node": ["@types/node@24.3.1", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g=="], + "@types/node": ["@types/node@24.4.0", "", { "dependencies": { "undici-types": "~7.11.0" } }, "sha512-gUuVEAK4/u6F9wRLznPUU4WGUacSEBDPoC2TrBkw3GAnOLHBL45QdfHOXp1kJ4ypBGLxTOB+t7NJLpKoC3gznQ=="], "@types/react": ["@types/react@19.1.8", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g=="], @@ -87,7 +87,7 @@ "birpc": ["birpc@2.5.0", "", {}, "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ=="], - "bun-types": ["bun-types@1.2.21", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-sa2Tj77Ijc/NTLS0/Odjq/qngmEPZfbfnOERi0KRUYhT9R8M4VBioWVmMWE5GrYbKMc+5lVybXygLdibHaqVqw=="], + "bun-types": ["bun-types@1.2.22", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-hwaAu8tct/Zn6Zft4U9BsZcXkYomzpHJX28ofvx7k0Zz2HNz54n1n+tDgxoWFGB4PcFvJXJQloPhaV2eP3Q6EA=="], "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], @@ -115,6 +115,8 @@ "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + "magic-string": ["magic-string@0.30.19", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw=="], + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], @@ -127,9 +129,9 @@ "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], - "rolldown": ["rolldown@1.0.0-beta.36", "", { "dependencies": { "@oxc-project/runtime": "=0.87.0", "@oxc-project/types": "=0.87.0", "@rolldown/pluginutils": "1.0.0-beta.36", "ansis": "^4.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.36", "@rolldown/binding-darwin-arm64": "1.0.0-beta.36", "@rolldown/binding-darwin-x64": "1.0.0-beta.36", "@rolldown/binding-freebsd-x64": "1.0.0-beta.36", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.36", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.36", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.36", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.36", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.36", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.36", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.36", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.36", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.36", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.36" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-eethnJ/UfQWg2VWBDDMEu7IDvEh4WPbPb1azPWDCHcuOwoPT9C2NT4Y/ecZztCl9OBzXoA+CXXb5MS+qbukAig=="], + "rolldown": ["rolldown@1.0.0-beta.37", "", { "dependencies": { "@oxc-project/runtime": "=0.87.0", "@oxc-project/types": "=0.87.0", "@rolldown/pluginutils": "1.0.0-beta.37", "ansis": "^4.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.37", "@rolldown/binding-darwin-arm64": "1.0.0-beta.37", "@rolldown/binding-darwin-x64": "1.0.0-beta.37", "@rolldown/binding-freebsd-x64": "1.0.0-beta.37", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.37", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.37", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.37", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.37", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.37", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.37", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.37", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.37", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.37", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.37" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-KiTU6z1kHGaLvqaYjgsrv2LshHqNBn74waRZivlK8WbfN1obZeScVkQPKYunB66E/mxZWv/zyZlCv3xF2t0WOQ=="], - "rolldown-plugin-dts": ["rolldown-plugin-dts@0.16.1", "", { "dependencies": { "@babel/generator": "^7.28.3", "@babel/parser": "^7.28.4", "@babel/types": "^7.28.4", "ast-kit": "^2.1.2", "birpc": "^2.5.0", "debug": "^4.4.1", "dts-resolver": "^2.1.2", "get-tsconfig": "^4.10.1" }, "peerDependencies": { "@typescript/native-preview": ">=7.0.0-dev.20250601.1", "rolldown": "^1.0.0-beta.9", "typescript": "^5.0.0", "vue-tsc": "~3.0.3" }, "optionalPeers": ["@typescript/native-preview", "typescript", "vue-tsc"] }, "sha512-bEfJpvhHm+h2cldNUbj8dT5tF9BJrJawPquScFdodob/55DqYkBis7iar8nkn8wSNIFKxwd2jP9ly/Z7lRME2w=="], + "rolldown-plugin-dts": ["rolldown-plugin-dts@0.16.5", "", { "dependencies": { "@babel/generator": "^7.28.3", "@babel/parser": "^7.28.4", "@babel/types": "^7.28.4", "ast-kit": "^2.1.2", "birpc": "^2.5.0", "debug": "^4.4.1", "dts-resolver": "^2.1.2", "get-tsconfig": "^4.10.1", "magic-string": "^0.30.19" }, "peerDependencies": { "@ts-macro/tsc": "^0.3.6", "@typescript/native-preview": ">=7.0.0-dev.20250601.1", "rolldown": "^1.0.0-beta.9", "typescript": "^5.0.0", "vue-tsc": "~3.0.3" }, "optionalPeers": ["@ts-macro/tsc", "@typescript/native-preview", "typescript", "vue-tsc"] }, "sha512-bOAfJ7Tc11xK/Uou7KWYha25/Sy80G0DZkhX8WMYx6l8PUalR+bvVzQNuEqXafpKEisZfUHQrkhS2gZG76Xntw=="], "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], @@ -139,7 +141,7 @@ "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], - "tsdown": ["tsdown@0.15.0", "", { "dependencies": { "ansis": "^4.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "debug": "^4.4.1", "diff": "^8.0.2", "empathic": "^2.0.0", "hookable": "^5.5.3", "rolldown": "latest", "rolldown-plugin-dts": "^0.16.1", "semver": "^7.7.2", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.15", "tree-kill": "^1.2.2", "unconfig": "^7.3.3" }, "peerDependencies": { "@arethetypeswrong/core": "^0.18.1", "publint": "^0.3.0", "typescript": "^5.0.0", "unplugin-lightningcss": "^0.4.0", "unplugin-unused": "^0.5.0" }, "optionalPeers": ["@arethetypeswrong/core", "publint", "typescript", "unplugin-lightningcss", "unplugin-unused"], "bin": { "tsdown": "dist/run.mjs" } }, "sha512-xbz8tvdlB2wspocZWcJQhZNDLJC+sKV+sTIpiRgfUiQCUxLFGnUZUPc9KoKp3nfMeXQqTyMi6FM9/SasSj+csQ=="], + "tsdown": ["tsdown@0.15.1", "", { "dependencies": { "ansis": "^4.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "debug": "^4.4.1", "diff": "^8.0.2", "empathic": "^2.0.0", "hookable": "^5.5.3", "rolldown": "latest", "rolldown-plugin-dts": "^0.16.5", "semver": "^7.7.2", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.15", "tree-kill": "^1.2.2", "unconfig": "^7.3.3" }, "peerDependencies": { "@arethetypeswrong/core": "^0.18.1", "publint": "^0.3.0", "typescript": "^5.0.0", "unplugin-lightningcss": "^0.4.0", "unplugin-unused": "^0.5.0" }, "optionalPeers": ["@arethetypeswrong/core", "publint", "typescript", "unplugin-lightningcss", "unplugin-unused"], "bin": { "tsdown": "dist/run.mjs" } }, "sha512-USTr2wS5OIyohR8Sp09rp5mXVwOX4YvVRqarS9I9jIhF+PqgtVSMXG4vBrHGY1OficNcLT5Z75pSoxd2uU+BYg=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -147,15 +149,17 @@ "unconfig": ["unconfig@7.3.3", "", { "dependencies": { "@quansync/fs": "^0.1.5", "defu": "^6.1.4", "jiti": "^2.5.1", "quansync": "^0.2.11" } }, "sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA=="], - "undici-types": ["undici-types@7.10.0", "", {}, "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag=="], + "undici-types": ["undici-types@7.11.0", "", {}, "sha512-kt1ZriHTi7MU+Z/r9DOdAI3ONdaR3M3csEaRc6ewa4f4dTvX4cQCbJ4NkEn0ohE4hHtq85+PhPSTY+pO/1PwgA=="], "@babel/generator/@babel/parser": ["@babel/parser@7.28.3", "", { "dependencies": { "@babel/types": "^7.28.2" }, "bin": "./bin/babel-parser.js" }, "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA=="], "@babel/generator/@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="], - "ast-kit/@babel/parser": ["@babel/parser@7.28.3", "", { "dependencies": { "@babel/types": "^7.28.2" }, "bin": "./bin/babel-parser.js" }, "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA=="], + "@jridgewell/gen-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], - "bun-types/@types/node": ["@types/node@24.3.0", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow=="], + "@jridgewell/trace-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "ast-kit/@babel/parser": ["@babel/parser@7.28.3", "", { "dependencies": { "@babel/types": "^7.28.2" }, "bin": "./bin/babel-parser.js" }, "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA=="], "ast-kit/@babel/parser/@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="], } diff --git a/npm/package.json b/npm/package.json index 1bedd27e6b619..23d091b1cec0c 100644 --- a/npm/package.json +++ b/npm/package.json @@ -10,10 +10,10 @@ "clean": "rm -rf bin dist && rm -rf ./@foundry-rs/forge*/bin ./@foundry-rs/forge*/dist ./@foundry-rs/forge*/*.tgz" }, "dependencies": { - "tsdown": "^0.15.0", + "tsdown": "^0.15.1", "typescript": "^5.9.2", - "@types/bun": "^1.2.21", - "@types/node": "^24.3.1" + "@types/bun": "^1.2.22", + "@types/node": "^24.4.0" }, "license": "MIT OR Apache-2.0", "$schema": "https://json.schemastore.org/package.json" diff --git a/npm/scripts/prepublish.ts b/npm/scripts/prepublish.ts index 252ab64811910..13edff756d8d4 100644 --- a/npm/scripts/prepublish.ts +++ b/npm/scripts/prepublish.ts @@ -3,7 +3,8 @@ import * as NodeFS from 'node:fs' import * as NodePath from 'node:path' import * as NodeUtil from 'node:util' -import { colors } from '../src/const' + +import { colors } from '#const.ts' const PRESERVED_FILES = ['package.json', 'README.md'] const PLATFORM_MAP = { @@ -30,6 +31,10 @@ async function main() { const distribution = `${platform}-${arch}` const packagePath = NodePath.join(process.cwd(), '@foundry-rs', `forge-${distribution}`) + // ensure the directory exists + await NodeFS.promises.mkdir(packagePath, { recursive: true, mode: 0o755 }) + console.info(colors.green, `Ensured package directory at ${packagePath}`, colors.reset) + await cleanPackageDirectory(packagePath) await buildScripts() await copyBinary(forgeBinPath, packagePath, platform) @@ -77,19 +82,18 @@ function findForgeBinary(arch: string, platform: string, profile: string) { } async function cleanPackageDirectory(packagePath: string) { - const items = await NodeFS.promises.readdir(packagePath, { - withFileTypes: true, - recursive: true - }) + const items = await NodeFS.promises + .readdir(packagePath, { withFileTypes: true, recursive: true }) + .catch(() => []) items .filter(item => !PRESERVED_FILES.includes(item.name)) - .forEach(item => + .forEach(item => { NodeFS.rmSync(NodePath.join(packagePath, item.name), { recursive: true, force: true }) - ) + }) console.info(colors.green, 'Cleaned up package directory', colors.reset) } diff --git a/npm/scripts/publish.ts b/npm/scripts/publish.ts index 9949b9a4c9e81..cba6dc56bfa35 100644 --- a/npm/scripts/publish.ts +++ b/npm/scripts/publish.ts @@ -1,7 +1,8 @@ #!/usr/bin/env bun import * as NodeFS from 'node:fs' import * as NodePath from 'node:path' -import { colors } from '../src/const' + +import { colors } from '#const.ts' const REGISTRY_URL = Bun.env.NPM_REGISTRY_URL || 'https://registry.npmjs.org'