diff --git a/packages/backend/package.json b/packages/backend/package.json index bd2c61e2c09..4df6b97497a 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -79,7 +79,7 @@ "@smithy/node-http-handler": "4.7.2", "accepts": "1.3.8", "ajv": "8.20.0", - "archiver": "7.0.1", + "archiver": "8.0.0", "async-mutex": "0.5.0", "bcryptjs": "3.0.3", "blurhash": "2.0.5", @@ -90,7 +90,7 @@ "chalk-template": "1.1.2", "chokidar": "5.0.0", "color-convert": "3.1.3", - "content-disposition": "1.1.0", + "content-disposition": "2.0.0", "date-fns": "4.1.0", "deep-email-validator": "0.1.27", "fastify": "5.8.5", @@ -162,10 +162,7 @@ "@rollup/plugin-esm-shim": "0.1.8", "@sentry/vue": "10.53.1", "@types/accepts": "1.3.7", - "@types/archiver": "7.0.0", "@types/body-parser": "1.19.6", - "@types/color-convert": "3.0.1", - "@types/content-disposition": "0.5.9", "@types/fluent-ffmpeg": "2.1.28", "@types/http-link-header": "1.0.7", "@types/js-yaml": "4.0.9", diff --git a/packages/backend/src/@types/archiver.d.ts b/packages/backend/src/@types/archiver.d.ts new file mode 100644 index 00000000000..1e45620a21b --- /dev/null +++ b/packages/backend/src/@types/archiver.d.ts @@ -0,0 +1,162 @@ +/* + * SPDX-FileCopyrightText: Dolan Miu, Crevil, Piotr Błażejewicz, Michael J Walsh + * SPDX-License-Identifier: MIT + */ + +// TO BE REMOVED: https://github.com/archiverjs/node-archiver/pull/842 + +declare module "archiver" { + /* + * Based on + * https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/archiver/index.d.ts + */ + import * as fs from 'fs'; + import * as stream from 'stream'; + import * as ReaddirGlob from 'readdir-glob'; + import { ZlibOptions } from 'zlib'; + + type Partial = { + [P in keyof T]?: T[P]; + }; + + // This library adds `cwd` to the options + export type GlobOptions = ReaddirGlob.Options & { cwd?: string }; + + export interface EntryData { + /** Sets the entry name including internal path */ + name: string; + /** Sets the entry date */ + date?: Date | string | undefined; + /** Sets the entry permissions */ + mode?: number | undefined; + /** + * Sets a path prefix for the entry name. + * Useful when working with methods like `directory` or `glob` + */ + prefix?: string | undefined; + /** + * Sets the fs stat data for this entry allowing + * for reduction of fs stat calls when stat data is already known + */ + stats?: fs.Stats | undefined; + } + + export interface ZipEntryData extends EntryData { + /** Sets the compression method to STORE */ + store?: boolean | undefined; + } + + export type TarEntryData = EntryData; + + export interface ProgressData { + entries: { + total: number; + processed: number; + }; + fs: { + totalBytes: number; + processedBytes: number; + }; + } + + /** A function that lets you either opt out of including an entry (by returning false), or modify the contents of an entry as it is added (by returning an EntryData) */ + export type EntryDataFunction = (entry: EntryData) => false | EntryData; + + export class ArchiverError extends Error { + code: string; // Since archiver format support is modular, we cannot enumerate all possible error codes, as the modules can throw arbitrary ones. + data: any; + path?: any; + + constructor(code: string, data: any); + } + + export class Archiver extends stream.Transform { + constructor(options?: ArchiverOptions); + + abort(): this; + append( + source: stream.Readable | Buffer | string, + data?: EntryData | ZipEntryData | TarEntryData, + ): this; + + /** + * If false is passed for destpath, the path of a chunk of data in the archive is set + * to the root. If no destpath is provided the dirpath is used. + */ + directory( + dirpath: string, + destpath?: false | string, + data?: Partial | EntryDataFunction, + ): this; + file(filename: string, data: EntryData): this; + glob(pattern: string, options?: GlobOptions, data?: Partial): this; + finalize(): Promise; + + setFormat(format: string): this; + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type + setModule(module: Function): this; + + pointer(): number; + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type + use(plugin: Function): this; + + symlink(filepath: string, target: string, mode?: number): this; + + on( + event: "error" | "warning", + listener: (error: ArchiverError) => void, + ): this; + on(event: "data", listener: (data: Buffer) => void): this; + on(event: "progress", listener: (progress: ProgressData) => void): this; + on(event: "close" | "drain" | "finish", listener: () => void): this; + on(event: "pipe" | "unpipe", listener: (src: stream.Readable) => void): this; + on(event: "entry", listener: (entry: EntryData) => void): this; + on(event: string, listener: (...args: any[]) => void): this; + } + + export type ArchiverOptions = CoreOptions & + TransformOptions & + ZipOptions & + TarOptions; + + export interface CoreOptions { + statConcurrency?: number | undefined; + } + + export interface TransformOptions { + allowHalfOpen?: boolean | undefined; + readableObjectMode?: boolean | undefined; + writeableObjectMode?: boolean | undefined; + decodeStrings?: boolean | undefined; + encoding?: string | undefined; + highWaterMark?: number | undefined; + objectmode?: boolean | undefined; + } + + export interface ZipOptions { + comment?: string | undefined; + forceLocalTime?: boolean | undefined; + forceZip64?: boolean | undefined; + /** @default false */ + namePrependSlash?: boolean | undefined; + store?: boolean | undefined; + zlib?: ZlibOptions | undefined; + } + + export interface TarOptions { + gzip?: boolean | undefined; + gzipOptions?: ZlibOptions | undefined; + } + + export class ZipArchive extends Archiver { + constructor(options?: ArchiverOptions & ZipOptions); + } + + export class TarArchive extends Archiver { + constructor(options?: ArchiverOptions & TarOptions); + } + + export class JsonArchive extends Archiver { + constructor(options?: ArchiverOptions); + } +} diff --git a/packages/backend/src/misc/content-disposition.ts b/packages/backend/src/misc/content-disposition.ts index 467b5057d60..5942a8ebc7c 100644 --- a/packages/backend/src/misc/content-disposition.ts +++ b/packages/backend/src/misc/content-disposition.ts @@ -3,9 +3,9 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import cd from 'content-disposition'; +import { create } from 'content-disposition'; export function contentDisposition(type: 'inline' | 'attachment', filename: string): string { const fallback = filename.replace(/[^\w.-]/g, '_'); - return cd(filename, { type, fallback }); + return create(filename, { type, fallback }); } diff --git a/packages/backend/src/queue/processors/ExportCustomEmojisProcessorService.ts b/packages/backend/src/queue/processors/ExportCustomEmojisProcessorService.ts index 53ecd2d1801..a662a0f281c 100644 --- a/packages/backend/src/queue/processors/ExportCustomEmojisProcessorService.ts +++ b/packages/backend/src/queue/processors/ExportCustomEmojisProcessorService.ts @@ -8,7 +8,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { IsNull } from 'typeorm'; import { format as dateFormat } from 'date-fns'; import mime from 'mime-types'; -import archiver from 'archiver'; +import { ZipArchive } from 'archiver'; import { DI } from '@/di-symbols.js'; import type { EmojisRepository, UsersRepository } from '@/models/_.js'; import type { Config } from '@/config.js'; @@ -126,7 +126,7 @@ export class ExportCustomEmojisProcessorService { const [archivePath, archiveCleanup] = await createTemp(); await new Promise((resolve) => { const archiveStream = fs.createWriteStream(archivePath); - const archive = archiver('zip', { + const archive = new ZipArchive({ zlib: { level: 0 }, }); archiveStream.on('close', async () => { diff --git a/packages/icons-subsetter/package.json b/packages/icons-subsetter/package.json index f354c271c67..8d8cf68a6bc 100644 --- a/packages/icons-subsetter/package.json +++ b/packages/icons-subsetter/package.json @@ -18,7 +18,7 @@ }, "dependencies": { "@tabler/icons-webfont": "3.35.0", - "harfbuzzjs": "0.10.3", + "harfbuzzjs": "1.1.0", "tsx": "4.22.0", "wawoff2": "2.0.1" }, diff --git a/packages/icons-subsetter/src/subsetter.ts b/packages/icons-subsetter/src/subsetter.ts index cd1aed28902..a3d3de22d52 100644 --- a/packages/icons-subsetter/src/subsetter.ts +++ b/packages/icons-subsetter/src/subsetter.ts @@ -11,7 +11,7 @@ export async function generateSubsettedFont(ttfPath: string, unicodeRangeValues: const { instance: { exports: harfbuzzWasm }, - }: any = await WebAssembly.instantiate(await fsp.readFile('./node_modules/harfbuzzjs/hb-subset.wasm')); + }: any = await WebAssembly.instantiate(await fsp.readFile('./node_modules/harfbuzzjs/dist/harfbuzz-subset.wasm')); const heapu8 = new Uint8Array(harfbuzzWasm.memory.buffer); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bb3c1c6d5ab..9c0521e4e0b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -169,8 +169,8 @@ importers: specifier: 8.20.0 version: 8.20.0 archiver: - specifier: 7.0.1 - version: 7.0.1 + specifier: 8.0.0 + version: 8.0.0 async-mutex: specifier: 0.5.0 version: 0.5.0 @@ -202,8 +202,8 @@ importers: specifier: 3.1.3 version: 3.1.3 content-disposition: - specifier: 1.1.0 - version: 1.1.0 + specifier: 2.0.0 + version: 2.0.0 date-fns: specifier: 4.1.0 version: 4.1.0 @@ -412,18 +412,9 @@ importers: '@types/accepts': specifier: 1.3.7 version: 1.3.7 - '@types/archiver': - specifier: 7.0.0 - version: 7.0.0 '@types/body-parser': specifier: 1.19.6 version: 1.19.6 - '@types/color-convert': - specifier: 3.0.1 - version: 3.0.1 - '@types/content-disposition': - specifier: 0.5.9 - version: 0.5.9 '@types/fluent-ffmpeg': specifier: 2.1.28 version: 2.1.28 @@ -1244,8 +1235,8 @@ importers: specifier: 3.35.0 version: 3.35.0 harfbuzzjs: - specifier: 0.10.3 - version: 0.10.3 + specifier: 1.1.0 + version: 1.1.0 tsx: specifier: 4.22.0 version: 4.22.0 @@ -4196,9 +4187,6 @@ packages: '@types/accepts@1.3.7': resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} - '@types/archiver@7.0.0': - resolution: {integrity: sha512-/3vwGwx9n+mCQdYZ2IKGGHEFL30I96UgBlk8EtRDDFQ9uxM1l4O5Ci6r00EMAkiDaTqD9DQ6nVrWRICnBPtzzg==} - '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} @@ -4229,16 +4217,9 @@ packages: '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - '@types/color-convert@3.0.1': - resolution: {integrity: sha512-Wj7O4Y7tPo/3y9z4K0XRLbLBP2hCHq2vlmLkR0uQDGmLdoUVDmUrXy50ZffMxZKzBpYxFT+4FnDT8xzMlnKRQQ==} - deprecated: This is a stub types definition. color-convert provides its own type definitions, so you do not need this installed. - '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/content-disposition@0.5.9': - resolution: {integrity: sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ==} - '@types/cookiejar@2.1.5': resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} @@ -4395,9 +4376,6 @@ packages: '@types/react@19.2.14': resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} - '@types/readdir-glob@1.1.5': - resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==} - '@types/rename@1.0.7': resolution: {integrity: sha512-E9qapfghUGfBMi3jNhsmCKPIp3f2zvNKpaX1BDGLGJNjzpgsZ/RTx7NaNksFjGoJ+r9NvWF1NSM5vVecnNjVmw==} @@ -4911,13 +4889,9 @@ packages: arch@2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - archiver-utils@5.0.2: - resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} - engines: {node: '>= 14'} - - archiver@7.0.1: - resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} - engines: {node: '>= 14'} + archiver@8.0.0: + resolution: {integrity: sha512-fV1orZfsnPn9BaSByR/qE67rJCLJEy2Ox5bq7nJh+jquWaNh6Sfec75kJ2T6PtdGUbPQlrVoSVCEOa5SdiTQ1g==} + engines: {node: '>=18'} are-we-there-yet@2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} @@ -5524,9 +5498,9 @@ packages: component-emitter@1.3.1: resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - compress-commons@6.0.2: - resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} - engines: {node: '>= 14'} + compress-commons@7.0.1: + resolution: {integrity: sha512-g0S8KAD8qf4+V//pr3BfB1aBnARLXNz2Gx+jmHU0LEriUuoQUOPOulVquHKTJ8+EAIIO7fhseNDr9wK5Q9FKBQ==} + engines: {node: '>=18'} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -5555,6 +5529,10 @@ packages: resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} engines: {node: '>=18'} + content-disposition@2.0.0: + resolution: {integrity: sha512-qqGFOrKmFP1lTfG24opOJFcTMza1BqyTSUKVbMGUP5uRsBH+C00Q1loOk+JSFshyRE0ji4HtCJeNN2WHWd6PGw==} + engines: {node: '>=18'} + content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -5595,9 +5573,9 @@ packages: engines: {node: '>=0.8'} hasBin: true - crc32-stream@6.0.0: - resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} - engines: {node: '>= 14'} + crc32-stream@7.0.1: + resolution: {integrity: sha512-IBWsY8xznyQrcHn8h4bC8/4ErNke5elzgG8GcqF4RFPw6aHkWWRc7Tgw6upjaTX/CT/yQgqYENkxYsTYN+hW2g==} + engines: {node: '>=18'} cron-parser@4.9.0: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} @@ -6558,8 +6536,8 @@ packages: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} - harfbuzzjs@0.10.3: - resolution: {integrity: sha512-GJnLUrgLMadlMYrBGEXwYEimObbysy3prWT4HyPpFQERvgTU/OZ+ReUlEPOum6w4RBtFXzXiCCmECOr4sz3qwQ==} + harfbuzzjs@1.1.0: + resolution: {integrity: sha512-2XjwTQIq+Q5ds/DQAo1qubx/KJZSvPw59C2Im+8BsisKjjtTvvOiSVXJuZF/791e01M1o0pG3TDUx6asPBvVqA==} has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} @@ -8696,8 +8674,9 @@ packages: resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + readdir-glob@3.0.0: + resolution: {integrity: sha512-AhNB2KgKeVJr16nK9LLZbJNWnYoT23ZrumNKFDebHBdkC8KHSqWo871JAUhoWC/RtjEVdqNMFpM6qrwRbaUqpw==} + engines: {node: '>=18'} readdirp@5.0.0: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} @@ -10428,9 +10407,9 @@ packages: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} - zip-stream@6.0.1: - resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} - engines: {node: '>= 14'} + zip-stream@7.0.5: + resolution: {integrity: sha512-dSvYKdvLsAHCDqPOhIwk/q5CvuWtTB3Dgpoe0uVEFjTzIOAmsQpprX25InCvrvJsirEbu1OHyy67n/kAj1Sw/w==} + engines: {node: '>=18'} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -13384,10 +13363,6 @@ snapshots: dependencies: '@types/node': 24.12.4 - '@types/archiver@7.0.0': - dependencies: - '@types/readdir-glob': 1.1.5 - '@types/argparse@1.0.38': {} '@types/aria-query@5.0.4': {} @@ -13427,16 +13402,10 @@ snapshots: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 - '@types/color-convert@3.0.1': - dependencies: - color-convert: 3.1.3 - '@types/connect@3.4.38': dependencies: '@types/node': 24.12.4 - '@types/content-disposition@0.5.9': {} - '@types/cookiejar@2.1.5': {} '@types/debug@4.1.13': @@ -13595,10 +13564,6 @@ snapshots: dependencies: csstype: 3.2.3 - '@types/readdir-glob@1.1.5': - dependencies: - '@types/node': 24.12.4 - '@types/rename@1.0.7': {} '@types/resolve@1.20.6': {} @@ -14198,25 +14163,17 @@ snapshots: arch@2.2.0: {} - archiver-utils@5.0.2: + archiver@8.0.0: dependencies: - glob: 10.5.0 - graceful-fs: 4.2.11 - is-stream: 2.0.1 - lazystream: 1.0.1 - lodash: 4.18.1 - normalize-path: 3.0.0 - readable-stream: 4.7.0 - - archiver@7.0.1: - dependencies: - archiver-utils: 5.0.2 async: 3.2.6 buffer-crc32: 1.0.0 + is-stream: 4.0.1 + lazystream: 1.0.1 + normalize-path: 3.0.0 readable-stream: 4.7.0 - readdir-glob: 1.1.3 + readdir-glob: 3.0.0 tar-stream: 3.2.0 - zip-stream: 6.0.1 + zip-stream: 7.0.5 transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -14833,11 +14790,11 @@ snapshots: component-emitter@1.3.1: {} - compress-commons@6.0.2: + compress-commons@7.0.1: dependencies: crc-32: 1.2.2 - crc32-stream: 6.0.0 - is-stream: 2.0.1 + crc32-stream: 7.0.1 + is-stream: 4.0.1 normalize-path: 3.0.0 readable-stream: 4.7.0 @@ -14869,6 +14826,8 @@ snapshots: content-disposition@1.1.0: {} + content-disposition@2.0.0: {} + content-type@1.0.5: {} convert-source-map@2.0.0: {} @@ -14894,7 +14853,7 @@ snapshots: crc-32@1.2.2: {} - crc32-stream@6.0.0: + crc32-stream@7.0.1: dependencies: crc-32: 1.2.2 readable-stream: 4.7.0 @@ -16212,7 +16171,7 @@ snapshots: hard-rejection@2.1.0: {} - harfbuzzjs@0.10.3: {} + harfbuzzjs@1.1.0: {} has-bigints@1.1.0: {} @@ -18535,9 +18494,9 @@ snapshots: process: 0.11.10 string_decoder: 1.3.0 - readdir-glob@1.1.3: + readdir-glob@3.0.0: dependencies: - minimatch: 5.1.9 + minimatch: 10.2.5 readdirp@5.0.0: {} @@ -20340,10 +20299,10 @@ snapshots: yoctocolors@2.1.2: {} - zip-stream@6.0.1: + zip-stream@7.0.5: dependencies: - archiver-utils: 5.0.2 - compress-commons: 6.0.2 + compress-commons: 7.0.1 + normalize-path: 3.0.0 readable-stream: 4.7.0 zwitch@2.0.4: {}