diff --git a/packages/core/package.json b/packages/core/package.json index 44282d0c..ddbabd6f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -20,7 +20,7 @@ "@jimp/utils": "workspace:*", "await-to-js": "^3.0.0", "exif-parser": "^0.1.12", - "file-type": "^16.0.0", + "file-type": "^19.6.0", "mime": "3" }, "devDependencies": { diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 5d1e322f..acbe8b41 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,6 +1,6 @@ import { Bitmap, Format, JimpClass, Edge } from "@jimp/types"; import { cssColorToHex, scan, scanIterator } from "@jimp/utils"; -import fileType from "file-type/core.js"; +import { fileTypeFromBuffer } from "./utils/fileTypeFromBuffer.js"; import { to } from "await-to-js"; import { existsSync, readFile, writeFile } from "@jimp/file-ops"; import mime from "mime/lite.js"; @@ -90,7 +90,7 @@ export interface JimpPlugin { } type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ( - k: infer I + k: infer I, ) => void ? I : never; @@ -225,7 +225,7 @@ export function createJimp< */ static async read( url: string | Buffer | ArrayBuffer, - options?: MimeTypeToDecodeOptions + options?: MimeTypeToDecodeOptions, ) { if (Buffer.isBuffer(url) || url instanceof ArrayBuffer) { return this.fromBuffer(url); @@ -292,8 +292,8 @@ export function createJimp< if (Array.isArray(bitmap.data)) { data = Buffer.concat( bitmap.data.map((hex) => - Buffer.from(hex.toString(16).padStart(8, "0"), "hex") - ) + Buffer.from(hex.toString(16).padStart(8, "0"), "hex"), + ), ); } @@ -329,12 +329,12 @@ export function createJimp< */ static async fromBuffer( buffer: Buffer | ArrayBuffer, - options?: MimeTypeToDecodeOptions + options?: MimeTypeToDecodeOptions, ) { const actualBuffer = buffer instanceof ArrayBuffer ? bufferFromArrayBuffer(buffer) : buffer; - const mime = await fileType.fromBuffer(actualBuffer); + const mime = await fileTypeFromBuffer(actualBuffer); if (!mime || !mime.mime) { throw new Error("Could not find MIME for Buffer"); @@ -347,7 +347,7 @@ export function createJimp< } const image = new CustomJimp( - await format.decode(actualBuffer, options?.[format.mime]) + await format.decode(actualBuffer, options?.[format.mime]), ) as InstanceType & ExtraMethodMap; image.mime = mime.mime; @@ -500,7 +500,7 @@ export function createJimp< const mimeType = mime.getType(path); await writeFile( path, - await this.getBuffer(mimeType as SupportedMimeTypes, options) + await this.getBuffer(mimeType as SupportedMimeTypes, options), ); } @@ -701,7 +701,7 @@ export function createJimp< mode?: BlendMode; opacitySource?: number; opacityDest?: number; - } = {} + } = {}, ) { return composite(this, src, x, y, options); } @@ -731,14 +731,14 @@ export function createJimp< y: number, w: number, h: number, - cb: (x: number, y: number, idx: number) => any + cb: (x: number, y: number, idx: number) => any, ): this; scan( x: number | ((x: number, y: number, idx: number) => any), y?: number, w?: number, h?: number, - f?: (x: number, y: number, idx: number) => any + f?: (x: number, y: number, idx: number) => any, ): this { return scan(this, x as any, y as any, w as any, h as any, f as any); } diff --git a/packages/core/src/utils/composite.ts b/packages/core/src/utils/composite.ts index 3dd7fd96..d134f5d5 100644 --- a/packages/core/src/utils/composite.ts +++ b/packages/core/src/utils/composite.ts @@ -13,7 +13,7 @@ export function composite( mode?: BlendMode; opacitySource?: number; opacityDest?: number; - } = {} + } = {}, ) { if (!(src instanceof baseImage.constructor)) { throw new Error("The source must be a Jimp image"); @@ -72,7 +72,7 @@ export function composite( b: baseImage.bitmap.data[dstIdx + 2]! / 255, a: baseImage.bitmap.data[dstIdx + 3]! / 255, }, - opacitySource + opacitySource, ); baseImage.bitmap.data[dstIdx + 0] = limit255(blended.r * 255); diff --git a/packages/core/src/utils/fileTypeFromBuffer.ts b/packages/core/src/utils/fileTypeFromBuffer.ts new file mode 100644 index 00000000..aadd1dc1 --- /dev/null +++ b/packages/core/src/utils/fileTypeFromBuffer.ts @@ -0,0 +1,6 @@ +export const fileTypeFromBuffer = async ( + buffer: Uint8Array | ArrayBuffer +) => { + const { fileTypeFromBuffer } = await import("file-type/core"); + return await fileTypeFromBuffer(buffer); +}; \ No newline at end of file diff --git a/packages/core/src/utils/image-bitmap.ts b/packages/core/src/utils/image-bitmap.ts index c7055e78..668b2d9a 100644 --- a/packages/core/src/utils/image-bitmap.ts +++ b/packages/core/src/utils/image-bitmap.ts @@ -89,7 +89,7 @@ function transformBitmap( img: I, width: number, height: number, - transformation: (x: number, y: number) => readonly [number, number] + transformation: (x: number, y: number) => readonly [number, number], ) { // Underscore-prefixed values are related to the source bitmap // Their counterparts with no prefix are related to the target bitmap @@ -140,7 +140,7 @@ function exifRotate(img: I) { export async function attemptExifRotate( image: I, - buffer: Buffer + buffer: Buffer, ) { try { (image as unknown as { _exif: ExifData })._exif = diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ecab2b05..52839544 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -109,8 +109,8 @@ importers: specifier: ^0.1.12 version: 0.1.12 file-type: - specifier: ^16.0.0 - version: 16.5.4 + specifier: ^19.6.0 + version: 19.6.0 mime: specifier: '3' version: 3.0.0 @@ -2777,6 +2777,9 @@ packages: cpu: [x64] os: [win32] + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@shikijs/core@1.15.2': resolution: {integrity: sha512-hi6XZuwHYn6bU4wtXZxST8ynM55aiU2+rVU9aPIrSxqKmEKl4d65puwGsggwcZWTET+7zGXKe7AUj46iQ8Aq8w==} @@ -4074,9 +4077,9 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - file-type@16.5.4: - resolution: {integrity: sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==} - engines: {node: '>=10'} + file-type@19.6.0: + resolution: {integrity: sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==} + engines: {node: '>=18'} fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} @@ -4198,6 +4201,10 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} @@ -4664,6 +4671,10 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -5537,9 +5548,9 @@ packages: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} - peek-readable@4.1.0: - resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} - engines: {node: '>=8'} + peek-readable@5.4.2: + resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} + engines: {node: '>=14.16'} pegjs@0.10.0: resolution: {integrity: sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow==} @@ -5750,10 +5761,6 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} - readable-web-to-node-stream@3.0.2: - resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} - engines: {node: '>=8'} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -6232,9 +6239,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strtok3@6.3.0: - resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} - engines: {node: '>=10'} + strtok3@9.1.1: + resolution: {integrity: sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==} + engines: {node: '>=16'} style-to-object@0.4.4: resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} @@ -6332,9 +6339,9 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - token-types@4.2.1: - resolution: {integrity: sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==} - engines: {node: '>=10'} + token-types@6.0.0: + resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} + engines: {node: '>=14.16'} totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} @@ -6530,6 +6537,10 @@ packages: engines: {node: '>=0.8.0'} hasBin: true + uint8array-extras@1.4.0: + resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} + engines: {node: '>=18'} + ultrahtml@1.5.3: resolution: {integrity: sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==} @@ -8139,6 +8150,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.21.2': optional: true + '@sec-ant/readable-stream@0.4.1': {} + '@shikijs/core@1.15.2': dependencies: '@types/hast': 3.0.4 @@ -8265,7 +8278,7 @@ snapshots: '@types/file-type@10.9.1': dependencies: - file-type: 16.5.4 + file-type: 19.6.0 '@types/glob@7.2.0': dependencies: @@ -8505,23 +8518,6 @@ snapshots: - typescript - utf-8-validate - '@vitest/browser@2.0.5(typescript@5.5.4)(vitest@2.0.5)': - dependencies: - '@testing-library/dom': 10.4.0 - '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) - '@vitest/utils': 2.0.5 - magic-string: 0.30.11 - msw: 2.4.1(typescript@5.5.4) - sirv: 2.0.4 - vitest: 2.0.5(@types/node@18.19.48)(@vitest/browser@2.0.5)(terser@5.30.3) - ws: 8.18.0 - transitivePeerDependencies: - - bufferutil - - graphql - - typescript - - utf-8-validate - optional: true - '@vitest/expect@2.0.5': dependencies: '@vitest/spy': 2.0.5 @@ -9826,11 +9822,12 @@ snapshots: dependencies: flat-cache: 4.0.1 - file-type@16.5.4: + file-type@19.6.0: dependencies: - readable-web-to-node-stream: 3.0.2 - strtok3: 6.3.0 - token-types: 4.2.1 + get-stream: 9.0.1 + strtok3: 9.1.1 + token-types: 6.0.0 + uint8array-extras: 1.4.0 fill-range@7.0.1: dependencies: @@ -9945,6 +9942,11 @@ snapshots: get-stream@8.0.1: {} + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 @@ -10579,6 +10581,8 @@ snapshots: is-stream@3.0.0: {} + is-stream@4.0.1: {} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 @@ -11785,7 +11789,7 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 - peek-readable@4.1.0: {} + peek-readable@5.4.2: {} pegjs@0.10.0: {} @@ -11988,10 +11992,6 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - readable-web-to-node-stream@3.0.2: - dependencies: - readable-stream: 3.6.2 - readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -12586,10 +12586,10 @@ snapshots: strip-json-comments@3.1.1: {} - strtok3@6.3.0: + strtok3@9.1.1: dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 4.1.0 + peek-readable: 5.4.2 style-to-object@0.4.4: dependencies: @@ -12688,7 +12688,7 @@ snapshots: dependencies: is-number: 7.0.0 - token-types@4.2.1: + token-types@6.0.0: dependencies: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 @@ -12882,6 +12882,8 @@ snapshots: uglify-js@3.17.4: optional: true + uint8array-extras@1.4.0: {} + ultrahtml@1.5.3: {} unbox-primitive@1.0.2: @@ -13144,7 +13146,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 18.19.48 - '@vitest/browser': 2.0.5(typescript@5.5.4)(vitest@2.0.5) + '@vitest/browser': 2.0.5(playwright@1.46.1)(typescript@5.5.4)(vitest@2.0.5) transitivePeerDependencies: - less - lightningcss @@ -13178,7 +13180,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.5.2 - '@vitest/browser': 2.0.5(typescript@5.5.4)(vitest@2.0.5) + '@vitest/browser': 2.0.5(playwright@1.46.1)(typescript@5.5.4)(vitest@2.0.5) transitivePeerDependencies: - less - lightningcss