From 6fc340d83544d04c35f62bc0fa7aadf77266af12 Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Sun, 18 Feb 2024 11:06:31 +1300 Subject: [PATCH 01/37] fix: inline `thingies` dependency (#1004) * fix: inline `thingies` * fix: remove unneeded code * chore: don't apply prettier to `thingies` code * refactor: inline `tick` and `until` functions --- .prettierignore | 1 + package.json | 1 - src/__tests__/volume/readFile.test.ts | 2 +- src/crud-to-cas/__tests__/testCasfs.ts | 2 +- src/crud/__tests__/testCrudfs.ts | 2 +- src/fsa-to-node/FsaNodeReadStream.ts | 4 +-- src/fsa-to-node/FsaNodeWriteStream.ts | 4 +-- src/fsa-to-node/__tests__/FsaNodeFs.test.ts | 11 +++++- .../worker/FsaNodeSyncAdapterWorker.ts | 2 +- src/thingies/Defer.ts | 20 +++++++++++ src/thingies/concurrency.ts | 36 +++++++++++++++++++ src/thingies/go.ts | 6 ++++ src/thingies/index.ts | 4 +++ src/thingies/of.ts | 16 +++++++++ src/thingies/types.ts | 1 + yarn.lock | 5 --- 16 files changed, 102 insertions(+), 15 deletions(-) create mode 100644 src/thingies/Defer.ts create mode 100644 src/thingies/concurrency.ts create mode 100644 src/thingies/go.ts create mode 100644 src/thingies/index.ts create mode 100644 src/thingies/of.ts create mode 100644 src/thingies/types.ts diff --git a/.prettierignore b/.prettierignore index 2b3239020..acf094367 100644 --- a/.prettierignore +++ b/.prettierignore @@ -11,3 +11,4 @@ package-lock.json CHANGELOG.md src/json-joy +src/thingies diff --git a/package.json b/package.json index dc617f13d..056881be1 100644 --- a/package.json +++ b/package.json @@ -121,7 +121,6 @@ } }, "dependencies": { - "thingies": "^1.11.1", "tslib": "^2.0.0" }, "devDependencies": { diff --git a/src/__tests__/volume/readFile.test.ts b/src/__tests__/volume/readFile.test.ts index 16d5af9a0..45d4a3902 100644 --- a/src/__tests__/volume/readFile.test.ts +++ b/src/__tests__/volume/readFile.test.ts @@ -1,4 +1,4 @@ -import { of } from 'thingies'; +import { of } from '../../thingies'; import { memfs } from '../..'; describe('.readFile()', () => { diff --git a/src/crud-to-cas/__tests__/testCasfs.ts b/src/crud-to-cas/__tests__/testCasfs.ts index b03c5ac81..16c7f5cda 100644 --- a/src/crud-to-cas/__tests__/testCasfs.ts +++ b/src/crud-to-cas/__tests__/testCasfs.ts @@ -1,4 +1,4 @@ -import { of } from 'thingies'; +import { of } from '../../thingies'; import { createHash } from 'crypto'; import { hashToLocation } from '../util'; import type { CasApi } from '../../cas/types'; diff --git a/src/crud/__tests__/testCrudfs.ts b/src/crud/__tests__/testCrudfs.ts index b5c2d9883..433fe2510 100644 --- a/src/crud/__tests__/testCrudfs.ts +++ b/src/crud/__tests__/testCrudfs.ts @@ -1,4 +1,4 @@ -import { of } from 'thingies'; +import { of } from '../../thingies'; import type { CrudApi } from '../types'; export type Setup = () => { diff --git a/src/fsa-to-node/FsaNodeReadStream.ts b/src/fsa-to-node/FsaNodeReadStream.ts index f9ffc1ab0..0949d13bb 100644 --- a/src/fsa-to-node/FsaNodeReadStream.ts +++ b/src/fsa-to-node/FsaNodeReadStream.ts @@ -1,6 +1,6 @@ import { Readable } from 'stream'; -import { Defer } from 'thingies/es6/Defer'; -import { concurrency } from 'thingies/es6/concurrency'; +import { Defer } from '../thingies/Defer'; +import { concurrency } from '../thingies/concurrency'; import type { FsaNodeFsOpenFile } from './FsaNodeFsOpenFile'; import type { IReadStream } from '../node/types/misc'; import type { IReadStreamOptions } from '../node/types/options'; diff --git a/src/fsa-to-node/FsaNodeWriteStream.ts b/src/fsa-to-node/FsaNodeWriteStream.ts index 7b45ee77b..1d89eb222 100644 --- a/src/fsa-to-node/FsaNodeWriteStream.ts +++ b/src/fsa-to-node/FsaNodeWriteStream.ts @@ -1,6 +1,6 @@ import { Writable } from 'stream'; -import { Defer } from 'thingies/es6/Defer'; -import { concurrency } from 'thingies/es6/concurrency'; +import { Defer } from '../thingies/Defer'; +import { concurrency } from '../thingies/concurrency'; import { flagsToNumber } from '../node/util'; import { FLAG } from '../consts/FLAG'; import { FsaNodeFsOpenFile } from './FsaNodeFsOpenFile'; diff --git a/src/fsa-to-node/__tests__/FsaNodeFs.test.ts b/src/fsa-to-node/__tests__/FsaNodeFs.test.ts index 239a98bdb..052846f80 100644 --- a/src/fsa-to-node/__tests__/FsaNodeFs.test.ts +++ b/src/fsa-to-node/__tests__/FsaNodeFs.test.ts @@ -3,10 +3,19 @@ import { AMODE } from '../../consts/AMODE'; import { nodeToFsa } from '../../node-to-fsa'; import { IDirent, IStats } from '../../node/types/misc'; import { FsaNodeFs } from '../FsaNodeFs'; -import { tick, until, of } from 'thingies'; +import { of } from '../../thingies'; import { onlyOnNode20 } from '../../__tests__/util'; import { FLAG } from '../../consts/FLAG'; +const tick = (ms: number = 1) => new Promise(r => setTimeout(r, ms)); + +const until = async (check: () => boolean | Promise, pollInterval: number = 1) => { + do { + if (await check()) return; + await tick(pollInterval); + } while (true); +}; + const setup = (json: NestedDirectoryJSON | null = null, mode: 'read' | 'readwrite' = 'readwrite') => { const { fs: mfs, vol } = memfs({ mountpoint: json }); const dir = nodeToFsa(mfs, '/mountpoint', { mode, syncHandleAllowed: true }); diff --git a/src/fsa-to-node/worker/FsaNodeSyncAdapterWorker.ts b/src/fsa-to-node/worker/FsaNodeSyncAdapterWorker.ts index 1f8c4296f..a59d20c7b 100644 --- a/src/fsa-to-node/worker/FsaNodeSyncAdapterWorker.ts +++ b/src/fsa-to-node/worker/FsaNodeSyncAdapterWorker.ts @@ -1,4 +1,4 @@ -import { Defer } from 'thingies/es6/Defer'; +import { Defer } from '../../thingies/Defer'; import { FsaNodeWorkerMessageCode } from './constants'; import { SyncMessenger } from './SyncMessenger'; import { decoder, encoder } from '../json'; diff --git a/src/thingies/Defer.ts b/src/thingies/Defer.ts new file mode 100644 index 000000000..545037522 --- /dev/null +++ b/src/thingies/Defer.ts @@ -0,0 +1,20 @@ +/** + * An externally resolvable/rejectable "promise". Use it to resolve/reject + * promise at any time. + * + * ```ts + * const future = new Defer(); + * + * future.promise.then(value => console.log(value)); + * + * future.resolve(123); + * ``` + */ +export class Defer { + public readonly resolve!: (data: T) => void; + public readonly reject!: (error: any) => void; + public readonly promise: Promise = new Promise((resolve, reject) => { + (this as any).resolve = resolve; + (this as any).reject = reject; + }); +} diff --git a/src/thingies/concurrency.ts b/src/thingies/concurrency.ts new file mode 100644 index 000000000..caf406179 --- /dev/null +++ b/src/thingies/concurrency.ts @@ -0,0 +1,36 @@ +import {go} from './go'; +import type {Code} from './types'; + +class Task { + public readonly resolve!: (data: T) => void; + public readonly reject!: (error: any) => void; + public readonly promise = new Promise((resolve, reject) => { + (this as any).resolve = resolve; + (this as any).reject = reject; + }); + constructor(public readonly code: Code) {} +} + +/** Limits concurrency of async code. */ +export const concurrency = (limit: number) => { + let workers = 0; + const queue = new Set(); + const work = async () => { + const task = queue.values().next().value; + if (task) queue.delete(task); + else return; + workers++; + try { + task.resolve(await task.code()); + } catch (error) { + task.reject(error); + } finally { + workers--, queue.size && go(work); + } + }; + return async (code: Code): Promise => { + const task = new Task(code); + queue.add(task as Task); + return workers < limit && go(work), task.promise; + }; +}; diff --git a/src/thingies/go.ts b/src/thingies/go.ts new file mode 100644 index 000000000..64388af23 --- /dev/null +++ b/src/thingies/go.ts @@ -0,0 +1,6 @@ +import type {Code} from './types'; + +/** Executes code concurrently. */ +export const go = (code: Code): void => { + code().catch(() => {}); +}; diff --git a/src/thingies/index.ts b/src/thingies/index.ts new file mode 100644 index 000000000..be02252a2 --- /dev/null +++ b/src/thingies/index.ts @@ -0,0 +1,4 @@ +export * from './concurrency'; +export * from './Defer'; +export * from './go'; +export * from './of'; diff --git a/src/thingies/of.ts b/src/thingies/of.ts new file mode 100644 index 000000000..31a11ce51 --- /dev/null +++ b/src/thingies/of.ts @@ -0,0 +1,16 @@ +/** + * Given a promise awaits it and returns a 3-tuple, with the following members: + * + * - First entry is either the resolved value of the promise or `undefined`. + * - Second entry is either the error thrown by promise or `undefined`. + * - Third entry is a boolean, truthy if promise was resolved and falsy if rejected. + * + * @param promise Promise to convert to 3-tuple. + */ +export const of = async (promise: Promise): Promise<[T | undefined, E | undefined, boolean]> => { + try { + return [await promise, undefined, true]; + } catch (error: unknown) { + return [undefined, error as E, false]; + } +}; diff --git a/src/thingies/types.ts b/src/thingies/types.ts new file mode 100644 index 000000000..a1ec65bcb --- /dev/null +++ b/src/thingies/types.ts @@ -0,0 +1 @@ +export type Code = () => Promise; diff --git a/yarn.lock b/yarn.lock index b567bee8b..d25def6d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6682,11 +6682,6 @@ text-table@~0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -thingies@^1.11.1: - version "1.16.0" - resolved "https://registry.yarnpkg.com/thingies/-/thingies-1.16.0.tgz#968cde87fbf0fdd69a1a3a8e9678324f634e5053" - integrity sha512-J23AVs11hSQxuJxvfQyMIaS9z1QpDxOCvMkL3ZxZl8/jmkgmnNGWrlyNxVz6Jbh0U6DuGmHqq6f7zUROfg/ncg== - through2@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" From 3f43f4a7b9d836052c0c592ad4239403567242c7 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 17 Feb 2024 22:09:48 +0000 Subject: [PATCH 02/37] chore(release): 4.7.5 [skip ci] ## [4.7.5](https://github.com/streamich/memfs/compare/v4.7.4...v4.7.5) (2024-02-17) ### Bug Fixes * inline `thingies` dependency ([#1004](https://github.com/streamich/memfs/issues/1004)) ([6fc340d](https://github.com/streamich/memfs/commit/6fc340d83544d04c35f62bc0fa7aadf77266af12)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1686b68a..82e7cd87c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [4.7.5](https://github.com/streamich/memfs/compare/v4.7.4...v4.7.5) (2024-02-17) + + +### Bug Fixes + +* inline `thingies` dependency ([#1004](https://github.com/streamich/memfs/issues/1004)) ([6fc340d](https://github.com/streamich/memfs/commit/6fc340d83544d04c35f62bc0fa7aadf77266af12)) + ## [4.7.4](https://github.com/streamich/memfs/compare/v4.7.3...v4.7.4) (2024-02-17) diff --git a/package.json b/package.json index 056881be1..09d3d92b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "memfs", - "version": "4.7.4", + "version": "4.7.5", "description": "In-memory file-system with Node's fs API.", "keywords": [ "fs", From d3b62dc3785a50776369aa47bc2244c896ff2bdc Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Sun, 18 Feb 2024 11:11:32 +1300 Subject: [PATCH 03/37] fix: remove tests from published package (#1003) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 09d3d92b0..e4aa30d89 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "demo/runkit.js" ], "scripts": { - "build": "tsc -p .", + "build": "tsc -p . && rimraf --glob lib/__tests__ 'lib/**/__tests__'", "build:webfs": "NODE_ENV=production webpack --config ./src/webfs/webpack.config.js", "clean": "rimraf lib types", "demo:crud-and-cas": "webpack serve --config ./demo/crud-and-cas/webpack.config.js", From f9b4ef3b207f2b6cb6e8d88b88543a14087cd96e Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 17 Feb 2024 22:16:36 +0000 Subject: [PATCH 04/37] chore(release): 4.7.6 [skip ci] ## [4.7.6](https://github.com/streamich/memfs/compare/v4.7.5...v4.7.6) (2024-02-17) ### Bug Fixes * remove tests from published package ([#1003](https://github.com/streamich/memfs/issues/1003)) ([d3b62dc](https://github.com/streamich/memfs/commit/d3b62dc3785a50776369aa47bc2244c896ff2bdc)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82e7cd87c..e79e2d47f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [4.7.6](https://github.com/streamich/memfs/compare/v4.7.5...v4.7.6) (2024-02-17) + + +### Bug Fixes + +* remove tests from published package ([#1003](https://github.com/streamich/memfs/issues/1003)) ([d3b62dc](https://github.com/streamich/memfs/commit/d3b62dc3785a50776369aa47bc2244c896ff2bdc)) + ## [4.7.5](https://github.com/streamich/memfs/compare/v4.7.4...v4.7.5) (2024-02-17) diff --git a/package.json b/package.json index e4aa30d89..3c5693f62 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "memfs", - "version": "4.7.5", + "version": "4.7.6", "description": "In-memory file-system with Node's fs API.", "keywords": [ "fs", From 3c18daeb7ee78813ae66df484070f51f3a16777e Mon Sep 17 00:00:00 2001 From: Mohamed Ibrahim Date: Tue, 20 Feb 2024 20:49:04 -0600 Subject: [PATCH 05/37] fix: accept file names beginning with a period (#1005) * fix: fix name validation regex to accept file names beginning with a period * Update src/node-to-fsa/__tests__/NodeFileSystemDirectoryHandle.test.ts --------- Co-authored-by: Gareth Jones --- .../__tests__/NodeFileSystemDirectoryHandle.test.ts | 6 ++++++ src/node-to-fsa/util.ts | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/node-to-fsa/__tests__/NodeFileSystemDirectoryHandle.test.ts b/src/node-to-fsa/__tests__/NodeFileSystemDirectoryHandle.test.ts index d70c2de61..5f392d326 100644 --- a/src/node-to-fsa/__tests__/NodeFileSystemDirectoryHandle.test.ts +++ b/src/node-to-fsa/__tests__/NodeFileSystemDirectoryHandle.test.ts @@ -303,6 +303,12 @@ onlyOnNode20('NodeFileSystemDirectoryHandle', () => { }); } + test('accepts file names beginning with a .', async () => { + const { dir } = setup({ '.hidden': 'contents' }); + const fileHandle = await dir.getFileHandle('.hidden'); + expect(fileHandle).toBeInstanceOf(NodeFileSystemFileHandle); + }); + test('can retrieve a child file', async () => { const { dir } = setup({ file: 'contents', subdir: null }); const subdir = await dir.getFileHandle('file'); diff --git a/src/node-to-fsa/util.ts b/src/node-to-fsa/util.ts index 429b8fde2..623d53f9a 100644 --- a/src/node-to-fsa/util.ts +++ b/src/node-to-fsa/util.ts @@ -18,7 +18,7 @@ export const basename = (path: string, separator: string) => { return lastSlashIndex === -1 ? path : path.slice(lastSlashIndex + 1); }; -const nameRegex = /^(\.{1,2})|(.*(\/|\\).*)$/; +const nameRegex = /^(\.{1,2})$|^(.*([\/\\]).*)$/; export const assertName = (name: string, method: string, klass: string) => { const isInvalid = !name || nameRegex.test(name); From 5dfc9b9a89f0eb91941808cc1d80b1f750e18610 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 21 Feb 2024 02:51:45 +0000 Subject: [PATCH 06/37] chore(release): 4.7.7 [skip ci] ## [4.7.7](https://github.com/streamich/memfs/compare/v4.7.6...v4.7.7) (2024-02-21) ### Bug Fixes * accept file names beginning with a period ([#1005](https://github.com/streamich/memfs/issues/1005)) ([3c18dae](https://github.com/streamich/memfs/commit/3c18daeb7ee78813ae66df484070f51f3a16777e)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e79e2d47f..dac868f3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [4.7.7](https://github.com/streamich/memfs/compare/v4.7.6...v4.7.7) (2024-02-21) + + +### Bug Fixes + +* accept file names beginning with a period ([#1005](https://github.com/streamich/memfs/issues/1005)) ([3c18dae](https://github.com/streamich/memfs/commit/3c18daeb7ee78813ae66df484070f51f3a16777e)) + ## [4.7.6](https://github.com/streamich/memfs/compare/v4.7.5...v4.7.6) (2024-02-17) diff --git a/package.json b/package.json index 3c5693f62..540f46026 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "memfs", - "version": "4.7.6", + "version": "4.7.7", "description": "In-memory file-system with Node's fs API.", "keywords": [ "fs", From 6f4e72e889b578a62110c2e57f79f78e9dbca408 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 1 Mar 2024 01:28:15 +0000 Subject: [PATCH 07/37] chore(deps): lock file maintenance --- yarn.lock | 334 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 174 insertions(+), 160 deletions(-) diff --git a/yarn.lock b/yarn.lock index d25def6d3..52e738ec1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,21 +23,21 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== -"@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" - integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.0.tgz#56cbda6b185ae9d9bed369816a8f4423c5f2ff1b" + integrity sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.9" - "@babel/parser" "^7.23.9" - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/helpers" "^7.24.0" + "@babel/parser" "^7.24.0" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.0" + "@babel/types" "^7.24.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -104,9 +104,9 @@ "@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" + integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== "@babel/helper-simple-access@^7.22.5": version "7.22.5" @@ -137,14 +137,14 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== -"@babel/helpers@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" - integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== +"@babel/helpers@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.0.tgz#a3dd462b41769c95db8091e49cfe019389a9409b" + integrity sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA== dependencies: - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.0" + "@babel/types" "^7.24.0" "@babel/highlight@^7.23.4": version "7.23.4" @@ -155,10 +155,10 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" - integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.0.tgz#26a3d1ff49031c53a97d03b604375f028746a9ac" + integrity sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -258,19 +258,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/template@^7.22.15", "@babel/template@^7.23.9", "@babel/template@^7.3.3": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" - integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== +"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== dependencies: "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" -"@babel/traverse@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" - integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== +"@babel/traverse@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.0.tgz#4a408fbf364ff73135c714a2ab46a5eab2831b1e" + integrity sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw== dependencies: "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" @@ -278,15 +278,15 @@ "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.3.3": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" - integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.24.0", "@babel/types@^7.3.3": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== dependencies: "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" @@ -347,7 +347,7 @@ js-yaml "^3.13.1" resolve-from "^5.0.0" -"@istanbuljs/schema@^0.1.2": +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== @@ -545,23 +545,23 @@ chalk "^4.0.0" "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + version "0.3.4" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz#9b18145d26cf33d08576cf4c7665b28554480ed7" + integrity sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" "@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/source-map@^0.3.3": version "0.3.5" @@ -585,9 +585,9 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.22" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" - integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== + version "0.3.23" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz#afc96847f3f07841477f303eed687707a5aacd80" + integrity sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -1130,9 +1130,9 @@ "@types/estree" "*" "@types/eslint@*": - version "8.56.2" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.2.tgz#1c72a9b794aa26a8b94ad26d5b9aa51c8a6384bb" - integrity sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw== + version "8.56.5" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.5.tgz#94b88cab77588fcecdd0771a6d576fa1c0af9d02" + integrity sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -1241,9 +1241,9 @@ "@types/node" "*" "@types/node@*": - version "20.11.17" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.17.tgz#cdd642d0e62ef3a861f88ddbc2b61e32578a9292" - integrity sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw== + version "20.11.24" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792" + integrity sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long== dependencies: undici-types "~5.26.4" @@ -1263,9 +1263,9 @@ integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/qs@*": - version "6.9.11" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.11.tgz#208d8a30bc507bd82e03ada29e4732ea46a6bbda" - integrity sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ== + version "6.9.12" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.12.tgz#afa96b383a3a6fdc859453a1892d41b607fc7756" + integrity sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg== "@types/range-parser@*": version "1.2.7" @@ -1737,9 +1737,11 @@ async-lock@^1.1.0: integrity sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ== available-typed-arrays@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz#ac812d8ce5a6b976d738e1c45f08d0b00bc7d725" - integrity sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg== + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" b4a@^1.6.4: version "1.6.6" @@ -1812,9 +1814,9 @@ balanced-match@^1.0.0: integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== bare-events@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.2.0.tgz#a7a7263c107daf8b85adf0b64f908503454ab26e" - integrity sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg== + version "2.2.1" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.2.1.tgz#7b6d421f26a7a755e20bf580b727c84b807964c1" + integrity sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A== base64-js@^1.3.1: version "1.5.1" @@ -1848,13 +1850,13 @@ binary-extensions@^2.0.0, binary-extensions@^2.2.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== +body-parser@1.20.2: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== dependencies: bytes "3.1.2" - content-type "~1.0.4" + content-type "~1.0.5" debug "2.6.9" depd "2.0.0" destroy "1.2.0" @@ -1862,7 +1864,7 @@ body-parser@1.20.1: iconv-lite "0.4.24" on-finished "2.4.1" qs "6.11.0" - raw-body "2.5.1" + raw-body "2.5.2" type-is "~1.6.18" unpipe "1.0.0" @@ -1907,12 +1909,12 @@ braces@^3.0.2, braces@~3.0.2: fill-range "^7.0.1" browserslist@^4.21.10, browserslist@^4.22.2: - version "4.22.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.3.tgz#299d11b7e947a6b843981392721169e27d60c5a6" - integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: - caniuse-lite "^1.0.30001580" - electron-to-chromium "^1.4.648" + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" node-releases "^2.0.14" update-browserslist-db "^1.0.13" @@ -1989,15 +1991,16 @@ cacache@^16.0.0, cacache@^16.1.0, cacache@^16.1.3: tar "^6.1.11" unique-filename "^2.0.0" -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.6.tgz#6c46675fc7a5e9de82d75a233d586c8b7ac0d931" - integrity sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg== +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: + es-define-property "^1.0.0" es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.3" - set-function-length "^1.2.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" callsites@^3.0.0: version "3.1.0" @@ -2031,10 +2034,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001580: - version "1.0.30001587" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz#a0bce920155fa56a1885a69c74e1163fc34b4881" - integrity sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA== +caniuse-lite@^1.0.30001587: + version "1.0.30001591" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz#16745e50263edc9f395895a7cd468b9f3767cf33" + integrity sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ== cardinal@^2.1.1: version "2.1.1" @@ -2316,7 +2319,7 @@ content-disposition@0.5.4: dependencies: safe-buffer "5.2.1" -content-type@~1.0.4: +content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== @@ -2527,14 +2530,13 @@ defaults@^1.0.3: clone "^1.0.2" define-data-property@^1.0.1, define-data-property@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.3.tgz#281845e04737d709c2de99e278546189b65d3055" - integrity sha512-h3GBouC+RPtNX2N0hHVLo2ZwPYurq8mLmXpOLTsw71gr7lHt5VaI4vVkDUNOfiWmm48JEXe3VM7PmLX45AMmmg== + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: + es-define-property "^1.0.0" es-errors "^1.3.0" - get-intrinsic "^1.2.4" gopd "^1.0.1" - has-property-descriptors "^1.0.1" define-lazy-prop@^2.0.0: version "2.0.0" @@ -2710,10 +2712,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.648: - version "1.4.666" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.666.tgz#ecc65df60e5d3489962ff46b8a6b1dd3b8f863aa" - integrity sha512-q4lkcbQrUdlzWCUOxk6fwEza6bNCfV12oi4AJph5UibguD1aTfL4uD0nuzFv9hbPANXQMuUS0MxPSHQ1gqq5dg== +electron-to-chromium@^1.4.668: + version "1.4.689" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.689.tgz#94fe370b800d978b606a2b4c0c5db5c8c98db4f2" + integrity sha512-GatzRKnGPS1go29ep25reM94xxd1Wj8ritU0yRhCJ/tr1Bg8gKnm6R9O/yPOhGQBoLMZ9ezfrpghNaTw97C/PQ== emittery@^0.13.1: version "0.13.1" @@ -2743,9 +2745,9 @@ encoding@^0.1.13: iconv-lite "^0.6.2" enhanced-resolve@^5.0.0, enhanced-resolve@^5.15.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + version "5.15.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz#384391e025f099e67b4b00bfd7f0906a408214e1" + integrity sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -2786,6 +2788,13 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" @@ -2903,13 +2912,13 @@ exponential-backoff@^3.1.1: integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== express@^4.17.3: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + version "4.18.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.3.tgz#6870746f3ff904dee1819b82e4b51509afffb0d4" + integrity sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.1" + body-parser "1.20.2" content-disposition "0.5.4" content-type "~1.0.4" cookie "0.5.0" @@ -3155,7 +3164,7 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -3301,16 +3310,16 @@ has-flag@^4.0.0: integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" - integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.2.2" + es-define-property "^1.0.0" has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.3: version "1.0.3" @@ -3465,9 +3474,9 @@ http-proxy-agent@^5.0.0: debug "4" http-proxy-agent@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.1.tgz#f1c7df4bd6c30ba90f2c713fd4b60d3989d4b3d9" - integrity sha512-My1KCEPs6A0hb4qCVzYp8iEvA8j8YqcvXLZZH8C9OFuTYpYjHE7N2dtG3mRl1HMD4+VGXpF3XcDVcxGBT7yDZQ== + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== dependencies: agent-base "^7.1.0" debug "^4.3.4" @@ -3501,9 +3510,9 @@ https-proxy-agent@^5.0.0: debug "4" https-proxy-agent@^7.0.0: - version "7.0.3" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.3.tgz#93f115f0f106a746faf364d1301b2e561cdf70de" - integrity sha512-kCnwztfX0KZJSLOBrcL0emLeFako55NWMovvyPP2AjsghNk9RB1yjSI+jVumPHYZsNXegNoqupSW9IY3afSH8w== + version "7.0.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" + integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== dependencies: agent-base "^7.0.2" debug "4" @@ -3839,9 +3848,9 @@ isobject@^3.0.1: integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== isomorphic-git@^1.24.2: - version "1.25.3" - resolved "https://registry.yarnpkg.com/isomorphic-git/-/isomorphic-git-1.25.3.tgz#e8e7d6981bec2aa2b7b2c78f501ae49755a0c025" - integrity sha512-iUaDB5kObupWpwjQ+EGkDQmaYQzbq1XaPqo+xJCCfbPViGZL94rU2RvK4EDJKpYbyiwbq5OSLEjkXHa8r5I1aw== + version "1.25.6" + resolved "https://registry.yarnpkg.com/isomorphic-git/-/isomorphic-git-1.25.6.tgz#ec8ff6b5379fa0094c09b836fd68a8ddd8b88d3b" + integrity sha512-zA3k3QOO7doqOnBgwsaXJwHKSIIl5saEdH4xxalu082WHVES4KghsG6RE2SDwjXMCIlNa1bWocbitH6bRIrmLQ== dependencies: async-lock "^1.1.0" clean-git-ref "^2.0.1" @@ -3883,13 +3892,13 @@ istanbul-lib-instrument@^5.0.4: semver "^6.3.0" istanbul-lib-instrument@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" - integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== + version "6.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz#91655936cf7380e4e473383081e38478b69993b1" + integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" istanbul-lib-coverage "^3.2.0" semver "^7.5.4" @@ -3912,9 +3921,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" - integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -5283,12 +5292,12 @@ object-inspect@^1.13.1: integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" object-keys@^1.1.1: version "1.1.1" @@ -5612,6 +5621,11 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + postcss-selector-parser@^6.0.10: version "6.0.15" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" @@ -5774,10 +5788,10 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" http-errors "2.0.0" @@ -6189,7 +6203,7 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-length@^1.2.0: +set-function-length@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425" integrity sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g== @@ -6244,11 +6258,11 @@ shell-quote@^1.8.1: integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== side-channel@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.5.tgz#9a84546599b48909fb6af1211708d23b1946221b" - integrity sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: - call-bind "^1.0.6" + call-bind "^1.0.7" es-errors "^1.3.0" get-intrinsic "^1.2.4" object-inspect "^1.13.1" @@ -6320,9 +6334,9 @@ socks-proxy-agent@^7.0.0: socks "^2.6.2" socks@^2.6.2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.3.tgz#7d8a75d7ce845c0a96f710917174dba0d543a785" - integrity sha512-vfuYK48HXCTFD03G/1/zkIls3Ebr2YNa4qU9gHDZdblHLiqhJrJGkY3+0Nx0JpN9qBhJbVObc1CNciT1bIZJxw== + version "2.8.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.1.tgz#22c7d9dd7882649043cba0eafb49ae144e3457af" + integrity sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ== dependencies: ip-address "^9.0.5" smart-buffer "^4.2.0" @@ -6367,9 +6381,9 @@ spdx-correct@^3.0.0: spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz#c07a4ede25b16e4f78e6707bbd84b15a45c19c1b" - integrity sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" @@ -6471,9 +6485,9 @@ stream-combiner2@~1.1.1: readable-stream "^2.0.2" streamx@^2.15.0: - version "2.15.8" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.15.8.tgz#5471145b54ee43b5088877023d8d0a2a77f95d8d" - integrity sha512-6pwMeMY/SuISiRsuS8TeIrAzyFbG5gGPHFQsYjUr/pbBadaL1PCWmzKw+CHZSwainfvcF6Si6cVLq4XTEwswFQ== + version "2.16.1" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.16.1.tgz#2b311bd34832f08aa6bb4d6a80297c9caef89614" + integrity sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ== dependencies: fast-fifo "^1.1.0" queue-tick "^1.0.1" @@ -6654,9 +6668,9 @@ terser-webpack-plugin@^5.3.10: terser "^5.26.0" terser@^5.10.0, terser@^5.26.0: - version "5.27.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.27.0.tgz#70108689d9ab25fef61c4e93e808e9fd092bf20c" - integrity sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A== + version "5.28.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.28.1.tgz#bf00f7537fd3a798c352c2d67d67d65c915d1b28" + integrity sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -7168,9 +7182,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.87.0: - version "5.90.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.90.1.tgz#62ab0c097d7cbe83d32523dbfbb645cdb7c3c01c" - integrity sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog== + version "5.90.3" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.90.3.tgz#37b8f74d3ded061ba789bb22b31e82eed75bd9ac" + integrity sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.5" From 44ceed4b01f13ba2150d26f751710f91706d1150 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 07:05:06 +1300 Subject: [PATCH 08/37] chore(deps): bump follow-redirects from 1.15.5 to 1.15.6 (#1010) --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 52e738ec1..20b016e2a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3062,9 +3062,9 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== follow-redirects@^1.0.0: - version "1.15.5" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" - integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== for-each@^0.3.3: version "0.3.3" From e32a57d07dc05c8275180e59cff59cd76cbd4841 Mon Sep 17 00:00:00 2001 From: streamich Date: Tue, 19 Mar 2024 11:55:09 +0100 Subject: [PATCH 09/37] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20allow=20to=20custo?= =?UTF-8?q?mize=20CAS=20storage=20hash=20and=20location=20mappin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cas/types.ts | 10 ++++---- src/crud-to-cas/CrudCas.ts | 35 ++++++++++++++------------ src/crud-to-cas/__tests__/testCasfs.ts | 2 +- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/cas/types.ts b/src/cas/types.ts index 6b2671039..9ec8d7866 100644 --- a/src/cas/types.ts +++ b/src/cas/types.ts @@ -1,10 +1,10 @@ import type { CrudResourceInfo } from '../crud/types'; -export interface CasApi { - put(blob: Uint8Array): Promise; - get(hash: string, options?: CasGetOptions): Promise; - del(hash: string, silent?: boolean): Promise; - info(hash: string): Promise; +export interface CasApi { + put(blob: Uint8Array): Promise; + get(hash: Hash, options?: CasGetOptions): Promise; + del(hash: Hash, silent?: boolean): Promise; + info(hash: Hash): Promise; } export interface CasGetOptions { diff --git a/src/crud-to-cas/CrudCas.ts b/src/crud-to-cas/CrudCas.ts index a9fc8e01e..75ea6526b 100644 --- a/src/crud-to-cas/CrudCas.ts +++ b/src/crud-to-cas/CrudCas.ts @@ -1,9 +1,11 @@ -import { hashToLocation } from './util'; +import { hashToLocation as defaultHashToLocation } from './util'; import type { CasApi, CasGetOptions } from '../cas/types'; import type { CrudApi, CrudResourceInfo } from '../crud/types'; +import type { FsLocation } from '../fsa-to-node/types'; -export interface CrudCasOptions { - hash: (blob: Uint8Array) => Promise; +export interface CrudCasOptions { + hash: (blob: Uint8Array) => Promise; + hash2Loc?: (hash: Hash) => FsLocation; } const normalizeErrors = async (code: () => Promise): Promise => { @@ -21,21 +23,22 @@ const normalizeErrors = async (code: () => Promise): Promise => { } }; -export class CrudCas implements CasApi { - constructor( - protected readonly crud: CrudApi, - protected readonly options: CrudCasOptions, - ) {} +export class CrudCas implements CasApi { + protected readonly hash2Loc: (hash: Hash) => FsLocation; - public readonly put = async (blob: Uint8Array): Promise => { + constructor(protected readonly crud: CrudApi, protected readonly options: CrudCasOptions) { + this.hash2Loc = options.hash2Loc || <(hash: Hash) => FsLocation>defaultHashToLocation; + } + + public readonly put = async (blob: Uint8Array): Promise => { const digest = await this.options.hash(blob); - const [collection, resource] = hashToLocation(digest); + const [collection, resource] = this.hash2Loc(digest); await this.crud.put(collection, resource, blob); return digest; }; - public readonly get = async (hash: string, options?: CasGetOptions): Promise => { - const [collection, resource] = hashToLocation(hash); + public readonly get = async (hash: Hash, options?: CasGetOptions): Promise => { + const [collection, resource] = this.hash2Loc(hash); return await normalizeErrors(async () => { const blob = await this.crud.get(collection, resource); if (!options?.skipVerification) { @@ -46,15 +49,15 @@ export class CrudCas implements CasApi { }); }; - public readonly del = async (hash: string, silent?: boolean): Promise => { - const [collection, resource] = hashToLocation(hash); + public readonly del = async (hash: Hash, silent?: boolean): Promise => { + const [collection, resource] = this.hash2Loc(hash); await normalizeErrors(async () => { return await this.crud.del(collection, resource, silent); }); }; - public readonly info = async (hash: string): Promise => { - const [collection, resource] = hashToLocation(hash); + public readonly info = async (hash: Hash): Promise => { + const [collection, resource] = this.hash2Loc(hash); return await normalizeErrors(async () => { return await this.crud.info(collection, resource); }); diff --git a/src/crud-to-cas/__tests__/testCasfs.ts b/src/crud-to-cas/__tests__/testCasfs.ts index 16c7f5cda..e71f4b4fd 100644 --- a/src/crud-to-cas/__tests__/testCasfs.ts +++ b/src/crud-to-cas/__tests__/testCasfs.ts @@ -16,7 +16,7 @@ const b = (str: string) => { }; export type Setup = () => { - cas: CasApi; + cas: CasApi; crud: CrudApi; snapshot: () => Record; }; From 63ae860ec1b36d920bd6eea7eb1c1a28bb626823 Mon Sep 17 00:00:00 2001 From: streamich Date: Tue, 19 Mar 2024 12:31:00 +0100 Subject: [PATCH 10/37] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20separate=20abs?= =?UTF-8?q?tract=20logic=20into=20CrudCasBase=20class?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/crud-to-cas/CrudCas.ts | 68 +++---------------- src/crud-to-cas/CrudCasBase.ts | 60 ++++++++++++++++ src/crud-to-cas/__tests__/CrudCasBase.test.ts | 59 ++++++++++++++++ 3 files changed, 128 insertions(+), 59 deletions(-) create mode 100644 src/crud-to-cas/CrudCasBase.ts create mode 100644 src/crud-to-cas/__tests__/CrudCasBase.test.ts diff --git a/src/crud-to-cas/CrudCas.ts b/src/crud-to-cas/CrudCas.ts index 75ea6526b..d9881697e 100644 --- a/src/crud-to-cas/CrudCas.ts +++ b/src/crud-to-cas/CrudCas.ts @@ -1,65 +1,15 @@ -import { hashToLocation as defaultHashToLocation } from './util'; -import type { CasApi, CasGetOptions } from '../cas/types'; -import type { CrudApi, CrudResourceInfo } from '../crud/types'; -import type { FsLocation } from '../fsa-to-node/types'; +import { hashToLocation } from './util'; +import { CrudCasBase } from './CrudCasBase'; +import type { CrudApi } from '../crud/types'; -export interface CrudCasOptions { - hash: (blob: Uint8Array) => Promise; - hash2Loc?: (hash: Hash) => FsLocation; +export interface CrudCasOptions { + hash: (blob: Uint8Array) => Promise; } -const normalizeErrors = async (code: () => Promise): Promise => { - try { - return await code(); - } catch (error) { - if (error && typeof error === 'object') { - switch (error.name) { - case 'ResourceNotFound': - case 'CollectionNotFound': - throw new DOMException(error.message, 'BlobNotFound'); - } - } - throw error; - } -}; - -export class CrudCas implements CasApi { - protected readonly hash2Loc: (hash: Hash) => FsLocation; +const hashEqual = (h1: string, h2: string) => h1 === h2; - constructor(protected readonly crud: CrudApi, protected readonly options: CrudCasOptions) { - this.hash2Loc = options.hash2Loc || <(hash: Hash) => FsLocation>defaultHashToLocation; +export class CrudCas extends CrudCasBase { + constructor(protected readonly crud: CrudApi, protected readonly options: CrudCasOptions) { + super(crud, options.hash, hashToLocation, hashEqual); } - - public readonly put = async (blob: Uint8Array): Promise => { - const digest = await this.options.hash(blob); - const [collection, resource] = this.hash2Loc(digest); - await this.crud.put(collection, resource, blob); - return digest; - }; - - public readonly get = async (hash: Hash, options?: CasGetOptions): Promise => { - const [collection, resource] = this.hash2Loc(hash); - return await normalizeErrors(async () => { - const blob = await this.crud.get(collection, resource); - if (!options?.skipVerification) { - const digest = await this.options.hash(blob); - if (hash !== digest) throw new DOMException('Blob contents does not match hash', 'Integrity'); - } - return blob; - }); - }; - - public readonly del = async (hash: Hash, silent?: boolean): Promise => { - const [collection, resource] = this.hash2Loc(hash); - await normalizeErrors(async () => { - return await this.crud.del(collection, resource, silent); - }); - }; - - public readonly info = async (hash: Hash): Promise => { - const [collection, resource] = this.hash2Loc(hash); - return await normalizeErrors(async () => { - return await this.crud.info(collection, resource); - }); - }; } diff --git a/src/crud-to-cas/CrudCasBase.ts b/src/crud-to-cas/CrudCasBase.ts new file mode 100644 index 000000000..8a12df7f2 --- /dev/null +++ b/src/crud-to-cas/CrudCasBase.ts @@ -0,0 +1,60 @@ +import type { CasApi, CasGetOptions } from '../cas/types'; +import type { CrudApi, CrudResourceInfo } from '../crud/types'; +import type { FsLocation } from '../fsa-to-node/types'; + +const normalizeErrors = async (code: () => Promise): Promise => { + try { + return await code(); + } catch (error) { + if (error && typeof error === 'object') { + switch (error.name) { + case 'ResourceNotFound': + case 'CollectionNotFound': + throw new DOMException(error.message, 'BlobNotFound'); + } + } + throw error; + } +}; + +export class CrudCasBase implements CasApi { + constructor( + protected readonly crud: CrudApi, + protected readonly hash: (blob: Uint8Array) => Promise, + protected readonly hash2Loc: (hash: Hash) => FsLocation, + protected readonly hashEqual: (h1: Hash, h2: Hash) => boolean, + ) {} + + public readonly put = async (blob: Uint8Array): Promise => { + const digest = await this.hash(blob); + const [collection, resource] = this.hash2Loc(digest); + await this.crud.put(collection, resource, blob); + return digest; + }; + + public readonly get = async (hash: Hash, options?: CasGetOptions): Promise => { + const [collection, resource] = this.hash2Loc(hash); + return await normalizeErrors(async () => { + const blob = await this.crud.get(collection, resource); + if (!options?.skipVerification) { + const digest = await this.hash(blob); + if (!this.hashEqual(digest, hash)) throw new DOMException('Blob contents does not match hash', 'Integrity'); + } + return blob; + }); + }; + + public readonly del = async (hash: Hash, silent?: boolean): Promise => { + const [collection, resource] = this.hash2Loc(hash); + await normalizeErrors(async () => { + return await this.crud.del(collection, resource, silent); + }); + }; + + public readonly info = async (hash: Hash): Promise => { + const [collection, resource] = this.hash2Loc(hash); + return await normalizeErrors(async () => { + return await this.crud.info(collection, resource); + }); + }; +} diff --git a/src/crud-to-cas/__tests__/CrudCasBase.test.ts b/src/crud-to-cas/__tests__/CrudCasBase.test.ts new file mode 100644 index 000000000..f3945c7bf --- /dev/null +++ b/src/crud-to-cas/__tests__/CrudCasBase.test.ts @@ -0,0 +1,59 @@ +import { memfs } from '../..'; +import { onlyOnNode20 } from '../../__tests__/util'; +import { NodeFileSystemDirectoryHandle } from '../../node-to-fsa'; +import { FsaCrud } from '../../fsa-to-crud/FsaCrud'; +import { createHash } from 'crypto'; +import { hashToLocation } from '../util'; +import { CrudCasBase } from '../CrudCasBase'; + +onlyOnNode20('CrudCas on FsaCrud', () => { + const setup = () => { + const { fs } = memfs(); + const fsa = new NodeFileSystemDirectoryHandle(fs, '/', { mode: 'readwrite' }); + const crud = new FsaCrud(fsa); + return { fs, fsa, crud, snapshot: () => (fs).__vol.toJSON() }; + }; + + test('can use a custom hashing digest type', async () => { + const { crud } = setup(); + class Hash { + constructor(public readonly digest: string) {} + } + const hash = async (blob: Uint8Array): Promise => { + const shasum = createHash('sha1'); + shasum.update(blob); + const digest = shasum.digest('hex'); + return new Hash(digest); + }; + const cas = new CrudCasBase(crud, hash, (id: Hash) => hashToLocation(id.digest), (h1: Hash, h2: Hash) => h1.digest === h2.digest); + const blob = Buffer.from('hello world'); + const id = await cas.put(blob); + expect(id).toBeInstanceOf(Hash); + const id2 = await hash(blob); + expect(id.digest).toEqual(id2.digest); + const blob2 = await cas.get(id); + expect(String.fromCharCode(...blob2)).toEqual('hello world'); + expect(await cas.info(id)).toMatchObject({ size: 11 }); + await cas.del(id2); + expect(() => cas.info(id)).rejects.toThrowError(); + }); + + test('can use custom folder sharding strategy', async () => { + const { crud } = setup(); + const hash = async (blob: Uint8Array): Promise => { + const shasum = createHash('sha1'); + shasum.update(blob); + return shasum.digest('hex'); + }; + const cas = new CrudCasBase(crud, hash, (h: string) => [[h[0], h[1], h[2]], h[3]], (h1: string, h2: string) => h1 === h2); + const blob = Buffer.from('hello world'); + const id = await cas.put(blob); + expect(typeof id).toBe('string'); + const id2 = await hash(blob); + expect(id).toBe(id2); + const blob2 = await cas.get(id); + expect(String.fromCharCode(...blob2)).toEqual('hello world'); + const blob3 = await crud.get([id2[0], id2[1], id2[2]], id2[3]); + expect(String.fromCharCode(...blob3)).toEqual('hello world'); + }); +}); From 956e7fdf7720d36cb93aa75a43223fcccfc54f4f Mon Sep 17 00:00:00 2001 From: Va Da Date: Tue, 19 Mar 2024 11:53:07 +0000 Subject: [PATCH 11/37] =?UTF-8?q?style:=20=F0=9F=92=84=20run=20Prettier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/crud-to-cas/CrudCas.ts | 5 ++++- src/crud-to-cas/__tests__/CrudCasBase.test.ts | 18 +++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/crud-to-cas/CrudCas.ts b/src/crud-to-cas/CrudCas.ts index d9881697e..d08e82665 100644 --- a/src/crud-to-cas/CrudCas.ts +++ b/src/crud-to-cas/CrudCas.ts @@ -9,7 +9,10 @@ export interface CrudCasOptions { const hashEqual = (h1: string, h2: string) => h1 === h2; export class CrudCas extends CrudCasBase { - constructor(protected readonly crud: CrudApi, protected readonly options: CrudCasOptions) { + constructor( + protected readonly crud: CrudApi, + protected readonly options: CrudCasOptions, + ) { super(crud, options.hash, hashToLocation, hashEqual); } } diff --git a/src/crud-to-cas/__tests__/CrudCasBase.test.ts b/src/crud-to-cas/__tests__/CrudCasBase.test.ts index f3945c7bf..d38540f47 100644 --- a/src/crud-to-cas/__tests__/CrudCasBase.test.ts +++ b/src/crud-to-cas/__tests__/CrudCasBase.test.ts @@ -5,6 +5,7 @@ import { FsaCrud } from '../../fsa-to-crud/FsaCrud'; import { createHash } from 'crypto'; import { hashToLocation } from '../util'; import { CrudCasBase } from '../CrudCasBase'; +import { FsLocation } from '../../fsa-to-node/types'; onlyOnNode20('CrudCas on FsaCrud', () => { const setup = () => { @@ -13,7 +14,7 @@ onlyOnNode20('CrudCas on FsaCrud', () => { const crud = new FsaCrud(fsa); return { fs, fsa, crud, snapshot: () => (fs).__vol.toJSON() }; }; - + test('can use a custom hashing digest type', async () => { const { crud } = setup(); class Hash { @@ -25,7 +26,12 @@ onlyOnNode20('CrudCas on FsaCrud', () => { const digest = shasum.digest('hex'); return new Hash(digest); }; - const cas = new CrudCasBase(crud, hash, (id: Hash) => hashToLocation(id.digest), (h1: Hash, h2: Hash) => h1.digest === h2.digest); + const cas = new CrudCasBase( + crud, + hash, + (id: Hash) => hashToLocation(id.digest), + (h1: Hash, h2: Hash) => h1.digest === h2.digest, + ); const blob = Buffer.from('hello world'); const id = await cas.put(blob); expect(id).toBeInstanceOf(Hash); @@ -45,7 +51,13 @@ onlyOnNode20('CrudCas on FsaCrud', () => { shasum.update(blob); return shasum.digest('hex'); }; - const cas = new CrudCasBase(crud, hash, (h: string) => [[h[0], h[1], h[2]], h[3]], (h1: string, h2: string) => h1 === h2); + const theCustomFolderShardingStrategy = (h: string): FsLocation => [[h[0], h[1], h[2]], h[3]]; + const cas = new CrudCasBase( + crud, + hash, + theCustomFolderShardingStrategy, + (h1: string, h2: string) => h1 === h2, + ); const blob = Buffer.from('hello world'); const id = await cas.put(blob); expect(typeof id).toBe('string'); From 455002c8115576d8b0eadff2a8d23f4f3946ac05 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 19 Mar 2024 11:58:27 +0000 Subject: [PATCH 12/37] chore(release): 4.8.0 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # [4.8.0](https://github.com/streamich/memfs/compare/v4.7.7...v4.8.0) (2024-03-19) ### Features * 🎸 allow to customize CAS storage hash and location mappin ([e32a57d](https://github.com/streamich/memfs/commit/e32a57d07dc05c8275180e59cff59cd76cbd4841)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dac868f3e..662f0e2e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [4.8.0](https://github.com/streamich/memfs/compare/v4.7.7...v4.8.0) (2024-03-19) + + +### Features + +* 🎸 allow to customize CAS storage hash and location mappin ([e32a57d](https://github.com/streamich/memfs/commit/e32a57d07dc05c8275180e59cff59cd76cbd4841)) + ## [4.7.7](https://github.com/streamich/memfs/compare/v4.7.6...v4.7.7) (2024-02-21) diff --git a/package.json b/package.json index 540f46026..dd6d74e95 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "memfs", - "version": "4.7.7", + "version": "4.8.0", "description": "In-memory file-system with Node's fs API.", "keywords": [ "fs", From d78d6b8a86c626dc518568e0e18df8afcb83fbad Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 11:06:15 +1300 Subject: [PATCH 13/37] chore(deps): lock file maintenance (#1013) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 525 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 272 insertions(+), 253 deletions(-) diff --git a/yarn.lock b/yarn.lock index 20b016e2a..c137cfe75 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,40 +3,40 @@ "@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" "@babel/compat-data@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" - integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.1.tgz#31c1f66435f2a9c329bb5716a6d6186c516c3742" + integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.0.tgz#56cbda6b185ae9d9bed369816a8f4423c5f2ff1b" - integrity sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw== + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.3.tgz#568864247ea10fbd4eff04dda1e05f9e2ea985c3" + integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.1" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.24.0" - "@babel/parser" "^7.24.0" + "@babel/helpers" "^7.24.1" + "@babel/parser" "^7.24.1" "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.0" + "@babel/traverse" "^7.24.1" "@babel/types" "^7.24.0" convert-source-map "^2.0.0" debug "^4.1.0" @@ -44,14 +44,14 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.23.6", "@babel/generator@^7.7.2": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" - integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== +"@babel/generator@^7.24.1", "@babel/generator@^7.7.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0" + integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A== dependencies: - "@babel/types" "^7.23.6" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" + "@babel/types" "^7.24.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" "@babel/helper-compilation-targets@^7.23.6": @@ -86,11 +86,11 @@ "@babel/types" "^7.22.5" "@babel/helper-module-imports@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== dependencies: - "@babel/types" "^7.22.15" + "@babel/types" "^7.24.0" "@babel/helper-module-transforms@^7.23.3": version "7.23.3" @@ -103,7 +103,7 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.20" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== @@ -123,9 +123,9 @@ "@babel/types" "^7.22.5" "@babel/helper-string-parser@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" - integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" @@ -137,28 +137,29 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== -"@babel/helpers@^7.24.0": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.0.tgz#a3dd462b41769c95db8091e49cfe019389a9409b" - integrity sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA== +"@babel/helpers@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.1.tgz#183e44714b9eba36c3038e442516587b1e0a1a94" + integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg== dependencies: "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.0" + "@babel/traverse" "^7.24.1" "@babel/types" "^7.24.0" -"@babel/highlight@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" - integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== +"@babel/highlight@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" + integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== dependencies: "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" + picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.0.tgz#26a3d1ff49031c53a97d03b604375f028746a9ac" - integrity sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a" + integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -196,11 +197,11 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.7.2": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" - integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" + integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -252,11 +253,11 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" - integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" + integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.0" "@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": version "7.24.0" @@ -267,23 +268,23 @@ "@babel/parser" "^7.24.0" "@babel/types" "^7.24.0" -"@babel/traverse@^7.24.0": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.0.tgz#4a408fbf364ff73135c714a2ab46a5eab2831b1e" - integrity sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw== +"@babel/traverse@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" + integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" + "@babel/code-frame" "^7.24.1" + "@babel/generator" "^7.24.1" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.24.0" + "@babel/parser" "^7.24.1" "@babel/types" "^7.24.0" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.24.0", "@babel/types@^7.3.3": +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.3.3": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== @@ -544,32 +545,32 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz#9b18145d26cf33d08576cf4c7665b28554480ed7" - integrity sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw== +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@jridgewell/set-array" "^1.0.1" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.0.1": +"@jridgewell/set-array@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/source-map@^0.3.3": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" - integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" @@ -584,10 +585,10 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.23" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz#afc96847f3f07841477f303eed687707a5aacd80" - integrity sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -1039,9 +1040,9 @@ integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== "@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + version "1.0.10" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.10.tgz#b7ebd3adfa7750628d100594f6726b054d2c33b2" + integrity sha512-PiaIWIoPvO6qm6t114ropMCagj6YAF24j9OkCA2mJDXFnlionEwhsBCJ8yek4aib575BI3OkART/90WsgHgLWw== "@tsconfig/node12@^1.0.7": version "1.0.11" @@ -1130,9 +1131,9 @@ "@types/estree" "*" "@types/eslint@*": - version "8.56.5" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.5.tgz#94b88cab77588fcecdd0771a6d576fa1c0af9d02" - integrity sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw== + version "8.56.6" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.6.tgz#d5dc16cac025d313ee101108ba5714ea10eb3ed0" + integrity sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -1241,9 +1242,9 @@ "@types/node" "*" "@types/node@*": - version "20.11.24" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792" - integrity sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long== + version "20.11.30" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f" + integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== dependencies: undici-types "~5.26.4" @@ -1263,9 +1264,9 @@ integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/qs@*": - version "6.9.12" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.12.tgz#afa96b383a3a6fdc859453a1892d41b607fc7756" - integrity sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg== + version "6.9.14" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.14.tgz#169e142bfe493895287bee382af6039795e9b75b" + integrity sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA== "@types/range-parser@*": version "1.2.7" @@ -1332,10 +1333,10 @@ dependencies: "@types/yargs-parser" "*" -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== dependencies: "@webassemblyjs/helper-numbers" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" @@ -1350,10 +1351,10 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== "@webassemblyjs/helper-numbers@1.11.6": version "1.11.6" @@ -1369,15 +1370,15 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" "@webassemblyjs/ieee754@1.11.6": version "1.11.6" @@ -1398,59 +1399,59 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== -"@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" - -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== - dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-api-error" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^2.1.1": @@ -1597,11 +1598,9 @@ ansi-escapes@^4.2.1: type-fest "^0.21.3" ansi-escapes@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.0.tgz#8a13ce75286f417f1963487d86ba9f90dccf9947" - integrity sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw== - dependencies: - type-fest "^3.0.0" + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.1.tgz#76c54ce9b081dad39acec4b5d53377913825fb0f" + integrity sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig== ansi-html-community@^0.0.8: version "0.0.8" @@ -1736,7 +1735,7 @@ async-lock@^1.1.0: resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.4.1.tgz#56b8718915a9b68b10fce2f2a9a3dddf765ef53f" integrity sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ== -available-typed-arrays@^1.0.6: +available-typed-arrays@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== @@ -1814,9 +1813,9 @@ balanced-match@^1.0.0: integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== bare-events@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.2.1.tgz#7b6d421f26a7a755e20bf580b727c84b807964c1" - integrity sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A== + version "2.2.2" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.2.2.tgz#a98a41841f98b2efe7ecc5c5468814469b018078" + integrity sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ== base64-js@^1.3.1: version "1.5.1" @@ -1846,9 +1845,9 @@ bin-links@^3.0.3: write-file-atomic "^4.0.0" binary-extensions@^2.0.0, binary-extensions@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== body-parser@1.20.2: version "1.20.2" @@ -2035,9 +2034,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001587: - version "1.0.30001591" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz#16745e50263edc9f395895a7cd468b9f3767cf33" - integrity sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ== + version "1.0.30001600" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz#93a3ee17a35aa6a9f0c6ef1b2ab49507d1ab9079" + integrity sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ== cardinal@^2.1.1: version "2.1.1" @@ -2142,9 +2141,9 @@ cli-columns@^4.0.0: strip-ansi "^6.0.1" cli-table3@^0.6.2, cli-table3@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" - integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== + version "0.6.4" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.4.tgz#d1c536b8a3f2e7bec58f67ac9e5769b1b30088b0" + integrity sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw== dependencies: string-width "^4.2.0" optionalDependencies: @@ -2377,10 +2376,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== core-util-is@~1.0.0: version "1.0.3" @@ -2529,7 +2528,7 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-data-property@^1.0.1, define-data-property@^1.1.2: +define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== @@ -2713,9 +2712,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.668: - version "1.4.689" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.689.tgz#94fe370b800d978b606a2b4c0c5db5c8c98db4f2" - integrity sha512-GatzRKnGPS1go29ep25reM94xxd1Wj8ritU0yRhCJ/tr1Bg8gKnm6R9O/yPOhGQBoLMZ9ezfrpghNaTw97C/PQ== + version "1.4.715" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.715.tgz#bb16bcf2a3537962fccfa746b5c98c5f7404ff46" + integrity sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg== emittery@^0.13.1: version "0.13.1" @@ -2744,10 +2743,10 @@ encoding@^0.1.13: dependencies: iconv-lite "^0.6.2" -enhanced-resolve@^5.0.0, enhanced-resolve@^5.15.0: - version "5.15.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz#384391e025f099e67b4b00bfd7f0906a408214e1" - integrity sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg== +enhanced-resolve@^5.0.0, enhanced-resolve@^5.16.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" + integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -2801,9 +2800,9 @@ es-errors@^1.3.0: integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-module-lexer@^1.2.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" - integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== + version "1.4.2" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.2.tgz#ba1a62255ff9b41023aaf9bd08c016a5f1a3fef3" + integrity sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw== escalade@^3.1.1: version "3.1.2" @@ -2912,16 +2911,16 @@ exponential-backoff@^3.1.1: integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== express@^4.17.3: - version "4.18.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.3.tgz#6870746f3ff904dee1819b82e4b51509afffb0d4" - integrity sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw== + version "4.19.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.19.1.tgz#4700635795e911600a45596138cf5b0320e78256" + integrity sha512-K4w1/Bp7y8iSiVObmCrtq8Cs79XjJc/RU2YYkZQ7wpUu5ZyZ7MtPHkqoMz4pf+mgXfNvo2qft8D9OnrH2ABk9w== dependencies: accepts "~1.3.8" array-flatten "1.1.1" body-parser "1.20.2" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.5.0" + cookie "0.6.0" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" @@ -3164,7 +3163,7 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -3272,7 +3271,7 @@ graceful-fs@4.2.10: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -3309,7 +3308,7 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== @@ -3326,7 +3325,7 @@ has-symbols@^1.0.3: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0, has-tostringtag@^1.0.1: +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== @@ -3339,9 +3338,9 @@ has-unicode@^2.0.1: integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== hasown@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.1.tgz#26f48f039de2c0f8d3356c223fb8d50253519faa" - integrity sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA== + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" @@ -3385,9 +3384,9 @@ hpack.js@^2.1.6: wbuf "^1.1.0" html-entities@^2.3.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" - integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== + version "2.5.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.5.2.tgz#201a3cf95d3a15be7099521620d19dfb4f65359f" + integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA== html-escaper@^2.0.0: version "2.0.2" @@ -5627,9 +5626,9 @@ possible-typed-array-names@^1.0.0: integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== postcss-selector-parser@^6.0.10: - version "6.0.15" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" - integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== + version "6.0.16" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" + integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -5733,9 +5732,9 @@ punycode@^2.1.0: integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pure-rand@^6.0.0: - version "6.0.4" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" - integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== + version "6.1.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== q@^1.5.1: version "1.5.1" @@ -5755,11 +5754,11 @@ qs@6.11.0: side-channel "^1.0.4" qs@^6.11.2: - version "6.11.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + version "6.12.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.0.tgz#edd40c3b823995946a8a0b1f208669c7a200db77" + integrity sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg== dependencies: - side-channel "^1.0.4" + side-channel "^1.0.6" queue-microtask@^1.2.2: version "1.2.3" @@ -6204,16 +6203,16 @@ set-blocking@^2.0.0: integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== set-function-length@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425" - integrity sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g== + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: - define-data-property "^1.1.2" + define-data-property "^1.1.4" es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.3" + get-intrinsic "^1.2.4" gopd "^1.0.1" - has-property-descriptors "^1.0.1" + has-property-descriptors "^1.0.2" setprototypeof@1.1.0: version "1.1.0" @@ -6257,7 +6256,7 @@ shell-quote@^1.8.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== -side-channel@^1.0.4: +side-channel@^1.0.4, side-channel@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== @@ -6502,7 +6501,16 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"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== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +"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== @@ -6534,7 +6542,14 @@ 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== + dependencies: + ansi-regex "^5.0.1" + +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== @@ -6629,9 +6644,9 @@ tar-stream@^3.1.2: streamx "^2.15.0" tar@^6.1.0, tar@^6.1.11, tar@^6.1.2: - version "6.2.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" - integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -6668,9 +6683,9 @@ terser-webpack-plugin@^5.3.10: terser "^5.26.0" terser@^5.10.0, terser@^5.26.0: - version "5.28.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.28.1.tgz#bf00f7537fd3a798c352c2d67d67d65c915d1b28" - integrity sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA== + version "5.29.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.29.2.tgz#c17d573ce1da1b30f21a877bffd5655dd86fdb35" + integrity sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -6905,11 +6920,6 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-fest@^3.0.0: - version "3.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" - integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== - type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -6919,9 +6929,9 @@ type-is@~1.6.18: mime-types "~2.1.24" typescript@^5.1.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" - integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== + version "5.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" + integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== uglify-js@^3.1.4: version "3.17.4" @@ -7074,10 +7084,10 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== +watchpack@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" + integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -7120,10 +7130,10 @@ webpack-cli@^5.1.4: rechoir "^0.8.0" webpack-merge "^5.7.3" -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== +webpack-dev-middleware@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" + integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== dependencies: colorette "^2.0.10" memfs "^3.4.3" @@ -7132,9 +7142,9 @@ webpack-dev-middleware@^5.3.1: schema-utils "^4.0.0" webpack-dev-server@^4.15.1: - version "4.15.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" - integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== + version "4.15.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz#9e0c70a42a012560860adb186986da1248333173" + integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -7164,7 +7174,7 @@ webpack-dev-server@^4.15.1: serve-index "^1.9.1" sockjs "^0.3.24" spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" + webpack-dev-middleware "^5.3.4" ws "^8.13.0" webpack-merge@^5.7.3: @@ -7182,25 +7192,25 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.87.0: - version "5.90.3" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.90.3.tgz#37b8f74d3ded061ba789bb22b31e82eed75bd9ac" - integrity sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA== + version "5.91.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9" + integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.5" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" acorn "^8.7.1" acorn-import-assertions "^1.9.0" browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.15.0" + enhanced-resolve "^5.16.0" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" + graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" @@ -7208,7 +7218,7 @@ webpack@^5.87.0: schema-utils "^3.2.0" tapable "^2.1.1" terser-webpack-plugin "^5.3.10" - watchpack "^2.4.0" + watchpack "^2.4.1" webpack-sources "^3.2.3" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: @@ -7234,15 +7244,15 @@ whatwg-url@^5.0.0: webidl-conversions "^3.0.0" which-typed-array@^1.1.14, which-typed-array@^1.1.2: - version "1.1.14" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.14.tgz#1f78a111aee1e131ca66164d8bdc3ab062c95a06" - integrity sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg== + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: - available-typed-arrays "^1.0.6" - call-bind "^1.0.5" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-tostringtag "^1.0.1" + has-tostringtag "^1.0.2" which@^2.0.1, which@^2.0.2: version "2.0.2" @@ -7268,7 +7278,16 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -"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== + dependencies: + ansi-styles "^4.0.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== From cf9b0b3252a5dca9677df25786a9589c11a93f41 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 30 Mar 2024 12:54:09 +1300 Subject: [PATCH 14/37] chore(deps): lock file maintenance (#1017) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 78 +++++++++++++++++++++++++++---------------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/yarn.lock b/yarn.lock index c137cfe75..03b776225 100644 --- a/yarn.lock +++ b/yarn.lock @@ -594,9 +594,9 @@ "@jridgewell/sourcemap-codec" "^1.4.14" "@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1040,9 +1040,9 @@ integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== "@tsconfig/node10@^1.0.7": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.10.tgz#b7ebd3adfa7750628d100594f6726b054d2c33b2" - integrity sha512-PiaIWIoPvO6qm6t114ropMCagj6YAF24j9OkCA2mJDXFnlionEwhsBCJ8yek4aib575BI3OkART/90WsgHgLWw== + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== "@tsconfig/node12@^1.0.7": version "1.0.11" @@ -2712,9 +2712,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.668: - version "1.4.715" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.715.tgz#bb16bcf2a3537962fccfa746b5c98c5f7404ff46" - integrity sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg== + version "1.4.722" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.722.tgz#99ae3484c5fc0f387d39ad98d77e1f259b9f4074" + integrity sha512-5nLE0TWFFpZ80Crhtp4pIp8LXCztjYX41yUcV6b+bKR2PqzjskTMOOlBi1VjBHlvHwS+4gar7kNKOrsbsewEZQ== emittery@^0.13.1: version "0.13.1" @@ -2800,9 +2800,9 @@ es-errors@^1.3.0: integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-module-lexer@^1.2.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.2.tgz#ba1a62255ff9b41023aaf9bd08c016a5f1a3fef3" - integrity sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw== + version "1.5.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.0.tgz#4878fee3789ad99e065f975fdd3c645529ff0236" + integrity sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw== escalade@^3.1.1: version "3.1.2" @@ -2911,9 +2911,9 @@ exponential-backoff@^3.1.1: integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== express@^4.17.3: - version "4.19.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.19.1.tgz#4700635795e911600a45596138cf5b0320e78256" - integrity sha512-K4w1/Bp7y8iSiVObmCrtq8Cs79XjJc/RU2YYkZQ7wpUu5ZyZ7MtPHkqoMz4pf+mgXfNvo2qft8D9OnrH2ABk9w== + version "4.19.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" + integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== dependencies: accepts "~1.3.8" array-flatten "1.1.1" @@ -3209,15 +3209,15 @@ glob-to-regexp@^0.4.1: integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== glob@^10.3.7: - version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + version "10.3.12" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b" + integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg== dependencies: foreground-child "^3.1.0" - jackspeak "^2.3.5" + jackspeak "^2.3.6" minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" + minipass "^7.0.4" + path-scurry "^1.10.2" glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: version "7.2.3" @@ -3927,7 +3927,7 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jackspeak@^2.3.5: +jackspeak@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== @@ -4608,6 +4608,11 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" +lru-cache@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4627,11 +4632,6 @@ lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -"lru-cache@^9.1.1 || ^10.0.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" - integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== - make-dir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" @@ -4814,9 +4814,9 @@ minimatch@^5.0.1, minimatch@^5.1.0: brace-expansion "^2.0.1" minimatch@^9.0.1: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== dependencies: brace-expansion "^2.0.1" @@ -4900,7 +4900,7 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: version "7.0.4" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== @@ -5562,12 +5562,12 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" - integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== +path-scurry@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" + integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== dependencies: - lru-cache "^9.1.1 || ^10.0.0" + lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-to-regexp@0.1.7: @@ -6683,9 +6683,9 @@ terser-webpack-plugin@^5.3.10: terser "^5.26.0" terser@^5.10.0, terser@^5.26.0: - version "5.29.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.29.2.tgz#c17d573ce1da1b30f21a877bffd5655dd86fdb35" - integrity sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw== + version "5.30.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.0.tgz#64cb2af71e16ea3d32153f84d990f9be0cdc22bf" + integrity sha512-Y/SblUl5kEyEFzhMAQdsxVHh+utAxd4IuRNJzKywY/4uzSogh3G219jqbDDxYu4MXO9CzY3tSEqmZvW6AoEDJw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" From b8905eb0661d926f45e9a6012658210794e86d31 Mon Sep 17 00:00:00 2001 From: Clark Jacobsohn Date: Sat, 30 Mar 2024 20:46:40 -0400 Subject: [PATCH 15/37] fix: fix handle paths in FSA entries iterator (#1019) * fix: fix file handle path in FSA entries iterator * Fix directory handle paths and add assertions --- src/node-to-fsa/NodeFileSystemDirectoryHandle.ts | 4 ++-- .../__tests__/NodeFileSystemDirectoryHandle.test.ts | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/node-to-fsa/NodeFileSystemDirectoryHandle.ts b/src/node-to-fsa/NodeFileSystemDirectoryHandle.ts index f72ebeafd..8fa9b4431 100644 --- a/src/node-to-fsa/NodeFileSystemDirectoryHandle.ts +++ b/src/node-to-fsa/NodeFileSystemDirectoryHandle.ts @@ -57,9 +57,9 @@ export class NodeFileSystemDirectoryHandle extends NodeFileSystemHandle implemen for (const d of list) { const dirent = d as Dirent; const name = dirent.name + ''; - const newPath = path + ctx.separator! + name; + const newPath = path + name; if (dirent.isDirectory()) yield [name, new NodeFileSystemDirectoryHandle(fs, newPath, ctx)]; - else if (dirent.isFile()) yield [name, new NodeFileSystemFileHandle(fs, name, ctx)]; + else if (dirent.isFile()) yield [name, new NodeFileSystemFileHandle(fs, newPath, ctx)]; } } diff --git a/src/node-to-fsa/__tests__/NodeFileSystemDirectoryHandle.test.ts b/src/node-to-fsa/__tests__/NodeFileSystemDirectoryHandle.test.ts index 5f392d326..176c8445e 100644 --- a/src/node-to-fsa/__tests__/NodeFileSystemDirectoryHandle.test.ts +++ b/src/node-to-fsa/__tests__/NodeFileSystemDirectoryHandle.test.ts @@ -64,6 +64,7 @@ onlyOnNode20('NodeFileSystemDirectoryHandle', () => { expect(subdir).toBeInstanceOf(NodeFileSystemDirectoryHandle); expect(subdir.kind).toBe('directory'); expect(subdir.name).toBe('My Documents'); + expect((subdir as NodeFileSystemDirectoryHandle).__path).toBe('/My Documents/'); } }); @@ -76,6 +77,7 @@ onlyOnNode20('NodeFileSystemDirectoryHandle', () => { expect(file).toBeInstanceOf(NodeFileSystemFileHandle); expect(file.kind).toBe('file'); expect(file.name).toBe('file.txt'); + await expect((file as NodeFileSystemFileHandle).getFile()).resolves.toBeInstanceOf(File); } }); From d4588bdca877d5399f44c8a1d3ba05b5cc38d648 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 31 Mar 2024 00:50:01 +0000 Subject: [PATCH 16/37] chore(release): 4.8.1 [skip ci] ## [4.8.1](https://github.com/streamich/memfs/compare/v4.8.0...v4.8.1) (2024-03-31) ### Bug Fixes * fix handle paths in FSA entries iterator ([#1019](https://github.com/streamich/memfs/issues/1019)) ([b8905eb](https://github.com/streamich/memfs/commit/b8905eb0661d926f45e9a6012658210794e86d31)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 662f0e2e7..b5a02396c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [4.8.1](https://github.com/streamich/memfs/compare/v4.8.0...v4.8.1) (2024-03-31) + + +### Bug Fixes + +* fix handle paths in FSA entries iterator ([#1019](https://github.com/streamich/memfs/issues/1019)) ([b8905eb](https://github.com/streamich/memfs/commit/b8905eb0661d926f45e9a6012658210794e86d31)) + # [4.8.0](https://github.com/streamich/memfs/compare/v4.7.7...v4.8.0) (2024-03-19) diff --git a/package.json b/package.json index dd6d74e95..ed693e359 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "memfs", - "version": "4.8.0", + "version": "4.8.1", "description": "In-memory file-system with Node's fs API.", "keywords": [ "fs", From 261216338bbacfb05e99d4a80d6527756a745027 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 6 Apr 2024 12:03:41 +1300 Subject: [PATCH 17/37] chore(deps): lock file maintenance (#1021) * chore(deps): lock file maintenance * chore: depend explicitly on old `mime` types --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Gareth Jones --- package.json | 1 + yarn.lock | 67 +++++++++++++++++++++------------------------------- 2 files changed, 28 insertions(+), 40 deletions(-) diff --git a/package.json b/package.json index ed693e359..fd63d096f 100644 --- a/package.json +++ b/package.json @@ -129,6 +129,7 @@ "@semantic-release/npm": "^9.0.1", "@types/jest": "^29.0.0", "@types/node": "^10.17.60", + "@types/mime": "^3.0.0", "app-root-path": "^3.1.0", "assert": "^2.0.0", "buffer": "^6.0.3", diff --git a/yarn.lock b/yarn.lock index 03b776225..377f78eeb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1220,15 +1220,22 @@ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/mime@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" - integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-4.0.0.tgz#b5f8a75697ac775ecf1daaea9bfb91cde065b397" + integrity sha512-5eEkJZ/BLvTE3vXGKkWlyTSUVZuzj23Wj8PoyOq2lt5I3CYbiLBOPb3XmCW6QcuOibIUE6emHXHt9E/F/rCa6w== + dependencies: + mime "*" "@types/mime@^1": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== +"@types/mime@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" + integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== + "@types/minimist@^1.2.0": version "1.2.5" resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" @@ -1242,9 +1249,9 @@ "@types/node" "*" "@types/node@*": - version "20.11.30" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f" - integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== + version "20.12.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.2.tgz#9facdd11102f38b21b4ebedd9d7999663343d72e" + integrity sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ== dependencies: undici-types "~5.26.4" @@ -1530,9 +1537,9 @@ agent-base@6, agent-base@^6.0.2: debug "4" agent-base@^7.0.2, agent-base@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" - integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== dependencies: debug "^4.3.4" @@ -2034,9 +2041,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001587: - version "1.0.30001600" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz#93a3ee17a35aa6a9f0c6ef1b2ab49507d1ab9079" - integrity sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ== + version "1.0.30001603" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001603.tgz#605046a5bdc95ba4a92496d67e062522dce43381" + integrity sha512-iL2iSS0eDILMb9n5yKQoTBim9jMZ0Yrk8g0N9K7UzYyWnfIKzXBZD5ngpM37ZcL/cv0Mli8XtVMRYMQAfFpi5Q== cardinal@^2.1.1: version "2.1.1" @@ -4769,6 +4776,11 @@ mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, dependencies: mime-db "1.52.0" +mime@*: + version "4.0.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-4.0.1.tgz#ad7563d1bfe30253ad97dedfae2b1009d01b9470" + integrity sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA== + mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -6501,16 +6513,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"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== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -"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", "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== @@ -6542,14 +6545,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"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== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", 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== @@ -7278,16 +7274,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -"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== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.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== From 711c4bd24667c88a45551f1bed7a5069d7170dc2 Mon Sep 17 00:00:00 2001 From: Jonas Schneider Date: Sun, 14 Apr 2024 21:27:33 +0200 Subject: [PATCH 18/37] fix: don't include filename in `path` when calling `readdir` with `withFileTypes: true` (#1024) * fix: readdir withFileType path bug * fix: readdir(recursive) normalize to unix filepath sep. in filenames * fix: fullPath normalization inplace * fix: formatting * fix: remove debugging console statement --- src/Dirent.ts | 2 +- src/__tests__/volume/readdirSync.test.ts | 24 ++++++++++++------------ src/node.ts | 4 ++++ src/volume.ts | 6 +++++- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/Dirent.ts b/src/Dirent.ts index e92542ba8..32cafd514 100644 --- a/src/Dirent.ts +++ b/src/Dirent.ts @@ -15,7 +15,7 @@ export class Dirent implements IDirent { dirent.name = strToEncoding(link.getName(), encoding); dirent.mode = mode; - dirent.path = link.getPath(); + dirent.path = link.getParentPath(); return dirent; } diff --git a/src/__tests__/volume/readdirSync.test.ts b/src/__tests__/volume/readdirSync.test.ts index 23dd37e48..adf03fd29 100644 --- a/src/__tests__/volume/readdirSync.test.ts +++ b/src/__tests__/volume/readdirSync.test.ts @@ -67,9 +67,9 @@ describe('readdirSync()', () => { return { ...dirent }; }); expect(mapped).toEqual([ - { mode: 33206, name: 'af', path: '/x/af' }, - { mode: 16895, name: 'b', path: '/x/b' }, - { mode: 16895, name: 'c', path: '/x/c' }, + { mode: 33206, name: 'af', path: '/x' }, + { mode: 16895, name: 'b', path: '/x' }, + { mode: 16895, name: 'c', path: '/x' }, ]); }); @@ -105,16 +105,16 @@ describe('readdirSync()', () => { }) .sort((a, b) => a.path.localeCompare(b.path)); expect(mapped).toEqual([ - { mode: 33206, name: 'af1', path: '/z/af1' }, - { mode: 33206, name: 'af2', path: '/z/af2' }, - { mode: 16895, name: 'b', path: '/z/b' }, - { mode: 33206, name: 'bf1', path: '/z/b/bf1' }, - { mode: 33206, name: 'bf2', path: '/z/b/bf2' }, + { mode: 33206, name: 'af1', path: '/z' }, + { mode: 33206, name: 'af2', path: '/z' }, + { mode: 16895, name: 'b', path: '/z' }, + { mode: 16895, name: 'c', path: '/z' }, + { mode: 33206, name: 'bf1', path: '/z/b' }, + { mode: 33206, name: 'bf2', path: '/z/b' }, { mode: 16895, name: 'c', path: '/z/c' }, - { mode: 16895, name: 'c', path: '/z/c/c' }, - { mode: 33206, name: '.cf0', path: '/z/c/c/.cf0' }, - { mode: 33206, name: 'cf1', path: '/z/c/c/cf1' }, - { mode: 33206, name: 'cf2', path: '/z/c/c/cf2' }, + { mode: 33206, name: '.cf0', path: '/z/c/c' }, + { mode: 33206, name: 'cf1', path: '/z/c/c' }, + { mode: 33206, name: 'cf2', path: '/z/c/c' }, ]); }); }); diff --git a/src/node.ts b/src/node.ts index c54191537..9df2ead26 100644 --- a/src/node.ts +++ b/src/node.ts @@ -409,6 +409,10 @@ export class Link extends EventEmitter { return this.steps.join(SEP); } + getParentPath(): string { + return this.steps.slice(0, -1).join(SEP); + } + getName(): string { return this.steps[this.steps.length - 1]; } diff --git a/src/volume.ts b/src/volume.ts index 4f289b07c..32ff2c99c 100644 --- a/src/volume.ts +++ b/src/volume.ts @@ -1496,7 +1496,11 @@ export class Volume implements FsCallbackApi, FsSynchronousApi { return list.map(dirent => { if (options.recursive) { - return dirent.path.replace(filename2 + pathModule.posix.sep, ''); + let fullPath = pathModule.join(dirent.path, dirent.name.toString()); + if (isWin) { + fullPath = fullPath.replace(/\\/g, '/'); + } + return fullPath.replace(filename2 + pathModule.posix.sep, ''); } return dirent.name; }); From 577ee35951deb563f4c647c2f07a9bfbea5d0b25 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 14 Apr 2024 19:30:18 +0000 Subject: [PATCH 19/37] chore(release): 4.8.2 [skip ci] ## [4.8.2](https://github.com/streamich/memfs/compare/v4.8.1...v4.8.2) (2024-04-14) ### Bug Fixes * don't include filename in `path` when calling `readdir` with `withFileTypes: true` ([#1024](https://github.com/streamich/memfs/issues/1024)) ([711c4bd](https://github.com/streamich/memfs/commit/711c4bd24667c88a45551f1bed7a5069d7170dc2)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5a02396c..95fc46c35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [4.8.2](https://github.com/streamich/memfs/compare/v4.8.1...v4.8.2) (2024-04-14) + + +### Bug Fixes + +* don't include filename in `path` when calling `readdir` with `withFileTypes: true` ([#1024](https://github.com/streamich/memfs/issues/1024)) ([711c4bd](https://github.com/streamich/memfs/commit/711c4bd24667c88a45551f1bed7a5069d7170dc2)) + ## [4.8.1](https://github.com/streamich/memfs/compare/v4.8.0...v4.8.1) (2024-03-31) diff --git a/package.json b/package.json index fd63d096f..82531f093 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "memfs", - "version": "4.8.1", + "version": "4.8.2", "description": "In-memory file-system with Node's fs API.", "keywords": [ "fs", From 921e05d26092f6dbf5a4a302c4ac251944d5d008 Mon Sep 17 00:00:00 2001 From: streamich Date: Sat, 27 Apr 2024 12:21:59 +0200 Subject: [PATCH 20/37] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20define=20.scan()?= =?UTF-8?q?=20CRUD=20method?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/crud/types.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/crud/types.ts b/src/crud/types.ts index 13a100c8d..1f39554c9 100644 --- a/src/crud/types.ts +++ b/src/crud/types.ts @@ -46,6 +46,14 @@ export interface CrudApi { */ drop: (collection: CrudCollection, silent?: boolean) => Promise; + /** + * Iterates over all resources of a collection. + * + * @param collection Type of the resource, collection name. + * @returns Iterator of resources of the given type. + */ + scan: (collection: CrudCollection) => AsyncIterableIterator; + /** * Fetches a list of resources of a collection, and sub-collections. * @@ -84,8 +92,3 @@ export interface CrudResourceInfo extends CrudCollectionEntry { /** Timestamp when the resource was created. */ created?: number; } - -export interface CrudScanResult { - cursor: string | ''; - list: CrudCollectionEntry[]; -} From a148fb89d0373442f5773c6656e433abdafdb2a0 Mon Sep 17 00:00:00 2001 From: streamich Date: Sat, 27 Apr 2024 12:22:18 +0200 Subject: [PATCH 21/37] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20implement=20.scan(?= =?UTF-8?q?)=20method=20for=20FSA=20CRUD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/crud/__tests__/testCrudfs.ts | 53 ++++++++++++++++++++++++++++++-- src/fsa-to-crud/FsaCrud.ts | 18 ++++++----- 2 files changed, 61 insertions(+), 10 deletions(-) diff --git a/src/crud/__tests__/testCrudfs.ts b/src/crud/__tests__/testCrudfs.ts index 433fe2510..6054f71fd 100644 --- a/src/crud/__tests__/testCrudfs.ts +++ b/src/crud/__tests__/testCrudfs.ts @@ -1,5 +1,5 @@ import { of } from '../../thingies'; -import type { CrudApi } from '../types'; +import type { CrudApi, CrudCollectionEntry } from '../types'; export type Setup = () => { crud: CrudApi; @@ -271,12 +271,59 @@ export const testCrudfs = (setup: Setup) => { }); }); + describe('.scan()', () => { + test('throws if the collection is not valid', async () => { + const { crud } = setup(); + try { + const iterable = crud.scan(['./..', 'foo']); + await iterable.next(); + throw 'should not reach here'; + } catch (err) { + expect(err).toBeInstanceOf(TypeError); + expect((err).message).toBe("Failed to execute 'scan' on 'crudfs': Name is not allowed."); + } + }); + + test('can retrieve a list of resources and collections at root', async () => { + const { crud } = setup(); + await crud.put(['foo'], 'bar', b('1')); + await crud.put([], 'baz', b('1')); + await crud.put([], 'qux', b('2')); + const list: CrudCollectionEntry[] = []; + for await (const entry of crud.scan([])) list.push(entry); + expect(list.length).toBe(3); + expect(list.find(x => x.id === 'baz')).toMatchObject({ + type: 'resource', + id: 'baz', + }); + expect(list.find(x => x.id === 'qux')).toMatchObject({ + type: 'resource', + id: 'qux', + }); + expect(list.find(x => x.id === 'foo')).toMatchObject({ + type: 'collection', + id: 'foo', + }); + }); + + test('throws when trying to list a non-existing collection', async () => { + const { crud } = setup(); + await crud.put(['foo'], 'bar', b('1')); + await crud.put([], 'baz', b('1')); + await crud.put([], 'qux', b('2')); + const iterator = crud.scan(['gg']); + const [, err] = await of(iterator.next()); + expect(err).toBeInstanceOf(DOMException); + expect((err).name).toBe('CollectionNotFound'); + }); + }); + describe('.list()', () => { test('throws if the collection is not valid', async () => { const { crud } = setup(); const [, err] = await of(crud.list(['./..', 'foo'])); expect(err).toBeInstanceOf(TypeError); - expect((err).message).toBe("Failed to execute 'drop' on 'crudfs': Name is not allowed."); + expect((err).message).toBe("Failed to execute 'scan' on 'crudfs': Name is not allowed."); }); test('can retrieve a list of resources and collections at root', async () => { @@ -300,7 +347,7 @@ export const testCrudfs = (setup: Setup) => { }); }); - test('throws when try to list a non-existing collection', async () => { + test('throws when trying to list a non-existing collection', async () => { const { crud } = setup(); await crud.put(['foo'], 'bar', b('1')); await crud.put([], 'baz', b('1')); diff --git a/src/fsa-to-crud/FsaCrud.ts b/src/fsa-to-crud/FsaCrud.ts index 9108ac646..59b3472bb 100644 --- a/src/fsa-to-crud/FsaCrud.ts +++ b/src/fsa-to-crud/FsaCrud.ts @@ -137,23 +137,27 @@ export class FsaCrud implements crud.CrudApi { } }; - public readonly list = async (collection: crud.CrudCollection): Promise => { - assertType(collection, 'drop', 'crudfs'); + public readonly scan = async function* (collection: crud.CrudCollection): AsyncIterableIterator { + assertType(collection, 'scan', 'crudfs'); const [dir] = await this.getDir(collection, false); - const entries: crud.CrudCollectionEntry[] = []; for await (const [id, handle] of dir.entries()) { if (handle.kind === 'file') { - entries.push({ + yield { type: 'resource', id, - }); + }; } else if (handle.kind === 'directory') { - entries.push({ + yield { type: 'collection', id, - }); + }; } } + }; + + public readonly list = async (collection: crud.CrudCollection): Promise => { + const entries: crud.CrudCollectionEntry[] = []; + for await (const entry of this.scan(collection)) entries.push(entry); return entries; }; From 3d973b7dd4475c6a59443171795ef5449d11805b Mon Sep 17 00:00:00 2001 From: streamich Date: Sat, 27 Apr 2024 12:23:59 +0200 Subject: [PATCH 22/37] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20implement=20.scan(?= =?UTF-8?q?)=20in=20Node.js=20CRUD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/node-to-crud/NodeCrud.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/node-to-crud/NodeCrud.ts b/src/node-to-crud/NodeCrud.ts index c5953129b..6c4a527c3 100644 --- a/src/node-to-crud/NodeCrud.ts +++ b/src/node-to-crud/NodeCrud.ts @@ -182,24 +182,28 @@ export class NodeCrud implements crud.CrudApi { } }; - public readonly list = async (collection: crud.CrudCollection): Promise => { - assertType(collection, 'drop', 'crudfs'); + public readonly scan = async function* (collection: crud.CrudCollection): AsyncIterableIterator { + assertType(collection, 'scan', 'crudfs'); const dir = await this.checkDir(collection); const dirents = (await this.fs.readdir(dir, { withFileTypes: true })) as IDirent[]; - const entries: crud.CrudCollectionEntry[] = []; for await (const entry of dirents) { if (entry.isFile()) { - entries.push({ + yield { type: 'resource', id: '' + entry.name, - }); + }; } else if (entry.isDirectory()) { - entries.push({ + yield { type: 'collection', id: '' + entry.name, - }); + }; } } + }; + + public readonly list = async (collection: crud.CrudCollection): Promise => { + const entries: crud.CrudCollectionEntry[] = []; + for await (const entry of this.scan(collection)) entries.push(entry); return entries; }; From 2351ff27e034004fbfe73339178bc60b00488a0d Mon Sep 17 00:00:00 2001 From: streamich Date: Sat, 27 Apr 2024 12:27:13 +0200 Subject: [PATCH 23/37] =?UTF-8?q?style:=20=F0=9F=92=84=20run=20Prettier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/crud-to-cas/CrudCas.ts | 5 +---- src/fsa-to-crud/FsaCrud.ts | 4 +++- src/fsa-to-node/FsaNodeDirent.ts | 5 +---- src/fsa-to-node/FsaNodeStats.ts | 6 +----- src/node-to-crud/NodeCrud.ts | 4 +++- src/node-to-fsa/NodeFileSystemDirectoryHandle.ts | 6 +----- src/node-to-fsa/NodeFileSystemFileHandle.ts | 6 +----- src/node-to-fsa/NodeFileSystemHandle.ts | 5 +---- src/node-to-fsa/NodeFileSystemWritableFileStream.ts | 6 +----- src/node-to-fsa/NodePermissionStatus.ts | 5 +---- 10 files changed, 14 insertions(+), 38 deletions(-) diff --git a/src/crud-to-cas/CrudCas.ts b/src/crud-to-cas/CrudCas.ts index d08e82665..d9881697e 100644 --- a/src/crud-to-cas/CrudCas.ts +++ b/src/crud-to-cas/CrudCas.ts @@ -9,10 +9,7 @@ export interface CrudCasOptions { const hashEqual = (h1: string, h2: string) => h1 === h2; export class CrudCas extends CrudCasBase { - constructor( - protected readonly crud: CrudApi, - protected readonly options: CrudCasOptions, - ) { + constructor(protected readonly crud: CrudApi, protected readonly options: CrudCasOptions) { super(crud, options.hash, hashToLocation, hashEqual); } } diff --git a/src/fsa-to-crud/FsaCrud.ts b/src/fsa-to-crud/FsaCrud.ts index 59b3472bb..7bce1c45c 100644 --- a/src/fsa-to-crud/FsaCrud.ts +++ b/src/fsa-to-crud/FsaCrud.ts @@ -137,7 +137,9 @@ export class FsaCrud implements crud.CrudApi { } }; - public readonly scan = async function* (collection: crud.CrudCollection): AsyncIterableIterator { + public readonly scan = async function* ( + collection: crud.CrudCollection, + ): AsyncIterableIterator { assertType(collection, 'scan', 'crudfs'); const [dir] = await this.getDir(collection, false); for await (const [id, handle] of dir.entries()) { diff --git a/src/fsa-to-node/FsaNodeDirent.ts b/src/fsa-to-node/FsaNodeDirent.ts index 634167c4a..94251926a 100644 --- a/src/fsa-to-node/FsaNodeDirent.ts +++ b/src/fsa-to-node/FsaNodeDirent.ts @@ -1,10 +1,7 @@ import type { IDirent, TDataOut } from '../node/types/misc'; export class FsaNodeDirent implements IDirent { - public constructor( - public readonly name: TDataOut, - protected readonly kind: 'file' | 'directory', - ) {} + public constructor(public readonly name: TDataOut, protected readonly kind: 'file' | 'directory') {} public isDirectory(): boolean { return this.kind === 'directory'; diff --git a/src/fsa-to-node/FsaNodeStats.ts b/src/fsa-to-node/FsaNodeStats.ts index d91756a49..3407dba00 100644 --- a/src/fsa-to-node/FsaNodeStats.ts +++ b/src/fsa-to-node/FsaNodeStats.ts @@ -24,11 +24,7 @@ export class FsaNodeStats implements misc.IStats { public readonly mode: T; public readonly nlink: T; - public constructor( - isBigInt: boolean, - size: T, - protected readonly kind: 'file' | 'directory', - ) { + public constructor(isBigInt: boolean, size: T, protected readonly kind: 'file' | 'directory') { const dummy = (isBigInt ? timex : time) as any as T; this.uid = dummy; this.gid = dummy; diff --git a/src/node-to-crud/NodeCrud.ts b/src/node-to-crud/NodeCrud.ts index 6c4a527c3..b449609e1 100644 --- a/src/node-to-crud/NodeCrud.ts +++ b/src/node-to-crud/NodeCrud.ts @@ -182,7 +182,9 @@ export class NodeCrud implements crud.CrudApi { } }; - public readonly scan = async function* (collection: crud.CrudCollection): AsyncIterableIterator { + public readonly scan = async function* ( + collection: crud.CrudCollection, + ): AsyncIterableIterator { assertType(collection, 'scan', 'crudfs'); const dir = await this.checkDir(collection); const dirents = (await this.fs.readdir(dir, { withFileTypes: true })) as IDirent[]; diff --git a/src/node-to-fsa/NodeFileSystemDirectoryHandle.ts b/src/node-to-fsa/NodeFileSystemDirectoryHandle.ts index 8fa9b4431..1bf7fa21b 100644 --- a/src/node-to-fsa/NodeFileSystemDirectoryHandle.ts +++ b/src/node-to-fsa/NodeFileSystemDirectoryHandle.ts @@ -27,11 +27,7 @@ export class NodeFileSystemDirectoryHandle extends NodeFileSystemHandle implemen /** Directory path with trailing slash. */ public readonly __path: string; - public constructor( - protected readonly fs: NodeFsaFs, - path: string, - ctx: Partial = {}, - ) { + public constructor(protected readonly fs: NodeFsaFs, path: string, ctx: Partial = {}) { super('directory', basename(path, ctx.separator || '/')); this.ctx = createCtx(ctx); this.__path = path[path.length - 1] === this.ctx.separator ? path : path + this.ctx.separator; diff --git a/src/node-to-fsa/NodeFileSystemFileHandle.ts b/src/node-to-fsa/NodeFileSystemFileHandle.ts index 31faf332a..ab5206bdb 100644 --- a/src/node-to-fsa/NodeFileSystemFileHandle.ts +++ b/src/node-to-fsa/NodeFileSystemFileHandle.ts @@ -8,11 +8,7 @@ import type { IFileSystemFileHandle, IFileSystemSyncAccessHandle } from '../fsa/ export class NodeFileSystemFileHandle extends NodeFileSystemHandle implements IFileSystemFileHandle { protected readonly ctx: NodeFsaContext; - constructor( - protected readonly fs: NodeFsaFs, - public readonly __path: string, - ctx: Partial = {}, - ) { + constructor(protected readonly fs: NodeFsaFs, public readonly __path: string, ctx: Partial = {}) { ctx = createCtx(ctx); super('file', basename(__path, ctx.separator!)); this.ctx = ctx as NodeFsaContext; diff --git a/src/node-to-fsa/NodeFileSystemHandle.ts b/src/node-to-fsa/NodeFileSystemHandle.ts index 8dc19a292..95233d63b 100644 --- a/src/node-to-fsa/NodeFileSystemHandle.ts +++ b/src/node-to-fsa/NodeFileSystemHandle.ts @@ -8,10 +8,7 @@ import type { IFileSystemHandle, FileSystemHandlePermissionDescriptor } from '.. * @see [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemHandle) */ export abstract class NodeFileSystemHandle implements IFileSystemHandle { - constructor( - public readonly kind: 'file' | 'directory', - public readonly name: string, - ) {} + constructor(public readonly kind: 'file' | 'directory', public readonly name: string) {} /** * Compares two handles to see if the associated entries (either a file or directory) match. diff --git a/src/node-to-fsa/NodeFileSystemWritableFileStream.ts b/src/node-to-fsa/NodeFileSystemWritableFileStream.ts index 61e7f91ff..d9381ce18 100644 --- a/src/node-to-fsa/NodeFileSystemWritableFileStream.ts +++ b/src/node-to-fsa/NodeFileSystemWritableFileStream.ts @@ -61,11 +61,7 @@ interface SwapFile { export class NodeFileSystemWritableFileStream extends WritableStream implements IFileSystemWritableFileStream { protected readonly swap: SwapFile; - constructor( - protected readonly fs: NodeFsaFs, - protected readonly path: string, - keepExistingData: boolean, - ) { + constructor(protected readonly fs: NodeFsaFs, protected readonly path: string, keepExistingData: boolean) { const swap: SwapFile = { handle: undefined, path: '', offset: 0 }; super({ async start() { diff --git a/src/node-to-fsa/NodePermissionStatus.ts b/src/node-to-fsa/NodePermissionStatus.ts index 2de2e33f6..6039bb0ac 100644 --- a/src/node-to-fsa/NodePermissionStatus.ts +++ b/src/node-to-fsa/NodePermissionStatus.ts @@ -2,8 +2,5 @@ * @see [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/PermissionStatus) */ export class NodePermissionStatus { - constructor( - public readonly name: string, - public readonly state: 'granted' | 'denied' | 'prompt', - ) {} + constructor(public readonly name: string, public readonly state: 'granted' | 'denied' | 'prompt') {} } From 456e004be6a3240a10b51138b5bd79e76585f827 Mon Sep 17 00:00:00 2001 From: streamich Date: Sat, 27 Apr 2024 12:36:25 +0200 Subject: [PATCH 24/37] =?UTF-8?q?style:=20=F0=9F=92=84=20run=20Prettier=20?= =?UTF-8?q?with=20updated=20deps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/crud-to-cas/CrudCas.ts | 5 ++++- src/fsa-to-node/FsaNodeDirent.ts | 5 ++++- src/fsa-to-node/FsaNodeStats.ts | 6 +++++- src/node-to-fsa/NodeFileSystemDirectoryHandle.ts | 6 +++++- src/node-to-fsa/NodeFileSystemFileHandle.ts | 6 +++++- src/node-to-fsa/NodeFileSystemHandle.ts | 5 ++++- src/node-to-fsa/NodeFileSystemWritableFileStream.ts | 6 +++++- src/node-to-fsa/NodePermissionStatus.ts | 5 ++++- 8 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/crud-to-cas/CrudCas.ts b/src/crud-to-cas/CrudCas.ts index d9881697e..d08e82665 100644 --- a/src/crud-to-cas/CrudCas.ts +++ b/src/crud-to-cas/CrudCas.ts @@ -9,7 +9,10 @@ export interface CrudCasOptions { const hashEqual = (h1: string, h2: string) => h1 === h2; export class CrudCas extends CrudCasBase { - constructor(protected readonly crud: CrudApi, protected readonly options: CrudCasOptions) { + constructor( + protected readonly crud: CrudApi, + protected readonly options: CrudCasOptions, + ) { super(crud, options.hash, hashToLocation, hashEqual); } } diff --git a/src/fsa-to-node/FsaNodeDirent.ts b/src/fsa-to-node/FsaNodeDirent.ts index 94251926a..634167c4a 100644 --- a/src/fsa-to-node/FsaNodeDirent.ts +++ b/src/fsa-to-node/FsaNodeDirent.ts @@ -1,7 +1,10 @@ import type { IDirent, TDataOut } from '../node/types/misc'; export class FsaNodeDirent implements IDirent { - public constructor(public readonly name: TDataOut, protected readonly kind: 'file' | 'directory') {} + public constructor( + public readonly name: TDataOut, + protected readonly kind: 'file' | 'directory', + ) {} public isDirectory(): boolean { return this.kind === 'directory'; diff --git a/src/fsa-to-node/FsaNodeStats.ts b/src/fsa-to-node/FsaNodeStats.ts index 3407dba00..d91756a49 100644 --- a/src/fsa-to-node/FsaNodeStats.ts +++ b/src/fsa-to-node/FsaNodeStats.ts @@ -24,7 +24,11 @@ export class FsaNodeStats implements misc.IStats { public readonly mode: T; public readonly nlink: T; - public constructor(isBigInt: boolean, size: T, protected readonly kind: 'file' | 'directory') { + public constructor( + isBigInt: boolean, + size: T, + protected readonly kind: 'file' | 'directory', + ) { const dummy = (isBigInt ? timex : time) as any as T; this.uid = dummy; this.gid = dummy; diff --git a/src/node-to-fsa/NodeFileSystemDirectoryHandle.ts b/src/node-to-fsa/NodeFileSystemDirectoryHandle.ts index 1bf7fa21b..8fa9b4431 100644 --- a/src/node-to-fsa/NodeFileSystemDirectoryHandle.ts +++ b/src/node-to-fsa/NodeFileSystemDirectoryHandle.ts @@ -27,7 +27,11 @@ export class NodeFileSystemDirectoryHandle extends NodeFileSystemHandle implemen /** Directory path with trailing slash. */ public readonly __path: string; - public constructor(protected readonly fs: NodeFsaFs, path: string, ctx: Partial = {}) { + public constructor( + protected readonly fs: NodeFsaFs, + path: string, + ctx: Partial = {}, + ) { super('directory', basename(path, ctx.separator || '/')); this.ctx = createCtx(ctx); this.__path = path[path.length - 1] === this.ctx.separator ? path : path + this.ctx.separator; diff --git a/src/node-to-fsa/NodeFileSystemFileHandle.ts b/src/node-to-fsa/NodeFileSystemFileHandle.ts index ab5206bdb..31faf332a 100644 --- a/src/node-to-fsa/NodeFileSystemFileHandle.ts +++ b/src/node-to-fsa/NodeFileSystemFileHandle.ts @@ -8,7 +8,11 @@ import type { IFileSystemFileHandle, IFileSystemSyncAccessHandle } from '../fsa/ export class NodeFileSystemFileHandle extends NodeFileSystemHandle implements IFileSystemFileHandle { protected readonly ctx: NodeFsaContext; - constructor(protected readonly fs: NodeFsaFs, public readonly __path: string, ctx: Partial = {}) { + constructor( + protected readonly fs: NodeFsaFs, + public readonly __path: string, + ctx: Partial = {}, + ) { ctx = createCtx(ctx); super('file', basename(__path, ctx.separator!)); this.ctx = ctx as NodeFsaContext; diff --git a/src/node-to-fsa/NodeFileSystemHandle.ts b/src/node-to-fsa/NodeFileSystemHandle.ts index 95233d63b..8dc19a292 100644 --- a/src/node-to-fsa/NodeFileSystemHandle.ts +++ b/src/node-to-fsa/NodeFileSystemHandle.ts @@ -8,7 +8,10 @@ import type { IFileSystemHandle, FileSystemHandlePermissionDescriptor } from '.. * @see [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemHandle) */ export abstract class NodeFileSystemHandle implements IFileSystemHandle { - constructor(public readonly kind: 'file' | 'directory', public readonly name: string) {} + constructor( + public readonly kind: 'file' | 'directory', + public readonly name: string, + ) {} /** * Compares two handles to see if the associated entries (either a file or directory) match. diff --git a/src/node-to-fsa/NodeFileSystemWritableFileStream.ts b/src/node-to-fsa/NodeFileSystemWritableFileStream.ts index d9381ce18..61e7f91ff 100644 --- a/src/node-to-fsa/NodeFileSystemWritableFileStream.ts +++ b/src/node-to-fsa/NodeFileSystemWritableFileStream.ts @@ -61,7 +61,11 @@ interface SwapFile { export class NodeFileSystemWritableFileStream extends WritableStream implements IFileSystemWritableFileStream { protected readonly swap: SwapFile; - constructor(protected readonly fs: NodeFsaFs, protected readonly path: string, keepExistingData: boolean) { + constructor( + protected readonly fs: NodeFsaFs, + protected readonly path: string, + keepExistingData: boolean, + ) { const swap: SwapFile = { handle: undefined, path: '', offset: 0 }; super({ async start() { diff --git a/src/node-to-fsa/NodePermissionStatus.ts b/src/node-to-fsa/NodePermissionStatus.ts index 6039bb0ac..2de2e33f6 100644 --- a/src/node-to-fsa/NodePermissionStatus.ts +++ b/src/node-to-fsa/NodePermissionStatus.ts @@ -2,5 +2,8 @@ * @see [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/PermissionStatus) */ export class NodePermissionStatus { - constructor(public readonly name: string, public readonly state: 'granted' | 'denied' | 'prompt') {} + constructor( + public readonly name: string, + public readonly state: 'granted' | 'denied' | 'prompt', + ) {} } From 97edfcdc6778198f2dea66b9f732ce5592e45525 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 27 Apr 2024 10:44:25 +0000 Subject: [PATCH 25/37] chore(release): 4.9.0 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # [4.9.0](https://github.com/streamich/memfs/compare/v4.8.2...v4.9.0) (2024-04-27) ### Features * 🎸 define .scan() CRUD method ([921e05d](https://github.com/streamich/memfs/commit/921e05d26092f6dbf5a4a302c4ac251944d5d008)) * 🎸 implement .scan() in Node.js CRUD ([3d973b7](https://github.com/streamich/memfs/commit/3d973b7dd4475c6a59443171795ef5449d11805b)) * 🎸 implement .scan() method for FSA CRUD ([a148fb8](https://github.com/streamich/memfs/commit/a148fb89d0373442f5773c6656e433abdafdb2a0)) --- CHANGELOG.md | 9 +++++++++ package.json | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95fc46c35..42f482555 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +# [4.9.0](https://github.com/streamich/memfs/compare/v4.8.2...v4.9.0) (2024-04-27) + + +### Features + +* 🎸 define .scan() CRUD method ([921e05d](https://github.com/streamich/memfs/commit/921e05d26092f6dbf5a4a302c4ac251944d5d008)) +* 🎸 implement .scan() in Node.js CRUD ([3d973b7](https://github.com/streamich/memfs/commit/3d973b7dd4475c6a59443171795ef5449d11805b)) +* 🎸 implement .scan() method for FSA CRUD ([a148fb8](https://github.com/streamich/memfs/commit/a148fb89d0373442f5773c6656e433abdafdb2a0)) + ## [4.8.2](https://github.com/streamich/memfs/compare/v4.8.1...v4.8.2) (2024-04-14) diff --git a/package.json b/package.json index 82531f093..a4f9179ea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "memfs", - "version": "4.8.2", + "version": "4.9.0", "description": "In-memory file-system with Node's fs API.", "keywords": [ "fs", From 53cbadc5be71db56f41c3b18b72c0afdcb236d82 Mon Sep 17 00:00:00 2001 From: Va Da Date: Sat, 27 Apr 2024 12:49:55 +0200 Subject: [PATCH 26/37] ci: change GitHub token env var --- .github/workflows/checks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index cf19fdf67..03a444619 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -110,5 +110,5 @@ jobs: - name: Release run: npx semantic-release env: - GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} From 7461f3634ba8b830f8ae6d680251976a254de8e0 Mon Sep 17 00:00:00 2001 From: streamich Date: Sat, 27 Apr 2024 13:03:35 +0200 Subject: [PATCH 27/37] =?UTF-8?q?chore:=20=F0=9F=A4=96=20publish=20static?= =?UTF-8?q?=20site?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gh-pages.yml | 28 ++++++++++++++++++++++++++++ .gitignore | 5 +++-- package.json | 7 +++++-- tsconfig.json | 16 +++++++++++++++- 4 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/gh-pages.yml diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml new file mode 100644 index 000000000..68e9bc61d --- /dev/null +++ b/.github/workflows/gh-pages.yml @@ -0,0 +1,28 @@ +name: GitHub Pages + +on: + push: + branches: [ master ] + +jobs: + gh-pages: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [20.x] + steps: + - uses: actions/checkout@v4 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: yarn + - run: yarn install --frozen-lockfile + - run: yarn typedoc + - run: yarn coverage + - run: yarn build:pages + - name: Publish to gh-pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./gh-pages diff --git a/.gitignore b/.gitignore index d3e9d4196..210304f8e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,9 +2,10 @@ node_modules /.idea .nyc_output -coverage +/coverage/ package-lock.json /lib/ -/gh-pages +/gh-pages/ /dist /fs-test/ +/typedocs/ diff --git a/package.json b/package.json index a4f9179ea..9080d53e1 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "scripts": { "build": "tsc -p . && rimraf --glob lib/__tests__ 'lib/**/__tests__'", "build:webfs": "NODE_ENV=production webpack --config ./src/webfs/webpack.config.js", - "clean": "rimraf lib types", + "clean": "rimraf lib types typedocs gh-pages coverage", "demo:crud-and-cas": "webpack serve --config ./demo/crud-and-cas/webpack.config.js", "demo:fsa-to-node-sync-tests": "webpack serve --config ./demo/fsa-to-node-sync-tests/webpack.config.js", "demo:fsa-to-node-zipfile": "webpack serve --config ./demo/fsa-to-node-zipfile/webpack.config.js", @@ -66,7 +66,10 @@ "test:watch": "jest --watch", "tslint": "tslint \"src/**/*.ts\" -t verbose", "typecheck": "tsc -p .", - "watch": "watch \"npm run build\" ./src" + "watch": "watch \"npm run build\" ./src", + "coverage": "yarn test --collectCoverage", + "typedoc": "npx typedoc@0.25.13 --tsconfig tsconfig.json", + "build:pages": "npx rimraf@5.0.5 gh-pages && mkdir -p gh-pages && cp -r typedocs/* gh-pages && cp -r coverage gh-pages/coverage" }, "commitlint": { "extends": [ diff --git a/tsconfig.json b/tsconfig.json index d0d85a422..88537b3df 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,5 +14,19 @@ "importHelpers": true }, "include": ["src"], - "exclude": ["src/__tests__", "node_modules", "lib", "es6", "es2020", "esm", "docs", "README.md"] + "exclude": ["src/__tests__", "node_modules", "lib", "es6", "es2020", "esm", "docs", "README.md"], + "typedocOptions": { + "entryPoints": [ + "src/index.ts", + "src/cas/types.ts", + "src/crud/types.ts", + "src/crud-to-cas/index.ts", + "src/fsa/types.ts", + "src/fsa-to-crud/index.ts", + "src/fsa-to-node/index.ts", + "src/node-to-crud/index.ts", + "src/node-to-fsa/index.ts", + ], + "out": "typedocs" + } } From adc65707aae5db3a30b9749b7a19f6969fa06337 Mon Sep 17 00:00:00 2001 From: streamich Date: Sat, 27 Apr 2024 13:12:32 +0200 Subject: [PATCH 28/37] =?UTF-8?q?chore:=20=F0=9F=A4=96=20update=20README?= =?UTF-8?q?=20and=20run=20Prettier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gh-pages.yml | 2 +- README.md | 21 ++++++++++++--------- tsconfig.json | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 68e9bc61d..78b9f1f32 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -2,7 +2,7 @@ name: GitHub Pages on: push: - branches: [ master ] + branches: [master] jobs: gh-pages: diff --git a/README.md b/README.md index d08c0a8d5..1bfa242e9 100644 --- a/README.md +++ b/README.md @@ -15,15 +15,18 @@ JavaScript file system utilities for Node.js and browser. npm i memfs ``` -## Docs - -- [In-memory Node.js `fs` API](./docs/node/index.md) -- `experimental` [`fs` to File System Access API adapter](./docs/fsa/fs-to-fsa.md) -- `experimental` [File System Access API to `fs` adapter](./docs/fsa/fsa-to-fs.md) -- `experimental` [`crudfs` a CRUD-like file system abstraction](./docs/crudfs/index.md) -- `experimental` [`casfs` Content Addressable Storage file system abstraction](./docs/casfs/index.md) -- [Directory `snapshot` utility](./docs/snapshot/index.md) -- [`print` directory tree to terminal](./docs/print/index.md) +## Resources + +- Documentation + - [In-memory Node.js `fs` API](./docs/node/index.md) + - `experimental` [`fs` to File System Access API adapter](./docs/fsa/fs-to-fsa.md) + - `experimental` [File System Access API to `fs` adapter](./docs/fsa/fsa-to-fs.md) + - `experimental` [`crudfs` a CRUD-like file system abstraction](./docs/crudfs/index.md) + - `experimental` [`casfs` Content Addressable Storage file system abstraction](./docs/casfs/index.md) + - [Directory `snapshot` utility](./docs/snapshot/index.md) + - [`print` directory tree to terminal](./docs/print/index.md) +- [Code reference](https://streamich.github.io/memfs/) +- [Test coverage](https://streamich.github.io/memfs/coverage/lcov-report/) ## Demos diff --git a/tsconfig.json b/tsconfig.json index 88537b3df..00dda587a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -25,7 +25,7 @@ "src/fsa-to-crud/index.ts", "src/fsa-to-node/index.ts", "src/node-to-crud/index.ts", - "src/node-to-fsa/index.ts", + "src/node-to-fsa/index.ts" ], "out": "typedocs" } From de54ab53a5df3b857975094ce4c59d760240a6d6 Mon Sep 17 00:00:00 2001 From: streamich Date: Sat, 27 Apr 2024 13:17:22 +0200 Subject: [PATCH 29/37] =?UTF-8?q?fix:=20=F0=9F=90=9B=20use=20latest=20json?= =?UTF-8?q?-pack=20implementation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 +- src/fsa-to-node/json.ts | 4 +- src/json-joy/json-pack/JsonPackExtension.ts | 11 - src/json-joy/json-pack/JsonPackValue.ts | 13 - src/json-joy/json-pack/cbor/CborDecoder.ts | 408 ----------- .../json-pack/cbor/CborDecoderBase.ts | 349 ---------- src/json-joy/json-pack/cbor/CborEncoder.ts | 67 -- .../json-pack/cbor/CborEncoderFast.ts | 333 --------- src/json-joy/json-pack/cbor/constants.ts | 42 -- src/json-joy/json-pack/cbor/types.ts | 1 - src/json-joy/json-pack/json/JsonDecoder.ts | 644 ------------------ src/json-joy/json-pack/json/JsonEncoder.ts | 238 ------- src/json-joy/json-pack/types.ts | 57 -- src/snapshot/binary.ts | 6 +- src/snapshot/json.ts | 4 +- yarn.lock | 32 + 16 files changed, 41 insertions(+), 2171 deletions(-) delete mode 100644 src/json-joy/json-pack/JsonPackExtension.ts delete mode 100644 src/json-joy/json-pack/JsonPackValue.ts delete mode 100644 src/json-joy/json-pack/cbor/CborDecoder.ts delete mode 100644 src/json-joy/json-pack/cbor/CborDecoderBase.ts delete mode 100644 src/json-joy/json-pack/cbor/CborEncoder.ts delete mode 100644 src/json-joy/json-pack/cbor/CborEncoderFast.ts delete mode 100644 src/json-joy/json-pack/cbor/constants.ts delete mode 100644 src/json-joy/json-pack/cbor/types.ts delete mode 100644 src/json-joy/json-pack/json/JsonDecoder.ts delete mode 100644 src/json-joy/json-pack/json/JsonEncoder.ts delete mode 100644 src/json-joy/json-pack/types.ts diff --git a/package.json b/package.json index 9080d53e1..d0d4a76c9 100644 --- a/package.json +++ b/package.json @@ -124,6 +124,7 @@ } }, "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.2", "tslib": "^2.0.0" }, "devDependencies": { @@ -131,8 +132,8 @@ "@semantic-release/git": "^10.0.1", "@semantic-release/npm": "^9.0.1", "@types/jest": "^29.0.0", - "@types/node": "^10.17.60", "@types/mime": "^3.0.0", + "@types/node": "^10.17.60", "app-root-path": "^3.1.0", "assert": "^2.0.0", "buffer": "^6.0.3", diff --git a/src/fsa-to-node/json.ts b/src/fsa-to-node/json.ts index 8216404f1..0f9a5e492 100644 --- a/src/fsa-to-node/json.ts +++ b/src/fsa-to-node/json.ts @@ -1,5 +1,5 @@ -import { CborEncoder } from '../json-joy/json-pack/cbor/CborEncoder'; -import { CborDecoder } from '../json-joy/json-pack/cbor/CborDecoder'; +import { CborEncoder } from '@jsonjoy.com/json-pack/lib/cbor/CborEncoder'; +import { CborDecoder } from '@jsonjoy.com/json-pack/lib/cbor/CborDecoder'; export const encoder = new CborEncoder(); export const decoder = new CborDecoder(); diff --git a/src/json-joy/json-pack/JsonPackExtension.ts b/src/json-joy/json-pack/JsonPackExtension.ts deleted file mode 100644 index 81ab8bbb7..000000000 --- a/src/json-joy/json-pack/JsonPackExtension.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * A wrapping for MessagePack extension or CBOR tag value. When encoder - * encounters {@link JsonPackExtension} it will encode it as a MessagePack - * extension or CBOR tag. Likewise, the decoder will - * decode extensions into {@link JsonPackExtension}. - * - * @category Value - */ -export class JsonPackExtension { - constructor(public readonly tag: number, public readonly val: T) {} -} diff --git a/src/json-joy/json-pack/JsonPackValue.ts b/src/json-joy/json-pack/JsonPackValue.ts deleted file mode 100644 index cdf7f41de..000000000 --- a/src/json-joy/json-pack/JsonPackValue.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Use this wrapper is you have a pre-encoded MessagePack or CBOR value and you would - * like to dump it into a the document as-is. The contents of `buf` will - * be written as is to the document. - * - * It also serves as CBOR simple value container. In which case the type of value - * `val` field is "number". - * - * @category Value - */ -export class JsonPackValue { - constructor(public readonly val: T) {} -} diff --git a/src/json-joy/json-pack/cbor/CborDecoder.ts b/src/json-joy/json-pack/cbor/CborDecoder.ts deleted file mode 100644 index 64b925799..000000000 --- a/src/json-joy/json-pack/cbor/CborDecoder.ts +++ /dev/null @@ -1,408 +0,0 @@ -import {CONST, ERROR, MAJOR} from './constants'; -import {CborDecoderBase} from './CborDecoderBase'; -import {JsonPackValue} from '../JsonPackValue'; -import type {Path} from '../../json-pointer'; -import type {IReader, IReaderResettable} from '../../util/buffers'; - -export class CborDecoder< - R extends IReader & IReaderResettable = IReader & IReaderResettable, -> extends CborDecoderBase { - // -------------------------------------------------------------- Map reading - - public readAsMap(): Map { - const octet = this.reader.u8(); - const major = octet >> 5; - const minor = octet & CONST.MINOR_MASK; - switch (major) { - case MAJOR.MAP: - return this.readMap(minor); - default: - throw ERROR.UNEXPECTED_MAJOR; - } - } - - public readMap(minor: number): Map { - const length = this.readMinorLen(minor); - if (length >= 0) return this.readMapRaw(length); - else return this.readMapIndef(); - } - - public readMapRaw(length: number): Map { - const map: Map = new Map(); - for (let i = 0; i < length; i++) { - const key = this.val(); - const value = this.val(); - map.set(key, value); - } - return map; - } - - public readMapIndef(): Map { - const map: Map = new Map(); - while (this.reader.peak() !== CONST.END) { - const key = this.val(); - if (this.reader.peak() === CONST.END) throw ERROR.UNEXPECTED_OBJ_BREAK; - const value = this.val(); - map.set(key, value); - } - this.reader.x++; - return map; - } - - // ----------------------------------------------------------- Value skipping - - public skipN(n: number): void { - for (let i = 0; i < n; i++) this.skipAny(); - } - public skipAny(): void { - this.skipAnyRaw(this.reader.u8()); - } - - public skipAnyRaw(octet: number): void { - const major = octet >> 5; - const minor = octet & CONST.MINOR_MASK; - switch (major) { - case MAJOR.UIN: - case MAJOR.NIN: - this.skipUNint(minor); - break; - case MAJOR.BIN: - this.skipBin(minor); - break; - case MAJOR.STR: - this.skipStr(minor); - break; - case MAJOR.ARR: - this.skipArr(minor); - break; - case MAJOR.MAP: - this.skipObj(minor); - break; - case MAJOR.TKN: - this.skipTkn(minor); - break; - case MAJOR.TAG: - this.skipTag(minor); - break; - } - } - - public skipMinorLen(minor: number): number { - if (minor <= 23) return minor; - switch (minor) { - case 24: - return this.reader.u8(); - case 25: - return this.reader.u16(); - case 26: - return this.reader.u32(); - case 27: - return Number(this.reader.u64()); - case 31: - return -1; - default: - throw ERROR.UNEXPECTED_MINOR; - } - } - - // --------------------------------------------------------- Integer skipping - - public skipUNint(minor: number): void { - if (minor <= 23) return; - switch (minor) { - case 24: - return this.reader.skip(1); - case 25: - return this.reader.skip(2); - case 26: - return this.reader.skip(4); - case 27: - return this.reader.skip(8); - default: - throw ERROR.UNEXPECTED_MINOR; - } - } - - // ---------------------------------------------------------- Binary skipping - - public skipBin(minor: number): void { - const length = this.skipMinorLen(minor); - if (length >= 0) this.reader.skip(length); - else { - while (this.reader.peak() !== CONST.END) this.skipBinChunk(); - this.reader.x++; - } - } - - public skipBinChunk(): void { - const octet = this.reader.u8(); - const major = octet >> 5; - const minor = octet & CONST.MINOR_MASK; - if (major !== MAJOR.BIN) throw ERROR.UNEXPECTED_BIN_CHUNK_MAJOR; - if (minor > 27) throw ERROR.UNEXPECTED_BIN_CHUNK_MINOR; - this.skipBin(minor); - } - - // ---------------------------------------------------------- String skipping - - public skipStr(minor: number): void { - const length = this.skipMinorLen(minor); - if (length >= 0) this.reader.skip(length); - else { - while (this.reader.peak() !== CONST.END) this.skipStrChunk(); - this.reader.x++; - } - } - - public skipStrChunk(): void { - const octet = this.reader.u8(); - const major = octet >> 5; - const minor = octet & CONST.MINOR_MASK; - if (major !== MAJOR.STR) throw ERROR.UNEXPECTED_STR_CHUNK_MAJOR; - if (minor > 27) throw ERROR.UNEXPECTED_STR_CHUNK_MINOR; - this.skipStr(minor); - } - - // ----------------------------------------------------------- Array skipping - - public skipArr(minor: number): void { - const length = this.skipMinorLen(minor); - if (length >= 0) this.skipN(length); - else { - while (this.reader.peak() !== CONST.END) this.skipAny(); - this.reader.x++; - } - } - - // ---------------------------------------------------------- Object skipping - - public skipObj(minor: number): void { - const length = this.readMinorLen(minor); - if (length >= 0) return this.skipN(length * 2); - else { - while (this.reader.peak() !== CONST.END) { - this.skipAny(); - if (this.reader.peak() === CONST.END) throw ERROR.UNEXPECTED_OBJ_BREAK; - this.skipAny(); - } - this.reader.x++; - } - } - - // ------------------------------------------------------------- Tag skipping - - public skipTag(minor: number): void { - const length = this.skipMinorLen(minor); - if (length < 0) throw ERROR.UNEXPECTED_MINOR; - this.skipAny(); - } - - // ----------------------------------------------------------- Token skipping - - public skipTkn(minor: number): void { - switch (minor) { - case 0xf8 & CONST.MINOR_MASK: - this.reader.skip(1); - return; - case 0xf9 & CONST.MINOR_MASK: - this.reader.skip(2); - return; - case 0xfa & CONST.MINOR_MASK: - this.reader.skip(4); - return; - case 0xfb & CONST.MINOR_MASK: - this.reader.skip(8); - return; - } - if (minor <= 23) return; - throw ERROR.UNEXPECTED_MINOR; - } - - // --------------------------------------------------------------- Validation - - /** - * Throws if at given offset in a buffer there is an invalid CBOR value, or - * if the value does not span the exact length specified in `size`. I.e. - * throws if: - * - * - The value is not a valid CBOR value. - * - The value is shorter than `size`. - * - The value is longer than `size`. - * - * @param value Buffer in which to validate CBOR value. - * @param offset Offset at which the value starts. - * @param size Expected size of the value. - */ - public validate(value: Uint8Array, offset: number = 0, size: number = value.length): void { - this.reader.reset(value); - this.reader.x = offset; - const start = offset; - this.skipAny(); - const end = this.reader.x; - if (end - start !== size) throw ERROR.INVALID_SIZE; - } - - // -------------------------------------------- One level reading - any value - - public decodeLevel(value: Uint8Array): unknown { - this.reader.reset(value); - return this.readLevel(); - } - - /** - * Decodes only one level of objects and arrays. Other values are decoded - * completely. - * - * @returns One level of decoded CBOR value. - */ - public readLevel(): unknown { - const octet = this.reader.u8(); - const major = octet >> 5; - const minor = octet & CONST.MINOR_MASK; - switch (major) { - case MAJOR.ARR: - return this.readArrLevel(minor); - case MAJOR.MAP: - return this.readObjLevel(minor); - default: - return super.readAnyRaw(octet); - } - } - - /** - * Decodes primitive values, returns container values as `JsonPackValue`. - * - * @returns A primitive value, or CBOR container value as a blob. - */ - public readPrimitiveOrVal(): unknown | JsonPackValue { - const octet = this.reader.peak(); - const major = octet >> 5; - switch (major) { - case MAJOR.ARR: - case MAJOR.MAP: - return this.readAsValue(); - default: - return this.val(); - } - } - - public readAsValue(): JsonPackValue { - const reader = this.reader; - const start = reader.x; - this.skipAny(); - const end = reader.x; - return new JsonPackValue(reader.uint8.subarray(start, end)); - } - - // ----------------------------------------------- One level reading - object - - public readObjLevel(minor: number): Record { - const length = this.readMinorLen(minor); - if (length >= 0) return this.readObjRawLevel(length); - else return this.readObjIndefLevel(); - } - - public readObjRawLevel(length: number): Record { - const obj: Record = {}; - for (let i = 0; i < length; i++) { - const key = this.key(); - const value = this.readPrimitiveOrVal(); - obj[key] = value; - } - return obj; - } - - public readObjIndefLevel(): Record { - const obj: Record = {}; - while (this.reader.peak() !== CONST.END) { - const key = this.key(); - if (this.reader.peak() === CONST.END) throw ERROR.UNEXPECTED_OBJ_BREAK; - const value = this.readPrimitiveOrVal(); - obj[key] = value; - } - this.reader.x++; - return obj; - } - - // ------------------------------------------------ One level reading - array - - public readArrLevel(minor: number): unknown[] { - const length = this.readMinorLen(minor); - if (length >= 0) return this.readArrRawLevel(length); - return this.readArrIndefLevel(); - } - - public readArrRawLevel(length: number): unknown[] { - const arr: unknown[] = []; - for (let i = 0; i < length; i++) arr.push(this.readPrimitiveOrVal()); - return arr; - } - - public readArrIndefLevel(): unknown[] { - const arr: unknown[] = []; - while (this.reader.peak() !== CONST.END) arr.push(this.readPrimitiveOrVal()); - this.reader.x++; - return arr; - } - - // ---------------------------------------------------------- Shallow reading - - public readHdr(expectedMajor: number): number { - const octet = this.reader.u8(); - const major = octet >> 5; - if (major !== expectedMajor) throw ERROR.UNEXPECTED_MAJOR; - const minor = octet & CONST.MINOR_MASK; - if (minor < 24) return minor; - switch (minor) { - case 24: - return this.reader.u8(); - case 25: - return this.reader.u16(); - case 26: - return this.reader.u32(); - case 27: - return Number(this.reader.u64()); - case 31: - return -1; - } - throw ERROR.UNEXPECTED_MINOR; - } - - public readStrHdr(): number { - return this.readHdr(MAJOR.STR); - } - - public readObjHdr(): number { - return this.readHdr(MAJOR.MAP); - } - - public readArrHdr(): number { - return this.readHdr(MAJOR.ARR); - } - - public findKey(key: string): this { - const size = this.readObjHdr(); - for (let i = 0; i < size; i++) { - const k = this.key(); - if (k === key) return this; - this.skipAny(); - } - throw ERROR.KEY_NOT_FOUND; - } - - public findIndex(index: number): this { - const size = this.readArrHdr(); - if (index >= size) throw ERROR.INDEX_OUT_OF_BOUNDS; - for (let i = 0; i < index; i++) this.skipAny(); - return this; - } - - public find(path: Path): this { - for (let i = 0; i < path.length; i++) { - const segment = path[i]; - if (typeof segment === 'string') this.findKey(segment); - else this.findIndex(segment); - } - return this; - } -} diff --git a/src/json-joy/json-pack/cbor/CborDecoderBase.ts b/src/json-joy/json-pack/cbor/CborDecoderBase.ts deleted file mode 100644 index 3b27a6ea8..000000000 --- a/src/json-joy/json-pack/cbor/CborDecoderBase.ts +++ /dev/null @@ -1,349 +0,0 @@ -import {CONST, ERROR, MAJOR} from './constants'; -import {decodeF16} from '../../util/buffers/f16'; -import {JsonPackExtension} from '../JsonPackExtension'; -import {JsonPackValue} from '../JsonPackValue'; -import {Reader} from '../../util/buffers/Reader'; -import sharedCachedUtf8Decoder from '../../util/buffers/utf8/sharedCachedUtf8Decoder'; -import type {CachedUtf8Decoder} from '../../util/buffers/utf8/CachedUtf8Decoder'; -import type {IReader, IReaderResettable} from '../../util/buffers'; -import type {BinaryJsonDecoder, PackValue} from '../types'; - -export class CborDecoderBase - implements BinaryJsonDecoder -{ - public constructor( - public reader: R = new Reader() as any, - protected readonly keyDecoder: CachedUtf8Decoder = sharedCachedUtf8Decoder, - ) {} - - public read(uint8: Uint8Array): PackValue { - this.reader.reset(uint8); - return this.val() as PackValue; - } - - /** @deprecated */ - public decode(uint8: Uint8Array): unknown { - this.reader.reset(uint8); - return this.val(); - } - - // -------------------------------------------------------- Any value reading - - public val(): unknown { - const reader = this.reader; - const octet = reader.u8(); - const major = octet >> 5; - const minor = octet & CONST.MINOR_MASK; - if (major < MAJOR.ARR) { - if (major < MAJOR.BIN) return major === MAJOR.UIN ? this.readUint(minor) : this.readNint(minor); - else return major === MAJOR.BIN ? this.readBin(minor) : this.readStr(minor); - } else { - if (major < MAJOR.TAG) return major === MAJOR.ARR ? this.readArr(minor) : this.readObj(minor); - else return major === MAJOR.TAG ? this.readTag(minor) : this.readTkn(minor); - } - } - - public readAnyRaw(octet: number): unknown { - const major = octet >> 5; - const minor = octet & CONST.MINOR_MASK; - if (major < MAJOR.ARR) { - if (major < MAJOR.BIN) return major === MAJOR.UIN ? this.readUint(minor) : this.readNint(minor); - else return major === MAJOR.BIN ? this.readBin(minor) : this.readStr(minor); - } else { - if (major < MAJOR.TAG) return major === MAJOR.ARR ? this.readArr(minor) : this.readObj(minor); - else return major === MAJOR.TAG ? this.readTag(minor) : this.readTkn(minor); - } - } - - public readMinorLen(minor: number): number { - if (minor < 24) return minor; - switch (minor) { - case 24: - return this.reader.u8(); - case 25: - return this.reader.u16(); - case 26: - return this.reader.u32(); - case 27: - return Number(this.reader.u64()); - case 31: - return -1; - default: - throw ERROR.UNEXPECTED_MINOR; - } - } - - // ----------------------------------------------------- Unsigned int reading - - public readUint(minor: number): number | bigint { - if (minor < 25) { - return minor === 24 ? this.reader.u8() : minor; - } else { - if (minor < 27) { - return minor === 25 ? this.reader.u16() : this.reader.u32(); - } else { - const num = this.reader.u64(); - return num > CONST.MAX_UINT ? num : Number(num); - } - } - } - - // ----------------------------------------------------- Negative int reading - - public readNint(minor: number): number | bigint { - if (minor < 25) { - return minor === 24 ? -this.reader.u8() - 1 : -minor - 1; - } else { - if (minor < 27) { - return minor === 25 ? -this.reader.u16() - 1 : -this.reader.u32() - 1; - } else { - const num = this.reader.u64(); - return num > CONST.MAX_UINT - 1 ? -num - BigInt(1) : -Number(num) - 1; - } - } - } - - // ----------------------------------------------------------- Binary reading - - public readBin(minor: number): Uint8Array { - const reader = this.reader; - if (minor <= 23) return reader.buf(minor); - switch (minor) { - case 24: - return reader.buf(reader.u8()); - case 25: - return reader.buf(reader.u16()); - case 26: - return reader.buf(reader.u32()); - case 27: - return reader.buf(Number(reader.u64())); - case 31: { - let size = 0; - const list: Uint8Array[] = []; - while (this.reader.peak() !== CONST.END) { - const uint8 = this.readBinChunk(); - size += uint8.length; - list.push(uint8); - } - this.reader.x++; - const res = new Uint8Array(size); - let offset = 0; - const length = list.length; - for (let i = 0; i < length; i++) { - const arr = list[i]; - res.set(arr, offset); - offset += arr.length; - } - return res; - } - default: - throw ERROR.UNEXPECTED_MINOR; - } - } - - public readBinChunk(): Uint8Array { - const octet = this.reader.u8(); - const major = octet >> 5; - const minor = octet & CONST.MINOR_MASK; - if (major !== MAJOR.BIN) throw ERROR.UNEXPECTED_BIN_CHUNK_MAJOR; - if (minor > 27) throw ERROR.UNEXPECTED_BIN_CHUNK_MINOR; - return this.readBin(minor); - } - - // ----------------------------------------------------------- String reading - - public readAsStr(): string { - const reader = this.reader; - const octet = reader.u8(); - const major = octet >> 5; - const minor = octet & CONST.MINOR_MASK; - if (major !== MAJOR.STR) throw ERROR.UNEXPECTED_STR_MAJOR; - return this.readStr(minor); - } - - public readStr(minor: number): string { - const reader = this.reader; - if (minor <= 23) return reader.utf8(minor); - switch (minor) { - case 24: - return reader.utf8(reader.u8()); - case 25: - return reader.utf8(reader.u16()); - case 26: - return reader.utf8(reader.u32()); - case 27: - return reader.utf8(Number(reader.u64())); - case 31: { - let str = ''; - while (reader.peak() !== CONST.END) str += this.readStrChunk(); - this.reader.x++; - return str; - } - default: - throw ERROR.UNEXPECTED_MINOR; - } - } - - public readStrLen(minor: number): number { - if (minor <= 23) return minor; - switch (minor) { - case 24: - return this.reader.u8(); - case 25: - return this.reader.u16(); - case 26: - return this.reader.u32(); - case 27: - return Number(this.reader.u64()); - default: - throw ERROR.UNEXPECTED_MINOR; - } - } - - public readStrChunk(): string { - const octet = this.reader.u8(); - const major = octet >> 5; - const minor = octet & CONST.MINOR_MASK; - if (major !== MAJOR.STR) throw ERROR.UNEXPECTED_STR_CHUNK_MAJOR; - if (minor > 27) throw ERROR.UNEXPECTED_STR_CHUNK_MINOR; - return this.readStr(minor); - } - - // ------------------------------------------------------------ Array reading - - public readArr(minor: number): unknown[] { - const length = this.readMinorLen(minor); - if (length >= 0) return this.readArrRaw(length); - return this.readArrIndef(); - } - - public readArrRaw(length: number): unknown[] { - const arr: unknown[] = []; - for (let i = 0; i < length; i++) arr.push(this.val()); - return arr; - } - - public readArrIndef(): unknown[] { - const arr: unknown[] = []; - while (this.reader.peak() !== CONST.END) arr.push(this.val()); - this.reader.x++; - return arr; - } - - // ----------------------------------------------------------- Object reading - - public readObj(minor: number): Record { - if (minor < 28) { - let length = minor; - switch (minor) { - case 24: - length = this.reader.u8(); - break; - case 25: - length = this.reader.u16(); - break; - case 26: - length = this.reader.u32(); - break; - case 27: - length = Number(this.reader.u64()); - break; - } - const obj: Record = {}; - for (let i = 0; i < length; i++) { - const key = this.key(); - if (key === '__proto__') throw ERROR.UNEXPECTED_OBJ_KEY; - const value = this.val(); - obj[key] = value; - } - return obj; - } else if (minor === 31) return this.readObjIndef(); - else throw ERROR.UNEXPECTED_MINOR; - } - - /** Remove this? */ - public readObjRaw(length: number): Record { - const obj: Record = {}; - for (let i = 0; i < length; i++) { - const key = this.key(); - const value = this.val(); - obj[key] = value; - } - return obj; - } - - public readObjIndef(): Record { - const obj: Record = {}; - while (this.reader.peak() !== CONST.END) { - const key = this.key(); - if (this.reader.peak() === CONST.END) throw ERROR.UNEXPECTED_OBJ_BREAK; - const value = this.val(); - obj[key] = value; - } - this.reader.x++; - return obj; - } - - public key(): string { - const octet = this.reader.u8(); - const major = octet >> 5; - const minor = octet & CONST.MINOR_MASK; - if (major !== MAJOR.STR) return String(this.readAnyRaw(octet)); - const length = this.readStrLen(minor); - if (length > 31) return this.reader.utf8(length); - const key = this.keyDecoder.decode(this.reader.uint8, this.reader.x, length); - this.reader.skip(length); - return key; - } - - // -------------------------------------------------------------- Tag reading - - public readTag(minor: number): JsonPackExtension | unknown { - if (minor <= 23) return this.readTagRaw(minor); - switch (minor) { - case 24: - return this.readTagRaw(this.reader.u8()); - case 25: - return this.readTagRaw(this.reader.u16()); - case 26: - return this.readTagRaw(this.reader.u32()); - case 27: - return this.readTagRaw(Number(this.reader.u64())); - default: - throw ERROR.UNEXPECTED_MINOR; - } - } - - public readTagRaw(tag: number): JsonPackExtension | unknown { - return new JsonPackExtension(tag, this.val()); - } - - // ------------------------------------------------------------ Token reading - - public readTkn(minor: number): number | true | false | null | undefined | JsonPackValue { - switch (minor) { - case 0xf4 & CONST.MINOR_MASK: - return false; - case 0xf5 & CONST.MINOR_MASK: - return true; - case 0xf6 & CONST.MINOR_MASK: - return null; - case 0xf7 & CONST.MINOR_MASK: - return undefined; - case 0xf8 & CONST.MINOR_MASK: - return new JsonPackValue(this.reader.u8()); - case 0xf9 & CONST.MINOR_MASK: - return this.f16(); - case 0xfa & CONST.MINOR_MASK: - return this.reader.f32(); - case 0xfb & CONST.MINOR_MASK: - return this.reader.f64(); - } - if (minor <= 23) return new JsonPackValue(minor); - throw ERROR.UNEXPECTED_MINOR; - } - - public f16(): number { - return decodeF16(this.reader.u16()); - } -} diff --git a/src/json-joy/json-pack/cbor/CborEncoder.ts b/src/json-joy/json-pack/cbor/CborEncoder.ts deleted file mode 100644 index 63587f505..000000000 --- a/src/json-joy/json-pack/cbor/CborEncoder.ts +++ /dev/null @@ -1,67 +0,0 @@ -import {isFloat32} from '../../util/buffers/isFloat32'; -import {JsonPackExtension} from '../JsonPackExtension'; -import {CborEncoderFast} from './CborEncoderFast'; -import type {IWriter, IWriterGrowable} from '../../util/buffers'; - -export class CborEncoder extends CborEncoderFast { - /** - * Called when the encoder encounters a value that it does not know how to encode. - * - * @param value Some JavaScript value. - */ - public writeUnknown(value: unknown): void { - this.writeNull(); - } - - public writeAny(value: unknown): void { - switch (typeof value) { - case 'number': - return this.writeNumber(value as number); - case 'string': - return this.writeStr(value); - case 'boolean': - return this.writer.u8(0xf4 + +value); - case 'object': { - if (!value) return this.writer.u8(0xf6); - const constructor = value.constructor; - switch (constructor) { - case Object: - return this.writeObj(value as Record); - case Array: - return this.writeArr(value as unknown[]); - case Uint8Array: - return this.writeBin(value as Uint8Array); - case Map: - return this.writeMap(value as Map); - case JsonPackExtension: - return this.writeTag((value).tag, (value).val); - default: - return this.writeUnknown(value); - } - } - case 'undefined': - return this.writeUndef(); - case 'bigint': - return this.writeBigInt(value as bigint); - default: - return this.writeUnknown(value); - } - } - - public writeFloat(float: number): void { - if (isFloat32(float)) this.writer.u8f32(0xfa, float); - else this.writer.u8f64(0xfb, float); - } - - public writeMap(map: Map): void { - this.writeMapHdr(map.size); - map.forEach((value, key) => { - this.writeAny(key); - this.writeAny(value); - }); - } - - public writeUndef(): void { - this.writer.u8(0xf7); - } -} diff --git a/src/json-joy/json-pack/cbor/CborEncoderFast.ts b/src/json-joy/json-pack/cbor/CborEncoderFast.ts deleted file mode 100644 index b54ff07cc..000000000 --- a/src/json-joy/json-pack/cbor/CborEncoderFast.ts +++ /dev/null @@ -1,333 +0,0 @@ -import {Writer} from '../../util/buffers/Writer'; -import {CONST, MAJOR_OVERLAY} from './constants'; -import type {IWriter, IWriterGrowable} from '../../util/buffers'; -import type {BinaryJsonEncoder, StreamingBinaryJsonEncoder, TlvBinaryJsonEncoder} from '../types'; -import type {Slice} from '../../util/buffers/Slice'; - -const isSafeInteger = Number.isSafeInteger; - -/** - * Fast CBOR encoder supports only JSON values. Use regular `CborEncoder` if - * you need ability to encode all CBOR value types. - */ -export class CborEncoderFast - implements BinaryJsonEncoder, StreamingBinaryJsonEncoder, TlvBinaryJsonEncoder -{ - constructor(public readonly writer: W = new Writer() as any) {} - - public encode(value: unknown): Uint8Array { - this.writeAny(value); - return this.writer.flush(); - } - - public encodeToSlice(value: unknown): Slice { - this.writeAny(value); - return this.writer.flushSlice(); - } - - public writeAny(value: unknown): void { - switch (typeof value) { - case 'number': - return this.writeNumber(value as number); - case 'string': - return this.writeStr(value); - case 'boolean': - return this.writer.u8(0xf4 + +value); - case 'object': { - if (!value) return this.writer.u8(0xf6); - const constructor = value.constructor; - switch (constructor) { - case Array: - return this.writeArr(value as unknown[]); - default: - return this.writeObj(value as Record); - } - } - } - } - - public writeCbor(): void { - this.writer.u8u16(0xd9, 0xd9f7); - } - - public writeEnd(): void { - this.writer.u8(CONST.END); - } - - public writeNull(): void { - this.writer.u8(0xf6); - } - - public writeBoolean(bool: boolean): void { - if (bool) this.writer.u8(0xf5); - else this.writer.u8(0xf4); - } - - public writeNumber(num: number): void { - if (isSafeInteger(num)) this.writeInteger(num); - else if (typeof num === 'bigint') this.writeBigInt(num); - else this.writeFloat(num); - } - - public writeBigInt(int: bigint): void { - if (int >= 0) this.writeBigUint(int); - else this.writeBigSint(int); - } - - public writeBigUint(uint: bigint): void { - if (uint <= Number.MAX_SAFE_INTEGER) return this.writeUInteger(Number(uint)); - this.writer.u8u64(0x1b, uint); - } - - public writeBigSint(int: bigint): void { - if (int >= Number.MIN_SAFE_INTEGER) return this.encodeNint(Number(int)); - const uint = -BigInt(1) - int; - this.writer.u8u64(0x3b, uint); - } - - public writeInteger(int: number): void { - if (int >= 0) this.writeUInteger(int); - else this.encodeNint(int); - } - - public writeUInteger(uint: number): void { - const writer = this.writer; - writer.ensureCapacity(9); - const uint8 = writer.uint8; - let x = writer.x; - if (uint <= 23) { - uint8[x++] = MAJOR_OVERLAY.UIN + uint; - } else if (uint <= 0xff) { - uint8[x++] = 0x18; - uint8[x++] = uint; - } else if (uint <= 0xffff) { - uint8[x++] = 0x19; - writer.view.setUint16(x, uint); - x += 2; - } else if (uint <= 0xffffffff) { - uint8[x++] = 0x1a; - writer.view.setUint32(x, uint); - x += 4; - } else { - uint8[x++] = 0x1b; - writer.view.setBigUint64(x, BigInt(uint)); - x += 8; - } - writer.x = x; - } - - /** @deprecated Remove and use `writeNumber` instead. */ - public encodeNumber(num: number): void { - this.writeNumber(num); - } - - /** @deprecated Remove and use `writeInteger` instead. */ - public encodeInteger(int: number): void { - this.writeInteger(int); - } - - /** @deprecated */ - public encodeUint(uint: number): void { - this.writeUInteger(uint); - } - - public encodeNint(int: number): void { - const uint = -1 - int; - const writer = this.writer; - writer.ensureCapacity(9); - const uint8 = writer.uint8; - let x = writer.x; - if (uint < 24) { - uint8[x++] = MAJOR_OVERLAY.NIN + uint; - } else if (uint <= 0xff) { - uint8[x++] = 0x38; - uint8[x++] = uint; - } else if (uint <= 0xffff) { - uint8[x++] = 0x39; - writer.view.setUint16(x, uint); - x += 2; - } else if (uint <= 0xffffffff) { - uint8[x++] = 0x3a; - writer.view.setUint32(x, uint); - x += 4; - } else { - uint8[x++] = 0x3b; - writer.view.setBigUint64(x, BigInt(uint)); - x += 8; - } - writer.x = x; - } - - public writeFloat(float: number): void { - this.writer.u8f64(0xfb, float); - } - - public writeBin(buf: Uint8Array): void { - const length = buf.length; - this.writeBinHdr(length); - this.writer.buf(buf, length); - } - - public writeBinHdr(length: number): void { - const writer = this.writer; - if (length <= 23) writer.u8(MAJOR_OVERLAY.BIN + length); - else if (length <= 0xff) writer.u16((0x58 << 8) + length); - else if (length <= 0xffff) writer.u8u16(0x59, length); - else if (length <= 0xffffffff) writer.u8u32(0x5a, length); - else writer.u8u64(0x5b, length); - } - - public writeStr(str: string): void { - const writer = this.writer; - const length = str.length; - const maxSize = length * 4; - writer.ensureCapacity(5 + maxSize); - const uint8 = writer.uint8; - let lengthOffset: number = writer.x; - if (maxSize <= 23) writer.x++; - else if (maxSize <= 0xff) { - uint8[writer.x++] = 0x78; - lengthOffset = writer.x; - writer.x++; - } else if (maxSize <= 0xffff) { - uint8[writer.x++] = 0x79; - lengthOffset = writer.x; - writer.x += 2; - } else { - uint8[writer.x++] = 0x7a; - lengthOffset = writer.x; - writer.x += 4; - } - const bytesWritten = writer.utf8(str); - if (maxSize <= 23) uint8[lengthOffset] = MAJOR_OVERLAY.STR + bytesWritten; - else if (maxSize <= 0xff) uint8[lengthOffset] = bytesWritten; - else if (maxSize <= 0xffff) writer.view.setUint16(lengthOffset, bytesWritten); - else writer.view.setUint32(lengthOffset, bytesWritten); - } - - public writeStrHdr(length: number): void { - const writer = this.writer; - if (length <= 23) writer.u8(MAJOR_OVERLAY.STR + length); - else if (length <= 0xff) writer.u16((0x78 << 8) + length); - else if (length <= 0xffff) writer.u8u16(0x79, length); - else writer.u8u32(0x7a, length); - } - - public writeAsciiStr(str: string): void { - this.writeStrHdr(str.length); - this.writer.ascii(str); - } - - public writeArr(arr: unknown[]): void { - const length = arr.length; - this.writeArrHdr(length); - for (let i = 0; i < length; i++) this.writeAny(arr[i]); - } - - public writeArrHdr(length: number): void { - const writer = this.writer; - if (length <= 23) writer.u8(MAJOR_OVERLAY.ARR + length); - else if (length <= 0xff) writer.u16((0x98 << 8) + length); - else if (length <= 0xffff) writer.u8u16(0x99, length); - else if (length <= 0xffffffff) writer.u8u32(0x9a, length); - else writer.u8u64(0x9b, length); - } - - public writeObj(obj: Record): void { - const keys = Object.keys(obj); - const length = keys.length; - this.writeObjHdr(length); - for (let i = 0; i < length; i++) { - const key = keys[i]; - this.writeStr(key); - this.writeAny(obj[key]); - } - } - - public writeObjHdr(length: number): void { - const writer = this.writer; - if (length <= 23) writer.u8(MAJOR_OVERLAY.MAP + length); - else if (length <= 0xff) writer.u16((0xb8 << 8) + length); - else if (length <= 0xffff) writer.u8u16(0xb9, length); - else if (length <= 0xffffffff) writer.u8u32(0xba, length); - else writer.u8u64(0xbb, length); - } - - public writeMapHdr(length: number): void { - this.writeObjHdr(length); - } - - public writeStartMap(): void { - this.writer.u8(0xbf); - } - - public writeTag(tag: number, value: unknown): void { - this.writeTagHdr(tag); - this.writeAny(value); - } - - public writeTagHdr(tag: number): void { - const writer = this.writer; - if (tag <= 23) writer.u8(MAJOR_OVERLAY.TAG + tag); - else if (tag <= 0xff) writer.u16((0xd8 << 8) + tag); - else if (tag <= 0xffff) writer.u8u16(0xd9, tag); - else if (tag <= 0xffffffff) writer.u8u32(0xda, tag); - else writer.u8u64(0xdb, tag); - } - - public writeTkn(value: number): void { - const writer = this.writer; - if (value <= 23) writer.u8(MAJOR_OVERLAY.TKN + value); - else if (value <= 0xff) writer.u16((0xf8 << 8) + value); - } - - // ------------------------------------------------------- Streaming encoding - - public writeStartStr(): void { - this.writer.u8(0x7f); - } - - public writeStrChunk(str: string): void { - throw new Error('Not implemented'); - } - - public writeEndStr(): void { - throw new Error('Not implemented'); - } - - public writeStartBin(): void { - this.writer.u8(0x5f); - } - - public writeBinChunk(buf: Uint8Array): void { - throw new Error('Not implemented'); - } - - public writeEndBin(): void { - throw new Error('Not implemented'); - } - - public writeStartArr(): void { - this.writer.u8(0x9f); - } - - public writeArrChunk(item: unknown): void { - throw new Error('Not implemented'); - } - - public writeEndArr(): void { - this.writer.u8(CONST.END); - } - - public writeStartObj(): void { - this.writer.u8(0xbf); - } - - public writeObjChunk(key: string, value: unknown): void { - throw new Error('Not implemented'); - } - - public writeEndObj(): void { - this.writer.u8(CONST.END); - } -} diff --git a/src/json-joy/json-pack/cbor/constants.ts b/src/json-joy/json-pack/cbor/constants.ts deleted file mode 100644 index 86b3a5ae2..000000000 --- a/src/json-joy/json-pack/cbor/constants.ts +++ /dev/null @@ -1,42 +0,0 @@ -export const enum MAJOR { - UIN = 0b000, - NIN = 0b001, - BIN = 0b010, - STR = 0b011, - ARR = 0b100, - MAP = 0b101, - TAG = 0b110, - TKN = 0b111, -} - -export const enum MAJOR_OVERLAY { - UIN = 0b000_00000, - NIN = 0b001_00000, - BIN = 0b010_00000, - STR = 0b011_00000, - ARR = 0b100_00000, - MAP = 0b101_00000, - TAG = 0b110_00000, - TKN = 0b111_00000, -} - -export const enum CONST { - MINOR_MASK = 0b11111, - MAX_UINT = 9007199254740991, - END = 0xff, -} - -export const enum ERROR { - UNEXPECTED_MAJOR, - UNEXPECTED_MINOR, - UNEXPECTED_BIN_CHUNK_MAJOR, - UNEXPECTED_BIN_CHUNK_MINOR, - UNEXPECTED_STR_CHUNK_MAJOR, - UNEXPECTED_STR_CHUNK_MINOR, - UNEXPECTED_OBJ_KEY, - UNEXPECTED_OBJ_BREAK, - INVALID_SIZE, - KEY_NOT_FOUND, - INDEX_OUT_OF_BOUNDS, - UNEXPECTED_STR_MAJOR, -} diff --git a/src/json-joy/json-pack/cbor/types.ts b/src/json-joy/json-pack/cbor/types.ts deleted file mode 100644 index d80243c3e..000000000 --- a/src/json-joy/json-pack/cbor/types.ts +++ /dev/null @@ -1 +0,0 @@ -export type CborUint8Array = Uint8Array & {__BRAND__: 'cbor'; __TYPE__: T}; diff --git a/src/json-joy/json-pack/json/JsonDecoder.ts b/src/json-joy/json-pack/json/JsonDecoder.ts deleted file mode 100644 index 7522fe960..000000000 --- a/src/json-joy/json-pack/json/JsonDecoder.ts +++ /dev/null @@ -1,644 +0,0 @@ -import {decodeUtf8} from '../../util/buffers/utf8/decodeUtf8'; -import {Reader} from '../../util/buffers/Reader'; -import {fromBase64Bin} from '../../util/base64/fromBase64Bin'; -import type {BinaryJsonDecoder, PackValue} from '../types'; - -const REGEX_REPLACE_ESCAPED_CHARS = /\\(b|f|n|r|t|"|\/|\\)/g; -const escapedCharReplacer = (char: string) => { - switch (char) { - case '\\b': - return '\b'; - case '\\f': - return '\f'; - case '\\n': - return '\n'; - case '\\r': - return '\r'; - case '\\t': - return '\t'; - case '\\"': - return '"'; - case '\\/': - return '/'; - case '\\\\': - return '\\'; - } - return char; -}; - -// Starts with "data:application/octet-stream;base64," - 64 61 74 61 3a 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 3b 62 61 73 65 36 34 2c -const hasBinaryPrefix = (u8: Uint8Array, x: number) => - u8[x] === 0x64 && - u8[x + 1] === 0x61 && - u8[x + 2] === 0x74 && - u8[x + 3] === 0x61 && - u8[x + 4] === 0x3a && - u8[x + 5] === 0x61 && - u8[x + 6] === 0x70 && - u8[x + 7] === 0x70 && - u8[x + 8] === 0x6c && - u8[x + 9] === 0x69 && - u8[x + 10] === 0x63 && - u8[x + 11] === 0x61 && - u8[x + 12] === 0x74 && - u8[x + 13] === 0x69 && - u8[x + 14] === 0x6f && - u8[x + 15] === 0x6e && - u8[x + 16] === 0x2f && - u8[x + 17] === 0x6f && - u8[x + 18] === 0x63 && - u8[x + 19] === 0x74 && - u8[x + 20] === 0x65 && - u8[x + 21] === 0x74 && - u8[x + 22] === 0x2d && - u8[x + 23] === 0x73 && - u8[x + 24] === 0x74 && - u8[x + 25] === 0x72 && - u8[x + 26] === 0x65 && - u8[x + 27] === 0x61 && - u8[x + 28] === 0x6d && - u8[x + 29] === 0x3b && - u8[x + 30] === 0x62 && - u8[x + 31] === 0x61 && - u8[x + 32] === 0x73 && - u8[x + 33] === 0x65 && - u8[x + 34] === 0x36 && - u8[x + 35] === 0x34 && - u8[x + 36] === 0x2c; - -const findEndingQuote = (uint8: Uint8Array, x: number): number => { - const len = uint8.length; - let char = uint8[x]; - let prev = 0; - while (x < len) { - if (char === 34 && prev !== 92) break; - if (char === 92 && prev === 92) prev = 0; - else prev = char; - char = uint8[++x]; - } - if (x === len) throw new Error('Invalid JSON'); - return x; -}; - -const fromCharCode = String.fromCharCode; - -const readShortUtf8StrAndUnescape = (reader: Reader): string => { - const buf = reader.uint8; - const len = buf.length; - const points: number[] = []; - let x = reader.x; - let prev = 0; - while (x < len) { - let code = buf[x++]!; - if ((code & 0x80) === 0) { - if (prev === 92) { - switch (code) { - case 98: // \b - code = 8; - break; - case 102: // \f - code = 12; - break; - case 110: // \n - code = 10; - break; - case 114: // \r - code = 13; - break; - case 116: // \t - code = 9; - break; - case 34: // \" - code = 34; - break; - case 47: // \/ - code = 47; - break; - case 92: // \\ - code = 92; - break; - default: - throw new Error('Invalid JSON'); - } - prev = 0; - } else { - if (code === 34) break; - prev = code; - if (prev === 92) continue; - } - } else { - const octet2 = buf[x++]! & 0x3f; - if ((code & 0xe0) === 0xc0) { - code = ((code & 0x1f) << 6) | octet2; - } else { - const octet3 = buf[x++]! & 0x3f; - if ((code & 0xf0) === 0xe0) { - code = ((code & 0x1f) << 12) | (octet2 << 6) | octet3; - } else { - if ((code & 0xf8) === 0xf0) { - const octet4 = buf[x++]! & 0x3f; - let unit = ((code & 0x07) << 0x12) | (octet2 << 0x0c) | (octet3 << 0x06) | octet4; - if (unit > 0xffff) { - unit -= 0x10000; - const unit0 = ((unit >>> 10) & 0x3ff) | 0xd800; - unit = 0xdc00 | (unit & 0x3ff); - points.push(unit0); - code = unit; - } else { - code = unit; - } - } - } - } - } - points.push(code); - } - reader.x = x; - return fromCharCode.apply(String, points); -}; - -export class JsonDecoder implements BinaryJsonDecoder { - public reader = new Reader(); - - public read(uint8: Uint8Array): PackValue { - this.reader.reset(uint8); - return this.readAny(); - } - - public readAny(): PackValue { - this.skipWhitespace(); - const reader = this.reader; - const x = reader.x; - const uint8 = reader.uint8; - const char = uint8[x]; - switch (char) { - case 34: // " - return uint8[x + 1] === 0x64 // d - ? this.tryReadBin() || this.readStr() - : this.readStr(); - case 91: // [ - return this.readArr(); - case 102: // f - return this.readFalse(); - case 110: // n - return this.readNull(); - case 116: // t - return this.readTrue(); - case 123: // { - return this.readObj(); - default: - if ((char >= 48 && char <= 57) || char === 45) return this.readNum(); - throw new Error('Invalid JSON'); - } - } - - public skipWhitespace(): void { - const reader = this.reader; - const uint8 = reader.uint8; - let x = reader.x; - let char: number = 0; - while (true) { - char = uint8[x]; - switch (char) { - case 32: // space - case 9: // tab - case 10: // line feed - case 13: // carriage return - x++; - continue; - default: - reader.x = x; - return; - } - } - } - - public readNull(): null { - if (this.reader.u32() !== 0x6e756c6c) throw new Error('Invalid JSON'); - return null; - } - - public readTrue(): true { - if (this.reader.u32() !== 0x74727565) throw new Error('Invalid JSON'); - return true; - } - - public readFalse(): false { - const reader = this.reader; - if (reader.u8() !== 0x66 || reader.u32() !== 0x616c7365) throw new Error('Invalid JSON'); - return false; - } - - public readBool(): unknown { - const reader = this.reader; - switch (reader.uint8[reader.x]) { - case 102: // f - return this.readFalse(); - case 116: // t - return this.readTrue(); - default: - throw new Error('Invalid JSON'); - } - } - - public readNum(): number { - const reader = this.reader; - const uint8 = reader.uint8; - let x = reader.x; - let c = uint8[x++]; - const c1 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 43 && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c2 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 43 && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c3 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 43 && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2, c3); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c4 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 43 && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2, c3, c4); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c5 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 43 && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2, c3, c4, c5); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c6 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 43 && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2, c3, c4, c5, c6); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c7 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 43 && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c8 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 43 && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c9 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c10 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c11 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c12 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c13 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c14 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c15 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c16 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c17 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c18 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c19 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c20 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode( - c1, - c2, - c3, - c4, - c5, - c6, - c7, - c8, - c9, - c10, - c11, - c12, - c13, - c14, - c15, - c16, - c17, - c18, - c19, - c20, - ); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c21 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode( - c1, - c2, - c3, - c4, - c5, - c6, - c7, - c8, - c9, - c10, - c11, - c12, - c13, - c14, - c15, - c16, - c17, - c18, - c19, - c20, - c21, - ); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c22 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode( - c1, - c2, - c3, - c4, - c5, - c6, - c7, - c8, - c9, - c10, - c11, - c12, - c13, - c14, - c15, - c16, - c17, - c18, - c19, - c20, - c21, - c22, - ); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c23 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode( - c1, - c2, - c3, - c4, - c5, - c6, - c7, - c8, - c9, - c10, - c11, - c12, - c13, - c14, - c15, - c16, - c17, - c18, - c19, - c20, - c21, - c22, - c23, - ); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - const c24 = c; - c = uint8[x++]; - if (!c || ((c < 45 || c > 57) && c !== 69 && c !== 101)) { - reader.x = x - 1; - const num = +fromCharCode( - c1, - c2, - c3, - c4, - c5, - c6, - c7, - c8, - c9, - c10, - c11, - c12, - c13, - c14, - c15, - c16, - c17, - c18, - c19, - c20, - c21, - c22, - c24, - ); - if (num !== num) throw new Error('Invalid JSON'); - return num; - } - throw new Error('Invalid JSON'); - } - - public readStr(): string { - const reader = this.reader; - const uint8 = reader.uint8; - const char = uint8[reader.x++]; - if (char !== 0x22) throw new Error('Invalid JSON'); - const x0 = reader.x; - const x1 = findEndingQuote(uint8, x0); - let str = decodeUtf8(uint8, x0, x1 - x0); - /** @todo perf: maybe faster is to first check if there are any escaped chars. */ - str = str.replace(REGEX_REPLACE_ESCAPED_CHARS, escapedCharReplacer); - reader.x = x1 + 1; - return str; - } - - public tryReadBin(): Uint8Array | undefined { - const reader = this.reader; - const u8 = reader.uint8; - let x = reader.x; - if (u8[x++] !== 0x22) return undefined; - const hasDataUrlPrefix = hasBinaryPrefix(u8, x); - if (!hasDataUrlPrefix) return undefined; - x += 37; - const x0 = x; - x = findEndingQuote(u8, x); - reader.x = x0; - const bin = fromBase64Bin(reader.view, x0, x - x0); - reader.x = x + 1; - return bin; - } - - public readBin(): Uint8Array { - const reader = this.reader; - const u8 = reader.uint8; - let x = reader.x; - if (u8[x++] !== 0x22) throw new Error('Invalid JSON'); - const hasDataUrlPrefix = hasBinaryPrefix(u8, x); - if (!hasDataUrlPrefix) throw new Error('Invalid JSON'); - x += 37; - const x0 = x; - x = findEndingQuote(u8, x); - reader.x = x0; - const bin = fromBase64Bin(reader.view, x0, x - x0); - reader.x = x + 1; - return bin; - } - - public readArr(): PackValue[] { - const reader = this.reader; - if (reader.u8() !== 0x5b) throw new Error('Invalid JSON'); - const arr: PackValue[] = []; - const uint8 = reader.uint8; - while (true) { - this.skipWhitespace(); - const char = uint8[reader.x]; - if (char === 0x5d) return reader.x++, arr; // ] - if (char === 0x2c) { - reader.x++; - continue; - } // , - arr.push(this.readAny()); - } - } - - public readObj(): Record { - const reader = this.reader; - if (reader.u8() !== 0x7b) throw new Error('Invalid JSON'); - const obj: Record = {}; - const uint8 = reader.uint8; - while (true) { - this.skipWhitespace(); - let char = uint8[reader.x]; - if (char === 0x7d) return reader.x++, obj; // } - if (char === 0x2c) { - reader.x++; - continue; - } // , - char = uint8[reader.x++]; - if (char !== 0x22) throw new Error('Invalid JSON'); - const key = readShortUtf8StrAndUnescape(reader); - if (key === '__proto__') throw new Error('Invalid JSON'); - this.skipWhitespace(); - if (reader.u8() !== 0x3a) throw new Error('Invalid JSON'); - this.skipWhitespace(); - obj[key] = this.readAny(); - } - } -} diff --git a/src/json-joy/json-pack/json/JsonEncoder.ts b/src/json-joy/json-pack/json/JsonEncoder.ts deleted file mode 100644 index b7f8cf35b..000000000 --- a/src/json-joy/json-pack/json/JsonEncoder.ts +++ /dev/null @@ -1,238 +0,0 @@ -import {toBase64Bin} from '../../util/base64/toBase64Bin'; -import type {IWriter, IWriterGrowable} from '../../util/buffers'; -import type {BinaryJsonEncoder, StreamingBinaryJsonEncoder} from '../types'; - -export class JsonEncoder implements BinaryJsonEncoder, StreamingBinaryJsonEncoder { - constructor(public readonly writer: IWriter & IWriterGrowable) {} - - public encode(value: unknown): Uint8Array { - const writer = this.writer; - writer.reset(); - this.writeAny(value); - return writer.flush(); - } - - public writeAny(value: unknown): void { - switch (typeof value) { - case 'boolean': - return this.writeBoolean(value); - case 'number': - return this.writeNumber(value as number); - case 'string': - return this.writeStr(value); - case 'object': { - if (value === null) return this.writeNull(); - const constructor = value.constructor; - switch (constructor) { - case Array: - return this.writeArr(value as unknown[]); - case Uint8Array: - return this.writeBin(value as Uint8Array); - default: - return this.writeObj(value as Record); - } - } - default: - return this.writeNull(); - } - } - - public writeNull(): void { - this.writer.u32(0x6e756c6c); // null - } - - public writeBoolean(bool: boolean): void { - if (bool) this.writer.u32(0x74727565); // true - else this.writer.u8u32(0x66, 0x616c7365); // false - } - - public writeNumber(num: number): void { - const str = num.toString(); - this.writer.ascii(str); - } - - public writeInteger(int: number): void { - this.writeNumber(int >> 0 === int ? int : Math.trunc(int)); - } - - public writeUInteger(uint: number): void { - this.writeInteger(uint < 0 ? -uint : uint); - } - - public writeFloat(float: number): void { - this.writeNumber(float); - } - - public writeBin(buf: Uint8Array): void { - const writer = this.writer; - const length = buf.length; - writer.ensureCapacity(38 + 3 + (length << 1)); - // Write: "data:application/octet-stream;base64, - 22 64 61 74 61 3a 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 3b 62 61 73 65 36 34 2c - const view = writer.view; - let x = writer.x; - view.setUint32(x, 0x22_64_61_74); // "dat - x += 4; - view.setUint32(x, 0x61_3a_61_70); // a:ap - x += 4; - view.setUint32(x, 0x70_6c_69_63); // plic - x += 4; - view.setUint32(x, 0x61_74_69_6f); // atio - x += 4; - view.setUint32(x, 0x6e_2f_6f_63); // n/oc - x += 4; - view.setUint32(x, 0x74_65_74_2d); // tet- - x += 4; - view.setUint32(x, 0x73_74_72_65); // stre - x += 4; - view.setUint32(x, 0x61_6d_3b_62); // am;b - x += 4; - view.setUint32(x, 0x61_73_65_36); // ase6 - x += 4; - view.setUint16(x, 0x34_2c); // 4, - x += 2; - x = toBase64Bin(buf, 0, length, view, x); - writer.uint8[x++] = 0x22; // " - writer.x = x; - } - - public writeStr(str: string): void { - const writer = this.writer; - const length = str.length; - writer.ensureCapacity(length * 4 + 2); - if (length < 256) { - let x = writer.x; - const uint8 = writer.uint8; - uint8[x++] = 0x22; // " - for (let i = 0; i < length; i++) { - const code = str.charCodeAt(i); - switch (code) { - case 34: // " - case 92: // \ - uint8[x++] = 0x5c; // \ - break; - } - if (code < 32 || code > 126) { - writer.utf8(JSON.stringify(str)); - return; - } else uint8[x++] = code; - } - uint8[x++] = 0x22; // " - writer.x = x; - return; - } - writer.utf8(JSON.stringify(str)); - } - - public writeAsciiStr(str: string): void { - const length = str.length; - const writer = this.writer; - writer.ensureCapacity(length * 2 + 2); - const uint8 = writer.uint8; - let x = writer.x; - uint8[x++] = 0x22; // " - for (let i = 0; i < length; i++) { - const code = str.charCodeAt(i); - switch (code) { - case 34: // " - case 92: // \ - uint8[x++] = 0x5c; // \ - break; - } - uint8[x++] = code; - } - uint8[x++] = 0x22; // " - writer.x = x; - } - - public writeArr(arr: unknown[]): void { - const writer = this.writer; - writer.u8(0x5b); // [ - const length = arr.length; - const last = length - 1; - for (let i = 0; i < last; i++) { - this.writeAny(arr[i]); - writer.u8(0x2c); // , - } - if (last >= 0) this.writeAny(arr[last]); - writer.u8(0x5d); // ] - } - - public writeArrSeparator(): void { - this.writer.u8(0x2c); // , - } - - public writeObj(obj: Record): void { - const writer = this.writer; - const keys = Object.keys(obj); - const length = keys.length; - if (!length) return writer.u16(0x7b7d); // {} - writer.u8(0x7b); // { - for (let i = 0; i < length; i++) { - const key = keys[i]; - const value = obj[key]; - this.writeStr(key); - writer.u8(0x3a); // : - this.writeAny(value); - writer.u8(0x2c); // , - } - writer.uint8[writer.x - 1] = 0x7d; // } - } - - public writeObjSeparator(): void { - this.writer.u8(0x2c); // , - } - - public writeObjKeySeparator(): void { - this.writer.u8(0x3a); // : - } - - // ------------------------------------------------------- Streaming encoding - - public writeStartStr(): void { - throw new Error('Method not implemented.'); - } - - public writeStrChunk(str: string): void { - throw new Error('Method not implemented.'); - } - - public writeEndStr(): void { - throw new Error('Method not implemented.'); - } - - public writeStartBin(): void { - throw new Error('Method not implemented.'); - } - - public writeBinChunk(buf: Uint8Array): void { - throw new Error('Method not implemented.'); - } - - public writeEndBin(): void { - throw new Error('Method not implemented.'); - } - - public writeStartArr(): void { - this.writer.u8(0x5b); // [ - } - - public writeArrChunk(item: unknown): void { - throw new Error('Method not implemented.'); - } - - public writeEndArr(): void { - this.writer.u8(0x5d); // ] - } - - public writeStartObj(): void { - this.writer.u8(0x7b); // { - } - - public writeObjChunk(key: string, value: unknown): void { - throw new Error('Method not implemented.'); - } - - public writeEndObj(): void { - this.writer.u8(0x7d); // } - } -} diff --git a/src/json-joy/json-pack/types.ts b/src/json-joy/json-pack/types.ts deleted file mode 100644 index 217c288bf..000000000 --- a/src/json-joy/json-pack/types.ts +++ /dev/null @@ -1,57 +0,0 @@ -import type {IReader, IReaderResettable, IWriter, IWriterGrowable} from '../util/buffers'; -import type {JsonPackExtension} from './JsonPackExtension'; -import type {JsonPackValue} from './JsonPackValue'; - -export type JsonPrimitive = string | number | bigint | boolean | null; -export type JsonValue = JsonPrimitive | JsonArray | JsonObject; -type JsonArray = JsonValue[] | readonly JsonValue[]; -type JsonObject = {[key: string]: JsonValue} | Readonly<{[key: string]: JsonValue}>; - -export type TypedJsonValue = T & JsonValue; - -export type PackPrimitive = JsonPrimitive | undefined | Uint8Array | JsonPackValue | JsonPackExtension | bigint; -export type PackValue = PackPrimitive | PackArray | PackObject; -type PackArray = PackValue[] | readonly PackValue[]; -type PackObject = {[key: string]: PackValue} | Readonly<{[key: string]: PackValue}>; - -export interface BinaryJsonEncoder { - writer: IWriter & IWriterGrowable; - writeAny(value: unknown): void; - writeNull(): void; - writeBoolean(bool: boolean): void; - writeNumber(num: number): void; - writeInteger(int: number): void; - writeUInteger(uint: number): void; - writeFloat(float: number): void; - writeBin(buf: Uint8Array): void; - writeAsciiStr(str: string): void; - writeStr(str: string): void; - writeArr(arr: unknown[]): void; - writeObj(obj: Record): void; -} - -export interface StreamingBinaryJsonEncoder { - writeStartStr(): void; - writeStrChunk(str: string): void; - writeEndStr(): void; - writeStartBin(): void; - writeBinChunk(buf: Uint8Array): void; - writeEndBin(): void; - writeStartArr(): void; - writeArrChunk(item: unknown): void; - writeEndArr(): void; - writeStartObj(): void; - writeObjChunk(key: string, value: unknown): void; - writeEndObj(): void; -} - -export interface TlvBinaryJsonEncoder { - writeBinHdr(length: number): void; - writeArrHdr(length: number): void; - writeObjHdr(length: number): void; -} - -export interface BinaryJsonDecoder { - reader: IReader & IReaderResettable; - read(uint8: Uint8Array): PackValue; -} diff --git a/src/snapshot/binary.ts b/src/snapshot/binary.ts index f1c068107..0e77bbfdb 100644 --- a/src/snapshot/binary.ts +++ b/src/snapshot/binary.ts @@ -1,9 +1,9 @@ -import { CborEncoder } from '../json-joy/json-pack/cbor/CborEncoder'; -import { CborDecoder } from '../json-joy/json-pack/cbor/CborDecoder'; +import { CborEncoder } from '@jsonjoy.com/json-pack/lib/cbor/CborEncoder'; +import { CborDecoder } from '@jsonjoy.com/json-pack/lib/cbor/CborDecoder'; import { fromSnapshotSync, toSnapshotSync } from './sync'; import { fromSnapshot, toSnapshot } from './async'; import { writer } from './shared'; -import type { CborUint8Array } from '../json-joy/json-pack/cbor/types'; +import type { CborUint8Array } from '@jsonjoy.com/json-pack/lib/cbor/types'; import type { AsyncSnapshotOptions, SnapshotNode, SnapshotOptions } from './types'; const encoder = new CborEncoder(writer); diff --git a/src/snapshot/json.ts b/src/snapshot/json.ts index f35ec9fa9..2b59194ca 100644 --- a/src/snapshot/json.ts +++ b/src/snapshot/json.ts @@ -1,5 +1,5 @@ -import { JsonEncoder } from '../json-joy/json-pack/json/JsonEncoder'; -import { JsonDecoder } from '../json-joy/json-pack/json/JsonDecoder'; +import { JsonEncoder } from '@jsonjoy.com/json-pack/lib/json/JsonEncoder'; +import { JsonDecoder } from '@jsonjoy.com/json-pack/lib/json/JsonDecoder'; import { fromSnapshotSync, toSnapshotSync } from './sync'; import { fromSnapshot, toSnapshot } from './async'; import { writer } from './shared'; diff --git a/yarn.lock b/yarn.lock index 377f78eeb..3a21d8bb5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -593,6 +593,28 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jsonjoy.com/base64@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-1.1.1.tgz#a717fd8840f7bad49c7fe66cc65db8bcfc4c4dc5" + integrity sha512-LnFjVChaGY8cZVMwAIMjvA1XwQjZ/zIXHyh28IyJkyNkzof4Dkm1+KN9UIm3lHhREH4vs7XwZ0NpkZKnwOtEfg== + +"@jsonjoy.com/json-pack@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-1.0.2.tgz#d7c8c284db828b29eebb9082134251a8216ec5cc" + integrity sha512-4KMApTgb1Hvjz9Ue7unziJ1xNy3k6d2erp0hz1iXryXsf6LEM3KwN6YrfbqT0vqkUO8Tu+CSnvMia9cWX6YGVw== + dependencies: + "@jsonjoy.com/base64" "^1.1.1" + "@jsonjoy.com/util" "^1.0.0" + hyperdyperid "^1.2.0" + thingies "^1.20.0" + +"@jsonjoy.com/util@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-1.1.0.tgz#9726365362ede17405d2b521b4c782582df7ed4f" + integrity sha512-Yz+xITJ3Y/w0DBISwPkBETP5/cITHXscjgQNZIkfrVz1V7/ahJY8vw+T+LZy/KtXgKuUWqu4GALAQ3bhGt9J8A== + dependencies: + hyperdyperid "^1.2.0" + "@leichtgewicht/ip-codec@^2.0.1": version "2.0.5" resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" @@ -3540,6 +3562,11 @@ husky@^8.0.1: resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== +hyperdyperid@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b" + integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -6707,6 +6734,11 @@ text-table@~0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +thingies@^1.20.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/thingies/-/thingies-1.21.0.tgz#e80fbe58fd6fdaaab8fad9b67bd0a5c943c445c1" + integrity sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g== + through2@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" From c223b74b22254c6344b7e23175f85d77f5c9d0ea Mon Sep 17 00:00:00 2001 From: streamich Date: Sat, 27 Apr 2024 13:24:38 +0200 Subject: [PATCH 30/37] =?UTF-8?q?chore:=20=F0=9F=A4=96=20use=20util=20pack?= =?UTF-8?q?age,=20remove=20more=20duplicate=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + src/json-joy/util/base64/constants.ts | 2 - .../util/base64/createFromBase64Bin.ts | 68 ----- src/json-joy/util/base64/createToBase64Bin.ts | 44 --- src/json-joy/util/base64/fromBase64Bin.ts | 3 - src/json-joy/util/base64/toBase64Bin.ts | 3 - src/json-joy/util/buffers/Reader.ts | 105 ------- src/json-joy/util/buffers/Slice.ts | 12 - src/json-joy/util/buffers/Writer.ts | 276 ------------------ src/json-joy/util/buffers/f16.ts | 16 - src/json-joy/util/buffers/index.ts | 1 - src/json-joy/util/buffers/isFloat32.ts | 6 - src/json-joy/util/buffers/types.ts | 126 -------- .../util/buffers/utf8/CachedUtf8Decoder.ts | 51 ---- src/json-joy/util/buffers/utf8/decodeAscii.ts | 167 ----------- .../util/buffers/utf8/decodeUtf8/index.ts | 3 - .../util/buffers/utf8/decodeUtf8/v10.ts | 39 --- .../util/buffers/utf8/decodeUtf8/v16.ts | 39 --- .../util/buffers/utf8/decodeUtf8/v18.ts | 36 --- src/json-joy/util/buffers/utf8/randomU32.ts | 7 - .../buffers/utf8/sharedCachedUtf8Decoder.ts | 3 - src/snapshot/shared.ts | 2 +- yarn.lock | 2 +- 23 files changed, 3 insertions(+), 1009 deletions(-) delete mode 100644 src/json-joy/util/base64/constants.ts delete mode 100644 src/json-joy/util/base64/createFromBase64Bin.ts delete mode 100644 src/json-joy/util/base64/createToBase64Bin.ts delete mode 100644 src/json-joy/util/base64/fromBase64Bin.ts delete mode 100644 src/json-joy/util/base64/toBase64Bin.ts delete mode 100644 src/json-joy/util/buffers/Reader.ts delete mode 100644 src/json-joy/util/buffers/Slice.ts delete mode 100644 src/json-joy/util/buffers/Writer.ts delete mode 100644 src/json-joy/util/buffers/f16.ts delete mode 100644 src/json-joy/util/buffers/index.ts delete mode 100644 src/json-joy/util/buffers/isFloat32.ts delete mode 100644 src/json-joy/util/buffers/types.ts delete mode 100644 src/json-joy/util/buffers/utf8/CachedUtf8Decoder.ts delete mode 100644 src/json-joy/util/buffers/utf8/decodeAscii.ts delete mode 100644 src/json-joy/util/buffers/utf8/decodeUtf8/index.ts delete mode 100644 src/json-joy/util/buffers/utf8/decodeUtf8/v10.ts delete mode 100644 src/json-joy/util/buffers/utf8/decodeUtf8/v16.ts delete mode 100644 src/json-joy/util/buffers/utf8/decodeUtf8/v18.ts delete mode 100644 src/json-joy/util/buffers/utf8/randomU32.ts delete mode 100644 src/json-joy/util/buffers/utf8/sharedCachedUtf8Decoder.ts diff --git a/package.json b/package.json index d0d4a76c9..900183894 100644 --- a/package.json +++ b/package.json @@ -125,6 +125,7 @@ }, "dependencies": { "@jsonjoy.com/json-pack": "^1.0.2", + "@jsonjoy.com/util": "^1.1.0", "tslib": "^2.0.0" }, "devDependencies": { diff --git a/src/json-joy/util/base64/constants.ts b/src/json-joy/util/base64/constants.ts deleted file mode 100644 index 46b192633..000000000 --- a/src/json-joy/util/base64/constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; -export const hasBuffer = typeof Buffer === 'function' && typeof Buffer.from === 'function'; diff --git a/src/json-joy/util/base64/createFromBase64Bin.ts b/src/json-joy/util/base64/createFromBase64Bin.ts deleted file mode 100644 index 3b2ee1cc5..000000000 --- a/src/json-joy/util/base64/createFromBase64Bin.ts +++ /dev/null @@ -1,68 +0,0 @@ -import {alphabet} from './constants'; - -export const createFromBase64Bin = (chars: string = alphabet, paddingOctet: number = 0x3d) => { - if (chars.length !== 64) throw new Error('chars must be 64 characters long'); - let max = 0; - for (let i = 0; i < chars.length; i++) max = Math.max(max, chars.charCodeAt(i)); - const table: number[] = []; - for (let i = 0; i <= max; i += 1) table[i] = -1; - for (let i = 0; i < chars.length; i++) table[chars.charCodeAt(i)] = i; - - return (view: DataView, offset: number, length: number): Uint8Array => { - if (!length) return new Uint8Array(0); - if (length % 4 !== 0) throw new Error('Base64 string length must be a multiple of 4'); - const end = offset + length; - const last = end - 1; - const lastOctet = view.getUint8(last); - const mainEnd = offset + (lastOctet !== paddingOctet ? length : length - 4); - let bufferLength = (length >> 2) * 3; - let padding = 0; - if (last > 0 && view.getUint8(last - 1) === paddingOctet) { - padding = 2; - bufferLength -= 2; - } else if (lastOctet === paddingOctet) { - padding = 1; - bufferLength -= 1; - } - const buf = new Uint8Array(bufferLength); - let j = 0; - let i = offset; - for (; i < mainEnd; i += 4) { - const word = view.getUint32(i); - const octet0 = word >>> 24; - const octet1 = (word >>> 16) & 0xff; - const octet2 = (word >>> 8) & 0xff; - const octet3 = word & 0xff; - const sextet0 = table[octet0]; - const sextet1 = table[octet1]; - const sextet2 = table[octet2]; - const sextet3 = table[octet3]; - if (sextet0 < 0 || sextet1 < 0 || sextet2 < 0 || sextet3 < 0) throw new Error('INVALID_BASE64_SEQ'); - buf[j] = (sextet0 << 2) | (sextet1 >> 4); - buf[j + 1] = (sextet1 << 4) | (sextet2 >> 2); - buf[j + 2] = (sextet2 << 6) | sextet3; - j += 3; - } - if (padding === 2) { - const word = view.getUint16(mainEnd); - const octet0 = word >> 8; - const octet1 = word & 0xff; - const sextet0 = table[octet0]; - const sextet1 = table[octet1]; - if (sextet0 < 0 || sextet1 < 0) throw new Error('INVALID_BASE64_SEQ'); - buf[j] = (sextet0 << 2) | (sextet1 >> 4); - } else if (padding === 1) { - const word = view.getUint16(mainEnd); - const octet0 = word >> 8; - const octet1 = word & 0xff; - const octet2 = view.getUint8(mainEnd + 2); - const sextet0 = table[octet0]; - const sextet1 = table[octet1]; - const sextet2 = table[octet2]; - if (sextet0 < 0 || sextet1 < 0 || sextet2 < 0) throw new Error('INVALID_BASE64_SEQ'); - buf[j] = (sextet0 << 2) | (sextet1 >> 4); - buf[j + 1] = (sextet1 << 4) | (sextet2 >> 2); - } - return buf; - }; -}; diff --git a/src/json-joy/util/base64/createToBase64Bin.ts b/src/json-joy/util/base64/createToBase64Bin.ts deleted file mode 100644 index 865d09542..000000000 --- a/src/json-joy/util/base64/createToBase64Bin.ts +++ /dev/null @@ -1,44 +0,0 @@ -import {alphabet} from './constants'; - -export const createToBase64Bin = (chars: string = alphabet) => { - if (chars.length !== 64) throw new Error('chars must be 64 characters long'); - - const table = chars.split('').map((c) => c.charCodeAt(0)); - const table2: number[] = []; - - for (const c1 of table) { - for (const c2 of table) { - const two = (c1 << 8) + c2; - table2.push(two); - } - } - - return (uint8: Uint8Array, start: number, length: number, dest: DataView, offset: number): number => { - const extraLength = length % 3; - const baseLength = length - extraLength; - for (; start < baseLength; start += 3) { - const o1 = uint8[start]; - const o2 = uint8[start + 1]; - const o3 = uint8[start + 2]; - const v1 = (o1 << 4) | (o2 >> 4); - const v2 = ((o2 & 0b1111) << 8) | o3; - dest.setInt32(offset, (table2[v1] << 16) + table2[v2]); - offset += 4; - } - if (extraLength) { - if (extraLength === 1) { - const o1 = uint8[baseLength]; - dest.setInt32(offset, (table2[o1 << 4] << 16) + 0x3d3d); - return offset + 4; - } else { - const o1 = uint8[baseLength]; - const o2 = uint8[baseLength + 1]; - const v1 = (o1 << 4) | (o2 >> 4); - const v2 = (o2 & 0b1111) << 2; - dest.setInt32(offset, (table2[v1] << 16) + (table[v2] << 8) + 0x3d); - return offset + 4; - } - } - return offset; - }; -}; diff --git a/src/json-joy/util/base64/fromBase64Bin.ts b/src/json-joy/util/base64/fromBase64Bin.ts deleted file mode 100644 index 678898d5e..000000000 --- a/src/json-joy/util/base64/fromBase64Bin.ts +++ /dev/null @@ -1,3 +0,0 @@ -import {createFromBase64Bin} from './createFromBase64Bin'; - -export const fromBase64Bin = createFromBase64Bin(); diff --git a/src/json-joy/util/base64/toBase64Bin.ts b/src/json-joy/util/base64/toBase64Bin.ts deleted file mode 100644 index 012f2c24a..000000000 --- a/src/json-joy/util/base64/toBase64Bin.ts +++ /dev/null @@ -1,3 +0,0 @@ -import {createToBase64Bin} from './createToBase64Bin'; - -export const toBase64Bin = createToBase64Bin(); diff --git a/src/json-joy/util/buffers/Reader.ts b/src/json-joy/util/buffers/Reader.ts deleted file mode 100644 index 160e9cdc8..000000000 --- a/src/json-joy/util/buffers/Reader.ts +++ /dev/null @@ -1,105 +0,0 @@ -import {decodeUtf8} from './utf8/decodeUtf8'; -import type {IReader, IReaderResettable} from './types'; - -export class Reader implements IReader, IReaderResettable { - public uint8 = new Uint8Array([]); - public view = new DataView(this.uint8.buffer); - public x = 0; - - public reset(uint8: Uint8Array): void { - this.x = 0; - this.uint8 = uint8; - this.view = new DataView(uint8.buffer, uint8.byteOffset, uint8.length); - } - - public peak(): number { - return this.view.getUint8(this.x); - } - - public skip(length: number): void { - this.x += length; - } - - public buf(size: number): Uint8Array { - const end = this.x + size; - const bin = this.uint8.subarray(this.x, end); - this.x = end; - return bin; - } - - public u8(): number { - return this.uint8[this.x++]; - // return this.view.getUint8(this.x++); - } - - public i8(): number { - return this.view.getInt8(this.x++); - } - - public u16(): number { - // const num = this.view.getUint16(this.x); - // this.x += 2; - // return num; - let x = this.x; - const num = (this.uint8[x++] << 8) + this.uint8[x++]; - this.x = x; - return num; - } - - public i16(): number { - const num = this.view.getInt16(this.x); - this.x += 2; - return num; - } - - public u32(): number { - const num = this.view.getUint32(this.x); - this.x += 4; - return num; - } - - public i32(): number { - const num = this.view.getInt32(this.x); - this.x += 4; - return num; - } - - public u64(): bigint { - const num = this.view.getBigUint64(this.x); - this.x += 8; - return num; - } - - public i64(): bigint { - const num = this.view.getBigInt64(this.x); - this.x += 8; - return num; - } - - public f32(): number { - const pos = this.x; - this.x += 4; - return this.view.getFloat32(pos); - } - - public f64(): number { - const pos = this.x; - this.x += 8; - return this.view.getFloat64(pos); - } - - public utf8(size: number): string { - const start = this.x; - this.x += size; - return decodeUtf8(this.uint8, start, size); - } - - public ascii(length: number): string { - const uint8 = this.uint8; - let str = ''; - const end = this.x + length; - for (let i = this.x; i < end; i++) str += String.fromCharCode(uint8[i]); - this.x = end; - return str; - } -} diff --git a/src/json-joy/util/buffers/Slice.ts b/src/json-joy/util/buffers/Slice.ts deleted file mode 100644 index c0287b831..000000000 --- a/src/json-joy/util/buffers/Slice.ts +++ /dev/null @@ -1,12 +0,0 @@ -export class Slice { - constructor( - public readonly uint8: Uint8Array, - public readonly view: DataView, - public readonly start: number, - public readonly end: number, - ) {} - - public subarray(): Uint8Array { - return this.uint8.subarray(this.start, this.end); - } -} diff --git a/src/json-joy/util/buffers/Writer.ts b/src/json-joy/util/buffers/Writer.ts deleted file mode 100644 index 7433f5cd0..000000000 --- a/src/json-joy/util/buffers/Writer.ts +++ /dev/null @@ -1,276 +0,0 @@ -import {Slice} from './Slice'; -import {IWriterGrowable, IWriter} from './types'; - -const EMPTY_UINT8 = new Uint8Array([]); -const EMPTY_VIEW = new DataView(EMPTY_UINT8.buffer); - -declare global { - interface Uint8Array { - utf8Write(str: string, pos: number, maxLength: number): number - write(str: string, pos: number, maxLength: number, encoding: string): number; - } -} - -const hasBuffer = typeof Buffer === 'function'; -const utf8Write = hasBuffer - ? (Buffer.prototype.utf8Write as (this: Uint8Array, str: string, pos: number, maxLength: number) => number) - : null; -const from = hasBuffer ? Buffer.from : null; -const textEncoder = typeof TextEncoder !== 'undefined' ? new TextEncoder() : null; - -/** - * Encoder class provides an efficient way to encode binary data. It grows the - * internal memory buffer automatically as more space is required. It is useful - * in cases when it is not known in advance the size of memory needed. - */ -export class Writer implements IWriter, IWriterGrowable { - /** @ignore */ - public uint8: Uint8Array; - /** @ignore */ - public view: DataView = EMPTY_VIEW; - /** @ignore */ - public x0: number = 0; - /** @ignore */ - public x: number = 0; - protected size: number; - - /** - * @param allocSize Number of bytes to allocate at a time when buffer ends. - */ - constructor(public allocSize: number = 64 * 1024) { - this.uint8 = new Uint8Array(allocSize); - this.size = allocSize; - this.view = new DataView(this.uint8.buffer); - } - - /** @ignore */ - protected grow(size: number) { - const x0 = this.x0; - const x = this.x; - const oldUint8 = this.uint8; - const newUint8 = new Uint8Array(size); - const view = new DataView(newUint8.buffer); - const activeSlice = oldUint8.subarray(x0, x); - newUint8.set(activeSlice, 0); - this.x = x - x0; - this.x0 = 0; - this.uint8 = newUint8; - this.size = size; - this.view = view; - } - - /** - * Make sure the internal buffer has enough space to write the specified number - * of bytes, otherwise resize the internal buffer to accommodate for more size. - * - * @param capacity Number of bytes. - */ - public ensureCapacity(capacity: number) { - const byteLength = this.size; - const remaining = byteLength - this.x; - if (remaining < capacity) { - const total = byteLength - this.x0; - const required = capacity - remaining; - const totalRequired = total + required; - this.grow(totalRequired <= this.allocSize ? this.allocSize : totalRequired * 2); - } - } - - /** @todo Consider renaming to "skip"? */ - public move(capacity: number) { - this.ensureCapacity(capacity); - this.x += capacity; - } - - public reset() { - this.x0 = this.x; - } - - /** - * Allocates a new {@link ArrayBuffer}, useful when the underlying - * {@link ArrayBuffer} cannot be shared between threads. - * - * @param size Size of memory to allocate. - */ - public newBuffer(size: number) { - const uint8 = (this.uint8 = new Uint8Array(size)); - this.size = size; - this.view = new DataView(uint8.buffer); - this.x = this.x0 = 0; - } - - /** - * @returns Encoded memory buffer contents. - */ - public flush(): Uint8Array { - const result = this.uint8.subarray(this.x0, this.x); - this.x0 = this.x; - return result; - } - - public flushSlice(): Slice { - const slice = new Slice(this.uint8, this.view, this.x0, this.x); - this.x0 = this.x; - return slice; - } - - public u8(char: number) { - this.ensureCapacity(1); - this.uint8[this.x++] = char; - } - - public u16(word: number) { - this.ensureCapacity(2); - this.view.setUint16(this.x, word); - this.x += 2; - } - - public u32(dword: number) { - this.ensureCapacity(4); - this.view.setUint32(this.x, dword); - this.x += 4; - } - - public i32(dword: number) { - this.ensureCapacity(4); - this.view.setInt32(this.x, dword); - this.x += 4; - } - - public u64(qword: number | bigint) { - this.ensureCapacity(8); - this.view.setBigUint64(this.x, BigInt(qword)); - this.x += 8; - } - - public f64(float: number) { - this.ensureCapacity(8); - this.view.setFloat64(this.x, float); - this.x += 8; - } - - public u8u16(u8: number, u16: number) { - this.ensureCapacity(3); - let x = this.x; - this.uint8[x++] = u8; - this.uint8[x++] = u16 >>> 8; - this.uint8[x++] = u16 & 0xff; - this.x = x; - } - - public u8u32(u8: number, u32: number) { - this.ensureCapacity(5); - let x = this.x; - this.uint8[x++] = u8; - this.view.setUint32(x, u32); - this.x = x + 4; - } - - public u8u64(u8: number, u64: number | bigint) { - this.ensureCapacity(9); - let x = this.x; - this.uint8[x++] = u8; - this.view.setBigUint64(x, BigInt(u64)); - this.x = x + 8; - } - - public u8f32(u8: number, f32: number) { - this.ensureCapacity(5); - let x = this.x; - this.uint8[x++] = u8; - this.view.setFloat32(x, f32); - this.x = x + 4; - } - - public u8f64(u8: number, f64: number) { - this.ensureCapacity(9); - let x = this.x; - this.uint8[x++] = u8; - this.view.setFloat64(x, f64); - this.x = x + 8; - } - - public buf(buf: Uint8Array, length: number): void { - this.ensureCapacity(length); - const x = this.x; - this.uint8.set(buf, x); - this.x = x + length; - } - - /** - * Encodes string as UTF-8. You need to call .ensureCapacity(str.length * 4) - * before calling - * - * @param str String to encode as UTF-8. - * @returns The number of bytes written - */ - public utf8(str: string): number { - const maxLength = str.length * 4; - if (maxLength < 168) return this.utf8Native(str); - if (utf8Write) { - const writeLength = utf8Write.call(this.uint8, str, this.x, maxLength); - this.x += writeLength; - return writeLength; - } else if (from) { - const uint8 = this.uint8; - const offset = uint8.byteOffset + this.x; - const buf = from(uint8.buffer).subarray(offset, offset + maxLength); - const writeLength = buf.write(str, 0, maxLength, 'utf8'); - this.x += writeLength; - return writeLength; - } else if (maxLength > 1024 && textEncoder) { - const writeLength = textEncoder!.encodeInto(str, this.uint8.subarray(this.x, this.x + maxLength)).written!; - this.x += writeLength; - return writeLength; - } - return this.utf8Native(str); - } - - public utf8Native(str: string): number { - const length = str.length; - const uint8 = this.uint8; - let offset = this.x; - let pos = 0; - while (pos < length) { - let value = str.charCodeAt(pos++); - if ((value & 0xffffff80) === 0) { - uint8[offset++] = value; - continue; - } else if ((value & 0xfffff800) === 0) { - uint8[offset++] = ((value >> 6) & 0x1f) | 0xc0; - } else { - if (value >= 0xd800 && value <= 0xdbff) { - if (pos < length) { - const extra = str.charCodeAt(pos); - if ((extra & 0xfc00) === 0xdc00) { - pos++; - value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000; - } - } - } - if ((value & 0xffff0000) === 0) { - uint8[offset++] = ((value >> 12) & 0x0f) | 0xe0; - uint8[offset++] = ((value >> 6) & 0x3f) | 0x80; - } else { - uint8[offset++] = ((value >> 18) & 0x07) | 0xf0; - uint8[offset++] = ((value >> 12) & 0x3f) | 0x80; - uint8[offset++] = ((value >> 6) & 0x3f) | 0x80; - } - } - uint8[offset++] = (value & 0x3f) | 0x80; - } - const writeLength = offset - this.x; - this.x = offset; - return writeLength; - } - - public ascii(str: string): void { - const length = str.length; - this.ensureCapacity(length); - const uint8 = this.uint8; - let x = this.x; - let pos = 0; - while (pos < length) uint8[x++] = str.charCodeAt(pos++); - this.x = x; - } -} diff --git a/src/json-joy/util/buffers/f16.ts b/src/json-joy/util/buffers/f16.ts deleted file mode 100644 index 51a415041..000000000 --- a/src/json-joy/util/buffers/f16.ts +++ /dev/null @@ -1,16 +0,0 @@ -const pow = Math.pow; - -export const decodeF16 = (binary: number): number => { - const exponent = (binary & 0x7c00) >> 10; - const fraction = binary & 0x03ff; - return ( - (binary >> 15 ? -1 : 1) * - (exponent - ? exponent === 0x1f - ? fraction - ? NaN - : Infinity - : pow(2, exponent - 15) * (1 + fraction / 0x400) - : 6.103515625e-5 * (fraction / 0x400)) - ); -}; diff --git a/src/json-joy/util/buffers/index.ts b/src/json-joy/util/buffers/index.ts deleted file mode 100644 index fcb073fef..000000000 --- a/src/json-joy/util/buffers/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './types'; diff --git a/src/json-joy/util/buffers/isFloat32.ts b/src/json-joy/util/buffers/isFloat32.ts deleted file mode 100644 index 26e382346..000000000 --- a/src/json-joy/util/buffers/isFloat32.ts +++ /dev/null @@ -1,6 +0,0 @@ -const view = new DataView(new ArrayBuffer(4)); - -export const isFloat32 = (n: number): boolean => { - view.setFloat32(0, n); - return n === view.getFloat32(0); -}; diff --git a/src/json-joy/util/buffers/types.ts b/src/json-joy/util/buffers/types.ts deleted file mode 100644 index ae29727a8..000000000 --- a/src/json-joy/util/buffers/types.ts +++ /dev/null @@ -1,126 +0,0 @@ -import type {Slice} from './Slice'; - -export interface IWriter { - /** - * Uint8Array view of the current memory buffer. - */ - uint8: Uint8Array; - - /** - * DataView view of the current memory buffer. - */ - view: DataView; - - /** - * Position where last flush happened. - */ - x0: number; - - /** - * Current position in the internal buffer. - */ - x: number; - - u8(char: number): void; - u16(word: number): void; - u32(dword: number): void; - i32(dword: number): void; - u64(qword: number | bigint): void; - u8u16(u8: number, u16: number): void; - u8u32(u8: number, u32: number): void; - u8u64(u8: number, u64: number | bigint): void; - u8f32(u8: number, f64: number): void; - u8f64(u8: number, f64: number): void; - f64(dword: number): void; - - /** - * Write contents of a buffer. - * - * @param buf Buffer to copy from. - * @param length Number of octets to copy. - */ - buf(buf: Uint8Array, length: number): void; - - /** - * Write string as UTF-8. You need to call .ensureCapacity(str.length * 4) - * before calling - * - * @param str JavaScript string to encode as UTF-8 byte sequence. - */ - utf8(str: string): number; - - ascii(str: string): void; -} - -export interface IWriterGrowable { - /** @deprecated */ - reset(): void; - - /** - * Calling this method might reset the internal buffer. So, your references - * (such as `x`, `uint8`, `view`) to the internal buffer might become invalid. - * - * @param capacity How many octets to ensure are available after `x`. - */ - ensureCapacity(capacity: number): void; - move(length: number): void; - flush(): Uint8Array; - flushSlice(): Slice; - newBuffer(size: number): void; -} - -export interface IReaderBase { - /** Get current byte value without advancing the cursor. */ - peak(): number; - - /** Advance the cursor given number of octets. */ - skip(length: number): void; - - /** - * Create a new Uint8Array view of provided length starting at - * the current cursor position. - */ - buf(size: number): Uint8Array; - - u8(): number; - i8(): number; - u16(): number; - i16(): number; - u32(): number; - u64(): bigint; - i64(): bigint; - i32(): number; - f32(): number; - f64(): number; - - /** - * Decode a UTF-8 string. - * - * @param size Length of the string. - */ - utf8(size: number): string; - - ascii(length: number): string; -} - -export interface IReader extends IReaderBase { - /** - * Uint8Array view of the current memory buffer. - */ - uint8: Uint8Array; - - /** - * DataView view of the current memory buffer. - */ - view: DataView; - - /** - * Cursor in the current memory buffer. - */ - x: number; -} - -export interface IReaderResettable { - /** Set a new underlying buffer and reset cursor position to 0. */ - reset(uint8: Uint8Array): void; -} diff --git a/src/json-joy/util/buffers/utf8/CachedUtf8Decoder.ts b/src/json-joy/util/buffers/utf8/CachedUtf8Decoder.ts deleted file mode 100644 index f3c1af342..000000000 --- a/src/json-joy/util/buffers/utf8/CachedUtf8Decoder.ts +++ /dev/null @@ -1,51 +0,0 @@ -import decodeUtf8 from './decodeUtf8/v10'; -import {randomU32} from './randomU32'; - -class CacheItem { - constructor(public readonly bytes: Uint8Array, public readonly value: string) {} -} - -const enum CONST { - MAX_CACHED_STR_LEN = 31, - MAX_RECORDS_PER_SIZE = 16, -} - -export class CachedUtf8Decoder { - private readonly caches: CacheItem[][]; - - constructor() { - this.caches = []; - for (let i = 0; i < CONST.MAX_CACHED_STR_LEN; i++) this.caches.push([]); - } - - private get(bytes: Uint8Array, offset: number, size: number): string | null { - const records = this.caches[size - 1]!; - const len = records.length; - FIND_CHUNK: for (let i = 0; i < len; i++) { - const record = records[i]; - const recordBytes = record.bytes; - for (let j = 0; j < size; j++) if (recordBytes[j] !== bytes[offset + j]) continue FIND_CHUNK; - return record.value; - } - return null; - } - - private store(bytes: Uint8Array, value: string): void { - const records = this.caches[bytes.length - 1]!; - const record = new CacheItem(bytes, value); - const length = records.length; - if (length >= CONST.MAX_RECORDS_PER_SIZE) records[randomU32(0, CONST.MAX_RECORDS_PER_SIZE - 1)] = record; - else records.push(record); - } - - public decode(bytes: Uint8Array, offset: number, size: number): string { - if (!size) return ''; - const cachedValue = this.get(bytes, offset, size); - if (cachedValue !== null) return cachedValue; - const value = decodeUtf8(bytes, offset, size); - // Ensure to copy a slice of bytes because the byte may be NodeJS Buffer and Buffer#slice() returns a reference to its internal ArrayBuffer. - const copy = Uint8Array.prototype.slice.call(bytes, offset, offset + size); - this.store(copy, value); - return value; - } -} diff --git a/src/json-joy/util/buffers/utf8/decodeAscii.ts b/src/json-joy/util/buffers/utf8/decodeAscii.ts deleted file mode 100644 index 3246e6133..000000000 --- a/src/json-joy/util/buffers/utf8/decodeAscii.ts +++ /dev/null @@ -1,167 +0,0 @@ -const fromCharCode = String.fromCharCode; - -/** This code was borrowed form cbor-x under the MIT license. */ - -// MIT License - -// Copyright (c) 2020 Kris Zyp - -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: - -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. - -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -export const decodeAscii = (src: Uint8Array, position: number, length: number): string | undefined => { - const bytes: number[] = []; - for (let i = 0; i < length; i++) { - const byte = src[position++]; - if (byte & 0x80) return; - bytes.push(byte); - } - return fromCharCode.apply(String, bytes); -}; - -export const decodeAsciiMax15 = (src: Uint8Array, position: number, length: number): string | undefined => { - if (length < 4) { - if (length < 2) { - if (length === 0) return ''; - else { - const a = src[position++]; - if ((a & 0x80) > 1) { - position -= 1; - return; - } - return fromCharCode(a); - } - } else { - const a = src[position++]; - const b = src[position++]; - if ((a & 0x80) > 0 || (b & 0x80) > 0) { - position -= 2; - return; - } - if (length < 3) return fromCharCode(a, b); - const c = src[position++]; - if ((c & 0x80) > 0) { - position -= 3; - return; - } - return fromCharCode(a, b, c); - } - } else { - const a = src[position++]; - const b = src[position++]; - const c = src[position++]; - const d = src[position++]; - if ((a & 0x80) > 0 || (b & 0x80) > 0 || (c & 0x80) > 0 || (d & 0x80) > 0) { - position -= 4; - return; - } - if (length < 6) { - if (length === 4) return fromCharCode(a, b, c, d); - else { - const e = src[position++]; - if ((e & 0x80) > 0) { - position -= 5; - return; - } - return fromCharCode(a, b, c, d, e); - } - } else if (length < 8) { - const e = src[position++]; - const f = src[position++]; - if ((e & 0x80) > 0 || (f & 0x80) > 0) { - position -= 6; - return; - } - if (length < 7) return fromCharCode(a, b, c, d, e, f); - const g = src[position++]; - if ((g & 0x80) > 0) { - position -= 7; - return; - } - return fromCharCode(a, b, c, d, e, f, g); - } else { - const e = src[position++]; - const f = src[position++]; - const g = src[position++]; - const h = src[position++]; - if ((e & 0x80) > 0 || (f & 0x80) > 0 || (g & 0x80) > 0 || (h & 0x80) > 0) { - position -= 8; - return; - } - if (length < 10) { - if (length === 8) return fromCharCode(a, b, c, d, e, f, g, h); - else { - const i = src[position++]; - if ((i & 0x80) > 0) { - position -= 9; - return; - } - return fromCharCode(a, b, c, d, e, f, g, h, i); - } - } else if (length < 12) { - const i = src[position++]; - const j = src[position++]; - if ((i & 0x80) > 0 || (j & 0x80) > 0) { - position -= 10; - return; - } - if (length < 11) return fromCharCode(a, b, c, d, e, f, g, h, i, j); - const k = src[position++]; - if ((k & 0x80) > 0) { - position -= 11; - return; - } - return fromCharCode(a, b, c, d, e, f, g, h, i, j, k); - } else { - const i = src[position++]; - const j = src[position++]; - const k = src[position++]; - const l = src[position++]; - if ((i & 0x80) > 0 || (j & 0x80) > 0 || (k & 0x80) > 0 || (l & 0x80) > 0) { - position -= 12; - return; - } - if (length < 14) { - if (length === 12) return fromCharCode(a, b, c, d, e, f, g, h, i, j, k, l); - else { - const m = src[position++]; - if ((m & 0x80) > 0) { - position -= 13; - return; - } - return fromCharCode(a, b, c, d, e, f, g, h, i, j, k, l, m); - } - } else { - const m = src[position++]; - const n = src[position++]; - if ((m & 0x80) > 0 || (n & 0x80) > 0) { - position -= 14; - return; - } - if (length < 15) return fromCharCode(a, b, c, d, e, f, g, h, i, j, k, l, m, n); - const o = src[position++]; - if ((o & 0x80) > 0) { - position -= 15; - return; - } - return fromCharCode(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o); - } - } - } - } -}; diff --git a/src/json-joy/util/buffers/utf8/decodeUtf8/index.ts b/src/json-joy/util/buffers/utf8/decodeUtf8/index.ts deleted file mode 100644 index 7e9349894..000000000 --- a/src/json-joy/util/buffers/utf8/decodeUtf8/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import decodeUtf8 from './v16'; - -export {decodeUtf8}; diff --git a/src/json-joy/util/buffers/utf8/decodeUtf8/v10.ts b/src/json-joy/util/buffers/utf8/decodeUtf8/v10.ts deleted file mode 100644 index ebf8b03d0..000000000 --- a/src/json-joy/util/buffers/utf8/decodeUtf8/v10.ts +++ /dev/null @@ -1,39 +0,0 @@ -const fromCharCode = String.fromCharCode; - -export default (buf: Uint8Array, start: number, length: number): string => { - let offset = start; - const end = offset + length; - let str = ''; - while (offset < end) { - const octet1 = buf[offset++]!; - if ((octet1 & 0x80) === 0) { - str += fromCharCode(octet1); - continue; - } - const octet2 = buf[offset++]! & 0x3f; - if ((octet1 & 0xe0) === 0xc0) { - str += fromCharCode(((octet1 & 0x1f) << 6) | octet2); - continue; - } - const octet3 = buf[offset++]! & 0x3f; - if ((octet1 & 0xf0) === 0xe0) { - str += fromCharCode(((octet1 & 0x1f) << 12) | (octet2 << 6) | octet3); - continue; - } - if ((octet1 & 0xf8) === 0xf0) { - const octet4 = buf[offset++]! & 0x3f; - let unit = ((octet1 & 0x07) << 0x12) | (octet2 << 0x0c) | (octet3 << 0x06) | octet4; - if (unit > 0xffff) { - unit -= 0x10000; - const unit0 = ((unit >>> 10) & 0x3ff) | 0xd800; - unit = 0xdc00 | (unit & 0x3ff); - str += fromCharCode(unit0, unit); - } else { - str += fromCharCode(unit); - } - } else { - str += fromCharCode(octet1); - } - } - return str; -}; diff --git a/src/json-joy/util/buffers/utf8/decodeUtf8/v16.ts b/src/json-joy/util/buffers/utf8/decodeUtf8/v16.ts deleted file mode 100644 index 5953a774e..000000000 --- a/src/json-joy/util/buffers/utf8/decodeUtf8/v16.ts +++ /dev/null @@ -1,39 +0,0 @@ -import {decodeAscii, decodeAsciiMax15} from '../decodeAscii'; -import v18 from './v18'; - -declare global { - interface Buffer { - utf8Slice(buf: Uint8Array, start: number, length: number): string - } - - interface Uint8Array { - toString(encoding?: string): string; - } -} - -type Decoder = (buf: Uint8Array, start: number, length: number) => string; - -const hasBuffer = typeof Buffer !== 'undefined'; -const utf8Slice = hasBuffer ? Buffer.prototype.utf8Slice : null; -const from = hasBuffer ? Buffer.from : null; - -const shortDecoder: Decoder = (buf, start, length) => decodeAsciiMax15(buf, start, length) ?? v18(buf, start, length); - -const midDecoder: Decoder = (buf, start, length) => decodeAscii(buf, start, length) ?? v18(buf, start, length); - -const longDecoder: Decoder = utf8Slice - ? (buf, start, length) => utf8Slice.call(buf, start, start + length) - : from - ? (buf, start, length) => - from(buf) - .subarray(start, start + length) - .toString('utf8') - : v18; - -const decoder: Decoder = (buf, start, length): string => { - if (length < 16) return shortDecoder(buf, start, length); - if (length < 32) return midDecoder(buf, start, length); - return longDecoder(buf, start, length); -}; - -export default decoder; diff --git a/src/json-joy/util/buffers/utf8/decodeUtf8/v18.ts b/src/json-joy/util/buffers/utf8/decodeUtf8/v18.ts deleted file mode 100644 index e1b518e00..000000000 --- a/src/json-joy/util/buffers/utf8/decodeUtf8/v18.ts +++ /dev/null @@ -1,36 +0,0 @@ -const fromCharCode = String.fromCharCode; - -export default (buf: Uint8Array, start: number, length: number): string => { - let offset = start; - const end = offset + length; - const points: number[] = []; - while (offset < end) { - let code = buf[offset++]!; - if ((code & 0x80) !== 0) { - const octet2 = buf[offset++]! & 0x3f; - if ((code & 0xe0) === 0xc0) { - code = ((code & 0x1f) << 6) | octet2; - } else { - const octet3 = buf[offset++]! & 0x3f; - if ((code & 0xf0) === 0xe0) { - code = ((code & 0x1f) << 12) | (octet2 << 6) | octet3; - } else { - if ((code & 0xf8) === 0xf0) { - const octet4 = buf[offset++]! & 0x3f; - let unit = ((code & 0x07) << 0x12) | (octet2 << 0x0c) | (octet3 << 0x06) | octet4; - if (unit > 0xffff) { - unit -= 0x10000; - const unit0 = ((unit >>> 10) & 0x3ff) | 0xd800; - code = 0xdc00 | (unit & 0x3ff); - points.push(unit0); - } else { - code = unit; - } - } - } - } - } - points.push(code); - } - return fromCharCode.apply(String, points); -}; diff --git a/src/json-joy/util/buffers/utf8/randomU32.ts b/src/json-joy/util/buffers/utf8/randomU32.ts deleted file mode 100644 index 1e289fa80..000000000 --- a/src/json-joy/util/buffers/utf8/randomU32.ts +++ /dev/null @@ -1,7 +0,0 @@ -let x = 1 + Math.round(Math.random() * ((-1>>>0)-1)); - -/** Generate a random 32-bit unsigned integer in the specified [min, max] range. */ -export function randomU32(min: number, max: number): number { - x ^= x << 13; x ^= x >>> 17; x ^= x << 5; - return (x >>> 0) % (max - min + 1) + min; -} diff --git a/src/json-joy/util/buffers/utf8/sharedCachedUtf8Decoder.ts b/src/json-joy/util/buffers/utf8/sharedCachedUtf8Decoder.ts deleted file mode 100644 index 86b2d4ad0..000000000 --- a/src/json-joy/util/buffers/utf8/sharedCachedUtf8Decoder.ts +++ /dev/null @@ -1,3 +0,0 @@ -import {CachedUtf8Decoder} from './CachedUtf8Decoder'; - -export default new CachedUtf8Decoder(); diff --git a/src/snapshot/shared.ts b/src/snapshot/shared.ts index ef5e87d59..019166416 100644 --- a/src/snapshot/shared.ts +++ b/src/snapshot/shared.ts @@ -1,3 +1,3 @@ -import { Writer } from '../json-joy/util/buffers/Writer'; +import { Writer } from '@jsonjoy.com/util/lib/buffers/Writer'; export const writer = new Writer(1024 * 32); diff --git a/yarn.lock b/yarn.lock index 3a21d8bb5..e23a3a07e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -608,7 +608,7 @@ hyperdyperid "^1.2.0" thingies "^1.20.0" -"@jsonjoy.com/util@^1.0.0": +"@jsonjoy.com/util@^1.0.0", "@jsonjoy.com/util@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-1.1.0.tgz#9726365362ede17405d2b521b4c782582df7ed4f" integrity sha512-Yz+xITJ3Y/w0DBISwPkBETP5/cITHXscjgQNZIkfrVz1V7/ahJY8vw+T+LZy/KtXgKuUWqu4GALAQ3bhGt9J8A== From c6e18b73d13664b263720a95353a5fc250446635 Mon Sep 17 00:00:00 2001 From: streamich Date: Sat, 27 Apr 2024 13:26:41 +0200 Subject: [PATCH 31/37] =?UTF-8?q?chore:=20=F0=9F=A4=96=20use=20sonic-fores?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + src/json-joy/util/print/printTree.ts | 15 --------------- src/print/index.ts | 2 +- yarn.lock | 5 +++++ 4 files changed, 7 insertions(+), 16 deletions(-) delete mode 100644 src/json-joy/util/print/printTree.ts diff --git a/package.json b/package.json index 900183894..657952f8f 100644 --- a/package.json +++ b/package.json @@ -126,6 +126,7 @@ "dependencies": { "@jsonjoy.com/json-pack": "^1.0.2", "@jsonjoy.com/util": "^1.1.0", + "sonic-forest": "^1.0.0", "tslib": "^2.0.0" }, "devDependencies": { diff --git a/src/json-joy/util/print/printTree.ts b/src/json-joy/util/print/printTree.ts deleted file mode 100644 index a054a5502..000000000 --- a/src/json-joy/util/print/printTree.ts +++ /dev/null @@ -1,15 +0,0 @@ -type Child = (tab: string) => string; - -export const printTree = (tab = '', children: (Child | null)[]): string => { - children = children.filter(Boolean); - let str = ''; - for (let i = 0; i < children.length; i++) { - const isLast = i >= children.length - 1; - const fn = children[i]; - if (!fn) continue; - const child = fn(tab + `${isLast ? ' ' : '│'} `); - const branch = child ? (isLast ? '└─' : '├─') : '│ '; - str += `\n${tab}${branch} ${child}`; - } - return str; -}; diff --git a/src/print/index.ts b/src/print/index.ts index e55aca864..3b8bb45d5 100644 --- a/src/print/index.ts +++ b/src/print/index.ts @@ -1,4 +1,4 @@ -import { printTree } from '../json-joy/util/print/printTree'; +import { printTree } from 'sonic-forest/lib/print/printTree'; import { basename } from '../node-to-fsa/util'; import type { FsSynchronousApi } from '../node/types'; import type { IDirent } from '../node/types/misc'; diff --git a/yarn.lock b/yarn.lock index e23a3a07e..d70b65d88 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6379,6 +6379,11 @@ socks@^2.6.2: ip-address "^9.0.5" smart-buffer "^4.2.0" +sonic-forest@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sonic-forest/-/sonic-forest-1.0.0.tgz#b0b77d9bca76434f4ef87b61042d041da63f3be5" + integrity sha512-yFO2N4uTUFtgKLw03WWFpN1iEwZySweMsa18XN3Kt0yYrlmVHunC2ZgM+437zDoKISAJHcH3Cg18U7d6tuSgSQ== + source-map-support@0.5.13: version "0.5.13" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" From 0509f1548470e7a830fcd6f0a285b8e715934669 Mon Sep 17 00:00:00 2001 From: streamich Date: Sat, 27 Apr 2024 13:27:41 +0200 Subject: [PATCH 32/37] =?UTF-8?q?chore:=20=F0=9F=A4=96=20remove=20/src/jso?= =?UTF-8?q?n-joy/=20folder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/json-joy/json-pointer/index.ts | 1 - src/json-joy/json-pointer/types.ts | 2 -- 2 files changed, 3 deletions(-) delete mode 100644 src/json-joy/json-pointer/index.ts delete mode 100644 src/json-joy/json-pointer/types.ts diff --git a/src/json-joy/json-pointer/index.ts b/src/json-joy/json-pointer/index.ts deleted file mode 100644 index fcb073fef..000000000 --- a/src/json-joy/json-pointer/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './types'; diff --git a/src/json-joy/json-pointer/types.ts b/src/json-joy/json-pointer/types.ts deleted file mode 100644 index 8c0860c59..000000000 --- a/src/json-joy/json-pointer/types.ts +++ /dev/null @@ -1,2 +0,0 @@ -export type PathStep = string | number; -export type Path = readonly PathStep[]; From 0dfd7bbaf63282bef8d190a32e9c215bd8c2e496 Mon Sep 17 00:00:00 2001 From: streamich Date: Sat, 27 Apr 2024 13:32:09 +0200 Subject: [PATCH 33/37] =?UTF-8?q?docs:=20=E2=9C=8F=EF=B8=8F=20describe=20m?= =?UTF-8?q?emfs()=20helper=20in=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [skip ci] --- docs/node/usage.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/node/usage.md b/docs/node/usage.md index 3823a18e8..e9e49f5c0 100644 --- a/docs/node/usage.md +++ b/docs/node/usage.md @@ -39,6 +39,16 @@ vol.writeFileSync('/foo', 'bar'); expect(vol.toJSON()).toEqual({ '/foo': 'bar' }); ``` +Construct new `memfs` volumes: + +```js +import { memfs } from 'memfs'; + +const { fs, vol } = memfs({ '/foo': 'bar' }); + +fs.readFileSync('/foo', 'utf8'); // bar +``` + Create as many filesystem volumes as you need: ```js From 4619f164b987bb719febff772aa06d72a8a15418 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 27 Apr 2024 11:36:15 +0000 Subject: [PATCH 34/37] chore(release): 4.9.1 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## [4.9.1](https://github.com/streamich/memfs/compare/v4.9.0...v4.9.1) (2024-04-27) ### Bug Fixes * 🐛 use latest json-pack implementation ([de54ab5](https://github.com/streamich/memfs/commit/de54ab53a5df3b857975094ce4c59d760240a6d6)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42f482555..8875c4b5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [4.9.1](https://github.com/streamich/memfs/compare/v4.9.0...v4.9.1) (2024-04-27) + + +### Bug Fixes + +* 🐛 use latest json-pack implementation ([de54ab5](https://github.com/streamich/memfs/commit/de54ab53a5df3b857975094ce4c59d760240a6d6)) + # [4.9.0](https://github.com/streamich/memfs/compare/v4.8.2...v4.9.0) (2024-04-27) diff --git a/package.json b/package.json index 657952f8f..4f2b2e22a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "memfs", - "version": "4.9.0", + "version": "4.9.1", "description": "In-memory file-system with Node's fs API.", "keywords": [ "fs", From b198f40f0d8da0cb884195d2b6d356eabf988410 Mon Sep 17 00:00:00 2001 From: streamich Date: Sat, 27 Apr 2024 13:47:19 +0200 Subject: [PATCH 35/37] =?UTF-8?q?ci:=20=F0=9F=8E=A1=20add=20mirror=20to=20?= =?UTF-8?q?Gitlab=20workflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/mirror.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/mirror.yml diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml new file mode 100644 index 000000000..76fff0d85 --- /dev/null +++ b/.github/workflows/mirror.yml @@ -0,0 +1,22 @@ +name: Mirror + +on: + push: + branches: [master] + +jobs: + mirror: + name: Push To Gitlab + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Push To Gitlab + env: + token: ${{ secrets.GITLAB_TOKEN }} + run: | + git config user.name "streamich" + git config user.email "memfs@users.noreply.github.com" + git remote add mirror "https://oauth2:${token}@gitlab.com/streamich/memfs.git" + git push mirror master From 7a386170b64bbf1baa5dfdbf6dc3aae141ff8709 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 28 Apr 2024 12:47:54 +1200 Subject: [PATCH 36/37] chore(deps): update peaceiris/actions-gh-pages action to v4 (#1027) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/gh-pages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 78b9f1f32..73c2d77f0 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -22,7 +22,7 @@ jobs: - run: yarn coverage - run: yarn build:pages - name: Publish to gh-pages - uses: peaceiris/actions-gh-pages@v3 + uses: peaceiris/actions-gh-pages@v4 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./gh-pages From 9d9bd0159de763b032066d99358a099c0825e2d2 Mon Sep 17 00:00:00 2001 From: streamich Date: Mon, 29 Apr 2024 11:56:48 +0200 Subject: [PATCH 37/37] =?UTF-8?q?chore:=20=F0=9F=A4=96=20update=20build=20?= =?UTF-8?q?target=20and=20don't=20emit=20sourcemaps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BREAKING CHANGE: 🧨 Build target was bumped to ES2020 --- tsconfig.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 00dda587a..cdc066e93 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,12 @@ { "compilerOptions": { - "target": "es2017", + "target": "es2020", "lib": ["ES2017", "dom"], "module": "commonjs", "removeComments": false, "noImplicitAny": false, "strictNullChecks": true, - "sourceMap": true, + "sourceMap": false, "outDir": "lib", "declaration": true, "skipLibCheck": true,