diff --git a/examples/api-samples/src/browser-only/filesystem/example-filesystem-initialization.ts b/examples/api-samples/src/browser-only/filesystem/example-filesystem-initialization.ts index f048231f977a5..8d439c411c4fc 100644 --- a/examples/api-samples/src/browser-only/filesystem/example-filesystem-initialization.ts +++ b/examples/api-samples/src/browser-only/filesystem/example-filesystem-initialization.ts @@ -19,7 +19,7 @@ import { inject, injectable, interfaces } from '@theia/core/shared/inversify'; import { EncodingService } from '@theia/core/lib/common/encoding-service'; import { BrowserFSInitialization, DefaultBrowserFSInitialization } from '@theia/filesystem/lib/browser-only/browserfs-filesystem-initialization'; import { BrowserFSFileSystemProvider } from '@theia/filesystem/lib/browser-only/browserfs-filesystem-provider'; -import type { FSModule } from 'browserfs/dist/node/core/FS'; +import { fs } from '@zenfs/core'; @injectable() export class ExampleBrowserFSInitialization extends DefaultBrowserFSInitialization { @@ -27,7 +27,7 @@ export class ExampleBrowserFSInitialization extends DefaultBrowserFSInitializati @inject(EncodingService) protected encodingService: EncodingService; - override async initializeFS(fs: FSModule, provider: BrowserFSFileSystemProvider): Promise { + override async initializeFS(provider: BrowserFSFileSystemProvider): Promise { try { if (!fs.existsSync('/home/workspace')) { await provider.mkdir(new URI('/home/workspace')); diff --git a/packages/filesystem/package.json b/packages/filesystem/package.json index 7c1a60322c673..855f65f137dad 100644 --- a/packages/filesystem/package.json +++ b/packages/filesystem/package.json @@ -10,7 +10,8 @@ "@types/tar-fs": "^1.16.1", "async-mutex": "^0.3.1", "body-parser": "^1.18.3", - "browserfs": "^1.4.3", + "@zenfs/core": "^0.16.4", + "@zenfs/dom": "^0.2.14", "http-status-codes": "^1.3.0", "minimatch": "^5.1.0", "multer": "1.4.4-lts.1", diff --git a/packages/filesystem/src/browser-only/browserfs-filesystem-initialization.ts b/packages/filesystem/src/browser-only/browserfs-filesystem-initialization.ts index 0b17d3076a468..d8af9c17a06d6 100644 --- a/packages/filesystem/src/browser-only/browserfs-filesystem-initialization.ts +++ b/packages/filesystem/src/browser-only/browserfs-filesystem-initialization.ts @@ -14,48 +14,29 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 // ***************************************************************************** -import type { FSModule } from 'browserfs/dist/node/core/FS'; import type { BrowserFSFileSystemProvider } from './browserfs-filesystem-provider'; import { injectable } from '@theia/core/shared/inversify'; -import { FileSystem, initialize } from 'browserfs'; -import MountableFileSystem from 'browserfs/dist/node/backend/MountableFileSystem'; +import { configure } from '@zenfs/core'; +import { IndexedDB } from '@zenfs/dom'; export const BrowserFSInitialization = Symbol('BrowserFSInitialization'); export interface BrowserFSInitialization { - createMountableFileSystem(): Promise - initializeFS: (fs: FSModule, provider: BrowserFSFileSystemProvider) => Promise; + createMountableFileSystem(): Promise + initializeFS: (provider: BrowserFSFileSystemProvider) => Promise; } @injectable() export class DefaultBrowserFSInitialization implements BrowserFSInitialization { - createMountableFileSystem(): Promise { - return new Promise(resolve => { - FileSystem.IndexedDB.Create({}, (e, persistedFS) => { - if (e) { - throw e; - } - if (!persistedFS) { - throw Error('Could not create filesystem'); - } - FileSystem.MountableFileSystem.Create({ - '/home': persistedFS - - }, (error, mountableFS) => { - if (error) { - throw error; - } - if (!mountableFS) { - throw Error('Could not create filesystem'); - } - initialize(mountableFS); - resolve(mountableFS); - }); - }); + createMountableFileSystem(): Promise { + return configure({ + mounts: { + '/home': IndexedDB, + } }); } - async initializeFS(fs: FSModule, provider: BrowserFSFileSystemProvider): Promise { + async initializeFS(provider: BrowserFSFileSystemProvider): Promise { } } diff --git a/packages/filesystem/src/browser-only/browserfs-filesystem-provider.ts b/packages/filesystem/src/browser-only/browserfs-filesystem-provider.ts index ca833d9536313..65eb717f29a10 100644 --- a/packages/filesystem/src/browser-only/browserfs-filesystem-provider.ts +++ b/packages/filesystem/src/browser-only/browserfs-filesystem-provider.ts @@ -33,14 +33,10 @@ import { import { Event, URI, Disposable, CancellationToken } from '@theia/core'; import { TextDocumentContentChangeEvent } from '@theia/core/shared/vscode-languageserver-protocol'; import { ReadableStreamEvents } from '@theia/core/lib/common/stream'; -import { BFSRequire } from 'browserfs'; -import type { FSModule } from 'browserfs/dist/node/core/FS'; -import type { FileSystem } from 'browserfs/dist/node/core/file_system'; -import MountableFileSystem from 'browserfs/dist/node/backend/MountableFileSystem'; import { basename, dirname, normalize } from 'path'; -import Stats from 'browserfs/dist/node/core/node_fs_stats'; import { retry } from '@theia/core/lib/common/promise-util'; import { BrowserFSInitialization } from './browserfs-filesystem-initialization'; +import { fs, Stats } from '@zenfs/core'; // adapted from DiskFileSystemProvider @injectable() @@ -53,15 +49,12 @@ export class BrowserFSFileSystemProvider implements FileSystemProviderWithFileRe private writeHandles: Set = new Set(); private canFlush: boolean = true; - private fs: FSModule; - private mountableFS: MountableFileSystem; private initialized: Promise; constructor(@inject(BrowserFSInitialization) readonly initialization: BrowserFSInitialization) { const init = async (): Promise => { - this.mountableFS = await initialization.createMountableFileSystem(); - this.fs = BFSRequire('fs'); - await initialization.initializeFS(this.fs, new Proxy(this, { + await initialization.createMountableFileSystem(); + await initialization.initializeFS(new Proxy(this, { get(target, prop, receiver): unknown { if (prop === 'initialized') { return Promise.resolve(true); @@ -74,11 +67,6 @@ export class BrowserFSFileSystemProvider implements FileSystemProviderWithFileRe this.initialized = init(); } - async mount(mountPoint: string, fs: FileSystem): Promise { - await this.initialized; - this.mountableFS.mount(mountPoint, fs); - }; - watch(_resource: URI, _opts: WatchOptions): Disposable { return Disposable.NULL; } @@ -88,7 +76,7 @@ export class BrowserFSFileSystemProvider implements FileSystemProviderWithFileRe let stats: Stats; try { - stats = await this.promisify(this.fs.stat)(path) as Stats; + stats = await fs.promises.stat(path) as Stats; } catch (error) { throw this.toFileSystemProviderError(error); } @@ -107,7 +95,7 @@ export class BrowserFSFileSystemProvider implements FileSystemProviderWithFileRe async mkdir(resource: URI): Promise { await this.initialized; try { - await this.promisify(this.fs.mkdir)(this.toFilePath(resource)); + await fs.promises.mkdir(this.toFilePath(resource)); } catch (error) { throw this.toFileSystemProviderError(error); } @@ -116,7 +104,7 @@ export class BrowserFSFileSystemProvider implements FileSystemProviderWithFileRe await this.initialized; try { - const children = await this.promisify(this.fs.readdir)(this.toFilePath(resource)) as string[]; + const children = await fs.promises.readdir(this.toFilePath(resource)) as string[]; const result: [string, FileType][] = []; await Promise.all(children.map(async child => { try { @@ -136,7 +124,7 @@ export class BrowserFSFileSystemProvider implements FileSystemProviderWithFileRe await this.initialized; // FIXME use options try { - await this.promisify(this.fs.unlink)(this.toFilePath(resource)); + await fs.promises.unlink(this.toFilePath(resource)); } catch (error) { throw this.toFileSystemProviderError(error); } @@ -150,7 +138,7 @@ export class BrowserFSFileSystemProvider implements FileSystemProviderWithFileRe } try { // assume FS is path case sensitive - correct? - const targetExists = await this.promisify(this.fs.exists)(toFilePath); + const targetExists = await fs.promises.exists(toFilePath); if (targetExists) { throw Error(`File '${toFilePath}' already exists.`); } @@ -158,20 +146,20 @@ export class BrowserFSFileSystemProvider implements FileSystemProviderWithFileRe return Promise.resolve(); } - await this.promisify(this.fs.rename)(fromFilePath, toFilePath); + await fs.promises.rename(fromFilePath, toFilePath); - const stat = await this.promisify(this.fs.lstat)(toFilePath) as Stats; + const stat = await fs.promises.lstat(toFilePath) as Stats; if (stat.isDirectory() || stat.isSymbolicLink()) { return Promise.resolve(); // only for files } - const fd = await this.promisify(open)(toFilePath, 'a'); + const file_handle = await fs.promises.open(toFilePath, 'a'); try { - await this.promisify(this.fs.futimes)(fd, stat.atime, new Date()); + await file_handle.utimes(stat.atime, new Date()); } catch (error) { // ignore } - this.promisify(this.fs.close)(fd); + file_handle.close(); } catch (error) { // rewrite some typical errors that can happen especially around symlinks // to something the user can better understand @@ -190,7 +178,7 @@ export class BrowserFSFileSystemProvider implements FileSystemProviderWithFileRe await this.initialized; try { const filePath = this.toFilePath(resource); - return await this.promisify(this.fs.readFile)(filePath) as Uint8Array; + return await fs.promises.readFile(filePath) as Uint8Array; } catch (error) { throw this.toFileSystemProviderError(error); } @@ -203,7 +191,7 @@ export class BrowserFSFileSystemProvider implements FileSystemProviderWithFileRe // Validate target unless { create: true, overwrite: true } if (!opts.create || !opts.overwrite) { - const fileExists = await this.promisify(this.fs.exists)(filePath); + const fileExists = await fs.promises.exists(filePath); if (fileExists) { if (!opts.overwrite) { throw createFileSystemProviderError('File already exists', FileSystemProviderErrorCode.FileExists); @@ -251,7 +239,7 @@ export class BrowserFSFileSystemProvider implements FileSystemProviderWithFileRe flags = 'r'; } - const handle = await this.promisify(this.fs.open)(filePath, flags) as number; + const handle = (await fs.promises.open(filePath, flags)).fd; // remember this handle to track file position of the handle // we init the position to 0 since the file descriptor was @@ -279,7 +267,7 @@ export class BrowserFSFileSystemProvider implements FileSystemProviderWithFileRe // to flush the contents to disk if possible. if (this.writeHandles.delete(fd) && this.canFlush) { try { - await this.promisify(this.fs.fdatasync)(fd); + await this.promisify(fs.fdatasync)(fd); } catch (error) { // In some exotic setups it is well possible that node fails to sync // In that case we disable flushing and log the error to our logger @@ -288,7 +276,7 @@ export class BrowserFSFileSystemProvider implements FileSystemProviderWithFileRe } } - await this.promisify(this.fs.close)(fd); + await this.promisify(fs.close)(fd); } async read(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise { await this.initialized; @@ -297,7 +285,7 @@ export class BrowserFSFileSystemProvider implements FileSystemProviderWithFileRe let bytesRead: number | null = null; try { // eslint-disable-next-line @typescript-eslint/no-explicit-any - const result: { bytesRead: number, buffer: Uint8Array } | number = (await this.promisify(this.fs.read)(fd, data, offset, length, normalizedPos)) as any; + const result: { bytesRead: number, buffer: Uint8Array } | number = (await this.promisify(fs.read)(fd, data, offset, length, normalizedPos)) as any; if (typeof result === 'number') { bytesRead = result; // node.d.ts fail @@ -327,7 +315,7 @@ export class BrowserFSFileSystemProvider implements FileSystemProviderWithFileRe let bytesWritten: number | null = null; try { // eslint-disable-next-line @typescript-eslint/no-explicit-any - const result: { bytesWritten: number, buffer: Uint8Array } | number = (await this.promisify(this.fs.write)(fd, data, offset, length, normalizedPos)) as any; + const result: { bytesWritten: number, buffer: Uint8Array } | number = (await this.promisify(fs.write)(fd, data, offset, length, normalizedPos)) as any; if (typeof result === 'number') { bytesWritten = result; // node.d.ts fail diff --git a/yarn.lock b/yarn.lock index 881c9757b4b88..7c583b392ee68 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2141,7 +2141,7 @@ "@types/node" "*" form-data "^4.0.0" -"@types/node@*", "@types/node@18", "@types/node@>=10.0.0", "@types/node@^10.14.22", "@types/node@^18.11.18", "@types/node@^20.9.0": +"@types/node@*", "@types/node@18", "@types/node@>=10.0.0", "@types/node@^10.14.22", "@types/node@^18.11.18", "@types/node@^20.12.12", "@types/node@^20.9.0": version "18.19.18" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.18.tgz#7526471b28828d1fef1f7e4960fb9477e6e4369c" integrity sha512-80CP7B8y4PzZF0GWx15/gVWRrB5y/bIjNI84NK3cmQJu0WZwvmj2WMA5LcofQFVfLqqCSp545+U2LsrVzX36Zg== @@ -2201,6 +2201,14 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/readable-stream@^4.0.10": + version "4.0.15" + resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-4.0.15.tgz#e6ec26fe5b02f578c60baf1fa9452e90957d2bfb" + integrity sha512-oAZ3kw+kJFkEqyh7xORZOku1YAKvsFTogRY8kVl4vHpEKiDkfnSA/My8haRE7fvmix5Zyy+1pwzOi7yycGLBJw== + dependencies: + "@types/node" "*" + safe-buffer "~5.1.1" + "@types/readdir-glob@*": version "1.1.5" resolved "https://registry.yarnpkg.com/@types/readdir-glob/-/readdir-glob-1.1.5.tgz#21a4a98898fc606cb568ad815f2a0eedc24d412a" @@ -2749,6 +2757,24 @@ js-yaml "^3.10.0" tslib "^2.4.0" +"@zenfs/core@^0.16.4": + version "0.16.4" + resolved "https://registry.yarnpkg.com/@zenfs/core/-/core-0.16.4.tgz#38626114ec5c60963eb7436f15b3e9fab3c3e8b1" + integrity sha512-QYT0tB3iHWo6q4KlSTl1zr2LWLgayNOHGPw5x+s926weH3Nrnw2Npe2gfLK05UFvXhhTynee8DgYGjFhgqBUmg== + dependencies: + "@types/node" "^20.12.12" + "@types/readable-stream" "^4.0.10" + buffer "^6.0.3" + eventemitter3 "^5.0.1" + minimatch "^9.0.3" + readable-stream "^4.5.2" + utilium "^0.4.0" + +"@zenfs/dom@^0.2.14": + version "0.2.14" + resolved "https://registry.yarnpkg.com/@zenfs/dom/-/dom-0.2.14.tgz#69d787fc594698463dc0b3fe598d51a44dd3b0b8" + integrity sha512-2HRjrCUE7GsrZrZX0PACdbY+REt2n/aOykjPj4NdaxdP9f8M8w98E/2V5sa0KjGzgyhzMEF5FjJd0begPx8xHw== + "@zkochan/js-yaml@0.0.6": version "0.0.6" resolved "https://registry.yarnpkg.com/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz#975f0b306e705e28b8068a07737fa46d3fc04826" @@ -2774,6 +2800,13 @@ abbrev@^1.0.0: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -3243,7 +3276,7 @@ async-mutex@^0.4.0: dependencies: tslib "^2.4.0" -async@^2.1.4, async@^2.6.4: +async@^2.6.4: version "2.6.4" resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== @@ -3530,14 +3563,6 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserfs@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/browserfs/-/browserfs-1.4.3.tgz#92ffc6063967612daccdb8566d3fc03f521205fb" - integrity sha512-tz8HClVrzTJshcyIu8frE15cjqjcBIu15Bezxsvl/i+6f59iNCN3kznlWjz0FEb3DlnDx3gW5szxeT6D1x0s0w== - dependencies: - async "^2.1.4" - pako "^1.0.4" - browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.22.3: version "4.23.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" @@ -5472,12 +5497,22 @@ event-stream@=3.3.4: stream-combiner "~0.0.4" through "~2.3.1" +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + eventemitter3@^4.0.0, eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.2.0: +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -8185,6 +8220,13 @@ minimatch@^8.0.2: dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.3: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -9303,11 +9345,6 @@ pacote@^15.2.0: ssri "^10.0.0" tar "^6.1.11" -pako@^1.0.4: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -9727,6 +9764,11 @@ process-on-spawn@^1.0.0: dependencies: fromentries "^1.2.0" +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + progress@2.0.3, progress@^2.0.0, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -10101,6 +10143,17 @@ readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" + integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + readdir-glob@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.3.tgz#c3d831f51f5e7bfa62fa2ffbe4b508c640f09584" @@ -11047,7 +11100,7 @@ string-argv@^0.1.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.1.2.tgz#c5b7bc03fb2b11983ba3a72333dd0559e77e4738" integrity sha512-mBqPGEOMNJKXRo7z0keX0wlAhbBAjilUdPW13nN0PecVryZxdHIeM7TqbsSUA7VYuS00HGC6mojP7DlQzfa9ZA== -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -11065,6 +11118,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -11116,7 +11178,7 @@ string.prototype.trimstart@^1.0.7: define-properties "^1.2.0" es-abstract "^1.22.1" -string_decoder@^1.1.1: +string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -11130,7 +11192,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -11151,6 +11213,13 @@ strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -11988,6 +12057,13 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +utilium@^0.4.0: + version "0.4.4" + resolved "https://registry.yarnpkg.com/utilium/-/utilium-0.4.4.tgz#86f51a6d559f8f851c5a32fa630195fcae011c90" + integrity sha512-TjhvLLoSi3WmzAR1QMFwGykW31cEOzbVoPqqopY6UYcm+5MfsF0ep3+DuJmAnOlU/zglGDwR96j0hjiHfwP4og== + dependencies: + eventemitter3 "^5.0.1" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -12351,7 +12427,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -12369,6 +12445,15 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"