diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index acd73ba37a07..192bc46073fd 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -30,7 +30,7 @@ jobs: - vite - cli - postcss - - workers + - oxide - webpack # Exclude windows and macos from being built on feature branches diff --git a/CHANGELOG.md b/CHANGELOG.md index ca87e3b8396a..1b24c91399c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -- Nothing yet! +### Fixed + +- Ensure `color-mix(…)` polyfills do not cause used CSS variables to be removed ([#17555](https://github.com/tailwindlabs/tailwindcss/pull/17555)) +- Ensure the `color-mix(…)` polyfill creates fallbacks for theme variables that reference other theme variables ([#17562](https://github.com/tailwindlabs/tailwindcss/pull/17562)) +- Fix brace expansion in `@source inline('z-{10..0}')` with range going down ([#17591](https://github.com/tailwindlabs/tailwindcss/pull/17591)) + +## [4.1.3] - 2025-04-04 + +### Fixed + +- Show warning when using unsupported bare value data type in `--value(…)` ([#17464](https://github.com/tailwindlabs/tailwindcss/pull/17464)) +- PostCSS: Ensure changes to the input CSS file don't generate stale output when using Turbopack ([#17554](https://github.com/tailwindlabs/tailwindcss/pull/17554)) +- Ensure classes are detected in Ruby's `%w` syntax in Slim templates ([#17557](https://github.com/tailwindlabs/tailwindcss/pull/17557)) ## [4.1.2] - 2025-04-03 @@ -3632,7 +3644,8 @@ No release notes - Everything! -[unreleased]: https://github.com/tailwindlabs/tailwindcss/compare/v4.1.2...HEAD +[unreleased]: https://github.com/tailwindlabs/tailwindcss/compare/v4.1.3...HEAD +[4.1.3]: https://github.com/tailwindlabs/tailwindcss/compare/v4.1.2...v4.1.3 [4.1.2]: https://github.com/tailwindlabs/tailwindcss/compare/v4.1.1...v4.1.2 [4.1.1]: https://github.com/tailwindlabs/tailwindcss/compare/v4.1.0...v4.1.1 [4.1.0]: https://github.com/tailwindlabs/tailwindcss/compare/v4.0.17...v4.1.0 diff --git a/Cargo.lock b/Cargo.lock index 51aaf4134de3..1f2af8b554b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -300,9 +300,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "napi" -version = "2.16.16" +version = "2.16.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "839ae2ee5e62c6348669c50098b187c08115bd3cced658c9c0bf945fca0fec83" +checksum = "55740c4ae1d8696773c78fdafd5d0e5fe9bc9f1b071c7ba493ba5c413a9184f3" dependencies = [ "bitflags", "ctor", @@ -313,9 +313,9 @@ dependencies = [ [[package]] name = "napi-build" -version = "2.1.4" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db836caddef23662b94e16bf1f26c40eceb09d6aee5d5b06a7ac199320b69b19" +checksum = "e28acfa557c083f6e254a786e01ba253fc56f18ee000afcd4f79af735f73a6da" [[package]] name = "napi-derive" diff --git a/crates/node/.gitignore b/crates/node/.gitignore index 2cb3cf980071..f3b145596063 100644 --- a/crates/node/.gitignore +++ b/crates/node/.gitignore @@ -121,7 +121,7 @@ dist .AppleDouble .LSOverride -# Icon must end with two +# Icon must end with two Icon @@ -199,3 +199,9 @@ Cargo.lock # Generated index.d.ts index.js +*.wasm +browser.js +tailwindcss-oxide.wasi-browser.js +tailwindcss-oxide.wasi.cjs +wasi-worker-browser.mjs +wasi-worker.mjs diff --git a/crates/node/Cargo.toml b/crates/node/Cargo.toml index 2222c643fd10..87fa3b559743 100644 --- a/crates/node/Cargo.toml +++ b/crates/node/Cargo.toml @@ -8,10 +8,10 @@ crate-type = ["cdylib"] [dependencies] # Default enable napi4 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix -napi = { version = "2.16.16", default-features = false, features = ["napi4"] } +napi = { version = "2.16.17", default-features = false, features = ["napi4"] } napi-derive = "2.16.13" tailwindcss-oxide = { path = "../oxide" } rayon = "1.10.0" [build-dependencies] -napi-build = "2.1.4" +napi-build = "2.1.6" diff --git a/crates/node/npm/android-arm-eabi/package.json b/crates/node/npm/android-arm-eabi/package.json index 69a8b35dca1f..9cc32c927639 100644 --- a/crates/node/npm/android-arm-eabi/package.json +++ b/crates/node/npm/android-arm-eabi/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-android-arm-eabi", - "version": "4.1.2", + "version": "4.1.3", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/android-arm64/package.json b/crates/node/npm/android-arm64/package.json index 0da088f4fd47..832ba4c7714c 100644 --- a/crates/node/npm/android-arm64/package.json +++ b/crates/node/npm/android-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-android-arm64", - "version": "4.1.2", + "version": "4.1.3", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/darwin-arm64/package.json b/crates/node/npm/darwin-arm64/package.json index c904d0451014..c5832df948ee 100644 --- a/crates/node/npm/darwin-arm64/package.json +++ b/crates/node/npm/darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-darwin-arm64", - "version": "4.1.2", + "version": "4.1.3", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/darwin-x64/package.json b/crates/node/npm/darwin-x64/package.json index b9a6153eddeb..8f6715e701fa 100644 --- a/crates/node/npm/darwin-x64/package.json +++ b/crates/node/npm/darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-darwin-x64", - "version": "4.1.2", + "version": "4.1.3", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/freebsd-x64/package.json b/crates/node/npm/freebsd-x64/package.json index 248b3f4eb860..1e93337f0176 100644 --- a/crates/node/npm/freebsd-x64/package.json +++ b/crates/node/npm/freebsd-x64/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-freebsd-x64", - "version": "4.1.2", + "version": "4.1.3", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/linux-arm-gnueabihf/package.json b/crates/node/npm/linux-arm-gnueabihf/package.json index 38755d4a1bbb..b245f0f8b782 100644 --- a/crates/node/npm/linux-arm-gnueabihf/package.json +++ b/crates/node/npm/linux-arm-gnueabihf/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-linux-arm-gnueabihf", - "version": "4.1.2", + "version": "4.1.3", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/linux-arm64-gnu/package.json b/crates/node/npm/linux-arm64-gnu/package.json index f8ec20ab4b7e..764516fa519c 100644 --- a/crates/node/npm/linux-arm64-gnu/package.json +++ b/crates/node/npm/linux-arm64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-linux-arm64-gnu", - "version": "4.1.2", + "version": "4.1.3", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/linux-arm64-musl/package.json b/crates/node/npm/linux-arm64-musl/package.json index 7ad62ccfe0a5..c6da4a91d68a 100644 --- a/crates/node/npm/linux-arm64-musl/package.json +++ b/crates/node/npm/linux-arm64-musl/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-linux-arm64-musl", - "version": "4.1.2", + "version": "4.1.3", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/linux-x64-gnu/package.json b/crates/node/npm/linux-x64-gnu/package.json index 7253a6ba29f0..21a010e7ed41 100644 --- a/crates/node/npm/linux-x64-gnu/package.json +++ b/crates/node/npm/linux-x64-gnu/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-linux-x64-gnu", - "version": "4.1.2", + "version": "4.1.3", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/linux-x64-musl/package.json b/crates/node/npm/linux-x64-musl/package.json index 6369cf753aa8..45ed3b06613e 100644 --- a/crates/node/npm/linux-x64-musl/package.json +++ b/crates/node/npm/linux-x64-musl/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-linux-x64-musl", - "version": "4.1.2", + "version": "4.1.3", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/wasm32-wasi/.gitignore b/crates/node/npm/wasm32-wasi/.gitignore new file mode 100644 index 000000000000..c2658d7d1b31 --- /dev/null +++ b/crates/node/npm/wasm32-wasi/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/crates/node/npm/wasm32-wasi/.npmrc b/crates/node/npm/wasm32-wasi/.npmrc new file mode 100644 index 000000000000..d67f3748837b --- /dev/null +++ b/crates/node/npm/wasm32-wasi/.npmrc @@ -0,0 +1 @@ +node-linker=hoisted diff --git a/crates/node/npm/wasm32-wasi/README.md b/crates/node/npm/wasm32-wasi/README.md new file mode 100644 index 000000000000..9ec3a7b3ff21 --- /dev/null +++ b/crates/node/npm/wasm32-wasi/README.md @@ -0,0 +1,3 @@ +# `@tailwindcss/oxide-wasm32-wasi` + +This is the **wasm32-wasip1-threads** binary for `@tailwindcss/oxide` diff --git a/crates/node/npm/wasm32-wasi/package.json b/crates/node/npm/wasm32-wasi/package.json new file mode 100644 index 000000000000..506cb9b33583 --- /dev/null +++ b/crates/node/npm/wasm32-wasi/package.json @@ -0,0 +1,45 @@ +{ + "name": "@tailwindcss/oxide-wasm32-wasi", + "version": "4.1.3", + "cpu": [ + "wasm32" + ], + "main": "tailwindcss-oxide.wasi.cjs", + "files": [ + "tailwindcss-oxide.wasm32-wasi.wasm", + "tailwindcss-oxide.wasi.cjs", + "tailwindcss-oxide.wasi-browser.js", + "wasi-worker.mjs", + "wasi-worker-browser.mjs" + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + }, + "publishConfig": { + "provenance": true, + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tailwindlabs/tailwindcss.git", + "directory": "crates/node" + }, + "browser": "tailwindcss-oxide.wasi-browser.js", + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.8", + "@emnapi/core": "^1.4.0", + "@emnapi/runtime": "^1.4.0", + "@tybys/wasm-util": "^0.9.0", + "@emnapi/wasi-threads": "^1.0.1", + "tslib": "^2.8.0" + }, + "bundledDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ] +} diff --git a/crates/node/npm/win32-arm64-msvc/package.json b/crates/node/npm/win32-arm64-msvc/package.json index 1107faeae2ea..78b97dd7741b 100644 --- a/crates/node/npm/win32-arm64-msvc/package.json +++ b/crates/node/npm/win32-arm64-msvc/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-win32-arm64-msvc", - "version": "4.1.2", + "version": "4.1.3", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/npm/win32-x64-msvc/package.json b/crates/node/npm/win32-x64-msvc/package.json index 624fa561ecec..1ba915a8a7fd 100644 --- a/crates/node/npm/win32-x64-msvc/package.json +++ b/crates/node/npm/win32-x64-msvc/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide-win32-x64-msvc", - "version": "4.1.2", + "version": "4.1.3", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", diff --git a/crates/node/package.json b/crates/node/package.json index 9aa87750616d..68ba35183abb 100644 --- a/crates/node/package.json +++ b/crates/node/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/oxide", - "version": "4.1.2", + "version": "4.1.3", "repository": { "type": "git", "url": "git+https://github.com/tailwindlabs/tailwindcss.git", @@ -9,25 +9,33 @@ "main": "index.js", "types": "index.d.ts", "napi": { - "name": "tailwindcss-oxide", - "triples": { - "additional": [ - "armv7-linux-androideabi", - "aarch64-linux-android", - "aarch64-apple-darwin", - "aarch64-unknown-linux-gnu", - "aarch64-unknown-linux-musl", - "armv7-unknown-linux-gnueabihf", - "x86_64-unknown-linux-musl", - "x86_64-unknown-freebsd", - "i686-pc-windows-msvc", - "aarch64-pc-windows-msvc" - ] + "binaryName": "tailwindcss-oxide", + "packageName": "@tailwindcss/oxide", + "targets": [ + "armv7-linux-androideabi", + "aarch64-linux-android", + "aarch64-apple-darwin", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "armv7-unknown-linux-gnueabihf", + "x86_64-unknown-linux-musl", + "x86_64-unknown-freebsd", + "i686-pc-windows-msvc", + "aarch64-pc-windows-msvc", + "wasm32-wasip1-threads" + ], + "wasm": { + "initialMemory": 16384, + "browser": { + "fs": true + } } }, "license": "MIT", "devDependencies": { - "@napi-rs/cli": "^2.18.4" + "@napi-rs/cli": "^3.0.0-alpha.77", + "@napi-rs/wasm-runtime": "^0.2.8", + "emnapi": "1.3.1" }, "engines": { "node": ">= 10" @@ -42,7 +50,10 @@ }, "scripts": { "artifacts": "napi artifacts", - "build": "napi build --platform --release --no-const-enum", + "build": "pnpm run build:platform && pnpm run build:wasm", + "postbuild": "node ./scripts/move-artifacts.mjs", + "build:platform": "napi build --platform --release --no-const-enum", + "build:wasm": "napi build --release --target wasm32-wasip1-threads", "dev": "cargo watch --quiet --shell 'npm run build'", "build:debug": "napi build --platform --no-const-enum", "version": "napi version" @@ -57,7 +68,8 @@ "@tailwindcss/oxide-linux-arm64-musl": "workspace:*", "@tailwindcss/oxide-linux-x64-gnu": "workspace:*", "@tailwindcss/oxide-linux-x64-musl": "workspace:*", - "@tailwindcss/oxide-win32-x64-msvc": "workspace:*", - "@tailwindcss/oxide-win32-arm64-msvc": "workspace:*" + "@tailwindcss/oxide-wasm32-wasi": "workspace:*", + "@tailwindcss/oxide-win32-arm64-msvc": "workspace:*", + "@tailwindcss/oxide-win32-x64-msvc": "workspace:*" } } diff --git a/crates/node/scripts/move-artifacts.mjs b/crates/node/scripts/move-artifacts.mjs new file mode 100644 index 000000000000..aa1613127b16 --- /dev/null +++ b/crates/node/scripts/move-artifacts.mjs @@ -0,0 +1,35 @@ +import fs from 'node:fs/promises' +import path from 'node:path' +import url from 'node:url' + +const __dirname = path.dirname(url.fileURLToPath(import.meta.url)) +let root = path.resolve(__dirname, '..') +const tailwindcssOxideRoot = path.join(root) + +// Move napi artifacts into sub packages +for (let file of await fs.readdir(tailwindcssOxideRoot)) { + if (file.startsWith('tailwindcss-oxide.') && file.endsWith('.node')) { + let target = file.split('.')[1] + await fs.cp( + path.join(tailwindcssOxideRoot, file), + path.join(tailwindcssOxideRoot, 'npm', target, file), + ) + } +} + +// Move napi wasm artifacts into sub package +let wasmArtifacts = { + 'tailwindcss-oxide.debug.wasm': 'tailwindcss-oxide.wasm32-wasi.debug.wasm', + 'tailwindcss-oxide.wasm': 'tailwindcss-oxide.wasm32-wasi.wasm', + 'tailwindcss-oxide.wasi-browser.js': 'tailwindcss-oxide.wasi-browser.js', + 'tailwindcss-oxide.wasi.cjs': 'tailwindcss-oxide.wasi.cjs', + 'wasi-worker-browser.mjs': 'wasi-worker-browser.mjs', + 'wasi-worker.mjs': 'wasi-worker.mjs', +} +for (let file of await fs.readdir(tailwindcssOxideRoot)) { + if (!wasmArtifacts[file]) continue + await fs.cp( + path.join(tailwindcssOxideRoot, file), + path.join(tailwindcssOxideRoot, 'npm', 'wasm32-wasi', wasmArtifacts[file]), + ) +} diff --git a/crates/oxide/src/extractor/pre_processors/slim.rs b/crates/oxide/src/extractor/pre_processors/slim.rs index 9f8855c2cd40..6d41e5a09b72 100644 --- a/crates/oxide/src/extractor/pre_processors/slim.rs +++ b/crates/oxide/src/extractor/pre_processors/slim.rs @@ -56,6 +56,28 @@ impl PreProcessor for Slim { } } + // Handle Ruby syntax with `%w[]` arrays embedded in Slim directly. + // + // E.g.: + // + // ``` + // div [ + // class=%w[bg-blue-500 w-10 h-10] + // ] + // ``` + b'%' if matches!(cursor.next, b'w' | b'W') + && matches!(cursor.input.get(cursor.pos + 2), Some(b'[' | b'(' | b'{')) => + { + result[cursor.pos] = b' '; // Replace `%` + cursor.advance(); + result[cursor.pos] = b' '; // Replace `w` + cursor.advance(); + result[cursor.pos] = b' '; // Replace `[` or `(` or `{` + bracket_stack.push(cursor.curr); + cursor.advance(); // Move past the bracket + continue; + } + // Any `[` preceded by an alphanumeric value will not be part of a candidate. // // E.g.: @@ -281,4 +303,29 @@ mod tests { "#; Slim::test_extract_contains(input, vec!["flex", "items-center"]); } + + // https://github.com/tailwindlabs/tailwindcss/issues/17542 + #[test] + fn test_embedded_ruby_percent_w_extraction() { + let input = r#" + div[ + class=%w[bg-blue-500 w-10 h-10] + ] + div[ + class=%w[w-10 bg-green-500 h-10] + ] + "#; + + let expected = r#" + div + class= bg-blue-500 w-10 h-10] + ] + div + class= w-10 bg-green-500 h-10] + ] + "#; + + Slim::test(input, expected); + Slim::test_extract_contains(input, vec!["bg-blue-500", "bg-green-500", "w-10", "h-10"]); + } } diff --git a/integrations/oxide/wasm.test.ts b/integrations/oxide/wasm.test.ts new file mode 100644 index 000000000000..d3212b470fed --- /dev/null +++ b/integrations/oxide/wasm.test.ts @@ -0,0 +1,53 @@ +import { css, js, json, test } from '../utils' + +test( + '@tailwindcss/oxide-wasm32-wasi can be loaded into a Node.js process', + { + fs: { + 'package.json': json` + { + "dependencies": { + "@tailwindcss/oxide-wasm32-wasi": "workspace:^" + } + } + `, + 'src/index.css': css`@import 'tailwindcss/utilities';`, + 'src/index.js': js` + const className = "content-['src/index.js']" + module.exports = { className } + `, + 'index.mjs': js` + import { Scanner } from '@tailwindcss/oxide-wasm32-wasi' + import { join } from 'node:path' + + let scanner = new Scanner({ + sources: [ + { + // Note: There is currently a known-problem that the Node WASI preview implementation + // does not properly handle FS reads on macOS. This forces us to scan a folder that + // does not contain files required to load the WASM module. + // + // https://github.com/nodejs/node/issues/47193 + base: join(process.cwd(), 'src'), + pattern: '**/*', + negated: false, + }, + ], + }) + console.log(JSON.stringify(scanner.scan())) + process.exit() + `, + }, + }, + async ({ expect, exec }) => { + let output = await exec(`node index.mjs`) + expect(JSON.parse(output)).toMatchInlineSnapshot(` + [ + "className", + "const", + "content-['src/index.js']", + "exports", + ] + `) + }, +) diff --git a/integrations/workers/index.test.ts b/integrations/oxide/workers.test.ts similarity index 100% rename from integrations/workers/index.test.ts rename to integrations/oxide/workers.test.ts diff --git a/packages/@tailwindcss-browser/package.json b/packages/@tailwindcss-browser/package.json index 44cef4fc6c2d..a73068fe717c 100644 --- a/packages/@tailwindcss-browser/package.json +++ b/packages/@tailwindcss-browser/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/browser", - "version": "4.1.2", + "version": "4.1.3", "description": "A utility-first CSS framework for rapidly building custom user interfaces.", "license": "MIT", "main": "./dist/index.global.js", diff --git a/packages/@tailwindcss-cli/package.json b/packages/@tailwindcss-cli/package.json index 45d9e3ce518e..911bafa6104e 100644 --- a/packages/@tailwindcss-cli/package.json +++ b/packages/@tailwindcss-cli/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/cli", - "version": "4.1.2", + "version": "4.1.3", "description": "A utility-first CSS framework for rapidly building custom user interfaces.", "license": "MIT", "repository": { diff --git a/packages/@tailwindcss-node/package.json b/packages/@tailwindcss-node/package.json index fe424c7140e0..ea8ff82543ba 100644 --- a/packages/@tailwindcss-node/package.json +++ b/packages/@tailwindcss-node/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/node", - "version": "4.1.2", + "version": "4.1.3", "description": "A utility-first CSS framework for rapidly building custom user interfaces.", "license": "MIT", "repository": { diff --git a/packages/@tailwindcss-postcss/package.json b/packages/@tailwindcss-postcss/package.json index 01c2ddd38fca..56c43bb3b69a 100644 --- a/packages/@tailwindcss-postcss/package.json +++ b/packages/@tailwindcss-postcss/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/postcss", - "version": "4.1.2", + "version": "4.1.3", "description": "PostCSS plugin for Tailwind CSS, a utility-first CSS framework for rapidly building custom user interfaces", "license": "MIT", "repository": { diff --git a/packages/@tailwindcss-postcss/src/fixtures/example-project/input.css b/packages/@tailwindcss-postcss/src/fixtures/example-project/input.css new file mode 100644 index 000000000000..f1af498fc1c6 --- /dev/null +++ b/packages/@tailwindcss-postcss/src/fixtures/example-project/input.css @@ -0,0 +1 @@ +/* the content for this file is set in the tests */ diff --git a/packages/@tailwindcss-postcss/src/index.test.ts b/packages/@tailwindcss-postcss/src/index.test.ts index 5827d819d365..4227d6fbbf93 100644 --- a/packages/@tailwindcss-postcss/src/index.test.ts +++ b/packages/@tailwindcss-postcss/src/index.test.ts @@ -420,3 +420,25 @@ describe('concurrent builds', () => { expect(await promise2).toContain('.red') }) }) + +test('does not register the input file as a dependency, even if it is passed in as relative path', async () => { + let processor = postcss([ + tailwindcss({ base: `${__dirname}/fixtures/example-project`, optimize: { minify: false } }), + ]) + + let result = await processor.process(`@tailwind utilities`, { from: './input.css' }) + + expect(result.css.trim()).toMatchInlineSnapshot(` + ".underline { + text-decoration-line: underline; + }" + `) + + // Check for dependency messages + expect(result.messages).not.toContainEqual({ + type: 'dependency', + file: expect.stringMatching(/input.css$/g), + parent: expect.any(String), + plugin: expect.any(String), + }) +}) diff --git a/packages/@tailwindcss-postcss/src/index.ts b/packages/@tailwindcss-postcss/src/index.ts index e728c2f9506e..bac5c5b9a9f9 100644 --- a/packages/@tailwindcss-postcss/src/index.ts +++ b/packages/@tailwindcss-postcss/src/index.ts @@ -223,10 +223,12 @@ function tailwindcss(opts: PluginOptions = {}): AcceptedPlugin { if (compiler.features & Features.Utilities) { DEBUG && I.start('Register dependency messages') // Add all found files as direct dependencies + // Note: With Turbopack, the input file might not be a resolved path + let resolvedInputFile = path.resolve(base, inputFile) for (let file of context.scanner.files) { let absolutePath = path.resolve(file) // The CSS file cannot be a dependency of itself - if (absolutePath === result.opts.from) { + if (absolutePath === resolvedInputFile) { continue } result.messages.push({ diff --git a/packages/@tailwindcss-standalone/package.json b/packages/@tailwindcss-standalone/package.json index 31f31de5d136..17462b72b9d7 100644 --- a/packages/@tailwindcss-standalone/package.json +++ b/packages/@tailwindcss-standalone/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/standalone", - "version": "4.1.2", + "version": "4.1.3", "private": true, "description": "Standalone CLI for Tailwind CSS", "license": "MIT", diff --git a/packages/@tailwindcss-upgrade/package.json b/packages/@tailwindcss-upgrade/package.json index cda0fbcb9971..c82f03782025 100644 --- a/packages/@tailwindcss-upgrade/package.json +++ b/packages/@tailwindcss-upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/upgrade", - "version": "4.1.2", + "version": "4.1.3", "description": "A utility-first CSS framework for rapidly building custom user interfaces.", "license": "MIT", "repository": { diff --git a/packages/@tailwindcss-vite/package.json b/packages/@tailwindcss-vite/package.json index 06b5b9cfcbcf..fe7aedc825be 100644 --- a/packages/@tailwindcss-vite/package.json +++ b/packages/@tailwindcss-vite/package.json @@ -1,6 +1,6 @@ { "name": "@tailwindcss/vite", - "version": "4.1.2", + "version": "4.1.3", "description": "A utility-first CSS framework for rapidly building custom user interfaces.", "license": "MIT", "repository": { diff --git a/packages/tailwindcss/package.json b/packages/tailwindcss/package.json index 22683b37c8fe..7d89e7839916 100644 --- a/packages/tailwindcss/package.json +++ b/packages/tailwindcss/package.json @@ -1,6 +1,6 @@ { "name": "tailwindcss", - "version": "4.1.2", + "version": "4.1.3", "description": "A utility-first CSS framework for rapidly building custom user interfaces.", "license": "MIT", "repository": { diff --git a/packages/tailwindcss/src/ast.ts b/packages/tailwindcss/src/ast.ts index af76b0772faf..3db0432dd3a9 100644 --- a/packages/tailwindcss/src/ast.ts +++ b/packages/tailwindcss/src/ast.ts @@ -266,10 +266,8 @@ export function optimizeAst( ) { let atRoots: AstNode[] = [] let seenAtProperties = new Set() - let cssThemeVariables = new DefaultMap< - Extract['nodes'], - Set - >(() => new Set()) + let cssThemeVariables = new DefaultMap>(() => new Set()) + let colorMixDeclarations = new DefaultMap>(() => new Set()) let keyframes = new Set() let usedKeyframeNames = new Set() @@ -280,7 +278,7 @@ export function optimizeAst( function transform( node: AstNode, - parent: Extract['nodes'], + parent: AstNode[], context: Record = {}, depth = 0, ) { @@ -326,71 +324,7 @@ export function optimizeAst( // Create fallback values for usages of the `color-mix(…)` function that reference variables // found in the theme config. if (polyfills & Polyfills.ColorMix && node.value.includes('color-mix(')) { - let ast = ValueParser.parse(node.value) - - let requiresPolyfill = false - ValueParser.walk(ast, (node, { replaceWith }) => { - if (node.kind !== 'function' || node.value !== 'color-mix') return - - let containsUnresolvableVars = false - let containsCurrentcolor = false - ValueParser.walk(node.nodes, (node, { replaceWith }) => { - if (node.kind == 'word' && node.value.toLowerCase() === 'currentcolor') { - containsCurrentcolor = true - requiresPolyfill = true - return - } - if (node.kind !== 'function' || node.value !== 'var') return - let firstChild = node.nodes[0] - if (!firstChild || firstChild.kind !== 'word') return - - requiresPolyfill = true - - let inlinedColor = designSystem.theme.resolveValue(null, [firstChild.value as any]) - if (!inlinedColor) { - containsUnresolvableVars = true - return - } - - replaceWith({ kind: 'word', value: inlinedColor }) - }) - - if (containsUnresolvableVars || containsCurrentcolor) { - let separatorIndex = node.nodes.findIndex( - (node) => node.kind === 'separator' && node.value.trim().includes(','), - ) - if (separatorIndex === -1) return - let firstColorValue = - node.nodes.length > separatorIndex ? node.nodes[separatorIndex + 1] : null - if (!firstColorValue) return - replaceWith(firstColorValue) - } else if (requiresPolyfill) { - // Change the colorspace to `srgb` since the fallback values should not be represented as - // `oklab(…)` functions again as their support in Safari <16 is very limited. - let colorspace = node.nodes[2] - if ( - colorspace.kind === 'word' && - (colorspace.value === 'oklab' || - colorspace.value === 'oklch' || - colorspace.value === 'lab' || - colorspace.value === 'lch') - ) { - colorspace.value = 'srgb' - } - } - }) - - if (requiresPolyfill) { - let fallback = { - ...node, - value: ValueParser.toCss(ast), - } - let colorMixQuery = rule('@supports (color: color-mix(in lab, red, red))', [node]) - - parent.push(fallback, colorMixQuery) - - return - } + colorMixDeclarations.get(parent).add(node) } parent.push(node) @@ -595,6 +529,105 @@ export function optimizeAst( newAst = newAst.concat(atRoots) // Fallbacks + // Create fallback values for usages of the `color-mix(…)` function that reference variables + // found in the theme config. + if (polyfills & Polyfills.ColorMix) { + for (let [parent, declarations] of colorMixDeclarations) { + for (let declaration of declarations) { + let idx = parent.indexOf(declaration) + // If the declaration is no longer present, we don't need to create a polyfill anymore + if (idx === -1 || declaration.value == null) continue + + let ast = ValueParser.parse(declaration.value) + let requiresPolyfill = false + ValueParser.walk(ast, (node, { replaceWith }) => { + if (node.kind !== 'function' || node.value !== 'color-mix') return + + let containsUnresolvableVars = false + let containsCurrentcolor = false + ValueParser.walk(node.nodes, (node, { replaceWith }) => { + if (node.kind == 'word' && node.value.toLowerCase() === 'currentcolor') { + containsCurrentcolor = true + requiresPolyfill = true + return + } + + let varNode: ValueParser.ValueAstNode | null = node + let inlinedColor: string | null = null + let seenVariables = new Set() + do { + if (varNode.kind !== 'function' || varNode.value !== 'var') return + let firstChild = varNode.nodes[0] + if (!firstChild || firstChild.kind !== 'word') return + + let variableName = firstChild.value + + if (seenVariables.has(variableName)) { + containsUnresolvableVars = true + return + } + + seenVariables.add(variableName) + + requiresPolyfill = true + + inlinedColor = designSystem.theme.resolveValue(null, [firstChild.value as any]) + if (!inlinedColor) { + containsUnresolvableVars = true + return + } + if (inlinedColor.toLowerCase() === 'currentcolor') { + containsCurrentcolor = true + return + } + + if (inlinedColor.startsWith('var(')) { + let subAst = ValueParser.parse(inlinedColor) + varNode = subAst[0] + } else { + varNode = null + } + } while (varNode) + + replaceWith({ kind: 'word', value: inlinedColor }) + }) + + if (containsUnresolvableVars || containsCurrentcolor) { + let separatorIndex = node.nodes.findIndex( + (node) => node.kind === 'separator' && node.value.trim().includes(','), + ) + if (separatorIndex === -1) return + let firstColorValue = + node.nodes.length > separatorIndex ? node.nodes[separatorIndex + 1] : null + if (!firstColorValue) return + replaceWith(firstColorValue) + } else if (requiresPolyfill) { + // Change the colorspace to `srgb` since the fallback values should not be represented as + // `oklab(…)` functions again as their support in Safari <16 is very limited. + let colorspace = node.nodes[2] + if ( + colorspace.kind === 'word' && + (colorspace.value === 'oklab' || + colorspace.value === 'oklch' || + colorspace.value === 'lab' || + colorspace.value === 'lch') + ) { + colorspace.value = 'srgb' + } + } + }) + if (!requiresPolyfill) continue + + let fallback = { + ...declaration, + value: ValueParser.toCss(ast), + } + let colorMixQuery = rule('@supports (color: color-mix(in lab, red, red))', [declaration]) + parent.splice(idx, 1, fallback, colorMixQuery) + } + } + } + if (polyfills & Polyfills.AtProperty) { let fallbackAst = [] diff --git a/packages/tailwindcss/src/compat/config.test.ts b/packages/tailwindcss/src/compat/config.test.ts index b68e6dcff2bb..6bfccb1e3bc1 100644 --- a/packages/tailwindcss/src/compat/config.test.ts +++ b/packages/tailwindcss/src/compat/config.test.ts @@ -1164,21 +1164,21 @@ test('utilities must be prefixed', async () => { // Prefixed utilities are generated expect(compiler.build(['tw:underline', 'tw:hover:line-through', 'tw:custom'])) .toMatchInlineSnapshot(` - ".tw\\:custom { - color: red; - } - .tw\\:underline { - text-decoration-line: underline; - } - .tw\\:hover\\:line-through { - &:hover { - @media (hover: hover) { - text-decoration-line: line-through; + ".tw\\:custom { + color: red; + } + .tw\\:underline { + text-decoration-line: underline; + } + .tw\\:hover\\:line-through { + &:hover { + @media (hover: hover) { + text-decoration-line: line-through; + } } } - } - " - `) + " + `) // Non-prefixed utilities are ignored compiler = await compile(input, { diff --git a/packages/tailwindcss/src/compat/plugin-api.test.ts b/packages/tailwindcss/src/compat/plugin-api.test.ts index dc415eb1a8c2..ca7d96dee648 100644 --- a/packages/tailwindcss/src/compat/plugin-api.test.ts +++ b/packages/tailwindcss/src/compat/plugin-api.test.ts @@ -243,14 +243,14 @@ describe('theme', async () => { expect(compiler.build(['animate-duration-316', 'animate-duration-slow'])) .toMatchInlineSnapshot(` - ".animate-duration-316 { - animation-duration: 316ms; - } - .animate-duration-slow { - animation-duration: 800ms; - } - " - `) + ".animate-duration-316 { + animation-duration: 316ms; + } + .animate-duration-slow { + animation-duration: 800ms; + } + " + `) }) test('plugin theme can have opacity modifiers', async () => { @@ -3340,16 +3340,16 @@ describe('matchUtilities()', () => { } expect(optimizeCss(await run(['@w-1', 'hover:@w-1'])).trim()).toMatchInlineSnapshot(` - ".\\@w-1 { + ".\\@w-1 { + width: 1px; + } + + @media (hover: hover) { + .hover\\:\\@w-1:hover { width: 1px; } - - @media (hover: hover) { - .hover\\:\\@w-1:hover { - width: 1px; - } - }" - `) + }" + `) }) test('custom functional utilities can return an array of rules', async () => { @@ -4153,30 +4153,30 @@ describe('addComponents()', () => { expect(optimizeCss(compiled.build(['btn', 'btn-blue', 'btn-red'])).trim()) .toMatchInlineSnapshot(` - ".btn { - border-radius: .25rem; - padding: .5rem 1rem; - font-weight: 600; - } + ".btn { + border-radius: .25rem; + padding: .5rem 1rem; + font-weight: 600; + } - .btn-blue { - color: #fff; - background-color: #3490dc; - } + .btn-blue { + color: #fff; + background-color: #3490dc; + } - .btn-blue:hover { - background-color: #2779bd; - } + .btn-blue:hover { + background-color: #2779bd; + } - .btn-red { - color: #fff; - background-color: #e3342f; - } + .btn-red { + color: #fff; + background-color: #e3342f; + } - .btn-red:hover { - background-color: #cc1f1a; - }" - `) + .btn-red:hover { + background-color: #cc1f1a; + }" + `) }) }) @@ -4212,16 +4212,16 @@ describe('matchComponents()', () => { expect(optimizeCss(compiled.build(['prose', 'sm:prose-sm', 'hover:prose-lg'])).trim()) .toMatchInlineSnapshot(` - ".prose { - --container-size: normal; - } - - @media (hover: hover) { - .hover\\:prose-lg:hover { - --container-size: lg; + ".prose { + --container-size: normal; } - }" - `) + + @media (hover: hover) { + .hover\\:prose-lg:hover { + --container-size: lg; + } + }" + `) }) }) diff --git a/packages/tailwindcss/src/css-functions.test.ts b/packages/tailwindcss/src/css-functions.test.ts index 37747e32f751..f63682f63e01 100644 --- a/packages/tailwindcss/src/css-functions.test.ts +++ b/packages/tailwindcss/src/css-functions.test.ts @@ -756,10 +756,10 @@ describe('theme(…)', () => { } `), ).toMatchInlineSnapshot(` - ".fam { - font-family: ui-sans-serif, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji; - }" - `) + ".fam { + font-family: ui-sans-serif, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji; + }" + `) }) test('theme(fontFamily.sans) (config)', async () => { @@ -776,10 +776,10 @@ describe('theme(…)', () => { ) expect(optimizeCss(compiled.build([])).trim()).toMatchInlineSnapshot(` - ".fam { - font-family: ui-sans-serif, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji; - }" - `) + ".fam { + font-family: ui-sans-serif, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji; + }" + `) }) }) diff --git a/packages/tailwindcss/src/index.test.ts b/packages/tailwindcss/src/index.test.ts index 14aaf18c7c67..411e3fe7b426 100644 --- a/packages/tailwindcss/src/index.test.ts +++ b/packages/tailwindcss/src/index.test.ts @@ -4764,6 +4764,36 @@ describe('`color-mix(…)` polyfill', () => { `) }) + it('creates an inlined variable version of the color-mix(…) usages when it resolves to a var(…) containing another theme variable', async () => { + await expect( + compileCss( + css` + @theme { + --color-red: var(--color-red-500); + --color-red-500: oklch(63.7% 0.237 25.331); + } + @tailwind utilities; + `, + ['text-red/50'], + ), + ).resolves.toMatchInlineSnapshot(` + ":root, :host { + --color-red: var(--color-red-500); + --color-red-500: oklch(63.7% .237 25.331); + } + + .text-red\\/50 { + color: #fb2c3680; + } + + @supports (color: color-mix(in lab, red, red)) { + .text-red\\/50 { + color: color-mix(in oklab, var(--color-red) 50%, transparent); + } + }" + `) + }) + it('works for color values in the first and second position', async () => { await expect( compileCss( @@ -4971,6 +5001,34 @@ describe('`color-mix(…)` polyfill', () => { `) }) + it('uses the first color value as the fallback when the `color-mix(…)` function contains theme variables that resolves to other variables', async () => { + await expect( + compileCss( + css` + @tailwind utilities; + @theme { + --color-red: var(--my-red); + } + `, + ['text-red/50'], + ), + ).resolves.toMatchInlineSnapshot(` + ".text-red\\/50 { + color: var(--color-red); + } + + @supports (color: color-mix(in lab, red, red)) { + .text-red\\/50 { + color: color-mix(in oklab, var(--color-red) 50%, transparent); + } + } + + :root, :host { + --color-red: var(--my-red); + }" + `) + }) + it('uses the first color value of the inner most `color-mix(…)` function as the fallback when nested `color-mix(…)` function all contain non-theme variables', async () => { await expect( compileCss( @@ -5047,6 +5105,150 @@ describe('`color-mix(…)` polyfill', () => { }" `) }) + + it('does not delete theme variables from the output', async () => { + await expect( + compileCss( + css` + @layer theme { + @theme { + --color-red-500: red; + --shadow-xl: 0 6px 18px 4px color-mix(in oklab, var(--color-red-500) 25%, transparent); + --opacity-disabled: 50%; + } + } + @tailwind utilities; + `, + ['text-red-500', 'shadow-xl', 'opacity-disabled'], + ), + ).resolves.toMatchInlineSnapshot(` + "@layer properties { + @supports (((-webkit-hyphens: none)) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color: rgb(from red r g b)))) { + *, :before, :after, ::backdrop { + --tw-shadow: 0 0 #0000; + --tw-shadow-color: initial; + --tw-shadow-alpha: 100%; + --tw-inset-shadow: 0 0 #0000; + --tw-inset-shadow-color: initial; + --tw-inset-shadow-alpha: 100%; + --tw-ring-color: initial; + --tw-ring-shadow: 0 0 #0000; + --tw-inset-ring-color: initial; + --tw-inset-ring-shadow: 0 0 #0000; + --tw-ring-inset: initial; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-offset-shadow: 0 0 #0000; + } + } + } + + @layer theme { + :root, :host { + --color-red-500: red; + --opacity-disabled: 50%; + } + } + + .text-red-500 { + color: var(--color-red-500); + } + + .opacity-disabled { + opacity: var(--opacity-disabled); + } + + .shadow-xl { + --tw-shadow: 0 6px 18px 4px var(--tw-shadow-color, #ff000040); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + + @supports (color: color-mix(in lab, red, red)) { + .shadow-xl { + --tw-shadow: 0 6px 18px 4px var(--tw-shadow-color, color-mix(in oklab, var(--color-red-500) 25%, transparent)); + } + } + + @property --tw-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; + } + + @property --tw-shadow-color { + syntax: "*"; + inherits: false + } + + @property --tw-shadow-alpha { + syntax: ""; + inherits: false; + initial-value: 100%; + } + + @property --tw-inset-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; + } + + @property --tw-inset-shadow-color { + syntax: "*"; + inherits: false + } + + @property --tw-inset-shadow-alpha { + syntax: ""; + inherits: false; + initial-value: 100%; + } + + @property --tw-ring-color { + syntax: "*"; + inherits: false + } + + @property --tw-ring-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; + } + + @property --tw-inset-ring-color { + syntax: "*"; + inherits: false + } + + @property --tw-inset-ring-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; + } + + @property --tw-ring-inset { + syntax: "*"; + inherits: false + } + + @property --tw-ring-offset-width { + syntax: ""; + inherits: false; + initial-value: 0; + } + + @property --tw-ring-offset-color { + syntax: "*"; + inherits: false; + initial-value: #fff; + } + + @property --tw-ring-offset-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; + }" + `) + }) }) describe('`@property` polyfill', async () => { diff --git a/packages/tailwindcss/src/utilities.test.ts b/packages/tailwindcss/src/utilities.test.ts index 6544129c4cf7..c3af45d3b7ef 100644 --- a/packages/tailwindcss/src/utilities.test.ts +++ b/packages/tailwindcss/src/utilities.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from 'vitest' +import { describe, expect, test, vi } from 'vitest' import { compile } from '.' import { compileCss, optimizeCss, run } from './test-utils/run' @@ -1319,26 +1319,26 @@ test('row-start', async () => { expect( await run(['row-start-auto', 'row-start-4', 'row-start-99', 'row-start-[123]', '-row-start-4']), ).toMatchInlineSnapshot(` - ".-row-start-4 { - grid-row-start: calc(4 * -1); - } + ".-row-start-4 { + grid-row-start: calc(4 * -1); + } - .row-start-4 { - grid-row-start: 4; - } + .row-start-4 { + grid-row-start: 4; + } - .row-start-99 { - grid-row-start: 99; - } + .row-start-99 { + grid-row-start: 99; + } - .row-start-\\[123\\] { - grid-row-start: 123; - } + .row-start-\\[123\\] { + grid-row-start: 123; + } - .row-start-auto { - grid-row-start: auto; - }" - `) + .row-start-auto { + grid-row-start: auto; + }" + `) expect( await run([ 'row-start', @@ -4437,22 +4437,22 @@ test('translate-3d', async () => { test('rotate', async () => { expect(await run(['rotate-45', '-rotate-45', 'rotate-[123deg]', 'rotate-[0.3_0.7_1_45deg]'])) .toMatchInlineSnapshot(` - ".-rotate-45 { - rotate: -45deg; - } + ".-rotate-45 { + rotate: -45deg; + } - .rotate-45 { - rotate: 45deg; - } + .rotate-45 { + rotate: 45deg; + } - .rotate-\\[0\\.3_0\\.7_1_45deg\\] { - rotate: .3 .7 1 45deg; - } + .rotate-\\[0\\.3_0\\.7_1_45deg\\] { + rotate: .3 .7 1 45deg; + } - .rotate-\\[123deg\\] { - rotate: 123deg; - }" - `) + .rotate-\\[123deg\\] { + rotate: 123deg; + }" + `) expect( await run([ 'rotate', @@ -5316,42 +5316,42 @@ test('transform', async () => { 'backface-hidden', ]), ).toMatchInlineSnapshot(` - ".backface-hidden { - backface-visibility: hidden; - } + ".backface-hidden { + backface-visibility: hidden; + } - .backface-visible { - backface-visibility: visible; - } + .backface-visible { + backface-visibility: visible; + } - .transform-3d { - transform-style: preserve-3d; - } + .transform-3d { + transform-style: preserve-3d; + } - .transform-border { - transform-box: border-box; - } + .transform-border { + transform-box: border-box; + } - .transform-content { - transform-box: content-box; - } + .transform-content { + transform-box: content-box; + } - .transform-fill { - transform-box: fill-box; - } + .transform-fill { + transform-box: fill-box; + } - .transform-flat { - transform-style: flat; - } + .transform-flat { + transform-style: flat; + } - .transform-stroke { - transform-box: stroke-box; - } + .transform-stroke { + transform-box: stroke-box; + } - .transform-view { - transform-box: view-box; - }" - `) + .transform-view { + transform-box: view-box; + }" + `) expect( await run([ '-transform', @@ -5862,26 +5862,26 @@ test('touch-pinch-zoom', async () => { test('select', async () => { expect(await run(['select-none', 'select-text', 'select-all', 'select-auto'])) .toMatchInlineSnapshot(` - ".select-all { - -webkit-user-select: all; - user-select: all; - } + ".select-all { + -webkit-user-select: all; + user-select: all; + } - .select-auto { - -webkit-user-select: auto; - user-select: auto; - } + .select-auto { + -webkit-user-select: auto; + user-select: auto; + } - .select-none { - -webkit-user-select: none; - user-select: none; - } + .select-none { + -webkit-user-select: none; + user-select: none; + } - .select-text { - -webkit-user-select: text; - user-select: text; - }" - `) + .select-text { + -webkit-user-select: text; + user-select: text; + }" + `) expect( await run([ '-select-none', @@ -6006,22 +6006,22 @@ test('--tw-scroll-snap-strictness', async () => { test('scroll-snap-align', async () => { expect(await run(['snap-align-none', 'snap-start', 'snap-end', 'snap-center'])) .toMatchInlineSnapshot(` - ".snap-align-none { - scroll-snap-align: none; - } + ".snap-align-none { + scroll-snap-align: none; + } - .snap-center { - scroll-snap-align: center; - } + .snap-center { + scroll-snap-align: center; + } - .snap-end { - scroll-snap-align: end; - } + .snap-end { + scroll-snap-align: end; + } - .snap-start { - scroll-snap-align: start; - }" - `) + .snap-start { + scroll-snap-align: start; + }" + `) expect( await run([ '-snap-align-none', @@ -7375,22 +7375,22 @@ test('grid-rows', async () => { test('flex-direction', async () => { expect(await run(['flex-row', 'flex-row-reverse', 'flex-col', 'flex-col-reverse'])) .toMatchInlineSnapshot(` - ".flex-col { - flex-direction: column; - } + ".flex-col { + flex-direction: column; + } - .flex-col-reverse { - flex-direction: column-reverse; - } + .flex-col-reverse { + flex-direction: column-reverse; + } - .flex-row { - flex-direction: row; - } + .flex-row { + flex-direction: row; + } - .flex-row-reverse { - flex-direction: row-reverse; - }" - `) + .flex-row-reverse { + flex-direction: row-reverse; + }" + `) expect( await run([ '-flex-row', @@ -8363,31 +8363,31 @@ test('divide-style', async () => { expect( await run(['divide-solid', 'divide-dashed', 'divide-dotted', 'divide-double', 'divide-none']), ).toMatchInlineSnapshot(` - ":where(.divide-dashed > :not(:last-child)) { - --tw-border-style: dashed; - border-style: dashed; - } + ":where(.divide-dashed > :not(:last-child)) { + --tw-border-style: dashed; + border-style: dashed; + } - :where(.divide-dotted > :not(:last-child)) { - --tw-border-style: dotted; - border-style: dotted; - } + :where(.divide-dotted > :not(:last-child)) { + --tw-border-style: dotted; + border-style: dotted; + } - :where(.divide-double > :not(:last-child)) { - --tw-border-style: double; - border-style: double; - } + :where(.divide-double > :not(:last-child)) { + --tw-border-style: double; + border-style: double; + } - :where(.divide-none > :not(:last-child)) { - --tw-border-style: none; - border-style: none; - } + :where(.divide-none > :not(:last-child)) { + --tw-border-style: none; + border-style: none; + } - :where(.divide-solid > :not(:last-child)) { - --tw-border-style: solid; - border-style: solid; - }" - `) + :where(.divide-solid > :not(:last-child)) { + --tw-border-style: solid; + border-style: solid; + }" + `) expect( await run([ 'divide', @@ -9274,18 +9274,18 @@ test('overflow-y', async () => { test('overscroll', async () => { expect(await run(['overscroll-auto', 'overscroll-contain', 'overscroll-none'])) .toMatchInlineSnapshot(` - ".overscroll-auto { - overscroll-behavior: auto; - } + ".overscroll-auto { + overscroll-behavior: auto; + } - .overscroll-contain { - overscroll-behavior: contain; - } + .overscroll-contain { + overscroll-behavior: contain; + } - .overscroll-none { - overscroll-behavior: none; - }" - `) + .overscroll-none { + overscroll-behavior: none; + }" + `) expect( await run([ 'overscroll', @@ -9302,18 +9302,18 @@ test('overscroll', async () => { test('overscroll-x', async () => { expect(await run(['overscroll-x-auto', 'overscroll-x-contain', 'overscroll-x-none'])) .toMatchInlineSnapshot(` - ".overscroll-x-auto { - overscroll-behavior-x: auto; - } + ".overscroll-x-auto { + overscroll-behavior-x: auto; + } - .overscroll-x-contain { - overscroll-behavior-x: contain; - } + .overscroll-x-contain { + overscroll-behavior-x: contain; + } - .overscroll-x-none { - overscroll-behavior-x: none; - }" - `) + .overscroll-x-none { + overscroll-behavior-x: none; + }" + `) expect( await run([ 'overscroll-x', @@ -9330,18 +9330,18 @@ test('overscroll-x', async () => { test('overscroll-y', async () => { expect(await run(['overscroll-y-auto', 'overscroll-y-contain', 'overscroll-y-none'])) .toMatchInlineSnapshot(` - ".overscroll-y-auto { - overscroll-behavior-y: auto; - } + ".overscroll-y-auto { + overscroll-behavior-y: auto; + } - .overscroll-y-contain { - overscroll-behavior-y: contain; - } + .overscroll-y-contain { + overscroll-behavior-y: contain; + } - .overscroll-y-none { - overscroll-behavior-y: none; - }" - `) + .overscroll-y-none { + overscroll-behavior-y: none; + }" + `) expect( await run([ 'overscroll-y', @@ -9483,22 +9483,22 @@ test('whitespace', async () => { test('text-wrap', async () => { expect(await run(['text-wrap', 'text-nowrap', 'text-balance', 'text-pretty'])) .toMatchInlineSnapshot(` - ".text-balance { - text-wrap: balance; - } + ".text-balance { + text-wrap: balance; + } - .text-nowrap { - text-wrap: nowrap; - } + .text-nowrap { + text-wrap: nowrap; + } - .text-pretty { - text-wrap: pretty; - } + .text-pretty { + text-wrap: pretty; + } - .text-wrap { - text-wrap: wrap; - }" - `) + .text-wrap { + text-wrap: wrap; + }" + `) expect( await run([ '-text-wrap', @@ -18604,18 +18604,18 @@ test('bg-clip', async () => { test('bg-origin', async () => { expect(await run(['bg-origin-border', 'bg-origin-padding', 'bg-origin-content'])) .toMatchInlineSnapshot(` - ".bg-origin-border { - background-origin: border-box; - } + ".bg-origin-border { + background-origin: border-box; + } - .bg-origin-content { - background-origin: content-box; - } + .bg-origin-content { + background-origin: content-box; + } - .bg-origin-padding { - background-origin: padding-box; - }" - `) + .bg-origin-padding { + background-origin: padding-box; + }" + `) expect( await run([ 'bg-origin', @@ -20307,22 +20307,22 @@ test('font-stretch', async () => { test('text-decoration-line', async () => { expect(await run(['underline', 'overline', 'line-through', 'no-underline'])) .toMatchInlineSnapshot(` - ".line-through { - text-decoration-line: line-through; - } + ".line-through { + text-decoration-line: line-through; + } - .no-underline { - text-decoration-line: none; - } + .no-underline { + text-decoration-line: none; + } - .overline { - text-decoration-line: overline; - } + .overline { + text-decoration-line: overline; + } - .underline { - text-decoration-line: underline; - }" - `) + .underline { + text-decoration-line: underline; + }" + `) expect( await run([ '-underline', @@ -22158,14 +22158,14 @@ test('content', async () => { test('forced-color-adjust', async () => { expect(await run(['forced-color-adjust-none', 'forced-color-adjust-auto'])) .toMatchInlineSnapshot(` - ".forced-color-adjust-auto { - forced-color-adjust: auto; - } + ".forced-color-adjust-auto { + forced-color-adjust: auto; + } - .forced-color-adjust-none { - forced-color-adjust: none; - }" - `) + .forced-color-adjust-none { + forced-color-adjust: none; + }" + `) expect( await run([ 'forced', @@ -26530,6 +26530,34 @@ describe('custom utilities', () => { expect(await compileCss(input, ['tab-foo'])).toEqual('') }) + test('bare values with unsupported data types should result in a warning', async () => { + let spy = vi.spyOn(console, 'warn').mockImplementation(() => {}) + let input = css` + @utility paint-* { + paint: --value([color], color); + } + + @tailwind utilities; + ` + + expect(await compileCss(input, ['paint-#0088cc', 'paint-red'])).toMatchInlineSnapshot(`""`) + expect(spy.mock.calls).toMatchInlineSnapshot(` + [ + [ + "Unsupported bare value data type: "color". + Only valid data types are: "number", "integer", "ratio", "percentage". + ", + ], + [ + "\`\`\`css + --value([color],color) + ^^^^^ + \`\`\`", + ], + ] + `) + }) + test('resolve literal values', async () => { let input = css` @utility tab-* { @@ -26560,22 +26588,22 @@ describe('custom utilities', () => { expect(await compileCss(input, ['example-1', 'example-0.5', 'example-20%', 'example-2/3'])) .toMatchInlineSnapshot(` - ".example-0\\.5 { - --value-as-number: .5; - } + ".example-0\\.5 { + --value-as-number: .5; + } - .example-1 { - --value-as-number: 1; - } + .example-1 { + --value-as-number: 1; + } - .example-2\\/3 { - --value-as-ratio: 2 / 3; - } + .example-2\\/3 { + --value-as-ratio: 2 / 3; + } - .example-20\\% { - --value-as-percentage: 20%; - }" - `) + .example-20\\% { + --value-as-percentage: 20%; + }" + `) expect( await compileCss(input, [ 'example-1.23', diff --git a/packages/tailwindcss/src/utilities.ts b/packages/tailwindcss/src/utilities.ts index e2f35382284c..a5254865095b 100644 --- a/packages/tailwindcss/src/utilities.ts +++ b/packages/tailwindcss/src/utilities.ts @@ -5692,6 +5692,16 @@ export function createUtilities(theme: Theme) { return utilities } +// Only allowed bare value data types, to prevent creating new syntax that we +// typically don't support right now. E.g.: `--value(color)` would allow you to +// use `text-#0088cc` as a valid utility, which is not what we want. +export const BARE_VALUE_DATA_TYPES = [ + 'number', // 2.5 + 'integer', // 8 + 'ratio', // 2/3 + 'percentage', // 25% +] + export function createCssUtility(node: AtRule) { let name = node.params @@ -5824,7 +5834,6 @@ export function createCssUtility(node: AtRule) { } fn.nodes = ValueParser.parse(args.join(',')) - // Track information for suggestions for (let node of fn.nodes) { // Track literal values if ( @@ -5841,6 +5850,36 @@ export function createCssUtility(node: AtRule) { let value = node.value.replace(/-\*.*$/g, '') as `--${string}` storage[fn.value].themeKeys.add(value) } + + // Validate bare value data types + else if ( + node.kind === 'word' && + !(node.value[0] === '[' && node.value[node.value.length - 1] === ']') && // Ignore arbitrary values + !BARE_VALUE_DATA_TYPES.includes(node.value) + ) { + console.warn( + `Unsupported bare value data type: "${node.value}".\nOnly valid data types are: ${BARE_VALUE_DATA_TYPES.map((x) => `"${x}"`).join(', ')}.\n`, + ) + // TODO: Once we properly track the location of the node, we can + // clean this up in a better way. + let dataType = node.value + let copy = structuredClone(fn) + let sentinelValue = '¶' + ValueParser.walk(copy.nodes, (node, { replaceWith }) => { + if (node.kind === 'word' && node.value === dataType) { + replaceWith({ kind: 'word', value: sentinelValue }) + } + }) + let underline = '^'.repeat(ValueParser.toCss([node]).length) + let offset = ValueParser.toCss([copy]).indexOf(sentinelValue) + let output = [ + '```css', + ValueParser.toCss([fn]), + ' '.repeat(offset) + underline, + '```', + ].join('\n') + console.warn(output) + } } }) @@ -6084,12 +6123,7 @@ function resolveValueFunction( // Limit the bare value types, to prevent new syntax that we // don't want to support. E.g.: `text-#000` is something we // don't want to support, but could be built this way. - if ( - arg.value !== 'number' && - arg.value !== 'integer' && - arg.value !== 'ratio' && - arg.value !== 'percentage' - ) { + if (!BARE_VALUE_DATA_TYPES.includes(arg.value)) { continue } diff --git a/packages/tailwindcss/src/utils/brace-expansion.test.ts b/packages/tailwindcss/src/utils/brace-expansion.test.ts index 8b1932bf1110..bab93ac434a8 100644 --- a/packages/tailwindcss/src/utils/brace-expansion.test.ts +++ b/packages/tailwindcss/src/utils/brace-expansion.test.ts @@ -14,11 +14,10 @@ describe('expand(…)', () => { ['a/{0..5}/b', ['a/0/b', 'a/1/b', 'a/2/b', 'a/3/b', 'a/4/b', 'a/5/b']], ['a/{-5..0}/b', ['a/-5/b', 'a/-4/b', 'a/-3/b', 'a/-2/b', 'a/-1/b', 'a/0/b']], ['a/{0..-5}/b', ['a/0/b', 'a/-1/b', 'a/-2/b', 'a/-3/b', 'a/-4/b', 'a/-5/b']], - [ - 'a/{0..10..5}/b', - ['a/0/b', 'a/5/b', 'a/10/b'], - ['a/{10..0..5}/b', ['a/10/b', 'a/5/b', 'a/0/b']], - ], + ['a/{0..10..5}/b', ['a/0/b', 'a/5/b', 'a/10/b']], + ['a/{0..10..-5}/b', ['a/10/b', 'a/5/b', 'a/0/b']], + ['a/{10..0..5}/b', ['a/10/b', 'a/5/b', 'a/0/b']], + ['a/{10..0..-5}/b', ['a/0/b', 'a/5/b', 'a/10/b']], // Numeric range with padding (we do not support padding) ['a/{00..05}/b', ['a/0/b', 'a/1/b', 'a/2/b', 'a/3/b', 'a/4/b', 'a/5/b']], @@ -64,7 +63,7 @@ describe('expand(…)', () => { // Should not try to expand ranges with decimals ['{1.1..2.2}', ['1.1..2.2']], - ])('should expand %s', (input, expected) => { + ])('should expand %s (%#)', (input, expected) => { expect(expand(input).sort()).toEqual(expected.sort()) }) diff --git a/packages/tailwindcss/src/utils/brace-expansion.ts b/packages/tailwindcss/src/utils/brace-expansion.ts index 052e8848a059..ee382cd82a29 100644 --- a/packages/tailwindcss/src/utils/brace-expansion.ts +++ b/packages/tailwindcss/src/utils/brace-expansion.ts @@ -78,16 +78,13 @@ function expandSequence(seq: string): string[] { if (step === 0) { throw new Error('Step cannot be zero in sequence expansion.') } - if (step > 0) { - for (let i = startNum; i <= endNum; i += step) { - let numStr = i.toString() - result.push(numStr) - } - } else { - for (let i = startNum; i >= endNum; i += step) { - let numStr = i.toString() - result.push(numStr) - } + + let increasing = startNum < endNum + if (increasing && step < 0) step = -step + if (!increasing && step > 0) step = -step + + for (let i = startNum; increasing ? i <= endNum : i >= endNum; i += step) { + result.push(i.toString()) } } return result diff --git a/playgrounds/nextjs/package.json b/playgrounds/nextjs/package.json index e691bc2a5489..1cc2f6097a6d 100644 --- a/playgrounds/nextjs/package.json +++ b/playgrounds/nextjs/package.json @@ -12,14 +12,14 @@ "@tailwindcss/postcss": "workspace:^", "fast-glob": "^3.3.3", "next": "15.2.4", - "react": "^19.0.0", - "react-dom": "^19.0.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", "tailwindcss": "workspace:^" }, "devDependencies": { "@types/node": "catalog:", "@types/react": "^19.0.12", - "@types/react-dom": "^19.0.4", + "@types/react-dom": "^19.1.1", "eslint": "^9.22.0", "eslint-config-next": "^15.2.4", "typescript": "^5.5.4" diff --git a/playgrounds/v3/package.json b/playgrounds/v3/package.json index f6d5c00b167c..5ac785a2b01b 100644 --- a/playgrounds/v3/package.json +++ b/playgrounds/v3/package.json @@ -10,14 +10,14 @@ }, "dependencies": { "next": "15.2.4", - "react": "^19.0.0", - "react-dom": "^19.0.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", "tailwindcss": "^3" }, "devDependencies": { "@types/node": "^20.14.8", "@types/react": "^19.0.12", - "@types/react-dom": "^19.0.4", + "@types/react-dom": "^19.1.1", "autoprefixer": "^10.4.21", "eslint": "^9.22.0", "eslint-config-next": "^15.2.4", diff --git a/playgrounds/vite/package.json b/playgrounds/vite/package.json index 90ea4af0fa12..097b4cc3f864 100644 --- a/playgrounds/vite/package.json +++ b/playgrounds/vite/package.json @@ -11,13 +11,13 @@ "dependencies": { "@tailwindcss/vite": "workspace:^", "@vitejs/plugin-react": "^4.3.4", - "react": "^19.0.0", - "react-dom": "^19.0.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", "tailwindcss": "workspace:^" }, "devDependencies": { "@types/react": "^19.0.12", - "@types/react-dom": "^19.0.4", + "@types/react-dom": "^19.1.1", "bun": "^1.2.8", "vite": "catalog:" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b95015664047..4c72383e5890 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -115,6 +115,9 @@ importers: '@tailwindcss/oxide-linux-x64-musl': specifier: workspace:* version: link:npm/linux-x64-musl + '@tailwindcss/oxide-wasm32-wasi': + specifier: workspace:* + version: link:npm/wasm32-wasi '@tailwindcss/oxide-win32-arm64-msvc': specifier: workspace:* version: link:npm/win32-arm64-msvc @@ -123,8 +126,14 @@ importers: version: link:npm/win32-x64-msvc devDependencies: '@napi-rs/cli': - specifier: ^2.18.4 - version: 2.18.4 + specifier: ^3.0.0-alpha.77 + version: 3.0.0-alpha.77(@emnapi/runtime@1.4.0)(@types/node@20.14.13)(emnapi@1.3.1(node-addon-api@8.3.0)) + '@napi-rs/wasm-runtime': + specifier: ^0.2.8 + version: 0.2.8 + emnapi: + specifier: 1.3.1 + version: 1.3.1(node-addon-api@8.3.0) crates/node/npm/android-arm-eabi: {} @@ -146,6 +155,27 @@ importers: crates/node/npm/linux-x64-musl: {} + crates/node/npm/wasm32-wasi: + dependencies: + '@emnapi/core': + specifier: ^1.4.0 + version: 1.4.0 + '@emnapi/runtime': + specifier: ^1.4.0 + version: 1.4.0 + '@emnapi/wasi-threads': + specifier: ^1.0.1 + version: 1.0.1 + '@napi-rs/wasm-runtime': + specifier: ^0.2.8 + version: 0.2.8 + '@tybys/wasm-util': + specifier: ^0.9.0 + version: 0.9.0 + tslib: + specifier: ^2.8.0 + version: 2.8.0 + crates/node/npm/win32-arm64-msvc: {} crates/node/npm/win32-x64-msvc: {} @@ -424,13 +454,13 @@ importers: version: 3.3.3 next: specifier: 15.2.4 - version: 15.2.4(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 15.2.4(@playwright/test@1.51.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: - specifier: ^19.0.0 - version: 19.0.0 + specifier: ^19.1.0 + version: 19.1.0 react-dom: - specifier: ^19.0.0 - version: 19.0.0(react@19.0.0) + specifier: ^19.1.0 + version: 19.1.0(react@19.1.0) tailwindcss: specifier: workspace:^ version: link:../../packages/tailwindcss @@ -442,8 +472,8 @@ importers: specifier: ^19.0.12 version: 19.0.12 '@types/react-dom': - specifier: ^19.0.4 - version: 19.0.4(@types/react@19.0.12) + specifier: ^19.1.1 + version: 19.1.1(@types/react@19.0.12) eslint: specifier: ^9.22.0 version: 9.22.0(jiti@2.4.2) @@ -458,13 +488,13 @@ importers: dependencies: next: specifier: 15.2.4 - version: 15.2.4(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 15.2.4(@playwright/test@1.51.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: - specifier: ^19.0.0 - version: 19.0.0 + specifier: ^19.1.0 + version: 19.1.0 react-dom: - specifier: ^19.0.0 - version: 19.0.0(react@19.0.0) + specifier: ^19.1.0 + version: 19.1.0(react@19.1.0) tailwindcss: specifier: ^3 version: 3.4.14 @@ -476,8 +506,8 @@ importers: specifier: ^19.0.12 version: 19.0.12 '@types/react-dom': - specifier: ^19.0.4 - version: 19.0.4(@types/react@19.0.12) + specifier: ^19.1.1 + version: 19.1.1(@types/react@19.0.12) autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.4.47) @@ -500,11 +530,11 @@ importers: specifier: ^4.3.4 version: 4.3.4(vite@6.0.0(@types/node@20.14.13)(jiti@2.4.2)(lightningcss@1.29.2(patch_hash=tzyxy3asfxcqc7ihrooumyi5fm))(terser@5.31.6)(tsx@4.19.1)(yaml@2.6.0)) react: - specifier: ^19.0.0 - version: 19.0.0 + specifier: ^19.1.0 + version: 19.1.0 react-dom: - specifier: ^19.0.0 - version: 19.0.0(react@19.0.0) + specifier: ^19.1.0 + version: 19.1.0(react@19.1.0) tailwindcss: specifier: workspace:^ version: link:../../packages/tailwindcss @@ -513,8 +543,8 @@ importers: specifier: ^19.0.12 version: 19.0.12 '@types/react-dom': - specifier: ^19.0.4 - version: 19.0.4(@types/react@19.0.12) + specifier: ^19.1.1 + version: 19.1.1(@types/react@19.0.12) bun: specifier: ^1.2.8 version: 1.2.8 @@ -611,8 +641,14 @@ packages: resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} - '@emnapi/runtime@1.3.1': - resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emnapi/core@1.4.0': + resolution: {integrity: sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==} + + '@emnapi/runtime@1.4.0': + resolution: {integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==} + + '@emnapi/wasi-threads@1.0.1': + resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} @@ -1353,6 +1389,127 @@ packages: cpu: [x64] os: [win32] + '@inquirer/checkbox@4.1.5': + resolution: {integrity: sha512-swPczVU+at65xa5uPfNP9u3qx/alNwiaykiI/ExpsmMSQW55trmZcwhYWzw/7fj+n6Q8z1eENvR7vFfq9oPSAQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@5.1.9': + resolution: {integrity: sha512-NgQCnHqFTjF7Ys2fsqK2WtnA8X1kHyInyG+nMIuHowVTIgIuS10T4AznI/PvbqSpJqjCUqNBlKGh1v3bwLFL4w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.1.10': + resolution: {integrity: sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@4.2.10': + resolution: {integrity: sha512-5GVWJ+qeI6BzR6TIInLP9SXhWCEcvgFQYmcRG6d6RIlhFjM5TyG18paTGBgRYyEouvCmzeco47x9zX9tQEofkw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.12': + resolution: {integrity: sha512-jV8QoZE1fC0vPe6TnsOfig+qwu7Iza1pkXoUJ3SroRagrt2hxiL+RbM432YAihNR7m7XnU0HWl/WQ35RIGmXHw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.11': + resolution: {integrity: sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==} + engines: {node: '>=18'} + + '@inquirer/input@4.1.9': + resolution: {integrity: sha512-mshNG24Ij5KqsQtOZMgj5TwEjIf+F2HOESk6bjMwGWgcH5UBe8UoljwzNFHqdMbGYbgAf6v2wU/X9CAdKJzgOA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.12': + resolution: {integrity: sha512-7HRFHxbPCA4e4jMxTQglHJwP+v/kpFsCf2szzfBHy98Wlc3L08HL76UDiA87TOdX5fwj2HMOLWqRWv9Pnn+Z5Q==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.12': + resolution: {integrity: sha512-FlOB0zvuELPEbnBYiPaOdJIaDzb2PmJ7ghi/SVwIHDDSQ2K4opGBkF+5kXOg6ucrtSUQdLhVVY5tycH0j0l+0g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.4.1': + resolution: {integrity: sha512-UlmM5FVOZF0gpoe1PT/jN4vk8JmpIWBlMvTL8M+hlvPmzN89K6z03+IFmyeu/oFCenwdwHDr2gky7nIGSEVvlA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@4.0.12': + resolution: {integrity: sha512-wNPJZy8Oc7RyGISPxp9/MpTOqX8lr0r+lCCWm7hQra+MDtYRgINv1hxw7R+vKP71Bu/3LszabxOodfV/uTfsaA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@3.0.12': + resolution: {integrity: sha512-H/kDJA3kNlnNIjB8YsaXoQI0Qccgf0Na14K1h8ExWhNmUg2E941dyFPrZeugihEa9AZNW5NdsD/NcvUME83OPQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@4.1.1': + resolution: {integrity: sha512-IUXzzTKVdiVNMA+2yUvPxWsSgOG4kfX93jOM4Zb5FgujeInotv5SPIJVeXQ+fO4xu7tW8VowFhdG5JRmmCyQ1Q==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@3.0.6': + resolution: {integrity: sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1378,10 +1535,329 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@napi-rs/cli@2.18.4': - resolution: {integrity: sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg==} - engines: {node: '>= 10'} + '@napi-rs/cli@3.0.0-alpha.77': + resolution: {integrity: sha512-aIZCn/S7/fKyE5v18Ud0HR1RsN/I4LKscrSCW+ExD12yVKF0TAdyX2fVvNEWRU8nKz2GdlyNFVskJM6xtnmIAg==} + engines: {node: '>= 16'} hasBin: true + peerDependencies: + '@emnapi/runtime': ^1.1.0 + emnapi: ^1.1.0 + peerDependenciesMeta: + '@emnapi/runtime': + optional: true + emnapi: + optional: true + + '@napi-rs/cross-toolchain@0.0.19': + resolution: {integrity: sha512-StHXqYANdTaMFqJJ3JXHqKQMylOzOJPcrOCd9Nt2NIGfvfaXK3SzpmNfkJimkOAYfTsfpfuRERsML0bUZCpHBQ==} + peerDependencies: + '@napi-rs/cross-toolchain-arm64-target-aarch64': ^0.0.19 + '@napi-rs/cross-toolchain-arm64-target-armv7': ^0.0.19 + '@napi-rs/cross-toolchain-arm64-target-x86_64': ^0.0.19 + '@napi-rs/cross-toolchain-x64-target-aarch64': ^0.0.19 + '@napi-rs/cross-toolchain-x64-target-armv7': ^0.0.19 + '@napi-rs/cross-toolchain-x64-target-x86_64': ^0.0.19 + peerDependenciesMeta: + '@napi-rs/cross-toolchain-arm64-target-aarch64': + optional: true + '@napi-rs/cross-toolchain-arm64-target-armv7': + optional: true + '@napi-rs/cross-toolchain-arm64-target-x86_64': + optional: true + '@napi-rs/cross-toolchain-x64-target-aarch64': + optional: true + '@napi-rs/cross-toolchain-x64-target-armv7': + optional: true + '@napi-rs/cross-toolchain-x64-target-x86_64': + optional: true + + '@napi-rs/lzma-android-arm-eabi@1.4.1': + resolution: {integrity: sha512-yenreSpZ9IrqppJOiWDqWMmja7XtSgio9LhtxYwgdILmy/OJTe/mlTYv+FhJBf7hIV9Razu5eBuEa3zKri81IA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/lzma-android-arm64@1.4.1': + resolution: {integrity: sha512-piutVBz5B1TNxXeEjub0n/IKI6dMaXPPRbVSXuc4gnZgzcihNDUh68vcLZgYd+IMiACZvBxvx2O3t5nthtph3A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/lzma-darwin-arm64@1.4.1': + resolution: {integrity: sha512-sDfOhQQFqV8lGbpgJN9DqNLBPR7QOfYjcWUv8FOGPaVP1LPJDnrc5uCpRWWEa2zIKmTiO8P9xzIl0TDzrYmghg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/lzma-darwin-x64@1.4.1': + resolution: {integrity: sha512-S5/RbC6EP4QkYy2xhxbfm48ZD9FkysfpWY4Slve0nj5RGGsHvcJBg2Pi69jrTPB/zLKz2SUa0i+RfUt9zvZNaw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/lzma-freebsd-x64@1.4.1': + resolution: {integrity: sha512-4AFnq6aZnclwameSBkDWu5Ftb8y4GwvVXeQXJKbN7hf7O5GG/8QpQB1R1NJw2QORUhpKwjAQUpbkTyhL2GFWWw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/lzma-linux-arm-gnueabihf@1.4.1': + resolution: {integrity: sha512-j5rL1YRIm6rWmmGAvN6DPX6QuRjvFGB93xJ7DTRB47GXW4zHekXae6ivowjJ95vT4Iz4hSWkZbuwAy95eFrWRA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/lzma-linux-arm64-gnu@1.4.1': + resolution: {integrity: sha512-1XdFGKyTS9m+VrRQYs9uz+ToHf4Jwm0ejHU48k9lT9MPl8jSqzKdVtFzZBPzronHteSynBfKmUq0+HeWmjrsOQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/lzma-linux-arm64-musl@1.4.1': + resolution: {integrity: sha512-9d09tYS0/rBwIk1QTcO2hMZEB/ZpsG2+uFW5am1RHElSWMclObirB1An7b6AMDJcRvcomkOg2GZ9COzrvHKwEA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/lzma-linux-ppc64-gnu@1.4.1': + resolution: {integrity: sha512-UzEkmsgoJ3IOGIRb6kBzNiw+ThUpiighop7dVYfSqlF5juGzwf7YewC57RGn4FoJCvadOCrSm5VikAcgrwVgAw==} + engines: {node: '>= 10'} + cpu: [ppc64] + os: [linux] + + '@napi-rs/lzma-linux-riscv64-gnu@1.4.1': + resolution: {integrity: sha512-9dUKlZ1PdwxTaFF+j3oc+xjlk9nqFwo1NWWOH30uwjl4Rm5Gkv+Fx0pHrzu4kR/iVA+oyQqa9/2uDYnGSTijBA==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/lzma-linux-s390x-gnu@1.4.1': + resolution: {integrity: sha512-MOVXUWJSLLCJDCCAlGa39sh7nv9XjvXzCf7QJus7rD8Ciz0mpXNXF9mg0ji7/MZ7pZlKPlXjXDnpVCfFdSEaFQ==} + engines: {node: '>= 10'} + cpu: [s390x] + os: [linux] + + '@napi-rs/lzma-linux-x64-gnu@1.4.1': + resolution: {integrity: sha512-Sxu7aJxU1sDbUTqjqLVDV3DCOAlbsFKvmuCN/S5uXBJd1IF2wJ9jK3NbFzfqTAo5Hudx8Y7kOb6+3K+fYPI1KQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/lzma-linux-x64-musl@1.4.1': + resolution: {integrity: sha512-4I3BeKBQJSE5gF2/VTEv7wCLLjhapeutbCGpZPmDiLHZ74rm9edmNXAlKpdjADQ4YDLJ2GIBzttvwLXkJ9U+cw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/lzma-wasm32-wasi@1.4.1': + resolution: {integrity: sha512-s32HdKqQWbohf6DGWpG9YMODaBdbKJ++JpNr6Ii7821sKf4h/o+p8IRFTOaWdmdJdllEWlRirnd5crA29VivJQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@napi-rs/lzma-win32-arm64-msvc@1.4.1': + resolution: {integrity: sha512-ISz+v7ML5mKnjEZ7Kk4Z1BIn411r/fz3tDy9j5yDnwQI0MgTsUQFrIQElGUpULWYs2aYc6EZ9PhECbLBfSjh7A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/lzma-win32-ia32-msvc@1.4.1': + resolution: {integrity: sha512-3WKuCpZBrd7Jrw+h1jSu5XAsRWepMJu0sYuRoA4Y4Cwfu9gI7p5Z5Bc510nfjg7M7xvdpkI4UoW2WY7kBFRYrQ==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/lzma-win32-x64-msvc@1.4.1': + resolution: {integrity: sha512-0ixRo5z1zFXdh62hlrTV+QCTKHK0te5NHKaExOluhtcc6AdpMmpslvM9JhUxNHI+zM46w/DmmcvcOtqsaTmHgg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/lzma@1.4.1': + resolution: {integrity: sha512-5f8K9NHjwHjZKGm3SS+7CFxXQhz8rbg2umBm/9g0xQRXBdYEI31N5z1ACuk9bmBQOusXAq9CArGfs/ZQso2rUA==} + engines: {node: '>= 10'} + + '@napi-rs/tar-android-arm-eabi@0.1.4': + resolution: {integrity: sha512-LMSysWp5AmZj1NOCB2jshc9KCvp4gm7vm0Cra5U2crMvlj/fwGrvv6+EzSw49y8wCkNEcQ8QaGq5NBQKiLogSg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/tar-android-arm64@0.1.4': + resolution: {integrity: sha512-A/2rl8xr7F5yOtHVARROoSwjRRDNL1RlXCsg/K+RE5/V9iPBojsJsLpFPilp7InF6bi+z7aYn+yWCD6wSwfF4A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/tar-darwin-arm64@0.1.4': + resolution: {integrity: sha512-mnGBswBRtxDqUwXUZx+f9Uuy2uPssxuvcWFTYgUSZqlS2pg/XIWZdHZhbqWqKGpjpZrYcr+42roytbWlZ+epMA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/tar-darwin-x64@0.1.4': + resolution: {integrity: sha512-I81Fvl/cfnFVBET49xywNd57dXLJPO7jqrjD9Z2bKeXA0v0Zt1cwV1IOOTihFZXJv7kgu6EfNB7oumoLOTqq5A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/tar-freebsd-x64@0.1.4': + resolution: {integrity: sha512-p5OFr3MqidZHkt9bHV2FgeS6k06g+s0GR2kvj/wm2mIxr7u3/sj3+RTr7GHz5DQq08T7uH85HhsrGYWN3vxmSg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/tar-linux-arm-gnueabihf@0.1.4': + resolution: {integrity: sha512-POp2zb/Yuw6taEmrTlEoQI5S+2HmgfV1VtqGQZgRmCa85NlWLDsR6vbW9euu/6NbLj3ld15cCeJC2oJkv9k/xg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/tar-linux-arm64-gnu@0.1.4': + resolution: {integrity: sha512-TV+2AppSgJx5U9nk1C9bh1afWcBVnnANJ4SmtqUF6ediHcDS2rLebeI8BGljfnX9F149qbT9gOGN+R8tofpCsg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/tar-linux-arm64-musl@0.1.4': + resolution: {integrity: sha512-UFBvKpYmuQRbgmXuSSPb8mRjq4JRZLYJhqwrWWnlfQP13xK2WB7mL2GhewBgynSH4YKDm6biKhK6U5RrSWEDgw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/tar-linux-ppc64-gnu@0.1.4': + resolution: {integrity: sha512-HT+h6Wv51SKXqks8UBF+KVuNJ09fM1GyO+SvCnDB5MF66tGiI2C6/MSX69zf1ZeqjACds1K/UwKiZCmE76/j9A==} + engines: {node: '>= 10'} + cpu: [ppc64] + os: [linux] + + '@napi-rs/tar-linux-s390x-gnu@0.1.4': + resolution: {integrity: sha512-SJ+HSr281Y6cgJrQ4nkYbXaTHAmTLv/FZm5k9ZRA6Khml//ZoWi7CiT8dnPeD4QxYwCzAFA4aYMUOQJM/mk2/w==} + engines: {node: '>= 10'} + cpu: [s390x] + os: [linux] + + '@napi-rs/tar-linux-x64-gnu@0.1.4': + resolution: {integrity: sha512-LrF0lRFiFOkO40jfgTdF8dRTvYOLV52fdZ/YnJuBodNcxqEl9rChO3v5Uag//sy0me85FjqtobQNRQP8Nd80dA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/tar-linux-x64-musl@0.1.4': + resolution: {integrity: sha512-etGUWbs+Tk1PtzgyWrVzXa2fQrHNKSc/whHm+4x1Num8Oz+wGdjCDTUktYxAVy33PKZhdblVxxE83QXxkgjneQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/tar-wasm32-wasi@0.1.4': + resolution: {integrity: sha512-mANkm93AKy+OspkOBAC5WI64SopXT0VawdTjpeGW1OgyUSJWdUB5rhs3I7B/HW1bi5tsUoZOZQe3rVgYdfzA6g==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@napi-rs/tar-win32-arm64-msvc@0.1.4': + resolution: {integrity: sha512-/5/gp6WR9b36CysJDe8AdyjNeje+NqCniYJz/AZc+UvpKwG8MG9nS6TMpJ9IgrQacJXvc4lWXxYyn6uuPQVvaQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/tar-win32-ia32-msvc@0.1.4': + resolution: {integrity: sha512-HnQi0op9BqJqPekKXhEAI1TWkLtavxKDBDGXNhUSm2//jriMeRykahUcKoUUxr1UGrmtxpc5dx0cThBt13paEw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/tar-win32-x64-msvc@0.1.4': + resolution: {integrity: sha512-vy2ebEXerblni6XOgi3a27+CnI6PdQ9Phy/ru5HM4bVd/oulAJohmynAmBAB1AmXg1NLbAEWu43nATEDp5O2hA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/tar@0.1.4': + resolution: {integrity: sha512-hDsvmMZY8tl2CcLfjnTeE1o5W1eGTSL+ZIX8YEybtcJwA+Cc8SNHb7l6JqMnGcjOrWBZbHt8tzTN+W7qHS5Wmg==} + engines: {node: '>= 10'} + + '@napi-rs/wasm-runtime@0.2.8': + resolution: {integrity: sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==} + + '@napi-rs/wasm-tools-android-arm-eabi@0.0.3': + resolution: {integrity: sha512-T2tme8w5jZ/ZCjJurqNtKCxYtGoDjW9v2rn1bfI60ewCfkYXNpxrTURdkOib85sz+BcwmOfXn0enbg5W9KohoQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/wasm-tools-android-arm64@0.0.3': + resolution: {integrity: sha512-siHTjrxxBrvsVty5X2jI5waAyzJpr756GqGVUqxqS2eoTuqYRfgaFNvX8asp9LAagFtOojfD0fZfuvxK7dc4Rw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/wasm-tools-darwin-arm64@0.0.3': + resolution: {integrity: sha512-0MqsSOYJ4jXcLv/nAInS8nwU+/hL0rSEJo7JXKj3dhkT9UNSj4zfidcOaIb05O9VskJBPmV040+edtWPHXNt2Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/wasm-tools-darwin-x64@0.0.3': + resolution: {integrity: sha512-yXAK2mrlBMZZYK/59JRHZu/c683HFpr5ork1cn++fy8gqUBRLbjuq47VDjA7oyLW5SmWqNDhmhjFTDGvfIvcUg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/wasm-tools-freebsd-x64@0.0.3': + resolution: {integrity: sha512-K1rne814utBd9Zo9LCggQ5h0TSnzGPzA+sG78Qr7KfFz8XQxEGDRH5wpzXyF1KaKav2RmO6wGMXlasDgIcq7GA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/wasm-tools-linux-arm64-gnu@0.0.3': + resolution: {integrity: sha512-Yu3gtpvGc2+hcay3SU5MK7EMrGPBq/V4i8mpw/MEYUCzOb7Vd9aL8CryElzlk0SIbktG08VYMdhFFFoJAjlYtg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/wasm-tools-linux-arm64-musl@0.0.3': + resolution: {integrity: sha512-XN+sPgEwFw3P47wDvtcQyOoZNghIL8gaiRjEGzprB+kE9N21GkuMbk3kdjiBBJkjqKF25f4fbOvNAY0jQEAO3A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/wasm-tools-linux-x64-gnu@0.0.3': + resolution: {integrity: sha512-mfMvMEqn33YtEjIyLPguZ6yDsNtF5zV7mqc99620YDyj2SLa0aI35TNTc7Dm+/hlgqHRKhdudsWGfYc4dBND2Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/wasm-tools-linux-x64-musl@0.0.3': + resolution: {integrity: sha512-KXMsXWGELoN5xgPCoRHbgt5TScSx8BK2GcCHKJ9OPZ2HMfsXbLgS/SNi6vz1CbLMZMLPBY2G6HAk0gzLGyS0mQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/wasm-tools-wasm32-wasi@0.0.3': + resolution: {integrity: sha512-v3iMHnAfMteogpbqHTFeLXPeAzL5AhpDJLvZvLXbuRiMsMRL0dn8CbcEnYja2P/Ui6Xlyky6PcaUsepOUTNb7A==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@napi-rs/wasm-tools-win32-arm64-msvc@0.0.3': + resolution: {integrity: sha512-HWrg9cW+u+rQKL9XCQILaGGs6mDYdwX9nwcTIvJAjrpGWu8Dp4wz6i66w6YKHqVng1suGYjjr+LH4/1e0tDaAg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/wasm-tools-win32-ia32-msvc@0.0.3': + resolution: {integrity: sha512-h99hAWvQKhcloyPfPi0IjrvKRToTE9Z4UVXoXZhcjpCGmr3o1qW+1FAupRy/TcVdMjUJNLE/aenml3UPqzQEQw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/wasm-tools-win32-x64-msvc@0.0.3': + resolution: {integrity: sha512-7/6IpzMi9VGYxLcc9SJyu9ZIdbDwyyb09glVF/2SFEgke9F5H46XzRrAdSoRnjfcq/tdLyHKJbnpCIB257qVYg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/wasm-tools@0.0.3': + resolution: {integrity: sha512-p7NT5wnOIwmP0f3KbXlMabeld5dPFsADpHMWJaBodTSmnPE8P4msguxKJLKWquqAS1FY2dsjBZ62K0/hfiqAUg==} + engines: {node: '>= 10'} '@next/env@15.2.4': resolution: {integrity: sha512-+SFtMgoiYP3WoSswuNmxJOCwi06TdWE733D+WPjpXIe4LXGULwEaofiiAy6kbS0+XjM5xF5n3lKuBwN2SnqD9g==} @@ -1453,6 +1929,58 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@octokit/auth-token@5.1.2': + resolution: {integrity: sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==} + engines: {node: '>= 18'} + + '@octokit/core@6.1.4': + resolution: {integrity: sha512-lAS9k7d6I0MPN+gb9bKDt7X8SdxknYqAMh44S5L+lNqIN2NuV8nvv3g8rPp7MuRxcOpxpUIATWprO0C34a8Qmg==} + engines: {node: '>= 18'} + + '@octokit/endpoint@10.1.3': + resolution: {integrity: sha512-nBRBMpKPhQUxCsQQeW+rCJ/OPSMcj3g0nfHn01zGYZXuNDvvXudF/TYY6APj5THlurerpFN4a/dQAIAaM6BYhA==} + engines: {node: '>= 18'} + + '@octokit/graphql@8.2.1': + resolution: {integrity: sha512-n57hXtOoHrhwTWdvhVkdJHdhTv0JstjDbDRhJfwIRNfFqmSo1DaK/mD2syoNUoLCyqSjBpGAKOG0BuwF392slw==} + engines: {node: '>= 18'} + + '@octokit/openapi-types@24.2.0': + resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==} + + '@octokit/plugin-paginate-rest@11.6.0': + resolution: {integrity: sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-request-log@5.3.1': + resolution: {integrity: sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-rest-endpoint-methods@13.5.0': + resolution: {integrity: sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/request-error@6.1.7': + resolution: {integrity: sha512-69NIppAwaauwZv6aOzb+VVLwt+0havz9GT5YplkeJv7fG7a40qpLt/yZKyiDxAhgz0EtgNdNcb96Z0u+Zyuy2g==} + engines: {node: '>= 18'} + + '@octokit/request@9.2.2': + resolution: {integrity: sha512-dZl0ZHx6gOQGcffgm1/Sf6JfEpmh34v3Af2Uci02vzUYz6qEN6zepoRtmybWXIGXFIK8K9ylE3b+duCWqhArtg==} + engines: {node: '>= 18'} + + '@octokit/rest@21.1.1': + resolution: {integrity: sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==} + engines: {node: '>= 18'} + + '@octokit/types@13.10.0': + resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} + '@oven/bun-darwin-aarch64@1.2.8': resolution: {integrity: sha512-O97RiReqBVzno5qLgoFX/dYI+xO+jSTIw0S+Cp1MRedXMZEqEgi8ql3ExWpteZyvUGBiXdvc0sQSOQwPoEwiPA==} cpu: [arm64] @@ -1813,6 +2341,9 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1846,8 +2377,8 @@ packages: '@types/postcss-import@14.0.3': resolution: {integrity: sha512-raZhRVTf6Vw5+QbmQ7LOHSDML71A5rj4+EqDzAbrZPfxfoGzFxMHRCq16VlddGIZpHELw0BG4G0YE2ANkdZiIQ==} - '@types/react-dom@19.0.4': - resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} + '@types/react-dom@19.1.1': + resolution: {integrity: sha512-jFf/woGTVTjUJsl2O7hcopJ1r0upqoq/vIOoCj0yLh3RIXxWcljlpuZ+vEBRXsymD1jhfeJrlyTy/S1UW+4y1w==} peerDependencies: '@types/react': ^19.0.0 @@ -1951,6 +2482,10 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2045,6 +2580,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + before-after-hook@3.0.2: + resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -2118,6 +2656,9 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -2133,9 +2674,18 @@ packages: citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + clipanion@4.0.0-rc.4: + resolution: {integrity: sha512-CXkMQxU6s9GklO/1f714dkKBMu1lopS1WFF0B8o4AxPykR1hpozxSiUZ5ZUeBjfPgCWqbcNOtZVFhB8Lkfp1+Q==} + peerDependencies: + typanion: '*' + clipboardy@4.0.0: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} @@ -2154,6 +2704,9 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -2297,6 +2850,14 @@ packages: electron-to-chromium@1.5.45: resolution: {integrity: sha512-vOzZS6uZwhhbkZbcRyiy99Wg+pYFV5hk+5YaECvx0+Z31NR3Tt5zS6dze2OepT6PCTzVzT0dIJItti+uAW5zmw==} + emnapi@1.3.1: + resolution: {integrity: sha512-8rnw2VLJmHAXBSyhtrL9O5aW1VdbXA1ovRslp0IyTwnM62Fz83jQIo+VaIObgzdo6r1A98J9AHEq4KTqIR67Aw==} + peerDependencies: + node-addon-api: '>= 6.1.0' + peerDependenciesMeta: + node-addon-api: + optional: true + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2489,6 +3050,13 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-content-type-parse@2.0.1: + resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2669,6 +3237,10 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2989,6 +3561,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} @@ -3070,6 +3645,10 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -3195,6 +3774,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -3403,10 +3986,10 @@ packages: radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} - react-dom@19.0.0: - resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} peerDependencies: - react: ^19.0.0 + react: ^19.1.0 react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -3415,8 +3998,8 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} read-cache@1.0.0: @@ -3477,8 +4060,11 @@ packages: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} - scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -3489,6 +4075,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -3682,10 +4273,17 @@ packages: resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} engines: {node: '>=14.0.0'} + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -3785,10 +4383,17 @@ packages: resolution: {integrity: sha512-N9FDOVaY3yz0YCOhYIgOGYad7+m2ptvinXygw27WPLQvcZDl3+0Sa77KGVlLSiuPDChOUEnTKE9VJwLSi9BPGQ==} hasBin: true + typanion@3.14.0: + resolution: {integrity: sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + type-fest@4.36.0: resolution: {integrity: sha512-3T/PUdKTCnkUmhQU6FFJEHsLwadsRegktX3TNHk+2JJB9HlA8gp1/VXblXVDI93kSnXF2rdPx0GMbHtJIV2LPg==} engines: {node: '>=16'} @@ -3835,6 +4440,9 @@ packages: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} + universal-user-agent@7.0.2: + resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} + untun@0.1.3: resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} hasBin: true @@ -3955,6 +4563,9 @@ packages: jsdom: optional: true + wasm-sjlj@1.0.6: + resolution: {integrity: sha512-pjaKtLJejlWm6+okPV2X1A6nIsRDD4qeK97eCh8DP8KXi3Nzn/HY01vpHhZHlhDri12eZqipjm8HhdTVw+ATxw==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} @@ -3990,6 +4601,10 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -4010,6 +4625,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + snapshots: '@alloc/quick-lru@5.2.0': {} @@ -4129,10 +4748,18 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@emnapi/runtime@1.3.1': + '@emnapi/core@1.4.0': + dependencies: + '@emnapi/wasi-threads': 1.0.1 + tslib: 2.8.0 + + '@emnapi/runtime@1.4.0': + dependencies: + tslib: 2.8.0 + + '@emnapi/wasi-threads@1.0.1': dependencies: tslib: 2.8.0 - optional: true '@esbuild/aix-ppc64@0.21.5': optional: true @@ -4545,7 +5172,7 @@ snapshots: '@img/sharp-wasm32@0.33.5': dependencies: - '@emnapi/runtime': 1.3.1 + '@emnapi/runtime': 1.4.0 optional: true '@img/sharp-win32-ia32@0.33.5': @@ -4554,6 +5181,122 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true + '@inquirer/checkbox@4.1.5(@types/node@20.14.13)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@20.14.13) + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@20.14.13) + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 20.14.13 + + '@inquirer/confirm@5.1.9(@types/node@20.14.13)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@20.14.13) + '@inquirer/type': 3.0.6(@types/node@20.14.13) + optionalDependencies: + '@types/node': 20.14.13 + + '@inquirer/core@10.1.10(@types/node@20.14.13)': + dependencies: + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@20.14.13) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 20.14.13 + + '@inquirer/editor@4.2.10(@types/node@20.14.13)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@20.14.13) + '@inquirer/type': 3.0.6(@types/node@20.14.13) + external-editor: 3.1.0 + optionalDependencies: + '@types/node': 20.14.13 + + '@inquirer/expand@4.0.12(@types/node@20.14.13)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@20.14.13) + '@inquirer/type': 3.0.6(@types/node@20.14.13) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 20.14.13 + + '@inquirer/figures@1.0.11': {} + + '@inquirer/input@4.1.9(@types/node@20.14.13)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@20.14.13) + '@inquirer/type': 3.0.6(@types/node@20.14.13) + optionalDependencies: + '@types/node': 20.14.13 + + '@inquirer/number@3.0.12(@types/node@20.14.13)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@20.14.13) + '@inquirer/type': 3.0.6(@types/node@20.14.13) + optionalDependencies: + '@types/node': 20.14.13 + + '@inquirer/password@4.0.12(@types/node@20.14.13)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@20.14.13) + '@inquirer/type': 3.0.6(@types/node@20.14.13) + ansi-escapes: 4.3.2 + optionalDependencies: + '@types/node': 20.14.13 + + '@inquirer/prompts@7.4.1(@types/node@20.14.13)': + dependencies: + '@inquirer/checkbox': 4.1.5(@types/node@20.14.13) + '@inquirer/confirm': 5.1.9(@types/node@20.14.13) + '@inquirer/editor': 4.2.10(@types/node@20.14.13) + '@inquirer/expand': 4.0.12(@types/node@20.14.13) + '@inquirer/input': 4.1.9(@types/node@20.14.13) + '@inquirer/number': 3.0.12(@types/node@20.14.13) + '@inquirer/password': 4.0.12(@types/node@20.14.13) + '@inquirer/rawlist': 4.0.12(@types/node@20.14.13) + '@inquirer/search': 3.0.12(@types/node@20.14.13) + '@inquirer/select': 4.1.1(@types/node@20.14.13) + optionalDependencies: + '@types/node': 20.14.13 + + '@inquirer/rawlist@4.0.12(@types/node@20.14.13)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@20.14.13) + '@inquirer/type': 3.0.6(@types/node@20.14.13) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 20.14.13 + + '@inquirer/search@3.0.12(@types/node@20.14.13)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@20.14.13) + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@20.14.13) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 20.14.13 + + '@inquirer/select@4.1.1(@types/node@20.14.13)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@20.14.13) + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@20.14.13) + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 20.14.13 + + '@inquirer/type@3.0.6(@types/node@20.14.13)': + optionalDependencies: + '@types/node': 20.14.13 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -4586,7 +5329,246 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@napi-rs/cli@2.18.4': {} + '@napi-rs/cli@3.0.0-alpha.77(@emnapi/runtime@1.4.0)(@types/node@20.14.13)(emnapi@1.3.1(node-addon-api@8.3.0))': + dependencies: + '@inquirer/prompts': 7.4.1(@types/node@20.14.13) + '@napi-rs/cross-toolchain': 0.0.19 + '@napi-rs/wasm-tools': 0.0.3 + '@octokit/rest': 21.1.1 + clipanion: 4.0.0-rc.4(typanion@3.14.0) + colorette: 2.0.20 + debug: 4.4.0 + js-yaml: 4.1.0 + lodash-es: 4.17.21 + semver: 7.7.1 + toml: 3.0.0 + typanion: 3.14.0 + wasm-sjlj: 1.0.6 + optionalDependencies: + '@emnapi/runtime': 1.4.0 + emnapi: 1.3.1(node-addon-api@8.3.0) + transitivePeerDependencies: + - '@napi-rs/cross-toolchain-arm64-target-aarch64' + - '@napi-rs/cross-toolchain-arm64-target-armv7' + - '@napi-rs/cross-toolchain-arm64-target-x86_64' + - '@napi-rs/cross-toolchain-x64-target-aarch64' + - '@napi-rs/cross-toolchain-x64-target-armv7' + - '@napi-rs/cross-toolchain-x64-target-x86_64' + - '@types/node' + - supports-color + + '@napi-rs/cross-toolchain@0.0.19': + dependencies: + '@napi-rs/lzma': 1.4.1 + '@napi-rs/tar': 0.1.4 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + '@napi-rs/lzma-android-arm-eabi@1.4.1': + optional: true + + '@napi-rs/lzma-android-arm64@1.4.1': + optional: true + + '@napi-rs/lzma-darwin-arm64@1.4.1': + optional: true + + '@napi-rs/lzma-darwin-x64@1.4.1': + optional: true + + '@napi-rs/lzma-freebsd-x64@1.4.1': + optional: true + + '@napi-rs/lzma-linux-arm-gnueabihf@1.4.1': + optional: true + + '@napi-rs/lzma-linux-arm64-gnu@1.4.1': + optional: true + + '@napi-rs/lzma-linux-arm64-musl@1.4.1': + optional: true + + '@napi-rs/lzma-linux-ppc64-gnu@1.4.1': + optional: true + + '@napi-rs/lzma-linux-riscv64-gnu@1.4.1': + optional: true + + '@napi-rs/lzma-linux-s390x-gnu@1.4.1': + optional: true + + '@napi-rs/lzma-linux-x64-gnu@1.4.1': + optional: true + + '@napi-rs/lzma-linux-x64-musl@1.4.1': + optional: true + + '@napi-rs/lzma-wasm32-wasi@1.4.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.8 + optional: true + + '@napi-rs/lzma-win32-arm64-msvc@1.4.1': + optional: true + + '@napi-rs/lzma-win32-ia32-msvc@1.4.1': + optional: true + + '@napi-rs/lzma-win32-x64-msvc@1.4.1': + optional: true + + '@napi-rs/lzma@1.4.1': + optionalDependencies: + '@napi-rs/lzma-android-arm-eabi': 1.4.1 + '@napi-rs/lzma-android-arm64': 1.4.1 + '@napi-rs/lzma-darwin-arm64': 1.4.1 + '@napi-rs/lzma-darwin-x64': 1.4.1 + '@napi-rs/lzma-freebsd-x64': 1.4.1 + '@napi-rs/lzma-linux-arm-gnueabihf': 1.4.1 + '@napi-rs/lzma-linux-arm64-gnu': 1.4.1 + '@napi-rs/lzma-linux-arm64-musl': 1.4.1 + '@napi-rs/lzma-linux-ppc64-gnu': 1.4.1 + '@napi-rs/lzma-linux-riscv64-gnu': 1.4.1 + '@napi-rs/lzma-linux-s390x-gnu': 1.4.1 + '@napi-rs/lzma-linux-x64-gnu': 1.4.1 + '@napi-rs/lzma-linux-x64-musl': 1.4.1 + '@napi-rs/lzma-wasm32-wasi': 1.4.1 + '@napi-rs/lzma-win32-arm64-msvc': 1.4.1 + '@napi-rs/lzma-win32-ia32-msvc': 1.4.1 + '@napi-rs/lzma-win32-x64-msvc': 1.4.1 + + '@napi-rs/tar-android-arm-eabi@0.1.4': + optional: true + + '@napi-rs/tar-android-arm64@0.1.4': + optional: true + + '@napi-rs/tar-darwin-arm64@0.1.4': + optional: true + + '@napi-rs/tar-darwin-x64@0.1.4': + optional: true + + '@napi-rs/tar-freebsd-x64@0.1.4': + optional: true + + '@napi-rs/tar-linux-arm-gnueabihf@0.1.4': + optional: true + + '@napi-rs/tar-linux-arm64-gnu@0.1.4': + optional: true + + '@napi-rs/tar-linux-arm64-musl@0.1.4': + optional: true + + '@napi-rs/tar-linux-ppc64-gnu@0.1.4': + optional: true + + '@napi-rs/tar-linux-s390x-gnu@0.1.4': + optional: true + + '@napi-rs/tar-linux-x64-gnu@0.1.4': + optional: true + + '@napi-rs/tar-linux-x64-musl@0.1.4': + optional: true + + '@napi-rs/tar-wasm32-wasi@0.1.4': + dependencies: + '@napi-rs/wasm-runtime': 0.2.8 + optional: true + + '@napi-rs/tar-win32-arm64-msvc@0.1.4': + optional: true + + '@napi-rs/tar-win32-ia32-msvc@0.1.4': + optional: true + + '@napi-rs/tar-win32-x64-msvc@0.1.4': + optional: true + + '@napi-rs/tar@0.1.4': + optionalDependencies: + '@napi-rs/tar-android-arm-eabi': 0.1.4 + '@napi-rs/tar-android-arm64': 0.1.4 + '@napi-rs/tar-darwin-arm64': 0.1.4 + '@napi-rs/tar-darwin-x64': 0.1.4 + '@napi-rs/tar-freebsd-x64': 0.1.4 + '@napi-rs/tar-linux-arm-gnueabihf': 0.1.4 + '@napi-rs/tar-linux-arm64-gnu': 0.1.4 + '@napi-rs/tar-linux-arm64-musl': 0.1.4 + '@napi-rs/tar-linux-ppc64-gnu': 0.1.4 + '@napi-rs/tar-linux-s390x-gnu': 0.1.4 + '@napi-rs/tar-linux-x64-gnu': 0.1.4 + '@napi-rs/tar-linux-x64-musl': 0.1.4 + '@napi-rs/tar-wasm32-wasi': 0.1.4 + '@napi-rs/tar-win32-arm64-msvc': 0.1.4 + '@napi-rs/tar-win32-ia32-msvc': 0.1.4 + '@napi-rs/tar-win32-x64-msvc': 0.1.4 + + '@napi-rs/wasm-runtime@0.2.8': + dependencies: + '@emnapi/core': 1.4.0 + '@emnapi/runtime': 1.4.0 + '@tybys/wasm-util': 0.9.0 + + '@napi-rs/wasm-tools-android-arm-eabi@0.0.3': + optional: true + + '@napi-rs/wasm-tools-android-arm64@0.0.3': + optional: true + + '@napi-rs/wasm-tools-darwin-arm64@0.0.3': + optional: true + + '@napi-rs/wasm-tools-darwin-x64@0.0.3': + optional: true + + '@napi-rs/wasm-tools-freebsd-x64@0.0.3': + optional: true + + '@napi-rs/wasm-tools-linux-arm64-gnu@0.0.3': + optional: true + + '@napi-rs/wasm-tools-linux-arm64-musl@0.0.3': + optional: true + + '@napi-rs/wasm-tools-linux-x64-gnu@0.0.3': + optional: true + + '@napi-rs/wasm-tools-linux-x64-musl@0.0.3': + optional: true + + '@napi-rs/wasm-tools-wasm32-wasi@0.0.3': + dependencies: + '@napi-rs/wasm-runtime': 0.2.8 + optional: true + + '@napi-rs/wasm-tools-win32-arm64-msvc@0.0.3': + optional: true + + '@napi-rs/wasm-tools-win32-ia32-msvc@0.0.3': + optional: true + + '@napi-rs/wasm-tools-win32-x64-msvc@0.0.3': + optional: true + + '@napi-rs/wasm-tools@0.0.3': + optionalDependencies: + '@napi-rs/wasm-tools-android-arm-eabi': 0.0.3 + '@napi-rs/wasm-tools-android-arm64': 0.0.3 + '@napi-rs/wasm-tools-darwin-arm64': 0.0.3 + '@napi-rs/wasm-tools-darwin-x64': 0.0.3 + '@napi-rs/wasm-tools-freebsd-x64': 0.0.3 + '@napi-rs/wasm-tools-linux-arm64-gnu': 0.0.3 + '@napi-rs/wasm-tools-linux-arm64-musl': 0.0.3 + '@napi-rs/wasm-tools-linux-x64-gnu': 0.0.3 + '@napi-rs/wasm-tools-linux-x64-musl': 0.0.3 + '@napi-rs/wasm-tools-wasm32-wasi': 0.0.3 + '@napi-rs/wasm-tools-win32-arm64-msvc': 0.0.3 + '@napi-rs/wasm-tools-win32-ia32-msvc': 0.0.3 + '@napi-rs/wasm-tools-win32-x64-msvc': 0.0.3 '@next/env@15.2.4': {} @@ -4632,6 +5614,68 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@octokit/auth-token@5.1.2': {} + + '@octokit/core@6.1.4': + dependencies: + '@octokit/auth-token': 5.1.2 + '@octokit/graphql': 8.2.1 + '@octokit/request': 9.2.2 + '@octokit/request-error': 6.1.7 + '@octokit/types': 13.10.0 + before-after-hook: 3.0.2 + universal-user-agent: 7.0.2 + + '@octokit/endpoint@10.1.3': + dependencies: + '@octokit/types': 13.10.0 + universal-user-agent: 7.0.2 + + '@octokit/graphql@8.2.1': + dependencies: + '@octokit/request': 9.2.2 + '@octokit/types': 13.10.0 + universal-user-agent: 7.0.2 + + '@octokit/openapi-types@24.2.0': {} + + '@octokit/plugin-paginate-rest@11.6.0(@octokit/core@6.1.4)': + dependencies: + '@octokit/core': 6.1.4 + '@octokit/types': 13.10.0 + + '@octokit/plugin-request-log@5.3.1(@octokit/core@6.1.4)': + dependencies: + '@octokit/core': 6.1.4 + + '@octokit/plugin-rest-endpoint-methods@13.5.0(@octokit/core@6.1.4)': + dependencies: + '@octokit/core': 6.1.4 + '@octokit/types': 13.10.0 + + '@octokit/request-error@6.1.7': + dependencies: + '@octokit/types': 13.10.0 + + '@octokit/request@9.2.2': + dependencies: + '@octokit/endpoint': 10.1.3 + '@octokit/request-error': 6.1.7 + '@octokit/types': 13.10.0 + fast-content-type-parse: 2.0.1 + universal-user-agent: 7.0.2 + + '@octokit/rest@21.1.1': + dependencies: + '@octokit/core': 6.1.4 + '@octokit/plugin-paginate-rest': 11.6.0(@octokit/core@6.1.4) + '@octokit/plugin-request-log': 5.3.1(@octokit/core@6.1.4) + '@octokit/plugin-rest-endpoint-methods': 13.5.0(@octokit/core@6.1.4) + + '@octokit/types@13.10.0': + dependencies: + '@octokit/openapi-types': 24.2.0 + '@oven/bun-darwin-aarch64@1.2.8': optional: true @@ -4876,6 +5920,10 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: link:packages/tailwindcss + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.8.0 + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.26.3 @@ -4917,7 +5965,7 @@ snapshots: dependencies: postcss: 8.4.41 - '@types/react-dom@19.0.4(@types/react@19.0.12)': + '@types/react-dom@19.1.1(@types/react@19.0.12)': dependencies: '@types/react': 19.0.12 @@ -5136,6 +6184,10 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + ansi-regex@5.0.1: {} ansi-regex@6.0.1: {} @@ -5248,6 +6300,8 @@ snapshots: balanced-match@1.0.2: {} + before-after-hook@3.0.2: {} + binary-extensions@2.3.0: {} brace-expansion@1.1.11: @@ -5337,6 +6391,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chardet@0.7.0: {} + check-error@2.1.1: {} chokidar@3.6.0: @@ -5359,8 +6415,14 @@ snapshots: dependencies: consola: 3.2.3 + cli-width@4.1.0: {} + client-only@0.0.1: {} + clipanion@4.0.0-rc.4(typanion@3.14.0): + dependencies: + typanion: 3.14.0 + clipboardy@4.0.0: dependencies: execa: 8.0.1 @@ -5385,6 +6447,8 @@ snapshots: color-string: 1.9.1 optional: true + colorette@2.0.20: {} + commander@2.20.3: optional: true @@ -5492,6 +6556,10 @@ snapshots: electron-to-chromium@1.5.45: {} + emnapi@1.3.1(node-addon-api@8.3.0): + optionalDependencies: + node-addon-api: 8.3.0 + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -6003,6 +7071,14 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + fast-content-type-parse@2.0.1: {} + fast-deep-equal@3.1.3: {} fast-glob@3.3.1: @@ -6188,6 +7264,10 @@ snapshots: human-signals@5.0.0: {} + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + ignore@5.3.2: {} ignore@7.0.3: {} @@ -6467,6 +7547,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash-es@4.17.21: {} + lodash.castarray@4.4.0: {} lodash.isplainobject@4.0.6: {} @@ -6538,6 +7620,8 @@ snapshots: ms@2.1.3: {} + mute-stream@2.0.0: {} + mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -6550,7 +7634,7 @@ snapshots: natural-compare@1.4.0: {} - next@15.2.4(@playwright/test@1.51.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@15.2.4(@playwright/test@1.51.1)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: '@next/env': 15.2.4 '@swc/counter': 0.1.3 @@ -6558,9 +7642,9 @@ snapshots: busboy: 1.6.0 caniuse-lite: 1.0.30001705 postcss: 8.4.31 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - styled-jsx: 5.1.6(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + styled-jsx: 5.1.6(react@19.1.0) optionalDependencies: '@next/swc-darwin-arm64': 15.2.4 '@next/swc-darwin-x64': 15.2.4 @@ -6655,6 +7739,8 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + os-tmpdir@1.0.2: {} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -6838,16 +7924,16 @@ snapshots: radix3@1.1.2: {} - react-dom@19.0.0(react@19.0.0): + react-dom@19.1.0(react@19.1.0): dependencies: - react: 19.0.0 - scheduler: 0.25.0 + react: 19.1.0 + scheduler: 0.26.0 react-is@16.13.1: {} react-refresh@0.14.2: {} - react@19.0.0: {} + react@19.1.0: {} read-cache@1.0.0: dependencies: @@ -6938,12 +8024,16 @@ snapshots: es-errors: 1.3.0 is-regex: 1.1.4 - scheduler@0.25.0: {} + safer-buffer@2.1.2: {} + + scheduler@0.26.0: {} semver@6.3.1: {} semver@7.6.3: {} + semver@7.7.1: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -7105,10 +8195,10 @@ snapshots: strip-json-comments@3.1.1: {} - styled-jsx@5.1.6(react@19.0.0): + styled-jsx@5.1.6(react@19.1.0): dependencies: client-only: 0.0.1 - react: 19.0.0 + react: 19.1.0 sucrase@3.35.0: dependencies: @@ -7190,10 +8280,16 @@ snapshots: tinyspy@3.0.0: {} + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 + toml@3.0.0: {} + tr46@1.0.1: dependencies: punycode: 2.3.1 @@ -7301,10 +8397,14 @@ snapshots: turbo-windows-64: 2.4.4 turbo-windows-arm64: 2.4.4 + typanion@3.14.0: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 + type-fest@0.21.3: {} + type-fest@4.36.0: {} typed-array-buffer@1.0.2: @@ -7358,6 +8458,8 @@ snapshots: unicorn-magic@0.3.0: {} + universal-user-agent@7.0.2: {} + untun@0.1.3: dependencies: citty: 0.1.6 @@ -7460,6 +8562,8 @@ snapshots: - supports-color - terser + wasm-sjlj@1.0.6: {} + webidl-conversions@4.0.2: {} whatwg-url@7.1.0: @@ -7517,6 +8621,12 @@ snapshots: word-wrap@1.2.5: {} + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -7534,3 +8644,5 @@ snapshots: yaml@2.6.0: {} yocto-queue@0.1.0: {} + + yoctocolors-cjs@2.1.2: {} diff --git a/scripts/pack-packages.mjs b/scripts/pack-packages.mjs index 3bcf23bec781..7bec3eda4dd2 100644 --- a/scripts/pack-packages.mjs +++ b/scripts/pack-packages.mjs @@ -24,18 +24,6 @@ for (let path of paths) { workspaces.set(pkg.name, { version: pkg.version ?? '', dir: dirname(path) }) } -// Move napi artifacts into sub packages -const tailwindcssOxideRoot = path.join(root, 'crates', 'node') -for (let file of await fs.readdir(tailwindcssOxideRoot)) { - if (file.startsWith('tailwindcss-oxide.') && file.endsWith('.node')) { - let target = file.split('.')[1] - await fs.cp( - path.join(tailwindcssOxideRoot, file), - path.join(tailwindcssOxideRoot, 'npm', target, file), - ) - } -} - // Clean dist folder await fs.rm(path.join(root, 'dist'), { recursive: true, force: true }) diff --git a/scripts/version-packages.mjs b/scripts/version-packages.mjs index 36f412cc377f..1641d540476f 100644 --- a/scripts/version-packages.mjs +++ b/scripts/version-packages.mjs @@ -28,8 +28,9 @@ const syncedWorkspaces = new Map([ 'crates/node/npm/linux-arm64-musl', 'crates/node/npm/linux-x64-gnu', 'crates/node/npm/linux-x64-musl', - 'crates/node/npm/win32-x64-msvc', + 'crates/node/npm/wasm32-wasi', 'crates/node/npm/win32-arm64-msvc', + 'crates/node/npm/win32-x64-msvc', ], ], ['@tailwindcss/cli', ['packages/@tailwindcss-standalone']],