diff --git a/README.md b/README.md index d895288..115b28b 100644 --- a/README.md +++ b/README.md @@ -89,16 +89,16 @@ You can clone this repo and run the following command to taste the example below - `yarn install` - `node example.mjs` -| Optimization | Raw | Raw Size | Optimized Size | -| ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -------------- | -| `losslessCompressPng()`
**Lossless** | [CC-BY-SA 3.0](https://creativecommons.org/licenses/by/3.0) by [Niabot](https://commons.wikimedia.org/wiki/User:Niabot) | `888K` | `736K` | -| `pngQuantize({ maxQuality: 75 })`
**Lossy** | [CC-BY-SA 3.0](https://creativecommons.org/licenses/by/3.0) by [Niabot](https://commons.wikimedia.org/wiki/User:Niabot) | `888K` | `248K` | -| `compressJpeg()`
**Lossless** | | `192K` | `184K` | -| `compressJpeg(75)`
**Lossy** | | `192K` | `104K` | -| `new Transformer(PNG).webpLossless()`
**Lossless** | [CC-BY-SA 3.0](https://creativecommons.org/licenses/by/3.0) by [Niabot](https://commons.wikimedia.org/wiki/User:Niabot) | `888K` | `588K` | -| `new Transformer(PNG).webp(75)`
**Lossy** | [CC-BY-SA 3.0](https://creativecommons.org/licenses/by/3.0) by [Niabot](https://commons.wikimedia.org/wiki/User:Niabot) | `888K` | `64K` | -| `Transformer(PNG).avif({ quality: 100 })`
**Lossless** | [CC-BY-SA 3.0](https://creativecommons.org/licenses/by/3.0) by [Niabot](https://commons.wikimedia.org/wiki/User:Niabot) | `888K` | `536K` | -| `new Transformer(PNG).avif({ quality: 75, chromaSubsampling: ChromaSubsampling.Yuv420 })`
**Lossy** | [CC-BY-SA 3.0](https://creativecommons.org/licenses/by/3.0) by [Niabot](https://commons.wikimedia.org/wiki/User:Niabot) | `888K` | `64K` | +| Optimization | Raw | Raw Size | Optimized Size | +| ------------------------------------------------------------------------------------------------------- | -------------------------------------------- | -------- | -------------- | +| `losslessCompressPng()`
**Lossless** | | `1.2M` | `876K` | +| `pngQuantize({ maxQuality: 75 })`
**Lossy** | | `1.2M` | `228K` | +| `compressJpeg()`
**Lossless** | | `192K` | `184K` | +| `compressJpeg(75)`
**Lossy** | | `192K` | `104K` | +| `new Transformer(PNG).webpLossless()`
**Lossless** | | `1.2M` | `676K` | +| `new Transformer(PNG).webp(75)`
**Lossy** | | `1.2M` | `84K` | +| `Transformer(PNG).avif({ quality: 100 })`
**Lossless** | | `1.2M` | `584K` | +| `new Transformer(PNG).avif({ quality: 75, chromaSubsampling: ChromaSubsampling.Yuv420 })`
**Lossy** | | `1.2M` | `112K` | ```js import { readFileSync, writeFileSync } from 'fs' diff --git a/package.json b/package.json index 990ab8c..09f8f97 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "website" ], "devDependencies": { - "@napi-rs/cli": "^3.0.0-alpha.38", + "@napi-rs/cli": "^3.0.0-alpha.40", "@taplo/cli": "^0.7.0", "@types/node": "^20.11.16", "@types/sharp": "^0.31.1", diff --git a/packages/binding/Cargo.toml b/packages/binding/Cargo.toml index a2309f4..f51a599 100644 --- a/packages/binding/Cargo.toml +++ b/packages/binding/Cargo.toml @@ -35,6 +35,9 @@ image = { version = "0.24", default-features = false, features = [ "openexr", ] } jpeg-decoder = "0.3" +libavif = { version = "0.13", default-features = false, features = [ + "codec-aom", +] } libc = "0.2" lodepng = "3" napi = { version = "2", default-features = false, features = ["napi3"] } @@ -64,15 +67,5 @@ libwebp-sys = { version = "0.9", default-features = false, features = ["std", "p [target.'cfg(all(target_os = "macos", target_arch = "x86_64"))'.dependencies] libwebp-sys = { version = "0.9", default-features = false, features = ["std", "parallel"] } -[target.'cfg(target_family = "wasm")'.dependencies] -libavif = { git="https://github.com/njaard/libavif-rs.git", rev = "678bd68", version = "0.12", default-features = false, features = [ - "codec-rav1e", -] } - -[target.'cfg(not(target_family = "wasm"))'.dependencies] -libavif = { git="https://github.com/njaard/libavif-rs.git", rev = "678bd68", version = "0.12", default-features = false, features = [ - "codec-aom", -] } - [build-dependencies] napi-build = "2" diff --git a/packages/binding/__test__/optimize.spec.mjs b/packages/binding/__test__/optimize.spec.mjs index 2e2c7fe..1560191 100644 --- a/packages/binding/__test__/optimize.spec.mjs +++ b/packages/binding/__test__/optimize.spec.mjs @@ -8,7 +8,7 @@ import { losslessCompressPng, pngQuantize, compressJpeg, Transformer } from '../ const ROOT_DIR = join(fileURLToPath(import.meta.url), '..', '..', '..', '..') -const PNG = await fs.readFile(join(ROOT_DIR, 'nasa-4928x3279.png')) +const PNG = await fs.readFile(join(ROOT_DIR, 'un-optimized.png')) const JPEG = await fs.readFile(join(ROOT_DIR, 'un-optimized.jpg')) test('should be able to lossless optimize png image', async (t) => { @@ -21,7 +21,11 @@ test('should be able to lossless optimize png image', async (t) => { }) test('should be able to lossy optimize png image', async (t) => { - const dest = await pngQuantize(PNG, { speed: 10 }) + if (process.env.NAPI_RS_FORCE_WASI) { + t.pass() + return + } + const dest = await pngQuantize(PNG, { speed: 5, maxQuality: 1, minQuality: 1 }) t.true(dest.length < PNG.length) }) @@ -49,9 +53,15 @@ test('should be able to lossless encode webp from jpeg', (t) => { }) test('should be able to encode avif from png', (t) => { - t.true(new Transformer(PNG).avifSync().length < PNG.length) + t.true(new Transformer(PNG).avifSync({ + speed: 10, + threads: 4, + }).length < PNG.length) }) test('should be able to encode avif from jpeg', (t) => { - t.true(new Transformer(JPEG).avifSync().length < JPEG.length) + t.true(new Transformer(JPEG).avifSync({ + speed: 10, + threads: 4, + }).length < JPEG.length) }) diff --git a/packages/binding/__test__/transformer.spec.mjs b/packages/binding/__test__/transformer.spec.mjs index f3c64cd..fe2e7a1 100644 --- a/packages/binding/__test__/transformer.spec.mjs +++ b/packages/binding/__test__/transformer.spec.mjs @@ -18,8 +18,8 @@ const SVG = await fs.readFile(join(ROOT_DIR, 'input-debian.svg')) test('should be able to get metadata from png', async (t) => { const decoder = new Transformer(PNG) const metadata = await decoder.metadata() - t.is(metadata.width, 1052) - t.is(metadata.height, 744) + t.is(metadata.width, 1024) + t.is(metadata.height, 681) }) test('should be able to get metadata from jpg', async (t) => { diff --git a/packages/binding/build.rs b/packages/binding/build.rs index 1f866b6..bbfc9e4 100644 --- a/packages/binding/build.rs +++ b/packages/binding/build.rs @@ -1,5 +1,3 @@ -extern crate napi_build; - fn main() { napi_build::setup(); } diff --git a/packages/binding/package.json b/packages/binding/package.json index b1d9c33..fd0b2e8 100644 --- a/packages/binding/package.json +++ b/packages/binding/package.json @@ -64,7 +64,7 @@ }, "repository": "git@github.com:Brooooooklyn/Image.git", "devDependencies": { - "@napi-rs/cli": "^3.0.0-alpha.38", + "@napi-rs/cli": "^3.0.0-alpha.40", "@napi-rs/wasm-runtime": "^0.1.1" } } diff --git a/packages/binding/src/avif.rs b/packages/binding/src/avif.rs index 060402b..7b9bbe4 100644 --- a/packages/binding/src/avif.rs +++ b/packages/binding/src/avif.rs @@ -102,8 +102,8 @@ pub(crate) fn encode_avif_inner( ) -> Result> { let mut encoder = libavif::Encoder::new(); let config: Config = config.unwrap_or_default().into(); - encoder.set_quality((63.0 * (1.0 - config.quality as f32 / 100.0)) as u8); - encoder.set_alpha_quality((63.0 * (1.0 - config.alpha_quality as f32 / 100.0)) as u8); + encoder.set_quality(config.quality); + encoder.set_alpha_quality(config.alpha_quality); encoder.set_speed(config.speed); encoder.set_max_threads(config.threads); let (width, height) = input_image.dimensions(); diff --git a/packages/binding/src/transformer.rs b/packages/binding/src/transformer.rs index 85d8a7c..9d1dfb0 100644 --- a/packages/binding/src/transformer.rs +++ b/packages/binding/src/transformer.rs @@ -565,6 +565,15 @@ impl Task for EncodeTask { color_type, ) }?; + if output_buf.is_null() { + return Err(Error::new( + Status::GenericFailure, + format!( + "Encode lossless webp failed, {}", + dynamic_image.as_bytes().len() + ), + )); + } return Ok(EncodeOutput::Raw(output_buf, size)); } EncodeOptions::Avif(ref options) => { diff --git a/un-optimized.png b/un-optimized.png index 35eeb58..a03aa4a 100644 Binary files a/un-optimized.png and b/un-optimized.png differ diff --git a/website/og-image.js b/website/og-image.js index 841f5c6..99fe3a7 100644 --- a/website/og-image.js +++ b/website/og-image.js @@ -25,138 +25,144 @@ const Title = '@napi-rs/image' ctx.fillText(Title, 80, 100) const Arrow = new Image() -Arrow.src = Buffer.from(` - +Arrow.src = Buffer.from(` + - - Optimized Images - - - - - - - - .png - - - - - - - - - .avif - + + Optimized Images + + + + + - - - - - - - .jpg - + + .png + + + + + + - - - - - - - .webp - + + .avif + + + + + + - - - - - + + .jpg + + + + + + - - Raw Images + + .webp - - - - - - - .jpg - + + + + + + + + + + Raw Images + + + + + - - - - - - - .png - + + .jpg + + + + + + - - - - - - - .tiff - + + .png + + + + + + - - - - - - - .ico - + + .tiff + + + + + + - - - - - - - .pnm - + + .ico + + + + + + - - - - - - - .bmp - + + .pnm + + + + + + - - - - - - - .tga - + + .bmp + + + + + + - - - - - - - .hdr - + + .tga + + + + + + - - - - - - - .dxt - + + .hdr + + + + + + + + .dxt + + `) ctx.drawImage(Arrow, 80, 60) diff --git a/website/package.json b/website/package.json index 6bb8586..b03682e 100644 --- a/website/package.json +++ b/website/package.json @@ -4,8 +4,8 @@ "version": "0.0.0", "type": "module", "dependencies": { - "@napi-rs/canvas": "^0.1.45", - "@napi-rs/image": "^1.7.0", + "@napi-rs/canvas": "^0.1.46", + "@napi-rs/image": "^1.8.0", "chalk": "^5.3.0", "next": "canary", "next-mdx-remote": "^4.4.1", diff --git a/website/pages/index.mdx b/website/pages/index.mdx index f5f9576..6c499ab 100644 --- a/website/pages/index.mdx +++ b/website/pages/index.mdx @@ -94,22 +94,20 @@ You can clone this repo and run the following command to taste the example below - `yarn install` - `node example.mjs` -> The anime girl

+> Shot by NASA

> >
-> [CC-BY-SA 3.0](https://creativecommons.org/licenses/by/3.0) by -> [Niabot](https://commons.wikimedia.org/wiki/User:Niabot){' '} | Optimization |
Raw
|
Optimized
| Raw Size | Optimized Size | | ------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | ------------------------------------------------------------------------- | -------- | -------------- | -| `losslessCompressPng()`
**Lossless** | ![un-optimized.png](../public/img/un-optimized.png) | ![optimized-lossless.png](../public/img/optimized-lossless.png) | `888K` | `736K` | -| `pngQuantize({ maxQuality: 75 })`
**Lossy** | ![un-optimized.png](../public/img/un-optimized.png) | ![optimized-lossy.png](../public/img/optimized-lossy.png) | `888K` | `248K` | +| `losslessCompressPng()`
**Lossless** | ![un-optimized.png](../public/img/un-optimized.png) | ![optimized-lossless.png](../public/img/optimized-lossless.png) | `1.2M` | `876K` | +| `pngQuantize({ maxQuality: 75 })`
**Lossy** | ![un-optimized.png](../public/img/un-optimized.png) | ![optimized-lossy.png](../public/img/optimized-lossy.png) | `1.2M` | `228K` | | `compressJpeg()`
**Lossless** | ![un-optimized.jpg](../public/img/un-optimized.jpg) | ![optimized-lossless.jpg](../public/img/optimized-lossless.jpg) | `192K` | `184K` | | `compressJpeg(75)`
**Lossy** | ![un-optimized.jpg](../public/img/un-optimized.jpg) | ![optimized-lossy.jpg](../public/img/optimized-lossy.jpg) | `192K` | `104K` | -| `new Transformer(PNG).webpLossless()`
**Lossless** | ![un-optimized.png](../public/img/un-optimized.png) | ![optimized-lossless.webp](../public/img/optimized-lossless.webp) | `888K` | `588K` | -| `new Transformer(PNG).webp(75)`
**Lossy** | ![un-optimized.png](../public/img/un-optimized.png) | ![optimized-lossy-png.webp](../public/img/optimized-lossy-png.webp) | `888K` | `64K` | -| `Transformer(PNG).avif({ quality: 100 })`
**Lossless** | ![un-optimized.png](../public/img/un-optimized.png) | ![optimized-lossless-png.avif](../public/img/optimized-lossless-png.avif) | `888K` | `536K` | -| `new Transformer(PNG).avif({ quality: 75, chromaSubsampling: ChromaSubsampling.Yuv420 })`
**Lossy** | ![un-optimized.png](../public/img/un-optimized.png) | ![optimized-lossy-png.avif](../public/img/optimized-lossy-png.avif) | `888K` | `64K` | +| `new Transformer(PNG).webpLossless()`
**Lossless** | ![un-optimized.png](../public/img/un-optimized.png) | ![optimized-lossless.webp](../public/img/optimized-lossless.webp) | `1.2M` | `676K` | +| `new Transformer(PNG).webp(75)`
**Lossy** | ![un-optimized.png](../public/img/un-optimized.png) | ![optimized-lossy-png.webp](../public/img/optimized-lossy-png.webp) | `1.2M` | `84K` | +| `Transformer(PNG).avif({ quality: 100 })`
**Lossless** | ![un-optimized.png](../public/img/un-optimized.png) | ![optimized-lossless-png.avif](../public/img/optimized-lossless-png.avif) | `1.2M` | `584K` | +| `new Transformer(PNG).avif({ quality: 75, chromaSubsampling: ChromaSubsampling.Yuv420 })`
**Lossy** | ![un-optimized.png](../public/img/un-optimized.png) | ![optimized-lossy-png.avif](../public/img/optimized-lossy-png.avif) | `1.2M` | `112K` | ```js filename="example.mjs" import { readFileSync, writeFileSync } from 'fs' diff --git a/website/public/img/output-exif.image.webp b/website/public/img/output-exif.image.webp index c0f5ff0..01966e5 100644 Binary files a/website/public/img/output-exif.image.webp and b/website/public/img/output-exif.image.webp differ diff --git a/website/public/img/output-exif.no-rotate.image.webp b/website/public/img/output-exif.no-rotate.image.webp index 801206c..570a766 100644 Binary files a/website/public/img/output-exif.no-rotate.image.webp and b/website/public/img/output-exif.no-rotate.image.webp differ diff --git a/yarn.lock b/yarn.lock index 87b9ad7..8e048d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -441,82 +441,82 @@ __metadata: languageName: node linkType: hard -"@napi-rs/canvas-android-arm64@npm:0.1.45": - version: 0.1.45 - resolution: "@napi-rs/canvas-android-arm64@npm:0.1.45" +"@napi-rs/canvas-android-arm64@npm:0.1.46": + version: 0.1.46 + resolution: "@napi-rs/canvas-android-arm64@npm:0.1.46" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@napi-rs/canvas-darwin-arm64@npm:0.1.45": - version: 0.1.45 - resolution: "@napi-rs/canvas-darwin-arm64@npm:0.1.45" +"@napi-rs/canvas-darwin-arm64@npm:0.1.46": + version: 0.1.46 + resolution: "@napi-rs/canvas-darwin-arm64@npm:0.1.46" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@napi-rs/canvas-darwin-x64@npm:0.1.45": - version: 0.1.45 - resolution: "@napi-rs/canvas-darwin-x64@npm:0.1.45" +"@napi-rs/canvas-darwin-x64@npm:0.1.46": + version: 0.1.46 + resolution: "@napi-rs/canvas-darwin-x64@npm:0.1.46" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@napi-rs/canvas-linux-arm-gnueabihf@npm:0.1.45": - version: 0.1.45 - resolution: "@napi-rs/canvas-linux-arm-gnueabihf@npm:0.1.45" +"@napi-rs/canvas-linux-arm-gnueabihf@npm:0.1.46": + version: 0.1.46 + resolution: "@napi-rs/canvas-linux-arm-gnueabihf@npm:0.1.46" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@napi-rs/canvas-linux-arm64-gnu@npm:0.1.45": - version: 0.1.45 - resolution: "@napi-rs/canvas-linux-arm64-gnu@npm:0.1.45" +"@napi-rs/canvas-linux-arm64-gnu@npm:0.1.46": + version: 0.1.46 + resolution: "@napi-rs/canvas-linux-arm64-gnu@npm:0.1.46" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@napi-rs/canvas-linux-arm64-musl@npm:0.1.45": - version: 0.1.45 - resolution: "@napi-rs/canvas-linux-arm64-musl@npm:0.1.45" +"@napi-rs/canvas-linux-arm64-musl@npm:0.1.46": + version: 0.1.46 + resolution: "@napi-rs/canvas-linux-arm64-musl@npm:0.1.46" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@napi-rs/canvas-linux-x64-gnu@npm:0.1.45": - version: 0.1.45 - resolution: "@napi-rs/canvas-linux-x64-gnu@npm:0.1.45" +"@napi-rs/canvas-linux-x64-gnu@npm:0.1.46": + version: 0.1.46 + resolution: "@napi-rs/canvas-linux-x64-gnu@npm:0.1.46" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@napi-rs/canvas-linux-x64-musl@npm:0.1.45": - version: 0.1.45 - resolution: "@napi-rs/canvas-linux-x64-musl@npm:0.1.45" +"@napi-rs/canvas-linux-x64-musl@npm:0.1.46": + version: 0.1.46 + resolution: "@napi-rs/canvas-linux-x64-musl@npm:0.1.46" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@napi-rs/canvas-win32-x64-msvc@npm:0.1.45": - version: 0.1.45 - resolution: "@napi-rs/canvas-win32-x64-msvc@npm:0.1.45" +"@napi-rs/canvas-win32-x64-msvc@npm:0.1.46": + version: 0.1.46 + resolution: "@napi-rs/canvas-win32-x64-msvc@npm:0.1.46" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@napi-rs/canvas@npm:^0.1.45": - version: 0.1.45 - resolution: "@napi-rs/canvas@npm:0.1.45" +"@napi-rs/canvas@npm:^0.1.46": + version: 0.1.46 + resolution: "@napi-rs/canvas@npm:0.1.46" dependencies: - "@napi-rs/canvas-android-arm64": "npm:0.1.45" - "@napi-rs/canvas-darwin-arm64": "npm:0.1.45" - "@napi-rs/canvas-darwin-x64": "npm:0.1.45" - "@napi-rs/canvas-linux-arm-gnueabihf": "npm:0.1.45" - "@napi-rs/canvas-linux-arm64-gnu": "npm:0.1.45" - "@napi-rs/canvas-linux-arm64-musl": "npm:0.1.45" - "@napi-rs/canvas-linux-x64-gnu": "npm:0.1.45" - "@napi-rs/canvas-linux-x64-musl": "npm:0.1.45" - "@napi-rs/canvas-win32-x64-msvc": "npm:0.1.45" + "@napi-rs/canvas-android-arm64": "npm:0.1.46" + "@napi-rs/canvas-darwin-arm64": "npm:0.1.46" + "@napi-rs/canvas-darwin-x64": "npm:0.1.46" + "@napi-rs/canvas-linux-arm-gnueabihf": "npm:0.1.46" + "@napi-rs/canvas-linux-arm64-gnu": "npm:0.1.46" + "@napi-rs/canvas-linux-arm64-musl": "npm:0.1.46" + "@napi-rs/canvas-linux-x64-gnu": "npm:0.1.46" + "@napi-rs/canvas-linux-x64-musl": "npm:0.1.46" + "@napi-rs/canvas-win32-x64-msvc": "npm:0.1.46" dependenciesMeta: "@napi-rs/canvas-android-arm64": optional: true @@ -536,17 +536,16 @@ __metadata: optional: true "@napi-rs/canvas-win32-x64-msvc": optional: true - checksum: 10c0/a31d5db85cfdfffa469d49bae9f98688414173144f7fd36ecb02c1be03fcff98de4849b7cd4e85e12bad19bdd92755237b0c4ca8cdee7d8baaf6087e36eb64f3 + checksum: 10c0/188239ee3ffc5c65dec12a4d621594f1fb6c1171fec89518a4a3776f8fd9892f13765dce214fc37e708a6e3f6d719099872873e882f752a592e8f071a4d93593 languageName: node linkType: hard -"@napi-rs/cli@npm:^3.0.0-alpha.38": - version: 3.0.0-alpha.38 - resolution: "@napi-rs/cli@npm:3.0.0-alpha.38" +"@napi-rs/cli@npm:^3.0.0-alpha.40": + version: 3.0.0-alpha.40 + resolution: "@napi-rs/cli@npm:3.0.0-alpha.40" dependencies: "@napi-rs/cross-toolchain": "npm:^0.0.14" "@octokit/rest": "npm:^20.0.2" - "@tybys/wasm-util": "npm:0.8.1" clipanion: "npm:^3.2.1" colorette: "npm:^2.0.20" debug: "npm:^4.3.4" @@ -557,6 +556,7 @@ __metadata: semver: "npm:^7.5.4" toml: "npm:^3.0.0" typanion: "npm:^3.14.0" + wasm-sjlj: "npm:^1.0.4" peerDependencies: "@emnapi/runtime": ^1.0.0 emnapi: ^1.0.0 @@ -570,7 +570,7 @@ __metadata: bin: napi: dist/cli.js napi-raw: cli.mjs - checksum: 10c0/f0f4ed480bd2d0c627bc0f1de43bc4b9c5c589c62c78df092ec53b0a4ffa6e4080bca76302e38c1f46099dd6ab9753f9ede3023fc2af3646a6f1fcd375973ed7 + checksum: 10c0/0eaa113258b7429794253c7f27866944018dfe05abc85681f6db969101b75acb583189ce4523d0e1863e735648af317a646c3f3914895a0ae951879de135e135 languageName: node linkType: hard @@ -611,11 +611,11 @@ __metadata: languageName: unknown linkType: soft -"@napi-rs/image@npm:^1.7.0, @napi-rs/image@workspace:packages/binding": +"@napi-rs/image@npm:^1.8.0, @napi-rs/image@workspace:packages/binding": version: 0.0.0-use.local resolution: "@napi-rs/image@workspace:packages/binding" dependencies: - "@napi-rs/cli": "npm:^3.0.0-alpha.38" + "@napi-rs/cli": "npm:^3.0.0-alpha.40" "@napi-rs/wasm-runtime": "npm:^0.1.1" languageName: unknown linkType: soft @@ -1866,7 +1866,7 @@ __metadata: languageName: node linkType: hard -"@tybys/wasm-util@npm:0.8.1, @tybys/wasm-util@npm:^0.8.1": +"@tybys/wasm-util@npm:^0.8.1": version: 0.8.1 resolution: "@tybys/wasm-util@npm:0.8.1" dependencies: @@ -5543,7 +5543,7 @@ __metadata: version: 0.0.0-use.local resolution: "image@workspace:." dependencies: - "@napi-rs/cli": "npm:^3.0.0-alpha.38" + "@napi-rs/cli": "npm:^3.0.0-alpha.40" "@taplo/cli": "npm:^0.7.0" "@types/node": "npm:^20.11.16" "@types/sharp": "npm:^0.31.1" @@ -10986,6 +10986,15 @@ __metadata: languageName: node linkType: hard +"wasm-sjlj@npm:^1.0.4": + version: 1.0.4 + resolution: "wasm-sjlj@npm:1.0.4" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/79b0d48c23e55e98e8cac86610003714dc5b874c76bc88501eab70c4c96f4c6d49420e036825fc7c55f42317620433f25ff7fb0ea2dc9e6db505b79450653301 + languageName: node + linkType: hard + "wcwidth@npm:^1.0.0, wcwidth@npm:^1.0.1": version: 1.0.1 resolution: "wcwidth@npm:1.0.1" @@ -11027,8 +11036,8 @@ __metadata: version: 0.0.0-use.local resolution: "website@workspace:website" dependencies: - "@napi-rs/canvas": "npm:^0.1.45" - "@napi-rs/image": "npm:^1.7.0" + "@napi-rs/canvas": "npm:^0.1.46" + "@napi-rs/image": "npm:^1.8.0" chalk: "npm:^5.3.0" next: "npm:canary" next-mdx-remote: "npm:^4.4.1"