Compare commits

..

30 Commits

Author SHA1 Message Date
Lovell Fuller
bcb22af034 Release v0.33.2 2024-01-12 10:58:45 +00:00
Lovell Fuller
d04dc62666 Prerelease v0.33.2-rc.1 2024-01-12 09:04:00 +00:00
Lovell Fuller
c30d355f97 CI: Fix npm smoke test expectation
libvips v8.15.1 added jfif to suffixes
2024-01-11 18:47:24 +00:00
Lovell Fuller
49cb148b38 Prerelease v0.33.2-rc.0 2024-01-11 16:43:59 +00:00
Lovell Fuller
3bc31a8b20 CI: Verify emscripten versions match 2024-01-11 16:23:12 +00:00
Kleis Auke Wolthuizen
c28523e70e CI: Update Emscripten Docker image to 3.1.51 (#3907) 2024-01-11 16:21:53 +00:00
Lovell Fuller
278f393f74 Upgrade to libvips v8.15.1 2024-01-11 15:44:57 +00:00
Lovell Fuller
cbf68c1395 Improve error for unsupported multi-page rotation #3940 2024-01-11 11:59:01 +00:00
Lovell Fuller
45e8071599 Add runtime check for outdated Node.js version 2024-01-10 13:50:20 +00:00
Lovell Fuller
b96389d975 Docs: refresh index 2024-01-10 13:50:09 +00:00
Erika
a77ac6ae25 Docs: correct semver for supported Node.js versions (#3937) 2024-01-10 09:06:40 +00:00
Lovell Fuller
9bcf399b4c Ensure extend op stays sequential when copying px #3928 2024-01-04 09:24:41 +00:00
Lovell Fuller
4aacee8055 Docs: include img-scoped packages in electron asarUnpack 2024-01-04 08:57:26 +00:00
Lovell Fuller
0b18aeff62 CI: Remove use of nodesource repos 2024-01-03 11:40:42 +00:00
Lovell Fuller
bed1c2ac18 Bump deps 2024-01-03 10:01:29 +00:00
Lovell Fuller
8cd832656b Docs: add electron to bundlers section
If you're using asar, you'll also need to configure asarUnpack.
2024-01-03 09:40:21 +00:00
Lovell Fuller
0499f59e71 Docs: add minimum dep versions to build from source 2023-12-29 10:01:56 +00:00
Lovell Fuller
1fa59bf9b3 Remove any suggestion to --force install
This is probably a bad idea in the long run as versions can
get out of sync and other genuine warnings might be ignored.
2023-12-28 11:24:46 +00:00
Lovell Fuller
db40ee6912 Docs: add note about Lambda lacking symlink support
Some package managers use symlinks. If you need to deploy to AWS,
please do not use symlinks.
2023-12-28 11:23:26 +00:00
Lovell Fuller
02b98b8e1b Issue template: ask for complete error message
The error messages generated by sharp are designed to provide
people with as much information about the situation as possible.
If someone is asked to copy/paste the error, it's more likely
they might actually read it, which might then allow them to help
themselves without the need to open a new issue.
2023-12-27 09:23:21 +00:00
Lovell Fuller
31fef216e4 Docs: changelog entry for #3914 2023-12-27 09:21:23 +00:00
Abhishek V
77ab5d7a51 TypeScript: add definition for keepMetadata (#3914) 2023-12-24 10:24:54 +00:00
Lovell Fuller
cd5cf7ce2d Docs: direct cross-platform Lambda users to relevant section
This should reduce repetition in the docs, ensuring any users
wishing to support multi or cross platform installs have one
place to look.
2023-12-19 16:43:21 +00:00
Lovell Fuller
39cb9d9a6c Issue template: yarn pnp is now supported 2023-12-17 20:47:23 +00:00
Lovell Fuller
4919bc5134 Release v0.33.1 2023-12-17 20:10:30 +00:00
Lovell Fuller
a4e64eb01f Prerelease v0.33.1-rc.3 2023-12-17 19:32:36 +00:00
Lovell Fuller
328b18df88 CI: Split yarn pnp package tests into separate jobs 2023-12-17 19:00:14 +00:00
Lovell Fuller
5e7bf32e5e Docs: refresh index and homepage link 2023-12-17 18:51:49 +00:00
Lovell Fuller
04403f4e5f Prerelease v0.33.1-rc.2 2023-12-17 17:13:34 +00:00
Lovell Fuller
420e0822b4 CI: Pin Node.js 18 to avoid npm 10 on 32-bit Windows
npm 10 seems to be opening thousands of network connections,
leading to resource starvation in Node.js 18. This does not
appear to impact Node.js 20.
2023-12-17 16:53:12 +00:00
32 changed files with 224 additions and 113 deletions

View File

@@ -24,7 +24,8 @@ You must confirm both of these before continuing.
If you cannot confirm this, please upgrade to the latest version and try again before opening an issue.
If you are using another package which depends on a version of `sharp` that is not the latest, please open an issue against that package instead.
If you are using another package which depends on a version of `sharp` that is not the latest,
please open an issue against that package instead.
### Are you using a supported runtime?
@@ -43,15 +44,17 @@ and try again before opening an issue.
<!-- Please place an [x] in the relevant box to confirm. -->
- [ ] I am using npm >= 9.6.5 with `--include=optional`
- [ ] I am using yarn >= 3.2.0 and I am not using the "Plug'n'Play" linker
- [ ] I am using yarn >= 3.2.0
- [ ] I am using pnpm >= 7.1.0 with `--no-optional=false`
- [ ] I am using Deno
- [ ] I am using Bun
If you cannot confirm any of these,
please upgrade to the latest version of your chosen package manager
and ensure you are allowing the installation of optional or multi-platform dependencies
before opening an issue.
If you cannot confirm any of these, please upgrade to the latest version of your chosen package manager
and ensure you are allowing the installation of optional or multi-platform dependencies before opening an issue.
### What is the complete error message, including the full stack trace?
<!-- Please provide the error message and stack trace here. -->
### What is the complete output of running `npm install --verbose --foreground-scripts sharp` in an empty directory?

View File

@@ -16,12 +16,14 @@ jobs:
include:
- os: ubuntu-22.04
container: rockylinux:8
nodejs_arch: x64
nodejs_version: "^18.17.0"
nodejs_version_major: 18
platform: linux-x64
prebuild: true
- os: ubuntu-22.04
container: rockylinux:8
nodejs_arch: x64
nodejs_version: "^20.3.0"
nodejs_version_major: 20
platform: linux-x64
@@ -47,7 +49,7 @@ jobs:
platform: darwin-x64
- os: windows-2019
nodejs_arch: x86
nodejs_version: "^18.17.0"
nodejs_version: "18.18.2" # pinned to avoid 18.19.0 and npm 10
nodejs_version_major: 18
platform: win32-ia32
prebuild: true
@@ -68,19 +70,9 @@ jobs:
nodejs_version_major: 20
platform: win32-x64
steps:
- name: Dependencies (Linux glibc)
if: contains(matrix.container, 'centos')
run: |
yum install -y https://rpm.nodesource.com/pub_${{ matrix.nodejs_version_major }}.x/nodistro/repo/nodesource-release-nodistro-1.noarch.rpm
yum install -y https://packages.endpointdev.com/rhel/7/os/x86_64/endpoint-repo.x86_64.rpm
yum install -y centos-release-scl
yum install -y devtoolset-11-gcc-c++ make git python3 nodejs fontconfig google-noto-sans-fonts
echo "/opt/rh/devtoolset-11/root/usr/bin" >> $GITHUB_PATH
- name: Dependencies (Rocky Linux glibc)
if: contains(matrix.container, 'rockylinux')
run: |
dnf install -y https://rpm.nodesource.com/pub_${{ matrix.nodejs_version_major }}.x/nodistro/repo/nodesource-release-nodistro-1.noarch.rpm
dnf install -y --setopt=nodesource-nodejs.module_hotfixes=1 nodejs
dnf install -y gcc-toolset-11-gcc-c++ make git python3 fontconfig google-noto-sans-fonts
echo "/opt/rh/gcc-toolset-11/root/usr/bin" >> $GITHUB_PATH
- name: Dependencies (Linux musl)
@@ -91,8 +83,8 @@ jobs:
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Dependencies (Node.js - macOS, Windows)
if: contains(matrix.os, 'macos') || contains(matrix.os, 'windows')
- name: Dependencies (Node.js)
if: "!contains(matrix.platform, 'linuxmusl')"
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.nodejs_version }}
@@ -166,7 +158,7 @@ jobs:
contents: write
name: wasm32 - prebuild
runs-on: ubuntu-22.04
container: "emscripten/emsdk:3.1.48"
container: "emscripten/emsdk:3.1.51"
steps:
- name: Checkout
uses: actions/checkout@v4
@@ -178,6 +170,13 @@ jobs:
node-version: "20"
- name: Install
run: emmake npm install --build-from-source
- name: Verify emscripten versions match
run: |
EMSCRIPTEN_VERSION_LIBVIPS=$(node -p "require('@img/sharp-libvips-dev-wasm32/versions').emscripten")
EMSCRIPTEN_VERSION_SHARP=$(emcc -dumpversion)
echo "libvips built with emscripten $EMSCRIPTEN_VERSION_LIBVIPS"
echo "sharp built with emscripten $EMSCRIPTEN_VERSION_SHARP"
test "$EMSCRIPTEN_VERSION_LIBVIPS" = "$EMSCRIPTEN_VERSION_SHARP"
- name: Test
run: emmake npm test
- name: Test packaging

View File

@@ -27,6 +27,10 @@ jobs:
runs-on: ubuntu-22.04
runtime: node
package-manager: yarn
- name: linux-x64-node-yarn-pnp
runs-on: ubuntu-22.04
runtime: node
package-manager: yarn-pnp
- name: linux-x64-deno
runs-on: ubuntu-22.04
runtime: deno
@@ -46,6 +50,10 @@ jobs:
runs-on: macos-11
runtime: node
package-manager: yarn
- name: darwin-x64-node-yarn-pnp
runs-on: macos-11
runtime: node
package-manager: yarn-pnp
- name: darwin-x64-deno
runs-on: macos-11
runtime: deno
@@ -65,6 +73,10 @@ jobs:
runs-on: windows-2019
runtime: node
package-manager: yarn
- name: win32-x64-node-yarn-pnp
runs-on: windows-2019
runtime: node
package-manager: yarn-pnp
- name: win32-x64-deno
runs-on: windows-2019
runtime: deno
@@ -115,35 +127,37 @@ jobs:
contents: |
import { deepStrictEqual } from 'node:assert';
import sharp from 'sharp';
deepStrictEqual(['.jpg', '.jpeg', '.jpe'], sharp.format.jpeg.input.fileSuffix);
deepStrictEqual(['.jpg', '.jpeg', '.jpe', '.jfif'], sharp.format.jpeg.input.fileSuffix);
- name: Run with Node.js + npm
if: ${{ matrix.runtime == 'node' && matrix.package-manager == 'npm' }}
if: ${{ matrix.package-manager == 'npm' }}
run: |
npm install --ignore-scripts
node release.mjs
- name: Run with Node.js + pnpm
if: ${{ matrix.runtime == 'node' && matrix.package-manager == 'pnpm' }}
if: ${{ matrix.package-manager == 'pnpm' }}
run: |
pnpm install --ignore-scripts
node release.mjs
- name: Run with Node.js + yarn
if: ${{ matrix.runtime == 'node' && matrix.package-manager == 'yarn' }}
if: ${{ matrix.package-manager == 'yarn' }}
run: |
corepack enable
yarn set version stable
yarn config set enableImmutableInstalls false
yarn config set enableScripts false
yarn config set nodeLinker node-modules
yarn install
node release.mjs
- name: Run with Node.js + yarn pnp
if: ${{ matrix.runtime == 'node' && matrix.package-manager == 'yarn' }}
if: ${{ matrix.package-manager == 'yarn-pnp' }}
run: |
corepack enable
yarn set version stable
yarn config set enableImmutableInstalls false
yarn config set enableScripts false
yarn config set nodeLinker pnp
yarn install

View File

@@ -8,7 +8,7 @@ smaller, web-friendly JPEG, PNG, WebP, GIF and AVIF images of varying dimensions
It can be used with all JavaScript runtimes
that provide support for Node-API v9, including
Node.js >= 18.17.0, Deno and Bun.
Node.js (^18.17.0 or >= 20.3.0), Deno and Bun.
Resizing an image is typically 4x-5x faster than using the
quickest ImageMagick and GraphicsMagick settings

View File

@@ -18,6 +18,8 @@ The use of `rotate` without an angle will remove the EXIF `Orientation` tag, if
Only one rotation can occur per pipeline.
Previous calls to `rotate` in the same pipeline will be ignored.
Multi-page images can only be rotated by 180 degrees.
Method order is important when rotating, resizing and/or extracting regions,
for example `.rotate(x).extract(y)` will produce a different result to `.extract(y).rotate(x)`.

View File

@@ -2,9 +2,21 @@
## v0.33 - *gauge*
Requires libvips v8.15.0
Requires libvips v8.15.1
### v0.33.1 - TBD
### v0.33.2 - 12th January 2024
* TypeScript: add definition for `keepMetadata`.
[#3914](https://github.com/lovell/sharp/pull/3914)
[@abhi0498](https://github.com/abhi0498)
* Ensure `extend` operation stays sequential when copying (regression in 0.32.0).
[#3928](https://github.com/lovell/sharp/issues/3928)
* Improve error handling for unsupported multi-page rotation.
[#3940](https://github.com/lovell/sharp/issues/3940)
### v0.33.1 - 17th December 2023
* Add support for Yarn Plug'n'Play filesystem layout.
[#3888](https://github.com/lovell/sharp/issues/3888)
@@ -18,7 +30,7 @@ Requires libvips v8.15.0
### v0.33.0 - 29th November 2023
* Drop support for Node.js 14 and 16, now requires Node.js >= 18.17.0
* Drop support for Node.js 14 and 16, now requires Node.js ^18.17.0 or >= 20.3.0
* Prebuilt binaries distributed via npm registry and installed via package manager.

View File

@@ -35,7 +35,7 @@ deno run --allow-ffi ...
## Prerequisites
* Node-API v9 compatible runtime e.g. Node.js >= 18.17.0
* Node-API v9 compatible runtime e.g. Node.js ^18.17.0 or >=20.3.0.
## Prebuilt binaries
@@ -61,7 +61,7 @@ for the current OS platform and CPU architecture, where available.
Some package managers support multiple platforms and architectures
within the same installation tree and/or using the same lockfile.
### npm
### npm v10+
> ⚠️ **npm `package-lock.json` files can cause installation problems due to [npm bug #4828](https://github.com/npm/cli/issues/4828)**
@@ -79,11 +79,11 @@ npm install --cpu=x64 --os=linux sharp
npm install --cpu=x64 --os=linux --libc=musl sharp
```
### yarn
### yarn v3+
Use the [supportedArchitectures](https://yarnpkg.com/configuration/yarnrc#supportedArchitectures) configuration.
### pnpm
### pnpm v8+
Use the [supportedArchitectures](https://pnpm.io/package_json#pnpmsupportedarchitectures) configuration.
@@ -109,8 +109,8 @@ This module will be compiled from source at `npm install` time when:
Building from source requires:
* C++11 compiler
* [node-addon-api](https://www.npmjs.com/package/node-addon-api)
* [node-gyp](https://github.com/nodejs/node-gyp#installation) and its dependencies
* [node-addon-api](https://www.npmjs.com/package/node-addon-api) version 7+
* [node-gyp](https://github.com/nodejs/node-gyp#installation) version 9+ and its dependencies
There is an install-time check for these dependencies.
If `node-addon-api` or `node-gyp` cannot be found, try adding them via:
@@ -173,25 +173,11 @@ must include binaries for either the linux-x64 or linux-arm64 platforms
depending on the chosen architecture.
When building your deployment package on a machine that differs from the target architecture,
you will need to install either `@img/sharp-linux-x64` or `@img/sharp-linux-arm64` package.
see the [cross-platform](#cross-platform) section to help decide which package manager is appropriate
and how to configure it.
```sh
npm install --os=linux --cpu=x64 sharp
```
```sh
npm install --os=linux --cpu=arm64 sharp
```
When using npm 9 or earlier, this can be achieved using the following:
```sh
npm install --force @img/sharp-linux-x64
```
```sh
npm install --force @img/sharp-linux-arm64
```
Some package managers use symbolic links
but AWS Lambda does not support these within deployment packages.
To get the best performance select the largest memory available.
A 1536 MB function provides ~12x more CPU time than a 128 MB function.
@@ -245,6 +231,24 @@ custom:
- npm install --os=linux --cpu=x64 sharp
```
### electron
Ensure `sharp` is unpacked from the ASAR archive file using the
[asarUnpack](https://www.electron.build/configuration/configuration.html)
option.
```json
{
"build": {
"asar": true,
"asarUnpack": [
"**/node_modules/sharp/**/*",
"**/node_modules/@img/**/*"
]
}
}
```
## TypeScript
TypeScript definitions are published as part of

File diff suppressed because one or more lines are too long

6
lib/index.d.ts vendored
View File

@@ -341,6 +341,12 @@ declare namespace sharp {
*/
metadata(): Promise<Metadata>;
/**
* Keep all metadata (EXIF, ICC, XMP, IPTC) from the input image in the output image.
* @returns A sharp instance that can be used to chain operations
*/
keepMetadata(): Sharp;
/**
* Access to pixel-derived image statistics for every channel in the image.
* @returns A sharp instance that can be used to chain operations

View File

@@ -7,6 +7,7 @@ const { spawnSync } = require('node:child_process');
const { createHash } = require('node:crypto');
const semverCoerce = require('semver/functions/coerce');
const semverGreaterThanOrEqualTo = require('semver/functions/gte');
const semverSatisfies = require('semver/functions/satisfies');
const detectLibc = require('detect-libc');
const { engines, optionalDependencies } = require('../package.json');
@@ -83,6 +84,15 @@ const buildSharpLibvipsLibDir = () => {
return '';
};
const isUnsupportedNodeRuntime = () => {
/* istanbul ignore next */
if (process.release?.name === 'node' && process.versions) {
if (!semverSatisfies(process.versions.node, engines.node)) {
return { found: process.versions.node, expected: engines.node };
}
}
};
/* istanbul ignore next */
const isEmscripten = () => {
const { CC } = process.env;
@@ -174,6 +184,7 @@ module.exports = {
buildSharpLibvipsIncludeDir,
buildSharpLibvipsCPlusPlusDir,
buildSharpLibvipsLibDir,
isUnsupportedNodeRuntime,
runtimePlatformArch,
log,
yarnLocator,

View File

@@ -24,6 +24,8 @@ const is = require('./is');
* Only one rotation can occur per pipeline.
* Previous calls to `rotate` in the same pipeline will be ignored.
*
* Multi-page images can only be rotated by 180 degrees.
*
* Method order is important when rotating, resizing and/or extracting regions,
* for example `.rotate(x).extract(y)` will produce a different result to `.extract(y).rotate(x)`.
*

View File

@@ -7,7 +7,7 @@
const { familySync, versionSync } = require('detect-libc');
const { runtimePlatformArch, prebuiltPlatforms, minimumLibvipsVersion } = require('./libvips');
const { runtimePlatformArch, isUnsupportedNodeRuntime, prebuiltPlatforms, minimumLibvipsVersion } = require('./libvips');
const runtimePlatform = runtimePlatformArch();
const paths = [
@@ -44,8 +44,16 @@ if (sharp) {
const messages = errors.map(err => err.message).join(' ');
help.push('Possible solutions:');
// Common error messages
if (prebuiltPlatforms.includes(runtimePlatform)) {
if (isUnsupportedNodeRuntime()) {
const { found, expected } = isUnsupportedNodeRuntime();
help.push(
'- Please upgrade Node.js:',
` Found ${found}`,
` Requires ${expected}`
);
} else if (prebuiltPlatforms.includes(runtimePlatform)) {
const [os, cpu] = runtimePlatform.split('-');
const libc = os.endsWith('musl') ? ' --libc=musl' : '';
help.push(
'- Ensure optional dependencies can be installed:',
' npm install --include=optional sharp',
@@ -53,15 +61,14 @@ if (sharp) {
'- Ensure your package manager supports multi-platform installation:',
' See https://sharp.pixelplumbing.com/install#cross-platform',
'- Add platform-specific dependencies:',
` npm install --os=${os} --cpu=${cpu} sharp`,
` npm install --force @img/sharp-${runtimePlatform}`
` npm install --os=${os.replace('musl', '')}${libc} --cpu=${cpu} sharp`
);
} else {
help.push(
`- Manually install libvips >= ${minimumLibvipsVersion}`,
'- Add experimental WebAssembly-based dependencies:',
' npm install --cpu=wasm32 sharp',
' npm install --force @img/sharp-wasm32'
' npm install @img/sharp-wasm32'
);
}
if (isLinux && /(symbol not found|CXXABI_)/i.test(messages)) {

View File

@@ -1,6 +1,6 @@
{
"name": "@img/sharp-darwin-arm64",
"version": "0.33.1-rc.1",
"version": "0.33.2",
"description": "Prebuilt sharp for use with macOS 64-bit ARM",
"author": "Lovell Fuller <npm@lovell.info>",
"homepage": "https://sharp.pixelplumbing.com",
@@ -15,7 +15,7 @@
},
"preferUnplugged": true,
"optionalDependencies": {
"@img/sharp-libvips-darwin-arm64": "1.0.0"
"@img/sharp-libvips-darwin-arm64": "1.0.1"
},
"files": [
"lib"

View File

@@ -1,6 +1,6 @@
{
"name": "@img/sharp-darwin-x64",
"version": "0.33.1-rc.1",
"version": "0.33.2",
"description": "Prebuilt sharp for use with macOS x64",
"author": "Lovell Fuller <npm@lovell.info>",
"homepage": "https://sharp.pixelplumbing.com",
@@ -15,7 +15,7 @@
},
"preferUnplugged": true,
"optionalDependencies": {
"@img/sharp-libvips-darwin-x64": "1.0.0"
"@img/sharp-libvips-darwin-x64": "1.0.1"
},
"files": [
"lib"

View File

@@ -1,6 +1,6 @@
{
"name": "@img/sharp-linux-arm",
"version": "0.33.1-rc.1",
"version": "0.33.2",
"description": "Prebuilt sharp for use with Linux (glibc) ARM (32-bit)",
"author": "Lovell Fuller <npm@lovell.info>",
"homepage": "https://sharp.pixelplumbing.com",
@@ -15,7 +15,7 @@
},
"preferUnplugged": true,
"optionalDependencies": {
"@img/sharp-libvips-linux-arm": "1.0.0"
"@img/sharp-libvips-linux-arm": "1.0.1"
},
"files": [
"lib"

View File

@@ -1,6 +1,6 @@
{
"name": "@img/sharp-linux-arm64",
"version": "0.33.1-rc.1",
"version": "0.33.2",
"description": "Prebuilt sharp for use with Linux (glibc) 64-bit ARM",
"author": "Lovell Fuller <npm@lovell.info>",
"homepage": "https://sharp.pixelplumbing.com",
@@ -15,7 +15,7 @@
},
"preferUnplugged": true,
"optionalDependencies": {
"@img/sharp-libvips-linux-arm64": "1.0.0"
"@img/sharp-libvips-linux-arm64": "1.0.1"
},
"files": [
"lib"

View File

@@ -1,6 +1,6 @@
{
"name": "@img/sharp-linux-s390x",
"version": "0.33.1-rc.1",
"version": "0.33.2",
"description": "Prebuilt sharp for use with Linux (glibc) s390x",
"author": "Lovell Fuller <npm@lovell.info>",
"homepage": "https://sharp.pixelplumbing.com",
@@ -15,7 +15,7 @@
},
"preferUnplugged": true,
"optionalDependencies": {
"@img/sharp-libvips-linux-s390x": "1.0.0"
"@img/sharp-libvips-linux-s390x": "1.0.1"
},
"files": [
"lib"

View File

@@ -1,6 +1,6 @@
{
"name": "@img/sharp-linux-x64",
"version": "0.33.1-rc.1",
"version": "0.33.2",
"description": "Prebuilt sharp for use with Linux (glibc) x64",
"author": "Lovell Fuller <npm@lovell.info>",
"homepage": "https://sharp.pixelplumbing.com",
@@ -15,7 +15,7 @@
},
"preferUnplugged": true,
"optionalDependencies": {
"@img/sharp-libvips-linux-x64": "1.0.0"
"@img/sharp-libvips-linux-x64": "1.0.1"
},
"files": [
"lib"

View File

@@ -1,6 +1,6 @@
{
"name": "@img/sharp-linuxmusl-arm64",
"version": "0.33.1-rc.1",
"version": "0.33.2",
"description": "Prebuilt sharp for use with Linux (musl) 64-bit ARM",
"author": "Lovell Fuller <npm@lovell.info>",
"homepage": "https://sharp.pixelplumbing.com",
@@ -15,7 +15,7 @@
},
"preferUnplugged": true,
"optionalDependencies": {
"@img/sharp-libvips-linuxmusl-arm64": "1.0.0"
"@img/sharp-libvips-linuxmusl-arm64": "1.0.1"
},
"files": [
"lib"

View File

@@ -1,6 +1,6 @@
{
"name": "@img/sharp-linuxmusl-x64",
"version": "0.33.1-rc.1",
"version": "0.33.2",
"description": "Prebuilt sharp for use with Linux (musl) x64",
"author": "Lovell Fuller <npm@lovell.info>",
"homepage": "https://sharp.pixelplumbing.com",
@@ -15,7 +15,7 @@
},
"preferUnplugged": true,
"optionalDependencies": {
"@img/sharp-libvips-linuxmusl-x64": "1.0.0"
"@img/sharp-libvips-linuxmusl-x64": "1.0.1"
},
"files": [
"lib"

View File

@@ -1,6 +1,6 @@
{
"name": "@img/sharp",
"version": "0.33.1-rc.1",
"version": "0.33.2",
"private": "true",
"workspaces": [
"darwin-arm64",

View File

@@ -1,6 +1,6 @@
{
"name": "@img/sharp-wasm32",
"version": "0.33.1-rc.1",
"version": "0.33.2",
"description": "Prebuilt sharp for use with wasm32",
"author": "Lovell Fuller <npm@lovell.info>",
"homepage": "https://sharp.pixelplumbing.com",
@@ -34,7 +34,7 @@
"pnpm": ">=7.1.0"
},
"dependencies": {
"@emnapi/runtime": "^0.44.0"
"@emnapi/runtime": "^0.45.0"
},
"cpu": [
"wasm32"

View File

@@ -1,6 +1,6 @@
{
"name": "@img/sharp-win32-ia32",
"version": "0.33.1-rc.1",
"version": "0.33.2",
"description": "Prebuilt sharp for use with Windows x86 (32-bit)",
"author": "Lovell Fuller <npm@lovell.info>",
"homepage": "https://sharp.pixelplumbing.com",

View File

@@ -1,6 +1,6 @@
{
"name": "@img/sharp-win32-x64",
"version": "0.33.1-rc.1",
"version": "0.33.2",
"description": "Prebuilt sharp for use with Windows x64",
"author": "Lovell Fuller <npm@lovell.info>",
"homepage": "https://sharp.pixelplumbing.com",

View File

@@ -1,9 +1,9 @@
{
"name": "sharp",
"description": "High performance Node.js image processing, the fastest module to resize JPEG, PNG, WebP, GIF, AVIF and TIFF images",
"version": "0.33.1-rc.1",
"version": "0.33.2",
"author": "Lovell Fuller <npm@lovell.info>",
"homepage": "https://github.com/lovell/sharp",
"homepage": "https://sharp.pixelplumbing.com",
"contributors": [
"Pierre Inglebert <pierre.inglebert@gmail.com>",
"Jonathan Ong <jonathanrichardong@gmail.com>",
@@ -141,36 +141,36 @@
"semver": "^7.5.4"
},
"optionalDependencies": {
"@img/sharp-darwin-arm64": "0.33.1-rc.1",
"@img/sharp-darwin-x64": "0.33.1-rc.1",
"@img/sharp-libvips-darwin-arm64": "1.0.0",
"@img/sharp-libvips-darwin-x64": "1.0.0",
"@img/sharp-libvips-linux-arm": "1.0.0",
"@img/sharp-libvips-linux-arm64": "1.0.0",
"@img/sharp-libvips-linux-s390x": "1.0.0",
"@img/sharp-libvips-linux-x64": "1.0.0",
"@img/sharp-libvips-linuxmusl-arm64": "1.0.0",
"@img/sharp-libvips-linuxmusl-x64": "1.0.0",
"@img/sharp-linux-arm": "0.33.1-rc.1",
"@img/sharp-linux-arm64": "0.33.1-rc.1",
"@img/sharp-linux-s390x": "0.33.1-rc.1",
"@img/sharp-linux-x64": "0.33.1-rc.1",
"@img/sharp-linuxmusl-arm64": "0.33.1-rc.1",
"@img/sharp-linuxmusl-x64": "0.33.1-rc.1",
"@img/sharp-wasm32": "0.33.1-rc.1",
"@img/sharp-win32-ia32": "0.33.1-rc.1",
"@img/sharp-win32-x64": "0.33.1-rc.1"
"@img/sharp-darwin-arm64": "0.33.2",
"@img/sharp-darwin-x64": "0.33.2",
"@img/sharp-libvips-darwin-arm64": "1.0.1",
"@img/sharp-libvips-darwin-x64": "1.0.1",
"@img/sharp-libvips-linux-arm": "1.0.1",
"@img/sharp-libvips-linux-arm64": "1.0.1",
"@img/sharp-libvips-linux-s390x": "1.0.1",
"@img/sharp-libvips-linux-x64": "1.0.1",
"@img/sharp-libvips-linuxmusl-arm64": "1.0.1",
"@img/sharp-libvips-linuxmusl-x64": "1.0.1",
"@img/sharp-linux-arm": "0.33.2",
"@img/sharp-linux-arm64": "0.33.2",
"@img/sharp-linux-s390x": "0.33.2",
"@img/sharp-linux-x64": "0.33.2",
"@img/sharp-linuxmusl-arm64": "0.33.2",
"@img/sharp-linuxmusl-x64": "0.33.2",
"@img/sharp-wasm32": "0.33.2",
"@img/sharp-win32-ia32": "0.33.2",
"@img/sharp-win32-x64": "0.33.2"
},
"devDependencies": {
"@emnapi/runtime": "^0.44.0",
"@img/sharp-libvips-dev": "1.0.0",
"@img/sharp-libvips-dev-wasm32": "1.0.0",
"@img/sharp-libvips-win32-ia32": "1.0.0",
"@img/sharp-libvips-win32-x64": "1.0.0",
"@emnapi/runtime": "^0.45.0",
"@img/sharp-libvips-dev": "1.0.1",
"@img/sharp-libvips-dev-wasm32": "1.0.1",
"@img/sharp-libvips-win32-ia32": "1.0.1",
"@img/sharp-libvips-win32-x64": "1.0.1",
"@types/node": "*",
"async": "^3.2.5",
"cc": "^3.0.1",
"emnapi": "^0.44.0",
"emnapi": "^0.45.0",
"exif-reader": "^2.0.0",
"extract-zip": "^2.0.1",
"icc": "^3.0.0",
@@ -182,12 +182,12 @@
"prebuild": "^12.1.0",
"semistandard": "^17.0.0",
"tar-fs": "^3.0.4",
"tsd": "^0.29.0"
"tsd": "^0.30.3"
},
"license": "Apache-2.0",
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0",
"libvips": ">=8.15.0"
"libvips": ">=8.15.1"
},
"funding": {
"url": "https://opencollective.com/libvips"

View File

@@ -16,8 +16,8 @@
#if (VIPS_MAJOR_VERSION < 8) || \
(VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION < 15) || \
(VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION == 15 && VIPS_MICRO_VERSION < 0)
#error "libvips version 8.15.0+ is required - please see https://sharp.pixelplumbing.com/install"
(VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION == 15 && VIPS_MICRO_VERSION < 1)
#error "libvips version 8.15.1+ is required - please see https://sharp.pixelplumbing.com/install"
#endif
#if ((!defined(__clang__)) && defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6)))

View File

@@ -96,6 +96,9 @@ class PipelineWorker : public Napi::AsyncWorker {
baton->rotationAngle != 0.0);
if (autoRotation != VIPS_ANGLE_D0) {
if (autoRotation != VIPS_ANGLE_D180) {
MultiPageUnsupported(nPages, "Rotate");
}
image = image.rot(autoRotation);
autoRotation = VIPS_ANGLE_D0;
}
@@ -114,6 +117,9 @@ class PipelineWorker : public Napi::AsyncWorker {
baton->flop = FALSE;
}
if (rotation != VIPS_ANGLE_D0) {
if (rotation != VIPS_ANGLE_D180) {
MultiPageUnsupported(nPages, "Rotate");
}
image = image.rot(rotation);
rotation = VIPS_ANGLE_D0;
}
@@ -397,6 +403,9 @@ class PipelineWorker : public Napi::AsyncWorker {
rotation != VIPS_ANGLE_D0);
// Auto-rotate post-extract
if (autoRotation != VIPS_ANGLE_D0) {
if (autoRotation != VIPS_ANGLE_D180) {
MultiPageUnsupported(nPages, "Rotate");
}
image = image.rot(autoRotation);
}
// Mirror vertically (up-down) about the x-axis
@@ -409,6 +418,9 @@ class PipelineWorker : public Napi::AsyncWorker {
}
// Rotate post-extract 90-angle
if (rotation != VIPS_ANGLE_D0) {
if (rotation != VIPS_ANGLE_D180) {
MultiPageUnsupported(nPages, "Rotate");
}
image = image.rot(rotation);
}
@@ -561,6 +573,7 @@ class PipelineWorker : public Napi::AsyncWorker {
VImage::option()->set("extend", baton->extendWith)->set("background", background));
} else {
std::vector<double> ignoredBackground(1);
image = sharp::StaySequential(image, baton->input->access);
image = nPages > 1
? sharp::EmbedMultiPage(image,
baton->extendLeft, baton->extendTop, baton->width, baton->height,

View File

@@ -44,6 +44,12 @@ sharp('input.png')
// sharpened, with metadata, 90% quality WebP image data. Phew!
});
sharp('input.png')
.keepMetadata()
.toFile('output.png', (err, info) => {
// output.png is an image containing input.png along with all metadata(EXIF, ICC, XMP, IPTC) from input.png
})
sharp('input.jpg')
.resize(300, 200)
.toFile('output.jpg', (err: Error) => {

View File

@@ -73,6 +73,20 @@ describe('Extend', function () {
});
});
it('extend top with mirroring uses ordered read', async () => {
const data = await sharp(fixtures.inputJpg)
.extend({
extendWith: 'mirror',
top: 1
})
.png({ compressionLevel: 0 })
.toBuffer();
const { width, height } = await sharp(data).metadata();
assert.strictEqual(2725, width);
assert.strictEqual(2226, height);
});
it(`extend sides unequally with RGBA (${extendWith})`, function (done) {
sharp(fixtures.inputPngWithTransparency16bit)
.resize(120)

View File

@@ -123,6 +123,9 @@ describe('libvips binaries', function () {
const [, arch] = libvips.runtimePlatformArch().split('-');
assert.strict(['arm', 'arm64', 'ia32', 'x64'].includes(arch));
});
it('isUnsupportedNodeRuntime', () => {
assert.strictEqual(libvips.isUnsupportedNodeRuntime(), undefined);
});
});
describe('logger', function () {
@@ -159,7 +162,7 @@ describe('libvips binaries', function () {
process.env.npm_config_arch = 's390x';
process.env.npm_config_libc = '';
const locatorHash = libvips.yarnLocator();
assert.strictEqual(locatorHash, '86cc8ee6e4');
assert.strictEqual(locatorHash, 'f2bd19138a');
delete process.env.npm_config_platform;
delete process.env.npm_config_arch;
delete process.env.npm_config_libc;

View File

@@ -353,6 +353,21 @@ describe('Rotation', function () {
)
);
it('Animated image rotate 180', () =>
assert.doesNotReject(() => sharp(fixtures.inputGifAnimated, { animated: true })
.rotate(180)
.toBuffer()
)
);
it('Animated image rotate non-180 rejects', () =>
assert.rejects(() => sharp(fixtures.inputGifAnimated, { animated: true })
.rotate(90)
.toBuffer(),
/Rotate is not supported for multi-page images/
)
);
it('Multiple rotate emits warning', () => {
let warningMessage = '';
const s = sharp();

View File

@@ -134,7 +134,7 @@ describe('Utilities', function () {
});
});
it('input fileSuffix', function () {
assert.deepStrictEqual(['.jpg', '.jpeg', '.jpe'], sharp.format.jpeg.input.fileSuffix);
assert.deepStrictEqual(['.jpg', '.jpeg', '.jpe', '.jfif'], sharp.format.jpeg.input.fileSuffix);
});
it('output alias', function () {
assert.deepStrictEqual(['jpe', 'jpg'], sharp.format.jpeg.output.alias);