From 463832cd4ca8e392c6126aa72c5b165b07c3797d Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Wed, 31 Aug 2022 18:23:37 +0800 Subject: [PATCH 001/171] Update CONTRIBUTING.md --- CONTRIBUTING.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c2bf5bc0..24747c1d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,3 @@ - ## Development The repository uses [Rush](https://rushjs.io/) for monorepo management. @@ -9,6 +8,15 @@ The repository uses [Rush](https://rushjs.io/) for monorepo management. $ npm i -g @microsoft/rush ``` +### Get code + +The build script only works inside of a Git repository, so, always use `git` to clone this repository. "Download ZIP" option in GitHub code menu or source code tarball in GitHub releases will NOT work. + +```sh +git clone https://github.com/yume-chan/ya-webadb.git +cd ya-webadb +``` + ### Install dependencies ```sh @@ -23,7 +31,7 @@ $ rush update $ rush build ``` -2. Watch and rebuild all libraries: +2. Watch changes and rebuild in all libraries: ```sh $ rush build:watch From d64bbe074d1c7745f66363db6311e9a2c21a01c3 Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Wed, 31 Aug 2022 18:24:08 +0800 Subject: [PATCH 002/171] Update CONTRIBUTING.md --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 24747c1d..bb98553f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,7 +10,7 @@ $ npm i -g @microsoft/rush ### Get code -The build script only works inside of a Git repository, so, always use `git` to clone this repository. "Download ZIP" option in GitHub code menu or source code tarball in GitHub releases will NOT work. +The build script only works inside Git repositories, so, always use `git` to clone this repository. "Download ZIP" option in GitHub code menu or source code tarball in GitHub releases will NOT work. ```sh git clone https://github.com/yume-chan/ya-webadb.git From da95d1d74b4050e02225a6c14e4a7231f140e2da Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Wed, 31 Aug 2022 18:25:04 +0800 Subject: [PATCH 003/171] Update CONTRIBUTING.md --- CONTRIBUTING.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bb98553f..62452727 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -25,26 +25,26 @@ $ rush update ### Everyday commands -1. Build all packages: +* Build all packages: ```sh $ rush build ``` -2. Watch changes and rebuild in all libraries: +* Watch changes and rebuild in all libraries: ```sh $ rush build:watch ``` -3. Start demo dev-server: +* Start demo's dev-server: ```sh $ cd apps/demo $ npm run dev ``` -Usually you need two terminals to run both 2 and 3. +Usually you need two terminals to run both 2 and 3 for testing your changes. ## FAQ From 1306ee9b34f9fcdb7a66d23d9a81e5d5f1970c50 Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Thu, 15 Sep 2022 15:08:23 +0800 Subject: [PATCH 004/171] Update CONTRIBUTING.md --- CONTRIBUTING.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 62452727..57804363 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -46,6 +46,21 @@ $ rush update Usually you need two terminals to run both 2 and 3 for testing your changes. +## Deploy Demo + +The demo is built with [Next.js](https://nextjs.org/), which is a full-stack React framework, usually requires a Node.js environment to run. + +However, since the demo doesn't have any server-side code, the most simple deployment method is to use the [Static HTML Export](https://nextjs.org/docs/advanced-features/static-html-export) feature of Next.js, which generates pre-rendered, fully static HTML files, that can be deployed to any static website hosting services (e.g. GitHub Pages). + +To export static deployable HTML files, after running `rush build` command, run: + +```sh +cd apps/demo +npx next export +``` + +This creates an `out` folder, which contains the exported HTML files and all the resources. + ## FAQ ### 1. WebUSB and File downloading doesn't when developing/self-host? From c9000c5bebf9317be00056fdd80acc4acfe048a0 Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Thu, 15 Sep 2022 23:13:52 +0800 Subject: [PATCH 005/171] Update CONTRIBUTING.md --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 57804363..b1852ce3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -48,9 +48,9 @@ Usually you need two terminals to run both 2 and 3 for testing your changes. ## Deploy Demo -The demo is built with [Next.js](https://nextjs.org/), which is a full-stack React framework, usually requires a Node.js environment to run. +The demo is built with [Next.js](https://nextjs.org/), a full-stack React framework, which usually requires a Node.js environment to run. -However, since the demo doesn't have any server-side code, the most simple deployment method is to use the [Static HTML Export](https://nextjs.org/docs/advanced-features/static-html-export) feature of Next.js, which generates pre-rendered, fully static HTML files, that can be deployed to any static website hosting services (e.g. GitHub Pages). +However, since the demo doesn't have any server-side code, the most simple deployment method is to use the [Static HTML Export](https://nextjs.org/docs/advanced-features/static-html-export) feature of Next.js. It generates pre-rendered, fully static HTML files, that can be deployed to any static website hosting services (e.g. GitHub Pages). To export static deployable HTML files, after running `rush build` command, run: @@ -59,7 +59,7 @@ cd apps/demo npx next export ``` -This creates an `out` folder, which contains the exported HTML files and all the resources. +This will create an `out` folder containing exported HTML files and all required resource files. ## FAQ From 1486eed3cfe2ce26042dddaee4fae2e8ae0123dd Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Fri, 7 Oct 2022 20:33:11 +0800 Subject: [PATCH 006/171] refactor(adb): simplify reading sync responses --- libraries/adb/src/adb.ts | 14 ++-- libraries/adb/src/commands/framebuffer.ts | 30 ++++---- libraries/adb/src/commands/install.ts | 1 + libraries/adb/src/commands/reverse.ts | 10 +-- .../src/commands/subprocess/protocols/none.ts | 6 +- .../commands/subprocess/protocols/shell.ts | 6 +- .../commands/subprocess/protocols/types.ts | 6 +- libraries/adb/src/commands/sync/list.ts | 63 ++++------------ libraries/adb/src/commands/sync/pull.ts | 30 ++++---- libraries/adb/src/commands/sync/push.ts | 6 +- libraries/adb/src/commands/sync/response.ts | 75 ++++++++++--------- libraries/adb/src/commands/sync/stat.ts | 50 ++++--------- libraries/adb/src/commands/sync/sync.ts | 8 +- libraries/adb/src/crypto.ts | 2 +- libraries/adb/src/socket/dispatcher.ts | 9 ++- libraries/adb/src/socket/socket.ts | 2 +- libraries/adb/src/utils/base64.ts | 23 ++++++ libraries/struct/src/basic/stream.ts | 2 + 18 files changed, 162 insertions(+), 181 deletions(-) diff --git a/libraries/adb/src/adb.ts b/libraries/adb/src/adb.ts index 673f65eb..f781fb38 100644 --- a/libraries/adb/src/adb.ts +++ b/libraries/adb/src/adb.ts @@ -63,6 +63,7 @@ export class Adb implements Closeable { } } }), { + // Don't cancel the source ReadableStream on AbortSignal abort. preventCancel: true, signal: abortController.signal, }) @@ -146,7 +147,7 @@ export class Adb implements Closeable { private _device: string | undefined; public get device() { return this._device; } - private _features: AdbFeatures[] | undefined; + private _features: AdbFeatures[] = []; public get features() { return this._features; } public readonly subprocess: AdbSubprocess; @@ -190,8 +191,6 @@ export class Adb implements Closeable { } private parseBanner(banner: string): void { - this._features = []; - const pieces = banner.split('::'); if (pieces.length > 1) { const props = pieces[1]!; @@ -224,8 +223,13 @@ export class Adb implements Closeable { } } - public addIncomingSocketHandler(handler: AdbIncomingSocketHandler) { - return this.dispatcher.addIncomingSocketHandler(handler); + /** + * Add a handler for incoming socket. + * @param handler A function to call with new incoming sockets. It must return `true` if it accepts the socket. + * @returns A function to remove the handler. + */ + public onIncomingSocket(handler: AdbIncomingSocketHandler) { + return this.dispatcher.onIncomingSocket(handler); } public async createSocket(service: string): Promise { diff --git a/libraries/adb/src/commands/framebuffer.ts b/libraries/adb/src/commands/framebuffer.ts index ab312d36..b9a20b54 100644 --- a/libraries/adb/src/commands/framebuffer.ts +++ b/libraries/adb/src/commands/framebuffer.ts @@ -7,19 +7,6 @@ const Version = new Struct({ littleEndian: true }) .uint32('version'); -/* - * ADB uses 8 int32 fields to describe bit depths - * The only combination I have seen is RGBA8888, which is - * red_offset: 0 - * red_length: 8 - * blue_offset: 16 - * blue_length: 8 - * green_offset: 8 - * green_length: 8 - * alpha_offset: 24 - * alpha_length: 8 - */ - export const AdbFrameBufferV1 = new Struct({ littleEndian: true }) .uint32('bpp') @@ -57,6 +44,22 @@ export const AdbFrameBufferV2 = export type AdbFrameBufferV2 = typeof AdbFrameBufferV2['TDeserializeResult']; +/** + * ADB uses 8 int32 fields to describe bit depths + * + * The only combination I have seen is RGBA8888, which is + * + * red_offset: 0 + * red_length: 8 + * blue_offset: 16 + * blue_length: 8 + * green_offset: 8 + * green_length: 8 + * alpha_offset: 24 + * alpha_length: 8 + * + * But it doesn't mean that other combinations are not possible. + */ export type AdbFrameBuffer = AdbFrameBufferV1 | AdbFrameBufferV2; export async function framebuffer(adb: Adb): Promise { @@ -65,6 +68,7 @@ export async function framebuffer(adb: Adb): Promise { const { version } = await Version.deserialize(stream); switch (version) { case 1: + // TODO: AdbFrameBuffer: does all v1 responses uses the same color space? Add it so the command returns same format for all versions. return AdbFrameBufferV1.deserialize(stream); case 2: return AdbFrameBufferV2.deserialize(stream); diff --git a/libraries/adb/src/commands/install.ts b/libraries/adb/src/commands/install.ts index 1a4d43d7..d6f9b3ab 100644 --- a/libraries/adb/src/commands/install.ts +++ b/libraries/adb/src/commands/install.ts @@ -13,6 +13,7 @@ export function install( return new WrapWritableStream({ async start() { // TODO: install: support other install apk methods (streaming, etc.) + // TODO: install: support split apk formats (`adb install-multiple`) // Upload apk file to tmp folder sync = await adb.sync(); diff --git a/libraries/adb/src/commands/reverse.ts b/libraries/adb/src/commands/reverse.ts index d34e2675..4bef1434 100644 --- a/libraries/adb/src/commands/reverse.ts +++ b/libraries/adb/src/commands/reverse.ts @@ -41,7 +41,7 @@ export class AdbReverseCommand extends AutoDisposable { super(); this.adb = adb; - this.addDisposable(this.adb.addIncomingSocketHandler(this.handleIncomingSocket)); + this.addDisposable(this.adb.onIncomingSocket(this.handleIncomingSocket)); } protected handleIncomingSocket = async (socket: AdbSocket) => { @@ -80,8 +80,8 @@ export class AdbReverseCommand extends AutoDisposable { /** * @param deviceAddress The address adbd on device is listening on. Can be `tcp:0` to let adbd choose an available TCP port by itself. * @param localAddress Native ADB client will open a connection to this address when reverse connection received. In WebADB, it's only used to uniquely identify a reverse tunnel registry, `handler` will be called to handle the connection. - * @param handler A callback to handle incoming connections - * @returns If `deviceAddress` is `tcp:0`, return `tcp:{ACTUAL_LISTENING_PORT}`; otherwise, return `deviceAddress`. + * @param handler A callback to handle incoming connections. It must return `true` if it accepts the connection. + * @returns `tcp:{ACTUAL_LISTENING_PORT}`, If `deviceAddress` is `tcp:0`; otherwise, `deviceAddress`. */ public async add( deviceAddress: string, @@ -91,7 +91,7 @@ export class AdbReverseCommand extends AutoDisposable { const stream = await this.sendRequest(`reverse:forward:${deviceAddress};${localAddress}`); // `tcp:0` tells the device to pick an available port. - // Begin with Android 8, device will respond with the selected port for all `tcp:` requests. + // On Android >=8, device will respond with the selected port for all `tcp:` requests. if (deviceAddress.startsWith('tcp:')) { let length: number | undefined; try { @@ -101,7 +101,7 @@ export class AdbReverseCommand extends AutoDisposable { throw e; } - // Device before Android 8 doesn't have this response. + // Android <8 doesn't have this response. // (the stream is closed now) // Can be safely ignored. } diff --git a/libraries/adb/src/commands/subprocess/protocols/none.ts b/libraries/adb/src/commands/subprocess/protocols/none.ts index 10f70040..26eea50d 100644 --- a/libraries/adb/src/commands/subprocess/protocols/none.ts +++ b/libraries/adb/src/commands/subprocess/protocols/none.ts @@ -21,7 +21,7 @@ export class AdbSubprocessNoneProtocol implements AdbSubprocessProtocol { public static async raw(adb: Adb, command: string) { // `shell,raw:${command}` also triggers raw mode, - // But is not supported before Android 7. + // But is not supported on Android version <7. return new AdbSubprocessNoneProtocol(await adb.createSocket(`exec:${command}`)); } @@ -50,6 +50,8 @@ export class AdbSubprocessNoneProtocol implements AdbSubprocessProtocol { public constructor(socket: AdbSocket) { this.socket = socket; + // Link `stdout`, `stderr` and `stdin` together, + // so closing any of them will close the others. this.duplex = new DuplexStreamFactory({ close: async () => { await this.socket.close(); @@ -62,7 +64,7 @@ export class AdbSubprocessNoneProtocol implements AdbSubprocessProtocol { } public resize() { - // Not supported + // Not supported, but don't throw. } public kill() { diff --git a/libraries/adb/src/commands/subprocess/protocols/shell.ts b/libraries/adb/src/commands/subprocess/protocols/shell.ts index a3f7053f..15347d6c 100644 --- a/libraries/adb/src/commands/subprocess/protocols/shell.ts +++ b/libraries/adb/src/commands/subprocess/protocols/shell.ts @@ -1,5 +1,5 @@ import { PromiseResolver } from '@yume-chan/async'; -import { pipeFrom, PushReadableStream, StructDeserializeStream, StructSerializeStream, TransformStream, WritableStream, type WritableStreamDefaultWriter, type PushReadableStreamController, type ReadableStream } from '@yume-chan/stream-extra'; +import { pipeFrom, PushReadableStream, StructDeserializeStream, StructSerializeStream, TransformStream, WritableStream, type PushReadableStreamController, type ReadableStream, type WritableStreamDefaultWriter } from '@yume-chan/stream-extra'; import Struct, { placeholder, type StructValueType } from '@yume-chan/struct'; import type { Adb } from '../../../adb.js'; @@ -103,7 +103,7 @@ class MultiplexStream{ */ export class AdbSubprocessShellProtocol implements AdbSubprocessProtocol { public static isSupported(adb: Adb) { - return adb.features!.includes(AdbFeatures.ShellV2); + return adb.features.includes(AdbFeatures.ShellV2); } public static async pty(adb: Adb, command: string) { @@ -179,7 +179,7 @@ export class AdbSubprocessShellProtocol implements AdbSubprocessProtocol { data: encodeUtf8( // The "correct" format is `${rows}x${cols},${x_pixels}x${y_pixels}` // However, according to https://linux.die.net/man/4/tty_ioctl - // `x_pixels` and `y_pixels` are not used, so always passing `0` is fine. + // `x_pixels` and `y_pixels` are unused, so always sending `0` should be fine. `${rows}x${cols},0x0\0` ), }); diff --git a/libraries/adb/src/commands/subprocess/protocols/types.ts b/libraries/adb/src/commands/subprocess/protocols/types.ts index 83a4a8e5..61c65691 100644 --- a/libraries/adb/src/commands/subprocess/protocols/types.ts +++ b/libraries/adb/src/commands/subprocess/protocols/types.ts @@ -6,17 +6,17 @@ import type { AdbSocket } from '../../../socket/index.js'; export interface AdbSubprocessProtocol { /** - * A WritableStream that writes to the `stdin` pipe. + * A WritableStream that writes to the `stdin` stream. */ readonly stdin: WritableStream; /** - * The `stdout` pipe of the process. + * The `stdout` stream of the process. */ readonly stdout: ReadableStream; /** - * The `stderr` pipe of the process. + * The `stderr` stream of the process. * * Note: Some `AdbSubprocessProtocol` doesn't separate `stdout` and `stderr`, * All output will be sent to `stdout`. diff --git a/libraries/adb/src/commands/sync/list.ts b/libraries/adb/src/commands/sync/list.ts index 244f1a0c..6061784d 100644 --- a/libraries/adb/src/commands/sync/list.ts +++ b/libraries/adb/src/commands/sync/list.ts @@ -2,7 +2,7 @@ import type { BufferedReadableStream, WritableStreamDefaultWriter } from '@yume- import Struct from '@yume-chan/struct'; import { AdbSyncRequestId, adbSyncWriteRequest } from './request.js'; -import { AdbSyncDoneResponse, adbSyncReadResponse, AdbSyncResponseId } from './response.js'; +import { adbSyncReadResponses, AdbSyncResponseId } from './response.js'; import { AdbSyncLstatResponse, AdbSyncStatResponse, type AdbSyncStat } from './stat.js'; export interface AdbSyncEntry extends AdbSyncStat { @@ -27,61 +27,28 @@ export const AdbSyncEntry2Response = export type AdbSyncEntry2Response = typeof AdbSyncEntry2Response['TDeserializeResult']; -const LIST_V1_RESPONSE_TYPES = { - [AdbSyncResponseId.Entry]: AdbSyncEntryResponse, - [AdbSyncResponseId.Done]: new AdbSyncDoneResponse(AdbSyncEntryResponse.size), -}; - -const LIST_V2_RESPONSE_TYPES = { - [AdbSyncResponseId.Entry2]: AdbSyncEntry2Response, - [AdbSyncResponseId.Done]: new AdbSyncDoneResponse(AdbSyncEntry2Response.size), -}; - export async function* adbSyncOpenDir( stream: BufferedReadableStream, writer: WritableStreamDefaultWriter, path: string, v2: boolean, ): AsyncGenerator { - let requestId: AdbSyncRequestId.List | AdbSyncRequestId.List2; - let responseTypes: typeof LIST_V1_RESPONSE_TYPES | typeof LIST_V2_RESPONSE_TYPES; - if (v2) { - requestId = AdbSyncRequestId.List2; - responseTypes = LIST_V2_RESPONSE_TYPES; + await adbSyncWriteRequest(writer, AdbSyncRequestId.List2, path); + yield* adbSyncReadResponses(stream, AdbSyncResponseId.Entry2, AdbSyncEntry2Response); } else { - requestId = AdbSyncRequestId.List; - responseTypes = LIST_V1_RESPONSE_TYPES; - } - - await adbSyncWriteRequest(writer, requestId, path); - - while (true) { - const response = await adbSyncReadResponse(stream, responseTypes); - switch (response.id) { - case AdbSyncResponseId.Entry: - yield { - mode: response.mode, - size: BigInt(response.size), - mtime: BigInt(response.mtime), - get type() { return response.type; }, - get permission() { return response.permission; }, - name: response.name, - }; - break; - case AdbSyncResponseId.Entry2: - // `LST2` can return error codes for failed `lstat` calls. - // `LIST` just ignores them. - // But they only contain `name` so still pretty useless. - if (response.error !== 0) { - continue; - } - yield response; - break; - case AdbSyncResponseId.Done: - return; - default: - throw new Error('Unexpected response id'); + await adbSyncWriteRequest(writer, AdbSyncRequestId.List, path); + for await (const item of adbSyncReadResponses(stream, AdbSyncResponseId.Entry, AdbSyncEntryResponse)) { + // Convert to same format as `AdbSyncEntry2Response` for easier consumption. + // However it will add some overhead. + yield { + mode: item.mode, + size: BigInt(item.size), + mtime: BigInt(item.mtime), + get type() { return item.type; }, + get permission() { return item.permission; }, + name: item.name, + }; } } } diff --git a/libraries/adb/src/commands/sync/pull.ts b/libraries/adb/src/commands/sync/pull.ts index 3ac1a622..13c8bf1b 100644 --- a/libraries/adb/src/commands/sync/pull.ts +++ b/libraries/adb/src/commands/sync/pull.ts @@ -2,7 +2,7 @@ import { BufferedReadableStream, ReadableStream, WritableStreamDefaultWriter } f import Struct from '@yume-chan/struct'; import { AdbSyncRequestId, adbSyncWriteRequest } from './request.js'; -import { AdbSyncDoneResponse, adbSyncReadResponse, AdbSyncResponseId } from './response.js'; +import { adbSyncReadResponses, AdbSyncResponseId } from './response.js'; export const AdbSyncDataResponse = new Struct({ littleEndian: true }) @@ -10,35 +10,33 @@ export const AdbSyncDataResponse = .uint8Array('data', { lengthField: 'dataLength' }) .extra({ id: AdbSyncResponseId.Data as const }); -const RESPONSE_TYPES = { - [AdbSyncResponseId.Data]: AdbSyncDataResponse, - [AdbSyncResponseId.Done]: new AdbSyncDoneResponse(AdbSyncDataResponse.size), -}; +export type AdbSyncDataResponse = typeof AdbSyncDataResponse['TDeserializeResult']; export function adbSyncPull( stream: BufferedReadableStream, writer: WritableStreamDefaultWriter, path: string, ): ReadableStream { + let generator!: AsyncGenerator; return new ReadableStream({ async start() { + // TODO: If `ReadableStream.from(AsyncGenerator)` is added to spec, use it instead. await adbSyncWriteRequest(writer, AdbSyncRequestId.Receive, path); + generator = adbSyncReadResponses(stream, AdbSyncResponseId.Data, AdbSyncDataResponse); }, async pull(controller) { - const response = await adbSyncReadResponse(stream, RESPONSE_TYPES); - switch (response.id) { - case AdbSyncResponseId.Data: - controller.enqueue(response.data!); - break; - case AdbSyncResponseId.Done: - controller.close(); - break; - default: - throw new Error('Unexpected response id'); + const { done, value } = await generator.next(); + if (done) { + controller.close(); + return; } + controller.enqueue(value.data); }, cancel() { - throw new Error(`Sync commands don't support cancel.`); + try { + generator.return(); + } catch { } + throw new Error(`Sync commands can't be canceled.`); }, }, { highWaterMark: 16 * 1024, diff --git a/libraries/adb/src/commands/sync/push.ts b/libraries/adb/src/commands/sync/push.ts index aeeebe5c..335ad4da 100644 --- a/libraries/adb/src/commands/sync/push.ts +++ b/libraries/adb/src/commands/sync/push.ts @@ -9,10 +9,6 @@ export const AdbSyncOkResponse = new Struct({ littleEndian: true }) .uint32('unused'); -const ResponseTypes = { - [AdbSyncResponseId.Ok]: AdbSyncOkResponse, -}; - export const ADB_SYNC_MAX_PACKET_SIZE = 64 * 1024; export function adbSyncPush( @@ -34,7 +30,7 @@ export function adbSyncPush( }, async close() { await adbSyncWriteRequest(writer, AdbSyncRequestId.Done, mtime); - await adbSyncReadResponse(stream, ResponseTypes); + await adbSyncReadResponse(stream, AdbSyncResponseId.Ok, AdbSyncOkResponse); }, }), new ChunkStream(packetSize) diff --git a/libraries/adb/src/commands/sync/response.ts b/libraries/adb/src/commands/sync/response.ts index 52b4fec8..8e7b7900 100644 --- a/libraries/adb/src/commands/sync/response.ts +++ b/libraries/adb/src/commands/sync/response.ts @@ -1,5 +1,5 @@ import type { BufferedReadableStream } from '@yume-chan/stream-extra'; -import Struct, { type StructAsyncDeserializeStream, type StructLike, type StructValueType } from '@yume-chan/struct'; +import Struct, { StructValueType, type StructLike } from '@yume-chan/struct'; import { decodeUtf8 } from '../../utils/index.js'; @@ -15,25 +15,6 @@ export enum AdbSyncResponseId { Fail = 'FAIL', } -// DONE responses' size are always same as the request's normal response. -// For example DONE responses for LIST requests are 16 bytes (same as DENT responses), -// but DONE responses for STAT requests are 12 bytes (same as STAT responses) -// So we need to know responses' size in advance. -export class AdbSyncDoneResponse implements StructLike { - private length: number; - - public readonly id = AdbSyncResponseId.Done; - - public constructor(length: number) { - this.length = length; - } - - public async deserialize(stream: StructAsyncDeserializeStream): Promise { - await stream.read(this.length); - return this; - } -} - export const AdbSyncFailResponse = new Struct({ littleEndian: true }) .uint32('messageLength') @@ -42,24 +23,46 @@ export const AdbSyncFailResponse = throw new Error(object.message); }); -export async function adbSyncReadResponse>>( +export async function adbSyncReadResponse( stream: BufferedReadableStream, - types: T, - // When `T` is a union type, `T[keyof T]` only includes their common keys. - // For example, let `type T = { a: string, b: string } | { a: string, c: string}`, - // `keyof T` is `'a'`, not `'a' | 'b' | 'c'`. - // However, `T extends unknown ? keyof T : never` will distribute `T`, - // so returns all keys. -): Promise> { - const id = decodeUtf8(await stream.read(4)); - - if (id === AdbSyncResponseId.Fail) { - await AdbSyncFailResponse.deserialize(stream); + id: AdbSyncResponseId, + type: StructLike, +): Promise { + const actualId = decodeUtf8(await stream.read(4)); + switch (actualId) { + case AdbSyncResponseId.Fail: + await AdbSyncFailResponse.deserialize(stream); + throw new Error('Unreachable'); + case id: + return await type.deserialize(stream); + default: + throw new Error(`Expected '${id}', but got '${actualId}'`); } +} - if (types[id]) { - return types[id]!.deserialize(stream); +export async function* adbSyncReadResponses>( + stream: BufferedReadableStream, + id: AdbSyncResponseId, + type: T, +): AsyncGenerator, void, void> { + while (true) { + const actualId = decodeUtf8(await stream.read(4)); + switch (actualId) { + case AdbSyncResponseId.Fail: + await AdbSyncFailResponse.deserialize(stream); + throw new Error('Unreachable'); + case AdbSyncResponseId.Done: + // `DONE` responses' size are always same as the request's normal response. + // + // For example, `DONE` responses for `LIST` requests are 16 bytes (same as `DENT` responses), + // but `DONE` responses for `STAT` requests are 12 bytes (same as `STAT` responses). + await stream.read(type.size); + return; + case id: + yield await type.deserialize(stream); + break; + default: + throw new Error(`Expected '${id}' or '${AdbSyncResponseId.Done}', but got '${actualId}'`); + } } - - throw new Error(`Expected '${Object.keys(types).join(', ')}', but got '${id}'`); } diff --git a/libraries/adb/src/commands/sync/stat.ts b/libraries/adb/src/commands/sync/stat.ts index b0aef66b..88f93e62 100644 --- a/libraries/adb/src/commands/sync/stat.ts +++ b/libraries/adb/src/commands/sync/stat.ts @@ -96,50 +96,26 @@ export const AdbSyncStatResponse = export type AdbSyncStatResponse = typeof AdbSyncStatResponse['TDeserializeResult']; -const STAT_RESPONSE_TYPES = { - [AdbSyncResponseId.Stat]: AdbSyncStatResponse, -}; - -const LSTAT_RESPONSE_TYPES = { - [AdbSyncResponseId.Lstat]: AdbSyncLstatResponse, -}; - -const LSTAT_V2_RESPONSE_TYPES = { - [AdbSyncResponseId.Lstat2]: AdbSyncStatResponse, -}; - export async function adbSyncLstat( stream: BufferedReadableStream, writer: WritableStreamDefaultWriter, path: string, v2: boolean, ): Promise { - let requestId: AdbSyncRequestId.Lstat | AdbSyncRequestId.Lstat2; - let responseTypes: typeof LSTAT_RESPONSE_TYPES | typeof LSTAT_V2_RESPONSE_TYPES; - if (v2) { - requestId = AdbSyncRequestId.Lstat2; - responseTypes = LSTAT_V2_RESPONSE_TYPES; + await adbSyncWriteRequest(writer, AdbSyncRequestId.Lstat2, path); + return await adbSyncReadResponse(stream, AdbSyncResponseId.Lstat2, AdbSyncStatResponse); } else { - requestId = AdbSyncRequestId.Lstat; - responseTypes = LSTAT_RESPONSE_TYPES; - } - - await adbSyncWriteRequest(writer, requestId, path); - const response = await adbSyncReadResponse(stream, responseTypes); - - switch (response.id) { - case AdbSyncResponseId.Lstat: - return { - mode: response.mode, - // Convert to `BigInt` to make it compatible with `AdbSyncStatResponse` - size: BigInt(response.size), - mtime: BigInt(response.mtime), - get type() { return response.type; }, - get permission() { return response.permission; }, - }; - default: - return response; + await adbSyncWriteRequest(writer, AdbSyncRequestId.Lstat, path); + const response = await adbSyncReadResponse(stream, AdbSyncResponseId.Lstat, AdbSyncLstatResponse); + return { + mode: response.mode, + // Convert to `BigInt` to make it compatible with `AdbSyncStatResponse` + size: BigInt(response.size), + mtime: BigInt(response.mtime), + get type() { return response.type; }, + get permission() { return response.permission; }, + }; } } @@ -149,5 +125,5 @@ export async function adbSyncStat( path: string, ): Promise { await adbSyncWriteRequest(writer, AdbSyncRequestId.Stat, path); - return await adbSyncReadResponse(stream, STAT_RESPONSE_TYPES); + return await adbSyncReadResponse(stream, AdbSyncResponseId.Stat, AdbSyncStatResponse); } diff --git a/libraries/adb/src/commands/sync/sync.ts b/libraries/adb/src/commands/sync/sync.ts index 8979dab5..bf52810b 100644 --- a/libraries/adb/src/commands/sync/sync.ts +++ b/libraries/adb/src/commands/sync/sync.ts @@ -38,20 +38,20 @@ export class AdbSync extends AutoDisposable { protected sendLock = this.addDisposable(new AutoResetEvent()); public get supportsStat(): boolean { - return this.adb.features!.includes(AdbFeatures.StatV2); + return this.adb.features.includes(AdbFeatures.StatV2); } public get supportsList2(): boolean { - return this.adb.features!.includes(AdbFeatures.ListV2); + return this.adb.features.includes(AdbFeatures.ListV2); } public get fixedPushMkdir(): boolean { - return this.adb.features!.includes(AdbFeatures.FixedPushMkdir); + return this.adb.features.includes(AdbFeatures.FixedPushMkdir); } public get needPushMkdirWorkaround(): boolean { // https://android.googlesource.com/platform/packages/modules/adb/+/91768a57b7138166e0a3d11f79cd55909dda7014/client/file_sync_client.cpp#1361 - return this.adb.features!.includes(AdbFeatures.ShellV2) && !this.fixedPushMkdir; + return this.adb.features.includes(AdbFeatures.ShellV2) && !this.fixedPushMkdir; } public constructor(adb: Adb, socket: AdbSocket) { diff --git a/libraries/adb/src/crypto.ts b/libraries/adb/src/crypto.ts index 9b8d594e..f61a0d43 100644 --- a/libraries/adb/src/crypto.ts +++ b/libraries/adb/src/crypto.ts @@ -96,7 +96,7 @@ export function parsePrivateKey(key: Uint8Array): [n: bigint, d: bigint] { // Taken from https://stackoverflow.com/a/51562038 // I can't understand, but it does work -// Only used with numbers less than 2^32 so doesn't need BigInt +// Only used with numbers smaller than 2^32 so doesn't need BigInt export function modInverse(a: number, m: number) { a = (a % m + m) % m; if (!a || m < 2) { diff --git a/libraries/adb/src/socket/dispatcher.ts b/libraries/adb/src/socket/dispatcher.ts index 6c615b60..bab6394f 100644 --- a/libraries/adb/src/socket/dispatcher.ts +++ b/libraries/adb/src/socket/dispatcher.ts @@ -168,7 +168,12 @@ export class AdbPacketDispatcher implements Closeable { // the device may also respond with two `CLSE` packets. } - public addIncomingSocketHandler(handler: AdbIncomingSocketHandler): RemoveEventListener { + /** + * Add a handler for incoming socket. + * @param handler A function to call with new incoming sockets. It must return `true` if it accepts the socket. + * @returns A function to remove the handler. + */ + public onIncomingSocket(handler: AdbIncomingSocketHandler): RemoveEventListener { this._incomingSocketHandlers.add(handler); const remove = () => { this._incomingSocketHandlers.delete(handler); @@ -178,7 +183,7 @@ export class AdbPacketDispatcher implements Closeable { } private async handleOpen(packet: AdbPacketData) { - // AsyncOperationManager doesn't support get and skip an ID + // `AsyncOperationManager` doesn't support skipping IDs // Use `add` + `resolve` to simulate this behavior const [localId] = this.initializers.add(); this.initializers.resolve(localId, undefined); diff --git a/libraries/adb/src/socket/socket.ts b/libraries/adb/src/socket/socket.ts index 79c2cce6..0f77af24 100644 --- a/libraries/adb/src/socket/socket.ts +++ b/libraries/adb/src/socket/socket.ts @@ -128,7 +128,7 @@ export class AdbSocketController implements AdbSocketInfo, ReadableWritablePair< } /** - * AdbSocket is a duplex stream. + * A duplex stream representing a socket to ADB daemon. * * To close it, call either `socket.close()`, * `socket.readable.cancel()`, `socket.readable.getReader().cancel()`, diff --git a/libraries/adb/src/utils/base64.ts b/libraries/adb/src/utils/base64.ts index e0de34f6..226b53c3 100644 --- a/libraries/adb/src/utils/base64.ts +++ b/libraries/adb/src/utils/base64.ts @@ -19,15 +19,38 @@ addRange('0', '9'); addRange('+', '+'); addRange('/', '/'); +/** + * Calculate the required length of the output buffer for the given input length. + * + * @param inputLength Length of the input in bytes + * @returns Length of the output in bytes + */ export function calculateBase64EncodedLength(inputLength: number): [outputLength: number, paddingLength: number] { const remainder = inputLength % 3; const paddingLength = remainder !== 0 ? 3 - remainder : 0; return [(inputLength + paddingLength) / 3 * 4, paddingLength]; } +/** + * Encode the given input buffer into base64. + * + * @param input The input buffer + * @returns The encoded output buffer + */ export function encodeBase64( input: Uint8Array, ): Uint8Array; +/** + * Encode the given input into base64 and write it to the output buffer. + * + * The output buffer must be at least as long as the value returned by `calculateBase64EncodedLength`. + * It can points to the same buffer as the input, as long as `output.offset <= input.offset - input.length / 3`, + * or `output.offset >= input.offset - 1` + * + * @param input The input buffer + * @param output The output buffer + * @returns The number of bytes written to the output buffer + */ export function encodeBase64( input: Uint8Array, output: Uint8Array, diff --git a/libraries/struct/src/basic/stream.ts b/libraries/struct/src/basic/stream.ts index dc66a7b0..4713bd5c 100644 --- a/libraries/struct/src/basic/stream.ts +++ b/libraries/struct/src/basic/stream.ts @@ -1,5 +1,7 @@ import type { ValueOrPromise } from "../utils.js"; +// TODO: allow over reading (returning a `Uint8Array`, an `offset` and a `length`) to avoid copying + export interface StructDeserializeStream { /** * Read data from the underlying data source. From b157c686d81907cb802e20563b4506d96f815583 Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Tue, 18 Oct 2022 17:46:19 +0800 Subject: [PATCH 007/171] v0.0.17 --- apps/demo/package.json | 20 +++++++++---------- ...-scrcpy-separate-adb_2022-06-25-16-58.json | 10 ---------- .../main_2022-07-19-08-39.json | 10 ---------- ...-scrcpy-separate-adb_2022-06-25-16-58.json | 10 ---------- .../main_2022-07-19-08-39.json | 10 ---------- ...-scrcpy-separate-adb_2022-06-25-16-58.json | 10 ---------- .../@yume-chan/adb/main_2022-07-19-08-39.json | 10 ---------- ...-scrcpy-separate-adb_2022-06-25-16-58.json | 10 ---------- .../android-bin/main_2022-07-19-08-39.json | 10 ---------- ...-scrcpy-separate-adb_2022-06-25-16-58.json | 10 ---------- .../main_2022-07-19-08-39.json | 10 ---------- ...-scrcpy-separate-adb_2022-06-25-16-58.json | 10 ---------- .../event/main_2022-07-19-08-39.json | 10 ---------- .../main_2022-07-19-08-39.json | 10 ---------- .../main_2022-07-19-08-39.json | 10 ---------- ...-scrcpy-separate-adb_2022-06-25-16-58.json | 10 ---------- .../scrcpy/main_2022-07-19-08-39.json | 10 ---------- ...-scrcpy-separate-adb_2022-06-25-16-58.json | 10 ---------- .../stream-extra/main_2022-07-19-08-39.json | 10 ---------- ...-scrcpy-separate-adb_2022-06-25-16-58.json | 10 ---------- .../struct/main_2022-07-19-08-39.json | 10 ---------- common/config/rush/version-policies.json | 2 +- .../adb-backend-direct-sockets/package.json | 4 ++-- libraries/adb-backend-webusb/CHANGELOG.json | 12 +++++++++++ libraries/adb-backend-webusb/CHANGELOG.md | 9 ++++++++- libraries/adb-backend-webusb/package.json | 8 ++++---- libraries/adb-backend-ws/package.json | 4 ++-- libraries/adb-credential-web/CHANGELOG.json | 12 +++++++++++ libraries/adb-credential-web/CHANGELOG.md | 9 ++++++++- libraries/adb-credential-web/package.json | 4 ++-- libraries/adb/CHANGELOG.json | 12 +++++++++++ libraries/adb/CHANGELOG.md | 9 ++++++++- libraries/adb/package.json | 10 +++++----- libraries/android-bin/CHANGELOG.json | 12 +++++++++++ libraries/android-bin/CHANGELOG.md | 9 ++++++++- libraries/android-bin/package.json | 8 ++++---- .../dataview-bigint-polyfill/CHANGELOG.json | 6 ++++++ .../dataview-bigint-polyfill/CHANGELOG.md | 7 ++++++- .../dataview-bigint-polyfill/package.json | 2 +- libraries/event/CHANGELOG.json | 6 ++++++ libraries/event/CHANGELOG.md | 7 ++++++- libraries/event/package.json | 2 +- .../scrcpy-decoder-tinyh264/CHANGELOG.json | 17 ++++++++++++++++ .../scrcpy-decoder-tinyh264/CHANGELOG.md | 11 ++++++++++ .../scrcpy-decoder-tinyh264/package.json | 8 ++++---- .../scrcpy-decoder-webcodecs/CHANGELOG.json | 17 ++++++++++++++++ .../scrcpy-decoder-webcodecs/CHANGELOG.md | 11 ++++++++++ .../scrcpy-decoder-webcodecs/package.json | 6 +++--- libraries/scrcpy/CHANGELOG.json | 15 ++++++++++++++ libraries/scrcpy/CHANGELOG.md | 10 +++++++++- libraries/scrcpy/package.json | 10 +++++----- libraries/stream-extra/CHANGELOG.json | 11 ++++++++++ libraries/stream-extra/CHANGELOG.md | 9 +++++++++ libraries/stream-extra/package.json | 4 ++-- libraries/struct/CHANGELOG.json | 6 ++++++ libraries/struct/CHANGELOG.md | 7 ++++++- libraries/struct/package.json | 4 ++-- 57 files changed, 264 insertions(+), 256 deletions(-) delete mode 100644 common/changes/@yume-chan/adb-backend-webusb/feat-scrcpy-separate-adb_2022-06-25-16-58.json delete mode 100644 common/changes/@yume-chan/adb-backend-webusb/main_2022-07-19-08-39.json delete mode 100644 common/changes/@yume-chan/adb-credential-web/feat-scrcpy-separate-adb_2022-06-25-16-58.json delete mode 100644 common/changes/@yume-chan/adb-credential-web/main_2022-07-19-08-39.json delete mode 100644 common/changes/@yume-chan/adb/feat-scrcpy-separate-adb_2022-06-25-16-58.json delete mode 100644 common/changes/@yume-chan/adb/main_2022-07-19-08-39.json delete mode 100644 common/changes/@yume-chan/android-bin/feat-scrcpy-separate-adb_2022-06-25-16-58.json delete mode 100644 common/changes/@yume-chan/android-bin/main_2022-07-19-08-39.json delete mode 100644 common/changes/@yume-chan/dataview-bigint-polyfill/feat-scrcpy-separate-adb_2022-06-25-16-58.json delete mode 100644 common/changes/@yume-chan/dataview-bigint-polyfill/main_2022-07-19-08-39.json delete mode 100644 common/changes/@yume-chan/event/feat-scrcpy-separate-adb_2022-06-25-16-58.json delete mode 100644 common/changes/@yume-chan/event/main_2022-07-19-08-39.json delete mode 100644 common/changes/@yume-chan/scrcpy-decoder-tinyh264/main_2022-07-19-08-39.json delete mode 100644 common/changes/@yume-chan/scrcpy-decoder-webcodecs/main_2022-07-19-08-39.json delete mode 100644 common/changes/@yume-chan/scrcpy/feat-scrcpy-separate-adb_2022-06-25-16-58.json delete mode 100644 common/changes/@yume-chan/scrcpy/main_2022-07-19-08-39.json delete mode 100644 common/changes/@yume-chan/stream-extra/feat-scrcpy-separate-adb_2022-06-25-16-58.json delete mode 100644 common/changes/@yume-chan/stream-extra/main_2022-07-19-08-39.json delete mode 100644 common/changes/@yume-chan/struct/feat-scrcpy-separate-adb_2022-06-25-16-58.json delete mode 100644 common/changes/@yume-chan/struct/main_2022-07-19-08-39.json create mode 100644 libraries/scrcpy-decoder-tinyh264/CHANGELOG.json create mode 100644 libraries/scrcpy-decoder-tinyh264/CHANGELOG.md create mode 100644 libraries/scrcpy-decoder-webcodecs/CHANGELOG.json create mode 100644 libraries/scrcpy-decoder-webcodecs/CHANGELOG.md create mode 100644 libraries/stream-extra/CHANGELOG.json create mode 100644 libraries/stream-extra/CHANGELOG.md diff --git a/apps/demo/package.json b/apps/demo/package.json index aa585d1a..4403c169 100644 --- a/apps/demo/package.json +++ b/apps/demo/package.json @@ -16,21 +16,21 @@ "@fluentui/react-icons": "^2.0.166-rc.3", "@fluentui/style-utilities": "^8.6.5", "@griffel/react": "^1.0.4", - "@yume-chan/adb": "workspace:^0.0.16", + "@yume-chan/adb": "workspace:^0.0.17", "@yume-chan/adb-backend-direct-sockets": "workspace:^0.0.9", - "@yume-chan/adb-backend-webusb": "workspace:^0.0.16", + "@yume-chan/adb-backend-webusb": "workspace:^0.0.17", "@yume-chan/adb-backend-ws": "workspace:^0.0.9", - "@yume-chan/adb-credential-web": "workspace:^0.0.16", - "@yume-chan/android-bin": "workspace:^0.0.16", + "@yume-chan/adb-credential-web": "workspace:^0.0.17", + "@yume-chan/android-bin": "workspace:^0.0.17", "@yume-chan/async": "^2.2.0", "@yume-chan/b-tree": "workspace:^0.0.16", - "@yume-chan/event": "workspace:^0.0.16", - "@yume-chan/scrcpy": "workspace:^0.0.16", - "@yume-chan/scrcpy-decoder-tinyh264": "workspace:^0.0.16", - "@yume-chan/scrcpy-decoder-webcodecs": "workspace:^0.0.16", - "@yume-chan/stream-extra": "workspace:^0.0.16", + "@yume-chan/event": "workspace:^0.0.17", + "@yume-chan/scrcpy": "workspace:^0.0.17", + "@yume-chan/scrcpy-decoder-tinyh264": "workspace:^0.0.17", + "@yume-chan/scrcpy-decoder-webcodecs": "workspace:^0.0.17", + "@yume-chan/stream-extra": "workspace:^0.0.17", "@yume-chan/stream-saver": "^2.0.6", - "@yume-chan/struct": "workspace:^0.0.16", + "@yume-chan/struct": "workspace:^0.0.17", "mobx": "^6.6.1", "mobx-react-lite": "^3.4.0", "next": "12.2.0", diff --git a/common/changes/@yume-chan/adb-backend-webusb/feat-scrcpy-separate-adb_2022-06-25-16-58.json b/common/changes/@yume-chan/adb-backend-webusb/feat-scrcpy-separate-adb_2022-06-25-16-58.json deleted file mode 100644 index aff8aaf9..00000000 --- a/common/changes/@yume-chan/adb-backend-webusb/feat-scrcpy-separate-adb_2022-06-25-16-58.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/adb-backend-webusb", - "comment": "Update to use new stream util package", - "type": "none" - } - ], - "packageName": "@yume-chan/adb-backend-webusb" -} diff --git a/common/changes/@yume-chan/adb-backend-webusb/main_2022-07-19-08-39.json b/common/changes/@yume-chan/adb-backend-webusb/main_2022-07-19-08-39.json deleted file mode 100644 index dbf9cbcf..00000000 --- a/common/changes/@yume-chan/adb-backend-webusb/main_2022-07-19-08-39.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/adb-backend-webusb", - "comment": "", - "type": "none" - } - ], - "packageName": "@yume-chan/adb-backend-webusb" -} \ No newline at end of file diff --git a/common/changes/@yume-chan/adb-credential-web/feat-scrcpy-separate-adb_2022-06-25-16-58.json b/common/changes/@yume-chan/adb-credential-web/feat-scrcpy-separate-adb_2022-06-25-16-58.json deleted file mode 100644 index d264765f..00000000 --- a/common/changes/@yume-chan/adb-credential-web/feat-scrcpy-separate-adb_2022-06-25-16-58.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/adb-credential-web", - "comment": "Update to use new stream util package", - "type": "none" - } - ], - "packageName": "@yume-chan/adb-credential-web" -} \ No newline at end of file diff --git a/common/changes/@yume-chan/adb-credential-web/main_2022-07-19-08-39.json b/common/changes/@yume-chan/adb-credential-web/main_2022-07-19-08-39.json deleted file mode 100644 index 33d245b1..00000000 --- a/common/changes/@yume-chan/adb-credential-web/main_2022-07-19-08-39.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/adb-credential-web", - "comment": "", - "type": "none" - } - ], - "packageName": "@yume-chan/adb-credential-web" -} \ No newline at end of file diff --git a/common/changes/@yume-chan/adb/feat-scrcpy-separate-adb_2022-06-25-16-58.json b/common/changes/@yume-chan/adb/feat-scrcpy-separate-adb_2022-06-25-16-58.json deleted file mode 100644 index 11582c91..00000000 --- a/common/changes/@yume-chan/adb/feat-scrcpy-separate-adb_2022-06-25-16-58.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/adb", - "comment": "Move stream utils to separate package", - "type": "none" - } - ], - "packageName": "@yume-chan/adb" -} \ No newline at end of file diff --git a/common/changes/@yume-chan/adb/main_2022-07-19-08-39.json b/common/changes/@yume-chan/adb/main_2022-07-19-08-39.json deleted file mode 100644 index 2c35552b..00000000 --- a/common/changes/@yume-chan/adb/main_2022-07-19-08-39.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/adb", - "comment": "", - "type": "none" - } - ], - "packageName": "@yume-chan/adb" -} \ No newline at end of file diff --git a/common/changes/@yume-chan/android-bin/feat-scrcpy-separate-adb_2022-06-25-16-58.json b/common/changes/@yume-chan/android-bin/feat-scrcpy-separate-adb_2022-06-25-16-58.json deleted file mode 100644 index 8f912d73..00000000 --- a/common/changes/@yume-chan/android-bin/feat-scrcpy-separate-adb_2022-06-25-16-58.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/android-bin", - "comment": "Update to use new stream util package", - "type": "none" - } - ], - "packageName": "@yume-chan/android-bin" -} \ No newline at end of file diff --git a/common/changes/@yume-chan/android-bin/main_2022-07-19-08-39.json b/common/changes/@yume-chan/android-bin/main_2022-07-19-08-39.json deleted file mode 100644 index 236b44a2..00000000 --- a/common/changes/@yume-chan/android-bin/main_2022-07-19-08-39.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/android-bin", - "comment": "", - "type": "none" - } - ], - "packageName": "@yume-chan/android-bin" -} \ No newline at end of file diff --git a/common/changes/@yume-chan/dataview-bigint-polyfill/feat-scrcpy-separate-adb_2022-06-25-16-58.json b/common/changes/@yume-chan/dataview-bigint-polyfill/feat-scrcpy-separate-adb_2022-06-25-16-58.json deleted file mode 100644 index 82e489e9..00000000 --- a/common/changes/@yume-chan/dataview-bigint-polyfill/feat-scrcpy-separate-adb_2022-06-25-16-58.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/dataview-bigint-polyfill", - "comment": "", - "type": "none" - } - ], - "packageName": "@yume-chan/dataview-bigint-polyfill" -} \ No newline at end of file diff --git a/common/changes/@yume-chan/dataview-bigint-polyfill/main_2022-07-19-08-39.json b/common/changes/@yume-chan/dataview-bigint-polyfill/main_2022-07-19-08-39.json deleted file mode 100644 index 82e489e9..00000000 --- a/common/changes/@yume-chan/dataview-bigint-polyfill/main_2022-07-19-08-39.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/dataview-bigint-polyfill", - "comment": "", - "type": "none" - } - ], - "packageName": "@yume-chan/dataview-bigint-polyfill" -} \ No newline at end of file diff --git a/common/changes/@yume-chan/event/feat-scrcpy-separate-adb_2022-06-25-16-58.json b/common/changes/@yume-chan/event/feat-scrcpy-separate-adb_2022-06-25-16-58.json deleted file mode 100644 index b351b5be..00000000 --- a/common/changes/@yume-chan/event/feat-scrcpy-separate-adb_2022-06-25-16-58.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/event", - "comment": "", - "type": "none" - } - ], - "packageName": "@yume-chan/event" -} \ No newline at end of file diff --git a/common/changes/@yume-chan/event/main_2022-07-19-08-39.json b/common/changes/@yume-chan/event/main_2022-07-19-08-39.json deleted file mode 100644 index b351b5be..00000000 --- a/common/changes/@yume-chan/event/main_2022-07-19-08-39.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/event", - "comment": "", - "type": "none" - } - ], - "packageName": "@yume-chan/event" -} \ No newline at end of file diff --git a/common/changes/@yume-chan/scrcpy-decoder-tinyh264/main_2022-07-19-08-39.json b/common/changes/@yume-chan/scrcpy-decoder-tinyh264/main_2022-07-19-08-39.json deleted file mode 100644 index 5c7d2184..00000000 --- a/common/changes/@yume-chan/scrcpy-decoder-tinyh264/main_2022-07-19-08-39.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/scrcpy-decoder-tinyh264", - "comment": "Separated from `@yume-chan/scrcpy` for simpler dependency management.", - "type": "none" - } - ], - "packageName": "@yume-chan/scrcpy-decoder-tinyh264" -} diff --git a/common/changes/@yume-chan/scrcpy-decoder-webcodecs/main_2022-07-19-08-39.json b/common/changes/@yume-chan/scrcpy-decoder-webcodecs/main_2022-07-19-08-39.json deleted file mode 100644 index da1ef3bf..00000000 --- a/common/changes/@yume-chan/scrcpy-decoder-webcodecs/main_2022-07-19-08-39.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/scrcpy-decoder-webcodecs", - "comment": "Separated from `@yume-chan/scrcpy` for simpler dependency management.", - "type": "none" - } - ], - "packageName": "@yume-chan/scrcpy-decoder-webcodecs" -} diff --git a/common/changes/@yume-chan/scrcpy/feat-scrcpy-separate-adb_2022-06-25-16-58.json b/common/changes/@yume-chan/scrcpy/feat-scrcpy-separate-adb_2022-06-25-16-58.json deleted file mode 100644 index 8386a17c..00000000 --- a/common/changes/@yume-chan/scrcpy/feat-scrcpy-separate-adb_2022-06-25-16-58.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/scrcpy", - "comment": "Add standalone types for serializing/deserializing Scrcpy packets", - "type": "none" - } - ], - "packageName": "@yume-chan/scrcpy" -} \ No newline at end of file diff --git a/common/changes/@yume-chan/scrcpy/main_2022-07-19-08-39.json b/common/changes/@yume-chan/scrcpy/main_2022-07-19-08-39.json deleted file mode 100644 index 41b2127b..00000000 --- a/common/changes/@yume-chan/scrcpy/main_2022-07-19-08-39.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/scrcpy", - "comment": "Separate decoders to own packages so they don't need optional peer dependencies.", - "type": "none" - } - ], - "packageName": "@yume-chan/scrcpy" -} diff --git a/common/changes/@yume-chan/stream-extra/feat-scrcpy-separate-adb_2022-06-25-16-58.json b/common/changes/@yume-chan/stream-extra/feat-scrcpy-separate-adb_2022-06-25-16-58.json deleted file mode 100644 index 3eaf4304..00000000 --- a/common/changes/@yume-chan/stream-extra/feat-scrcpy-separate-adb_2022-06-25-16-58.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/stream-extra", - "comment": "", - "type": "none" - } - ], - "packageName": "@yume-chan/stream-extra" -} \ No newline at end of file diff --git a/common/changes/@yume-chan/stream-extra/main_2022-07-19-08-39.json b/common/changes/@yume-chan/stream-extra/main_2022-07-19-08-39.json deleted file mode 100644 index 3eaf4304..00000000 --- a/common/changes/@yume-chan/stream-extra/main_2022-07-19-08-39.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/stream-extra", - "comment": "", - "type": "none" - } - ], - "packageName": "@yume-chan/stream-extra" -} \ No newline at end of file diff --git a/common/changes/@yume-chan/struct/feat-scrcpy-separate-adb_2022-06-25-16-58.json b/common/changes/@yume-chan/struct/feat-scrcpy-separate-adb_2022-06-25-16-58.json deleted file mode 100644 index 837f74a9..00000000 --- a/common/changes/@yume-chan/struct/feat-scrcpy-separate-adb_2022-06-25-16-58.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/struct", - "comment": "", - "type": "none" - } - ], - "packageName": "@yume-chan/struct" -} \ No newline at end of file diff --git a/common/changes/@yume-chan/struct/main_2022-07-19-08-39.json b/common/changes/@yume-chan/struct/main_2022-07-19-08-39.json deleted file mode 100644 index 837f74a9..00000000 --- a/common/changes/@yume-chan/struct/main_2022-07-19-08-39.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@yume-chan/struct", - "comment": "", - "type": "none" - } - ], - "packageName": "@yume-chan/struct" -} \ No newline at end of file diff --git a/common/config/rush/version-policies.json b/common/config/rush/version-policies.json index 4bec83b6..c4372314 100644 --- a/common/config/rush/version-policies.json +++ b/common/config/rush/version-policies.json @@ -89,7 +89,7 @@ { "definitionName": "lockStepVersion", "policyName": "adb", - "version": "0.0.16", + "version": "0.0.17", "nextBump": "patch" } ] diff --git a/libraries/adb-backend-direct-sockets/package.json b/libraries/adb-backend-direct-sockets/package.json index ad6028a2..ee0e89b6 100644 --- a/libraries/adb-backend-direct-sockets/package.json +++ b/libraries/adb-backend-direct-sockets/package.json @@ -35,8 +35,8 @@ "@yume-chan/ts-package-builder": "workspace:^1.0.0" }, "dependencies": { - "@yume-chan/adb": "workspace:^0.0.16", - "@yume-chan/stream-extra": "workspace:^0.0.16", + "@yume-chan/adb": "workspace:^0.0.17", + "@yume-chan/stream-extra": "workspace:^0.0.17", "tslib": "^2.4.0" } } diff --git a/libraries/adb-backend-webusb/CHANGELOG.json b/libraries/adb-backend-webusb/CHANGELOG.json index ba439c13..e6fd61ef 100644 --- a/libraries/adb-backend-webusb/CHANGELOG.json +++ b/libraries/adb-backend-webusb/CHANGELOG.json @@ -1,6 +1,18 @@ { "name": "@yume-chan/adb-backend-webusb", "entries": [ + { + "version": "0.0.17", + "tag": "@yume-chan/adb-backend-webusb_v0.0.17", + "date": "Tue, 18 Oct 2022 09:32:30 GMT", + "comments": { + "none": [ + { + "comment": "Update to use new stream util package" + } + ] + } + }, { "version": "0.0.16", "tag": "@yume-chan/adb-backend-webusb_v0.0.16", diff --git a/libraries/adb-backend-webusb/CHANGELOG.md b/libraries/adb-backend-webusb/CHANGELOG.md index 19ca2dbb..fae2cfe1 100644 --- a/libraries/adb-backend-webusb/CHANGELOG.md +++ b/libraries/adb-backend-webusb/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @yume-chan/adb-backend-webusb -This log was last generated on Sat, 28 May 2022 03:56:37 GMT and should not be manually modified. +This log was last generated on Tue, 18 Oct 2022 09:32:30 GMT and should not be manually modified. + +## 0.0.17 +Tue, 18 Oct 2022 09:32:30 GMT + +### Updates + +- Update to use new stream util package ## 0.0.16 Sat, 28 May 2022 03:56:37 GMT diff --git a/libraries/adb-backend-webusb/package.json b/libraries/adb-backend-webusb/package.json index de52c096..266eefc1 100644 --- a/libraries/adb-backend-webusb/package.json +++ b/libraries/adb-backend-webusb/package.json @@ -1,6 +1,6 @@ { "name": "@yume-chan/adb-backend-webusb", - "version": "0.0.16", + "version": "0.0.17", "description": "Backend for `@yume-chan/adb` using WebUSB API.", "keywords": [ "webusb", @@ -32,9 +32,9 @@ }, "dependencies": { "@types/w3c-web-usb": "^1.0.6", - "@yume-chan/adb": "workspace:^0.0.16", - "@yume-chan/stream-extra": "workspace:^0.0.16", - "@yume-chan/struct": "workspace:^0.0.16", + "@yume-chan/adb": "workspace:^0.0.17", + "@yume-chan/stream-extra": "workspace:^0.0.17", + "@yume-chan/struct": "workspace:^0.0.17", "tslib": "^2.4.0" }, "devDependencies": { diff --git a/libraries/adb-backend-ws/package.json b/libraries/adb-backend-ws/package.json index 085b3e15..14051195 100644 --- a/libraries/adb-backend-ws/package.json +++ b/libraries/adb-backend-ws/package.json @@ -35,8 +35,8 @@ "@yume-chan/ts-package-builder": "workspace:^1.0.0" }, "dependencies": { - "@yume-chan/adb": "workspace:^0.0.16", - "@yume-chan/stream-extra": "workspace:^0.0.16", + "@yume-chan/adb": "workspace:^0.0.17", + "@yume-chan/stream-extra": "workspace:^0.0.17", "tslib": "^2.4.0" } } diff --git a/libraries/adb-credential-web/CHANGELOG.json b/libraries/adb-credential-web/CHANGELOG.json index a726d510..9c9e1410 100644 --- a/libraries/adb-credential-web/CHANGELOG.json +++ b/libraries/adb-credential-web/CHANGELOG.json @@ -1,6 +1,18 @@ { "name": "@yume-chan/adb-credential-web", "entries": [ + { + "version": "0.0.17", + "tag": "@yume-chan/adb-credential-web_v0.0.17", + "date": "Tue, 18 Oct 2022 09:32:30 GMT", + "comments": { + "none": [ + { + "comment": "Update to use new stream util package" + } + ] + } + }, { "version": "0.0.16", "tag": "@yume-chan/adb-credential-web_v0.0.16", diff --git a/libraries/adb-credential-web/CHANGELOG.md b/libraries/adb-credential-web/CHANGELOG.md index d30f3da1..b14022fc 100644 --- a/libraries/adb-credential-web/CHANGELOG.md +++ b/libraries/adb-credential-web/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @yume-chan/adb-credential-web -This log was last generated on Sat, 28 May 2022 03:56:37 GMT and should not be manually modified. +This log was last generated on Tue, 18 Oct 2022 09:32:30 GMT and should not be manually modified. + +## 0.0.17 +Tue, 18 Oct 2022 09:32:30 GMT + +### Updates + +- Update to use new stream util package ## 0.0.16 Sat, 28 May 2022 03:56:37 GMT diff --git a/libraries/adb-credential-web/package.json b/libraries/adb-credential-web/package.json index cdb38164..2b309f36 100644 --- a/libraries/adb-credential-web/package.json +++ b/libraries/adb-credential-web/package.json @@ -1,6 +1,6 @@ { "name": "@yume-chan/adb-credential-web", - "version": "0.0.16", + "version": "0.0.17", "description": "Credential Store for `@yume-chan/adb` using Web LocalStorage API.", "keywords": [ "adb" @@ -33,7 +33,7 @@ "@yume-chan/ts-package-builder": "workspace:^1.0.0" }, "dependencies": { - "@yume-chan/adb": "workspace:^0.0.16", + "@yume-chan/adb": "workspace:^0.0.17", "tslib": "^2.4.0" } } diff --git a/libraries/adb/CHANGELOG.json b/libraries/adb/CHANGELOG.json index 3f3b3af9..5cbbd82e 100644 --- a/libraries/adb/CHANGELOG.json +++ b/libraries/adb/CHANGELOG.json @@ -1,6 +1,18 @@ { "name": "@yume-chan/adb", "entries": [ + { + "version": "0.0.17", + "tag": "@yume-chan/adb_v0.0.17", + "date": "Tue, 18 Oct 2022 09:32:30 GMT", + "comments": { + "none": [ + { + "comment": "Move stream utils to separate package" + } + ] + } + }, { "version": "0.0.16", "tag": "@yume-chan/adb_v0.0.16", diff --git a/libraries/adb/CHANGELOG.md b/libraries/adb/CHANGELOG.md index e9d8e3bb..6da04d9f 100644 --- a/libraries/adb/CHANGELOG.md +++ b/libraries/adb/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @yume-chan/adb -This log was last generated on Sat, 28 May 2022 03:56:37 GMT and should not be manually modified. +This log was last generated on Tue, 18 Oct 2022 09:32:30 GMT and should not be manually modified. + +## 0.0.17 +Tue, 18 Oct 2022 09:32:30 GMT + +### Updates + +- Move stream utils to separate package ## 0.0.16 Sat, 28 May 2022 03:56:37 GMT diff --git a/libraries/adb/package.json b/libraries/adb/package.json index 42eb93bb..b05ce092 100644 --- a/libraries/adb/package.json +++ b/libraries/adb/package.json @@ -1,6 +1,6 @@ { "name": "@yume-chan/adb", - "version": "0.0.16", + "version": "0.0.17", "description": "TypeScript implementation of Android Debug Bridge (ADB) protocol.", "keywords": [ "adb", @@ -32,10 +32,10 @@ }, "dependencies": { "@yume-chan/async": "^2.2.0", - "@yume-chan/dataview-bigint-polyfill": "workspace:^0.0.16", - "@yume-chan/event": "workspace:^0.0.16", - "@yume-chan/stream-extra": "workspace:^0.0.16", - "@yume-chan/struct": "workspace:^0.0.16", + "@yume-chan/dataview-bigint-polyfill": "workspace:^0.0.17", + "@yume-chan/event": "workspace:^0.0.17", + "@yume-chan/stream-extra": "workspace:^0.0.17", + "@yume-chan/struct": "workspace:^0.0.17", "tslib": "^2.4.0" }, "devDependencies": { diff --git a/libraries/android-bin/CHANGELOG.json b/libraries/android-bin/CHANGELOG.json index fe6cf4c3..4489294a 100644 --- a/libraries/android-bin/CHANGELOG.json +++ b/libraries/android-bin/CHANGELOG.json @@ -1,6 +1,18 @@ { "name": "@yume-chan/android-bin", "entries": [ + { + "version": "0.0.17", + "tag": "@yume-chan/android-bin_v0.0.17", + "date": "Tue, 18 Oct 2022 09:32:30 GMT", + "comments": { + "none": [ + { + "comment": "Update to use new stream util package" + } + ] + } + }, { "version": "0.0.16", "tag": "@yume-chan/android-bin_v0.0.16", diff --git a/libraries/android-bin/CHANGELOG.md b/libraries/android-bin/CHANGELOG.md index 96f766d2..b5d8b5c6 100644 --- a/libraries/android-bin/CHANGELOG.md +++ b/libraries/android-bin/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log - @yume-chan/android-bin -This log was last generated on Sat, 28 May 2022 03:56:37 GMT and should not be manually modified. +This log was last generated on Tue, 18 Oct 2022 09:32:30 GMT and should not be manually modified. + +## 0.0.17 +Tue, 18 Oct 2022 09:32:30 GMT + +### Updates + +- Update to use new stream util package ## 0.0.16 Sat, 28 May 2022 03:56:37 GMT diff --git a/libraries/android-bin/package.json b/libraries/android-bin/package.json index 67b1c613..c14e4b34 100644 --- a/libraries/android-bin/package.json +++ b/libraries/android-bin/package.json @@ -1,6 +1,6 @@ { "name": "@yume-chan/android-bin", - "version": "0.0.16", + "version": "0.0.17", "description": "Wrappers for Android built-in executables.", "keywords": [ "adb", @@ -34,9 +34,9 @@ "@yume-chan/ts-package-builder": "workspace:^1.0.0" }, "dependencies": { - "@yume-chan/adb": "workspace:^0.0.16", - "@yume-chan/stream-extra": "workspace:^0.0.16", - "@yume-chan/struct": "workspace:^0.0.16", + "@yume-chan/adb": "workspace:^0.0.17", + "@yume-chan/stream-extra": "workspace:^0.0.17", + "@yume-chan/struct": "workspace:^0.0.17", "tslib": "^2.4.0" } } diff --git a/libraries/dataview-bigint-polyfill/CHANGELOG.json b/libraries/dataview-bigint-polyfill/CHANGELOG.json index 880e771c..ef1cf19f 100644 --- a/libraries/dataview-bigint-polyfill/CHANGELOG.json +++ b/libraries/dataview-bigint-polyfill/CHANGELOG.json @@ -1,6 +1,12 @@ { "name": "@yume-chan/dataview-bigint-polyfill", "entries": [ + { + "version": "0.0.17", + "tag": "@yume-chan/dataview-bigint-polyfill_v0.0.17", + "date": "Tue, 18 Oct 2022 09:32:30 GMT", + "comments": {} + }, { "version": "0.0.16", "tag": "@yume-chan/dataview-bigint-polyfill_v0.0.16", diff --git a/libraries/dataview-bigint-polyfill/CHANGELOG.md b/libraries/dataview-bigint-polyfill/CHANGELOG.md index 1743c5f3..6cf0a42e 100644 --- a/libraries/dataview-bigint-polyfill/CHANGELOG.md +++ b/libraries/dataview-bigint-polyfill/CHANGELOG.md @@ -1,6 +1,11 @@ # Change Log - @yume-chan/dataview-bigint-polyfill -This log was last generated on Sat, 28 May 2022 03:56:37 GMT and should not be manually modified. +This log was last generated on Tue, 18 Oct 2022 09:32:30 GMT and should not be manually modified. + +## 0.0.17 +Tue, 18 Oct 2022 09:32:30 GMT + +_Version update only_ ## 0.0.16 Sat, 28 May 2022 03:56:37 GMT diff --git a/libraries/dataview-bigint-polyfill/package.json b/libraries/dataview-bigint-polyfill/package.json index f3a1c42f..5dc700aa 100644 --- a/libraries/dataview-bigint-polyfill/package.json +++ b/libraries/dataview-bigint-polyfill/package.json @@ -1,6 +1,6 @@ { "name": "@yume-chan/dataview-bigint-polyfill", - "version": "0.0.16", + "version": "0.0.17", "description": "Polyfill for `DataView#getBigInt64`, `DataView#getBigUint64`, `DataView#setBigInt64` and `DataView#setBigUint64`", "keywords": [ "polyfill", diff --git a/libraries/event/CHANGELOG.json b/libraries/event/CHANGELOG.json index 2e7f780f..27d4c1f9 100644 --- a/libraries/event/CHANGELOG.json +++ b/libraries/event/CHANGELOG.json @@ -1,6 +1,12 @@ { "name": "@yume-chan/event", "entries": [ + { + "version": "0.0.17", + "tag": "@yume-chan/event_v0.0.17", + "date": "Tue, 18 Oct 2022 09:32:30 GMT", + "comments": {} + }, { "version": "0.0.16", "tag": "@yume-chan/event_v0.0.16", diff --git a/libraries/event/CHANGELOG.md b/libraries/event/CHANGELOG.md index 07e1a2d0..ac7c0524 100644 --- a/libraries/event/CHANGELOG.md +++ b/libraries/event/CHANGELOG.md @@ -1,6 +1,11 @@ # Change Log - @yume-chan/event -This log was last generated on Sat, 28 May 2022 03:56:37 GMT and should not be manually modified. +This log was last generated on Tue, 18 Oct 2022 09:32:30 GMT and should not be manually modified. + +## 0.0.17 +Tue, 18 Oct 2022 09:32:30 GMT + +_Version update only_ ## 0.0.16 Sat, 28 May 2022 03:56:37 GMT diff --git a/libraries/event/package.json b/libraries/event/package.json index 36bc1a30..440d6bd8 100644 --- a/libraries/event/package.json +++ b/libraries/event/package.json @@ -1,6 +1,6 @@ { "name": "@yume-chan/event", - "version": "0.0.16", + "version": "0.0.17", "description": "Event/EventEmitter", "keywords": [ "event", diff --git a/libraries/scrcpy-decoder-tinyh264/CHANGELOG.json b/libraries/scrcpy-decoder-tinyh264/CHANGELOG.json new file mode 100644 index 00000000..b242724e --- /dev/null +++ b/libraries/scrcpy-decoder-tinyh264/CHANGELOG.json @@ -0,0 +1,17 @@ +{ + "name": "@yume-chan/scrcpy-decoder-tinyh264", + "entries": [ + { + "version": "0.0.17", + "tag": "@yume-chan/scrcpy-decoder-tinyh264_v0.0.17", + "date": "Tue, 18 Oct 2022 09:32:30 GMT", + "comments": { + "none": [ + { + "comment": "Separated from `@yume-chan/scrcpy` for simpler dependency management." + } + ] + } + } + ] +} diff --git a/libraries/scrcpy-decoder-tinyh264/CHANGELOG.md b/libraries/scrcpy-decoder-tinyh264/CHANGELOG.md new file mode 100644 index 00000000..81334609 --- /dev/null +++ b/libraries/scrcpy-decoder-tinyh264/CHANGELOG.md @@ -0,0 +1,11 @@ +# Change Log - @yume-chan/scrcpy-decoder-tinyh264 + +This log was last generated on Tue, 18 Oct 2022 09:32:30 GMT and should not be manually modified. + +## 0.0.17 +Tue, 18 Oct 2022 09:32:30 GMT + +### Updates + +- Separated from `@yume-chan/scrcpy` for simpler dependency management. + diff --git a/libraries/scrcpy-decoder-tinyh264/package.json b/libraries/scrcpy-decoder-tinyh264/package.json index 8b4fcb2f..c6ad8484 100644 --- a/libraries/scrcpy-decoder-tinyh264/package.json +++ b/libraries/scrcpy-decoder-tinyh264/package.json @@ -1,6 +1,6 @@ { "name": "@yume-chan/scrcpy-decoder-tinyh264", - "version": "0.0.16", + "version": "0.0.17", "description": "TypeScript implementation of Scrcpy.", "keywords": [ "adb", @@ -33,9 +33,9 @@ }, "dependencies": { "@yume-chan/async": "^2.2.0", - "@yume-chan/event": "workspace:^0.0.16", - "@yume-chan/stream-extra": "workspace:^0.0.16", - "@yume-chan/scrcpy": "workspace:^0.0.16", + "@yume-chan/event": "workspace:^0.0.17", + "@yume-chan/stream-extra": "workspace:^0.0.17", + "@yume-chan/scrcpy": "workspace:^0.0.17", "tinyh264": "^0.0.7", "tslib": "^2.4.0", "yuv-buffer": "^1.0.0", diff --git a/libraries/scrcpy-decoder-webcodecs/CHANGELOG.json b/libraries/scrcpy-decoder-webcodecs/CHANGELOG.json new file mode 100644 index 00000000..8df76076 --- /dev/null +++ b/libraries/scrcpy-decoder-webcodecs/CHANGELOG.json @@ -0,0 +1,17 @@ +{ + "name": "@yume-chan/scrcpy-decoder-webcodecs", + "entries": [ + { + "version": "0.0.17", + "tag": "@yume-chan/scrcpy-decoder-webcodecs_v0.0.17", + "date": "Tue, 18 Oct 2022 09:32:30 GMT", + "comments": { + "none": [ + { + "comment": "Separated from `@yume-chan/scrcpy` for simpler dependency management." + } + ] + } + } + ] +} diff --git a/libraries/scrcpy-decoder-webcodecs/CHANGELOG.md b/libraries/scrcpy-decoder-webcodecs/CHANGELOG.md new file mode 100644 index 00000000..3cfe579a --- /dev/null +++ b/libraries/scrcpy-decoder-webcodecs/CHANGELOG.md @@ -0,0 +1,11 @@ +# Change Log - @yume-chan/scrcpy-decoder-webcodecs + +This log was last generated on Tue, 18 Oct 2022 09:32:30 GMT and should not be manually modified. + +## 0.0.17 +Tue, 18 Oct 2022 09:32:30 GMT + +### Updates + +- Separated from `@yume-chan/scrcpy` for simpler dependency management. + diff --git a/libraries/scrcpy-decoder-webcodecs/package.json b/libraries/scrcpy-decoder-webcodecs/package.json index 17e5b856..834c6acb 100644 --- a/libraries/scrcpy-decoder-webcodecs/package.json +++ b/libraries/scrcpy-decoder-webcodecs/package.json @@ -1,6 +1,6 @@ { "name": "@yume-chan/scrcpy-decoder-webcodecs", - "version": "0.0.16", + "version": "0.0.17", "description": "TypeScript implementation of Scrcpy.", "keywords": [ "adb", @@ -33,8 +33,8 @@ }, "dependencies": { "@types/dom-webcodecs": "^0.1.3", - "@yume-chan/stream-extra": "workspace:^0.0.16", - "@yume-chan/scrcpy": "workspace:^0.0.16", + "@yume-chan/stream-extra": "workspace:^0.0.17", + "@yume-chan/scrcpy": "workspace:^0.0.17", "tslib": "^2.4.0" }, "devDependencies": { diff --git a/libraries/scrcpy/CHANGELOG.json b/libraries/scrcpy/CHANGELOG.json index 3cd6b2b2..ee553c66 100644 --- a/libraries/scrcpy/CHANGELOG.json +++ b/libraries/scrcpy/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@yume-chan/scrcpy", "entries": [ + { + "version": "0.0.17", + "tag": "@yume-chan/scrcpy_v0.0.17", + "date": "Tue, 18 Oct 2022 09:32:30 GMT", + "comments": { + "none": [ + { + "comment": "Add standalone types for serializing/deserializing Scrcpy packets" + }, + { + "comment": "Separate decoders to own packages so they don't need optional peer dependencies." + } + ] + } + }, { "version": "0.0.16", "tag": "@yume-chan/scrcpy_v0.0.16", diff --git a/libraries/scrcpy/CHANGELOG.md b/libraries/scrcpy/CHANGELOG.md index c584e57f..0dd9fb36 100644 --- a/libraries/scrcpy/CHANGELOG.md +++ b/libraries/scrcpy/CHANGELOG.md @@ -1,6 +1,14 @@ # Change Log - @yume-chan/scrcpy -This log was last generated on Sat, 28 May 2022 03:56:37 GMT and should not be manually modified. +This log was last generated on Tue, 18 Oct 2022 09:32:30 GMT and should not be manually modified. + +## 0.0.17 +Tue, 18 Oct 2022 09:32:30 GMT + +### Updates + +- Add standalone types for serializing/deserializing Scrcpy packets +- Separate decoders to own packages so they don't need optional peer dependencies. ## 0.0.16 Sat, 28 May 2022 03:56:37 GMT diff --git a/libraries/scrcpy/package.json b/libraries/scrcpy/package.json index 92f866c7..5f8db165 100644 --- a/libraries/scrcpy/package.json +++ b/libraries/scrcpy/package.json @@ -1,6 +1,6 @@ { "name": "@yume-chan/scrcpy", - "version": "0.0.16", + "version": "0.0.17", "description": "TypeScript implementation of Scrcpy.", "keywords": [ "adb", @@ -35,11 +35,11 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@yume-chan/adb": "workspace:^0.0.16", + "@yume-chan/adb": "workspace:^0.0.17", "@yume-chan/async": "^2.2.0", - "@yume-chan/event": "workspace:^0.0.16", - "@yume-chan/stream-extra": "workspace:^0.0.16", - "@yume-chan/struct": "workspace:^0.0.16", + "@yume-chan/event": "workspace:^0.0.17", + "@yume-chan/stream-extra": "workspace:^0.0.17", + "@yume-chan/struct": "workspace:^0.0.17", "tslib": "^2.4.0" }, "devDependencies": { diff --git a/libraries/stream-extra/CHANGELOG.json b/libraries/stream-extra/CHANGELOG.json new file mode 100644 index 00000000..0faa8c17 --- /dev/null +++ b/libraries/stream-extra/CHANGELOG.json @@ -0,0 +1,11 @@ +{ + "name": "@yume-chan/stream-extra", + "entries": [ + { + "version": "0.0.17", + "tag": "@yume-chan/stream-extra_v0.0.17", + "date": "Tue, 18 Oct 2022 09:32:30 GMT", + "comments": {} + } + ] +} diff --git a/libraries/stream-extra/CHANGELOG.md b/libraries/stream-extra/CHANGELOG.md new file mode 100644 index 00000000..acf6bd51 --- /dev/null +++ b/libraries/stream-extra/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log - @yume-chan/stream-extra + +This log was last generated on Tue, 18 Oct 2022 09:32:30 GMT and should not be manually modified. + +## 0.0.17 +Tue, 18 Oct 2022 09:32:30 GMT + +_Initial release_ + diff --git a/libraries/stream-extra/package.json b/libraries/stream-extra/package.json index 3bdbab28..f7d1fe0e 100644 --- a/libraries/stream-extra/package.json +++ b/libraries/stream-extra/package.json @@ -1,6 +1,6 @@ { "name": "@yume-chan/stream-extra", - "version": "0.0.16", + "version": "0.0.17", "description": "Extensions to Web Streams API", "keywords": [ "stream", @@ -32,7 +32,7 @@ }, "dependencies": { "@yume-chan/async": "^2.2.0", - "@yume-chan/struct": "workspace:^0.0.16", + "@yume-chan/struct": "workspace:^0.0.17", "tslib": "^2.4.0", "web-streams-polyfill": "^4.0.0-beta.3" }, diff --git a/libraries/struct/CHANGELOG.json b/libraries/struct/CHANGELOG.json index 26885596..92a5c00a 100644 --- a/libraries/struct/CHANGELOG.json +++ b/libraries/struct/CHANGELOG.json @@ -1,6 +1,12 @@ { "name": "@yume-chan/struct", "entries": [ + { + "version": "0.0.17", + "tag": "@yume-chan/struct_v0.0.17", + "date": "Tue, 18 Oct 2022 09:32:30 GMT", + "comments": {} + }, { "version": "0.0.16", "tag": "@yume-chan/struct_v0.0.16", diff --git a/libraries/struct/CHANGELOG.md b/libraries/struct/CHANGELOG.md index 5251015e..14556e05 100644 --- a/libraries/struct/CHANGELOG.md +++ b/libraries/struct/CHANGELOG.md @@ -1,6 +1,11 @@ # Change Log - @yume-chan/struct -This log was last generated on Sat, 28 May 2022 03:56:37 GMT and should not be manually modified. +This log was last generated on Tue, 18 Oct 2022 09:32:30 GMT and should not be manually modified. + +## 0.0.17 +Tue, 18 Oct 2022 09:32:30 GMT + +_Version update only_ ## 0.0.16 Sat, 28 May 2022 03:56:37 GMT diff --git a/libraries/struct/package.json b/libraries/struct/package.json index 32516d8b..b55b4bd1 100644 --- a/libraries/struct/package.json +++ b/libraries/struct/package.json @@ -1,6 +1,6 @@ { "name": "@yume-chan/struct", - "version": "0.0.16", + "version": "0.0.17", "description": "C-style structure serializer and deserializer.", "keywords": [ "structure", @@ -33,7 +33,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@yume-chan/dataview-bigint-polyfill": "workspace:^0.0.16", + "@yume-chan/dataview-bigint-polyfill": "workspace:^0.0.17", "tslib": "^2.4.0" }, "devDependencies": { From 394853cb1b326c5c790d75c8a2ae29a314f2a317 Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Tue, 18 Oct 2022 18:08:52 +0800 Subject: [PATCH 008/171] chore: move `adb` to `peerDependencies` for `scrcpy` package --- common/config/rush/pnpm-lock.yaml | 74 +++++++++++++++--------------- common/config/rush/repo-state.json | 2 +- libraries/scrcpy/package.json | 6 ++- 3 files changed, 43 insertions(+), 39 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 997f8f00..a66155a4 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -47,21 +47,21 @@ importers: '@mdx-js/loader': ^2.1.2 '@next/mdx': ^12.2.0 '@types/react': 17.0.27 - '@yume-chan/adb': workspace:^0.0.16 + '@yume-chan/adb': workspace:^0.0.17 '@yume-chan/adb-backend-direct-sockets': workspace:^0.0.9 - '@yume-chan/adb-backend-webusb': workspace:^0.0.16 + '@yume-chan/adb-backend-webusb': workspace:^0.0.17 '@yume-chan/adb-backend-ws': workspace:^0.0.9 - '@yume-chan/adb-credential-web': workspace:^0.0.16 - '@yume-chan/android-bin': workspace:^0.0.16 + '@yume-chan/adb-credential-web': workspace:^0.0.17 + '@yume-chan/android-bin': workspace:^0.0.17 '@yume-chan/async': ^2.2.0 '@yume-chan/b-tree': workspace:^0.0.16 - '@yume-chan/event': workspace:^0.0.16 - '@yume-chan/scrcpy': workspace:^0.0.16 - '@yume-chan/scrcpy-decoder-tinyh264': workspace:^0.0.16 - '@yume-chan/scrcpy-decoder-webcodecs': workspace:^0.0.16 - '@yume-chan/stream-extra': workspace:^0.0.16 + '@yume-chan/event': workspace:^0.0.17 + '@yume-chan/scrcpy': workspace:^0.0.17 + '@yume-chan/scrcpy-decoder-tinyh264': workspace:^0.0.17 + '@yume-chan/scrcpy-decoder-webcodecs': workspace:^0.0.17 + '@yume-chan/stream-extra': workspace:^0.0.17 '@yume-chan/stream-saver': ^2.0.6 - '@yume-chan/struct': workspace:^0.0.16 + '@yume-chan/struct': workspace:^0.0.17 eslint: 8.19.0 eslint-config-next: 12.2.0 mobx: ^6.6.1 @@ -120,10 +120,10 @@ importers: '@jest/globals': ^28.1.2 '@types/node': ^17.0.17 '@yume-chan/async': ^2.2.0 - '@yume-chan/dataview-bigint-polyfill': workspace:^0.0.16 - '@yume-chan/event': workspace:^0.0.16 - '@yume-chan/stream-extra': workspace:^0.0.16 - '@yume-chan/struct': workspace:^0.0.16 + '@yume-chan/dataview-bigint-polyfill': workspace:^0.0.17 + '@yume-chan/event': workspace:^0.0.17 + '@yume-chan/stream-extra': workspace:^0.0.17 + '@yume-chan/struct': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 cross-env: ^7.0.3 jest: ^28.1.2 @@ -148,8 +148,8 @@ importers: ../../libraries/adb-backend-direct-sockets: specifiers: - '@yume-chan/adb': workspace:^0.0.16 - '@yume-chan/stream-extra': workspace:^0.0.16 + '@yume-chan/adb': workspace:^0.0.17 + '@yume-chan/stream-extra': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 tslib: ^2.4.0 typescript: ^4.7.4 @@ -164,9 +164,9 @@ importers: ../../libraries/adb-backend-webusb: specifiers: '@types/w3c-web-usb': ^1.0.6 - '@yume-chan/adb': workspace:^0.0.16 - '@yume-chan/stream-extra': workspace:^0.0.16 - '@yume-chan/struct': workspace:^0.0.16 + '@yume-chan/adb': workspace:^0.0.17 + '@yume-chan/stream-extra': workspace:^0.0.17 + '@yume-chan/struct': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 jest: ^28.1.2 tslib: ^2.4.0 @@ -184,8 +184,8 @@ importers: ../../libraries/adb-backend-ws: specifiers: - '@yume-chan/adb': workspace:^0.0.16 - '@yume-chan/stream-extra': workspace:^0.0.16 + '@yume-chan/adb': workspace:^0.0.17 + '@yume-chan/stream-extra': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 jest: ^28.1.2 tslib: ^2.4.0 @@ -201,7 +201,7 @@ importers: ../../libraries/adb-credential-web: specifiers: - '@yume-chan/adb': workspace:^0.0.16 + '@yume-chan/adb': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 tslib: ^2.4.0 typescript: ^4.7.4 @@ -214,9 +214,9 @@ importers: ../../libraries/android-bin: specifiers: - '@yume-chan/adb': workspace:^0.0.16 - '@yume-chan/stream-extra': workspace:^0.0.16 - '@yume-chan/struct': workspace:^0.0.16 + '@yume-chan/adb': workspace:^0.0.17 + '@yume-chan/stream-extra': workspace:^0.0.17 + '@yume-chan/struct': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 tslib: ^2.4.0 typescript: ^4.7.4 @@ -279,11 +279,11 @@ importers: ../../libraries/scrcpy: specifiers: '@jest/globals': ^28.1.2 - '@yume-chan/adb': workspace:^0.0.16 + '@yume-chan/adb': workspace:^0.0.17 '@yume-chan/async': ^2.2.0 - '@yume-chan/event': workspace:^0.0.16 - '@yume-chan/stream-extra': workspace:^0.0.16 - '@yume-chan/struct': workspace:^0.0.16 + '@yume-chan/event': workspace:^0.0.17 + '@yume-chan/stream-extra': workspace:^0.0.17 + '@yume-chan/struct': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 cross-env: ^7.0.3 gh-release-fetch: ^3.0.2 @@ -292,7 +292,6 @@ importers: tslib: ^2.4.0 typescript: ^4.7.4 dependencies: - '@yume-chan/adb': link:../adb '@yume-chan/async': 2.2.0 '@yume-chan/event': link:../event '@yume-chan/stream-extra': link:../stream-extra @@ -300,6 +299,7 @@ importers: tslib: 2.4.0 devDependencies: '@jest/globals': 28.1.3 + '@yume-chan/adb': link:../adb '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder cross-env: 7.0.3 gh-release-fetch: 3.0.2 @@ -311,9 +311,9 @@ importers: specifiers: '@jest/globals': ^28.1.2 '@yume-chan/async': ^2.2.0 - '@yume-chan/event': workspace:^0.0.16 - '@yume-chan/scrcpy': workspace:^0.0.16 - '@yume-chan/stream-extra': workspace:^0.0.16 + '@yume-chan/event': workspace:^0.0.17 + '@yume-chan/scrcpy': workspace:^0.0.17 + '@yume-chan/stream-extra': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 cross-env: ^7.0.3 jest: ^28.1.2 @@ -344,8 +344,8 @@ importers: specifiers: '@jest/globals': ^28.1.2 '@types/dom-webcodecs': ^0.1.3 - '@yume-chan/scrcpy': workspace:^0.0.16 - '@yume-chan/stream-extra': workspace:^0.0.16 + '@yume-chan/scrcpy': workspace:^0.0.17 + '@yume-chan/stream-extra': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 cross-env: ^7.0.3 jest: ^28.1.2 @@ -369,7 +369,7 @@ importers: specifiers: '@jest/globals': ^28.1.2 '@yume-chan/async': ^2.2.0 - '@yume-chan/struct': workspace:^0.0.16 + '@yume-chan/struct': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 cross-env: ^7.0.3 jest: ^28.1.2 @@ -393,7 +393,7 @@ importers: ../../libraries/struct: specifiers: '@jest/globals': ^28.1.2 - '@yume-chan/dataview-bigint-polyfill': workspace:^0.0.16 + '@yume-chan/dataview-bigint-polyfill': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 cross-env: ^7.0.3 jest: ^28.1.2 diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json index a64d97a3..b843aaf1 100644 --- a/common/config/rush/repo-state.json +++ b/common/config/rush/repo-state.json @@ -1,5 +1,5 @@ // DO NOT MODIFY THIS FILE MANUALLY BUT DO COMMIT IT. It is generated and used by Rush. { - "pnpmShrinkwrapHash": "20c5e87dd869580ef14e1d0c32c950b3bb75c84f", + "pnpmShrinkwrapHash": "79d49d43f83ef71f5811d4008d20b1f5f89a106e", "preferredVersionsHash": "bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f" } diff --git a/libraries/scrcpy/package.json b/libraries/scrcpy/package.json index 5f8db165..88d54577 100644 --- a/libraries/scrcpy/package.json +++ b/libraries/scrcpy/package.json @@ -35,7 +35,6 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@yume-chan/adb": "workspace:^0.0.17", "@yume-chan/async": "^2.2.0", "@yume-chan/event": "workspace:^0.0.17", "@yume-chan/stream-extra": "workspace:^0.0.17", @@ -43,6 +42,7 @@ "tslib": "^2.4.0" }, "devDependencies": { + "@yume-chan/adb": "workspace:^0.0.17", "@jest/globals": "^28.1.2", "@yume-chan/ts-package-builder": "workspace:^1.0.0", "cross-env": "^7.0.3", @@ -52,9 +52,13 @@ "typescript": "^4.7.4" }, "peerDependencies": { + "@yume-chan/adb": "workspace:^0.0.17", "gh-release-fetch": "^3.0.2" }, "peerDependenciesMeta": { + "@yume-chan/adb": { + "optional": true + }, "gh-release-fetch": { "optional": true } From 47aa6cb32bb17b7dcf6326dda1431c9fbeea237a Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Tue, 18 Oct 2022 18:09:30 +0800 Subject: [PATCH 009/171] chore: add changelog --- .../@yume-chan/scrcpy/main_2022-10-18-10-09.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 common/changes/@yume-chan/scrcpy/main_2022-10-18-10-09.json diff --git a/common/changes/@yume-chan/scrcpy/main_2022-10-18-10-09.json b/common/changes/@yume-chan/scrcpy/main_2022-10-18-10-09.json new file mode 100644 index 00000000..ead3cf77 --- /dev/null +++ b/common/changes/@yume-chan/scrcpy/main_2022-10-18-10-09.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@yume-chan/scrcpy", + "comment": "Move `@yume-chan/adb` to `peerDependencies`", + "type": "none" + } + ], + "packageName": "@yume-chan/scrcpy" +} \ No newline at end of file From c1128a3fb8e5af4f4a1f9f02a683cba4e4d36dd7 Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Tue, 18 Oct 2022 18:38:58 +0800 Subject: [PATCH 010/171] chore: update README for scrcpy --- libraries/scrcpy/README.md | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/libraries/scrcpy/README.md b/libraries/scrcpy/README.md index 212b9065..2ed5b69b 100644 --- a/libraries/scrcpy/README.md +++ b/libraries/scrcpy/README.md @@ -6,7 +6,7 @@ It's compatible with the official Scrcpy server binaries. **WARNING:** The public API is UNSTABLE. If you have any questions, please open an issue. -- [Transport agnostic](#transport-agnostic) +- [Basic information](#basic-information) - [Prepare server binary](#prepare-server-binary) - [`fetch-scrcpy-server`](#fetch-scrcpy-server) - [Use the server binary](#use-the-server-binary) @@ -27,13 +27,21 @@ It's compatible with the official Scrcpy server binaries. - [Video stream](#video-stream) - [Decode video stream](#decode-video-stream) -## Transport agnostic +## Basic information -It was initially designed to be used with `@yume-chan/adb`, but now it can also to used with any other transportation. +Although Scrcpy doesn't install any App on the device, it does have a server binary executable to be run on the device. + +With the official Scrcpy client and server, the client uses ADB to transfer the server binary file to the device, run it, and communicate with it via ADB tunnel (the bootstrap process). + +The package provides types that can serialize and deserialize Scrcpy protocol messages, but it generally requires you to do the bootstrapping and provide the data stream to the server. + +If you are also using `@yume-chan/adb`, this package has a helper class that can complete the bootstrap process using it, doing what the official client does. + +**NOTE:** `@yume-chan/adb` is a peer dependency, you need to install it yourself. Types that named begin with `Adb` requires `@yume-chan/adb`, and types that named begin with `Scrcpy` doesn't. ## Prepare server binary -Scrcpy needs a server binary running on the device in order to work. This package doesn't ship with one. +This package doesn't include the server binary. It's compatible with many versions of the official server binary, but may not work with future versions due to protocol changes. You can download the server binary from official releases (https://github.com/Genymobile/scrcpy/releases), or use the built-in `fetch-scrcpy-server` script to automate the process. @@ -41,7 +49,9 @@ The server binary is subject to [Apache License 2.0](https://github.com/Genymobi ### `fetch-scrcpy-server` -To use the script, first add `gh-release-fetch@3` to `devDependencies` of your `package.json`. It's an optional peer dependency fpr minimized download size. +This package also has a script that can download the server binary from official releases for you. + +To use it, first you need to install the `gh-release-fetch@3` NPM into your project, as it's a peer dependency. Then you can invoke it in a terminal: @@ -55,7 +65,7 @@ For example: $ npx fetch-scrcpy-server 1.24 ``` -You can also add it to the `postinstall` script in your `package.json`. After that, running `npm install` will automatically invoke the script. +It can also be added to the `postinstall` script in your `package.json`, so running `npm install` will automatically invoke the script. ```json "scripts": { @@ -127,7 +137,7 @@ console.log(SCRCPY_SERVER_VERSION); // "1.24" ## Option versions -Scrcpy server options changes over time, and some of them are not backwards compatible. This package provides option types for each version (or range). Using wrong option version usually results in errors. +Scrcpy server options change over time, and some of them are not backwards compatible. This package provides option types for each version (or range). Using wrong option version usually results in errors. The latest one may continue to work for future server versions, but there is no guarantee. @@ -140,7 +150,7 @@ The latest one may continue to work for future server versions, but there is no | 1.23 | `ScrcpyOptions1_23` | | 1.24 | `ScrcpyOptions1_24` | -When using `AdbScrcpyClient`, there is another `AdbScrcpyOptions` contains `@yume-chan/adb` related logics: +When using `AdbScrcpyClient`, there are `AdbScrcpyOptions` containing `@yume-chan/adb` related options: | Version | Type | | --------- | ---------------------- | @@ -149,7 +159,7 @@ When using `AdbScrcpyClient`, there is another `AdbScrcpyOptions` contains `@yum ## Use with `@yume-chan/adb` -The the server binary needs to be copied to the device and run on it. +`@yume-chan/adb` is a TypeScript ADB implementation that can run on Web browser. It can be used to bootstrap the server on a device. ### Push server binary From 92af286a61b46733749951b6e7f2275ab6da60d8 Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Tue, 18 Oct 2022 19:22:58 +0800 Subject: [PATCH 011/171] chore: update README for scrcpy --- libraries/scrcpy/README.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/libraries/scrcpy/README.md b/libraries/scrcpy/README.md index 2ed5b69b..45d77bbf 100644 --- a/libraries/scrcpy/README.md +++ b/libraries/scrcpy/README.md @@ -23,7 +23,7 @@ It's compatible with the official Scrcpy server binaries. - [Parsing video packets](#parsing-video-packets) - [Sending control messages](#sending-control-messages) - [Reading device messages](#reading-device-messages) -- [Consume the streams](#consume-the-streams) +- [Always read the streams](#always-read-the-streams) - [Video stream](#video-stream) - [Decode video stream](#decode-video-stream) @@ -226,6 +226,8 @@ If you push, start and connect to the server yourself, you can still use this pa Requires a `ReadableStream` that reads from the video socket, preserving packet boundaries. +**NOTE:** Because this package uses `web-streams-polyfill` NPM package's Web Streams API implementation, the provided `ReadableStream` must also be from `web-streams-polyfill` (or another polyfill that doesn't check object prototype when piping). + ```ts import { ScrcpyOptions1_24, ScrcpyVideoStreamPacket } from '@yume-chan/scrcpy'; @@ -263,6 +265,8 @@ controlMessageSerializer.injectText("Hello World!"); Requires a `ReadableStream` that reads from the control socket. +**NOTE:** Because this package uses `web-streams-polyfill` NPM package's Web Streams API implementation, the provided `ReadableStream` must also be from `web-streams-polyfill` (or another polyfill that doesn't check object prototype when piping). + ```ts import { ScrcpyDeviceMessageDeserializeStream, ScrcpyOptions1_24 } from '@yume-chan/scrcpy'; @@ -271,9 +275,11 @@ const controlStream: ReadableWritablePair | undefined // const deviceMessageStream: ReadableStream = controlStream.readable.pipeThrough(new ScrcpyDeviceMessageDeserializeStream()); ``` -## Consume the streams +## Always read the streams + +In Web Streams API, `ReadableStream` will block its upstream when too many chunks are kept not read. If multiple streams are from the same upstream source, block one stream means blocking all of them. -Any `ReadableStream` (`stdout` when using `AdbScrcpyClient`, `videoPacketStream` and `deviceMessageStream` when control is enabled) must be continuously read (even if you don't care about the data), otherwise the whole connection will stall. +For Scrcpy, usually all streams are originated from the same ADB connection (either USB or TCP), so it's important to always read from all streams, even if you don't care about their data. ```ts // when using `AdbScrcpyClient` @@ -281,7 +287,7 @@ stdout .pipeTo( new WritableStream({ write: (line) => { - // Handle the stdout line + // Handle or ignore the stdout line }, }), ) @@ -293,7 +299,7 @@ stdout videoPacketStream .pipeTo(new WritableStream({ write: (packet) => { - // Handle the video packet + // Handle or ignore the video packet }, })) .catch(() => {}); @@ -301,7 +307,7 @@ videoPacketStream deviceMessageStream .pipeTo(new WritableStream({ write: (message) => { - // Handle the device message + // Handle or ignore the device message }, })) .catch(() => {}); From 76d6d4334161f2c30f1e073cd99dcc63ab94ea9e Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Wed, 19 Oct 2022 00:39:50 +0800 Subject: [PATCH 012/171] chore: update README for scrcpy --- libraries/scrcpy/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/scrcpy/README.md b/libraries/scrcpy/README.md index 45d77bbf..9d643b26 100644 --- a/libraries/scrcpy/README.md +++ b/libraries/scrcpy/README.md @@ -33,7 +33,7 @@ Although Scrcpy doesn't install any App on the device, it does have a server bin With the official Scrcpy client and server, the client uses ADB to transfer the server binary file to the device, run it, and communicate with it via ADB tunnel (the bootstrap process). -The package provides types that can serialize and deserialize Scrcpy protocol messages, but it generally requires you to do the bootstrapping and provide the data stream to the server. +This package provides types that can serialize and deserialize Scrcpy protocol messages, but it generally requires you to do the bootstrapping and provide the data stream to the server. If you are also using `@yume-chan/adb`, this package has a helper class that can complete the bootstrap process using it, doing what the official client does. From 4f371b8154851777d00024159a6423ba95180bff Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Fri, 21 Oct 2022 23:35:33 +0800 Subject: [PATCH 013/171] chore: update some docs --- libraries/adb-backend-webusb/src/backend.ts | 2 +- libraries/adb/src/socket/dispatcher.ts | 3 --- libraries/scrcpy-decoder-tinyh264/README.md | 20 +++++++++++++------- libraries/scrcpy-decoder-webcodecs/README.md | 8 +++++--- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/libraries/adb-backend-webusb/src/backend.ts b/libraries/adb-backend-webusb/src/backend.ts index ee6430f6..1dde6a0a 100644 --- a/libraries/adb-backend-webusb/src/backend.ts +++ b/libraries/adb-backend-webusb/src/backend.ts @@ -1,5 +1,5 @@ import { AdbPacketHeader, AdbPacketSerializeStream, type AdbBackend, type AdbPacketData, type AdbPacketInit } from '@yume-chan/adb'; -import { DuplexStreamFactory, pipeFrom, ReadableStream, WritableStream } from '@yume-chan/stream-extra'; +import { DuplexStreamFactory, pipeFrom, ReadableStream, WritableStream, type ReadableWritablePair } from '@yume-chan/stream-extra'; import { EMPTY_UINT8_ARRAY, StructDeserializeStream } from '@yume-chan/struct'; export const ADB_DEVICE_FILTER: USBDeviceFilter = { diff --git a/libraries/adb/src/socket/dispatcher.ts b/libraries/adb/src/socket/dispatcher.ts index bab6394f..14b00bb5 100644 --- a/libraries/adb/src/socket/dispatcher.ts +++ b/libraries/adb/src/socket/dispatcher.ts @@ -102,9 +102,6 @@ export class AdbPacketDispatcher implements Closeable { .then(() => { this.dispose(); }, (e) => { - // https://github.com/MattiasBuelens/web-streams-polyfill/issues/115 - // `e` is always `AbortError` (instead of what I give in `abortController.abort()`) - // so we can't check if `e` is a real error. if (!this._closed) { this._disconnected.reject(e); } diff --git a/libraries/scrcpy-decoder-tinyh264/README.md b/libraries/scrcpy-decoder-tinyh264/README.md index 6d41bcfb..1262eb69 100644 --- a/libraries/scrcpy-decoder-tinyh264/README.md +++ b/libraries/scrcpy-decoder-tinyh264/README.md @@ -1,8 +1,8 @@ -# @yume-chan/scrcpy +# @yume-chan/scrcpy-decoder-tinyh264 -Decode and render video stream using TinyH264, the old Android H.264 software decoder (now deprecated and removed), compiled into WebAssembly, and wrapped in Web Worker to prevent blocking the main thread. +Decode and render H.264 streams using TinyH264, the old Android H.264 software decoder (now deprecated and removed), compiled into WebAssembly, and wrapped in Web Worker to prevent blocking the main thread. -The video stream will be decoded into YUV frames, and converted to RGB using a WebGL shader, all on CPU. So it's slow and inefficient, but it works on most browsers. +The video stream will be decoded into YUV frames on CPU, then converted to RGB using a WebGL shader (using GPU). It's slow, but works on most browsers. **WARNING:** The public API is UNSTABLE. If you have any questions, please open an issue. @@ -14,9 +14,11 @@ The video stream will be decoded into YUV frames, and converted to RGB using a W ## Usage -The bundler you use must also support the `new Worker(new URL('./worker.js', import.meta.url))` syntax. It's known to work with Webpack 5. +The bundler you use must support the `new Worker(new URL('./worker.js', import.meta.url))` syntax. It's known that Webpack 5 works. -It only supports Baseline level 4 codec, but many newer devices default to higher profile/levels. You can limit it by the `codecOptions` option. +### Limit profile/level + +Because it only supports Baseline level 4 codec, but many newer devices default to higher profiles/levels, you can limit it by using the `codecOptions` option: ```ts new ScrcpyOptions1_24({ @@ -27,11 +29,15 @@ new ScrcpyOptions1_24({ }) ``` -However, it will fail on some very old devices that doesn't support Baseline level 4 codec. You can retry without the `codecOptions` option. +However, it can fail on some very old devices that doesn't support even Baseline level 4 codec. You can retry without the `codecOptions` option if that happens. + +### Render the video + +It draws frames onto `decoder.element` (a `` element), you can insert it anywhere you want to display the video. ```ts const decoder = new TinyH264Decoder(); -document.body.appendChild(decoder.element); // It draws frames onto `decoder.element` +document.body.appendChild(decoder.element); videoPacketStream // from `@yume-chan/scrcpy` .pipeTo(decoder.writable) diff --git a/libraries/scrcpy-decoder-webcodecs/README.md b/libraries/scrcpy-decoder-webcodecs/README.md index 7281c036..ea323cc9 100644 --- a/libraries/scrcpy-decoder-webcodecs/README.md +++ b/libraries/scrcpy-decoder-webcodecs/README.md @@ -1,8 +1,8 @@ # @yume-chan/scrcpy-decoder-webcodecs -Decode and render video stream using the [WebCodecs API](https://developer.mozilla.org/en-US/docs/Web/API/WebCodecs_API). +Decode and render H.264 streams using the [WebCodecs API](https://developer.mozilla.org/en-US/docs/Web/API/WebCodecs_API). -It has no dependencies and high performance, but are only available on recent versions of Chrome. +It has no dependencies and high performance, but is only available on recent versions of Chrome. **WARNING:** The public API is UNSTABLE. If you have any questions, please open an issue. @@ -17,9 +17,11 @@ It has no dependencies and high performance, but are only available on recent ve ## Usage +It draws frames onto `decoder.element` (a `` element), you can insert it anywhere you want to display the video. + ```ts const decoder = new WebCodecsDecoder(); -document.body.appendChild(decoder.element); // It draws frames onto `decoder.element` +document.body.appendChild(decoder.element); videoPacketStream // from `@yume-chan/scrcpy` .pipeTo(decoder.writable) From 879ffcbb19fb1e845986218fbc88adfa6ea29baf Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Sat, 12 Nov 2022 20:49:08 +0800 Subject: [PATCH 014/171] chore: upgrade dependencies --- apps/book/package.json | 16 +- apps/demo/package.json | 42 +- .../{manifest.json => manifest.webmanifest} | 1 - apps/demo/src/components/terminal.tsx | 1 + apps/demo/src/pages/_app.tsx | 6 +- common/config/rush/pnpm-config.json | 7 + common/config/rush/pnpm-lock.yaml | 4383 +++++++++++------ common/config/rush/repo-state.json | 2 +- common/scripts/install-run-rush.js | 7 +- common/scripts/install-run.js | 49 +- .../adb-backend-direct-sockets/package.json | 6 +- libraries/adb-backend-webusb/package.json | 8 +- libraries/adb-backend-ws/package.json | 8 +- libraries/adb-credential-web/package.json | 6 +- libraries/adb/package.json | 12 +- libraries/android-bin/package.json | 6 +- libraries/b-tree/package.json | 10 +- .../dataview-bigint-polyfill/package.json | 8 +- libraries/event/package.json | 8 +- .../scrcpy-decoder-tinyh264/package.json | 12 +- .../scrcpy-decoder-webcodecs/package.json | 14 +- libraries/scrcpy/package.json | 10 +- libraries/stream-extra/package.json | 10 +- libraries/struct/package.json | 10 +- rush.json | 173 +- toolchain/ts-package-builder/package.json | 2 +- 26 files changed, 2990 insertions(+), 1827 deletions(-) rename apps/demo/public/{manifest.json => manifest.webmanifest} (82%) create mode 100644 common/config/rush/pnpm-config.json diff --git a/apps/book/package.json b/apps/book/package.json index 734eacb3..ccfe804d 100644 --- a/apps/book/package.json +++ b/apps/book/package.json @@ -15,14 +15,14 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "^2.0.0-beta.21", - "@docusaurus/preset-classic": "^2.0.0-beta.21", - "@mdx-js/react": "^2.1.2", - "@svgr/webpack": "^6.2.1", + "@docusaurus/core": "^2.2.0", + "@docusaurus/preset-classic": "^2.2.0", + "@mdx-js/react": "^2.1.5", + "@svgr/webpack": "^6.5.1", "clsx": "^1.1.1", "file-loader": "^6.2.0", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", "url-loader": "^4.1.1" }, "browserslist": { @@ -38,9 +38,9 @@ ] }, "devDependencies": { - "plantuml-encoder": "^1.4.0", "mini-svg-data-uri": "^1.3.3", - "node-fetch": "^3.2.6", + "node-fetch": "^3.3.0", + "plantuml-encoder": "^1.4.0", "unist-util-visit": "^2.0.3" } } diff --git a/apps/demo/package.json b/apps/demo/package.json index 4403c169..98f00ded 100644 --- a/apps/demo/package.json +++ b/apps/demo/package.json @@ -10,12 +10,12 @@ "lint": "next lint" }, "dependencies": { - "@fluentui/react": "^8.67.2", - "@fluentui/react-file-type-icons": "^8.6.6", - "@fluentui/react-hooks": "^8.5.4", - "@fluentui/react-icons": "^2.0.166-rc.3", - "@fluentui/style-utilities": "^8.6.5", - "@griffel/react": "^1.0.4", + "@fluentui/react": "^8.101.0", + "@fluentui/react-file-type-icons": "^8.8.1", + "@fluentui/react-hooks": "^8.6.13", + "@fluentui/react-icons": "^2.0.187", + "@fluentui/style-utilities": "^8.8.2", + "@griffel/react": "^1.4.2", "@yume-chan/adb": "workspace:^0.0.17", "@yume-chan/adb-backend-direct-sockets": "workspace:^0.0.9", "@yume-chan/adb-backend-webusb": "workspace:^0.0.17", @@ -31,23 +31,23 @@ "@yume-chan/stream-extra": "workspace:^0.0.17", "@yume-chan/stream-saver": "^2.0.6", "@yume-chan/struct": "workspace:^0.0.17", - "mobx": "^6.6.1", + "mobx": "^6.6.2", "mobx-react-lite": "^3.4.0", - "next": "12.2.0", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "xterm": "^4.19.0", - "xterm-addon-fit": "^0.5.0", - "xterm-addon-search": "^0.9.0", - "xterm-addon-webgl": "^0.12.0" + "next": "13.0.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "xterm": "^5.0.0", + "xterm-addon-fit": "^0.6.0", + "xterm-addon-search": "^0.10.0", + "xterm-addon-webgl": "^0.13.0" }, "devDependencies": { - "@mdx-js/loader": "^2.1.2", - "@next/mdx": "^12.2.0", - "@types/react": "17.0.27", - "eslint": "8.19.0", - "eslint-config-next": "12.2.0", - "source-map-loader": "^4.0.0", - "typescript": "^4.7.4" + "@mdx-js/loader": "^2.1.5", + "@next/mdx": "^13.0.3", + "@types/react": "18.0.25", + "eslint": "8.27.0", + "eslint-config-next": "13.0.3", + "source-map-loader": "^4.0.1", + "typescript": "^4.8.4" } } diff --git a/apps/demo/public/manifest.json b/apps/demo/public/manifest.webmanifest similarity index 82% rename from apps/demo/public/manifest.json rename to apps/demo/public/manifest.webmanifest index 7188337c..9952b548 100644 --- a/apps/demo/public/manifest.json +++ b/apps/demo/public/manifest.webmanifest @@ -1,5 +1,4 @@ { - "$schema": "https://json.schemastore.org/web-manifest-combined.json", "background_color": "#ffffff", "categories": [ "utilities" diff --git a/apps/demo/src/components/terminal.tsx b/apps/demo/src/components/terminal.tsx index 2025aa08..0532b891 100644 --- a/apps/demo/src/components/terminal.tsx +++ b/apps/demo/src/components/terminal.tsx @@ -66,6 +66,7 @@ export class AdbTerminal extends AutoDisposable { this.terminal.options.fontFamily = '"Cascadia Code", Consolas, monospace, "Source Han Sans SC", "Microsoft YaHei"'; this.terminal.options.letterSpacing = 1; this.terminal.options.cursorStyle = 'bar'; + this.terminal.options.allowProposedApi = true; this.terminal.loadAddon(this.searchAddon); this.terminal.loadAddon(this.fitAddon); } diff --git a/apps/demo/src/pages/_app.tsx b/apps/demo/src/pages/_app.tsx index 8fe87167..c82a2cf9 100644 --- a/apps/demo/src/pages/_app.tsx +++ b/apps/demo/src/pages/_app.tsx @@ -80,7 +80,7 @@ function NavLink({ link, defaultRender: DefaultRender, ...props }: IComponentAsP } return ( - + ); @@ -120,7 +120,7 @@ function App({ Component, pageProps }: AppProps) { return ( - + @@ -166,7 +166,7 @@ function App({ Component, pageProps }: AppProps) { - + ); } diff --git a/common/config/rush/pnpm-config.json b/common/config/rush/pnpm-config.json new file mode 100644 index 00000000..ff8b0dba --- /dev/null +++ b/common/config/rush/pnpm-config.json @@ -0,0 +1,7 @@ +{ + "$schema": "https://raw.githubusercontent.com/microsoft/rushstack/main/libraries/rush-lib/src/schemas/pnpm-config.schema.json", + "pnpmStore": "global", + "strictPeerDependencies": false, + "useWorkspaces": true, + "preventManualShrinkwrapChanges": true +} diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index a66155a4..b6aa1121 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -7,46 +7,46 @@ importers: ../../apps/book: specifiers: - '@docusaurus/core': ^2.0.0-beta.21 - '@docusaurus/preset-classic': ^2.0.0-beta.21 - '@mdx-js/react': ^2.1.2 - '@svgr/webpack': ^6.2.1 + '@docusaurus/core': ^2.2.0 + '@docusaurus/preset-classic': ^2.2.0 + '@mdx-js/react': ^2.1.5 + '@svgr/webpack': ^6.5.1 clsx: ^1.1.1 file-loader: ^6.2.0 mini-svg-data-uri: ^1.3.3 - node-fetch: ^3.2.6 + node-fetch: ^3.3.0 plantuml-encoder: ^1.4.0 - react: ^17.0.2 - react-dom: ^17.0.2 + react: ^18.2.0 + react-dom: ^18.2.0 unist-util-visit: ^2.0.3 url-loader: ^4.1.1 dependencies: - '@docusaurus/core': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/preset-classic': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@mdx-js/react': 2.1.2_react@17.0.2 - '@svgr/webpack': 6.3.0 + '@docusaurus/core': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/preset-classic': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@mdx-js/react': 2.1.5_react@18.2.0 + '@svgr/webpack': 6.5.1 clsx: 1.2.1 file-loader: 6.2.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 url-loader: 4.1.1_file-loader@6.2.0 devDependencies: mini-svg-data-uri: 1.4.4 - node-fetch: 3.2.9 + node-fetch: 3.3.0 plantuml-encoder: 1.4.0 unist-util-visit: 2.0.3 ../../apps/demo: specifiers: - '@fluentui/react': ^8.67.2 - '@fluentui/react-file-type-icons': ^8.6.6 - '@fluentui/react-hooks': ^8.5.4 - '@fluentui/react-icons': ^2.0.166-rc.3 - '@fluentui/style-utilities': ^8.6.5 - '@griffel/react': ^1.0.4 - '@mdx-js/loader': ^2.1.2 - '@next/mdx': ^12.2.0 - '@types/react': 17.0.27 + '@fluentui/react': ^8.101.0 + '@fluentui/react-file-type-icons': ^8.8.1 + '@fluentui/react-hooks': ^8.6.13 + '@fluentui/react-icons': ^2.0.187 + '@fluentui/style-utilities': ^8.8.2 + '@griffel/react': ^1.4.2 + '@mdx-js/loader': ^2.1.5 + '@next/mdx': ^13.0.3 + '@types/react': 18.0.25 '@yume-chan/adb': workspace:^0.0.17 '@yume-chan/adb-backend-direct-sockets': workspace:^0.0.9 '@yume-chan/adb-backend-webusb': workspace:^0.0.17 @@ -62,26 +62,26 @@ importers: '@yume-chan/stream-extra': workspace:^0.0.17 '@yume-chan/stream-saver': ^2.0.6 '@yume-chan/struct': workspace:^0.0.17 - eslint: 8.19.0 - eslint-config-next: 12.2.0 - mobx: ^6.6.1 + eslint: 8.27.0 + eslint-config-next: 13.0.3 + mobx: ^6.6.2 mobx-react-lite: ^3.4.0 - next: 12.2.0 - react: ^17.0.2 - react-dom: ^17.0.2 - source-map-loader: ^4.0.0 - typescript: ^4.7.4 - xterm: ^4.19.0 - xterm-addon-fit: ^0.5.0 - xterm-addon-search: ^0.9.0 - xterm-addon-webgl: ^0.12.0 - dependencies: - '@fluentui/react': 8.81.1_cktacisfg2p5lpuckvtl5f276a - '@fluentui/react-file-type-icons': 8.6.11_wcklpcar7sgs6afjb4j5aji7wy - '@fluentui/react-hooks': 8.6.1_wcklpcar7sgs6afjb4j5aji7wy - '@fluentui/react-icons': 2.0.176_react@17.0.2 - '@fluentui/style-utilities': 8.7.2_wcklpcar7sgs6afjb4j5aji7wy - '@griffel/react': 1.2.1_react@17.0.2 + next: 13.0.3 + react: ^18.2.0 + react-dom: ^18.2.0 + source-map-loader: ^4.0.1 + typescript: ^4.8.4 + xterm: ^5.0.0 + xterm-addon-fit: ^0.6.0 + xterm-addon-search: ^0.10.0 + xterm-addon-webgl: ^0.13.0 + dependencies: + '@fluentui/react': 8.101.0_2zx2umvpluuhvlq44va5bta2da + '@fluentui/react-file-type-icons': 8.8.1_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/react-hooks': 8.6.13_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/react-icons': 2.0.187_it3lvsvbvb6ccu3ygofv6sq6xa + '@fluentui/style-utilities': 8.8.2_fan5qbzahqtxlm5dzefqlqx5ia + '@griffel/react': 1.4.2_react@18.2.0 '@yume-chan/adb': link:../../libraries/adb '@yume-chan/adb-backend-direct-sockets': link:../../libraries/adb-backend-direct-sockets '@yume-chan/adb-backend-webusb': link:../../libraries/adb-backend-webusb @@ -97,28 +97,28 @@ importers: '@yume-chan/stream-extra': link:../../libraries/stream-extra '@yume-chan/stream-saver': 2.0.6 '@yume-chan/struct': link:../../libraries/struct - mobx: 6.6.1 - mobx-react-lite: 3.4.0_vuaia3cr2ucdrk3q4mauc2kfvi - next: 12.2.0_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - xterm: 4.19.0 - xterm-addon-fit: 0.5.0_xterm@4.19.0 - xterm-addon-search: 0.9.0_xterm@4.19.0 - xterm-addon-webgl: 0.12.0_xterm@4.19.0 + mobx: 6.6.2 + mobx-react-lite: 3.4.0_qrr2ojv4n7h7ey2xj7njerqqr4 + next: 13.0.3_biqbaboplfbrettd7655fr4n2y + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + xterm: 5.0.0 + xterm-addon-fit: 0.6.0_xterm@5.0.0 + xterm-addon-search: 0.10.0_xterm@5.0.0 + xterm-addon-webgl: 0.13.0_xterm@5.0.0 devDependencies: - '@mdx-js/loader': 2.1.2 - '@next/mdx': 12.2.2_@mdx-js+loader@2.1.2 - '@types/react': 17.0.27 - eslint: 8.19.0 - eslint-config-next: 12.2.0_4x5o4skxv6sl53vpwefgt23khm - source-map-loader: 4.0.0 - typescript: 4.7.4 + '@mdx-js/loader': 2.1.5 + '@next/mdx': 13.0.3_@mdx-js+loader@2.1.5 + '@types/react': 18.0.25 + eslint: 8.27.0 + eslint-config-next: 13.0.3_rmayb2veg2btbq6mbmnyivgasy + source-map-loader: 4.0.1 + typescript: 4.8.4 ../../libraries/adb: specifiers: - '@jest/globals': ^28.1.2 - '@types/node': ^17.0.17 + '@jest/globals': ^29.3.1 + '@types/node': ^18.11.9 '@yume-chan/async': ^2.2.0 '@yume-chan/dataview-bigint-polyfill': workspace:^0.0.17 '@yume-chan/event': workspace:^0.0.17 @@ -126,40 +126,40 @@ importers: '@yume-chan/struct': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 cross-env: ^7.0.3 - jest: ^28.1.2 - ts-jest: ^28.0.5 - tslib: ^2.4.0 - typescript: ^4.7.4 + jest: ^29.3.1 + ts-jest: ^29.0.3 + tslib: ^2.4.1 + typescript: ^4.8.4 dependencies: '@yume-chan/async': 2.2.0 '@yume-chan/dataview-bigint-polyfill': link:../dataview-bigint-polyfill '@yume-chan/event': link:../event '@yume-chan/stream-extra': link:../stream-extra '@yume-chan/struct': link:../struct - tslib: 2.4.0 + tslib: 2.4.1 devDependencies: - '@jest/globals': 28.1.3 - '@types/node': 17.0.45 + '@jest/globals': 29.3.1 + '@types/node': 18.11.9 '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder cross-env: 7.0.3 - jest: 28.1.3_@types+node@17.0.45 - ts-jest: 28.0.7_bi2kohzqnxavgozw3csgny5hju - typescript: 4.7.4 + jest: 29.3.1_@types+node@18.11.9 + ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se + typescript: 4.8.4 ../../libraries/adb-backend-direct-sockets: specifiers: '@yume-chan/adb': workspace:^0.0.17 '@yume-chan/stream-extra': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 - tslib: ^2.4.0 - typescript: ^4.7.4 + tslib: ^2.4.1 + typescript: ^4.8.4 dependencies: '@yume-chan/adb': link:../adb '@yume-chan/stream-extra': link:../stream-extra - tslib: 2.4.0 + tslib: 2.4.1 devDependencies: '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder - typescript: 4.7.4 + typescript: 4.8.4 ../../libraries/adb-backend-webusb: specifiers: @@ -168,49 +168,49 @@ importers: '@yume-chan/stream-extra': workspace:^0.0.17 '@yume-chan/struct': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 - jest: ^28.1.2 - tslib: ^2.4.0 - typescript: ^4.7.4 + jest: ^29.3.1 + tslib: ^2.4.1 + typescript: ^4.8.4 dependencies: '@types/w3c-web-usb': 1.0.6 '@yume-chan/adb': link:../adb '@yume-chan/stream-extra': link:../stream-extra '@yume-chan/struct': link:../struct - tslib: 2.4.0 + tslib: 2.4.1 devDependencies: '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder - jest: 28.1.3 - typescript: 4.7.4 + jest: 29.3.1 + typescript: 4.8.4 ../../libraries/adb-backend-ws: specifiers: '@yume-chan/adb': workspace:^0.0.17 '@yume-chan/stream-extra': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 - jest: ^28.1.2 - tslib: ^2.4.0 - typescript: ^4.7.4 + jest: ^29.3.1 + tslib: ^2.4.1 + typescript: ^4.8.4 dependencies: '@yume-chan/adb': link:../adb '@yume-chan/stream-extra': link:../stream-extra - tslib: 2.4.0 + tslib: 2.4.1 devDependencies: '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder - jest: 28.1.3 - typescript: 4.7.4 + jest: 29.3.1 + typescript: 4.8.4 ../../libraries/adb-credential-web: specifiers: '@yume-chan/adb': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 - tslib: ^2.4.0 - typescript: ^4.7.4 + tslib: ^2.4.1 + typescript: ^4.8.4 dependencies: '@yume-chan/adb': link:../adb - tslib: 2.4.0 + tslib: 2.4.1 devDependencies: '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder - typescript: 4.7.4 + typescript: 4.8.4 ../../libraries/android-bin: specifiers: @@ -218,67 +218,67 @@ importers: '@yume-chan/stream-extra': workspace:^0.0.17 '@yume-chan/struct': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 - tslib: ^2.4.0 - typescript: ^4.7.4 + tslib: ^2.4.1 + typescript: ^4.8.4 dependencies: '@yume-chan/adb': link:../adb '@yume-chan/stream-extra': link:../stream-extra '@yume-chan/struct': link:../struct - tslib: 2.4.0 + tslib: 2.4.1 devDependencies: '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder - typescript: 4.7.4 + typescript: 4.8.4 ../../libraries/b-tree: specifiers: - '@jest/globals': ^28.1.2 + '@jest/globals': ^29.3.1 '@yume-chan/ts-package-builder': workspace:^1.0.0 cross-env: ^7.0.3 - jest: ^28.1.2 - ts-jest: ^28.0.5 - tslib: ^2.4.0 - typescript: ^4.7.4 + jest: ^29.3.1 + ts-jest: ^29.0.3 + tslib: ^2.4.1 + typescript: ^4.8.4 dependencies: - tslib: 2.4.0 + tslib: 2.4.1 devDependencies: - '@jest/globals': 28.1.3 + '@jest/globals': 29.3.1 '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder cross-env: 7.0.3 - jest: 28.1.3 - ts-jest: 28.0.7_bi2kohzqnxavgozw3csgny5hju - typescript: 4.7.4 + jest: 29.3.1 + ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se + typescript: 4.8.4 ../../libraries/dataview-bigint-polyfill: specifiers: '@yume-chan/ts-package-builder': workspace:^1.0.0 - jest: ^28.1.2 - tslib: ^2.4.0 - typescript: ^4.7.4 + jest: ^29.3.1 + tslib: ^2.4.1 + typescript: ^4.8.4 dependencies: - tslib: 2.4.0 + tslib: 2.4.1 devDependencies: '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder - jest: 28.1.3 - typescript: 4.7.4 + jest: 29.3.1 + typescript: 4.8.4 ../../libraries/event: specifiers: '@yume-chan/async': ^2.2.0 '@yume-chan/ts-package-builder': workspace:^1.0.0 - jest: ^28.1.2 - tslib: ^2.4.0 - typescript: ^4.7.4 + jest: ^29.3.1 + tslib: ^2.4.1 + typescript: ^4.8.4 dependencies: '@yume-chan/async': 2.2.0 - tslib: 2.4.0 + tslib: 2.4.1 devDependencies: '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder - jest: 28.1.3 - typescript: 4.7.4 + jest: 29.3.1 + typescript: 4.8.4 ../../libraries/scrcpy: specifiers: - '@jest/globals': ^28.1.2 + '@jest/globals': ^29.3.1 '@yume-chan/adb': workspace:^0.0.17 '@yume-chan/async': ^2.2.0 '@yume-chan/event': workspace:^0.0.17 @@ -287,40 +287,40 @@ importers: '@yume-chan/ts-package-builder': workspace:^1.0.0 cross-env: ^7.0.3 gh-release-fetch: ^3.0.2 - jest: ^28.1.2 - ts-jest: ^28.0.5 - tslib: ^2.4.0 - typescript: ^4.7.4 + jest: ^29.3.1 + ts-jest: ^29.0.3 + tslib: ^2.4.1 + typescript: ^4.8.4 dependencies: '@yume-chan/async': 2.2.0 '@yume-chan/event': link:../event '@yume-chan/stream-extra': link:../stream-extra '@yume-chan/struct': link:../struct - tslib: 2.4.0 + tslib: 2.4.1 devDependencies: - '@jest/globals': 28.1.3 + '@jest/globals': 29.3.1 '@yume-chan/adb': link:../adb '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder cross-env: 7.0.3 gh-release-fetch: 3.0.2 - jest: 28.1.3 - ts-jest: 28.0.7_bi2kohzqnxavgozw3csgny5hju - typescript: 4.7.4 + jest: 29.3.1 + ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se + typescript: 4.8.4 ../../libraries/scrcpy-decoder-tinyh264: specifiers: - '@jest/globals': ^28.1.2 + '@jest/globals': ^29.3.1 '@yume-chan/async': ^2.2.0 '@yume-chan/event': workspace:^0.0.17 '@yume-chan/scrcpy': workspace:^0.0.17 '@yume-chan/stream-extra': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 cross-env: ^7.0.3 - jest: ^28.1.2 + jest: ^29.3.1 tinyh264: ^0.0.7 - ts-jest: ^28.0.5 - tslib: ^2.4.0 - typescript: ^4.7.4 + ts-jest: ^29.0.3 + tslib: ^2.4.1 + typescript: ^4.8.4 yuv-buffer: ^1.0.0 yuv-canvas: ^1.2.11 dependencies: @@ -329,96 +329,96 @@ importers: '@yume-chan/scrcpy': link:../scrcpy '@yume-chan/stream-extra': link:../stream-extra tinyh264: 0.0.7 - tslib: 2.4.0 + tslib: 2.4.1 yuv-buffer: 1.0.0 yuv-canvas: 1.2.11 devDependencies: - '@jest/globals': 28.1.3 + '@jest/globals': 29.3.1 '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder cross-env: 7.0.3 - jest: 28.1.3 - ts-jest: 28.0.7_bi2kohzqnxavgozw3csgny5hju - typescript: 4.7.4 + jest: 29.3.1 + ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se + typescript: 4.8.4 ../../libraries/scrcpy-decoder-webcodecs: specifiers: - '@jest/globals': ^28.1.2 - '@types/dom-webcodecs': ^0.1.3 + '@jest/globals': ^29.3.1 + '@types/dom-webcodecs': ^0.1.5 '@yume-chan/scrcpy': workspace:^0.0.17 '@yume-chan/stream-extra': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 cross-env: ^7.0.3 - jest: ^28.1.2 - ts-jest: ^28.0.5 - tslib: ^2.4.0 - typescript: ^4.7.4 + jest: ^29.3.1 + ts-jest: ^29.0.3 + tslib: ^2.4.1 + typescript: ^4.8.4 dependencies: - '@types/dom-webcodecs': 0.1.4 + '@types/dom-webcodecs': 0.1.5 '@yume-chan/scrcpy': link:../scrcpy '@yume-chan/stream-extra': link:../stream-extra - tslib: 2.4.0 + tslib: 2.4.1 devDependencies: - '@jest/globals': 28.1.3 + '@jest/globals': 29.3.1 '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder cross-env: 7.0.3 - jest: 28.1.3 - ts-jest: 28.0.7_bi2kohzqnxavgozw3csgny5hju - typescript: 4.7.4 + jest: 29.3.1 + ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se + typescript: 4.8.4 ../../libraries/stream-extra: specifiers: - '@jest/globals': ^28.1.2 + '@jest/globals': ^29.3.1 '@yume-chan/async': ^2.2.0 '@yume-chan/struct': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 cross-env: ^7.0.3 - jest: ^28.1.2 - ts-jest: ^28.0.5 - tslib: ^2.4.0 - typescript: ^4.7.4 + jest: ^29.3.1 + ts-jest: ^29.0.3 + tslib: ^2.4.1 + typescript: ^4.8.4 web-streams-polyfill: ^4.0.0-beta.3 dependencies: '@yume-chan/async': 2.2.0 '@yume-chan/struct': link:../struct - tslib: 2.4.0 + tslib: 2.4.1 web-streams-polyfill: 4.0.0-beta.3 devDependencies: - '@jest/globals': 28.1.3 + '@jest/globals': 29.3.1 '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder cross-env: 7.0.3 - jest: 28.1.3 - ts-jest: 28.0.7_bi2kohzqnxavgozw3csgny5hju - typescript: 4.7.4 + jest: 29.3.1 + ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se + typescript: 4.8.4 ../../libraries/struct: specifiers: - '@jest/globals': ^28.1.2 + '@jest/globals': ^29.3.1 '@yume-chan/dataview-bigint-polyfill': workspace:^0.0.17 '@yume-chan/ts-package-builder': workspace:^1.0.0 cross-env: ^7.0.3 - jest: ^28.1.2 - ts-jest: ^28.0.5 - tslib: ^2.4.0 - typescript: ^4.7.4 + jest: ^29.3.1 + ts-jest: ^29.0.3 + tslib: ^2.4.1 + typescript: ^4.8.4 dependencies: '@yume-chan/dataview-bigint-polyfill': link:../dataview-bigint-polyfill - tslib: 2.4.0 + tslib: 2.4.1 devDependencies: - '@jest/globals': 28.1.3 + '@jest/globals': 29.3.1 '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder cross-env: 7.0.3 - jest: 28.1.3 - ts-jest: 28.0.7_bi2kohzqnxavgozw3csgny5hju - typescript: 4.7.4 + jest: 29.3.1 + ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se + typescript: 4.8.4 ../../toolchain/ts-package-builder: specifiers: - '@types/node': ^17.0.17 + '@types/node': ^18.11.9 json5: ^2.2.0 dependencies: json5: 2.2.1 devDependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.9 packages: @@ -552,19 +552,24 @@ packages: /@babel/compat-data/7.18.8: resolution: {integrity: sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==} engines: {node: '>=6.9.0'} + dev: false + + /@babel/compat-data/7.20.1: + resolution: {integrity: sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==} + engines: {node: '>=6.9.0'} /@babel/core/7.12.9: resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/generator': 7.18.9 - '@babel/helper-module-transforms': 7.18.9 - '@babel/helpers': 7.18.9 - '@babel/parser': 7.18.9 - '@babel/template': 7.18.6 - '@babel/traverse': 7.18.9 - '@babel/types': 7.18.9 + '@babel/generator': 7.20.4 + '@babel/helper-module-transforms': 7.20.2 + '@babel/helpers': 7.20.1 + '@babel/parser': 7.20.3 + '@babel/template': 7.18.10 + '@babel/traverse': 7.20.1 + '@babel/types': 7.20.2 convert-source-map: 1.8.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -598,6 +603,29 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: false + + /@babel/core/7.20.2: + resolution: {integrity: sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.20.4 + '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2 + '@babel/helper-module-transforms': 7.20.2 + '@babel/helpers': 7.20.1 + '@babel/parser': 7.20.3 + '@babel/template': 7.18.10 + '@babel/traverse': 7.20.1 + '@babel/types': 7.20.2 + convert-source-map: 1.8.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color /@babel/generator/7.18.9: resolution: {integrity: sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==} @@ -606,12 +634,21 @@ packages: '@babel/types': 7.18.9 '@jridgewell/gen-mapping': 0.3.2 jsesc: 2.5.2 + dev: false + + /@babel/generator/7.20.4: + resolution: {integrity: sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.2 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 /@babel/helper-annotate-as-pure/7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.9 + '@babel/types': 7.20.2 dev: false /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: @@ -619,7 +656,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-explode-assignable-expression': 7.18.6 - '@babel/types': 7.18.9 + '@babel/types': 7.20.2 dev: false /@babel/helper-compilation-targets/7.18.9_@babel+core@7.18.9: @@ -633,6 +670,32 @@ packages: '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.2 semver: 6.3.0 + dev: false + + /@babel/helper-compilation-targets/7.20.0_@babel+core@7.18.9: + resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.20.1 + '@babel/core': 7.18.9 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + semver: 6.3.0 + dev: false + + /@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.2: + resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.20.1 + '@babel/core': 7.20.2 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + semver: 6.3.0 /@babel/helper-create-class-features-plugin/7.18.9_@babel+core@7.18.9: resolution: {integrity: sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==} @@ -643,10 +706,28 @@ packages: '@babel/core': 7.18.9 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.18.9 + '@babel/helper-function-name': 7.19.0 '@babel/helper-member-expression-to-functions': 7.18.9 '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.18.9 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-create-class-features-plugin/7.18.9_@babel+core@7.20.2: + resolution: {integrity: sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-member-expression-to-functions': 7.18.9 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.19.1 '@babel/helper-split-export-declaration': 7.18.6 transitivePeerDependencies: - supports-color @@ -663,16 +744,63 @@ packages: regexpu-core: 5.1.0 dev: false - /@babel/helper-define-polyfill-provider/0.3.1_@babel+core@7.18.9: - resolution: {integrity: sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==} + /@babel/helper-create-regexp-features-plugin/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-annotate-as-pure': 7.18.6 + regexpu-core: 5.1.0 + dev: false + + /@babel/helper-create-regexp-features-plugin/7.19.0_@babel+core@7.18.9: + resolution: {integrity: sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.9 + '@babel/helper-annotate-as-pure': 7.18.6 + regexpu-core: 5.1.0 + dev: false + + /@babel/helper-create-regexp-features-plugin/7.19.0_@babel+core@7.20.2: + resolution: {integrity: sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-annotate-as-pure': 7.18.6 + regexpu-core: 5.1.0 + dev: false + + /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.18.9: + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.9 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/traverse': 7.18.9 + '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.20.2: + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2 + '@babel/helper-plugin-utils': 7.20.2 debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.1 @@ -689,7 +817,7 @@ packages: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.9 + '@babel/types': 7.20.2 dev: false /@babel/helper-function-name/7.18.9: @@ -698,6 +826,14 @@ packages: dependencies: '@babel/template': 7.18.6 '@babel/types': 7.18.9 + dev: false + + /@babel/helper-function-name/7.19.0: + resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.10 + '@babel/types': 7.20.2 /@babel/helper-hoist-variables/7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} @@ -709,7 +845,7 @@ packages: resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.9 + '@babel/types': 7.20.2 dev: false /@babel/helper-module-imports/7.18.6: @@ -732,12 +868,28 @@ packages: '@babel/types': 7.18.9 transitivePeerDependencies: - supports-color + dev: false + + /@babel/helper-module-transforms/7.20.2: + resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.20.2 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.18.10 + '@babel/traverse': 7.20.1 + '@babel/types': 7.20.2 + transitivePeerDependencies: + - supports-color /@babel/helper-optimise-call-expression/7.18.6: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.9 + '@babel/types': 7.20.2 dev: false /@babel/helper-plugin-utils/7.10.4: @@ -748,6 +900,10 @@ packages: resolution: {integrity: sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==} engines: {node: '>=6.9.0'} + /@babel/helper-plugin-utils/7.20.2: + resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} + engines: {node: '>=6.9.0'} + /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.18.9: resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} @@ -758,7 +914,22 @@ packages: '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-wrap-function': 7.18.9 - '@babel/types': 7.18.9 + '@babel/types': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.20.2: + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-wrap-function': 7.18.9 + '@babel/types': 7.20.2 transitivePeerDependencies: - supports-color dev: false @@ -770,8 +941,21 @@ packages: '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-member-expression-to-functions': 7.18.9 '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/traverse': 7.18.9 - '@babel/types': 7.18.9 + '@babel/traverse': 7.20.1 + '@babel/types': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-replace-supers/7.19.1: + resolution: {integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-member-expression-to-functions': 7.18.9 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/traverse': 7.20.1 + '@babel/types': 7.20.2 transitivePeerDependencies: - supports-color dev: false @@ -781,12 +965,19 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.18.9 + dev: false + + /@babel/helper-simple-access/7.20.2: + resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.2 /@babel/helper-skip-transparent-expression-wrappers/7.18.9: resolution: {integrity: sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.9 + '@babel/types': 7.20.2 dev: false /@babel/helper-split-export-declaration/7.18.6: @@ -795,10 +986,18 @@ packages: dependencies: '@babel/types': 7.18.9 + /@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier/7.18.6: resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-option/7.18.6: resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} engines: {node: '>=6.9.0'} @@ -807,10 +1006,10 @@ packages: resolution: {integrity: sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.18.9 - '@babel/template': 7.18.6 - '@babel/traverse': 7.18.9 - '@babel/types': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/template': 7.18.10 + '@babel/traverse': 7.20.1 + '@babel/types': 7.20.2 transitivePeerDependencies: - supports-color dev: false @@ -824,6 +1023,17 @@ packages: '@babel/types': 7.18.9 transitivePeerDependencies: - supports-color + dev: false + + /@babel/helpers/7.20.1: + resolution: {integrity: sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.10 + '@babel/traverse': 7.20.1 + '@babel/types': 7.20.2 + transitivePeerDependencies: + - supports-color /@babel/highlight/7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} @@ -839,6 +1049,14 @@ packages: hasBin: true dependencies: '@babel/types': 7.18.9 + dev: false + + /@babel/parser/7.20.3: + resolution: {integrity: sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.20.2 /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.18.9: resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} @@ -847,7 +1065,17 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.18.9: @@ -857,26 +1085,53 @@ packages: '@babel/core': ^7.13.0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.18.9 dev: false - /@babel/plugin-proposal-async-generator-functions/7.18.6_@babel+core@7.18.9: - resolution: {integrity: sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==} + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.20.2: + resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.20.2 + dev: false + + /@babel/plugin-proposal-async-generator-functions/7.20.1_@babel+core@7.18.9: + resolution: {integrity: sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.18.9 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.18.9 transitivePeerDependencies: - supports-color dev: false + /@babel/plugin-proposal-async-generator-functions/7.20.1_@babel+core@7.20.2: + resolution: {integrity: sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.2 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.2 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.18.9: resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} @@ -885,7 +1140,20 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.20.2 + '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: false @@ -898,12 +1166,26 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.18.9 transitivePeerDependencies: - supports-color dev: false + /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.2 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.18.9: resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} @@ -911,10 +1193,21 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.18.9 dev: false + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.2 + dev: false + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.18.9: resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} @@ -922,10 +1215,21 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.18.9 dev: false + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.20.2: + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.2 + dev: false + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.18.9: resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} @@ -933,10 +1237,21 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.18.9 dev: false + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.2 + dev: false + /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.18.9: resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} engines: {node: '>=6.9.0'} @@ -944,10 +1259,21 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.18.9 dev: false + /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.20.2: + resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.2 + dev: false + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.18.9: resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} @@ -955,44 +1281,80 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.18.9 dev: false - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.18.9: + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.2 + dev: false + + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.18.9: resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.18.9 dev: false + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.2 + dev: false + /@babel/plugin-proposal-object-rest-spread/7.12.1_@babel+core@7.12.9: resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.10.4 + '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 + '@babel/plugin-transform-parameters': 7.20.3_@babel+core@7.12.9 dev: false - /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.18.9: - resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} + /@babel/plugin-proposal-object-rest-spread/7.20.2_@babel+core@7.18.9: + resolution: {integrity: sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.18.8 + '@babel/compat-data': 7.20.1 '@babel/core': 7.18.9 - '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.18.9 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.18.9 + '@babel/plugin-transform-parameters': 7.20.3_@babel+core@7.18.9 + dev: false + + /@babel/plugin-proposal-object-rest-spread/7.20.2_@babel+core@7.20.2: + resolution: {integrity: sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.20.1 + '@babel/core': 7.20.2 + '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-transform-parameters': 7.20.3_@babel+core@7.20.2 dev: false /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.18.9: @@ -1002,10 +1364,21 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.18.9 dev: false + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.2 + dev: false + /@babel/plugin-proposal-optional-chaining/7.18.9_@babel+core@7.18.9: resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==} engines: {node: '>=6.9.0'} @@ -1013,11 +1386,23 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.18.9 dev: false + /@babel/plugin-proposal-optional-chaining/7.18.9_@babel+core@7.20.2: + resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.2 + dev: false + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.18.9: resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -1026,7 +1411,20 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.20.2 + '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: false @@ -1040,12 +1438,27 @@ packages: '@babel/core': 7.18.9 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.18.9 transitivePeerDependencies: - supports-color dev: false + /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.2 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.18.9: resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} @@ -1054,7 +1467,18 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.18.9: @@ -1064,14 +1488,23 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 + dev: false - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.18.9: - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.2: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.18.9 + + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.20.2: + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: true /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.18.9: @@ -1081,6 +1514,15 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 + dev: false + + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.2: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.18.9 /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.18.9: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} @@ -1089,7 +1531,17 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.20.2: + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.18.9: @@ -1098,7 +1550,16 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.20.2: + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.18.9: @@ -1107,26 +1568,45 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-syntax-import-assertions/7.18.6_@babel+core@7.18.9: - resolution: {integrity: sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==} + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.20.2: + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.18.9: + resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.20.2: + resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.18.9: + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.20.2: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: true /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.18.9: @@ -1136,6 +1616,15 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 + dev: false + + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.2: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.18.9 /@babel/plugin-syntax-jsx/7.12.1_@babel+core@7.12.9: resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} @@ -1143,7 +1632,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.18.9: @@ -1153,9 +1642,18 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 dev: false + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.18.9: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -1163,6 +1661,15 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 + dev: false + + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.2: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.18.9 /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.18.9: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -1171,6 +1678,15 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 + dev: false + + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.2: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.18.9 /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.18.9: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} @@ -1179,6 +1695,15 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 + dev: false + + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.2: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.18.9 /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} @@ -1196,6 +1721,15 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 + dev: false + + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.2: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.18.9 /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.18.9: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} @@ -1204,6 +1738,15 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 + dev: false + + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.2: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.18.9 /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.18.9: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} @@ -1212,6 +1755,15 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 + dev: false + + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.2: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.18.9 /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.18.9: resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} @@ -1220,7 +1772,17 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.20.2: + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.18.9: @@ -1231,6 +1793,16 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 + dev: false + + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.2: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.18.9 /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.18.9: resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==} @@ -1240,6 +1812,16 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-plugin-utils': 7.18.9 + dev: false + + /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.18.9 /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.18.9: resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} @@ -1248,7 +1830,17 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.18.9: @@ -1259,12 +1851,26 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.18.9 transitivePeerDependencies: - supports-color dev: false + /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.2 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.18.9: resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} @@ -1272,32 +1878,73 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.18.9: - resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} + /@babel/plugin-transform-block-scoping/7.20.2_@babel+core@7.18.9: + resolution: {integrity: sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-block-scoping/7.20.2_@babel+core@7.20.2: + resolution: {integrity: sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-classes/7.18.9_@babel+core@7.18.9: - resolution: {integrity: sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==} + /@babel/plugin-transform-classes/7.20.2_@babel+core@7.18.9: + resolution: {integrity: sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.18.9 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.18.9 + '@babel/helper-function-name': 7.19.0 '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-replace-supers': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-classes/7.20.2_@babel+core@7.20.2: + resolution: {integrity: sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.19.1 '@babel/helper-split-export-declaration': 7.18.6 globals: 11.12.0 transitivePeerDependencies: @@ -1311,17 +1958,37 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-destructuring/7.18.9_@babel+core@7.18.9: - resolution: {integrity: sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==} + /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.20.2: + resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-destructuring/7.20.2_@babel+core@7.18.9: + resolution: {integrity: sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-destructuring/7.20.2_@babel+core@7.20.2: + resolution: {integrity: sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.18.9: @@ -1332,7 +1999,18 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.18.9: @@ -1342,7 +2020,17 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.20.2: + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.18.9: @@ -1353,7 +2041,18 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.18.9: @@ -1363,7 +2062,17 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.20.2: + resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.18.9: @@ -1373,9 +2082,21 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.9 + '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.18.9 '@babel/helper-function-name': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.20.2: + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2 + '@babel/helper-function-name': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-transform-literals/7.18.9_@babel+core@7.18.9: @@ -1385,7 +2106,17 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.20.2: + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.18.9: @@ -1395,149 +2126,275 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.18.9: - resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-modules-amd/7.19.6_@babel+core@7.18.9: + resolution: {integrity: sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-module-transforms': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 - babel-plugin-dynamic-import-node: 2.3.3 + '@babel/helper-module-transforms': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.18.9: - resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} + /@babel/plugin-transform-modules-amd/7.19.6_@babel+core@7.20.2: + resolution: {integrity: sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-module-transforms': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-modules-commonjs/7.19.6_@babel+core@7.18.9: + resolution: {integrity: sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-module-transforms': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-simple-access': 7.18.6 - babel-plugin-dynamic-import-node: 2.3.3 + '@babel/helper-module-transforms': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-simple-access': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-modules-commonjs/7.19.6_@babel+core@7.20.2: + resolution: {integrity: sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-module-transforms': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-simple-access': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-modules-systemjs/7.19.6_@babel+core@7.18.9: + resolution: {integrity: sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.9 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-identifier': 7.19.1 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-modules-systemjs/7.18.9_@babel+core@7.18.9: - resolution: {integrity: sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==} + /@babel/plugin-transform-modules-systemjs/7.19.6_@babel+core@7.20.2: + resolution: {integrity: sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-identifier': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.18.9: + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.9 + '@babel/helper-module-transforms': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-module-transforms': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.18.9: + resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.9 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.20.2: + resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.18.9: + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.18.9: + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-validator-identifier': 7.18.6 - babel-plugin-dynamic-import-node: 2.3.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.18.9 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.18.9: - resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 - '@babel/helper-module-transforms': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.18.9 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-named-capturing-groups-regex/7.18.6_@babel+core@7.18.9: - resolution: {integrity: sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==} + /@babel/plugin-transform-parameters/7.20.3_@babel+core@7.12.9: + resolution: {integrity: sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 - '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.18.9: - resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + /@babel/plugin-transform-parameters/7.20.3_@babel+core@7.18.9: + resolution: {integrity: sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.18.9: - resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + /@babel/plugin-transform-parameters/7.20.3_@babel+core@7.20.2: + resolution: {integrity: sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-replace-supers': 7.18.9 - transitivePeerDependencies: - - supports-color + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-parameters/7.18.8_@babel+core@7.12.9: - resolution: {integrity: sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==} + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.18.9: + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/core': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-parameters/7.18.8_@babel+core@7.18.9: - resolution: {integrity: sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==} + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.18.9: - resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + /@babel/plugin-transform-react-constant-elements/7.20.2_@babel+core@7.20.2: + resolution: {integrity: sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-react-constant-elements/7.18.9_@babel+core@7.18.9: - resolution: {integrity: sha512-IrTYh1I3YCEL1trjknnlLKTp5JggjzhKl/d3ibzPc97JhpFcDTr38Jdek/oX4cFbS6By0bXJcOkpRvJ5ZHK2wQ==} + /@babel/plugin-transform-react-display-name/7.18.6_@babel+core@7.18.9: + resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-react-display-name/7.18.6_@babel+core@7.18.9: + /@babel/plugin-transform-react-display-name/7.18.6_@babel+core@7.20.2: resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.18.9: @@ -1550,6 +2407,16 @@ packages: '@babel/plugin-transform-react-jsx': 7.18.6_@babel+core@7.18.9 dev: false + /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/plugin-transform-react-jsx': 7.18.6_@babel+core@7.20.2 + dev: false + /@babel/plugin-transform-react-jsx/7.18.6_@babel+core@7.18.9: resolution: {integrity: sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==} engines: {node: '>=6.9.0'} @@ -1559,9 +2426,23 @@ packages: '@babel/core': 7.18.9 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.18.9 - '@babel/types': 7.18.9 + '@babel/types': 7.20.2 + dev: false + + /@babel/plugin-transform-react-jsx/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.2 + '@babel/types': 7.20.2 dev: false /@babel/plugin-transform-react-pure-annotations/7.18.6_@babel+core@7.18.9: @@ -1572,7 +2453,18 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-react-pure-annotations/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.18.9: @@ -1582,7 +2474,18 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + regenerator-transform: 0.15.0 + dev: false + + /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 regenerator-transform: 0.15.0 dev: false @@ -1593,7 +2496,17 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-transform-runtime/7.18.9_@babel+core@7.18.9: @@ -1604,8 +2517,8 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.18.9 - babel-plugin-polyfill-corejs2: 0.3.1_@babel+core@7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.18.9 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.18.9 babel-plugin-polyfill-regenerator: 0.3.1_@babel+core@7.18.9 semver: 6.3.0 @@ -1620,17 +2533,38 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false - /@babel/plugin-transform-spread/7.18.9_@babel+core@7.18.9: - resolution: {integrity: sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==} + /@babel/plugin-transform-spread/7.19.0_@babel+core@7.18.9: + resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + dev: false + + /@babel/plugin-transform-spread/7.19.0_@babel+core@7.20.2: + resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 dev: false @@ -1641,7 +2575,17 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.18.9: @@ -1651,7 +2595,17 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.20.2: + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.18.9: @@ -1661,7 +2615,17 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.20.2: + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-transform-typescript/7.18.8_@babel+core@7.18.9: @@ -1672,20 +2636,44 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.18.9 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-unicode-escapes/7.18.6_@babel+core@7.18.9: - resolution: {integrity: sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==} + /@babel/plugin-transform-typescript/7.18.8_@babel+core@7.20.2: + resolution: {integrity: sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.20.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.18.9: + resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.20.2: + resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.18.9: @@ -1696,7 +2684,18 @@ packages: dependencies: '@babel/core': 7.18.9 '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: false + + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.20.2 + '@babel/helper-plugin-utils': 7.20.2 dev: false /@babel/preset-env/7.18.9_@babel+core@7.18.9: @@ -1705,14 +2704,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.18.8 + '@babel/compat-data': 7.20.1 '@babel/core': 7.18.9 - '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.18.6 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.18.9 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.18.9 - '@babel/plugin-proposal-async-generator-functions': 7.18.6_@babel+core@7.18.9 + '@babel/plugin-proposal-async-generator-functions': 7.20.1_@babel+core@7.18.9 '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.18.9 '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.18.9 '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.18.9 @@ -1721,7 +2720,7 @@ packages: '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.18.9 '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.18.9 '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.18.9 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.18.9 + '@babel/plugin-proposal-object-rest-spread': 7.20.2_@babel+core@7.18.9 '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.18.9 '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.18.9 '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.18.9 @@ -1732,7 +2731,7 @@ packages: '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.18.9 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.18.9 '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.18.9 - '@babel/plugin-syntax-import-assertions': 7.18.6_@babel+core@7.18.9 + '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.18.9 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.18.9 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.18.9 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.18.9 @@ -1745,10 +2744,10 @@ packages: '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.18.9 '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.18.9 '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.18.9 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.18.9 - '@babel/plugin-transform-classes': 7.18.9_@babel+core@7.18.9 + '@babel/plugin-transform-block-scoping': 7.20.2_@babel+core@7.18.9 + '@babel/plugin-transform-classes': 7.20.2_@babel+core@7.18.9 '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.18.9 - '@babel/plugin-transform-destructuring': 7.18.9_@babel+core@7.18.9 + '@babel/plugin-transform-destructuring': 7.20.2_@babel+core@7.18.9 '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.18.9 '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.18.9 '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.18.9 @@ -1756,30 +2755,116 @@ packages: '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.18.9 '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.18.9 '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.18.9 - '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.18.9 - '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.18.9 - '@babel/plugin-transform-modules-systemjs': 7.18.9_@babel+core@7.18.9 + '@babel/plugin-transform-modules-amd': 7.19.6_@babel+core@7.18.9 + '@babel/plugin-transform-modules-commonjs': 7.19.6_@babel+core@7.18.9 + '@babel/plugin-transform-modules-systemjs': 7.19.6_@babel+core@7.18.9 '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.18.9 - '@babel/plugin-transform-named-capturing-groups-regex': 7.18.6_@babel+core@7.18.9 + '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.18.9 '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.18.9 '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.18.9 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.18.9 + '@babel/plugin-transform-parameters': 7.20.3_@babel+core@7.18.9 '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.18.9 '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.18.9 '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.18.9 '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.18.9 - '@babel/plugin-transform-spread': 7.18.9_@babel+core@7.18.9 + '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.18.9 '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.18.9 '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.18.9 '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.18.9 - '@babel/plugin-transform-unicode-escapes': 7.18.6_@babel+core@7.18.9 + '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.18.9 '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.18.9 '@babel/preset-modules': 0.1.5_@babel+core@7.18.9 - '@babel/types': 7.18.9 - babel-plugin-polyfill-corejs2: 0.3.1_@babel+core@7.18.9 + '@babel/types': 7.20.2 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.18.9 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.18.9 babel-plugin-polyfill-regenerator: 0.3.1_@babel+core@7.18.9 - core-js-compat: 3.23.5 + core-js-compat: 3.26.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/preset-env/7.20.2_@babel+core@7.20.2: + resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.20.1 + '@babel/core': 7.20.2 + '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.20.2 + '@babel/plugin-proposal-async-generator-functions': 7.20.1_@babel+core@7.20.2 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.20.2 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.20.2 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-proposal-object-rest-spread': 7.20.2_@babel+core@7.20.2 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.20.2 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.2 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.2 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.2 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.20.2 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.2 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.2 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.2 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.2 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-block-scoping': 7.20.2_@babel+core@7.20.2 + '@babel/plugin-transform-classes': 7.20.2_@babel+core@7.20.2 + '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.20.2 + '@babel/plugin-transform-destructuring': 7.20.2_@babel+core@7.20.2 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.20.2 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.20.2 + '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.20.2 + '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.20.2 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-modules-amd': 7.19.6_@babel+core@7.20.2 + '@babel/plugin-transform-modules-commonjs': 7.19.6_@babel+core@7.20.2 + '@babel/plugin-transform-modules-systemjs': 7.19.6_@babel+core@7.20.2 + '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.20.2 + '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-parameters': 7.20.3_@babel+core@7.20.2 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.20.2 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.20.2 + '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.20.2 + '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.20.2 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.20.2 + '@babel/preset-modules': 0.1.5_@babel+core@7.20.2 + '@babel/types': 7.20.2 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.2 + babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.2 + babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.2 + core-js-compat: 3.26.0 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -1791,10 +2876,23 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.18.9 '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.18.9 - '@babel/types': 7.18.9 + '@babel/types': 7.20.2 + esutils: 2.0.3 + dev: false + + /@babel/preset-modules/0.1.5_@babel+core@7.20.2: + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.2 + '@babel/types': 7.20.2 esutils: 2.0.3 dev: false @@ -1805,7 +2903,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.18.6 '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.18.9 '@babel/plugin-transform-react-jsx': 7.18.6_@babel+core@7.18.9 @@ -1813,6 +2911,21 @@ packages: '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.18.9 dev: false + /@babel/preset-react/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-react-jsx': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.20.2 + dev: false + /@babel/preset-typescript/7.18.6_@babel+core@7.18.9: resolution: {integrity: sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==} engines: {node: '>=6.9.0'} @@ -1827,6 +2940,20 @@ packages: - supports-color dev: false + /@babel/preset-typescript/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-transform-typescript': 7.18.8_@babel+core@7.20.2 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/runtime-corejs3/7.18.9: resolution: {integrity: sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==} engines: {node: '>=6.9.0'} @@ -1840,6 +2967,14 @@ packages: dependencies: regenerator-runtime: 0.13.9 + /@babel/template/7.18.10: + resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.20.3 + '@babel/types': 7.20.2 + /@babel/template/7.18.6: resolution: {integrity: sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==} engines: {node: '>=6.9.0'} @@ -1847,6 +2982,7 @@ packages: '@babel/code-frame': 7.18.6 '@babel/parser': 7.18.9 '@babel/types': 7.18.9 + dev: false /@babel/traverse/7.18.9: resolution: {integrity: sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==} @@ -1864,6 +3000,24 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color + dev: false + + /@babel/traverse/7.20.1: + resolution: {integrity: sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.20.4 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.20.3 + '@babel/types': 7.20.2 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color /@babel/types/7.18.9: resolution: {integrity: sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==} @@ -1872,6 +3026,14 @@ packages: '@babel/helper-validator-identifier': 7.18.6 to-fast-properties: 2.0.0 + /@babel/types/7.20.2: + resolution: {integrity: sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + /@bcoe/v8-coverage/0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true @@ -1887,7 +3049,7 @@ packages: resolution: {integrity: sha512-utLgg7E1agqQeqCJn05DWC7XXMk4tMUUnL7MZupcknRu2OzGN13qwey2qA/0NAKkVBGugiWtON0+rlU0QIPojg==} dev: false - /@docsearch/react/3.1.1_sfoxds7t5ydpegc3knd667wn6m: + /@docsearch/react/3.1.1_biqbaboplfbrettd7655fr4n2y: resolution: {integrity: sha512-cfoql4qvtsVRqBMYxhlGNpvyy/KlCoPqjIsJSZYqYf9AplZncKjLBTcwBu6RXFMVCe30cIFljniI4OjqAU67pQ==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' @@ -1898,14 +3060,14 @@ packages: '@algolia/autocomplete-preset-algolia': 1.7.1_algoliasearch@4.14.0 '@docsearch/css': 3.1.1 algoliasearch: 4.14.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 transitivePeerDependencies: - '@algolia/client-search' dev: false - /@docusaurus/core/2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq: - resolution: {integrity: sha512-b9FX0Z+EddfQ6wAiNh+Wx4fysKfcvEcWJrZ5USROn3C+EVU5P4luaa8mwWK//O+hTwD9ur7/A44IZ/tWCTAoLQ==} + /@docusaurus/core/2.2.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-Vd6XOluKQqzG12fEs9prJgDtyn6DPok9vmUWDR2E6/nV5Fl9SVkhEQOBxwObjk3kQh7OY7vguFaLh0jqdApWsA==} engines: {node: '>=16.14'} hasBin: true peerDependencies: @@ -1922,15 +3084,15 @@ packages: '@babel/runtime': 7.18.9 '@babel/runtime-corejs3': 7.18.9 '@babel/traverse': 7.18.9 - '@docusaurus/cssnano-preset': 2.0.0-rc.1 - '@docusaurus/logger': 2.0.0-rc.1 - '@docusaurus/mdx-loader': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/react-loadable': 5.5.2_react@17.0.2 - '@docusaurus/utils': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm - '@docusaurus/utils-common': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm - '@docusaurus/utils-validation': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm + '@docusaurus/cssnano-preset': 2.2.0 + '@docusaurus/logger': 2.2.0 + '@docusaurus/mdx-loader': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/react-loadable': 5.5.2_react@18.2.0 + '@docusaurus/utils': 2.2.0 + '@docusaurus/utils-common': 2.2.0 + '@docusaurus/utils-validation': 2.2.0 '@slorber/static-site-generator-webpack-plugin': 4.0.7 - '@svgr/webpack': 6.3.0 + '@svgr/webpack': 6.5.1 autoprefixer: 10.4.7_postcss@8.4.14 babel-loader: 8.2.5_sqoqrlbh4fciq6urcohea2fb5a babel-plugin-dynamic-import-node: 2.3.3 @@ -1962,21 +3124,21 @@ packages: postcss: 8.4.14 postcss-loader: 7.0.1_mepnsno3xmng6eyses4tepu7bu prompts: 2.4.2 - react: 17.0.2 + react: 18.2.0 react-dev-utils: 12.0.1_webpack@5.73.0 - react-dom: 17.0.2_react@17.0.2 - react-helmet-async: 1.3.0_sfoxds7t5ydpegc3knd667wn6m - react-loadable: /@docusaurus/react-loadable/5.5.2_react@17.0.2 + react-dom: 18.2.0_react@18.2.0 + react-helmet-async: 1.3.0_biqbaboplfbrettd7655fr4n2y + react-loadable: /@docusaurus/react-loadable/5.5.2_react@18.2.0 react-loadable-ssr-addon-v5-slorber: 1.0.1_pobh4rnr4unizsdzh3gmmsgqtu - react-router: 5.3.3_react@17.0.2 - react-router-config: 5.1.1_oyuskl3t7voyrff2xstzuy4hqu - react-router-dom: 5.3.3_react@17.0.2 + react-router: 5.3.3_react@18.2.0 + react-router-config: 5.1.1_4gumyfmpzq3vvokmq4lwan2qpu + react-router-dom: 5.3.3_react@18.2.0 rtl-detect: 1.0.4 semver: 7.3.7 serve-handler: 6.1.3 shelljs: 0.8.5 terser-webpack-plugin: 5.3.3_webpack@5.73.0 - tslib: 2.4.0 + tslib: 2.4.1 update-notifier: 5.1.0 url-loader: 4.1.1_ljnyroaqobwke7fusd7ro2cgzm wait-on: 6.0.1 @@ -2002,8 +3164,8 @@ packages: - webpack-cli dev: false - /@docusaurus/core/2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-b9FX0Z+EddfQ6wAiNh+Wx4fysKfcvEcWJrZ5USROn3C+EVU5P4luaa8mwWK//O+hTwD9ur7/A44IZ/tWCTAoLQ==} + /@docusaurus/core/2.2.0_if65ga6ul5jnw5c4373drfty5m: + resolution: {integrity: sha512-Vd6XOluKQqzG12fEs9prJgDtyn6DPok9vmUWDR2E6/nV5Fl9SVkhEQOBxwObjk3kQh7OY7vguFaLh0jqdApWsA==} engines: {node: '>=16.14'} hasBin: true peerDependencies: @@ -2020,15 +3182,15 @@ packages: '@babel/runtime': 7.18.9 '@babel/runtime-corejs3': 7.18.9 '@babel/traverse': 7.18.9 - '@docusaurus/cssnano-preset': 2.0.0-rc.1 - '@docusaurus/logger': 2.0.0-rc.1 - '@docusaurus/mdx-loader': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/react-loadable': 5.5.2_react@17.0.2 - '@docusaurus/utils': 2.0.0-rc.1 - '@docusaurus/utils-common': 2.0.0-rc.1 - '@docusaurus/utils-validation': 2.0.0-rc.1 + '@docusaurus/cssnano-preset': 2.2.0 + '@docusaurus/logger': 2.2.0 + '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/react-loadable': 5.5.2_react@18.2.0 + '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/utils-common': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 '@slorber/static-site-generator-webpack-plugin': 4.0.7 - '@svgr/webpack': 6.3.0 + '@svgr/webpack': 6.5.1 autoprefixer: 10.4.7_postcss@8.4.14 babel-loader: 8.2.5_sqoqrlbh4fciq6urcohea2fb5a babel-plugin-dynamic-import-node: 2.3.3 @@ -2060,21 +3222,21 @@ packages: postcss: 8.4.14 postcss-loader: 7.0.1_mepnsno3xmng6eyses4tepu7bu prompts: 2.4.2 - react: 17.0.2 + react: 18.2.0 react-dev-utils: 12.0.1_webpack@5.73.0 - react-dom: 17.0.2_react@17.0.2 - react-helmet-async: 1.3.0_sfoxds7t5ydpegc3knd667wn6m - react-loadable: /@docusaurus/react-loadable/5.5.2_react@17.0.2 + react-dom: 18.2.0_react@18.2.0 + react-helmet-async: 1.3.0_biqbaboplfbrettd7655fr4n2y + react-loadable: /@docusaurus/react-loadable/5.5.2_react@18.2.0 react-loadable-ssr-addon-v5-slorber: 1.0.1_pobh4rnr4unizsdzh3gmmsgqtu - react-router: 5.3.3_react@17.0.2 - react-router-config: 5.1.1_oyuskl3t7voyrff2xstzuy4hqu - react-router-dom: 5.3.3_react@17.0.2 + react-router: 5.3.3_react@18.2.0 + react-router-config: 5.1.1_4gumyfmpzq3vvokmq4lwan2qpu + react-router-dom: 5.3.3_react@18.2.0 rtl-detect: 1.0.4 semver: 7.3.7 serve-handler: 6.1.3 shelljs: 0.8.5 terser-webpack-plugin: 5.3.3_webpack@5.73.0 - tslib: 2.4.0 + tslib: 2.4.1 update-notifier: 5.1.0 url-loader: 4.1.1_ljnyroaqobwke7fusd7ro2cgzm wait-on: 6.0.1 @@ -2100,46 +3262,46 @@ packages: - webpack-cli dev: false - /@docusaurus/cssnano-preset/2.0.0-rc.1: - resolution: {integrity: sha512-9/KmQvF+eTlMqUqG6UcXbRgxbGed/8bQInXuKEs+95/jI6jO/3xSzuRwuHHHP0naUvSVWjnNI9jngPrQerXE5w==} + /@docusaurus/cssnano-preset/2.2.0: + resolution: {integrity: sha512-mAAwCo4n66TMWBH1kXnHVZsakW9VAXJzTO4yZukuL3ro4F+JtkMwKfh42EG75K/J/YIFQG5I/Bzy0UH/hFxaTg==} engines: {node: '>=16.14'} dependencies: cssnano-preset-advanced: 5.3.8_postcss@8.4.14 postcss: 8.4.14 postcss-sort-media-queries: 4.2.1_postcss@8.4.14 - tslib: 2.4.0 + tslib: 2.4.1 dev: false - /@docusaurus/logger/2.0.0-rc.1: - resolution: {integrity: sha512-daa3g+SXuO9K60PVMiSUmDEK9Vro+Ed7i7uF8CH6QQJLcNZy/zJc0Xz62eH7ip1x77fmeb6Rg4Us1TqTFc9AbQ==} + /@docusaurus/logger/2.2.0: + resolution: {integrity: sha512-DF3j1cA5y2nNsu/vk8AG7xwpZu6f5MKkPPMaaIbgXLnWGfm6+wkOeW7kNrxnM95YOhKUkJUophX69nGUnLsm0A==} engines: {node: '>=16.14'} dependencies: chalk: 4.1.2 - tslib: 2.4.0 + tslib: 2.4.1 dev: false - /@docusaurus/mdx-loader/2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq: - resolution: {integrity: sha512-8Fg0c/ceu39knmr7w0dutm7gq3YxKYCqWVS2cB/cPATzChCCNH/AGLfBT6sz/Z4tjVXE+NyREq2pfOFvkhjVXg==} + /@docusaurus/mdx-loader/2.2.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-X2bzo3T0jW0VhUU+XdQofcEeozXOTmKQMvc8tUnWRdTnCvj4XEcBVdC3g+/jftceluiwSTNRAX4VBOJdNt18jA==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@babel/parser': 7.18.9 - '@babel/traverse': 7.18.9 - '@docusaurus/logger': 2.0.0-rc.1 - '@docusaurus/utils': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm + '@babel/parser': 7.20.3 + '@babel/traverse': 7.20.1 + '@docusaurus/logger': 2.2.0 + '@docusaurus/utils': 2.2.0 '@mdx-js/mdx': 1.6.22 escape-html: 1.0.3 file-loader: 6.2.0_webpack@5.73.0 fs-extra: 10.1.0 image-size: 1.0.2 mdast-util-to-string: 2.0.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 remark-emoji: 2.2.0 stringify-object: 3.3.0 - tslib: 2.4.0 + tslib: 2.4.1 unified: 9.2.2 unist-util-visit: 2.0.3 url-loader: 4.1.1_ljnyroaqobwke7fusd7ro2cgzm @@ -2153,28 +3315,28 @@ packages: - webpack-cli dev: false - /@docusaurus/mdx-loader/2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-8Fg0c/ceu39knmr7w0dutm7gq3YxKYCqWVS2cB/cPATzChCCNH/AGLfBT6sz/Z4tjVXE+NyREq2pfOFvkhjVXg==} + /@docusaurus/mdx-loader/2.2.0_if65ga6ul5jnw5c4373drfty5m: + resolution: {integrity: sha512-X2bzo3T0jW0VhUU+XdQofcEeozXOTmKQMvc8tUnWRdTnCvj4XEcBVdC3g+/jftceluiwSTNRAX4VBOJdNt18jA==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@babel/parser': 7.18.9 - '@babel/traverse': 7.18.9 - '@docusaurus/logger': 2.0.0-rc.1 - '@docusaurus/utils': 2.0.0-rc.1 + '@babel/parser': 7.20.3 + '@babel/traverse': 7.20.1 + '@docusaurus/logger': 2.2.0 + '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 '@mdx-js/mdx': 1.6.22 escape-html: 1.0.3 file-loader: 6.2.0_webpack@5.73.0 fs-extra: 10.1.0 image-size: 1.0.2 mdast-util-to-string: 2.0.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 remark-emoji: 2.2.0 stringify-object: 3.3.0 - tslib: 2.4.0 + tslib: 2.4.1 unified: 9.2.2 unist-util-visit: 2.0.3 url-loader: 4.1.1_ljnyroaqobwke7fusd7ro2cgzm @@ -2188,22 +3350,22 @@ packages: - webpack-cli dev: false - /@docusaurus/module-type-aliases/2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-la7D8ggFP8I5nOp/Epl6NqTeDWcbofPVMOaVisRxQbx5iuF9Al+AITbaDgm4CXpFLJACsqhsXD5W4BnKX8ZxfA==} + /@docusaurus/module-type-aliases/2.2.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-wDGW4IHKoOr9YuJgy7uYuKWrDrSpsUSDHLZnWQYM9fN7D5EpSmYHjFruUpKWVyxLpD/Wh0rW8hYZwdjJIQUQCQ==} peerDependencies: react: '*' react-dom: '*' dependencies: - '@docusaurus/react-loadable': 5.5.2_react@17.0.2 - '@docusaurus/types': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m + '@docusaurus/react-loadable': 5.5.2_react@18.2.0 + '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y '@types/history': 4.7.11 '@types/react': 17.0.27 '@types/react-router-config': 5.0.6 '@types/react-router-dom': 5.3.3 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - react-helmet-async: 1.3.0_sfoxds7t5ydpegc3knd667wn6m - react-loadable: /@docusaurus/react-loadable/5.5.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-helmet-async: 1.3.0_biqbaboplfbrettd7655fr4n2y + react-loadable: /@docusaurus/react-loadable/5.5.2_react@18.2.0 transitivePeerDependencies: - '@swc/core' - esbuild @@ -2211,28 +3373,28 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-content-blog/2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-BVVrAGZujpjS/0rarY2o24rlylRRh2NZuM65kg0JNkkViF79SeEHsepog7IuHyoqGWPm1N/I7LpEp7k+gowZzQ==} + /@docusaurus/plugin-content-blog/2.2.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-0mWBinEh0a5J2+8ZJXJXbrCk1tSTNf7Nm4tYAl5h2/xx+PvH/Bnu0V+7mMljYm/1QlDYALNIIaT/JcoZQFUN3w==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/logger': 2.0.0-rc.1 - '@docusaurus/mdx-loader': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/types': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/utils': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm - '@docusaurus/utils-common': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm - '@docusaurus/utils-validation': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm + '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/logger': 2.2.0 + '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/utils-common': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 cheerio: 1.0.0-rc.12 feed: 4.2.2 fs-extra: 10.1.0 lodash: 4.17.21 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 reading-time: 1.5.0 - tslib: 2.4.0 + tslib: 2.4.1 unist-util-visit: 2.0.3 utility-types: 3.10.0 webpack: 5.73.0 @@ -2252,29 +3414,29 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-content-docs/2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-Yk5Hu6uaw3tRplzJnbDygwRhmZ3PCzEXD4SJpBA6cPC73ylfqOEh6qhiU+BWhMTtDXNhY+athk5Kycfk3DW1aQ==} + /@docusaurus/plugin-content-docs/2.2.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-BOazBR0XjzsHE+2K1wpNxz5QZmrJgmm3+0Re0EVPYFGW8qndCWGNtXW/0lGKhecVPML8yyFeAmnUCIs7xM2wPw==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/logger': 2.0.0-rc.1 - '@docusaurus/mdx-loader': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/module-type-aliases': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/types': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/utils': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm - '@docusaurus/utils-validation': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm + '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/logger': 2.2.0 + '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/module-type-aliases': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 '@types/react-router-config': 5.0.6 combine-promises: 1.1.0 fs-extra: 10.1.0 import-fresh: 3.3.0 js-yaml: 4.1.0 lodash: 4.17.21 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - tslib: 2.4.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + tslib: 2.4.1 utility-types: 3.10.0 webpack: 5.73.0 transitivePeerDependencies: @@ -2293,22 +3455,22 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-content-pages/2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-FdO79WC5hfWDQu3/CTFLRQzTNc0e5n+HNzavm2MNkSzGV08BFJ6RAkbPbtra5CWef+6iXZav6D/tzv2jDPvLzA==} + /@docusaurus/plugin-content-pages/2.2.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-+OTK3FQHk5WMvdelz8v19PbEbx+CNT6VSpx7nVOvMNs5yJCKvmqBJBQ2ZSxROxhVDYn+CZOlmyrC56NSXzHf6g==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/mdx-loader': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/types': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/utils': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm - '@docusaurus/utils-validation': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm + '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 fs-extra: 10.1.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - tslib: 2.4.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + tslib: 2.4.1 webpack: 5.73.0 transitivePeerDependencies: - '@parcel/css' @@ -2326,21 +3488,21 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-debug/2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-aOsyYrPMbnsyqHwsVZ+0frrMRtnYqm4eaJpG4sC/6LYAJ07IDRQ9j3GOku2dKr5GsFK1Vx7VlE6ZLwe0MaGstg==} + /@docusaurus/plugin-debug/2.2.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-p9vOep8+7OVl6r/NREEYxf4HMAjV8JMYJ7Bos5fCFO0Wyi9AZEo0sCTliRd7R8+dlJXZEgcngSdxAUo/Q+CJow==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/types': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/utils': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm + '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 fs-extra: 10.1.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - react-json-view: 1.21.3_sfoxds7t5ydpegc3knd667wn6m - tslib: 2.4.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-json-view: 1.21.3_biqbaboplfbrettd7655fr4n2y + tslib: 2.4.1 transitivePeerDependencies: - '@parcel/css' - '@swc/core' @@ -2359,19 +3521,19 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-google-analytics/2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-f+G8z5OJWfg5QqWDLIdcN2SDoK5J5Gg8HMrqCI6Pfl+rxPb5I1niA+/UkAM+kMCpnekvhSt5AWz2fgkRenkPLA==} + /@docusaurus/plugin-google-analytics/2.2.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-+eZVVxVeEnV5nVQJdey9ZsfyEVMls6VyWTIj8SmX0k5EbqGvnIfET+J2pYEuKQnDIHxy+syRMoRM6AHXdHYGIg==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/types': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/utils-validation': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - tslib: 2.4.0 + '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + tslib: 2.4.1 transitivePeerDependencies: - '@parcel/css' - '@swc/core' @@ -2388,19 +3550,19 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-google-gtag/2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-yE1Et9hhhX9qMRnMJzpNq0854qIYiSEc2dZaXNk537HN7Q0rKkr/YONUHz2iqNYwPX2hGOY4LdpTxlMP88uVhA==} + /@docusaurus/plugin-google-gtag/2.2.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-6SOgczP/dYdkqUMGTRqgxAS1eTp6MnJDAQMy8VCF1QKbWZmlkx4agHDexihqmYyCujTYHqDAhm1hV26EET54NQ==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/types': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/utils-validation': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - tslib: 2.4.0 + '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + tslib: 2.4.1 transitivePeerDependencies: - '@parcel/css' - '@swc/core' @@ -2417,24 +3579,24 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-sitemap/2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-5JmbNpssUF03odFM4ArvIsrO9bv7HnAJ0VtefXhh0WBpaFs8NgI3rTkCTFimvtRQjDR9U2bh23fXz2vjQQz6oA==} + /@docusaurus/plugin-sitemap/2.2.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-0jAmyRDN/aI265CbWZNZuQpFqiZuo+5otk2MylU9iVrz/4J7gSc+ZJ9cy4EHrEsW7PV8s1w18hIEsmcA1YgkKg==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/logger': 2.0.0-rc.1 - '@docusaurus/types': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/utils': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm - '@docusaurus/utils-common': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm - '@docusaurus/utils-validation': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm + '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/logger': 2.2.0 + '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/utils-common': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 fs-extra: 10.1.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 sitemap: 7.1.1 - tslib: 2.4.0 + tslib: 2.4.1 transitivePeerDependencies: - '@parcel/css' - '@swc/core' @@ -2451,27 +3613,27 @@ packages: - webpack-cli dev: false - /@docusaurus/preset-classic/2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-5jjTVZkhArjyoNHwCI9x4PSG0zPmBJILjZLVrxPcHpm/K0ltkYcp6J3GxYpf5EbMuOh5+yCWM63cSshGcNOo3Q==} + /@docusaurus/preset-classic/2.2.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-yKIWPGNx7BT8v2wjFIWvYrS+nvN04W+UameSFf8lEiJk6pss0kL6SG2MRvyULiI3BDxH+tj6qe02ncpSPGwumg==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/plugin-content-blog': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/plugin-content-docs': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/plugin-content-pages': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/plugin-debug': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/plugin-google-analytics': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/plugin-google-gtag': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/plugin-sitemap': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/theme-classic': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/theme-common': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/theme-search-algolia': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/types': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/plugin-content-blog': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-content-docs': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-content-pages': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-debug': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-google-analytics': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-google-gtag': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-sitemap': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/theme-classic': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/theme-common': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/theme-search-algolia': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 transitivePeerDependencies: - '@algolia/client-search' - '@parcel/css' @@ -2491,49 +3653,49 @@ packages: - webpack-cli dev: false - /@docusaurus/react-loadable/5.5.2_react@17.0.2: + /@docusaurus/react-loadable/5.5.2_react@18.2.0: resolution: {integrity: sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==} peerDependencies: react: '*' dependencies: '@types/react': 17.0.27 prop-types: 15.8.1 - react: 17.0.2 + react: 18.2.0 dev: false - /@docusaurus/theme-classic/2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-qNiz7ieeq3AC+V8TbW6S63pWLJph1CbzWDDPTqxDLHgA8VQaNaSmJM8S92pH+yKALRb9u14ogjjYYc75Nj2JmQ==} + /@docusaurus/theme-classic/2.2.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-kjbg/qJPwZ6H1CU/i9d4l/LcFgnuzeiGgMQlt6yPqKo0SOJIBMPuz7Rnu3r/WWbZFPi//o8acclacOzmXdUUEg==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/mdx-loader': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/module-type-aliases': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/plugin-content-blog': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/plugin-content-docs': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/plugin-content-pages': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/theme-common': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/theme-translations': 2.0.0-rc.1 - '@docusaurus/types': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/utils': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm - '@docusaurus/utils-common': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm - '@docusaurus/utils-validation': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm - '@mdx-js/react': 1.6.22_react@17.0.2 + '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/module-type-aliases': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-content-blog': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-content-docs': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-content-pages': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/theme-common': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/theme-translations': 2.2.0 + '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/utils-common': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 + '@mdx-js/react': 1.6.22_react@18.2.0 clsx: 1.2.1 copy-text-to-clipboard: 3.0.1 infima: 0.2.0-alpha.42 lodash: 4.17.21 nprogress: 0.2.0 postcss: 8.4.14 - prism-react-renderer: 1.3.5_react@17.0.2 + prism-react-renderer: 1.3.5_react@18.2.0 prismjs: 1.28.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - react-router-dom: 5.3.3_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-router-dom: 5.3.3_react@18.2.0 rtlcss: 3.5.0 - tslib: 2.4.0 + tslib: 2.4.1 utility-types: 3.10.0 transitivePeerDependencies: - '@parcel/css' @@ -2551,28 +3713,28 @@ packages: - webpack-cli dev: false - /@docusaurus/theme-common/2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq: - resolution: {integrity: sha512-1r9ZLKD9SeoCYVzWzcdR79Dia4ANlrlRjNl6uzETOEybjK6FF7yEa9Yra8EJcOCbi3coyYz5xFh/r1YHFTFHug==} + /@docusaurus/theme-common/2.2.0_if65ga6ul5jnw5c4373drfty5m: + resolution: {integrity: sha512-R8BnDjYoN90DCL75gP7qYQfSjyitXuP9TdzgsKDmSFPNyrdE3twtPNa2dIN+h+p/pr+PagfxwWbd6dn722A1Dw==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/mdx-loader': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/module-type-aliases': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/plugin-content-blog': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/plugin-content-docs': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/plugin-content-pages': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/utils': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm + '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/module-type-aliases': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-content-blog': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-content-docs': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-content-pages': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 '@types/history': 4.7.11 '@types/react': 17.0.27 '@types/react-router-config': 5.0.6 clsx: 1.2.1 parse-numeric-range: 1.3.0 - prism-react-renderer: 1.3.5_react@17.0.2 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - tslib: 2.4.0 + prism-react-renderer: 1.3.5_react@18.2.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + tslib: 2.4.1 utility-types: 3.10.0 transitivePeerDependencies: - '@docusaurus/types' @@ -2591,30 +3753,30 @@ packages: - webpack-cli dev: false - /@docusaurus/theme-search-algolia/2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq: - resolution: {integrity: sha512-H5yq6V/B4qo6GZrDKMbeSpk3T9e9K2MliDzLonRu0w3QHW9orVGe0c/lZvRbGlDZjnsOo7XGddhXXIDWGwnpaA==} + /@docusaurus/theme-search-algolia/2.2.0_if65ga6ul5jnw5c4373drfty5m: + resolution: {integrity: sha512-2h38B0tqlxgR2FZ9LpAkGrpDWVdXZ7vltfmTdX+4RsDs3A7khiNsmZB+x/x6sA4+G2V2CvrsPMlsYBy5X+cY1w==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docsearch/react': 3.1.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/core': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/logger': 2.0.0-rc.1 - '@docusaurus/plugin-content-docs': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@docusaurus/theme-common': 2.0.0-rc.1_ph5lx2ec5ywueos4jniupy5vfq - '@docusaurus/theme-translations': 2.0.0-rc.1 - '@docusaurus/utils': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm - '@docusaurus/utils-validation': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm + '@docsearch/react': 3.1.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/logger': 2.2.0 + '@docusaurus/plugin-content-docs': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/theme-common': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@docusaurus/theme-translations': 2.2.0 + '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 algoliasearch: 4.14.0 algoliasearch-helper: 3.10.0_algoliasearch@4.14.0 clsx: 1.2.1 eta: 1.12.3 fs-extra: 10.1.0 lodash: 4.17.21 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - tslib: 2.4.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + tslib: 2.4.1 utility-types: 3.10.0 transitivePeerDependencies: - '@algolia/client-search' @@ -2635,16 +3797,16 @@ packages: - webpack-cli dev: false - /@docusaurus/theme-translations/2.0.0-rc.1: - resolution: {integrity: sha512-JLhNdlnbQhxVQzOnLyiCaTzKFa1lpVrM3nCrkGQKscoG2rY6ARGYMgMN2DkoH6hm7TflQ8+PE1S5MzzASeLs4Q==} + /@docusaurus/theme-translations/2.2.0: + resolution: {integrity: sha512-3T140AG11OjJrtKlY4pMZ5BzbGRDjNs2co5hJ6uYJG1bVWlhcaFGqkaZ5lCgKflaNHD7UHBHU9Ec5f69jTdd6w==} engines: {node: '>=16.14'} dependencies: fs-extra: 10.1.0 - tslib: 2.4.0 + tslib: 2.4.1 dev: false - /@docusaurus/types/2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-wX25FOZa/aKnCGA5ljWPaDpMW3TuTbs0BtjQ8WTC557p8zDvuz4r+g2/FPHsgWE0TKwUMf4usQU1m3XpJLPN+g==} + /@docusaurus/types/2.2.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-b6xxyoexfbRNRI8gjblzVOnLr4peCJhGbYGPpJ3LFqpi5nsFfoK4mmDLvWdeah0B7gmJeXabN7nQkFoqeSdmOw==} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 @@ -2653,9 +3815,9 @@ packages: '@types/react': 17.0.27 commander: 5.1.0 joi: 17.6.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - react-helmet-async: 1.3.0_sfoxds7t5ydpegc3knd667wn6m + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-helmet-async: 1.3.0_biqbaboplfbrettd7655fr4n2y utility-types: 3.10.0 webpack: 5.73.0 webpack-merge: 5.8.0 @@ -2666,8 +3828,8 @@ packages: - webpack-cli dev: false - /@docusaurus/utils-common/2.0.0-rc.1: - resolution: {integrity: sha512-+iZICpeFPZJ9oGJXuG92WTWee6WRnVx5BdzlcfuKf/f5KQX8PvwXR2tDME78FGGhShB8zr+vjuNEXuLvXT7j2A==} + /@docusaurus/utils-common/2.2.0: + resolution: {integrity: sha512-qebnerHp+cyovdUseDQyYFvMW1n1nv61zGe5JJfoNQUnjKuApch3IVsz+/lZ9a38pId8kqehC1Ao2bW/s0ntDA==} engines: {node: '>=16.14'} peerDependencies: '@docusaurus/types': '*' @@ -2675,11 +3837,11 @@ packages: '@docusaurus/types': optional: true dependencies: - tslib: 2.4.0 + tslib: 2.4.1 dev: false - /@docusaurus/utils-common/2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm: - resolution: {integrity: sha512-+iZICpeFPZJ9oGJXuG92WTWee6WRnVx5BdzlcfuKf/f5KQX8PvwXR2tDME78FGGhShB8zr+vjuNEXuLvXT7j2A==} + /@docusaurus/utils-common/2.2.0_@docusaurus+types@2.2.0: + resolution: {integrity: sha512-qebnerHp+cyovdUseDQyYFvMW1n1nv61zGe5JJfoNQUnjKuApch3IVsz+/lZ9a38pId8kqehC1Ao2bW/s0ntDA==} engines: {node: '>=16.14'} peerDependencies: '@docusaurus/types': '*' @@ -2687,19 +3849,19 @@ packages: '@docusaurus/types': optional: true dependencies: - '@docusaurus/types': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - tslib: 2.4.0 + '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y + tslib: 2.4.1 dev: false - /@docusaurus/utils-validation/2.0.0-rc.1: - resolution: {integrity: sha512-lj36gm9Ksu4tt/EUeLDWoMbXe3sfBxeIPIUUdqYcBYkF/rpQkh+uL/dncjNGiw6uvBOqXhOfsFVP045HtgShVw==} + /@docusaurus/utils-validation/2.2.0: + resolution: {integrity: sha512-I1hcsG3yoCkasOL5qQAYAfnmVoLei7apugT6m4crQjmDGxq+UkiRrq55UqmDDyZlac/6ax/JC0p+usZ6W4nVyg==} engines: {node: '>=16.14'} dependencies: - '@docusaurus/logger': 2.0.0-rc.1 - '@docusaurus/utils': 2.0.0-rc.1 + '@docusaurus/logger': 2.2.0 + '@docusaurus/utils': 2.2.0 joi: 17.6.0 js-yaml: 4.1.0 - tslib: 2.4.0 + tslib: 2.4.1 transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -2709,15 +3871,15 @@ packages: - webpack-cli dev: false - /@docusaurus/utils-validation/2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm: - resolution: {integrity: sha512-lj36gm9Ksu4tt/EUeLDWoMbXe3sfBxeIPIUUdqYcBYkF/rpQkh+uL/dncjNGiw6uvBOqXhOfsFVP045HtgShVw==} + /@docusaurus/utils-validation/2.2.0_@docusaurus+types@2.2.0: + resolution: {integrity: sha512-I1hcsG3yoCkasOL5qQAYAfnmVoLei7apugT6m4crQjmDGxq+UkiRrq55UqmDDyZlac/6ax/JC0p+usZ6W4nVyg==} engines: {node: '>=16.14'} dependencies: - '@docusaurus/logger': 2.0.0-rc.1 - '@docusaurus/utils': 2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm + '@docusaurus/logger': 2.2.0 + '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 joi: 17.6.0 js-yaml: 4.1.0 - tslib: 2.4.0 + tslib: 2.4.1 transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -2727,8 +3889,8 @@ packages: - webpack-cli dev: false - /@docusaurus/utils/2.0.0-rc.1: - resolution: {integrity: sha512-ym9I1OwIYbKs1LGaUajaA/vDG8VweJj/6YoZjHp+eDQHhTRIrHXiYoGDqorafRhftKwnA1EnyomuXpNd9bq8Gg==} + /@docusaurus/utils/2.2.0: + resolution: {integrity: sha512-oNk3cjvx7Tt1Lgh/aeZAmFpGV2pDr5nHKrBVx6hTkzGhrnMuQqLt6UPlQjdYQ3QHXwyF/ZtZMO1D5Pfi0lu7SA==} engines: {node: '>=16.14'} peerDependencies: '@docusaurus/types': '*' @@ -2736,8 +3898,8 @@ packages: '@docusaurus/types': optional: true dependencies: - '@docusaurus/logger': 2.0.0-rc.1 - '@svgr/webpack': 6.3.0 + '@docusaurus/logger': 2.2.0 + '@svgr/webpack': 6.5.1 file-loader: 6.2.0_webpack@5.73.0 fs-extra: 10.1.0 github-slugger: 1.4.0 @@ -2748,7 +3910,7 @@ packages: micromatch: 4.0.5 resolve-pathname: 3.0.0 shelljs: 0.8.5 - tslib: 2.4.0 + tslib: 2.4.1 url-loader: 4.1.1_ljnyroaqobwke7fusd7ro2cgzm webpack: 5.73.0 transitivePeerDependencies: @@ -2759,8 +3921,8 @@ packages: - webpack-cli dev: false - /@docusaurus/utils/2.0.0-rc.1_fh5bds7ccduypwmpulad3xjppm: - resolution: {integrity: sha512-ym9I1OwIYbKs1LGaUajaA/vDG8VweJj/6YoZjHp+eDQHhTRIrHXiYoGDqorafRhftKwnA1EnyomuXpNd9bq8Gg==} + /@docusaurus/utils/2.2.0_@docusaurus+types@2.2.0: + resolution: {integrity: sha512-oNk3cjvx7Tt1Lgh/aeZAmFpGV2pDr5nHKrBVx6hTkzGhrnMuQqLt6UPlQjdYQ3QHXwyF/ZtZMO1D5Pfi0lu7SA==} engines: {node: '>=16.14'} peerDependencies: '@docusaurus/types': '*' @@ -2768,9 +3930,9 @@ packages: '@docusaurus/types': optional: true dependencies: - '@docusaurus/logger': 2.0.0-rc.1 - '@docusaurus/types': 2.0.0-rc.1_sfoxds7t5ydpegc3knd667wn6m - '@svgr/webpack': 6.3.0 + '@docusaurus/logger': 2.2.0 + '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@svgr/webpack': 6.5.1 file-loader: 6.2.0_webpack@5.73.0 fs-extra: 10.1.0 github-slugger: 1.4.0 @@ -2781,7 +3943,7 @@ packages: micromatch: 4.0.5 resolve-pathname: 3.0.0 shelljs: 0.8.5 - tslib: 2.4.0 + tslib: 2.4.1 url-loader: 4.1.1_ljnyroaqobwke7fusd7ro2cgzm webpack: 5.73.0 transitivePeerDependencies: @@ -2796,13 +3958,13 @@ packages: resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} dev: false - /@eslint/eslintrc/1.3.0: - resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==} + /@eslint/eslintrc/1.3.3: + resolution: {integrity: sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.3.2 + espree: 9.4.1 globals: 13.16.0 ignore: 5.2.0 import-fresh: 3.3.0 @@ -2813,229 +3975,230 @@ packages: - supports-color dev: true - /@fluentui/date-time-utilities/8.5.1: - resolution: {integrity: sha512-i8GXoIbPipug5cGZ4Dei0oXu7L4wia6DGMAzvabvSHwTjprbR5YjRrrr4UVtBr9gNx1v4Iv1yeD3XSc8DI9JDg==} + /@fluentui/date-time-utilities/8.5.3: + resolution: {integrity: sha512-jwbwcJlnerdjENIAfn/YHxl5H2sQruReOMWXWMgmvX0CmcbqsN9VBxBt+E35Tlr4Ds3MbGs60eyfZUIPpaB5RQ==} dependencies: - '@fluentui/set-version': 8.2.1 - tslib: 2.4.0 + '@fluentui/set-version': 8.2.3 + tslib: 2.4.1 dev: false - /@fluentui/dom-utilities/2.2.1: - resolution: {integrity: sha512-na1+hTRDg2xHSu3Vrr8ITrQpoFChOCSpqTYjLvdRD081p8o61hk9DeaXkUWr8E+2TZ06BXi2t0VyL4wfrYLU8Q==} + /@fluentui/dom-utilities/2.2.3: + resolution: {integrity: sha512-Ml/xwpTC6vb9lHHVAbSUD9jMbt9nVzV208D0FEoQn0c0+dP2vdMXSvXC/QHs/57B6JicttVQPuX6EcPwR3Mkpg==} dependencies: - '@fluentui/set-version': 8.2.1 - tslib: 2.4.0 + '@fluentui/set-version': 8.2.3 + tslib: 2.4.1 dev: false - /@fluentui/font-icons-mdl2/8.4.3_wcklpcar7sgs6afjb4j5aji7wy: - resolution: {integrity: sha512-YKyCTVvV5qpSOS9EsulA+QYLyUEw7QhLzmcBWC4USu0WPhSy/cOfUUvemRl2JSsxErfuOM50OI80RKfuqNwsTA==} + /@fluentui/font-icons-mdl2/8.5.3_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-C1P2fvaj8kka4tLJOoZPopq4kz2ZNCZ4ImGVvek8t7DOayOU2UoTKNoVKhNjynagbsLpwpOYA8Uzb4Ialx+/uQ==} dependencies: - '@fluentui/set-version': 8.2.1 - '@fluentui/style-utilities': 8.7.2_wcklpcar7sgs6afjb4j5aji7wy - '@fluentui/utilities': 8.9.0_wcklpcar7sgs6afjb4j5aji7wy - tslib: 2.4.0 + '@fluentui/set-version': 8.2.3 + '@fluentui/style-utilities': 8.8.2_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/utilities': 8.13.3_fan5qbzahqtxlm5dzefqlqx5ia + tslib: 2.4.1 transitivePeerDependencies: - '@types/react' - react dev: false - /@fluentui/foundation-legacy/8.2.10_wcklpcar7sgs6afjb4j5aji7wy: - resolution: {integrity: sha512-/ku+mSLTEIKf/HGavt9k+/njgAXGHXu4hoxRYRHbYr1O9hUe50cm5DctPQg+z/YDPNzsb1ltSmNqgWPvBOSW6A==} + /@fluentui/foundation-legacy/8.2.23_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-5idaKH7z0HKRAlfGH4BjqSlRKQh4yzVd5BWJ0MCPL20Rn6jmaIJSdjMHTrIfVhzLvSxn+7MQRV9a8S+AvIDUHQ==} peerDependencies: - '@types/react': '>=16.8.0 <18.0.0' - react: '>=16.8.0 <18.0.0' + '@types/react': '>=16.8.0 <19.0.0' + react: '>=16.8.0 <19.0.0' dependencies: - '@fluentui/merge-styles': 8.5.2 - '@fluentui/set-version': 8.2.1 - '@fluentui/style-utilities': 8.7.2_wcklpcar7sgs6afjb4j5aji7wy - '@fluentui/utilities': 8.9.0_wcklpcar7sgs6afjb4j5aji7wy - '@types/react': 17.0.27 - react: 17.0.2 - tslib: 2.4.0 + '@fluentui/merge-styles': 8.5.4 + '@fluentui/set-version': 8.2.3 + '@fluentui/style-utilities': 8.8.2_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/utilities': 8.13.3_fan5qbzahqtxlm5dzefqlqx5ia + '@types/react': 18.0.25 + react: 18.2.0 + tslib: 2.4.1 dev: false - /@fluentui/keyboard-key/0.4.1: - resolution: {integrity: sha512-8WkNPh0tnzrrZYs19qN8Zavaebz9FHyTFXKTv0QJ55rZ7uQfAV7VHxS/74aUP4bqeRWJtzaOJKUxkjEAPcDbug==} + /@fluentui/keyboard-key/0.4.3: + resolution: {integrity: sha512-uLiwx+UyXDN7tShv/s2NzDPtqeT/BZCHvY9yxEeb6LgEkos8TZvT5ep/7G8BpxA/SuBnviZ8xpDB5JObyZikqQ==} dependencies: - tslib: 2.4.0 + tslib: 2.4.1 dev: false - /@fluentui/merge-styles/8.5.2: - resolution: {integrity: sha512-ax8izl48JJuymEuvJzvNH22GHmpPEWLP+h4doyFZ/9IhR9AEycNc2rGBthZ5FiuktnFgusNag1AHr/WCj5pttw==} + /@fluentui/merge-styles/8.5.4: + resolution: {integrity: sha512-CeQIEcEgZu0cxqqyhJyTqySXoUL1vXfdWDJ8WMzchaNnhvOvoXISw8xXHpNXUtEn+HgPrcy9mHQwFcAc+jv3Wg==} dependencies: - '@fluentui/set-version': 8.2.1 - tslib: 2.4.0 + '@fluentui/set-version': 8.2.3 + tslib: 2.4.1 dev: false - /@fluentui/react-file-type-icons/8.6.11_wcklpcar7sgs6afjb4j5aji7wy: - resolution: {integrity: sha512-lU0FmJQ1nqQpIAmF9n3FKVB23L31crzfVZOpUds1ZHT/9UqTHPJ2Deu0GnJZ3E3SfooPsRQEsc7LaConHjebCg==} + /@fluentui/react-file-type-icons/8.8.1_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-7mOBiiF2fSpqXflGi+61mY1wWxNdNohZnQZ11a1VkJ5yHs5y4OI32g9nPp0BIiVUoEyiBqLzwA/bLMvQ3+oZCA==} peerDependencies: - '@types/react': '>=16.8.0 <18.0.0' - react: '>=16.8.0 <18.0.0' + '@types/react': '>=16.8.0 <19.0.0' + react: '>=16.8.0 <19.0.0' dependencies: - '@fluentui/set-version': 8.2.1 - '@fluentui/style-utilities': 8.7.2_wcklpcar7sgs6afjb4j5aji7wy - '@types/react': 17.0.27 - react: 17.0.2 - tslib: 2.4.0 + '@fluentui/set-version': 8.2.3 + '@fluentui/style-utilities': 8.8.2_fan5qbzahqtxlm5dzefqlqx5ia + '@types/react': 18.0.25 + react: 18.2.0 + tslib: 2.4.1 dev: false - /@fluentui/react-focus/8.7.3_wcklpcar7sgs6afjb4j5aji7wy: - resolution: {integrity: sha512-d/AwXzcPMoiPpzbpkHpfTyDcvYvga2DWNYq1Rh+QJsAGzN34bimu5xSxE21mbeXyz+TYx7yglElGp7GlT33s3Q==} + /@fluentui/react-focus/8.8.9_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-lYixFOZ2OjULcWhD3MppxzAt6aImkhNQiNtUJzswBV1xmYvkpYOxXK2hxf3/CeRAFijcmuAIvwg1rRgYBfRxxA==} peerDependencies: - '@types/react': '>=16.8.0 <18.0.0' - react: '>=16.8.0 <18.0.0' + '@types/react': '>=16.8.0 <19.0.0' + react: '>=16.8.0 <19.0.0' dependencies: - '@fluentui/keyboard-key': 0.4.1 - '@fluentui/merge-styles': 8.5.2 - '@fluentui/set-version': 8.2.1 - '@fluentui/style-utilities': 8.7.2_wcklpcar7sgs6afjb4j5aji7wy - '@fluentui/utilities': 8.9.0_wcklpcar7sgs6afjb4j5aji7wy - '@types/react': 17.0.27 - react: 17.0.2 - tslib: 2.4.0 + '@fluentui/keyboard-key': 0.4.3 + '@fluentui/merge-styles': 8.5.4 + '@fluentui/set-version': 8.2.3 + '@fluentui/style-utilities': 8.8.2_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/utilities': 8.13.3_fan5qbzahqtxlm5dzefqlqx5ia + '@types/react': 18.0.25 + react: 18.2.0 + tslib: 2.4.1 dev: false - /@fluentui/react-hooks/8.6.1_wcklpcar7sgs6afjb4j5aji7wy: - resolution: {integrity: sha512-t9l+O+ZjTiGSuKQ9SxqRRo50C1h69jZFzb+s/vc0vBtvsIoYfR+Jj8qH3hxtkhv/iC+SCj1dgDCEJwGyH7pf3Q==} + /@fluentui/react-hooks/8.6.13_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-RAbVuwzX40czyNNkVpRFYKST2dX+PL0qIT5LB92SWqhEfyZjMOcOeg/YaEoLFZKNOVilAfUItSCD6HzurO4aLA==} peerDependencies: - '@types/react': '>=16.8.0 <18.0.0' - react: '>=16.8.0 <18.0.0' + '@types/react': '>=16.8.0 <19.0.0' + react: '>=16.8.0 <19.0.0' dependencies: - '@fluentui/react-window-provider': 2.2.1_wcklpcar7sgs6afjb4j5aji7wy - '@fluentui/set-version': 8.2.1 - '@fluentui/utilities': 8.9.0_wcklpcar7sgs6afjb4j5aji7wy - '@types/react': 17.0.27 - react: 17.0.2 - tslib: 2.4.0 + '@fluentui/react-window-provider': 2.2.4_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/set-version': 8.2.3 + '@fluentui/utilities': 8.13.3_fan5qbzahqtxlm5dzefqlqx5ia + '@types/react': 18.0.25 + react: 18.2.0 + tslib: 2.4.1 dev: false - /@fluentui/react-icons/2.0.176_react@17.0.2: - resolution: {integrity: sha512-3SQQN15iW1qyW2cyIolk4vTz5ZWCVuY6QAzhoJWRCfeoRyzZMW4YiDqO8Jy4F8YQLgsneCnI4mXZdLqD8ij4jw==} + /@fluentui/react-icons/2.0.187_it3lvsvbvb6ccu3ygofv6sq6xa: + resolution: {integrity: sha512-KYEEzqzYIMFOkIzYw/pT1FIp0TvSquw7HpYCPn+YX5B3iTrVySfLL0aKBIK/Q7gWexBLVgH8zErUDsZ6r5fGLg==} peerDependencies: + '@griffel/react': ^1.0.0 react: '>=16.8.0 <18.0.0' dependencies: - '@griffel/react': 1.2.1_react@17.0.2 - react: 17.0.2 - tslib: 2.4.0 + '@griffel/react': 1.4.2_react@18.2.0 + react: 18.2.0 + tslib: 2.4.1 dev: false - /@fluentui/react-portal-compat-context/9.0.1_wcklpcar7sgs6afjb4j5aji7wy: - resolution: {integrity: sha512-KhOcXy2tvzNoAqFowkaRGFiLuRuPjzn6i1W30iMkhgsSVKxa/9jxso86Z8R0eZwA+16RNO/Ia2nX1gqfUac9mw==} + /@fluentui/react-portal-compat-context/9.0.4_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-qw2lmkxZ2TmgC0pB2dvFyrzVffxBdpCx1BdWRaF+MRGUlTxRtqfybSx3Edsqa6NMewc3J0ThLMFdVFBQ5Yafqw==} peerDependencies: - '@types/react': '>=16.8.0 <18.0.0' - react: '>=16.8.0 <18.0.0' + '@types/react': '>=16.8.0 <19.0.0' + react: '>=16.8.0 <19.0.0' dependencies: - '@types/react': 17.0.27 - react: 17.0.2 - tslib: 2.4.0 + '@types/react': 18.0.25 + react: 18.2.0 + tslib: 2.4.1 dev: false - /@fluentui/react-window-provider/2.2.1_wcklpcar7sgs6afjb4j5aji7wy: - resolution: {integrity: sha512-Y0j+lAYKeD/qswzFZWPkHmvtBlRS2WPJIkpyGvfBVZaCeq3DGKRppoOCOmED762bKOXzM/G/ZNEcBa7CY1gkYw==} + /@fluentui/react-window-provider/2.2.4_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-tCiIGQSILSipcn8DwwRgYq5IMtwBKiSQ+/cVRNq54cJZoq5ie/kMGFpldZ+vREDbM8wjmO3eNgNi63A3QRx39g==} peerDependencies: - '@types/react': '>=16.8.0 <18.0.0' - react: '>=16.8.0 <18.0.0' + '@types/react': '>=16.8.0 <19.0.0' + react: '>=16.8.0 <19.0.0' dependencies: - '@fluentui/set-version': 8.2.1 - '@types/react': 17.0.27 - react: 17.0.2 - tslib: 2.4.0 + '@fluentui/set-version': 8.2.3 + '@types/react': 18.0.25 + react: 18.2.0 + tslib: 2.4.1 dev: false - /@fluentui/react/8.81.1_cktacisfg2p5lpuckvtl5f276a: - resolution: {integrity: sha512-iTdfjWMsMwdvc2ZRQBg/nBUhX0mmttjH0pbMZ8RgcMLuSDauQnDwMN3gEWRZ+fInUGcqTE1hzEdoLS75Dl3bAg==} + /@fluentui/react/8.101.0_2zx2umvpluuhvlq44va5bta2da: + resolution: {integrity: sha512-kIVujMFy/vszhCO4GwxMhEIcQ9NCWm2GOqXjX0X/iLzR6g0yOUwzIfdTcKJrD8zpg1g41pANeYdpAnWrl/se6g==} peerDependencies: - '@types/react': '>=16.8.0 <18.0.0' - '@types/react-dom': '>=16.8.0 <18.0.0' - react: '>=16.8.0 <18.0.0' - react-dom: '>=16.8.0 <18.0.0' - dependencies: - '@fluentui/date-time-utilities': 8.5.1 - '@fluentui/font-icons-mdl2': 8.4.3_wcklpcar7sgs6afjb4j5aji7wy - '@fluentui/foundation-legacy': 8.2.10_wcklpcar7sgs6afjb4j5aji7wy - '@fluentui/merge-styles': 8.5.2 - '@fluentui/react-focus': 8.7.3_wcklpcar7sgs6afjb4j5aji7wy - '@fluentui/react-hooks': 8.6.1_wcklpcar7sgs6afjb4j5aji7wy - '@fluentui/react-portal-compat-context': 9.0.1_wcklpcar7sgs6afjb4j5aji7wy - '@fluentui/react-window-provider': 2.2.1_wcklpcar7sgs6afjb4j5aji7wy - '@fluentui/set-version': 8.2.1 - '@fluentui/style-utilities': 8.7.2_wcklpcar7sgs6afjb4j5aji7wy - '@fluentui/theme': 2.6.7_wcklpcar7sgs6afjb4j5aji7wy - '@fluentui/utilities': 8.9.0_wcklpcar7sgs6afjb4j5aji7wy + '@types/react': '>=16.8.0 <19.0.0' + '@types/react-dom': '>=16.8.0 <19.0.0' + react: '>=16.8.0 <19.0.0' + react-dom: '>=16.8.0 <19.0.0' + dependencies: + '@fluentui/date-time-utilities': 8.5.3 + '@fluentui/font-icons-mdl2': 8.5.3_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/foundation-legacy': 8.2.23_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/merge-styles': 8.5.4 + '@fluentui/react-focus': 8.8.9_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/react-hooks': 8.6.13_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/react-portal-compat-context': 9.0.4_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/react-window-provider': 2.2.4_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/set-version': 8.2.3 + '@fluentui/style-utilities': 8.8.2_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/theme': 2.6.18_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/utilities': 8.13.3_fan5qbzahqtxlm5dzefqlqx5ia '@microsoft/load-themed-styles': 1.10.281 - '@types/react': 17.0.27 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - tslib: 2.4.0 + '@types/react': 18.0.25 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + tslib: 2.4.1 dev: false - /@fluentui/set-version/8.2.1: - resolution: {integrity: sha512-SZMP2P7RSUuVHYWIBcnlxYruvchlnoqensCvoaGeiH0FisO7etwJdFwKNegV7WEA9uS5ZOK3qVmyvD71DxaSng==} + /@fluentui/set-version/8.2.3: + resolution: {integrity: sha512-/+5vrI1Bq/ZsNDEK9++RClnDOeCILS8RXxZb7OAqmOc8GnPScxKcIN8e/1bosUxTjb2EB1KbVk6XeUpk0WvQIg==} dependencies: - tslib: 2.4.0 + tslib: 2.4.1 dev: false - /@fluentui/style-utilities/8.7.2_wcklpcar7sgs6afjb4j5aji7wy: - resolution: {integrity: sha512-sDNsXUXdk4qAllADH46o0Fq1VOgWCDS+J/t3UFc6DA4a0R3J/M0o5COAh+S4/kLkJoKBQ+T+TqZJmA+Cj+hlCA==} + /@fluentui/style-utilities/8.8.2_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-tef1nyWmgQTbETmvjQewxLfeJ+sJ21i3VzwBpK5qvj8MLwCHkMSBoDL7gXp6xCN2VSrQc0TkbykgUvRyJ2IReg==} dependencies: - '@fluentui/merge-styles': 8.5.2 - '@fluentui/set-version': 8.2.1 - '@fluentui/theme': 2.6.7_wcklpcar7sgs6afjb4j5aji7wy - '@fluentui/utilities': 8.9.0_wcklpcar7sgs6afjb4j5aji7wy + '@fluentui/merge-styles': 8.5.4 + '@fluentui/set-version': 8.2.3 + '@fluentui/theme': 2.6.18_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/utilities': 8.13.3_fan5qbzahqtxlm5dzefqlqx5ia '@microsoft/load-themed-styles': 1.10.281 - tslib: 2.4.0 + tslib: 2.4.1 transitivePeerDependencies: - '@types/react' - react dev: false - /@fluentui/theme/2.6.7_wcklpcar7sgs6afjb4j5aji7wy: - resolution: {integrity: sha512-uSvUkGLFcIjVuYPtwjdgnUd7Fqd6TXakM1Gh0xqPbBPm4Kiig7mpRDfMUneAI8t0j5otEeqeNokoLs5rMNGOBg==} + /@fluentui/theme/2.6.18_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-NWiKCX62XDZ8FYjCN0Km4soFfqSyxqoTtxRVBVC5rujbkMbWyzyV/WpGz5ZNcrudhg/5LWNwILhyXxLRalG3mQ==} peerDependencies: - '@types/react': '>=16.8.0 <18.0.0' - react: '>=16.8.0 <18.0.0' + '@types/react': '>=16.8.0 <19.0.0' + react: '>=16.8.0 <19.0.0' dependencies: - '@fluentui/merge-styles': 8.5.2 - '@fluentui/set-version': 8.2.1 - '@fluentui/utilities': 8.9.0_wcklpcar7sgs6afjb4j5aji7wy - '@types/react': 17.0.27 - react: 17.0.2 - tslib: 2.4.0 + '@fluentui/merge-styles': 8.5.4 + '@fluentui/set-version': 8.2.3 + '@fluentui/utilities': 8.13.3_fan5qbzahqtxlm5dzefqlqx5ia + '@types/react': 18.0.25 + react: 18.2.0 + tslib: 2.4.1 dev: false - /@fluentui/utilities/8.9.0_wcklpcar7sgs6afjb4j5aji7wy: - resolution: {integrity: sha512-fK3GjWygRhKDuVxIAMqcfP0UZGhnifygzhrZDIanKc4/+9CoIY/BVtHryRF+zF0sGEXF5kDarsMsLAeCnB2YhA==} + /@fluentui/utilities/8.13.3_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-Nshe8pWKO/KngRx32EdhW5hvi5ZUWDR6hZcAGNgfLmXXQh3ZrTqAuLtmntv5PHvgbwz1qIsHfvqHgfAcHtoSpw==} peerDependencies: - '@types/react': '>=16.8.0 <18.0.0' - react: '>=16.8.0 <18.0.0' + '@types/react': '>=16.8.0 <19.0.0' + react: '>=16.8.0 <19.0.0' dependencies: - '@fluentui/dom-utilities': 2.2.1 - '@fluentui/merge-styles': 8.5.2 - '@fluentui/set-version': 8.2.1 - '@types/react': 17.0.27 - react: 17.0.2 - tslib: 2.4.0 + '@fluentui/dom-utilities': 2.2.3 + '@fluentui/merge-styles': 8.5.4 + '@fluentui/set-version': 8.2.3 + '@types/react': 18.0.25 + react: 18.2.0 + tslib: 2.4.1 dev: false - /@griffel/core/1.4.1: - resolution: {integrity: sha512-PSVZiRJYIvKCt5V5PqkMuOEGyvq/L/lSArEmVVz9h8jkX0Zf7SRpjCDluHd43mRQZ6wFzYeK4aKa6DwIxomZIA==} + /@griffel/core/1.8.1: + resolution: {integrity: sha512-Zig4h+o2f8v7tV13yQCmRaEKp6Psdi+NZEPQOmM7DJNmAHYQgcHJcLqJH7SOGWr+QOh3ZXVpQ2EP3JDKz479GQ==} dependencies: '@emotion/hash': 0.8.0 csstype: 3.1.0 - rtl-css-js: 1.15.0 + rtl-css-js: 1.16.0 stylis: 4.1.1 - tslib: 2.4.0 + tslib: 2.4.1 dev: false - /@griffel/react/1.2.1_react@17.0.2: - resolution: {integrity: sha512-A5fFXl9GvwEETCrT2hapTaoRAmY8JzZXpO6WnfCPHat6R74GP9i3PyJft6OT+XGEi+/vW/Owyp2IpX+PKiY7CQ==} + /@griffel/react/1.4.2_react@18.2.0: + resolution: {integrity: sha512-VM047UxJFiq/OX5YkRPVuGB9NdU/TxVX9nrBRncXuxzVRRmvf+1OmHlcXWaFuXVj0JOjiMBzm4jH34lqPRGS+Q==} peerDependencies: - react: '>=16.8.0 <18.0.0' + react: '>=16.8.0 <19.0.0' dependencies: - '@griffel/core': 1.4.1 - react: 17.0.2 - tslib: 2.4.0 + '@griffel/core': 1.8.1 + react: 18.2.0 + tslib: 2.4.1 dev: false /@hapi/hoek/9.3.0: @@ -3048,8 +4211,8 @@ packages: '@hapi/hoek': 9.3.0 dev: false - /@humanwhocodes/config-array/0.9.5: - resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} + /@humanwhocodes/config-array/0.11.7: + resolution: {integrity: sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 @@ -3059,6 +4222,11 @@ packages: - supports-color dev: true + /@humanwhocodes/module-importer/1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + /@humanwhocodes/object-schema/1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true @@ -3079,54 +4247,53 @@ packages: engines: {node: '>=8'} dev: true - /@jest/console/28.1.3: - resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/console/29.3.1: + resolution: {integrity: sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 28.1.3 - '@types/node': 17.0.45 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 chalk: 4.1.2 - jest-message-util: 28.1.3 - jest-util: 28.1.3 + jest-message-util: 29.3.1 + jest-util: 29.3.1 slash: 3.0.0 dev: true - /@jest/core/28.1.3: - resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/core/29.3.1: + resolution: {integrity: sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true dependencies: - '@jest/console': 28.1.3 - '@jest/reporters': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 17.0.45 + '@jest/console': 29.3.1 + '@jest/reporters': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.3.2 exit: 0.1.2 graceful-fs: 4.2.10 - jest-changed-files: 28.1.3 - jest-config: 28.1.3_@types+node@17.0.45 - jest-haste-map: 28.1.3 - jest-message-util: 28.1.3 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-resolve-dependencies: 28.1.3 - jest-runner: 28.1.3 - jest-runtime: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 - jest-validate: 28.1.3 - jest-watcher: 28.1.3 + jest-changed-files: 29.2.0 + jest-config: 29.3.1_@types+node@18.11.9 + jest-haste-map: 29.3.1 + jest-message-util: 29.3.1 + jest-regex-util: 29.2.0 + jest-resolve: 29.3.1 + jest-resolve-dependencies: 29.3.1 + jest-runner: 29.3.1 + jest-runtime: 29.3.1 + jest-snapshot: 29.3.1 + jest-util: 29.3.1 + jest-validate: 29.3.1 + jest-watcher: 29.3.1 micromatch: 4.0.5 - pretty-format: 28.1.3 - rimraf: 3.0.2 + pretty-format: 29.3.1 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: @@ -3134,59 +4301,60 @@ packages: - ts-node dev: true - /@jest/environment/28.1.3: - resolution: {integrity: sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/environment/29.3.1: + resolution: {integrity: sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/fake-timers': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 17.0.45 - jest-mock: 28.1.3 + '@jest/fake-timers': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 + jest-mock: 29.3.1 dev: true - /@jest/expect-utils/28.1.3: - resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/expect-utils/29.3.1: + resolution: {integrity: sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-get-type: 28.0.2 + jest-get-type: 29.2.0 dev: true - /@jest/expect/28.1.3: - resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/expect/29.3.1: + resolution: {integrity: sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - expect: 28.1.3 - jest-snapshot: 28.1.3 + expect: 29.3.1 + jest-snapshot: 29.3.1 transitivePeerDependencies: - supports-color dev: true - /@jest/fake-timers/28.1.3: - resolution: {integrity: sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/fake-timers/29.3.1: + resolution: {integrity: sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 28.1.3 + '@jest/types': 29.3.1 '@sinonjs/fake-timers': 9.1.2 - '@types/node': 17.0.45 - jest-message-util: 28.1.3 - jest-mock: 28.1.3 - jest-util: 28.1.3 + '@types/node': 18.11.9 + jest-message-util: 29.3.1 + jest-mock: 29.3.1 + jest-util: 29.3.1 dev: true - /@jest/globals/28.1.3: - resolution: {integrity: sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/globals/29.3.1: + resolution: {integrity: sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 28.1.3 - '@jest/expect': 28.1.3 - '@jest/types': 28.1.3 + '@jest/environment': 29.3.1 + '@jest/expect': 29.3.1 + '@jest/types': 29.3.1 + jest-mock: 29.3.1 transitivePeerDependencies: - supports-color dev: true - /@jest/reporters/28.1.3: - resolution: {integrity: sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/reporters/29.3.1: + resolution: {integrity: sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -3194,12 +4362,12 @@ packages: optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - '@jridgewell/trace-mapping': 0.3.14 - '@types/node': 17.0.45 + '@jest/console': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@jridgewell/trace-mapping': 0.3.17 + '@types/node': 18.11.9 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -3210,69 +4378,68 @@ packages: istanbul-lib-report: 3.0.0 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.5 - jest-message-util: 28.1.3 - jest-util: 28.1.3 - jest-worker: 28.1.3 + jest-message-util: 29.3.1 + jest-util: 29.3.1 + jest-worker: 29.3.1 slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 - terminal-link: 2.1.1 v8-to-istanbul: 9.0.1 transitivePeerDependencies: - supports-color dev: true - /@jest/schemas/28.1.3: - resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/schemas/29.0.0: + resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.24.20 dev: true - /@jest/source-map/28.1.2: - resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/source-map/29.2.0: + resolution: {integrity: sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.14 + '@jridgewell/trace-mapping': 0.3.17 callsites: 3.1.0 graceful-fs: 4.2.10 dev: true - /@jest/test-result/28.1.3: - resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/test-result/29.3.1: + resolution: {integrity: sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 28.1.3 - '@jest/types': 28.1.3 + '@jest/console': 29.3.1 + '@jest/types': 29.3.1 '@types/istanbul-lib-coverage': 2.0.4 collect-v8-coverage: 1.0.1 dev: true - /@jest/test-sequencer/28.1.3: - resolution: {integrity: sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/test-sequencer/29.3.1: + resolution: {integrity: sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 28.1.3 + '@jest/test-result': 29.3.1 graceful-fs: 4.2.10 - jest-haste-map: 28.1.3 + jest-haste-map: 29.3.1 slash: 3.0.0 dev: true - /@jest/transform/28.1.3: - resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/transform/29.3.1: + resolution: {integrity: sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.18.9 - '@jest/types': 28.1.3 - '@jridgewell/trace-mapping': 0.3.14 + '@babel/core': 7.20.2 + '@jest/types': 29.3.1 + '@jridgewell/trace-mapping': 0.3.17 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 - convert-source-map: 1.8.0 + convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.10 - jest-haste-map: 28.1.3 - jest-regex-util: 28.0.2 - jest-util: 28.1.3 + jest-haste-map: 29.3.1 + jest-regex-util: 29.2.0 + jest-util: 29.3.1 micromatch: 4.0.5 pirates: 4.0.5 slash: 3.0.0 @@ -3281,14 +4448,14 @@ packages: - supports-color dev: true - /@jest/types/28.1.3: - resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/types/29.3.1: + resolution: {integrity: sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 28.1.3 + '@jest/schemas': 29.0.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 17.0.45 + '@types/node': 18.11.9 '@types/yargs': 17.0.10 chalk: 4.1.2 dev: true @@ -3332,12 +4499,19 @@ packages: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 + /@jridgewell/trace-mapping/0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + /@leichtgewicht/ip-codec/2.0.4: resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} dev: false - /@mdx-js/loader/2.1.2: - resolution: {integrity: sha512-P7CWhrqE5rZ3ewBngZ9t/zQPbSq42iuty78K3zJ8Bl518qnOX1d106c+n7I/zHODPAmw9JfYMQdbv9WrrHa0DA==} + /@mdx-js/loader/2.1.5: + resolution: {integrity: sha512-oXjfTa/iAcMmW8DdQ+hQFodPCLqw5VKT2yoZkLwrZfPVVpUgKrI+5/ZePYq328xxtAUStZmR3ed0PWJrwd5Pkg==} peerDependencies: webpack: '>=4' dependencies: @@ -3397,22 +4571,22 @@ packages: - supports-color dev: true - /@mdx-js/react/1.6.22_react@17.0.2: + /@mdx-js/react/1.6.22_react@18.2.0: resolution: {integrity: sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==} peerDependencies: react: ^16.13.1 || ^17.0.0 dependencies: - react: 17.0.2 + react: 18.2.0 dev: false - /@mdx-js/react/2.1.2_react@17.0.2: - resolution: {integrity: sha512-52e3DTJBrjsw3U51ZCdZ3N1IBaqnbzLIngCSXpKtiYiGr7PIqp3/P/+kym0MPTwBL/y9ZBmCieD8FyrXuEDrRw==} + /@mdx-js/react/2.1.5_react@18.2.0: + resolution: {integrity: sha512-3Az1I6SAWA9R38rYjz5rXBrGKeZhq96CSSyQtqY+maPj8stBsoUH5pNcmIixuGkufYsh8F5+ka2CVPo2fycWZw==} peerDependencies: react: '>=16' dependencies: '@types/mdx': 2.0.2 '@types/react': 17.0.27 - react: 17.0.2 + react: 18.2.0 dev: false /@mdx-js/util/1.6.22: @@ -3423,27 +4597,28 @@ packages: resolution: {integrity: sha512-91uZ4u6p5ZClHQE2RpJKTZALeCl1G9cZB47SPivfPrRtjrhqCfS3gC3zNoikUhpwccWjfSN50zjm289Wxkf/8Q==} dev: false - /@next/env/12.2.0: - resolution: {integrity: sha512-/FCkDpL/8SodJEXvx/DYNlOD5ijTtkozf4PPulYPtkPOJaMPpBSOkzmsta4fnrnbdH6eZjbwbiXFdr6gSQCV4w==} + /@next/env/13.0.3: + resolution: {integrity: sha512-/4WzeG61Ot/PxsghXkSqQJ6UohFfwXoZ3dtsypmR9EBP+OIax9JRq0trq8Z/LCT9Aq4JbihVkaazRWguORjTAw==} dev: false - /@next/eslint-plugin-next/12.2.0: - resolution: {integrity: sha512-nIj5xV/z3dOfeBnE7qFAjUQZAi4pTlIMuusRM6s/T6lOz8x7mjY5s1ZkTUBmcjPVCb2VIv3CrMH0WZL6xfjZZg==} + /@next/eslint-plugin-next/13.0.3: + resolution: {integrity: sha512-slmTAHNKDyc7jhx4VF8lFbmOPWJ3PShtUUWpb6x9+ga59CyOxgP6AdcDhxfapnWYACKe/TwYiaveufu7LqXgZg==} dependencies: glob: 7.1.7 dev: true - /@next/mdx/12.2.2_@mdx-js+loader@2.1.2: - resolution: {integrity: sha512-d+yHApu6weFYrAbDj+2vMY3uE8kAnoNu5g3w8B3m3skUh6r1ekkKM2YTktlpNpum/XMnKGiPrIdAX4L4KuVdYg==} + /@next/mdx/13.0.3_@mdx-js+loader@2.1.5: + resolution: {integrity: sha512-0NWKlwQdKsG/KdpTceC17zGlGP7deRAc2/JXpsOcy0744QWd3ai1Eg5g6YsR25giiW6EJVQr0ynfFzTLXdzg9Q==} peerDependencies: '@mdx-js/loader': '>=0.15.0' '@mdx-js/react': '*' dependencies: - '@mdx-js/loader': 2.1.2 + '@mdx-js/loader': 2.1.5 + source-map: 0.7.4 dev: true - /@next/swc-android-arm-eabi/12.2.0: - resolution: {integrity: sha512-hbneH8DNRB2x0Nf5fPCYoL8a0osvdTCe4pvOc9Rv5CpDsoOlf8BWBs2OWpeP0U2BktGvIsuUhmISmdYYGyrvTw==} + /@next/swc-android-arm-eabi/13.0.3: + resolution: {integrity: sha512-uxfUoj65CdFc1gX2q7GtBX3DhKv9Kn343LMqGNvXyuTpYTGMmIiVY7b9yF8oLWRV0gVKqhZBZifUmoPE8SJU6Q==} engines: {node: '>= 10'} cpu: [arm] os: [android] @@ -3451,8 +4626,8 @@ packages: dev: false optional: true - /@next/swc-android-arm64/12.2.0: - resolution: {integrity: sha512-1eEk91JHjczcJomxJ8X0XaUeNcp5Lx1U2Ic7j15ouJ83oRX+3GIslOuabW2oPkSgXbHkThMClhirKpvG98kwZg==} + /@next/swc-android-arm64/13.0.3: + resolution: {integrity: sha512-t2k+WDfg7Cq2z/EnalKGsd/9E5F4Hdo1xu+UzZXYDpKUI9zgE6Bz8ajQb8m8txv3qOaWdKuDa5j5ziq9Acd1Xw==} engines: {node: '>= 10'} cpu: [arm64] os: [android] @@ -3460,8 +4635,8 @@ packages: dev: false optional: true - /@next/swc-darwin-arm64/12.2.0: - resolution: {integrity: sha512-x5U5gJd7ZvrEtTFnBld9O2bUlX8opu7mIQUqRzj7KeWzBwPhrIzTTsQXAiNqsaMuaRPvyHBVW/5d/6g6+89Y8g==} + /@next/swc-darwin-arm64/13.0.3: + resolution: {integrity: sha512-wV6j6SZ1bc/YHOLCLk9JVqaZTCCey6HBV7inl2DriHsHqIcO6F3+QiYf0KXwRP9BE0GSZZrYd5mZQm2JPTHdJA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -3469,8 +4644,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64/12.2.0: - resolution: {integrity: sha512-iwMNFsrAPjfedjKDv9AXPAV16PWIomP3qw/FfPaxkDVRbUls7BNdofBLzkQmqxqWh93WrawLwaqyXpJuAaiwJA==} + /@next/swc-darwin-x64/13.0.3: + resolution: {integrity: sha512-jaI2CMuYWvUtRixV3AIjUhnxUDU1FKOR+8hADMhYt3Yz+pCKuj4RZ0n0nY5qUf3qT1AtvnJXEgyatSFJhSp/wQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -3478,8 +4653,8 @@ packages: dev: false optional: true - /@next/swc-freebsd-x64/12.2.0: - resolution: {integrity: sha512-gRiAw8g3Akf6niTDLEm1Emfa7jXDjvaAj/crDO8hKASKA4Y1fS4kbi/tyWw5VtoFI4mUzRmCPmZ8eL0tBSG58A==} + /@next/swc-freebsd-x64/13.0.3: + resolution: {integrity: sha512-nbyT0toBTJrcj5TCB9pVnQpGJ3utGyQj4CWegZs1ulaeUQ5Z7CS/qt8nRyYyOKYHtOdSCJ9Nw5F/RgKNkdpOdw==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] @@ -3487,8 +4662,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm-gnueabihf/12.2.0: - resolution: {integrity: sha512-/TJZkxaIpeEwnXh6A40trgwd40C5+LJroLUOEQwMOJdavLl62PjCA6dGl1pgooWLCIb5YdBQ0EG4ylzvLwS2+Q==} + /@next/swc-linux-arm-gnueabihf/13.0.3: + resolution: {integrity: sha512-1naLxYvRUQCoFCU1nMkcQueRc0Iux9xBv1L5pzH2ejtIWFg8BrSgyuluJG4nyAhFCx4WG863IEIkAaefOowVdA==} engines: {node: '>= 10'} cpu: [arm] os: [linux] @@ -3496,8 +4671,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu/12.2.0: - resolution: {integrity: sha512-++WAB4ElXCSOKG9H8r4ENF8EaV+w0QkrpjehmryFkQXmt5juVXz+nKDVlCRMwJU7A1O0Mie82XyEoOrf6Np1pA==} + /@next/swc-linux-arm64-gnu/13.0.3: + resolution: {integrity: sha512-3Z4A8JkuGWpMVbUhUPQInK/SLY+kijTT78Q/NZCrhLlyvwrVxaQALJNlXzxDLraUgv4oVH0Wz/FIw1W9PUUhxA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -3505,8 +4680,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl/12.2.0: - resolution: {integrity: sha512-XrqkHi/VglEn5zs2CYK6ofJGQySrd+Lr4YdmfJ7IhsCnMKkQY1ma9Hv5THwhZVof3e+6oFHrQ9bWrw9K4WTjFA==} + /@next/swc-linux-arm64-musl/13.0.3: + resolution: {integrity: sha512-MoYe9SM40UaunTjC+01c9OILLH3uSoeri58kDMu3KF/EFEvn1LZ6ODeDj+SLGlAc95wn46hrRJS2BPmDDE+jFQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -3514,8 +4689,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu/12.2.0: - resolution: {integrity: sha512-MyhHbAKVjpn065WzRbqpLu2krj4kHLi6RITQdD1ee+uxq9r2yg5Qe02l24NxKW+1/lkmpusl4Y5Lks7rBiJn4w==} + /@next/swc-linux-x64-gnu/13.0.3: + resolution: {integrity: sha512-z22T5WGnRanjLMXdF0NaNjSpBlEzzY43t5Ysp3nW1oI6gOkub6WdQNZeHIY7A2JwkgSWZmtjLtf+Fzzz38LHeQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -3523,8 +4698,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl/12.2.0: - resolution: {integrity: sha512-Tz1tJZ5egE0S/UqCd5V6ZPJsdSzv/8aa7FkwFmIJ9neLS8/00za+OY5pq470iZQbPrkTwpKzmfTTIPRVD5iqDg==} + /@next/swc-linux-x64-musl/13.0.3: + resolution: {integrity: sha512-ZOMT7zjBFmkusAtr47k8xs/oTLsNlTH6xvYb+iux7yly2hZGwhfBLzPGBsbeMZukZ96IphJTagT+C033s6LNVA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -3532,8 +4707,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc/12.2.0: - resolution: {integrity: sha512-0iRO/CPMCdCYUzuH6wXLnsfJX1ykBX4emOOvH0qIgtiZM0nVYbF8lkEyY2ph4XcsurpinS+ziWuYCXVqrOSqiw==} + /@next/swc-win32-arm64-msvc/13.0.3: + resolution: {integrity: sha512-Q4BM16Djl+Oah9UdGrvjFYgoftYB2jNd+rtRGPX5Mmxo09Ry/KiLbOZnoUyoIxKc1xPyfqMXuaVsAFQLYs0KEQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -3541,8 +4716,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc/12.2.0: - resolution: {integrity: sha512-8A26RJVcJHwIKm8xo/qk2ePRquJ6WCI2keV2qOW/Qm+ZXrPXHMIWPYABae/nKN243YFBNyPiHytjX37VrcpUhg==} + /@next/swc-win32-ia32-msvc/13.0.3: + resolution: {integrity: sha512-Sa8yGkNeRUsic8Qjf7MLIAfP0p0+einK/wIqJ8UO1y76j+8rRQu42AMs5H4Ax1fm9GEYq6I8njHtY59TVpTtGQ==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -3550,8 +4725,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc/12.2.0: - resolution: {integrity: sha512-OI14ozFLThEV3ey6jE47zrzSTV/6eIMsvbwozo+XfdWqOPwQ7X00YkRx4GVMKMC0rM44oGS2gmwMKYpe4EblnA==} + /@next/swc-win32-x64-msvc/13.0.3: + resolution: {integrity: sha512-IAptmSqA7k4tQzaw2NAkoEjj3+Dz9ceuvlEHwYh770MMDL4V0ku2m+UHrmn5HUCEDHhgwwjg2nyf6728q2jr1w==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3634,161 +4809,163 @@ packages: webpack-sources: 3.2.3 dev: false - /@svgr/babel-plugin-add-jsx-attribute/6.3.0_@babel+core@7.18.9: - resolution: {integrity: sha512-3XzJy0dCVEOE2o2Wn8tF9SdQ2na1Q7jJNzIs3+27RHPpEiuqlClBNhIOhPFKr95+bUGtL6nZIgqY8xBhMw0p6g==} + /@svgr/babel-plugin-add-jsx-attribute/6.5.1_@babel+core@7.20.2: + resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 + '@babel/core': 7.20.2 dev: false - /@svgr/babel-plugin-remove-jsx-attribute/6.3.0_@babel+core@7.18.9: + /@svgr/babel-plugin-remove-jsx-attribute/6.3.0_@babel+core@7.20.2: resolution: {integrity: sha512-zD0sTwXpL78pWaxWxCyqimfukPcJfToKuwW1Po00pUeOYT6KuMQrPnG6XIZpLadydOo+fght8SoxwRb5O9TtWA==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 + '@babel/core': 7.20.2 dev: false - /@svgr/babel-plugin-remove-jsx-empty-expression/6.3.0_@babel+core@7.18.9: + /@svgr/babel-plugin-remove-jsx-empty-expression/6.3.0_@babel+core@7.20.2: resolution: {integrity: sha512-COsMIL1BRU/ZxFTvd59NFzJPIdvBkV19Jrn7w1NwFmglOUrpchPRSzfW6FzWUh2C8nzJrnjDn6V7i7klVhHZEA==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 + '@babel/core': 7.20.2 dev: false - /@svgr/babel-plugin-replace-jsx-attribute-value/6.3.0_@babel+core@7.18.9: - resolution: {integrity: sha512-mKk2uqn1/7dk2I82fYaiLTw12eqmZZ2ZzH3WVhzzLvMXrLIxc9xYFJBNRMrV+77ZDHd791933HWSNChtGeJLQg==} + /@svgr/babel-plugin-replace-jsx-attribute-value/6.5.1_@babel+core@7.20.2: + resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 + '@babel/core': 7.20.2 dev: false - /@svgr/babel-plugin-svg-dynamic-title/6.3.0_@babel+core@7.18.9: - resolution: {integrity: sha512-jdQJa8DZHfo2POTmgl8ZmDEcpTEz4n6RsANle1DbbC8CGq+1k/RV4MkRL1ceqIJCSOW3ypk23gpG5Q4xlSiY7Q==} + /@svgr/babel-plugin-svg-dynamic-title/6.5.1_@babel+core@7.20.2: + resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 + '@babel/core': 7.20.2 dev: false - /@svgr/babel-plugin-svg-em-dimensions/6.3.0_@babel+core@7.18.9: - resolution: {integrity: sha512-yPogu5hLcF5FXCU3a3sCtsP+lloLBkIxM+xplumKwIdQNN28qb+HmFxVLUkT0+MD3y+77DjTtukJzkEBqL/BsA==} + /@svgr/babel-plugin-svg-em-dimensions/6.5.1_@babel+core@7.20.2: + resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 + '@babel/core': 7.20.2 dev: false - /@svgr/babel-plugin-transform-react-native-svg/6.3.0_@babel+core@7.18.9: - resolution: {integrity: sha512-Eso0uWFLN8kpR/MB+mD6j0WOTSUPWpyXpEkYt6sg4GItEMvScWgZV8H986CU09oXceaG8AovgPvYdygiJuRsRA==} + /@svgr/babel-plugin-transform-react-native-svg/6.5.1_@babel+core@7.20.2: + resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 + '@babel/core': 7.20.2 dev: false - /@svgr/babel-plugin-transform-svg-component/6.3.0_@babel+core@7.18.9: - resolution: {integrity: sha512-e9tSsPAHibGyZDPqQ8a5OIDuuON2YY6+XeCr6WqxVLwj+nIqbUOmNNZpekNsUv/gZ6UbtzEpGfZMiZavpavqDg==} + /@svgr/babel-plugin-transform-svg-component/6.5.1_@babel+core@7.20.2: + resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} engines: {node: '>=12'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 + '@babel/core': 7.20.2 dev: false - /@svgr/babel-preset/6.3.0_@babel+core@7.18.9: - resolution: {integrity: sha512-N1UWDZy/kxGW9G4q4jRD+Jyn0N+LmKw0yb9HwAWBZdFBu4ckKtc7lJLHvIFou51r11r/BsZWiJPje3fDLnTMtA==} + /@svgr/babel-preset/6.5.1_@babel+core@7.20.2: + resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.9 - '@svgr/babel-plugin-add-jsx-attribute': 6.3.0_@babel+core@7.18.9 - '@svgr/babel-plugin-remove-jsx-attribute': 6.3.0_@babel+core@7.18.9 - '@svgr/babel-plugin-remove-jsx-empty-expression': 6.3.0_@babel+core@7.18.9 - '@svgr/babel-plugin-replace-jsx-attribute-value': 6.3.0_@babel+core@7.18.9 - '@svgr/babel-plugin-svg-dynamic-title': 6.3.0_@babel+core@7.18.9 - '@svgr/babel-plugin-svg-em-dimensions': 6.3.0_@babel+core@7.18.9 - '@svgr/babel-plugin-transform-react-native-svg': 6.3.0_@babel+core@7.18.9 - '@svgr/babel-plugin-transform-svg-component': 6.3.0_@babel+core@7.18.9 - dev: false - - /@svgr/core/6.3.0: - resolution: {integrity: sha512-olON7KzAQR4oBbnRmSgJkQrpqPbHd6wURAfTR+HN+6GpcJxknEEDC+l+bpEE/jz2K4lcHex91A2cRUlsGMCazg==} + '@babel/core': 7.20.2 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1_@babel+core@7.20.2 + '@svgr/babel-plugin-remove-jsx-attribute': 6.3.0_@babel+core@7.20.2 + '@svgr/babel-plugin-remove-jsx-empty-expression': 6.3.0_@babel+core@7.20.2 + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1_@babel+core@7.20.2 + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1_@babel+core@7.20.2 + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1_@babel+core@7.20.2 + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1_@babel+core@7.20.2 + '@svgr/babel-plugin-transform-svg-component': 6.5.1_@babel+core@7.20.2 + dev: false + + /@svgr/core/6.5.1: + resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} engines: {node: '>=10'} dependencies: - '@svgr/plugin-jsx': 6.3.0_@svgr+core@6.3.0 + '@babel/core': 7.20.2 + '@svgr/babel-preset': 6.5.1_@babel+core@7.20.2 + '@svgr/plugin-jsx': 6.5.1_@svgr+core@6.5.1 camelcase: 6.3.0 cosmiconfig: 7.0.1 transitivePeerDependencies: - supports-color dev: false - /@svgr/hast-util-to-babel-ast/6.3.0: - resolution: {integrity: sha512-dlIzHVpWhjMlcTrYUSovfr4MOzm+1I8e9yIAF5eiZU5XNHs8hYDS5xL2QDakt5wd1/2MEtJie97GsCOotlstpA==} + /@svgr/hast-util-to-babel-ast/6.5.1: + resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} engines: {node: '>=10'} dependencies: - '@babel/types': 7.18.9 - entities: 4.3.1 + '@babel/types': 7.20.2 + entities: 4.4.0 dev: false - /@svgr/plugin-jsx/6.3.0_@svgr+core@6.3.0: - resolution: {integrity: sha512-1yr719Dx7c43rgqUaWaYF195bCZ/kZyPk5nWjdRwNaKqfARCfH0tTquD0a9nWkOTFnLSTGytjGdBqLNRw4X0Yw==} + /@svgr/plugin-jsx/6.5.1_@svgr+core@6.5.1: + resolution: {integrity: sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==} engines: {node: '>=10'} peerDependencies: '@svgr/core': ^6.0.0 dependencies: - '@babel/core': 7.18.9 - '@svgr/babel-preset': 6.3.0_@babel+core@7.18.9 - '@svgr/core': 6.3.0 - '@svgr/hast-util-to-babel-ast': 6.3.0 + '@babel/core': 7.20.2 + '@svgr/babel-preset': 6.5.1_@babel+core@7.20.2 + '@svgr/core': 6.5.1 + '@svgr/hast-util-to-babel-ast': 6.5.1 svg-parser: 2.0.4 transitivePeerDependencies: - supports-color dev: false - /@svgr/plugin-svgo/6.3.0_@svgr+core@6.3.0: - resolution: {integrity: sha512-HFbuewy6Gm8jZu1xqbdOB7zKipgf5DgcRG421uVfqgGredBIl1eLt2B0Qr3pFXQE8OTmRqJsZbjKpfrOu1BwkA==} + /@svgr/plugin-svgo/6.5.1_@svgr+core@6.5.1: + resolution: {integrity: sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==} engines: {node: '>=10'} peerDependencies: - '@svgr/core': ^6.0.0 + '@svgr/core': '*' dependencies: - '@svgr/core': 6.3.0 + '@svgr/core': 6.5.1 cosmiconfig: 7.0.1 deepmerge: 4.2.2 svgo: 2.8.0 dev: false - /@svgr/webpack/6.3.0: - resolution: {integrity: sha512-mtIQaV492zUu2Fq1BZRlrFf3PO1ONzfHZCki7h7ZDHWPuPi6hx32X4lNhN+tT4phPw/Sb8xPj7JNHn5Eobm/WQ==} + /@svgr/webpack/6.5.1: + resolution: {integrity: sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.18.9 - '@babel/plugin-transform-react-constant-elements': 7.18.9_@babel+core@7.18.9 - '@babel/preset-env': 7.18.9_@babel+core@7.18.9 - '@babel/preset-react': 7.18.6_@babel+core@7.18.9 - '@babel/preset-typescript': 7.18.6_@babel+core@7.18.9 - '@svgr/core': 6.3.0 - '@svgr/plugin-jsx': 6.3.0_@svgr+core@6.3.0 - '@svgr/plugin-svgo': 6.3.0_@svgr+core@6.3.0 + '@babel/core': 7.20.2 + '@babel/plugin-transform-react-constant-elements': 7.20.2_@babel+core@7.20.2 + '@babel/preset-env': 7.20.2_@babel+core@7.20.2 + '@babel/preset-react': 7.18.6_@babel+core@7.20.2 + '@babel/preset-typescript': 7.18.6_@babel+core@7.20.2 + '@svgr/core': 6.5.1 + '@svgr/plugin-jsx': 6.5.1_@svgr+core@6.5.1 + '@svgr/plugin-svgo': 6.5.1_@svgr+core@6.5.1 transitivePeerDependencies: - supports-color dev: false - /@swc/helpers/0.4.2: - resolution: {integrity: sha512-556Az0VX7WR6UdoTn4htt/l3zPQ7bsQWK+HqdG4swV7beUCxo/BqmvbOpUkTIm/9ih86LIf1qsUnywNL3obGHw==} + /@swc/helpers/0.4.11: + resolution: {integrity: sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==} dependencies: - tslib: 2.4.0 + tslib: 2.4.1 dev: false /@szmarczak/http-timer/1.1.2: @@ -3812,8 +4989,8 @@ packages: /@types/babel__core/7.1.19: resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} dependencies: - '@babel/parser': 7.18.9 - '@babel/types': 7.18.9 + '@babel/parser': 7.20.3 + '@babel/types': 7.20.2 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.17.1 @@ -3822,46 +4999,46 @@ packages: /@types/babel__generator/7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.18.9 + '@babel/types': 7.20.2 dev: true /@types/babel__template/7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.18.9 - '@babel/types': 7.18.9 + '@babel/parser': 7.20.3 + '@babel/types': 7.20.2 dev: true /@types/babel__traverse/7.17.1: resolution: {integrity: sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==} dependencies: - '@babel/types': 7.18.9 + '@babel/types': 7.20.2 dev: true /@types/body-parser/1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 17.0.45 + '@types/node': 18.11.9 dev: false /@types/bonjour/3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.9 dev: false /@types/connect-history-api-fallback/1.3.5: resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} dependencies: '@types/express-serve-static-core': 4.17.29 - '@types/node': 17.0.45 + '@types/node': 18.11.9 dev: false /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.9 dev: false /@types/debug/4.1.7: @@ -3873,11 +5050,11 @@ packages: /@types/decompress/4.2.4: resolution: {integrity: sha512-/C8kTMRTNiNuWGl5nEyKbPiMv6HA+0RbEXzFhFBEzASM6+oa4tJro9b8nj7eRlOFfuLdzUU+DS/GPDlvvzMOhA==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.9 dev: true - /@types/dom-webcodecs/0.1.4: - resolution: {integrity: sha512-dc+xSUnCaCdi/hExZArnLhiavS3E1Rdpp2+zCI6TcmJvz4qgDPBbpvCM7DsQhwRXIIpVMHO6c3s+t+JyCSqYBA==} + /@types/dom-webcodecs/0.1.5: + resolution: {integrity: sha512-dsAE+4ws75W5mmNmIZ7IKZwv4bcz5GgPuA87u+Mk1CeVWB6g7ZwBfizRwBZDeyO12RSxoU3NlRa8jgLYQeSZGg==} dev: false /@types/download/8.0.1: @@ -3885,20 +5062,20 @@ packages: dependencies: '@types/decompress': 4.2.4 '@types/got': 8.3.6 - '@types/node': 17.0.45 + '@types/node': 18.11.9 dev: true /@types/eslint-scope/3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: '@types/eslint': 8.4.5 - '@types/estree': 0.0.51 + '@types/estree': 1.0.0 dev: false /@types/eslint/8.4.5: resolution: {integrity: sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==} dependencies: - '@types/estree': 0.0.51 + '@types/estree': 1.0.0 '@types/json-schema': 7.0.11 dev: false @@ -3913,12 +5090,11 @@ packages: /@types/estree/1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} - dev: true /@types/express-serve-static-core/4.17.29: resolution: {integrity: sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.9 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: false @@ -3935,13 +5111,13 @@ packages: /@types/got/8.3.6: resolution: {integrity: sha512-nvLlj+831dhdm4LR2Ly+HTpdLyBaMynoOr6wpIxS19d/bPeHQxFU5XQ6Gp6ohBpxvCWZM1uHQIC2+ySRH1rGrQ==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.9 dev: true /@types/graceful-fs/4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.9 dev: true /@types/hast/2.3.4: @@ -3960,7 +5136,7 @@ packages: /@types/http-proxy/1.17.9: resolution: {integrity: sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.9 dev: false /@types/istanbul-lib-coverage/2.0.4: @@ -4015,13 +5191,16 @@ packages: /@types/node-fetch/2.6.2: resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.9 form-data: 3.0.1 dev: true /@types/node/17.0.45: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + /@types/node/18.11.9: + resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==} + /@types/parse-json/4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: false @@ -4074,6 +5253,14 @@ packages: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.2 csstype: 3.1.0 + dev: false + + /@types/react/18.0.25: + resolution: {integrity: sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.2 + csstype: 3.1.0 /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} @@ -4087,7 +5274,7 @@ packages: /@types/sax/1.2.4: resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.9 dev: false /@types/scheduler/0.16.2: @@ -4107,13 +5294,13 @@ packages: resolution: {integrity: sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==} dependencies: '@types/mime': 1.3.2 - '@types/node': 17.0.45 + '@types/node': 18.11.9 dev: false /@types/sockjs/0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.9 dev: false /@types/stack-utils/2.0.1: @@ -4130,7 +5317,7 @@ packages: /@types/ws/8.5.3: resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.9 dev: false /@types/yargs-parser/21.0.0: @@ -4143,8 +5330,8 @@ packages: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/parser/5.30.7_4x5o4skxv6sl53vpwefgt23khm: - resolution: {integrity: sha512-Rg5xwznHWWSy7v2o0cdho6n+xLhK2gntImp0rJroVVFkcYFYQ8C8UJTSuTw/3CnExBmPjycjmUJkxVmjXsld6A==} + /@typescript-eslint/parser/5.42.1_rmayb2veg2btbq6mbmnyivgasy: + resolution: {integrity: sha512-kAV+NiNBWVQDY9gDJDToTE/NO8BHi4f6b7zTsVAJoTkmB/zlfOpiEVBzHOKtlgTndCKe8vj9F/PuolemZSh50Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -4153,31 +5340,31 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.30.7 - '@typescript-eslint/types': 5.30.7 - '@typescript-eslint/typescript-estree': 5.30.7_typescript@4.7.4 + '@typescript-eslint/scope-manager': 5.42.1 + '@typescript-eslint/types': 5.42.1 + '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4 debug: 4.3.4 - eslint: 8.19.0 - typescript: 4.7.4 + eslint: 8.27.0 + typescript: 4.8.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.30.7: - resolution: {integrity: sha512-7BM1bwvdF1UUvt+b9smhqdc/eniOnCKxQT/kj3oXtj3LqnTWCAM0qHRHfyzCzhEfWX0zrW7KqXXeE4DlchZBKw==} + /@typescript-eslint/scope-manager/5.42.1: + resolution: {integrity: sha512-QAZY/CBP1Emx4rzxurgqj3rUinfsh/6mvuKbLNMfJMMKYLRBfweus8brgXF8f64ABkIZ3zdj2/rYYtF8eiuksQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.30.7 - '@typescript-eslint/visitor-keys': 5.30.7 + '@typescript-eslint/types': 5.42.1 + '@typescript-eslint/visitor-keys': 5.42.1 dev: true - /@typescript-eslint/types/5.30.7: - resolution: {integrity: sha512-ocVkETUs82+U+HowkovV6uxf1AnVRKCmDRNUBUUo46/5SQv1owC/EBFkiu4MOHeZqhKz2ktZ3kvJJ1uFqQ8QPg==} + /@typescript-eslint/types/5.42.1: + resolution: {integrity: sha512-Qrco9dsFF5lhalz+lLFtxs3ui1/YfC6NdXu+RAGBa8uSfn01cjO7ssCsjIsUs484vny9Xm699FSKwpkCcqwWwA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.30.7_typescript@4.7.4: - resolution: {integrity: sha512-tNslqXI1ZdmXXrHER83TJ8OTYl4epUzJC0aj2i4DMDT4iU+UqLT3EJeGQvJ17BMbm31x5scSwo3hPM0nqQ1AEA==} + /@typescript-eslint/typescript-estree/5.42.1_typescript@4.8.4: + resolution: {integrity: sha512-qElc0bDOuO0B8wDhhW4mYVgi/LZL+igPwXtV87n69/kYC/7NG3MES0jHxJNCr4EP7kY1XVsRy8C/u3DYeTKQmw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -4185,23 +5372,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.30.7 - '@typescript-eslint/visitor-keys': 5.30.7 + '@typescript-eslint/types': 5.42.1 + '@typescript-eslint/visitor-keys': 5.42.1 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.7 - tsutils: 3.21.0_typescript@4.7.4 - typescript: 4.7.4 + tsutils: 3.21.0_typescript@4.8.4 + typescript: 4.8.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/visitor-keys/5.30.7: - resolution: {integrity: sha512-KrRXf8nnjvcpxDFOKej4xkD7657+PClJs5cJVSG7NNoCNnjEdc46juNAQt7AyuWctuCgs6mVRc1xGctEqrjxWw==} + /@typescript-eslint/visitor-keys/5.42.1: + resolution: {integrity: sha512-LOQtSF4z+hejmpUvitPlc4hA7ERGoj2BVkesOcG91HCn8edLGUXbTrErmutmPbl8Bo9HjAvOO/zBKQHExXNA2A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.30.7 + '@typescript-eslint/types': 5.42.1 eslint-visitor-keys: 3.3.0 dev: true @@ -4322,7 +5509,7 @@ packages: /@yume-chan/async/2.2.0: resolution: {integrity: sha512-jatCtX1/3DsR9Vt3EB8CGFy0MNrXP5f+eNiRGHLH+LkYz7MPLzpqL/DnvXSip+Z0EKBCDnzuNuELjsKEEzcdQA==} dependencies: - tslib: 2.4.0 + tslib: 2.4.1 dev: false /@yume-chan/stream-saver/2.0.6: @@ -4357,6 +5544,14 @@ packages: acorn: 8.7.1 dev: true + /acorn-jsx/5.3.2_acorn@8.8.1: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.1 + dev: true + /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -4367,6 +5562,12 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + /acorn/8.8.1: + resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /address/1.2.0: resolution: {integrity: sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==} engines: {node: '>= 10.0.0'} @@ -4633,17 +5834,17 @@ packages: resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} dev: true - /babel-jest/28.1.3_@babel+core@7.18.9: - resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /babel-jest/29.3.1_@babel+core@7.20.2: + resolution: {integrity: sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.18.9 - '@jest/transform': 28.1.3 + '@babel/core': 7.20.2 + '@jest/transform': 29.3.1 '@types/babel__core': 7.1.19 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 28.1.3_@babel+core@7.18.9 + babel-preset-jest: 29.2.0_@babel+core@7.20.2 chalk: 4.1.2 graceful-fs: 4.2.10 slash: 3.0.0 @@ -4692,7 +5893,7 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.0 @@ -4701,24 +5902,37 @@ packages: - supports-color dev: true - /babel-plugin-jest-hoist/28.1.3: - resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /babel-plugin-jest-hoist/29.2.0: + resolution: {integrity: sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.18.6 - '@babel/types': 7.18.9 + '@babel/template': 7.18.10 + '@babel/types': 7.20.2 '@types/babel__core': 7.1.19 '@types/babel__traverse': 7.17.1 dev: true - /babel-plugin-polyfill-corejs2/0.3.1_@babel+core@7.18.9: - resolution: {integrity: sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==} + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.18.9: + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.18.8 + '@babel/compat-data': 7.20.1 '@babel/core': 7.18.9 - '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.18.9 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.18.9 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.20.2: + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.20.1 + '@babel/core': 7.20.2 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.2 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -4730,8 +5944,20 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.18.9 - core-js-compat: 3.23.5 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.18.9 + core-js-compat: 3.26.0 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.20.2: + resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.2 + core-js-compat: 3.26.0 transitivePeerDependencies: - supports-color dev: false @@ -4742,40 +5968,51 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.9 - '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.18.9 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.18.9 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.20.2: + resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.2 transitivePeerDependencies: - supports-color dev: false - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.18.9: + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.20.2: resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.18.9 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.18.9 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.18.9 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.18.9 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.18.9 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.18.9 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.18.9 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.18.9 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.18.9 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.18.9 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.18.9 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.18.9 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.18.9 - dev: true - - /babel-preset-jest/28.1.3_@babel+core@7.18.9: - resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + '@babel/core': 7.20.2 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.2 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.2 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.20.2 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.2 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.2 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.2 + dev: true + + /babel-preset-jest/29.2.0_@babel+core@7.20.2: + resolution: {integrity: sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.18.9 - babel-plugin-jest-hoist: 28.1.3 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.18.9 + '@babel/core': 7.20.2 + babel-plugin-jest-hoist: 29.2.0 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.2 dev: true /bail/1.0.5: @@ -4833,8 +6070,6 @@ packages: raw-body: 2.5.1 type-is: 1.6.18 unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color dev: false /bonjour-service/1.0.13: @@ -4899,6 +6134,17 @@ packages: electron-to-chromium: 1.4.194 node-releases: 2.0.6 update-browserslist-db: 1.0.5_browserslist@4.21.2 + dev: false + + /browserslist/4.21.4: + resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001431 + electron-to-chromium: 1.4.284 + node-releases: 2.0.6 + update-browserslist-db: 1.0.10_browserslist@4.21.4 /bs-logger/0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} @@ -4991,7 +6237,7 @@ packages: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 - tslib: 2.4.0 + tslib: 2.4.1 dev: false /camelcase-css/2.0.1: @@ -5011,14 +6257,18 @@ packages: /caniuse-api/3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.21.2 - caniuse-lite: 1.0.30001367 + browserslist: 4.21.4 + caniuse-lite: 1.0.30001431 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: false /caniuse-lite/1.0.30001367: resolution: {integrity: sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw==} + dev: false + + /caniuse-lite/1.0.30001431: + resolution: {integrity: sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==} /ccount/1.1.0: resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} @@ -5163,6 +6413,10 @@ packages: '@colors/colors': 1.5.0 dev: false + /client-only/0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + /cliui/7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: @@ -5295,8 +6549,6 @@ packages: on-headers: 1.0.2 safe-buffer: 5.1.2 vary: 1.1.2 - transitivePeerDependencies: - - supports-color dev: false /concat-map/0.0.1: @@ -5344,6 +6596,10 @@ packages: dependencies: safe-buffer: 5.1.2 + /convert-source-map/2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + /cookie-signature/1.0.6: resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} dev: false @@ -5373,11 +6629,10 @@ packages: webpack: 5.73.0 dev: false - /core-js-compat/3.23.5: - resolution: {integrity: sha512-fHYozIFIxd+91IIbXJgWd/igXIc8Mf9is0fusswjnGIWVG96y2cwyUdlCkGOw6rMLHKAxg7xtCIVaHsyOUnJIg==} + /core-js-compat/3.26.0: + resolution: {integrity: sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==} dependencies: - browserslist: 4.21.2 - semver: 7.0.0 + browserslist: 4.21.4 dev: false /core-js-pure/3.23.5: @@ -5632,21 +6887,11 @@ packages: /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true dependencies: ms: 2.0.0 /debug/3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true dependencies: ms: 2.1.3 dev: true @@ -5833,8 +7078,6 @@ packages: dependencies: address: 1.2.0 debug: 2.6.9 - transitivePeerDependencies: - - supports-color dev: false /detect-port/1.3.0: @@ -5844,13 +7087,11 @@ packages: dependencies: address: 1.2.0 debug: 2.6.9 - transitivePeerDependencies: - - supports-color dev: false - /diff-sequences/28.1.1: - resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /diff-sequences/29.3.1: + resolution: {integrity: sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true /diff/5.1.0: @@ -5908,7 +7149,7 @@ packages: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 - entities: 4.3.1 + entities: 4.4.0 dev: false /domelementtype/2.3.0: @@ -5949,7 +7190,7 @@ packages: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 - tslib: 2.4.0 + tslib: 2.4.1 dev: false /dot-prop/5.3.0: @@ -5993,9 +7234,13 @@ packages: /electron-to-chromium/1.4.194: resolution: {integrity: sha512-ola5UH0xAP1oYY0FFUsPvwtucEzCQHucXnT7PQ1zjHJMccZhCDktEugI++JUR3YuIs7Ff7afz+OVEhVAIMhLAQ==} + dev: false + + /electron-to-chromium/1.4.284: + resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} - /emittery/0.10.2: - resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} + /emittery/0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} dev: true @@ -6036,8 +7281,8 @@ packages: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} dev: false - /entities/4.3.1: - resolution: {integrity: sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==} + /entities/4.4.0: + resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} engines: {node: '>=0.12'} dev: false @@ -6120,8 +7365,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /eslint-config-next/12.2.0_4x5o4skxv6sl53vpwefgt23khm: - resolution: {integrity: sha512-QWzNegadFXjQ0h3hixnLacRM9Kot85vQefyNsA8IeOnERZMz0Gvays1W6DMCjSxJbnCwuWaMXj9DCpar5IahRA==} + /eslint-config-next/13.0.3_rmayb2veg2btbq6mbmnyivgasy: + resolution: {integrity: sha512-i2JoQP8gGv303GjXTonA27fm1ckRRkRoAP1WYEQgN0D2DDoFeBPqlJgHlMHnXKWjmNct/sW8jQEvy9am2juc8g==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: '>=3.3.1' @@ -6129,19 +7374,18 @@ packages: typescript: optional: true dependencies: - '@next/eslint-plugin-next': 12.2.0 + '@next/eslint-plugin-next': 13.0.3 '@rushstack/eslint-patch': 1.1.4 - '@typescript-eslint/parser': 5.30.7_4x5o4skxv6sl53vpwefgt23khm - eslint: 8.19.0 + '@typescript-eslint/parser': 5.42.1_rmayb2veg2btbq6mbmnyivgasy + eslint: 8.27.0 eslint-import-resolver-node: 0.3.6 - eslint-import-resolver-typescript: 2.7.1_q2xwze32dd33a2fc2qubwr4ie4 - eslint-plugin-import: 2.26.0_3xvphbmcbxjezmkjl3d52ihtxa - eslint-plugin-jsx-a11y: 6.6.0_eslint@8.19.0 - eslint-plugin-react: 7.30.1_eslint@8.19.0 - eslint-plugin-react-hooks: 4.6.0_eslint@8.19.0 - typescript: 4.7.4 - transitivePeerDependencies: - - eslint-import-resolver-webpack + eslint-import-resolver-typescript: 2.7.1_dcpv4nbdr5ks2h5677xdltrk6e + eslint-plugin-import: 2.26.0_eslint@8.27.0 + eslint-plugin-jsx-a11y: 6.6.0_eslint@8.27.0 + eslint-plugin-react: 7.31.10_eslint@8.27.0 + eslint-plugin-react-hooks: 4.6.0_eslint@8.27.0 + typescript: 4.8.4 + transitivePeerDependencies: - supports-color dev: true @@ -6150,11 +7394,9 @@ packages: dependencies: debug: 3.2.7 resolve: 1.22.1 - transitivePeerDependencies: - - supports-color dev: true - /eslint-import-resolver-typescript/2.7.1_q2xwze32dd33a2fc2qubwr4ie4: + /eslint-import-resolver-typescript/2.7.1_dcpv4nbdr5ks2h5677xdltrk6e: resolution: {integrity: sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==} engines: {node: '>=4'} peerDependencies: @@ -6162,8 +7404,8 @@ packages: eslint-plugin-import: '*' dependencies: debug: 4.3.4 - eslint: 8.19.0 - eslint-plugin-import: 2.26.0_3xvphbmcbxjezmkjl3d52ihtxa + eslint: 8.27.0 + eslint-plugin-import: 2.26.0_eslint@8.27.0 glob: 7.2.3 is-glob: 4.0.3 resolve: 1.22.1 @@ -6172,51 +7414,27 @@ packages: - supports-color dev: true - /eslint-module-utils/2.7.3_ggupe3rfxc6u74is6c4nrru3k4: + /eslint-module-utils/2.7.3: resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true dependencies: - '@typescript-eslint/parser': 5.30.7_4x5o4skxv6sl53vpwefgt23khm debug: 3.2.7 - eslint-import-resolver-node: 0.3.6 - eslint-import-resolver-typescript: 2.7.1_q2xwze32dd33a2fc2qubwr4ie4 find-up: 2.1.0 - transitivePeerDependencies: - - supports-color dev: true - /eslint-plugin-import/2.26.0_3xvphbmcbxjezmkjl3d52ihtxa: + /eslint-plugin-import/2.26.0_eslint@8.27.0: resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} engines: {node: '>=4'} peerDependencies: - '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true dependencies: - '@typescript-eslint/parser': 5.30.7_4x5o4skxv6sl53vpwefgt23khm array-includes: 3.1.5 array.prototype.flat: 1.3.0 debug: 2.6.9 doctrine: 2.1.0 - eslint: 8.19.0 + eslint: 8.27.0 eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.3_ggupe3rfxc6u74is6c4nrru3k4 + eslint-module-utils: 2.7.3 has: 1.0.3 is-core-module: 2.9.0 is-glob: 4.0.3 @@ -6224,13 +7442,9 @@ packages: object.values: 1.1.5 resolve: 1.22.1 tsconfig-paths: 3.14.1 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color dev: true - /eslint-plugin-jsx-a11y/6.6.0_eslint@8.19.0: + /eslint-plugin-jsx-a11y/6.6.0_eslint@8.27.0: resolution: {integrity: sha512-kTeLuIzpNhXL2CwLlc8AHI0aFRwWHcg483yepO9VQiHzM9bZwJdzTkzBszbuPrbgGmq2rlX/FaT2fJQsjUSHsw==} engines: {node: '>=4.0'} peerDependencies: @@ -6244,7 +7458,7 @@ packages: axobject-query: 2.2.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.19.0 + eslint: 8.27.0 has: 1.0.3 jsx-ast-utils: 3.3.2 language-tags: 1.0.5 @@ -6252,17 +7466,17 @@ packages: semver: 6.3.0 dev: true - /eslint-plugin-react-hooks/4.6.0_eslint@8.19.0: + /eslint-plugin-react-hooks/4.6.0_eslint@8.27.0: resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.19.0 + eslint: 8.27.0 dev: true - /eslint-plugin-react/7.30.1_eslint@8.19.0: - resolution: {integrity: sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==} + /eslint-plugin-react/7.31.10_eslint@8.27.0: + resolution: {integrity: sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 @@ -6270,7 +7484,7 @@ packages: array-includes: 3.1.5 array.prototype.flatmap: 1.3.0 doctrine: 2.1.0 - eslint: 8.19.0 + eslint: 8.27.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.2 minimatch: 3.1.2 @@ -6300,13 +7514,13 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.19.0: + /eslint-utils/3.0.0_eslint@8.27.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.19.0 + eslint: 8.27.0 eslint-visitor-keys: 2.1.0 dev: true @@ -6320,13 +7534,15 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.19.0: - resolution: {integrity: sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw==} + /eslint/8.27.0: + resolution: {integrity: sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint/eslintrc': 1.3.0 - '@humanwhocodes/config-array': 0.9.5 + '@eslint/eslintrc': 1.3.3 + '@humanwhocodes/config-array': 0.11.7 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -6334,20 +7550,23 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.19.0 + eslint-utils: 3.0.0_eslint@8.27.0 eslint-visitor-keys: 3.3.0 - espree: 9.3.2 + espree: 9.4.1 esquery: 1.4.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 - functional-red-black-tree: 1.0.1 + find-up: 5.0.0 glob-parent: 6.0.2 globals: 13.16.0 + grapheme-splitter: 1.0.4 ignore: 5.2.0 import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.1.5 js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 @@ -6359,17 +7578,16 @@ packages: strip-ansi: 6.0.1 strip-json-comments: 3.1.1 text-table: 0.2.0 - v8-compile-cache: 2.3.0 transitivePeerDependencies: - supports-color dev: true - /espree/9.3.2: - resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==} + /espree/9.4.1: + resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.7.1 - acorn-jsx: 5.3.2_acorn@8.7.1 + acorn: 8.8.1 + acorn-jsx: 5.3.2_acorn@8.8.1 eslint-visitor-keys: 3.3.0 dev: true @@ -6447,7 +7665,7 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.9 require-like: 0.1.2 dev: false @@ -6479,15 +7697,15 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /expect/28.1.3: - resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /expect/29.3.1: + resolution: {integrity: sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/expect-utils': 28.1.3 - jest-get-type: 28.0.2 - jest-matcher-utils: 28.1.3 - jest-message-util: 28.1.3 - jest-util: 28.1.3 + '@jest/expect-utils': 29.3.1 + jest-get-type: 29.2.0 + jest-matcher-utils: 29.3.1 + jest-message-util: 29.3.1 + jest-util: 29.3.1 dev: true /express/4.18.1: @@ -6525,8 +7743,6 @@ packages: type-is: 1.6.18 utils-merge: 1.0.1 vary: 1.1.2 - transitivePeerDependencies: - - supports-color dev: false /ext-list/2.2.2: @@ -6734,8 +7950,6 @@ packages: parseurl: 1.3.3 statuses: 2.0.1 unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color dev: false /find-cache-dir/3.3.2: @@ -6774,7 +7988,6 @@ packages: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: false /flat-cache/3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} @@ -6788,14 +8001,14 @@ packages: resolution: {integrity: sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==} dev: true - /flux/4.0.3_react@17.0.2: + /flux/4.0.3_react@18.2.0: resolution: {integrity: sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==} peerDependencies: react: ^15.0.2 || ^16.0.0 || ^17.0.0 dependencies: fbemitter: 3.0.0 fbjs: 3.0.4 - react: 17.0.2 + react: 18.2.0 transitivePeerDependencies: - encoding dev: false @@ -6927,10 +8140,6 @@ packages: functions-have-names: 1.2.3 dev: true - /functional-red-black-tree/1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - dev: true - /functions-have-names/1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true @@ -7156,6 +8365,10 @@ packages: /graceful-fs/4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + /grapheme-splitter/1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + /gray-matter/4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} @@ -7404,7 +8617,7 @@ packages: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.0.1 - entities: 4.3.1 + entities: 4.4.0 dev: false /http-cache-semantics/3.8.1: @@ -7794,7 +9007,6 @@ packages: /is-path-inside/3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - dev: false /is-plain-obj/1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} @@ -7934,8 +9146,8 @@ packages: resolution: {integrity: sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.18.9 - '@babel/parser': 7.18.9 + '@babel/core': 7.20.2 + '@babel/parser': 7.20.3 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.0 @@ -7979,44 +9191,44 @@ packages: is-object: 1.0.2 dev: true - /jest-changed-files/28.1.3: - resolution: {integrity: sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-changed-files/29.2.0: + resolution: {integrity: sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: execa: 5.1.1 p-limit: 3.1.0 dev: true - /jest-circus/28.1.3: - resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-circus/29.3.1: + resolution: {integrity: sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 28.1.3 - '@jest/expect': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 17.0.45 + '@jest/environment': 29.3.1 + '@jest/expect': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 is-generator-fn: 2.1.0 - jest-each: 28.1.3 - jest-matcher-utils: 28.1.3 - jest-message-util: 28.1.3 - jest-runtime: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 + jest-each: 29.3.1 + jest-matcher-utils: 29.3.1 + jest-message-util: 29.3.1 + jest-runtime: 29.3.1 + jest-snapshot: 29.3.1 + jest-util: 29.3.1 p-limit: 3.1.0 - pretty-format: 28.1.3 + pretty-format: 29.3.1 slash: 3.0.0 stack-utils: 2.0.5 transitivePeerDependencies: - supports-color dev: true - /jest-cli/28.1.3: - resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-cli/29.3.1: + resolution: {integrity: sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -8024,16 +9236,16 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 + '@jest/core': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/types': 29.3.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.10 import-local: 3.1.0 - jest-config: 28.1.3 - jest-util: 28.1.3 - jest-validate: 28.1.3 + jest-config: 29.3.1 + jest-util: 29.3.1 + jest-validate: 29.3.1 prompts: 2.4.2 yargs: 17.5.1 transitivePeerDependencies: @@ -8042,9 +9254,9 @@ packages: - ts-node dev: true - /jest-cli/28.1.3_@types+node@17.0.45: - resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-cli/29.3.1_@types+node@18.11.9: + resolution: {integrity: sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -8052,16 +9264,16 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 + '@jest/core': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/types': 29.3.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.10 import-local: 3.1.0 - jest-config: 28.1.3_@types+node@17.0.45 - jest-util: 28.1.3 - jest-validate: 28.1.3 + jest-config: 29.3.1_@types+node@18.11.9 + jest-util: 29.3.1 + jest-validate: 29.3.1 prompts: 2.4.2 yargs: 17.5.1 transitivePeerDependencies: @@ -8070,9 +9282,9 @@ packages: - ts-node dev: true - /jest-config/28.1.3: - resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-config/29.3.1: + resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' ts-node: '>=9.0.0' @@ -8082,35 +9294,35 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.18.9 - '@jest/test-sequencer': 28.1.3 - '@jest/types': 28.1.3 - babel-jest: 28.1.3_@babel+core@7.18.9 + '@babel/core': 7.20.2 + '@jest/test-sequencer': 29.3.1 + '@jest/types': 29.3.1 + babel-jest: 29.3.1_@babel+core@7.20.2 chalk: 4.1.2 ci-info: 3.3.2 deepmerge: 4.2.2 glob: 7.2.3 graceful-fs: 4.2.10 - jest-circus: 28.1.3 - jest-environment-node: 28.1.3 - jest-get-type: 28.0.2 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-runner: 28.1.3 - jest-util: 28.1.3 - jest-validate: 28.1.3 + jest-circus: 29.3.1 + jest-environment-node: 29.3.1 + jest-get-type: 29.2.0 + jest-regex-util: 29.2.0 + jest-resolve: 29.3.1 + jest-runner: 29.3.1 + jest-util: 29.3.1 + jest-validate: 29.3.1 micromatch: 4.0.5 parse-json: 5.2.0 - pretty-format: 28.1.3 + pretty-format: 29.3.1 slash: 3.0.0 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color dev: true - /jest-config/28.1.3_@types+node@17.0.45: - resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-config/29.3.1_@types+node@18.11.9: + resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' ts-node: '>=9.0.0' @@ -8120,139 +9332,140 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.18.9 - '@jest/test-sequencer': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 17.0.45 - babel-jest: 28.1.3_@babel+core@7.18.9 + '@babel/core': 7.20.2 + '@jest/test-sequencer': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 + babel-jest: 29.3.1_@babel+core@7.20.2 chalk: 4.1.2 ci-info: 3.3.2 deepmerge: 4.2.2 glob: 7.2.3 graceful-fs: 4.2.10 - jest-circus: 28.1.3 - jest-environment-node: 28.1.3 - jest-get-type: 28.0.2 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-runner: 28.1.3 - jest-util: 28.1.3 - jest-validate: 28.1.3 + jest-circus: 29.3.1 + jest-environment-node: 29.3.1 + jest-get-type: 29.2.0 + jest-regex-util: 29.2.0 + jest-resolve: 29.3.1 + jest-runner: 29.3.1 + jest-util: 29.3.1 + jest-validate: 29.3.1 micromatch: 4.0.5 parse-json: 5.2.0 - pretty-format: 28.1.3 + pretty-format: 29.3.1 slash: 3.0.0 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color dev: true - /jest-diff/28.1.3: - resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-diff/29.3.1: + resolution: {integrity: sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 - diff-sequences: 28.1.1 - jest-get-type: 28.0.2 - pretty-format: 28.1.3 + diff-sequences: 29.3.1 + jest-get-type: 29.2.0 + pretty-format: 29.3.1 dev: true - /jest-docblock/28.1.1: - resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-docblock/29.2.0: + resolution: {integrity: sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 dev: true - /jest-each/28.1.3: - resolution: {integrity: sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-each/29.3.1: + resolution: {integrity: sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 28.1.3 + '@jest/types': 29.3.1 chalk: 4.1.2 - jest-get-type: 28.0.2 - jest-util: 28.1.3 - pretty-format: 28.1.3 + jest-get-type: 29.2.0 + jest-util: 29.3.1 + pretty-format: 29.3.1 dev: true - /jest-environment-node/28.1.3: - resolution: {integrity: sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-environment-node/29.3.1: + resolution: {integrity: sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 28.1.3 - '@jest/fake-timers': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 17.0.45 - jest-mock: 28.1.3 - jest-util: 28.1.3 + '@jest/environment': 29.3.1 + '@jest/fake-timers': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 + jest-mock: 29.3.1 + jest-util: 29.3.1 dev: true - /jest-get-type/28.0.2: - resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-get-type/29.2.0: + resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-haste-map/28.1.3: - resolution: {integrity: sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-haste-map/29.3.1: + resolution: {integrity: sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 28.1.3 + '@jest/types': 29.3.1 '@types/graceful-fs': 4.1.5 - '@types/node': 17.0.45 + '@types/node': 18.11.9 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.10 - jest-regex-util: 28.0.2 - jest-util: 28.1.3 - jest-worker: 28.1.3 + jest-regex-util: 29.2.0 + jest-util: 29.3.1 + jest-worker: 29.3.1 micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: fsevents: 2.3.2 dev: true - /jest-leak-detector/28.1.3: - resolution: {integrity: sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-leak-detector/29.3.1: + resolution: {integrity: sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-get-type: 28.0.2 - pretty-format: 28.1.3 + jest-get-type: 29.2.0 + pretty-format: 29.3.1 dev: true - /jest-matcher-utils/28.1.3: - resolution: {integrity: sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-matcher-utils/29.3.1: + resolution: {integrity: sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 - jest-diff: 28.1.3 - jest-get-type: 28.0.2 - pretty-format: 28.1.3 + jest-diff: 29.3.1 + jest-get-type: 29.2.0 + pretty-format: 29.3.1 dev: true - /jest-message-util/28.1.3: - resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-message-util/29.3.1: + resolution: {integrity: sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/code-frame': 7.18.6 - '@jest/types': 28.1.3 + '@jest/types': 29.3.1 '@types/stack-utils': 2.0.1 chalk: 4.1.2 graceful-fs: 4.2.10 micromatch: 4.0.5 - pretty-format: 28.1.3 + pretty-format: 29.3.1 slash: 3.0.0 stack-utils: 2.0.5 dev: true - /jest-mock/28.1.3: - resolution: {integrity: sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-mock/29.3.1: + resolution: {integrity: sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 28.1.3 - '@types/node': 17.0.45 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 + jest-util: 29.3.1 dev: true - /jest-pnp-resolver/1.2.2_jest-resolve@28.1.3: + /jest-pnp-resolver/1.2.2_jest-resolve@29.3.1: resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} engines: {node: '>=6'} peerDependencies: @@ -8261,164 +9474,165 @@ packages: jest-resolve: optional: true dependencies: - jest-resolve: 28.1.3 + jest-resolve: 29.3.1 dev: true - /jest-regex-util/28.0.2: - resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-regex-util/29.2.0: + resolution: {integrity: sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-resolve-dependencies/28.1.3: - resolution: {integrity: sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-resolve-dependencies/29.3.1: + resolution: {integrity: sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-regex-util: 28.0.2 - jest-snapshot: 28.1.3 + jest-regex-util: 29.2.0 + jest-snapshot: 29.3.1 transitivePeerDependencies: - supports-color dev: true - /jest-resolve/28.1.3: - resolution: {integrity: sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-resolve/29.3.1: + resolution: {integrity: sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.10 - jest-haste-map: 28.1.3 - jest-pnp-resolver: 1.2.2_jest-resolve@28.1.3 - jest-util: 28.1.3 - jest-validate: 28.1.3 + jest-haste-map: 29.3.1 + jest-pnp-resolver: 1.2.2_jest-resolve@29.3.1 + jest-util: 29.3.1 + jest-validate: 29.3.1 resolve: 1.22.1 resolve.exports: 1.1.0 slash: 3.0.0 dev: true - /jest-runner/28.1.3: - resolution: {integrity: sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-runner/29.3.1: + resolution: {integrity: sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 28.1.3 - '@jest/environment': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 17.0.45 + '@jest/console': 29.3.1 + '@jest/environment': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 chalk: 4.1.2 - emittery: 0.10.2 + emittery: 0.13.1 graceful-fs: 4.2.10 - jest-docblock: 28.1.1 - jest-environment-node: 28.1.3 - jest-haste-map: 28.1.3 - jest-leak-detector: 28.1.3 - jest-message-util: 28.1.3 - jest-resolve: 28.1.3 - jest-runtime: 28.1.3 - jest-util: 28.1.3 - jest-watcher: 28.1.3 - jest-worker: 28.1.3 + jest-docblock: 29.2.0 + jest-environment-node: 29.3.1 + jest-haste-map: 29.3.1 + jest-leak-detector: 29.3.1 + jest-message-util: 29.3.1 + jest-resolve: 29.3.1 + jest-runtime: 29.3.1 + jest-util: 29.3.1 + jest-watcher: 29.3.1 + jest-worker: 29.3.1 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color dev: true - /jest-runtime/28.1.3: - resolution: {integrity: sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-runtime/29.3.1: + resolution: {integrity: sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 28.1.3 - '@jest/fake-timers': 28.1.3 - '@jest/globals': 28.1.3 - '@jest/source-map': 28.1.2 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 + '@jest/environment': 29.3.1 + '@jest/fake-timers': 29.3.1 + '@jest/globals': 29.3.1 + '@jest/source-map': 29.2.0 + '@jest/test-result': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 - execa: 5.1.1 glob: 7.2.3 graceful-fs: 4.2.10 - jest-haste-map: 28.1.3 - jest-message-util: 28.1.3 - jest-mock: 28.1.3 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 + jest-haste-map: 29.3.1 + jest-message-util: 29.3.1 + jest-mock: 29.3.1 + jest-regex-util: 29.2.0 + jest-resolve: 29.3.1 + jest-snapshot: 29.3.1 + jest-util: 29.3.1 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color dev: true - /jest-snapshot/28.1.3: - resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-snapshot/29.3.1: + resolution: {integrity: sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.18.9 - '@babel/generator': 7.18.9 - '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.18.9 - '@babel/traverse': 7.18.9 - '@babel/types': 7.18.9 - '@jest/expect-utils': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 + '@babel/core': 7.20.2 + '@babel/generator': 7.20.4 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.20.2 + '@babel/traverse': 7.20.1 + '@babel/types': 7.20.2 + '@jest/expect-utils': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 '@types/babel__traverse': 7.17.1 '@types/prettier': 2.6.3 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.18.9 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.2 chalk: 4.1.2 - expect: 28.1.3 + expect: 29.3.1 graceful-fs: 4.2.10 - jest-diff: 28.1.3 - jest-get-type: 28.0.2 - jest-haste-map: 28.1.3 - jest-matcher-utils: 28.1.3 - jest-message-util: 28.1.3 - jest-util: 28.1.3 + jest-diff: 29.3.1 + jest-get-type: 29.2.0 + jest-haste-map: 29.3.1 + jest-matcher-utils: 29.3.1 + jest-message-util: 29.3.1 + jest-util: 29.3.1 natural-compare: 1.4.0 - pretty-format: 28.1.3 + pretty-format: 29.3.1 semver: 7.3.7 transitivePeerDependencies: - supports-color dev: true - /jest-util/28.1.3: - resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-util/29.3.1: + resolution: {integrity: sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 28.1.3 - '@types/node': 17.0.45 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 chalk: 4.1.2 ci-info: 3.3.2 graceful-fs: 4.2.10 picomatch: 2.3.1 dev: true - /jest-validate/28.1.3: - resolution: {integrity: sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-validate/29.3.1: + resolution: {integrity: sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 28.1.3 + '@jest/types': 29.3.1 camelcase: 6.3.0 chalk: 4.1.2 - jest-get-type: 28.0.2 + jest-get-type: 29.2.0 leven: 3.1.0 - pretty-format: 28.1.3 + pretty-format: 29.3.1 dev: true - /jest-watcher/28.1.3: - resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-watcher/29.3.1: + resolution: {integrity: sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 17.0.45 + '@jest/test-result': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 ansi-escapes: 4.3.2 chalk: 4.1.2 - emittery: 0.10.2 - jest-util: 28.1.3 + emittery: 0.13.1 + jest-util: 29.3.1 string-length: 4.0.2 dev: true @@ -8426,23 +9640,24 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.9 merge-stream: 2.0.0 supports-color: 8.1.1 dev: false - /jest-worker/28.1.3: - resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-worker/29.3.1: + resolution: {integrity: sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.9 + jest-util: 29.3.1 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest/28.1.3: - resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest/29.3.1: + resolution: {integrity: sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -8450,19 +9665,19 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 28.1.3 - '@jest/types': 28.1.3 + '@jest/core': 29.3.1 + '@jest/types': 29.3.1 import-local: 3.1.0 - jest-cli: 28.1.3 + jest-cli: 29.3.1 transitivePeerDependencies: - '@types/node' - supports-color - ts-node dev: true - /jest/28.1.3_@types+node@17.0.45: - resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest/29.3.1_@types+node@18.11.9: + resolution: {integrity: sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -8470,10 +9685,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 28.1.3 - '@jest/types': 28.1.3 + '@jest/core': 29.3.1 + '@jest/types': 29.3.1 import-local: 3.1.0 - jest-cli: 28.1.3_@types+node@17.0.45 + jest-cli: 29.3.1_@types+node@18.11.9 transitivePeerDependencies: - '@types/node' - supports-color @@ -8490,6 +9705,10 @@ packages: '@sideway/pinpoint': 2.0.0 dev: false + /js-sdsl/4.1.5: + resolution: {integrity: sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==} + dev: true + /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -8675,7 +9894,6 @@ packages: engines: {node: '>=10'} dependencies: p-locate: 5.0.0 - dev: false /lodash.curry/4.1.1: resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} @@ -8717,7 +9935,7 @@ packages: /lower-case/2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: - tslib: 2.4.0 + tslib: 2.4.1 dev: false /lowercase-keys/1.0.0: @@ -9254,15 +10472,16 @@ packages: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} - /mini-create-react-context/0.4.1_at7mkepldmzoo6silmqc5bca74: + /mini-create-react-context/0.4.1_sh5qlbywuemxd2y3xkrw2y2kr4: resolution: {integrity: sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: prop-types: ^15.0.0 react: ^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@babel/runtime': 7.18.9 prop-types: 15.8.1 - react: 17.0.2 + react: 18.2.0 tiny-warning: 1.0.3 dev: false @@ -9299,7 +10518,7 @@ packages: /minimist/1.2.6: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} - /mobx-react-lite/3.4.0_vuaia3cr2ucdrk3q4mauc2kfvi: + /mobx-react-lite/3.4.0_qrr2ojv4n7h7ey2xj7njerqqr4: resolution: {integrity: sha512-bRuZp3C0itgLKHu/VNxi66DN/XVkQG7xtoBVWxpvC5FhAqbOCP21+nPhULjnzEqd7xBMybp6KwytdUpZKEgpIQ==} peerDependencies: mobx: ^6.1.0 @@ -9312,13 +10531,13 @@ packages: react-native: optional: true dependencies: - mobx: 6.6.1 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + mobx: 6.6.2 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 dev: false - /mobx/6.6.1: - resolution: {integrity: sha512-7su3UZv5JF+ohLr2opabjbUAERfXstMY+wiBtey8yNAPoB8H187RaQXuhFjNkH8aE4iHbDWnhDFZw0+5ic4nGQ==} + /mobx/6.6.2: + resolution: {integrity: sha512-IOpS0bf3+hXIhDIy+CmlNMBfFpAbHS0aVHcNC+xH/TFYEKIIVDKNYRh9eKlXuVfJ1iRKAp0cRVmO145CyJAMVQ==} dev: false /mri/1.2.0: @@ -9367,15 +10586,15 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: false - /next/12.2.0_sfoxds7t5ydpegc3knd667wn6m: - resolution: {integrity: sha512-B4j7D3SHYopLYx6/Ark0fenwIar9tEaZZFAaxmKjgcMMexhVJzB3jt7X+6wcdXPPMeUD6r09weUtnDpjox/vIA==} - engines: {node: '>=12.22.0'} + /next/13.0.3_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-rFQeepcenRxKzeKlh1CsmEnxsJwhIERtbUjmYnKZyDInZsU06lvaGw5DT44rlNp1Rv2MT/e9vffZ8vK+ytwXHA==} + engines: {node: '>=14.6.0'} hasBin: true peerDependencies: fibers: '>= 3.1.0' node-sass: ^6.0.0 || ^7.0.0 - react: ^17.0.2 || ^18.0.0-0 - react-dom: ^17.0.2 || ^18.0.0-0 + react: ^18.2.0 + react-dom: ^18.2.0 sass: ^1.3.0 peerDependenciesMeta: fibers: @@ -9385,28 +10604,28 @@ packages: sass: optional: true dependencies: - '@next/env': 12.2.0 - '@swc/helpers': 0.4.2 - caniuse-lite: 1.0.30001367 - postcss: 8.4.5 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - styled-jsx: 5.0.2_react@17.0.2 - use-sync-external-store: 1.1.0_react@17.0.2 + '@next/env': 13.0.3 + '@swc/helpers': 0.4.11 + caniuse-lite: 1.0.30001431 + postcss: 8.4.14 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + styled-jsx: 5.1.0_react@18.2.0 + use-sync-external-store: 1.2.0_react@18.2.0 optionalDependencies: - '@next/swc-android-arm-eabi': 12.2.0 - '@next/swc-android-arm64': 12.2.0 - '@next/swc-darwin-arm64': 12.2.0 - '@next/swc-darwin-x64': 12.2.0 - '@next/swc-freebsd-x64': 12.2.0 - '@next/swc-linux-arm-gnueabihf': 12.2.0 - '@next/swc-linux-arm64-gnu': 12.2.0 - '@next/swc-linux-arm64-musl': 12.2.0 - '@next/swc-linux-x64-gnu': 12.2.0 - '@next/swc-linux-x64-musl': 12.2.0 - '@next/swc-win32-arm64-msvc': 12.2.0 - '@next/swc-win32-ia32-msvc': 12.2.0 - '@next/swc-win32-x64-msvc': 12.2.0 + '@next/swc-android-arm-eabi': 13.0.3 + '@next/swc-android-arm64': 13.0.3 + '@next/swc-darwin-arm64': 13.0.3 + '@next/swc-darwin-x64': 13.0.3 + '@next/swc-freebsd-x64': 13.0.3 + '@next/swc-linux-arm-gnueabihf': 13.0.3 + '@next/swc-linux-arm64-gnu': 13.0.3 + '@next/swc-linux-arm64-musl': 13.0.3 + '@next/swc-linux-x64-gnu': 13.0.3 + '@next/swc-linux-x64-musl': 13.0.3 + '@next/swc-win32-arm64-msvc': 13.0.3 + '@next/swc-win32-ia32-msvc': 13.0.3 + '@next/swc-win32-x64-msvc': 13.0.3 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -9416,7 +10635,7 @@ packages: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: 2.4.0 + tslib: 2.4.1 dev: false /node-domexception/1.0.0: @@ -9441,8 +10660,8 @@ packages: dependencies: whatwg-url: 5.0.0 - /node-fetch/3.2.9: - resolution: {integrity: sha512-/2lI+DBecVvVm9tDhjziTVjo2wmTsSxSk58saUYP0P/fRJ3xxtfMDY24+CKTkfm0Dlhyn3CSXNL0SoRiCZ8Rzg==} + /node-fetch/3.3.0: + resolution: {integrity: sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: data-uri-to-buffer: 4.0.0 @@ -9684,7 +10903,6 @@ packages: engines: {node: '>=10'} dependencies: p-limit: 3.1.0 - dev: false /p-map/4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} @@ -9731,7 +10949,7 @@ packages: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 - tslib: 2.4.0 + tslib: 2.4.1 dev: false /parent-module/1.0.1: @@ -9791,7 +11009,7 @@ packages: /parse5/7.0.0: resolution: {integrity: sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==} dependencies: - entities: 4.3.1 + entities: 4.4.0 dev: false /parseurl/1.3.3: @@ -9803,7 +11021,7 @@ packages: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 - tslib: 2.4.0 + tslib: 2.4.1 dev: false /path-exists/3.0.0: @@ -9930,7 +11148,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.2 + browserslist: 4.21.4 caniuse-api: 3.0.0 colord: 2.9.2 postcss: 8.4.14 @@ -9943,7 +11161,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.2 + browserslist: 4.21.4 postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false @@ -10036,7 +11254,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.2 + browserslist: 4.21.4 caniuse-api: 3.0.0 cssnano-utils: 3.1.0_postcss@8.4.14 postcss: 8.4.14 @@ -10071,7 +11289,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.2 + browserslist: 4.21.4 cssnano-utils: 3.1.0_postcss@8.4.14 postcss: 8.4.14 postcss-value-parser: 4.2.0 @@ -10193,7 +11411,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.2 + browserslist: 4.21.4 postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false @@ -10246,7 +11464,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.2 + browserslist: 4.21.4 caniuse-api: 3.0.0 postcss: 8.4.14 dev: false @@ -10322,15 +11540,6 @@ packages: source-map-js: 1.0.2 dev: false - /postcss/8.4.5: - resolution: {integrity: sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.4 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: false - /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -10347,12 +11556,11 @@ packages: renderkid: 3.0.0 dev: false - /pretty-format/28.1.3: - resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /pretty-format/29.3.1: + resolution: {integrity: sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 28.1.3 - ansi-regex: 5.0.1 + '@jest/schemas': 29.0.0 ansi-styles: 5.2.0 react-is: 18.2.0 dev: true @@ -10362,12 +11570,12 @@ packages: engines: {node: '>=4'} dev: false - /prism-react-renderer/1.3.5_react@17.0.2: + /prism-react-renderer/1.3.5_react@18.2.0: resolution: {integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==} peerDependencies: react: '>=0.14.9' dependencies: - react: 17.0.2 + react: 18.2.0 dev: false /prismjs/1.28.0: @@ -10541,21 +11749,19 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - eslint - - supports-color - typescript - vue-template-compiler - webpack dev: false - /react-dom/17.0.2_react@17.0.2: - resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==} + /react-dom/18.2.0_react@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: - react: 17.0.2 + react: ^18.2.0 dependencies: loose-envify: 1.4.0 - object-assign: 4.1.1 - react: 17.0.2 - scheduler: 0.20.2 + react: 18.2.0 + scheduler: 0.23.0 dev: false /react-error-overlay/6.0.11: @@ -10566,7 +11772,7 @@ packages: resolution: {integrity: sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==} dev: false - /react-helmet-async/1.3.0_sfoxds7t5ydpegc3knd667wn6m: + /react-helmet-async/1.3.0_biqbaboplfbrettd7655fr4n2y: resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==} peerDependencies: react: ^16.6.0 || ^17.0.0 || ^18.0.0 @@ -10575,8 +11781,8 @@ packages: '@babel/runtime': 7.18.9 invariant: 2.2.4 prop-types: 15.8.1 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 react-fast-compare: 3.2.0 shallowequal: 1.1.0 dev: false @@ -10588,18 +11794,18 @@ packages: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true - /react-json-view/1.21.3_sfoxds7t5ydpegc3knd667wn6m: + /react-json-view/1.21.3_biqbaboplfbrettd7655fr4n2y: resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==} peerDependencies: react: ^17.0.0 || ^16.3.0 || ^15.5.4 react-dom: ^17.0.0 || ^16.3.0 || ^15.5.4 dependencies: - flux: 4.0.3_react@17.0.2 - react: 17.0.2 + flux: 4.0.3_react@18.2.0 + react: 18.2.0 react-base16-styling: 0.6.0 - react-dom: 17.0.2_react@17.0.2 + react-dom: 18.2.0_react@18.2.0 react-lifecycles-compat: 3.0.4 - react-textarea-autosize: 8.3.4_react@17.0.2 + react-textarea-autosize: 8.3.4_react@18.2.0 transitivePeerDependencies: - '@types/react' - encoding @@ -10617,22 +11823,22 @@ packages: webpack: '>=4.41.1 || 5.x' dependencies: '@babel/runtime': 7.18.9 - react-loadable: /@docusaurus/react-loadable/5.5.2_react@17.0.2 + react-loadable: /@docusaurus/react-loadable/5.5.2_react@18.2.0 webpack: 5.73.0 dev: false - /react-router-config/5.1.1_oyuskl3t7voyrff2xstzuy4hqu: + /react-router-config/5.1.1_4gumyfmpzq3vvokmq4lwan2qpu: resolution: {integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==} peerDependencies: react: '>=15' react-router: '>=5' dependencies: '@babel/runtime': 7.18.9 - react: 17.0.2 - react-router: 5.3.3_react@17.0.2 + react: 18.2.0 + react-router: 5.3.3_react@18.2.0 dev: false - /react-router-dom/5.3.3_react@17.0.2: + /react-router-dom/5.3.3_react@18.2.0: resolution: {integrity: sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng==} peerDependencies: react: '>=15' @@ -10641,13 +11847,13 @@ packages: history: 4.10.1 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 17.0.2 - react-router: 5.3.3_react@17.0.2 + react: 18.2.0 + react-router: 5.3.3_react@18.2.0 tiny-invariant: 1.2.0 tiny-warning: 1.0.3 dev: false - /react-router/5.3.3_react@17.0.2: + /react-router/5.3.3_react@18.2.0: resolution: {integrity: sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w==} peerDependencies: react: '>=15' @@ -10656,35 +11862,34 @@ packages: history: 4.10.1 hoist-non-react-statics: 3.3.2 loose-envify: 1.4.0 - mini-create-react-context: 0.4.1_at7mkepldmzoo6silmqc5bca74 + mini-create-react-context: 0.4.1_sh5qlbywuemxd2y3xkrw2y2kr4 path-to-regexp: 1.8.0 prop-types: 15.8.1 - react: 17.0.2 + react: 18.2.0 react-is: 16.13.1 tiny-invariant: 1.2.0 tiny-warning: 1.0.3 dev: false - /react-textarea-autosize/8.3.4_react@17.0.2: + /react-textarea-autosize/8.3.4_react@18.2.0: resolution: {integrity: sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==} engines: {node: '>=10'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: '@babel/runtime': 7.18.9 - react: 17.0.2 - use-composed-ref: 1.3.0_react@17.0.2 - use-latest: 1.2.1_react@17.0.2 + react: 18.2.0 + use-composed-ref: 1.3.0_react@18.2.0 + use-latest: 1.2.1_react@18.2.0 transitivePeerDependencies: - '@types/react' dev: false - /react/17.0.2: - resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} + /react/18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 - object-assign: 4.1.1 dev: false /readable-stream/2.3.7: @@ -10985,8 +12190,8 @@ packages: dependencies: glob: 7.2.3 - /rtl-css-js/1.15.0: - resolution: {integrity: sha512-99Cu4wNNIhrI10xxUaABHsdDqzalrSRTie4GeCmbGVuehm4oj+fIy8fTzB+16pmKe8Bv9rl+hxIBez6KxExTew==} + /rtl-css-js/1.16.0: + resolution: {integrity: sha512-Oc7PnzwIEU4M0K1J4h/7qUUaljXhQ0kCObRsZjxs2HjkpKsnoTMvSmvJ4sqgJZd0zBoEfAyTdnK/jMIYvrjySQ==} dependencies: '@babel/runtime': 7.18.9 dev: false @@ -11013,7 +12218,7 @@ packages: /rxjs/7.5.6: resolution: {integrity: sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==} dependencies: - tslib: 2.4.0 + tslib: 2.4.1 dev: false /sade/1.8.1: @@ -11036,11 +12241,10 @@ packages: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} dev: false - /scheduler/0.20.2: - resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} + /scheduler/0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 - object-assign: 4.1.1 dev: false /schema-utils/2.7.0: @@ -11121,11 +12325,6 @@ packages: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true - /semver/7.0.0: - resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} - hasBin: true - dev: false - /semver/7.3.7: resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} engines: {node: '>=10'} @@ -11150,8 +12349,6 @@ packages: on-finished: 2.4.1 range-parser: 1.2.1 statuses: 2.0.1 - transitivePeerDependencies: - - supports-color dev: false /serialize-javascript/6.0.0: @@ -11184,8 +12381,6 @@ packages: http-errors: 1.6.3 mime-types: 2.1.35 parseurl: 1.3.3 - transitivePeerDependencies: - - supports-color dev: false /serve-static/1.15.0: @@ -11196,8 +12391,6 @@ packages: escape-html: 1.0.3 parseurl: 1.3.3 send: 0.18.0 - transitivePeerDependencies: - - supports-color dev: false /setimmediate/1.0.5: @@ -11327,8 +12520,8 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - /source-map-loader/4.0.0: - resolution: {integrity: sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw==} + /source-map-loader/4.0.1: + resolution: {integrity: sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==} engines: {node: '>= 14.15.0'} peerDependencies: webpack: ^5.72.1 @@ -11578,8 +12771,8 @@ packages: dependencies: inline-style-parser: 0.1.1 - /styled-jsx/5.0.2_react@17.0.2: - resolution: {integrity: sha512-LqPQrbBh3egD57NBcHET4qcgshPks+yblyhPlH2GY8oaDgKs8SK4C3dBh3oSJjgzJ3G5t1SYEZGHkP+QEpX9EQ==} + /styled-jsx/5.1.0_react@18.2.0: + resolution: {integrity: sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==} engines: {node: '>= 12.0.0'} peerDependencies: '@babel/core': '*' @@ -11591,7 +12784,8 @@ packages: babel-plugin-macros: optional: true dependencies: - react: 17.0.2 + client-only: 0.0.1 + react: 18.2.0 dev: false /stylehacks/5.1.0_postcss@8.4.14: @@ -11600,7 +12794,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.2 + browserslist: 4.21.4 postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false @@ -11627,14 +12821,6 @@ packages: dependencies: has-flag: 4.0.0 - /supports-hyperlinks/2.2.0: - resolution: {integrity: sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - dev: true - /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -11680,14 +12866,6 @@ packages: xtend: 4.0.2 dev: true - /terminal-link/2.1.1: - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} - engines: {node: '>=8'} - dependencies: - ansi-escapes: 4.3.2 - supports-hyperlinks: 2.2.0 - dev: true - /terser-webpack-plugin/5.3.3_webpack@5.73.0: resolution: {integrity: sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==} engines: {node: '>= 10.13.0'} @@ -11823,16 +13001,16 @@ packages: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: true - /ts-jest/28.0.7_bi2kohzqnxavgozw3csgny5hju: - resolution: {integrity: sha512-wWXCSmTwBVmdvWrOpYhal79bDpioDy4rTT+0vyUnE3ZzM7LOAAGG9NXwzkEL/a516rQEgnMmS/WKP9jBPCVJyA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /ts-jest/29.0.3_r24ewcothphvclnu77pxb4u4se: + resolution: {integrity: sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^28.0.0 - babel-jest: ^28.0.0 + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 esbuild: '*' - jest: ^28.0.0 + jest: ^29.0.0 typescript: '>=4.3' peerDependenciesMeta: '@babel/core': @@ -11846,13 +13024,13 @@ packages: dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 28.1.3 - jest-util: 28.1.3 + jest: 29.3.1_@types+node@18.11.9 + jest-util: 29.3.1 json5: 2.2.1 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.3.7 - typescript: 4.7.4 + typescript: 4.8.4 yargs-parser: 21.0.1 dev: true @@ -11869,18 +13047,18 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib/2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + /tslib/2.4.1: + resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} dev: false - /tsutils/3.21.0_typescript@4.7.4: + /tsutils/3.21.0_typescript@4.8.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 4.7.4 + typescript: 4.8.4 dev: true /type-check/0.4.0: @@ -11923,8 +13101,8 @@ packages: is-typedarray: 1.0.0 dev: false - /typescript/4.7.4: - resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} + /typescript/4.8.4: + resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} engines: {node: '>=4.2.0'} hasBin: true dev: true @@ -12130,6 +13308,16 @@ packages: engines: {node: '>= 0.8'} dev: false + /update-browserslist-db/1.0.10_browserslist@4.21.4: + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.4 + escalade: 3.1.1 + picocolors: 1.0.0 + /update-browserslist-db/1.0.5_browserslist@4.21.2: resolution: {integrity: sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==} hasBin: true @@ -12139,6 +13327,7 @@ packages: browserslist: 4.21.2 escalade: 3.1.1 picocolors: 1.0.0 + dev: false /update-notifier/5.1.0: resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==} @@ -12209,15 +13398,15 @@ packages: engines: {node: '>= 4'} dev: true - /use-composed-ref/1.3.0_react@17.0.2: + /use-composed-ref/1.3.0_react@18.2.0: resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - react: 17.0.2 + react: 18.2.0 dev: false - /use-isomorphic-layout-effect/1.1.2_react@17.0.2: + /use-isomorphic-layout-effect/1.1.2_react@18.2.0: resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} peerDependencies: '@types/react': '*' @@ -12226,10 +13415,10 @@ packages: '@types/react': optional: true dependencies: - react: 17.0.2 + react: 18.2.0 dev: false - /use-latest/1.2.1_react@17.0.2: + /use-latest/1.2.1_react@18.2.0: resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} peerDependencies: '@types/react': '*' @@ -12238,16 +13427,16 @@ packages: '@types/react': optional: true dependencies: - react: 17.0.2 - use-isomorphic-layout-effect: 1.1.2_react@17.0.2 + react: 18.2.0 + use-isomorphic-layout-effect: 1.1.2_react@18.2.0 dev: false - /use-sync-external-store/1.1.0_react@17.0.2: - resolution: {integrity: sha512-SEnieB2FPKEVne66NpXPd1Np4R1lTNKfjuy3XdIoPQKYBAFdzbzSZlSn1KJZUiihQLQC5Znot4SBz1EOTBwQAQ==} + /use-sync-external-store/1.2.0_react@18.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - react: 17.0.2 + react: 18.2.0 dev: false /util-deprecate/1.0.2: @@ -12283,15 +13472,11 @@ packages: sade: 1.8.1 dev: true - /v8-compile-cache/2.3.0: - resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} - dev: true - /v8-to-istanbul/9.0.1: resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.14 + '@jridgewell/trace-mapping': 0.3.17 '@types/istanbul-lib-coverage': 2.0.4 convert-source-map: 1.8.0 dev: true @@ -12692,32 +13877,32 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - /xterm-addon-fit/0.5.0_xterm@4.19.0: - resolution: {integrity: sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ==} + /xterm-addon-fit/0.6.0_xterm@5.0.0: + resolution: {integrity: sha512-9/7A+1KEjkFam0yxTaHfuk9LEvvTSBi0PZmEkzJqgafXPEXL9pCMAVV7rB09sX6ATRDXAdBpQhZkhKj7CGvYeg==} peerDependencies: - xterm: ^4.0.0 + xterm: ^5.0.0 dependencies: - xterm: 4.19.0 + xterm: 5.0.0 dev: false - /xterm-addon-search/0.9.0_xterm@4.19.0: - resolution: {integrity: sha512-aoolI8YuHvdGw+Qjg8g2M4kst0v86GtB7WeBm4F0jNXA005/6QbWWy9eCsvnIDLJOFI5JSSrZnD6CaOkvBQYPA==} + /xterm-addon-search/0.10.0_xterm@5.0.0: + resolution: {integrity: sha512-l+kjDxNDQbkniU5OUo9BHknxUEPZGM0OFpVpc2sMmrb97S0FKJVJO4wAZPJvSGVJ8ZEG6KuDyzXluvnb08t71Q==} peerDependencies: - xterm: ^4.0.0 + xterm: ^5.0.0 dependencies: - xterm: 4.19.0 + xterm: 5.0.0 dev: false - /xterm-addon-webgl/0.12.0_xterm@4.19.0: - resolution: {integrity: sha512-3P5ihdjPnxH6Wrvqjki9UD+duoVrp1fvnO/pSpXP2F1L2GwY6TDNExgj8Yg141vMCNgQbcVqmsTLYEYZxjY92A==} + /xterm-addon-webgl/0.13.0_xterm@5.0.0: + resolution: {integrity: sha512-xL4qBQWUHjFR620/8VHCtrTMVQsnZaAtd1IxFoiKPhC63wKp6b+73a45s97lb34yeo57PoqZhE9Jq5pB++ksPQ==} peerDependencies: - xterm: ^4.0.0 + xterm: ^5.0.0 dependencies: - xterm: 4.19.0 + xterm: 5.0.0 dev: false - /xterm/4.19.0: - resolution: {integrity: sha512-c3Cp4eOVsYY5Q839dR5IejghRPpxciGmLWWaP9g+ppfMeBChMeLa1DCA+pmX/jyDZ+zxFOmlJL/82qVdayVoGQ==} + /xterm/5.0.0: + resolution: {integrity: sha512-tmVsKzZovAYNDIaUinfz+VDclraQpPUnAME+JawosgWRMphInDded/PuY0xmU5dOhyeYZsI0nz5yd8dPYsdLTA==} dev: false /y18n/5.0.8: diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json index b843aaf1..a729b380 100644 --- a/common/config/rush/repo-state.json +++ b/common/config/rush/repo-state.json @@ -1,5 +1,5 @@ // DO NOT MODIFY THIS FILE MANUALLY BUT DO COMMIT IT. It is generated and used by Rush. { - "pnpmShrinkwrapHash": "79d49d43f83ef71f5811d4008d20b1f5f89a106e", + "pnpmShrinkwrapHash": "aa7418df8f00c083c489bee74875a49316e11802", "preferredVersionsHash": "bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f" } diff --git a/common/scripts/install-run-rush.js b/common/scripts/install-run-rush.js index ff569fa9..1639efd2 100644 --- a/common/scripts/install-run-rush.js +++ b/common/scripts/install-run-rush.js @@ -40,6 +40,7 @@ const fs = __importStar(require("fs")); const install_run_1 = require("./install-run"); const PACKAGE_NAME = '@microsoft/rush'; const RUSH_PREVIEW_VERSION = 'RUSH_PREVIEW_VERSION'; +const INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_RUSH_LOCKFILE_PATH'; function _getRushVersion(logger) { const rushPreviewVersion = process.env[RUSH_PREVIEW_VERSION]; if (rushPreviewVersion !== undefined) { @@ -104,7 +105,11 @@ function _run() { (0, install_run_1.runWithErrorAndStatusCode)(logger, () => { const version = _getRushVersion(logger); logger.info(`The rush.json configuration requests Rush version ${version}`); - return (0, install_run_1.installAndRun)(logger, PACKAGE_NAME, version, bin, packageBinArgs); + const lockFilePath = process.env[INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE]; + if (lockFilePath) { + logger.info(`Found ${INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE}="${lockFilePath}", installing with lockfile.`); + } + return (0, install_run_1.installAndRun)(logger, PACKAGE_NAME, version, bin, packageBinArgs, lockFilePath); }); } _run(); diff --git a/common/scripts/install-run.js b/common/scripts/install-run.js index 208b99c8..948da06d 100644 --- a/common/scripts/install-run.js +++ b/common/scripts/install-run.js @@ -42,6 +42,7 @@ const os = __importStar(require("os")); const path = __importStar(require("path")); exports.RUSH_JSON_FILENAME = 'rush.json'; const RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME = 'RUSH_TEMP_FOLDER'; +const INSTALL_RUN_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_LOCKFILE_PATH'; const INSTALLED_FLAG_FILENAME = 'installed.flag'; const NODE_MODULES_FOLDER_NAME = 'node_modules'; const PACKAGE_JSON_FILENAME = 'package.json'; @@ -306,26 +307,41 @@ function _isPackageAlreadyInstalled(packageInstallFolder) { return false; } } +/** + * Delete a file. Fail silently if it does not exist. + */ +function _deleteFile(file) { + try { + fs.unlinkSync(file); + } + catch (err) { + if (err.code !== 'ENOENT' && err.code !== 'ENOTDIR') { + throw err; + } + } +} /** * Removes the following files and directories under the specified folder path: * - installed.flag * - * - node_modules */ -function _cleanInstallFolder(rushTempFolder, packageInstallFolder) { +function _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath) { try { const flagFile = path.resolve(packageInstallFolder, INSTALLED_FLAG_FILENAME); - if (fs.existsSync(flagFile)) { - fs.unlinkSync(flagFile); - } + _deleteFile(flagFile); const packageLockFile = path.resolve(packageInstallFolder, 'package-lock.json'); - if (fs.existsSync(packageLockFile)) { - fs.unlinkSync(packageLockFile); + if (lockFilePath) { + fs.copyFileSync(lockFilePath, packageLockFile); } - const nodeModulesFolder = path.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME); - if (fs.existsSync(nodeModulesFolder)) { - const rushRecyclerFolder = _ensureAndJoinPath(rushTempFolder, 'rush-recycler'); - fs.renameSync(nodeModulesFolder, path.join(rushRecyclerFolder, `install-run-${Date.now().toString()}`)); + else { + // Not running `npm ci`, so need to cleanup + _deleteFile(packageLockFile); + const nodeModulesFolder = path.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME); + if (fs.existsSync(nodeModulesFolder)) { + const rushRecyclerFolder = _ensureAndJoinPath(rushTempFolder, 'rush-recycler'); + fs.renameSync(nodeModulesFolder, path.join(rushRecyclerFolder, `install-run-${Date.now().toString()}`)); + } } } catch (e) { @@ -354,17 +370,17 @@ function _createPackageJson(packageInstallFolder, name, version) { /** * Run "npm install" in the package install folder. */ -function _installPackage(logger, packageInstallFolder, name, version) { +function _installPackage(logger, packageInstallFolder, name, version, command) { try { logger.info(`Installing ${name}...`); const npmPath = getNpmPath(); - const result = childProcess.spawnSync(npmPath, ['install'], { + const result = childProcess.spawnSync(npmPath, [command], { stdio: 'inherit', cwd: packageInstallFolder, env: process.env }); if (result.status !== 0) { - throw new Error('"npm install" encountered an error'); + throw new Error(`"npm ${command}" encountered an error`); } logger.info(`Successfully installed ${name}@${version}`); } @@ -392,18 +408,19 @@ function _writeFlagFile(packageInstallFolder) { throw new Error(`Unable to create installed.flag file in ${packageInstallFolder}`); } } -function installAndRun(logger, packageName, packageVersion, packageBinName, packageBinArgs) { +function installAndRun(logger, packageName, packageVersion, packageBinName, packageBinArgs, lockFilePath = process.env[INSTALL_RUN_LOCKFILE_PATH_VARIABLE]) { const rushJsonFolder = findRushJsonFolder(); const rushCommonFolder = path.join(rushJsonFolder, 'common'); const rushTempFolder = _getRushTempFolder(rushCommonFolder); const packageInstallFolder = _ensureAndJoinPath(rushTempFolder, 'install-run', `${packageName}@${packageVersion}`); if (!_isPackageAlreadyInstalled(packageInstallFolder)) { // The package isn't already installed - _cleanInstallFolder(rushTempFolder, packageInstallFolder); + _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath); const sourceNpmrcFolder = path.join(rushCommonFolder, 'config', 'rush'); _syncNpmrc(logger, sourceNpmrcFolder, packageInstallFolder); _createPackageJson(packageInstallFolder, packageName, packageVersion); - _installPackage(logger, packageInstallFolder, packageName, packageVersion); + const command = lockFilePath ? 'ci' : 'install'; + _installPackage(logger, packageInstallFolder, packageName, packageVersion, command); _writeFlagFile(packageInstallFolder); } const statusMessage = `Invoking "${packageBinName} ${packageBinArgs.join(' ')}"`; diff --git a/libraries/adb-backend-direct-sockets/package.json b/libraries/adb-backend-direct-sockets/package.json index ee0e89b6..b0497d70 100644 --- a/libraries/adb-backend-direct-sockets/package.json +++ b/libraries/adb-backend-direct-sockets/package.json @@ -31,12 +31,12 @@ "prepublishOnly": "npm run build" }, "devDependencies": { - "typescript": "^4.7.4", - "@yume-chan/ts-package-builder": "workspace:^1.0.0" + "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "typescript": "^4.8.4" }, "dependencies": { "@yume-chan/adb": "workspace:^0.0.17", "@yume-chan/stream-extra": "workspace:^0.0.17", - "tslib": "^2.4.0" + "tslib": "^2.4.1" } } diff --git a/libraries/adb-backend-webusb/package.json b/libraries/adb-backend-webusb/package.json index 266eefc1..f8159752 100644 --- a/libraries/adb-backend-webusb/package.json +++ b/libraries/adb-backend-webusb/package.json @@ -35,11 +35,11 @@ "@yume-chan/adb": "workspace:^0.0.17", "@yume-chan/stream-extra": "workspace:^0.0.17", "@yume-chan/struct": "workspace:^0.0.17", - "tslib": "^2.4.0" + "tslib": "^2.4.1" }, "devDependencies": { - "jest": "^28.1.2", - "typescript": "^4.7.4", - "@yume-chan/ts-package-builder": "workspace:^1.0.0" + "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "jest": "^29.3.1", + "typescript": "^4.8.4" } } diff --git a/libraries/adb-backend-ws/package.json b/libraries/adb-backend-ws/package.json index 14051195..1a6292c9 100644 --- a/libraries/adb-backend-ws/package.json +++ b/libraries/adb-backend-ws/package.json @@ -30,13 +30,13 @@ "build:watch": "build-ts-package --incremental" }, "devDependencies": { - "jest": "^28.1.2", - "typescript": "^4.7.4", - "@yume-chan/ts-package-builder": "workspace:^1.0.0" + "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "jest": "^29.3.1", + "typescript": "^4.8.4" }, "dependencies": { "@yume-chan/adb": "workspace:^0.0.17", "@yume-chan/stream-extra": "workspace:^0.0.17", - "tslib": "^2.4.0" + "tslib": "^2.4.1" } } diff --git a/libraries/adb-credential-web/package.json b/libraries/adb-credential-web/package.json index 2b309f36..dea5c63f 100644 --- a/libraries/adb-credential-web/package.json +++ b/libraries/adb-credential-web/package.json @@ -29,11 +29,11 @@ "prepublishOnly": "npm run build" }, "devDependencies": { - "typescript": "^4.7.4", - "@yume-chan/ts-package-builder": "workspace:^1.0.0" + "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "typescript": "^4.8.4" }, "dependencies": { "@yume-chan/adb": "workspace:^0.0.17", - "tslib": "^2.4.0" + "tslib": "^2.4.1" } } diff --git a/libraries/adb/package.json b/libraries/adb/package.json index b05ce092..ed463485 100644 --- a/libraries/adb/package.json +++ b/libraries/adb/package.json @@ -36,15 +36,15 @@ "@yume-chan/event": "workspace:^0.0.17", "@yume-chan/stream-extra": "workspace:^0.0.17", "@yume-chan/struct": "workspace:^0.0.17", - "tslib": "^2.4.0" + "tslib": "^2.4.1" }, "devDependencies": { - "@jest/globals": "^28.1.2", - "@types/node": "^17.0.17", + "@jest/globals": "^29.3.1", + "@types/node": "^18.11.9", "@yume-chan/ts-package-builder": "workspace:^1.0.0", "cross-env": "^7.0.3", - "jest": "^28.1.2", - "ts-jest": "^28.0.5", - "typescript": "^4.7.4" + "jest": "^29.3.1", + "ts-jest": "^29.0.3", + "typescript": "^4.8.4" } } diff --git a/libraries/android-bin/package.json b/libraries/android-bin/package.json index c14e4b34..a886ad0e 100644 --- a/libraries/android-bin/package.json +++ b/libraries/android-bin/package.json @@ -30,13 +30,13 @@ "prepublishOnly": "npm run build" }, "devDependencies": { - "typescript": "^4.7.4", - "@yume-chan/ts-package-builder": "workspace:^1.0.0" + "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "typescript": "^4.8.4" }, "dependencies": { "@yume-chan/adb": "workspace:^0.0.17", "@yume-chan/stream-extra": "workspace:^0.0.17", "@yume-chan/struct": "workspace:^0.0.17", - "tslib": "^2.4.0" + "tslib": "^2.4.1" } } diff --git a/libraries/b-tree/package.json b/libraries/b-tree/package.json index 12112271..084d8e90 100644 --- a/libraries/b-tree/package.json +++ b/libraries/b-tree/package.json @@ -33,14 +33,14 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.4.1" }, "devDependencies": { - "@jest/globals": "^28.1.2", + "@jest/globals": "^29.3.1", "@yume-chan/ts-package-builder": "workspace:^1.0.0", "cross-env": "^7.0.3", - "jest": "^28.1.2", - "ts-jest": "^28.0.5", - "typescript": "^4.7.4" + "jest": "^29.3.1", + "ts-jest": "^29.0.3", + "typescript": "^4.8.4" } } diff --git a/libraries/dataview-bigint-polyfill/package.json b/libraries/dataview-bigint-polyfill/package.json index 5dc700aa..f34416ad 100644 --- a/libraries/dataview-bigint-polyfill/package.json +++ b/libraries/dataview-bigint-polyfill/package.json @@ -35,11 +35,11 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.4.1" }, "devDependencies": { - "jest": "^28.1.2", - "typescript": "^4.7.4", - "@yume-chan/ts-package-builder": "workspace:^1.0.0" + "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "jest": "^29.3.1", + "typescript": "^4.8.4" } } diff --git a/libraries/event/package.json b/libraries/event/package.json index 440d6bd8..4af679e9 100644 --- a/libraries/event/package.json +++ b/libraries/event/package.json @@ -33,11 +33,11 @@ }, "dependencies": { "@yume-chan/async": "^2.2.0", - "tslib": "^2.4.0" + "tslib": "^2.4.1" }, "devDependencies": { - "jest": "^28.1.2", - "typescript": "^4.7.4", - "@yume-chan/ts-package-builder": "workspace:^1.0.0" + "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "jest": "^29.3.1", + "typescript": "^4.8.4" } } diff --git a/libraries/scrcpy-decoder-tinyh264/package.json b/libraries/scrcpy-decoder-tinyh264/package.json index c6ad8484..29e8afd6 100644 --- a/libraries/scrcpy-decoder-tinyh264/package.json +++ b/libraries/scrcpy-decoder-tinyh264/package.json @@ -34,19 +34,19 @@ "dependencies": { "@yume-chan/async": "^2.2.0", "@yume-chan/event": "workspace:^0.0.17", - "@yume-chan/stream-extra": "workspace:^0.0.17", "@yume-chan/scrcpy": "workspace:^0.0.17", + "@yume-chan/stream-extra": "workspace:^0.0.17", "tinyh264": "^0.0.7", - "tslib": "^2.4.0", + "tslib": "^2.4.1", "yuv-buffer": "^1.0.0", "yuv-canvas": "^1.2.11" }, "devDependencies": { - "@jest/globals": "^28.1.2", + "@jest/globals": "^29.3.1", "@yume-chan/ts-package-builder": "workspace:^1.0.0", "cross-env": "^7.0.3", - "jest": "^28.1.2", - "ts-jest": "^28.0.5", - "typescript": "^4.7.4" + "jest": "^29.3.1", + "ts-jest": "^29.0.3", + "typescript": "^4.8.4" } } diff --git a/libraries/scrcpy-decoder-webcodecs/package.json b/libraries/scrcpy-decoder-webcodecs/package.json index 834c6acb..b460b618 100644 --- a/libraries/scrcpy-decoder-webcodecs/package.json +++ b/libraries/scrcpy-decoder-webcodecs/package.json @@ -32,17 +32,17 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "@types/dom-webcodecs": "^0.1.3", - "@yume-chan/stream-extra": "workspace:^0.0.17", + "@types/dom-webcodecs": "^0.1.5", "@yume-chan/scrcpy": "workspace:^0.0.17", - "tslib": "^2.4.0" + "@yume-chan/stream-extra": "workspace:^0.0.17", + "tslib": "^2.4.1" }, "devDependencies": { - "@jest/globals": "^28.1.2", + "@jest/globals": "^29.3.1", "@yume-chan/ts-package-builder": "workspace:^1.0.0", "cross-env": "^7.0.3", - "jest": "^28.1.2", - "ts-jest": "^28.0.5", - "typescript": "^4.7.4" + "jest": "^29.3.1", + "ts-jest": "^29.0.3", + "typescript": "^4.8.4" } } diff --git a/libraries/scrcpy/package.json b/libraries/scrcpy/package.json index 88d54577..62a11277 100644 --- a/libraries/scrcpy/package.json +++ b/libraries/scrcpy/package.json @@ -39,17 +39,17 @@ "@yume-chan/event": "workspace:^0.0.17", "@yume-chan/stream-extra": "workspace:^0.0.17", "@yume-chan/struct": "workspace:^0.0.17", - "tslib": "^2.4.0" + "tslib": "^2.4.1" }, "devDependencies": { + "@jest/globals": "^29.3.1", "@yume-chan/adb": "workspace:^0.0.17", - "@jest/globals": "^28.1.2", "@yume-chan/ts-package-builder": "workspace:^1.0.0", "cross-env": "^7.0.3", "gh-release-fetch": "^3.0.2", - "jest": "^28.1.2", - "ts-jest": "^28.0.5", - "typescript": "^4.7.4" + "jest": "^29.3.1", + "ts-jest": "^29.0.3", + "typescript": "^4.8.4" }, "peerDependencies": { "@yume-chan/adb": "workspace:^0.0.17", diff --git a/libraries/stream-extra/package.json b/libraries/stream-extra/package.json index f7d1fe0e..725fc701 100644 --- a/libraries/stream-extra/package.json +++ b/libraries/stream-extra/package.json @@ -33,15 +33,15 @@ "dependencies": { "@yume-chan/async": "^2.2.0", "@yume-chan/struct": "workspace:^0.0.17", - "tslib": "^2.4.0", + "tslib": "^2.4.1", "web-streams-polyfill": "^4.0.0-beta.3" }, "devDependencies": { - "@jest/globals": "^28.1.2", + "@jest/globals": "^29.3.1", "@yume-chan/ts-package-builder": "workspace:^1.0.0", "cross-env": "^7.0.3", - "jest": "^28.1.2", - "ts-jest": "^28.0.5", - "typescript": "^4.7.4" + "jest": "^29.3.1", + "ts-jest": "^29.0.3", + "typescript": "^4.8.4" } } diff --git a/libraries/struct/package.json b/libraries/struct/package.json index b55b4bd1..0694a308 100644 --- a/libraries/struct/package.json +++ b/libraries/struct/package.json @@ -34,14 +34,14 @@ }, "dependencies": { "@yume-chan/dataview-bigint-polyfill": "workspace:^0.0.17", - "tslib": "^2.4.0" + "tslib": "^2.4.1" }, "devDependencies": { - "@jest/globals": "^28.1.2", + "@jest/globals": "^29.3.1", "@yume-chan/ts-package-builder": "workspace:^1.0.0", "cross-env": "^7.0.3", - "jest": "^28.1.2", - "ts-jest": "^28.0.5", - "typescript": "^4.7.4" + "jest": "^29.3.1", + "ts-jest": "^29.0.3", + "typescript": "^4.8.4" } } diff --git a/rush.json b/rush.json index 386180bf..313b526e 100644 --- a/rush.json +++ b/rush.json @@ -15,7 +15,7 @@ * path segment in the "$schema" field for all your Rush config files. This will ensure * correct error-underlining and tab-completion for editors such as VS Code. */ - "rushVersion": "5.74.0", + "rushVersion": "5.83.1", /** * The next field selects which package manager should be installed and determines its version. * Rush installs its own local copy of the package manager to ensure that your build process @@ -24,86 +24,9 @@ * Specify one of: "pnpmVersion", "npmVersion", or "yarnVersion". See the Rush documentation * for details about these alternatives. */ - "pnpmVersion": "7.5.2", - // "npmVersion": "4.5.0", + "pnpmVersion": "7.15.0", + // "npmVersion": "6.14.15", // "yarnVersion": "1.9.4", - /** - * Options that are only used when the PNPM package manager is selected - */ - "pnpmOptions": { - /** - * Specifies the location of the PNPM store. There are two possible values: - * - * - "local" - use the "pnpm-store" folder in the current configured temp folder: - * "common/temp/pnpm-store" by default. - * - "global" - use PNPM's global store, which has the benefit of being shared - * across multiple repo folders, but the disadvantage of less isolation for builds - * (e.g. bugs or incompatibilities when two repos use different releases of PNPM) - * - * RUSH_PNPM_STORE_PATH will override the directory that will be used as the store - * - * In all cases, the store path will be overridden by the environment variable RUSH_PNPM_STORE_PATH. - * - * The default value is "local". - */ - "pnpmStore": "global", - /** - * If true, then Rush will add the "--strict-peer-dependencies" option when invoking PNPM. - * This causes "rush install" to fail if there are unsatisfied peer dependencies, which is - * an invalid state that can cause build failures or incompatible dependency versions. - * (For historical reasons, JavaScript package managers generally do not treat this invalid - * state as an error.) - * - * The default value is false to avoid legacy compatibility issues. - * It is strongly recommended to set strictPeerDependencies=true. - */ - // "strictPeerDependencies": true, - /** - * Configures the strategy used to select versions during installation. - * - * This feature requires PNPM version 3.1 or newer. It corresponds to the "--resolution-strategy" command-line - * option for PNPM. Possible values are "fast" and "fewer-dependencies". PNPM's default is "fast", but this may - * be incompatible with certain packages, for example the "@types" packages from DefinitelyTyped. Rush's default - * is "fewer-dependencies", which causes PNPM to avoid installing a newer version if an already installed version - * can be reused; this is more similar to NPM's algorithm. - * - * After modifying this field, it's recommended to run "rush update --full" so that the package manager - * will recalculate all version selections. - */ - // "resolutionStrategy": "fast", - /** - * If true, then `rush install` will report an error if manual modifications - * were made to the PNPM shrinkwrap file without running "rush update" afterwards. - * - * This feature protects against accidental inconsistencies that may be introduced - * if the PNPM shrinkwrap file ("pnpm-lock.yaml") is manually edited. When this - * feature is enabled, "rush update" will append a hash to the file as a YAML comment, - * and then "rush update" and "rush install" will validate the hash. Note that this does not prohibit - * manual modifications, but merely requires "rush update" be run - * afterwards, ensuring that PNPM can report or repair any potential inconsistencies. - * - * To temporarily disable this validation when invoking "rush install", use the - * "--bypass-policy" command-line parameter. - * - * The default value is false. - */ - "preventManualShrinkwrapChanges": true, - /** - * If true, then `rush install` will use the PNPM workspaces feature to perform the - * install. - * - * This feature uses PNPM to perform the entire monorepo install. When using workspaces, Rush will - * generate a "pnpm-workspace.yaml" file referencing all local projects to install. Rush will - * also generate a "pnpmfile.js" which is used to provide preferred versions support. When install - * is run, this pnpmfile will be used to replace dependency version ranges with a smaller subset - * of the original range. If the preferred version is not fully a subset of the original version - * range, it will be left as-is. After this, the pnpmfile.js provided in the repository (if one - * exists) will be called to further modify package dependencies. - * - * This option is experimental. The default value is false. - */ - "useWorkspaces": true - }, /** * Older releases of the Node.js engine may be missing features required by your system. * Other releases may have bugs. In particular, the "latest" version will not be a @@ -198,19 +121,18 @@ // * or you could just have a single category called "default". // */ // "reviewCategories": [ - // // Some example categories: - // "production", // projects that ship to production - // "tools", // non-shipping projects that are part of the developer toolchain - // "prototypes" // experiments that should mostly be ignored by the review process + // "libraries", // library projects that ship + // "tests" // non-shipping test projects // ], - // // /** // * A list of NPM package scopes that will be excluded from review. // * We recommend to exclude TypeScript typings (the "@types" scope), because // * if the underlying package was already approved, this would imply that the typings // * are also approved. // */ - // // "ignoredNpmScopes": ["@types"] + // "ignoredNpmScopes": [ + // "@types" + // ] // }, /** * If you use Git as your version control system, this section has some additional @@ -229,15 +151,14 @@ * RegExp escapes need two backslashes, and ordinary periods should be "\\.". */ // "allowedEmailRegExps": [ - // "[^@]+@users\\.noreply\\.github\\.com", - // "travis@example\\.org" + // "[^@]+@users\\.noreply\\.github\\.com" // ], /** * When Rush reports that the address is malformed, the notice can include an example * of a recommended email. Make sure it conforms to one of the allowedEmailRegExps * expressions. */ - // "sampleEmail": "mrexample@users.noreply.github.com", + // "sampleEmail": "example@users.noreply.github.com" /** * The commit message to use when committing changes during 'rush publish'. * @@ -245,7 +166,7 @@ * you might configure your system's trigger to look for a special string such as "[skip-ci]" * in the commit message, and then customize Rush's message to contain that string. */ - // "versionBumpCommitMessage": "Applying package updates. [skip-ci]", + // "versionBumpCommitMessage": "Bump versions [skip ci]", /** * The commit message to use when committing changes during 'rush version'. * @@ -253,28 +174,37 @@ * you might configure your system's trigger to look for a special string such as "[skip-ci]" * in the commit message, and then customize Rush's message to contain that string. */ - // "changeLogUpdateCommitMessage": "Deleting change files and updating change logs for package updates. [skip-ci]" + // "changeLogUpdateCommitMessage": "Update changelogs [skip ci]" + /** + * The commit message to use when commiting changefiles during 'rush change --commit' + * + * If no commit message is set it will default to 'Rush change' + */ + // "changefilesCommitMessage": "Rush change" }, "repository": { /** * The URL of this Git repository, used by "rush change" to determine the base branch for your PR. * * The "rush change" command needs to determine which files are affected by your PR diff. - * If you merged or cherry-picked commits from the master branch into your PR branch, those commits + * If you merged or cherry-picked commits from the main branch into your PR branch, those commits * should be excluded from this diff (since they belong to some other PR). In order to do that, * Rush needs to know where to find the base branch for your PR. This information cannot be * determined from Git alone, since the "pull request" feature is not a Git concept. Ideally * Rush would use a vendor-specific protocol to query the information from GitHub, Azure DevOps, etc. - * But to keep things simple, "rush change" simply assumes that your PR is against the "master" branch + * But to keep things simple, + "rush change" simply assumes that your PR is against the "main" branch * of the Git remote indicated by the repository.url setting in rush.json. If you are working in * a GitHub "fork" of the real repo, this setting will be different from the repository URL of your * your PR branch, and in this situation "rush change" will also automatically invoke "git fetch" - * to retrieve the latest activity for the remote master branch. + * to retrieve the latest activity for the remote main branch. */ - "url": "https://github.com/yume-chan/ya-webadb", + "urls": [ + "https://github.com/yume-chan/ya-webadb.git" + ], /** * The default branch name. This tells "rush change" which remote branch to compare against. - * The default value is "master" + * The default value is "main" */ "defaultBranch": "main" /** @@ -353,6 +283,12 @@ * will be used when publishing subsequent changes from the monorepo. */ // "hotfixChangeEnabled": false, + /** + * This is an optional, but recommended, list of available tags that can be applied + * to projects. If this property is not specified, any tag is allowed. This + * list is useful in preventing typos when specifying tags for projects. + */ + // "allowedProjectTags": [ "apps", "Web", "tools" ], /** * (Required) This is the inventory of projects to be managed by Rush. * @@ -381,11 +317,29 @@ // "reviewCategory": "production", // // /** - // * A list of local projects that appear as devDependencies for this project, but cannot be - // * locally linked because it would create a cyclic dependency; instead, the last published - // * version will be installed in the Common folder. + // * A list of Rush project names that are to be installed from NPM + // * instead of linking to the local project. + // * + // * If a project's package.json specifies a dependency that is another Rush project + // * in the monorepo workspace, normally Rush will locally link its folder instead of + // * installing from NPM. If you are using PNPM workspaces, this is indicated by + // * a SemVer range such as "workspace:^1.2.3". To prevent mistakes, Rush reports + // * an error if the "workspace:" protocol is missing. + // * + // * Locally linking ensures that regressions are caught as early as possible and is + // * a key benefit of monorepos. However there are occasional situations where + // * installing from NPM is needed. A classic example is a cyclic dependency. + // * Imagine three Rush projects: "my-toolchain" depends on "my-tester", which depends + // * on "my-library". Suppose that we add "my-toolchain" to the "devDependencies" + // * of "my-library" so it can be built by our toolchain. This cycle creates + // * a problem -- Rush can't build a project using a not-yet-built dependency. + // * We can solve it by adding "my-toolchain" to the "decoupledLocalDependencies" + // * of "my-library", so it builds using the last published release. Choose carefully + // * which package to decouple; some choices are much easier to manage than others. + // * + // * (In older Rush releases, this setting was called "cyclicDependencyProjects".) // */ - // "cyclicDependencyProjects": [ + // "decoupledLocalDependencies": [ // // "my-toolchain" // ], // @@ -416,20 +370,15 @@ // * in "version-policies.json" file. See the "rush publish" documentation for more info. // * NOTE: "versionPolicyName" and "shouldPublish" are alternatives; you cannot specify them both. // */ - // // "versionPolicyName": "" - // }, + // // "versionPolicyName": "", // - // { - // "packageName": "my-controls", - // "projectFolder": "libraries/my-controls", - // "reviewCategory": "production" + // /** + // * An optional set of custom tags that can be used to select this project. For example, + // * adding "my-custom-tag" will allow this project to be selected by the + // * command "rush list --only tag:my-custom-tag" + // */ + // // "tags": ["apps", "web"] // }, - // - // { - // "packageName": "my-toolchain", - // "projectFolder": "tools/my-toolchain", - // "reviewCategory": "tools" - // } { "packageName": "@yume-chan/adb", "projectFolder": "libraries/adb", diff --git a/toolchain/ts-package-builder/package.json b/toolchain/ts-package-builder/package.json index f1317075..e47d1997 100644 --- a/toolchain/ts-package-builder/package.json +++ b/toolchain/ts-package-builder/package.json @@ -13,7 +13,7 @@ "author": "", "license": "MIT", "devDependencies": { - "@types/node": "^17.0.17" + "@types/node": "^18.11.9" }, "dependencies": { "json5": "^2.2.0" From 05353e1429cad044740954166662423b2d7202dc Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Sat, 12 Nov 2022 20:52:40 +0800 Subject: [PATCH 015/171] fix(adb): `sync#opendir` should ignore errors (regression) --- libraries/adb/src/commands/sync/list.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/libraries/adb/src/commands/sync/list.ts b/libraries/adb/src/commands/sync/list.ts index 6061784d..e61f785d 100644 --- a/libraries/adb/src/commands/sync/list.ts +++ b/libraries/adb/src/commands/sync/list.ts @@ -35,7 +35,15 @@ export async function* adbSyncOpenDir( ): AsyncGenerator { if (v2) { await adbSyncWriteRequest(writer, AdbSyncRequestId.List2, path); - yield* adbSyncReadResponses(stream, AdbSyncResponseId.Entry2, AdbSyncEntry2Response); + for await (const item of adbSyncReadResponses(stream, AdbSyncResponseId.Entry2, AdbSyncEntry2Response)) { + // `LST2` can return error codes for failed `lstat` calls. + // `LIST` just ignores them. + // But they only contain `name` so still pretty useless. + if (item.error !== 0) { + continue; + } + yield item; + } } else { await adbSyncWriteRequest(writer, AdbSyncRequestId.List, path); for await (const item of adbSyncReadResponses(stream, AdbSyncResponseId.Entry, AdbSyncEntryResponse)) { From 3e9fa2601424746c1527119d9c8b9635652711ca Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Sat, 12 Nov 2022 22:46:24 +0800 Subject: [PATCH 016/171] fix(demo): adopt new version of fluent file type icons --- apps/demo/src/pages/file-manager.tsx | 7 +++++-- common/config/rush/pnpm-lock.yaml | 24 ++++++++---------------- common/config/rush/repo-state.json | 2 +- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/apps/demo/src/pages/file-manager.tsx b/apps/demo/src/pages/file-manager.tsx index b49370c6..f2d715d9 100644 --- a/apps/demo/src/pages/file-manager.tsx +++ b/apps/demo/src/pages/file-manager.tsx @@ -233,7 +233,10 @@ class FileManagerState { switch (item.type) { case LinuxFileType.Link: - ({ iconName } = getFileTypeIconProps({ type: FileIconType.linkedFolder })); + // larger sizes of `linkedFolder` icon now have a person symbol on it, + // We want to use it for symbolic links, so use the 16px version + // cspell:disable-next-line + iconName = "linkedfolder16_svg"; break; case LinuxFileType.Directory: ({ iconName } = getFileTypeIconProps({ type: FileIconType.folder })); @@ -242,7 +245,7 @@ class FileManagerState { ({ iconName } = getFileTypeIconProps({ extension: path.extname(item.name!) })); break; default: - ({ iconName } = getFileTypeIconProps({ extension: 'txt' })); + ({ iconName } = getFileTypeIconProps({ type: FileIconType.genericFile })); break; } diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index b6aa1121..b2eaacc5 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -3359,7 +3359,7 @@ packages: '@docusaurus/react-loadable': 5.5.2_react@18.2.0 '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y '@types/history': 4.7.11 - '@types/react': 17.0.27 + '@types/react': 18.0.25 '@types/react-router-config': 5.0.6 '@types/react-router-dom': 5.3.3 react: 18.2.0 @@ -3658,7 +3658,7 @@ packages: peerDependencies: react: '*' dependencies: - '@types/react': 17.0.27 + '@types/react': 18.0.25 prop-types: 15.8.1 react: 18.2.0 dev: false @@ -3727,7 +3727,7 @@ packages: '@docusaurus/plugin-content-pages': 2.2.0_biqbaboplfbrettd7655fr4n2y '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 '@types/history': 4.7.11 - '@types/react': 17.0.27 + '@types/react': 18.0.25 '@types/react-router-config': 5.0.6 clsx: 1.2.1 parse-numeric-range: 1.3.0 @@ -3812,7 +3812,7 @@ packages: react-dom: ^16.8.4 || ^17.0.0 dependencies: '@types/history': 4.7.11 - '@types/react': 17.0.27 + '@types/react': 18.0.25 commander: 5.1.0 joi: 17.6.0 react: 18.2.0 @@ -4585,7 +4585,7 @@ packages: react: '>=16' dependencies: '@types/mdx': 2.0.2 - '@types/react': 17.0.27 + '@types/react': 18.0.25 react: 18.2.0 dev: false @@ -5228,7 +5228,7 @@ packages: resolution: {integrity: sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==} dependencies: '@types/history': 4.7.11 - '@types/react': 17.0.27 + '@types/react': 18.0.25 '@types/react-router': 5.1.18 dev: false @@ -5236,7 +5236,7 @@ packages: resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} dependencies: '@types/history': 4.7.11 - '@types/react': 17.0.27 + '@types/react': 18.0.25 '@types/react-router': 5.1.18 dev: false @@ -5244,15 +5244,7 @@ packages: resolution: {integrity: sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g==} dependencies: '@types/history': 4.7.11 - '@types/react': 17.0.27 - dev: false - - /@types/react/17.0.27: - resolution: {integrity: sha512-zgiJwtsggVGtr53MndV7jfiUESTqrbxOcBvwfe6KS/9bzaVPCTDieTWnFNecVNx6EAaapg5xsLLWFfHHR437AA==} - dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.2 - csstype: 3.1.0 + '@types/react': 18.0.25 dev: false /@types/react/18.0.25: diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json index a729b380..ea14e0de 100644 --- a/common/config/rush/repo-state.json +++ b/common/config/rush/repo-state.json @@ -1,5 +1,5 @@ // DO NOT MODIFY THIS FILE MANUALLY BUT DO COMMIT IT. It is generated and used by Rush. { - "pnpmShrinkwrapHash": "aa7418df8f00c083c489bee74875a49316e11802", + "pnpmShrinkwrapHash": "d1b3948476274b45d49b2185192f35752e5adf4a", "preferredVersionsHash": "bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f" } From 37b223255090c0e6aaa7cd83245f1f86ce9042e3 Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Sat, 12 Nov 2022 22:46:48 +0800 Subject: [PATCH 017/171] feat(demo): improve default terminal options --- apps/demo/src/components/terminal.tsx | 13 +++++++++---- apps/demo/src/pages/shell.tsx | 10 ++++------ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/apps/demo/src/components/terminal.tsx b/apps/demo/src/components/terminal.tsx index 0532b891..bd3eccbf 100644 --- a/apps/demo/src/components/terminal.tsx +++ b/apps/demo/src/components/terminal.tsx @@ -12,7 +12,15 @@ export class AdbTerminal extends AutoDisposable { private element = document.createElement('div'); public terminal: Terminal = new Terminal({ + allowProposedApi: true, + allowTransparency: true, + cursorStyle: 'bar', + cursorBlink: true, + fontFamily: '"Cascadia Code", Consolas, monospace, "Source Han Sans SC", "Microsoft YaHei"', + letterSpacing: 1, scrollback: 9000, + smoothScrollDuration: 50, + overviewRulerWidth: 20, }); public searchAddon = new SearchAddon(); @@ -63,10 +71,6 @@ export class AdbTerminal extends AutoDisposable { this.element.style.height = '100%'; this.element.style.overflow = 'hidden'; - this.terminal.options.fontFamily = '"Cascadia Code", Consolas, monospace, "Source Han Sans SC", "Microsoft YaHei"'; - this.terminal.options.letterSpacing = 1; - this.terminal.options.cursorStyle = 'bar'; - this.terminal.options.allowProposedApi = true; this.terminal.loadAddon(this.searchAddon); this.terminal.loadAddon(this.fitAddon); } @@ -76,6 +80,7 @@ export class AdbTerminal extends AutoDisposable { if (!this.terminal.element) { void this.element.offsetWidth; this.terminal.open(this.element); + // WebGL addon requires terminal to be attached to DOM this.terminal.loadAddon(new WebglAddon()); // WebGL renderer ignores `cursorBlink` set before it initialized this.terminal.options.cursorBlink = true; diff --git a/apps/demo/src/pages/shell.tsx b/apps/demo/src/pages/shell.tsx index 0843caef..5bbd1329 100644 --- a/apps/demo/src/pages/shell.tsx +++ b/apps/demo/src/pages/shell.tsx @@ -25,12 +25,10 @@ if (typeof window !== 'undefined') { const SEARCH_OPTIONS: ISearchOptions = { decorations: { - matchBackground: '#232422', - matchBorder: '#555753', - matchOverviewRuler: '#555753', - activeMatchBackground: '#ef2929', - activeMatchBorder: '#ffffff', - activeMatchColorOverviewRuler: '#ef2929' + matchBackground: '#42557b', + matchOverviewRuler: '#d18616', + activeMatchBackground: '#6199ff2f', + activeMatchColorOverviewRuler: '#d186167e' } }; From a7e1e85f0d584bdf46daea15b403809f8fa12e57 Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Sat, 12 Nov 2022 22:57:17 +0800 Subject: [PATCH 018/171] feat(demo): add volume control buttons fixes #448 --- apps/demo/src/pages/scrcpy.tsx | 73 +++++++++++++++++++++++++++++++--- apps/demo/src/utils/icons.tsx | 8 +++- 2 files changed, 75 insertions(+), 6 deletions(-) diff --git a/apps/demo/src/pages/scrcpy.tsx b/apps/demo/src/pages/scrcpy.tsx index 3716c18c..8915acf7 100644 --- a/apps/demo/src/pages/scrcpy.tsx +++ b/apps/demo/src/pages/scrcpy.tsx @@ -1,4 +1,4 @@ -import { CommandBar, Dialog, Dropdown, ICommandBarItemProps, Icon, IconButton, IDropdownOption, LayerHost, Position, ProgressIndicator, SpinButton, Stack, TextField, Toggle, TooltipHost } from "@fluentui/react"; +import { CommandBar, ContextualMenuItemType, Dialog, Dropdown, ICommandBarItemProps, Icon, IconButton, IDropdownOption, LayerHost, Position, ProgressIndicator, SpinButton, Stack, TextField, Toggle, TooltipHost } from "@fluentui/react"; import { useId } from "@fluentui/react-hooks"; import { makeStyles } from "@griffel/react"; import { action, autorun, makeAutoObservable, observable, runInAction } from "mobx"; @@ -369,6 +369,69 @@ class ScrcpyPageState { onClick: () => { this.deviceView?.enterFullscreen(); }, }); + result.push({ + key: 'volumeUp', + disabled: !this.running, + iconProps: { iconName: Icons.Speaker2 }, + iconOnly: true, + text: 'Volume Up', + onClick: (async () => { + // TODO: Auto repeat when holding + await this.client?.controlMessageSerializer!.injectKeyCode({ + action: AndroidKeyEventAction.Down, + keyCode: AndroidKeyCode.VolumeUp, + repeat: 0, + metaState: 0, + }); + await this.client?.controlMessageSerializer!.injectKeyCode({ + action: AndroidKeyEventAction.Up, + keyCode: AndroidKeyCode.VolumeUp, + repeat: 0, + metaState: 0, + }); + }) as (() => void), + }, { + key: 'volumeDown', + disabled: !this.running, + iconProps: { iconName: Icons.Speaker1 }, + iconOnly: true, + text: 'Volume Down', + onClick: (async () => { + await this.client?.controlMessageSerializer!.injectKeyCode({ + action: AndroidKeyEventAction.Down, + keyCode: AndroidKeyCode.VolumeDown, + repeat: 0, + metaState: 0, + }); + await this.client?.controlMessageSerializer!.injectKeyCode({ + action: AndroidKeyEventAction.Up, + keyCode: AndroidKeyCode.VolumeDown, + repeat: 0, + metaState: 0, + }); + }) as (() => void), + }, { + key: 'volumeMute', + disabled: !this.running, + iconProps: { iconName: Icons.SpeakerOff }, + iconOnly: true, + text: 'Toggle Mute', + onClick: (async () => { + await this.client?.controlMessageSerializer!.injectKeyCode({ + action: AndroidKeyEventAction.Down, + keyCode: AndroidKeyCode.VolumeMute, + repeat: 0, + metaState: 0, + }); + await this.client?.controlMessageSerializer!.injectKeyCode({ + action: AndroidKeyEventAction.Up, + keyCode: AndroidKeyCode.VolumeMute, + repeat: 0, + metaState: 0, + }); + }) as (() => void), + }); + result.push({ key: 'rotateDevice', disabled: !this.running, @@ -382,21 +445,21 @@ class ScrcpyPageState { iconProps: { iconName: Icons.RotateLeft }, iconOnly: true, text: 'Rotate Video Left', - onClick: () => { + onClick: action(() => { this.rotate -= 1; if (this.rotate < 0) { this.rotate = 3; } - } + }), }, { key: 'rotateVideoRight', disabled: !this.running, iconProps: { iconName: Icons.RotateRight }, iconOnly: true, text: 'Rotate Video Right', - onClick: () => { + onClick: action(() => { this.rotate = (this.rotate + 1) & 3; - }, + }), }); result.push({ diff --git a/apps/demo/src/utils/icons.tsx b/apps/demo/src/utils/icons.tsx index 307a253c..34afc048 100644 --- a/apps/demo/src/utils/icons.tsx +++ b/apps/demo/src/utils/icons.tsx @@ -1,5 +1,5 @@ import { registerIcons } from "@fluentui/react"; -import { AddCircleRegular, ArrowClockwiseRegular, ArrowRotateClockwiseRegular, ArrowRotateCounterclockwiseRegular, ArrowSortDownRegular, ArrowSortUpRegular, BookmarkRegular, BookSearchRegular, BoxRegular, BugRegular, CameraRegular, CheckmarkRegular, ChevronDownRegular, ChevronRightRegular, ChevronUpRegular, CircleRegular, CloudArrowDownRegular, CloudArrowUpRegular, CopyRegular, DeleteRegular, DocumentRegular, FilterRegular, FolderRegular, FullScreenMaximizeRegular, InfoRegular, LightbulbFilamentRegular, LightbulbRegular, MoreHorizontalRegular, NavigationRegular, OrientationRegular, PanelBottomRegular, PersonFeedbackRegular, PhoneLaptopRegular, PhoneRegular, PlayRegular, PlugConnectedRegular, PlugDisconnectedRegular, PowerRegular, SaveRegular, SearchRegular, SettingsRegular, StopRegular, TextGrammarErrorRegular, WandRegular, WarningRegular, WifiSettingsRegular, WindowConsoleRegular } from '@fluentui/react-icons'; +import { AddCircleRegular, ArrowClockwiseRegular, ArrowRotateClockwiseRegular, ArrowRotateCounterclockwiseRegular, ArrowSortDownRegular, ArrowSortUpRegular, BookmarkRegular, BookSearchRegular, BoxRegular, BugRegular, CameraRegular, CheckmarkRegular, ChevronDownRegular, ChevronRightRegular, ChevronUpRegular, CircleRegular, CloudArrowDownRegular, CloudArrowUpRegular, CopyRegular, DeleteRegular, DocumentRegular, FilterRegular, FolderRegular, FullScreenMaximizeRegular, InfoRegular, LightbulbFilamentRegular, LightbulbRegular, MoreHorizontalRegular, NavigationRegular, OrientationRegular, PanelBottomRegular, PersonFeedbackRegular, PhoneLaptopRegular, PhoneRegular, PlayRegular, PlugConnectedRegular, PlugDisconnectedRegular, PowerRegular, SaveRegular, SearchRegular, SettingsRegular, Speaker1Regular, Speaker2Regular, SpeakerOffRegular, StopRegular, TextGrammarErrorRegular, WandRegular, WarningRegular, WifiSettingsRegular, WindowConsoleRegular } from '@fluentui/react-icons'; const STYLE = {}; @@ -42,6 +42,9 @@ export function register() { RotateRight: , Save: , Settings: , + Speaker1: , + Speaker2: , + SpeakerOff: , Stop: , TextGrammarError: , Wand: , @@ -103,6 +106,9 @@ const Icons = { RotateRight: 'RotateRight', Save: 'Save', Settings: 'Settings', + Speaker1: 'Speaker1', + Speaker2: 'Speaker2', + SpeakerOff: 'SpeakerOff', Stop: 'Stop', TextGrammarError: 'TextGrammarError', Wand: 'Wand', From 039fe1583e60546b3a50e97696f0d5f840b12faf Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Sat, 12 Nov 2022 23:17:24 +0800 Subject: [PATCH 019/171] chore: fix build --- .github/workflows/deploy.yml | 2 +- .github/workflows/pull_request.yml | 2 +- .github/workflows/test.yml | 2 +- apps/demo/src/components/demo-mode-panel.tsx | 6 +++--- apps/demo/src/pages/shell.tsx | 2 +- apps/demo/src/pages/tcpip.tsx | 4 ++-- apps/demo/src/utils/file-size.ts | 4 ++-- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 1ee9e250..c1548a8c 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3.0.2 + uses: actions/checkout@v3 - name: Use Node.js 16.x uses: actions/setup-node@v2 diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 68c5195a..c3abe000 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3.0.2 + uses: actions/checkout@v3 with: fetch-depth: 0 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 70698398..9fea666c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3.0.2 + uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v2 diff --git a/apps/demo/src/components/demo-mode-panel.tsx b/apps/demo/src/components/demo-mode-panel.tsx index 9634c965..a28fe30d 100644 --- a/apps/demo/src/components/demo-mode-panel.tsx +++ b/apps/demo/src/components/demo-mode-panel.tsx @@ -245,7 +245,7 @@ const FEATURES: FeatureDefinition[][] = [ ]; const FeatureBase = ({ feature }: { feature: FeatureDefinition; }) => { - const handleChange = useCallback((e, value: unknown) => { + const handleChange = useCallback((e: unknown, value: unknown) => { switch (feature.type) { case 'select': value = (value as IDropdownOption).key; @@ -312,7 +312,7 @@ export interface DemoModePanelProps { export const DemoModePanel = observer(({ style, }: DemoModePanelProps) => { - const handleAllowedChange = useCallback(async (e, value?: boolean) => { + const handleAllowedChange = useCallback(async (e: unknown, value?: boolean) => { await state.demoMode!.setAllowed(value!); runInAction(() => { state.allowed = value!; @@ -320,7 +320,7 @@ export const DemoModePanel = observer(({ }); }, []); - const handleEnabledChange = useCallback(async (e, value?: boolean) => { + const handleEnabledChange = useCallback(async (e: unknown, value?: boolean) => { await state.demoMode!.setEnabled(value!); runInAction(() => state.enabled = value!); }, []); diff --git a/apps/demo/src/pages/shell.tsx b/apps/demo/src/pages/shell.tsx index 5bbd1329..81c77920 100644 --- a/apps/demo/src/pages/shell.tsx +++ b/apps/demo/src/pages/shell.tsx @@ -102,7 +102,7 @@ const DownIconProps = { iconName: Icons.ChevronDown }; const Shell: NextPage = (): JSX.Element | null => { const classes = useClasses(); - const handleSearchKeywordChange = useCallback((e, value?: string) => { + const handleSearchKeywordChange = useCallback((e: unknown, value?: string) => { state.setSearchKeyword(value ?? ''); }, []); diff --git a/apps/demo/src/pages/tcpip.tsx b/apps/demo/src/pages/tcpip.tsx index 7f414ca4..607c5ad2 100644 --- a/apps/demo/src/pages/tcpip.tsx +++ b/apps/demo/src/pages/tcpip.tsx @@ -127,11 +127,11 @@ const TcpIp: NextPage = () => { }; }); - const handleServicePortEnabledChange = useCallback((e, value?: boolean) => { + const handleServicePortEnabledChange = useCallback((e: unknown, value?: boolean) => { runInAction(() => { state.servicePortEnabled = !!value; }); }, []); - const handleServicePortChange = useCallback((e, value?: string) => { + const handleServicePortChange = useCallback((e: unknown, value?: string) => { if (value === undefined) { return; } diff --git a/apps/demo/src/utils/file-size.ts b/apps/demo/src/utils/file-size.ts index 875cc7b4..736b4193 100644 --- a/apps/demo/src/utils/file-size.ts +++ b/apps/demo/src/utils/file-size.ts @@ -40,7 +40,7 @@ export function useSpeed(completed: number, total: number): [completed: number, return () => { clearInterval(intervalIdRef.current!); }; - }, [total]); + }, [clearInterval, setInterval, total]); useEffect(() => { if (total !== 0 && completed === total) { @@ -50,7 +50,7 @@ export function useSpeed(completed: number, total: number): [completed: number, }); clearInterval(intervalIdRef.current!); } - }, [completed, total]); + }, [clearInterval, completed, total]); return [debouncedCompleted, speed]; } From a2c96e4c08b12030329120fd3deefd1fb1c3328c Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Tue, 15 Nov 2022 11:31:53 +0800 Subject: [PATCH 020/171] chore: update GitHub Actions dependencies --- .github/workflows/deploy.yml | 2 +- .github/workflows/pull_request.yml | 2 +- .github/workflows/test.yml | 2 +- apps/demo/package.json | 2 +- common/config/rush/pnpm-lock.yaml | 14 +++++++------- common/config/rush/repo-state.json | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c1548a8c..24844cc2 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -19,7 +19,7 @@ jobs: uses: actions/checkout@v3 - name: Use Node.js 16.x - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: 16.x diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index c3abe000..71493d6f 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -25,7 +25,7 @@ jobs: fetch-depth: 0 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9fea666c..38f17c31 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -23,7 +23,7 @@ jobs: uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} diff --git a/apps/demo/package.json b/apps/demo/package.json index 98f00ded..900a6d03 100644 --- a/apps/demo/package.json +++ b/apps/demo/package.json @@ -31,7 +31,7 @@ "@yume-chan/stream-extra": "workspace:^0.0.17", "@yume-chan/stream-saver": "^2.0.6", "@yume-chan/struct": "workspace:^0.0.17", - "mobx": "^6.6.2", + "mobx": "^6.7.0", "mobx-react-lite": "^3.4.0", "next": "13.0.3", "react": "^18.2.0", diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index b2eaacc5..b207e905 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -64,7 +64,7 @@ importers: '@yume-chan/struct': workspace:^0.0.17 eslint: 8.27.0 eslint-config-next: 13.0.3 - mobx: ^6.6.2 + mobx: ^6.7.0 mobx-react-lite: ^3.4.0 next: 13.0.3 react: ^18.2.0 @@ -97,8 +97,8 @@ importers: '@yume-chan/stream-extra': link:../../libraries/stream-extra '@yume-chan/stream-saver': 2.0.6 '@yume-chan/struct': link:../../libraries/struct - mobx: 6.6.2 - mobx-react-lite: 3.4.0_qrr2ojv4n7h7ey2xj7njerqqr4 + mobx: 6.7.0 + mobx-react-lite: 3.4.0_jofyzmwkboewm6mjrhi25mngky next: 13.0.3_biqbaboplfbrettd7655fr4n2y react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -10510,7 +10510,7 @@ packages: /minimist/1.2.6: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} - /mobx-react-lite/3.4.0_qrr2ojv4n7h7ey2xj7njerqqr4: + /mobx-react-lite/3.4.0_jofyzmwkboewm6mjrhi25mngky: resolution: {integrity: sha512-bRuZp3C0itgLKHu/VNxi66DN/XVkQG7xtoBVWxpvC5FhAqbOCP21+nPhULjnzEqd7xBMybp6KwytdUpZKEgpIQ==} peerDependencies: mobx: ^6.1.0 @@ -10523,13 +10523,13 @@ packages: react-native: optional: true dependencies: - mobx: 6.6.2 + mobx: 6.7.0 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 dev: false - /mobx/6.6.2: - resolution: {integrity: sha512-IOpS0bf3+hXIhDIy+CmlNMBfFpAbHS0aVHcNC+xH/TFYEKIIVDKNYRh9eKlXuVfJ1iRKAp0cRVmO145CyJAMVQ==} + /mobx/6.7.0: + resolution: {integrity: sha512-1kBLBdSNG2bA522HQdbsTvwAwYf9hq9FWxmlhX7wTsJUAI54907J+ozfGW+LoYUo06vjit748g6QH1AAGLNebw==} dev: false /mri/1.2.0: diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json index ea14e0de..6503690d 100644 --- a/common/config/rush/repo-state.json +++ b/common/config/rush/repo-state.json @@ -1,5 +1,5 @@ // DO NOT MODIFY THIS FILE MANUALLY BUT DO COMMIT IT. It is generated and used by Rush. { - "pnpmShrinkwrapHash": "d1b3948476274b45d49b2185192f35752e5adf4a", + "pnpmShrinkwrapHash": "3f99df4199add0c084fab9d283e9f43b2adf174a", "preferredVersionsHash": "bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f" } From ccb9d32defea270d3405f24fb4b310b82932c0ef Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Wed, 16 Nov 2022 00:42:53 +0800 Subject: [PATCH 021/171] chore: update jest config --- apps/demo/package.json | 8 ++++---- common/config/rush/pnpm-lock.yaml | 6 ++++++ common/config/rush/repo-state.json | 2 +- libraries/adb/jest.config.js | 13 +++++++------ libraries/b-tree/jest.config.js | 13 +++++++------ libraries/event/jest.config.js | 15 ++++++++++++--- libraries/event/package.json | 5 ++++- libraries/event/src/disposable.spec.ts | 10 ++++++---- libraries/event/tsconfig.build.json | 3 +++ libraries/event/tsconfig.json | 9 ++++++++- libraries/event/tsconfig.test.json | 8 ++++++++ libraries/scrcpy-decoder-tinyh264/jest.config.js | 13 +++++++------ libraries/scrcpy-decoder-tinyh264/package.json | 2 +- libraries/scrcpy-decoder-webcodecs/jest.config.js | 13 +++++++------ libraries/scrcpy-decoder-webcodecs/package.json | 2 +- libraries/scrcpy/jest.config.js | 13 +++++++------ libraries/stream-extra/jest.config.js | 13 +++++++------ libraries/struct/jest.config.js | 13 +++++++------ 18 files changed, 103 insertions(+), 58 deletions(-) create mode 100644 libraries/event/tsconfig.build.json create mode 100644 libraries/event/tsconfig.test.json diff --git a/apps/demo/package.json b/apps/demo/package.json index 900a6d03..d9313eb6 100644 --- a/apps/demo/package.json +++ b/apps/demo/package.json @@ -10,11 +10,11 @@ "lint": "next lint" }, "dependencies": { - "@fluentui/react": "^8.101.0", - "@fluentui/react-file-type-icons": "^8.8.1", - "@fluentui/react-hooks": "^8.6.13", + "@fluentui/react": "^8.101.1", + "@fluentui/react-file-type-icons": "^8.8.2", + "@fluentui/react-hooks": "^8.6.14", "@fluentui/react-icons": "^2.0.187", - "@fluentui/style-utilities": "^8.8.2", + "@fluentui/style-utilities": "^8.8.3", "@griffel/react": "^1.4.2", "@yume-chan/adb": "workspace:^0.0.17", "@yume-chan/adb-backend-direct-sockets": "workspace:^0.0.9", diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index b207e905..6bbcb8e3 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -263,17 +263,23 @@ importers: ../../libraries/event: specifiers: + '@jest/globals': ^29.3.1 '@yume-chan/async': ^2.2.0 '@yume-chan/ts-package-builder': workspace:^1.0.0 + cross-env: ^7.0.3 jest: ^29.3.1 + ts-jest: ^29.0.3 tslib: ^2.4.1 typescript: ^4.8.4 dependencies: '@yume-chan/async': 2.2.0 tslib: 2.4.1 devDependencies: + '@jest/globals': 29.3.1 '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder + cross-env: 7.0.3 jest: 29.3.1 + ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se typescript: 4.8.4 ../../libraries/scrcpy: diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json index 6503690d..b14bd330 100644 --- a/common/config/rush/repo-state.json +++ b/common/config/rush/repo-state.json @@ -1,5 +1,5 @@ // DO NOT MODIFY THIS FILE MANUALLY BUT DO COMMIT IT. It is generated and used by Rush. { - "pnpmShrinkwrapHash": "3f99df4199add0c084fab9d283e9f43b2adf174a", + "pnpmShrinkwrapHash": "a5230b60dfdc157f1b6b6e61fce235ca39969a33", "preferredVersionsHash": "bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f" } diff --git a/libraries/adb/jest.config.js b/libraries/adb/jest.config.js index 1f603478..d3c43fff 100644 --- a/libraries/adb/jest.config.js +++ b/libraries/adb/jest.config.js @@ -1,13 +1,14 @@ /** @type {import('ts-jest').InitialOptionsTsJest} */ export default { preset: "ts-jest/presets/default-esm", - globals: { - 'ts-jest': { - tsconfig: 'tsconfig.test.json', - useESM: true, - }, + extensionsToTreatAsEsm: [".ts"], + transform: { + "^.+\\.tsx?$": [ + "ts-jest", + { tsconfig: "tsconfig.test.json", useESM: true }, + ], }, moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', + "^(\\.{1,2}/.*)\\.js$": "$1", }, }; diff --git a/libraries/b-tree/jest.config.js b/libraries/b-tree/jest.config.js index 1f603478..d3c43fff 100644 --- a/libraries/b-tree/jest.config.js +++ b/libraries/b-tree/jest.config.js @@ -1,13 +1,14 @@ /** @type {import('ts-jest').InitialOptionsTsJest} */ export default { preset: "ts-jest/presets/default-esm", - globals: { - 'ts-jest': { - tsconfig: 'tsconfig.test.json', - useESM: true, - }, + extensionsToTreatAsEsm: [".ts"], + transform: { + "^.+\\.tsx?$": [ + "ts-jest", + { tsconfig: "tsconfig.test.json", useESM: true }, + ], }, moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', + "^(\\.{1,2}/.*)\\.js$": "$1", }, }; diff --git a/libraries/event/jest.config.js b/libraries/event/jest.config.js index 84ce3bd9..9a89fa6e 100644 --- a/libraries/event/jest.config.js +++ b/libraries/event/jest.config.js @@ -1,4 +1,13 @@ -module.exports = { - testMatch: ['/cjs/**/*.spec.js'], - testEnvironment: 'node', +/** @type {import('ts-jest').InitialOptionsTsJest} */ +export default { + preset: "ts-jest/presets/default-esm", + transform: { + "\\.tsx?$": [ + "ts-jest", + { tsconfig: "tsconfig.test.json", useESM: true }, + ], + }, + moduleNameMapper: { + "^(\\.{1,2}/.*)\\.js$": "$1", + }, }; diff --git a/libraries/event/package.json b/libraries/event/package.json index 4af679e9..dbf8571a 100644 --- a/libraries/event/package.json +++ b/libraries/event/package.json @@ -28,7 +28,7 @@ "scripts": { "build": "build-ts-package", "build:watch": "build-ts-package --incremental", - "//test": "jest --coverage", + "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage", "prepublishOnly": "npm run build" }, "dependencies": { @@ -36,8 +36,11 @@ "tslib": "^2.4.1" }, "devDependencies": { + "@jest/globals": "^29.3.1", "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "cross-env": "^7.0.3", "jest": "^29.3.1", + "ts-jest": "^29.0.3", "typescript": "^4.8.4" } } diff --git a/libraries/event/src/disposable.spec.ts b/libraries/event/src/disposable.spec.ts index eb8e7237..004a7901 100644 --- a/libraries/event/src/disposable.spec.ts +++ b/libraries/event/src/disposable.spec.ts @@ -1,8 +1,10 @@ -import { AutoDisposable, Disposable } from './disposable.js'; +import { describe, expect, it, jest } from "@jest/globals"; -describe('Event', () => { - describe('AutoDisposable', () => { - it('should dispose its dependencies', () => { +import { AutoDisposable, Disposable } from "./disposable.js"; + +describe("Event", () => { + describe("AutoDisposable", () => { + it("should dispose its dependencies", () => { const myDisposable = { dispose: jest.fn(), }; diff --git a/libraries/event/tsconfig.build.json b/libraries/event/tsconfig.build.json new file mode 100644 index 00000000..b4bb73dd --- /dev/null +++ b/libraries/event/tsconfig.build.json @@ -0,0 +1,3 @@ +{ + "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json" +} diff --git a/libraries/event/tsconfig.json b/libraries/event/tsconfig.json index 45ccd9e9..85fc5a7a 100644 --- a/libraries/event/tsconfig.json +++ b/libraries/event/tsconfig.json @@ -1,3 +1,10 @@ { - "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json", + "references": [ + { + "path": "./tsconfig.test.json" + }, + { + "path": "./tsconfig.build.json" + }, + ] } diff --git a/libraries/event/tsconfig.test.json b/libraries/event/tsconfig.test.json new file mode 100644 index 00000000..e987f757 --- /dev/null +++ b/libraries/event/tsconfig.test.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.build.json", + "compilerOptions": { + "types": [ + ], + }, + "exclude": [] +} diff --git a/libraries/scrcpy-decoder-tinyh264/jest.config.js b/libraries/scrcpy-decoder-tinyh264/jest.config.js index 1f603478..d3c43fff 100644 --- a/libraries/scrcpy-decoder-tinyh264/jest.config.js +++ b/libraries/scrcpy-decoder-tinyh264/jest.config.js @@ -1,13 +1,14 @@ /** @type {import('ts-jest').InitialOptionsTsJest} */ export default { preset: "ts-jest/presets/default-esm", - globals: { - 'ts-jest': { - tsconfig: 'tsconfig.test.json', - useESM: true, - }, + extensionsToTreatAsEsm: [".ts"], + transform: { + "^.+\\.tsx?$": [ + "ts-jest", + { tsconfig: "tsconfig.test.json", useESM: true }, + ], }, moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', + "^(\\.{1,2}/.*)\\.js$": "$1", }, }; diff --git a/libraries/scrcpy-decoder-tinyh264/package.json b/libraries/scrcpy-decoder-tinyh264/package.json index 29e8afd6..5ea70dae 100644 --- a/libraries/scrcpy-decoder-tinyh264/package.json +++ b/libraries/scrcpy-decoder-tinyh264/package.json @@ -28,7 +28,7 @@ "scripts": { "build": "tsc -b tsconfig.build.json", "build:watch": "tsc -b tsconfig.build.json", - "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage", + "//test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage", "prepublishOnly": "npm run build" }, "dependencies": { diff --git a/libraries/scrcpy-decoder-webcodecs/jest.config.js b/libraries/scrcpy-decoder-webcodecs/jest.config.js index 1f603478..d3c43fff 100644 --- a/libraries/scrcpy-decoder-webcodecs/jest.config.js +++ b/libraries/scrcpy-decoder-webcodecs/jest.config.js @@ -1,13 +1,14 @@ /** @type {import('ts-jest').InitialOptionsTsJest} */ export default { preset: "ts-jest/presets/default-esm", - globals: { - 'ts-jest': { - tsconfig: 'tsconfig.test.json', - useESM: true, - }, + extensionsToTreatAsEsm: [".ts"], + transform: { + "^.+\\.tsx?$": [ + "ts-jest", + { tsconfig: "tsconfig.test.json", useESM: true }, + ], }, moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', + "^(\\.{1,2}/.*)\\.js$": "$1", }, }; diff --git a/libraries/scrcpy-decoder-webcodecs/package.json b/libraries/scrcpy-decoder-webcodecs/package.json index b460b618..f4213e1c 100644 --- a/libraries/scrcpy-decoder-webcodecs/package.json +++ b/libraries/scrcpy-decoder-webcodecs/package.json @@ -28,7 +28,7 @@ "scripts": { "build": "tsc -b tsconfig.build.json", "build:watch": "tsc -b tsconfig.build.json", - "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage", + "//test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage", "prepublishOnly": "npm run build" }, "dependencies": { diff --git a/libraries/scrcpy/jest.config.js b/libraries/scrcpy/jest.config.js index 1f603478..d3c43fff 100644 --- a/libraries/scrcpy/jest.config.js +++ b/libraries/scrcpy/jest.config.js @@ -1,13 +1,14 @@ /** @type {import('ts-jest').InitialOptionsTsJest} */ export default { preset: "ts-jest/presets/default-esm", - globals: { - 'ts-jest': { - tsconfig: 'tsconfig.test.json', - useESM: true, - }, + extensionsToTreatAsEsm: [".ts"], + transform: { + "^.+\\.tsx?$": [ + "ts-jest", + { tsconfig: "tsconfig.test.json", useESM: true }, + ], }, moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', + "^(\\.{1,2}/.*)\\.js$": "$1", }, }; diff --git a/libraries/stream-extra/jest.config.js b/libraries/stream-extra/jest.config.js index 1f603478..d3c43fff 100644 --- a/libraries/stream-extra/jest.config.js +++ b/libraries/stream-extra/jest.config.js @@ -1,13 +1,14 @@ /** @type {import('ts-jest').InitialOptionsTsJest} */ export default { preset: "ts-jest/presets/default-esm", - globals: { - 'ts-jest': { - tsconfig: 'tsconfig.test.json', - useESM: true, - }, + extensionsToTreatAsEsm: [".ts"], + transform: { + "^.+\\.tsx?$": [ + "ts-jest", + { tsconfig: "tsconfig.test.json", useESM: true }, + ], }, moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', + "^(\\.{1,2}/.*)\\.js$": "$1", }, }; diff --git a/libraries/struct/jest.config.js b/libraries/struct/jest.config.js index 1f603478..d3c43fff 100644 --- a/libraries/struct/jest.config.js +++ b/libraries/struct/jest.config.js @@ -1,13 +1,14 @@ /** @type {import('ts-jest').InitialOptionsTsJest} */ export default { preset: "ts-jest/presets/default-esm", - globals: { - 'ts-jest': { - tsconfig: 'tsconfig.test.json', - useESM: true, - }, + extensionsToTreatAsEsm: [".ts"], + transform: { + "^.+\\.tsx?$": [ + "ts-jest", + { tsconfig: "tsconfig.test.json", useESM: true }, + ], }, moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', + "^(\\.{1,2}/.*)\\.js$": "$1", }, }; From bbd268325cf68e310ab44b5d90d567e229fba766 Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Wed, 16 Nov 2022 01:11:02 +0800 Subject: [PATCH 022/171] chore: update dependencies of demo --- common/config/rush/pnpm-lock.yaml | 88 +++++++++++++++--------------- common/config/rush/repo-state.json | 2 +- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 6bbcb8e3..0b920bfa 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -38,11 +38,11 @@ importers: ../../apps/demo: specifiers: - '@fluentui/react': ^8.101.0 - '@fluentui/react-file-type-icons': ^8.8.1 - '@fluentui/react-hooks': ^8.6.13 + '@fluentui/react': ^8.101.1 + '@fluentui/react-file-type-icons': ^8.8.2 + '@fluentui/react-hooks': ^8.6.14 '@fluentui/react-icons': ^2.0.187 - '@fluentui/style-utilities': ^8.8.2 + '@fluentui/style-utilities': ^8.8.3 '@griffel/react': ^1.4.2 '@mdx-js/loader': ^2.1.5 '@next/mdx': ^13.0.3 @@ -76,11 +76,11 @@ importers: xterm-addon-search: ^0.10.0 xterm-addon-webgl: ^0.13.0 dependencies: - '@fluentui/react': 8.101.0_2zx2umvpluuhvlq44va5bta2da - '@fluentui/react-file-type-icons': 8.8.1_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/react-hooks': 8.6.13_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/react': 8.101.1_2zx2umvpluuhvlq44va5bta2da + '@fluentui/react-file-type-icons': 8.8.2_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/react-hooks': 8.6.14_fan5qbzahqtxlm5dzefqlqx5ia '@fluentui/react-icons': 2.0.187_it3lvsvbvb6ccu3ygofv6sq6xa - '@fluentui/style-utilities': 8.8.2_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia '@griffel/react': 1.4.2_react@18.2.0 '@yume-chan/adb': link:../../libraries/adb '@yume-chan/adb-backend-direct-sockets': link:../../libraries/adb-backend-direct-sockets @@ -3995,28 +3995,28 @@ packages: tslib: 2.4.1 dev: false - /@fluentui/font-icons-mdl2/8.5.3_fan5qbzahqtxlm5dzefqlqx5ia: - resolution: {integrity: sha512-C1P2fvaj8kka4tLJOoZPopq4kz2ZNCZ4ImGVvek8t7DOayOU2UoTKNoVKhNjynagbsLpwpOYA8Uzb4Ialx+/uQ==} + /@fluentui/font-icons-mdl2/8.5.4_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-sIf1ND1Qr1Y1A/XAYG3vCAVnjNljXZxrwenv36VGBqjG/xwJ0Lu5bNAUqjmPy6biKiMttz73zcL2ST3QNlYvhw==} dependencies: '@fluentui/set-version': 8.2.3 - '@fluentui/style-utilities': 8.8.2_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/utilities': 8.13.3_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia tslib: 2.4.1 transitivePeerDependencies: - '@types/react' - react dev: false - /@fluentui/foundation-legacy/8.2.23_fan5qbzahqtxlm5dzefqlqx5ia: - resolution: {integrity: sha512-5idaKH7z0HKRAlfGH4BjqSlRKQh4yzVd5BWJ0MCPL20Rn6jmaIJSdjMHTrIfVhzLvSxn+7MQRV9a8S+AvIDUHQ==} + /@fluentui/foundation-legacy/8.2.24_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-ccGbQmXW2qXSl/xtFVuAkCFH5TJMJX4+qoQ/CwAq+43ZCJaMQaz0KHmk3t3u+TXUWLCc8EGSEgYAIxMPzHI53A==} peerDependencies: '@types/react': '>=16.8.0 <19.0.0' react: '>=16.8.0 <19.0.0' dependencies: '@fluentui/merge-styles': 8.5.4 '@fluentui/set-version': 8.2.3 - '@fluentui/style-utilities': 8.8.2_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/utilities': 8.13.3_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia '@types/react': 18.0.25 react: 18.2.0 tslib: 2.4.1 @@ -4035,21 +4035,21 @@ packages: tslib: 2.4.1 dev: false - /@fluentui/react-file-type-icons/8.8.1_fan5qbzahqtxlm5dzefqlqx5ia: - resolution: {integrity: sha512-7mOBiiF2fSpqXflGi+61mY1wWxNdNohZnQZ11a1VkJ5yHs5y4OI32g9nPp0BIiVUoEyiBqLzwA/bLMvQ3+oZCA==} + /@fluentui/react-file-type-icons/8.8.2_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-FYJq8vR8DgZot//oUgV3x9TOFT1y/180kUAMXqo8EH106ijk2M4hXdg6Q1o9gM1Zy66Od951gr9u84r0+JucFA==} peerDependencies: '@types/react': '>=16.8.0 <19.0.0' react: '>=16.8.0 <19.0.0' dependencies: '@fluentui/set-version': 8.2.3 - '@fluentui/style-utilities': 8.8.2_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia '@types/react': 18.0.25 react: 18.2.0 tslib: 2.4.1 dev: false - /@fluentui/react-focus/8.8.9_fan5qbzahqtxlm5dzefqlqx5ia: - resolution: {integrity: sha512-lYixFOZ2OjULcWhD3MppxzAt6aImkhNQiNtUJzswBV1xmYvkpYOxXK2hxf3/CeRAFijcmuAIvwg1rRgYBfRxxA==} + /@fluentui/react-focus/8.8.10_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-CB1/VXRCvy6qLFLY8dCxOF8PPYxM2vayTRSNva4/uDqg60jlMSsdZiPJE1PnC9FQKUKXgMZp78kak/ckGc8VZQ==} peerDependencies: '@types/react': '>=16.8.0 <19.0.0' react: '>=16.8.0 <19.0.0' @@ -4057,22 +4057,22 @@ packages: '@fluentui/keyboard-key': 0.4.3 '@fluentui/merge-styles': 8.5.4 '@fluentui/set-version': 8.2.3 - '@fluentui/style-utilities': 8.8.2_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/utilities': 8.13.3_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia '@types/react': 18.0.25 react: 18.2.0 tslib: 2.4.1 dev: false - /@fluentui/react-hooks/8.6.13_fan5qbzahqtxlm5dzefqlqx5ia: - resolution: {integrity: sha512-RAbVuwzX40czyNNkVpRFYKST2dX+PL0qIT5LB92SWqhEfyZjMOcOeg/YaEoLFZKNOVilAfUItSCD6HzurO4aLA==} + /@fluentui/react-hooks/8.6.14_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-mM2bW7xIRGGx7thBXKDR64SaZB1tYwICdM9qpM/Jfiu0H+VPQhhhtMPJ+ImmG+DM8MxX9n5Su8ePo2QWtz9mYA==} peerDependencies: '@types/react': '>=16.8.0 <19.0.0' react: '>=16.8.0 <19.0.0' dependencies: '@fluentui/react-window-provider': 2.2.4_fan5qbzahqtxlm5dzefqlqx5ia '@fluentui/set-version': 8.2.3 - '@fluentui/utilities': 8.13.3_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia '@types/react': 18.0.25 react: 18.2.0 tslib: 2.4.1 @@ -4112,8 +4112,8 @@ packages: tslib: 2.4.1 dev: false - /@fluentui/react/8.101.0_2zx2umvpluuhvlq44va5bta2da: - resolution: {integrity: sha512-kIVujMFy/vszhCO4GwxMhEIcQ9NCWm2GOqXjX0X/iLzR6g0yOUwzIfdTcKJrD8zpg1g41pANeYdpAnWrl/se6g==} + /@fluentui/react/8.101.1_2zx2umvpluuhvlq44va5bta2da: + resolution: {integrity: sha512-9qqxgIzxQe6srEkHO04aYlI41Cz+9nq1QqmC5/QzYzafDkfKlPJ13rZJSO6Hm8mBEIeimMSHew09yvunkS3j1w==} peerDependencies: '@types/react': '>=16.8.0 <19.0.0' '@types/react-dom': '>=16.8.0 <19.0.0' @@ -4121,17 +4121,17 @@ packages: react-dom: '>=16.8.0 <19.0.0' dependencies: '@fluentui/date-time-utilities': 8.5.3 - '@fluentui/font-icons-mdl2': 8.5.3_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/foundation-legacy': 8.2.23_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/font-icons-mdl2': 8.5.4_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/foundation-legacy': 8.2.24_fan5qbzahqtxlm5dzefqlqx5ia '@fluentui/merge-styles': 8.5.4 - '@fluentui/react-focus': 8.8.9_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/react-hooks': 8.6.13_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/react-focus': 8.8.10_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/react-hooks': 8.6.14_fan5qbzahqtxlm5dzefqlqx5ia '@fluentui/react-portal-compat-context': 9.0.4_fan5qbzahqtxlm5dzefqlqx5ia '@fluentui/react-window-provider': 2.2.4_fan5qbzahqtxlm5dzefqlqx5ia '@fluentui/set-version': 8.2.3 - '@fluentui/style-utilities': 8.8.2_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/theme': 2.6.18_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/utilities': 8.13.3_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/theme': 2.6.19_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia '@microsoft/load-themed-styles': 1.10.281 '@types/react': 18.0.25 react: 18.2.0 @@ -4145,13 +4145,13 @@ packages: tslib: 2.4.1 dev: false - /@fluentui/style-utilities/8.8.2_fan5qbzahqtxlm5dzefqlqx5ia: - resolution: {integrity: sha512-tef1nyWmgQTbETmvjQewxLfeJ+sJ21i3VzwBpK5qvj8MLwCHkMSBoDL7gXp6xCN2VSrQc0TkbykgUvRyJ2IReg==} + /@fluentui/style-utilities/8.8.3_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-DxcCIHnKdaBpzdIawZIMcVyn8xVbK6A37J0Q7MPdjb9VV4Nsp/ohWnM9nPrPlbB+RSsKWrIssgWJdn5yZM9Wxg==} dependencies: '@fluentui/merge-styles': 8.5.4 '@fluentui/set-version': 8.2.3 - '@fluentui/theme': 2.6.18_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/utilities': 8.13.3_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/theme': 2.6.19_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia '@microsoft/load-themed-styles': 1.10.281 tslib: 2.4.1 transitivePeerDependencies: @@ -4159,22 +4159,22 @@ packages: - react dev: false - /@fluentui/theme/2.6.18_fan5qbzahqtxlm5dzefqlqx5ia: - resolution: {integrity: sha512-NWiKCX62XDZ8FYjCN0Km4soFfqSyxqoTtxRVBVC5rujbkMbWyzyV/WpGz5ZNcrudhg/5LWNwILhyXxLRalG3mQ==} + /@fluentui/theme/2.6.19_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-Pk4STq3WAM3Mq4fGCBrq3F43o1u2SitO7CZ6A3/ALreaxTA1LC4bbyKQTYH3tvxapqEOYaEPYZ3dFjWjqYlFfg==} peerDependencies: '@types/react': '>=16.8.0 <19.0.0' react: '>=16.8.0 <19.0.0' dependencies: '@fluentui/merge-styles': 8.5.4 '@fluentui/set-version': 8.2.3 - '@fluentui/utilities': 8.13.3_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia '@types/react': 18.0.25 react: 18.2.0 tslib: 2.4.1 dev: false - /@fluentui/utilities/8.13.3_fan5qbzahqtxlm5dzefqlqx5ia: - resolution: {integrity: sha512-Nshe8pWKO/KngRx32EdhW5hvi5ZUWDR6hZcAGNgfLmXXQh3ZrTqAuLtmntv5PHvgbwz1qIsHfvqHgfAcHtoSpw==} + /@fluentui/utilities/8.13.4_fan5qbzahqtxlm5dzefqlqx5ia: + resolution: {integrity: sha512-oJ6q8BvVdr0eEG5RgI/VBtKX2JvJV2h0AUkR7FwZoT8fvUUH/iykPZO/5CAVcQDyiXj73hmBibiEGkWNFFuPfw==} peerDependencies: '@types/react': '>=16.8.0 <19.0.0' react: '>=16.8.0 <19.0.0' diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json index b14bd330..c8f1c469 100644 --- a/common/config/rush/repo-state.json +++ b/common/config/rush/repo-state.json @@ -1,5 +1,5 @@ // DO NOT MODIFY THIS FILE MANUALLY BUT DO COMMIT IT. It is generated and used by Rush. { - "pnpmShrinkwrapHash": "a5230b60dfdc157f1b6b6e61fce235ca39969a33", + "pnpmShrinkwrapHash": "0befa221b0ddd68c63c5522f8e772fd52f418d83", "preferredVersionsHash": "bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f" } From 8bcd0ab913024612fe1633107269a3e97fdff0d7 Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Wed, 16 Nov 2022 01:15:06 +0800 Subject: [PATCH 023/171] chore: fix project reference --- libraries/adb/tsconfig.json | 2 +- libraries/event/package.json | 4 ++-- libraries/scrcpy/tsconfig.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/adb/tsconfig.json b/libraries/adb/tsconfig.json index 59ae54ea..220bb2a4 100644 --- a/libraries/adb/tsconfig.json +++ b/libraries/adb/tsconfig.json @@ -2,7 +2,7 @@ "references": [ { - "path": "../event/tsconfig.json" + "path": "../event/tsconfig.build.json" }, { "path": "../stream-extra/tsconfig.build.json" diff --git a/libraries/event/package.json b/libraries/event/package.json index dbf8571a..b9bff3eb 100644 --- a/libraries/event/package.json +++ b/libraries/event/package.json @@ -26,8 +26,8 @@ "main": "esm/index.js", "types": "esm/index.d.ts", "scripts": { - "build": "build-ts-package", - "build:watch": "build-ts-package --incremental", + "build": "tsc -b tsconfig.build.json", + "build:watch": "tsc -b tsconfig.build.json", "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage", "prepublishOnly": "npm run build" }, diff --git a/libraries/scrcpy/tsconfig.json b/libraries/scrcpy/tsconfig.json index d01d3739..c5c33622 100644 --- a/libraries/scrcpy/tsconfig.json +++ b/libraries/scrcpy/tsconfig.json @@ -4,7 +4,7 @@ "path": "../adb/tsconfig.build.json" }, { - "path": "../event/tsconfig.json" + "path": "../event/tsconfig.build.json" }, { "path": "../stream-extra/tsconfig.build.json" From aa033e4de65545c4a84ef7c77b0553a5aa4d5b11 Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Thu, 22 Dec 2022 01:42:24 +0800 Subject: [PATCH 024/171] chore: integrate ESLint --- .github/workflows/pull_request.yml | 1 + .github/workflows/test.yml | 1 + .vscode/settings.json | 12 +- apps/book/package.json | 2 +- apps/demo/package.json | 28 +- common/config/rush/command-line.json | 15 +- common/config/rush/pnpm-lock.yaml | 1163 ++++++++++------- common/config/rush/repo-state.json | 2 +- .../adb-backend-direct-sockets/.eslintrc.cjs | 11 + .../adb-backend-direct-sockets/.npmignore | 2 + .../adb-backend-direct-sockets/package.json | 11 +- .../adb-backend-direct-sockets/src/index.ts | 26 +- .../tsconfig.build.json | 9 + .../adb-backend-direct-sockets/tsconfig.json | 12 +- libraries/adb-backend-webusb/.eslintrc.cjs | 11 + libraries/adb-backend-webusb/.npmignore | 2 + libraries/adb-backend-webusb/package.json | 11 +- libraries/adb-backend-webusb/src/backend.ts | 218 ++- .../adb-backend-webusb/tsconfig.build.json | 12 + libraries/adb-backend-webusb/tsconfig.json | 15 +- libraries/adb-backend-ws/.eslintrc.cjs | 11 + libraries/adb-backend-ws/.npmignore | 2 + libraries/adb-backend-ws/package.json | 11 +- libraries/adb-backend-ws/src/index.ts | 82 +- libraries/adb-backend-ws/tsconfig.build.json | 9 + libraries/adb-backend-ws/tsconfig.json | 12 +- libraries/adb-credential-web/.eslintrc.cjs | 11 + libraries/adb-credential-web/.npmignore | 16 + libraries/adb-credential-web/package.json | 11 +- libraries/adb-credential-web/src/index.ts | 35 +- .../adb-credential-web/tsconfig.build.json | 9 + libraries/adb-credential-web/tsconfig.json | 12 +- libraries/adb/.eslintrc.cjs | 11 + libraries/adb/.npmignore | 1 + libraries/adb/package.json | 9 +- libraries/adb/src/adb.ts | 217 +-- libraries/adb/src/auth.ts | 46 +- libraries/adb/src/backend.ts | 10 +- libraries/adb/src/commands/base.ts | 4 +- libraries/adb/src/commands/framebuffer.ts | 78 +- libraries/adb/src/commands/install.ts | 30 +- libraries/adb/src/commands/power.ts | 26 +- libraries/adb/src/commands/reverse.ts | 75 +- .../adb/src/commands/subprocess/command.ts | 45 +- .../src/commands/subprocess/protocols/none.ts | 7 +- .../commands/subprocess/protocols/shell.ts | 98 +- .../commands/subprocess/protocols/types.ts | 13 +- libraries/adb/src/commands/sync/list.ts | 67 +- libraries/adb/src/commands/sync/pull.ts | 85 +- libraries/adb/src/commands/sync/push.ts | 36 +- libraries/adb/src/commands/sync/request.ts | 42 +- libraries/adb/src/commands/sync/response.ts | 56 +- libraries/adb/src/commands/sync/stat.ts | 133 +- libraries/adb/src/commands/sync/sync.ts | 73 +- libraries/adb/src/crypto.ts | 92 +- libraries/adb/src/index.ts | 19 +- libraries/adb/src/packet.ts | 70 +- libraries/adb/src/socket/dispatcher.ts | 190 +-- libraries/adb/src/socket/socket.ts | 95 +- libraries/adb/src/utils/auto-reset-event.ts | 6 +- libraries/adb/tsconfig.build.json | 2 +- libraries/adb/tsconfig.json | 1 - libraries/adb/tsconfig.test.json | 2 +- libraries/android-bin/.eslintrc.cjs | 11 + libraries/android-bin/.npmignore | 16 + libraries/android-bin/package.json | 11 +- libraries/android-bin/src/bu.ts | 10 +- libraries/android-bin/src/bug-report.ts | 122 +- libraries/android-bin/src/demo-mode.ts | 178 ++- libraries/android-bin/src/logcat.ts | 228 ++-- libraries/android-bin/tsconfig.build.json | 3 + libraries/android-bin/tsconfig.json | 6 +- libraries/b-tree/.eslintrc.cjs | 11 + libraries/b-tree/.npmignore | 1 + libraries/b-tree/package.json | 7 +- libraries/b-tree/src/index.spec.ts | 81 +- libraries/b-tree/src/index.ts | 53 +- libraries/b-tree/tsconfig.build.json | 2 +- .../dataview-bigint-polyfill/.eslintrc.cjs | 11 + libraries/dataview-bigint-polyfill/.npmignore | 1 + .../dataview-bigint-polyfill/package.json | 11 +- .../dataview-bigint-polyfill/src/pure.ts | 53 +- .../tsconfig.build.json | 3 + .../dataview-bigint-polyfill/tsconfig.json | 6 +- libraries/event/.eslintrc.cjs | 11 + libraries/event/.npmignore | 2 + libraries/event/package.json | 7 +- libraries/event/src/disposable.spec.ts | 2 +- libraries/event/src/event-emitter.ts | 45 +- libraries/event/src/event.ts | 13 +- libraries/event/src/utils.ts | 7 +- libraries/event/tsconfig.build.json | 2 +- .../scrcpy-decoder-tinyh264/.eslintrc.cjs | 11 + libraries/scrcpy-decoder-tinyh264/.npmignore | 16 + .../scrcpy-decoder-tinyh264/package.json | 7 +- .../scrcpy-decoder-tinyh264/src/index.ts | 73 +- .../scrcpy-decoder-tinyh264/src/types.d.ts | 34 +- .../scrcpy-decoder-tinyh264/src/wrapper.ts | 104 +- .../tsconfig.build.json | 2 +- .../scrcpy-decoder-webcodecs/.eslintrc.cjs | 11 + libraries/scrcpy-decoder-webcodecs/.npmignore | 16 + .../scrcpy-decoder-webcodecs/package.json | 7 +- .../scrcpy-decoder-webcodecs/src/index.ts | 58 +- .../tsconfig.build.json | 2 +- .../tsconfig.test.json | 2 - libraries/scrcpy/.eslintrc.cjs | 11 + libraries/scrcpy/.npmignore | 1 + libraries/scrcpy/package.json | 7 +- libraries/scrcpy/src/adb/client.ts | 231 ++-- libraries/scrcpy/src/adb/connection.ts | 107 +- libraries/scrcpy/src/adb/options/1_16.ts | 19 +- libraries/scrcpy/src/adb/options/1_22.ts | 18 +- libraries/scrcpy/src/adb/options/types.ts | 38 +- libraries/scrcpy/src/control/inject-touch.ts | 28 +- libraries/scrcpy/src/control/serializer.ts | 110 +- .../scrcpy/src/device-message/clipboard.ts | 16 +- libraries/scrcpy/src/device-message/stream.ts | 16 +- .../src/options/1_16/codec-options.spec.ts | 9 +- .../scrcpy/src/options/1_16/codec-options.ts | 26 +- libraries/scrcpy/src/options/1_16/options.ts | 286 ++-- libraries/scrcpy/src/options/1_16/sps.ts | 67 +- libraries/scrcpy/src/options/1_18.ts | 33 +- libraries/scrcpy/src/options/1_23.ts | 49 +- libraries/scrcpy/src/options/types.ts | 49 +- libraries/scrcpy/tsconfig.build.json | 2 +- libraries/stream-extra/.eslintrc.cjs | 19 + libraries/stream-extra/.npmignore | 1 + libraries/stream-extra/package.json | 7 +- .../stream-extra/src/buffered-transform.ts | 48 +- libraries/stream-extra/src/buffered.spec.ts | 47 +- libraries/stream-extra/src/buffered.ts | 27 +- libraries/stream-extra/src/decode-utf8.ts | 5 +- libraries/stream-extra/src/duplex.spec.ts | 9 +- libraries/stream-extra/src/duplex.ts | 36 +- libraries/stream-extra/src/native.ts | 362 ----- libraries/stream-extra/src/push-readable.ts | 123 +- libraries/stream-extra/src/stream.ts | 20 +- .../stream-extra/src/struct-deserialize.ts | 12 +- .../stream-extra/src/struct-serialize.ts | 6 +- libraries/stream-extra/src/wrap-readable.ts | 44 +- libraries/stream-extra/src/wrap-writable.ts | 31 +- libraries/stream-extra/tsconfig.build.json | 2 +- libraries/struct/.eslintrc.cjs | 15 + libraries/struct/.npmignore | 1 + libraries/struct/package.json | 7 +- libraries/struct/src/basic/definition.spec.ts | 54 +- libraries/struct/src/basic/definition.ts | 21 +- .../struct/src/basic/field-value.spec.ts | 93 +- libraries/struct/src/basic/field-value.ts | 33 +- libraries/struct/src/basic/options.spec.ts | 11 +- libraries/struct/src/basic/stream.ts | 2 +- .../struct/src/basic/struct-value.spec.ts | 62 +- libraries/struct/src/basic/struct-value.ts | 28 +- libraries/struct/src/struct.spec.ts | 448 ++++--- libraries/struct/src/struct.ts | 408 +++--- libraries/struct/src/sync-promise.spec.ts | 84 +- libraries/struct/src/sync-promise.ts | 44 +- libraries/struct/src/types/bigint.ts | 89 +- .../struct/src/types/buffer/base.spec.ts | 177 ++- libraries/struct/src/types/buffer/base.ts | 88 +- .../struct/src/types/buffer/fixed-length.ts | 11 +- .../src/types/buffer/variable-length.spec.ts | 464 ++++--- .../src/types/buffer/variable-length.ts | 65 +- libraries/struct/src/types/number.spec.ts | 238 ++-- libraries/struct/src/types/number.ts | 127 +- libraries/struct/src/utils.ts | 19 +- libraries/struct/tsconfig.build.json | 2 +- rush.json | 8 +- toolchain/eslint-config/index.js | 59 + toolchain/eslint-config/package.json | 12 + toolchain/ts-package-builder/.gitignore | 1 - toolchain/ts-package-builder/README.md | 126 -- toolchain/ts-package-builder/jsconfig.json | 5 - toolchain/ts-package-builder/package.json | 24 - toolchain/ts-package-builder/src/index.js | 54 - toolchain/tsconfig/package.json | 4 + .../tsconfig.base.json | 5 +- 177 files changed, 5649 insertions(+), 3843 deletions(-) create mode 100644 libraries/adb-backend-direct-sockets/.eslintrc.cjs create mode 100644 libraries/adb-backend-direct-sockets/tsconfig.build.json create mode 100644 libraries/adb-backend-webusb/.eslintrc.cjs create mode 100644 libraries/adb-backend-webusb/tsconfig.build.json create mode 100644 libraries/adb-backend-ws/.eslintrc.cjs create mode 100644 libraries/adb-backend-ws/tsconfig.build.json create mode 100644 libraries/adb-credential-web/.eslintrc.cjs create mode 100644 libraries/adb-credential-web/.npmignore create mode 100644 libraries/adb-credential-web/tsconfig.build.json create mode 100644 libraries/adb/.eslintrc.cjs create mode 100644 libraries/android-bin/.eslintrc.cjs create mode 100644 libraries/android-bin/.npmignore create mode 100644 libraries/android-bin/tsconfig.build.json create mode 100644 libraries/b-tree/.eslintrc.cjs create mode 100644 libraries/dataview-bigint-polyfill/.eslintrc.cjs create mode 100644 libraries/dataview-bigint-polyfill/tsconfig.build.json create mode 100644 libraries/event/.eslintrc.cjs create mode 100644 libraries/scrcpy-decoder-tinyh264/.eslintrc.cjs create mode 100644 libraries/scrcpy-decoder-tinyh264/.npmignore create mode 100644 libraries/scrcpy-decoder-webcodecs/.eslintrc.cjs create mode 100644 libraries/scrcpy-decoder-webcodecs/.npmignore create mode 100644 libraries/scrcpy/.eslintrc.cjs create mode 100644 libraries/stream-extra/.eslintrc.cjs delete mode 100644 libraries/stream-extra/src/native.ts create mode 100644 libraries/struct/.eslintrc.cjs create mode 100644 toolchain/eslint-config/index.js create mode 100644 toolchain/eslint-config/package.json delete mode 100644 toolchain/ts-package-builder/.gitignore delete mode 100644 toolchain/ts-package-builder/README.md delete mode 100644 toolchain/ts-package-builder/jsconfig.json delete mode 100644 toolchain/ts-package-builder/package.json delete mode 100755 toolchain/ts-package-builder/src/index.js create mode 100644 toolchain/tsconfig/package.json rename toolchain/{ts-package-builder => tsconfig}/tsconfig.base.json (90%) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 71493d6f..877e1bcb 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -33,3 +33,4 @@ jobs: - run: node common/scripts/install-run-rush.js install - run: node common/scripts/install-run-rush.js build --verbose + - run: node common/scripts/install-run-rush.js lint --verbose diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 38f17c31..1ba250e1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -29,3 +29,4 @@ jobs: - run: node common/scripts/install-run-rush.js install - run: node common/scripts/install-run-rush.js build --verbose + - run: node common/scripts/install-run-rush.js lint --verbose diff --git a/.vscode/settings.json b/.vscode/settings.json index e170cad6..eef649d8 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -52,6 +52,10 @@ "zstd" ], "editor.tabSize": 4, + "editor.codeActionsOnSave": { + "source.organizeImports": true, + "source.fixAll": true, + }, "jest.rootPath": "packages/struct", "jest.showCoverageOnLoad": true, "markdown.extension.toc.levels": "2..6", @@ -70,5 +74,11 @@ ], "typescript.preferences.quoteStyle": "single", "typescript.format.semicolons": "insert", - "editor.formatOnSave": true + "editor.formatOnSave": true, + "eslint.workingDirectories": [ + "libraries/*", + ], + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + } } diff --git a/apps/book/package.json b/apps/book/package.json index ccfe804d..3fade3b5 100644 --- a/apps/book/package.json +++ b/apps/book/package.json @@ -17,7 +17,7 @@ "dependencies": { "@docusaurus/core": "^2.2.0", "@docusaurus/preset-classic": "^2.2.0", - "@mdx-js/react": "^2.1.5", + "@mdx-js/react": "^2.2.1", "@svgr/webpack": "^6.5.1", "clsx": "^1.1.1", "file-loader": "^6.2.0", diff --git a/apps/demo/package.json b/apps/demo/package.json index d9313eb6..17f218a0 100644 --- a/apps/demo/package.json +++ b/apps/demo/package.json @@ -10,12 +10,12 @@ "lint": "next lint" }, "dependencies": { - "@fluentui/react": "^8.101.1", - "@fluentui/react-file-type-icons": "^8.8.2", + "@fluentui/react": "^8.103.10", + "@fluentui/react-file-type-icons": "^8.8.4", "@fluentui/react-hooks": "^8.6.14", - "@fluentui/react-icons": "^2.0.187", - "@fluentui/style-utilities": "^8.8.3", - "@griffel/react": "^1.4.2", + "@fluentui/react-icons": "^2.0.190", + "@fluentui/style-utilities": "^8.8.4", + "@griffel/react": "^1.5.2", "@yume-chan/adb": "workspace:^0.0.17", "@yume-chan/adb-backend-direct-sockets": "workspace:^0.0.9", "@yume-chan/adb-backend-webusb": "workspace:^0.0.17", @@ -33,21 +33,21 @@ "@yume-chan/struct": "workspace:^0.0.17", "mobx": "^6.7.0", "mobx-react-lite": "^3.4.0", - "next": "13.0.3", + "next": "13.0.7", "react": "^18.2.0", "react-dom": "^18.2.0", - "xterm": "^5.0.0", + "xterm": "^5.1.0", "xterm-addon-fit": "^0.6.0", "xterm-addon-search": "^0.10.0", - "xterm-addon-webgl": "^0.13.0" + "xterm-addon-webgl": "^0.14.0" }, "devDependencies": { - "@mdx-js/loader": "^2.1.5", - "@next/mdx": "^13.0.3", - "@types/react": "18.0.25", - "eslint": "8.27.0", - "eslint-config-next": "13.0.3", + "@mdx-js/loader": "^2.2.1", + "@next/mdx": "^13.0.7", + "@types/react": "18.0.26", + "eslint": "^8.30.0", + "eslint-config-next": "13.0.7", "source-map-loader": "^4.0.1", - "typescript": "^4.8.4" + "typescript": "^4.9.4" } } diff --git a/common/config/rush/command-line.json b/common/config/rush/command-line.json index f37f33ff..cb7aae9a 100644 --- a/common/config/rush/command-line.json +++ b/common/config/rush/command-line.json @@ -169,9 +169,10 @@ "commandKind": "bulk", "name": "build", "summary": "Builds all projects", + "ignoreMissingScript": true, + "allowWarningsInSuccessfulBuild": true, "enableParallelism": true, - "incremental": true, - "allowWarningsInSuccessfulBuild": true + "incremental": true }, { "commandKind": "bulk", @@ -182,6 +183,16 @@ "enableParallelism": true, "incremental": true }, + { + "commandKind": "bulk", + "name": "lint", + "summary": "Run ESLint in each projects", + "ignoreMissingScript": true, + "allowWarningsInSuccessfulBuild": true, + "enableParallelism": true, + "incremental": true, + "safeForSimultaneousRushProcesses": true + }, { "commandKind": "bulk", "name": "build:watch", diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 0b920bfa..ce46113a 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -9,7 +9,7 @@ importers: specifiers: '@docusaurus/core': ^2.2.0 '@docusaurus/preset-classic': ^2.2.0 - '@mdx-js/react': ^2.1.5 + '@mdx-js/react': ^2.2.1 '@svgr/webpack': ^6.5.1 clsx: ^1.1.1 file-loader: ^6.2.0 @@ -23,7 +23,7 @@ importers: dependencies: '@docusaurus/core': 2.2.0_biqbaboplfbrettd7655fr4n2y '@docusaurus/preset-classic': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@mdx-js/react': 2.1.5_react@18.2.0 + '@mdx-js/react': 2.2.1_react@18.2.0 '@svgr/webpack': 6.5.1 clsx: 1.2.1 file-loader: 6.2.0 @@ -38,15 +38,15 @@ importers: ../../apps/demo: specifiers: - '@fluentui/react': ^8.101.1 - '@fluentui/react-file-type-icons': ^8.8.2 + '@fluentui/react': ^8.103.10 + '@fluentui/react-file-type-icons': ^8.8.4 '@fluentui/react-hooks': ^8.6.14 - '@fluentui/react-icons': ^2.0.187 - '@fluentui/style-utilities': ^8.8.3 - '@griffel/react': ^1.4.2 - '@mdx-js/loader': ^2.1.5 - '@next/mdx': ^13.0.3 - '@types/react': 18.0.25 + '@fluentui/react-icons': ^2.0.190 + '@fluentui/style-utilities': ^8.8.4 + '@griffel/react': ^1.5.2 + '@mdx-js/loader': ^2.2.1 + '@next/mdx': ^13.0.7 + '@types/react': 18.0.26 '@yume-chan/adb': workspace:^0.0.17 '@yume-chan/adb-backend-direct-sockets': workspace:^0.0.9 '@yume-chan/adb-backend-webusb': workspace:^0.0.17 @@ -62,26 +62,26 @@ importers: '@yume-chan/stream-extra': workspace:^0.0.17 '@yume-chan/stream-saver': ^2.0.6 '@yume-chan/struct': workspace:^0.0.17 - eslint: 8.27.0 - eslint-config-next: 13.0.3 + eslint: ^8.30.0 + eslint-config-next: 13.0.7 mobx: ^6.7.0 mobx-react-lite: ^3.4.0 - next: 13.0.3 + next: 13.0.7 react: ^18.2.0 react-dom: ^18.2.0 source-map-loader: ^4.0.1 - typescript: ^4.8.4 - xterm: ^5.0.0 + typescript: ^4.9.4 + xterm: ^5.1.0 xterm-addon-fit: ^0.6.0 xterm-addon-search: ^0.10.0 - xterm-addon-webgl: ^0.13.0 - dependencies: - '@fluentui/react': 8.101.1_2zx2umvpluuhvlq44va5bta2da - '@fluentui/react-file-type-icons': 8.8.2_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/react-hooks': 8.6.14_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/react-icons': 2.0.187_it3lvsvbvb6ccu3ygofv6sq6xa - '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia - '@griffel/react': 1.4.2_react@18.2.0 + xterm-addon-webgl: ^0.14.0 + dependencies: + '@fluentui/react': 8.103.10_ib3m5ricvtkl2cll7qpr2f6lvq + '@fluentui/react-file-type-icons': 8.8.4_kzbn2opkn2327fwg5yzwzya5o4 + '@fluentui/react-hooks': 8.6.14_kzbn2opkn2327fwg5yzwzya5o4 + '@fluentui/react-icons': 2.0.190_react@18.2.0 + '@fluentui/style-utilities': 8.8.4_kzbn2opkn2327fwg5yzwzya5o4 + '@griffel/react': 1.5.2_react@18.2.0 '@yume-chan/adb': link:../../libraries/adb '@yume-chan/adb-backend-direct-sockets': link:../../libraries/adb-backend-direct-sockets '@yume-chan/adb-backend-webusb': link:../../libraries/adb-backend-webusb @@ -99,37 +99,39 @@ importers: '@yume-chan/struct': link:../../libraries/struct mobx: 6.7.0 mobx-react-lite: 3.4.0_jofyzmwkboewm6mjrhi25mngky - next: 13.0.3_biqbaboplfbrettd7655fr4n2y + next: 13.0.7_biqbaboplfbrettd7655fr4n2y react: 18.2.0 react-dom: 18.2.0_react@18.2.0 - xterm: 5.0.0 - xterm-addon-fit: 0.6.0_xterm@5.0.0 - xterm-addon-search: 0.10.0_xterm@5.0.0 - xterm-addon-webgl: 0.13.0_xterm@5.0.0 + xterm: 5.1.0 + xterm-addon-fit: 0.6.0_xterm@5.1.0 + xterm-addon-search: 0.10.0_xterm@5.1.0 + xterm-addon-webgl: 0.14.0_xterm@5.1.0 devDependencies: - '@mdx-js/loader': 2.1.5 - '@next/mdx': 13.0.3_@mdx-js+loader@2.1.5 - '@types/react': 18.0.25 - eslint: 8.27.0 - eslint-config-next: 13.0.3_rmayb2veg2btbq6mbmnyivgasy + '@mdx-js/loader': 2.2.1 + '@next/mdx': 13.0.7_@mdx-js+loader@2.2.1 + '@types/react': 18.0.26 + eslint: 8.30.0 + eslint-config-next: 13.0.7_lzzuuodtsqwxnvqeq4g4likcqa source-map-loader: 4.0.1 - typescript: 4.8.4 + typescript: 4.9.4 ../../libraries/adb: specifiers: '@jest/globals': ^29.3.1 - '@types/node': ^18.11.9 + '@types/node': ^18.11.17 '@yume-chan/async': ^2.2.0 '@yume-chan/dataview-bigint-polyfill': workspace:^0.0.17 + '@yume-chan/eslint-config': workspace:^1.0.0 '@yume-chan/event': workspace:^0.0.17 '@yume-chan/stream-extra': workspace:^0.0.17 '@yume-chan/struct': workspace:^0.0.17 - '@yume-chan/ts-package-builder': workspace:^1.0.0 + '@yume-chan/tsconfig': workspace:^1.0.0 cross-env: ^7.0.3 + eslint: ^8.30.0 jest: ^29.3.1 ts-jest: ^29.0.3 tslib: ^2.4.1 - typescript: ^4.8.4 + typescript: ^4.9.4 dependencies: '@yume-chan/async': 2.2.0 '@yume-chan/dataview-bigint-polyfill': link:../dataview-bigint-polyfill @@ -139,38 +141,46 @@ importers: tslib: 2.4.1 devDependencies: '@jest/globals': 29.3.1 - '@types/node': 18.11.9 - '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder + '@types/node': 18.11.17 + '@yume-chan/eslint-config': link:../../toolchain/eslint-config + '@yume-chan/tsconfig': link:../../toolchain/tsconfig cross-env: 7.0.3 - jest: 29.3.1_@types+node@18.11.9 - ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se - typescript: 4.8.4 + eslint: 8.30.0 + jest: 29.3.1_@types+node@18.11.17 + ts-jest: 29.0.3_p6ekqnroyms5nhqbfxosryz7rm + typescript: 4.9.4 ../../libraries/adb-backend-direct-sockets: specifiers: '@yume-chan/adb': workspace:^0.0.17 + '@yume-chan/eslint-config': workspace:^1.0.0 '@yume-chan/stream-extra': workspace:^0.0.17 - '@yume-chan/ts-package-builder': workspace:^1.0.0 + '@yume-chan/tsconfig': workspace:^1.0.0 + eslint: ^8.30.0 tslib: ^2.4.1 - typescript: ^4.8.4 + typescript: ^4.9.4 dependencies: '@yume-chan/adb': link:../adb '@yume-chan/stream-extra': link:../stream-extra tslib: 2.4.1 devDependencies: - '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder - typescript: 4.8.4 + '@yume-chan/eslint-config': link:../../toolchain/eslint-config + '@yume-chan/tsconfig': link:../../toolchain/tsconfig + eslint: 8.30.0 + typescript: 4.9.4 ../../libraries/adb-backend-webusb: specifiers: '@types/w3c-web-usb': ^1.0.6 '@yume-chan/adb': workspace:^0.0.17 + '@yume-chan/eslint-config': workspace:^1.0.0 '@yume-chan/stream-extra': workspace:^0.0.17 '@yume-chan/struct': workspace:^0.0.17 - '@yume-chan/ts-package-builder': workspace:^1.0.0 + '@yume-chan/tsconfig': workspace:^1.0.0 + eslint: ^8.30.0 jest: ^29.3.1 tslib: ^2.4.1 - typescript: ^4.8.4 + typescript: ^4.9.4 dependencies: '@types/w3c-web-usb': 1.0.6 '@yume-chan/adb': link:../adb @@ -178,125 +188,153 @@ importers: '@yume-chan/struct': link:../struct tslib: 2.4.1 devDependencies: - '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder + '@yume-chan/eslint-config': link:../../toolchain/eslint-config + '@yume-chan/tsconfig': link:../../toolchain/tsconfig + eslint: 8.30.0 jest: 29.3.1 - typescript: 4.8.4 + typescript: 4.9.4 ../../libraries/adb-backend-ws: specifiers: '@yume-chan/adb': workspace:^0.0.17 + '@yume-chan/eslint-config': workspace:^1.0.0 '@yume-chan/stream-extra': workspace:^0.0.17 - '@yume-chan/ts-package-builder': workspace:^1.0.0 + '@yume-chan/tsconfig': workspace:^1.0.0 + eslint: ^8.30.0 jest: ^29.3.1 tslib: ^2.4.1 - typescript: ^4.8.4 + typescript: ^4.9.4 dependencies: '@yume-chan/adb': link:../adb '@yume-chan/stream-extra': link:../stream-extra tslib: 2.4.1 devDependencies: - '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder + '@yume-chan/eslint-config': link:../../toolchain/eslint-config + '@yume-chan/tsconfig': link:../../toolchain/tsconfig + eslint: 8.30.0 jest: 29.3.1 - typescript: 4.8.4 + typescript: 4.9.4 ../../libraries/adb-credential-web: specifiers: '@yume-chan/adb': workspace:^0.0.17 - '@yume-chan/ts-package-builder': workspace:^1.0.0 + '@yume-chan/eslint-config': workspace:^1.0.0 + '@yume-chan/tsconfig': workspace:^1.0.0 + eslint: ^8.30.0 tslib: ^2.4.1 - typescript: ^4.8.4 + typescript: ^4.9.4 dependencies: '@yume-chan/adb': link:../adb tslib: 2.4.1 devDependencies: - '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder - typescript: 4.8.4 + '@yume-chan/eslint-config': link:../../toolchain/eslint-config + '@yume-chan/tsconfig': link:../../toolchain/tsconfig + eslint: 8.30.0 + typescript: 4.9.4 ../../libraries/android-bin: specifiers: '@yume-chan/adb': workspace:^0.0.17 + '@yume-chan/eslint-config': workspace:^1.0.0 '@yume-chan/stream-extra': workspace:^0.0.17 '@yume-chan/struct': workspace:^0.0.17 - '@yume-chan/ts-package-builder': workspace:^1.0.0 + '@yume-chan/tsconfig': workspace:^1.0.0 + eslint: ^8.30.0 tslib: ^2.4.1 - typescript: ^4.8.4 + typescript: ^4.9.4 dependencies: '@yume-chan/adb': link:../adb '@yume-chan/stream-extra': link:../stream-extra '@yume-chan/struct': link:../struct tslib: 2.4.1 devDependencies: - '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder - typescript: 4.8.4 + '@yume-chan/eslint-config': link:../../toolchain/eslint-config + '@yume-chan/tsconfig': link:../../toolchain/tsconfig + eslint: 8.30.0 + typescript: 4.9.4 ../../libraries/b-tree: specifiers: '@jest/globals': ^29.3.1 - '@yume-chan/ts-package-builder': workspace:^1.0.0 + '@yume-chan/eslint-config': workspace:^1.0.0 + '@yume-chan/tsconfig': workspace:^1.0.0 cross-env: ^7.0.3 + eslint: ^8.30.0 jest: ^29.3.1 ts-jest: ^29.0.3 tslib: ^2.4.1 - typescript: ^4.8.4 + typescript: ^4.9.4 dependencies: tslib: 2.4.1 devDependencies: '@jest/globals': 29.3.1 - '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder + '@yume-chan/eslint-config': link:../../toolchain/eslint-config + '@yume-chan/tsconfig': link:../../toolchain/tsconfig cross-env: 7.0.3 + eslint: 8.30.0 jest: 29.3.1 - ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se - typescript: 4.8.4 + ts-jest: 29.0.3_p6ekqnroyms5nhqbfxosryz7rm + typescript: 4.9.4 ../../libraries/dataview-bigint-polyfill: specifiers: - '@yume-chan/ts-package-builder': workspace:^1.0.0 + '@yume-chan/eslint-config': workspace:^1.0.0 + '@yume-chan/tsconfig': workspace:^1.0.0 + eslint: ^8.30.0 jest: ^29.3.1 tslib: ^2.4.1 - typescript: ^4.8.4 + typescript: ^4.9.4 dependencies: tslib: 2.4.1 devDependencies: - '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder + '@yume-chan/eslint-config': link:../../toolchain/eslint-config + '@yume-chan/tsconfig': link:../../toolchain/tsconfig + eslint: 8.30.0 jest: 29.3.1 - typescript: 4.8.4 + typescript: 4.9.4 ../../libraries/event: specifiers: '@jest/globals': ^29.3.1 '@yume-chan/async': ^2.2.0 - '@yume-chan/ts-package-builder': workspace:^1.0.0 + '@yume-chan/eslint-config': workspace:^1.0.0 + '@yume-chan/tsconfig': workspace:^1.0.0 cross-env: ^7.0.3 + eslint: ^8.30.0 jest: ^29.3.1 ts-jest: ^29.0.3 tslib: ^2.4.1 - typescript: ^4.8.4 + typescript: ^4.9.4 dependencies: '@yume-chan/async': 2.2.0 tslib: 2.4.1 devDependencies: '@jest/globals': 29.3.1 - '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder + '@yume-chan/eslint-config': link:../../toolchain/eslint-config + '@yume-chan/tsconfig': link:../../toolchain/tsconfig cross-env: 7.0.3 + eslint: 8.30.0 jest: 29.3.1 - ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se - typescript: 4.8.4 + ts-jest: 29.0.3_p6ekqnroyms5nhqbfxosryz7rm + typescript: 4.9.4 ../../libraries/scrcpy: specifiers: '@jest/globals': ^29.3.1 '@yume-chan/adb': workspace:^0.0.17 '@yume-chan/async': ^2.2.0 + '@yume-chan/eslint-config': workspace:^1.0.0 '@yume-chan/event': workspace:^0.0.17 '@yume-chan/stream-extra': workspace:^0.0.17 '@yume-chan/struct': workspace:^0.0.17 - '@yume-chan/ts-package-builder': workspace:^1.0.0 + '@yume-chan/tsconfig': workspace:^1.0.0 cross-env: ^7.0.3 + eslint: ^8.30.0 gh-release-fetch: ^3.0.2 jest: ^29.3.1 ts-jest: ^29.0.3 tslib: ^2.4.1 - typescript: ^4.8.4 + typescript: ^4.9.4 dependencies: '@yume-chan/async': 2.2.0 '@yume-chan/event': link:../event @@ -306,27 +344,31 @@ importers: devDependencies: '@jest/globals': 29.3.1 '@yume-chan/adb': link:../adb - '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder + '@yume-chan/eslint-config': link:../../toolchain/eslint-config + '@yume-chan/tsconfig': link:../../toolchain/tsconfig cross-env: 7.0.3 + eslint: 8.30.0 gh-release-fetch: 3.0.2 jest: 29.3.1 - ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se - typescript: 4.8.4 + ts-jest: 29.0.3_p6ekqnroyms5nhqbfxosryz7rm + typescript: 4.9.4 ../../libraries/scrcpy-decoder-tinyh264: specifiers: '@jest/globals': ^29.3.1 '@yume-chan/async': ^2.2.0 + '@yume-chan/eslint-config': workspace:^1.0.0 '@yume-chan/event': workspace:^0.0.17 '@yume-chan/scrcpy': workspace:^0.0.17 '@yume-chan/stream-extra': workspace:^0.0.17 - '@yume-chan/ts-package-builder': workspace:^1.0.0 + '@yume-chan/tsconfig': workspace:^1.0.0 cross-env: ^7.0.3 + eslint: ^8.30.0 jest: ^29.3.1 tinyh264: ^0.0.7 ts-jest: ^29.0.3 tslib: ^2.4.1 - typescript: ^4.8.4 + typescript: ^4.9.4 yuv-buffer: ^1.0.0 yuv-canvas: ^1.2.11 dependencies: @@ -340,24 +382,28 @@ importers: yuv-canvas: 1.2.11 devDependencies: '@jest/globals': 29.3.1 - '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder + '@yume-chan/eslint-config': link:../../toolchain/eslint-config + '@yume-chan/tsconfig': link:../../toolchain/tsconfig cross-env: 7.0.3 + eslint: 8.30.0 jest: 29.3.1 - ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se - typescript: 4.8.4 + ts-jest: 29.0.3_p6ekqnroyms5nhqbfxosryz7rm + typescript: 4.9.4 ../../libraries/scrcpy-decoder-webcodecs: specifiers: '@jest/globals': ^29.3.1 '@types/dom-webcodecs': ^0.1.5 + '@yume-chan/eslint-config': workspace:^1.0.0 '@yume-chan/scrcpy': workspace:^0.0.17 '@yume-chan/stream-extra': workspace:^0.0.17 - '@yume-chan/ts-package-builder': workspace:^1.0.0 + '@yume-chan/tsconfig': workspace:^1.0.0 cross-env: ^7.0.3 + eslint: ^8.30.0 jest: ^29.3.1 ts-jest: ^29.0.3 tslib: ^2.4.1 - typescript: ^4.8.4 + typescript: ^4.9.4 dependencies: '@types/dom-webcodecs': 0.1.5 '@yume-chan/scrcpy': link:../scrcpy @@ -365,23 +411,27 @@ importers: tslib: 2.4.1 devDependencies: '@jest/globals': 29.3.1 - '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder + '@yume-chan/eslint-config': link:../../toolchain/eslint-config + '@yume-chan/tsconfig': link:../../toolchain/tsconfig cross-env: 7.0.3 + eslint: 8.30.0 jest: 29.3.1 - ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se - typescript: 4.8.4 + ts-jest: 29.0.3_p6ekqnroyms5nhqbfxosryz7rm + typescript: 4.9.4 ../../libraries/stream-extra: specifiers: '@jest/globals': ^29.3.1 '@yume-chan/async': ^2.2.0 + '@yume-chan/eslint-config': workspace:^1.0.0 '@yume-chan/struct': workspace:^0.0.17 - '@yume-chan/ts-package-builder': workspace:^1.0.0 + '@yume-chan/tsconfig': workspace:^1.0.0 cross-env: ^7.0.3 + eslint: ^8.30.0 jest: ^29.3.1 ts-jest: ^29.0.3 tslib: ^2.4.1 - typescript: ^4.8.4 + typescript: ^4.9.4 web-streams-polyfill: ^4.0.0-beta.3 dependencies: '@yume-chan/async': 2.2.0 @@ -390,41 +440,57 @@ importers: web-streams-polyfill: 4.0.0-beta.3 devDependencies: '@jest/globals': 29.3.1 - '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder + '@yume-chan/eslint-config': link:../../toolchain/eslint-config + '@yume-chan/tsconfig': link:../../toolchain/tsconfig cross-env: 7.0.3 + eslint: 8.30.0 jest: 29.3.1 - ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se - typescript: 4.8.4 + ts-jest: 29.0.3_p6ekqnroyms5nhqbfxosryz7rm + typescript: 4.9.4 ../../libraries/struct: specifiers: '@jest/globals': ^29.3.1 '@yume-chan/dataview-bigint-polyfill': workspace:^0.0.17 - '@yume-chan/ts-package-builder': workspace:^1.0.0 + '@yume-chan/eslint-config': workspace:^1.0.0 + '@yume-chan/tsconfig': workspace:^1.0.0 cross-env: ^7.0.3 + eslint: ^8.30.0 jest: ^29.3.1 ts-jest: ^29.0.3 tslib: ^2.4.1 - typescript: ^4.8.4 + typescript: ^4.9.4 dependencies: '@yume-chan/dataview-bigint-polyfill': link:../dataview-bigint-polyfill tslib: 2.4.1 devDependencies: '@jest/globals': 29.3.1 - '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder + '@yume-chan/eslint-config': link:../../toolchain/eslint-config + '@yume-chan/tsconfig': link:../../toolchain/tsconfig cross-env: 7.0.3 + eslint: 8.30.0 jest: 29.3.1 - ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se - typescript: 4.8.4 + ts-jest: 29.0.3_p6ekqnroyms5nhqbfxosryz7rm + typescript: 4.9.4 - ../../toolchain/ts-package-builder: + ../../toolchain/eslint-config: specifiers: - '@types/node': ^18.11.9 - json5: ^2.2.0 - dependencies: - json5: 2.2.1 - devDependencies: - '@types/node': 18.11.9 + '@rushstack/eslint-patch': ^1.2.0 + '@typescript-eslint/eslint-plugin': ^5.47.0 + '@typescript-eslint/parser': ^5.47.0 + '@yume-chan/eslint-plugin-import': ^2.26.0 + eslint: ^8.30.0 + typescript: ^4.9.4 + dependencies: + '@rushstack/eslint-patch': 1.2.0 + '@typescript-eslint/eslint-plugin': 5.47.0_ncmi6noazr3nzas7jxykisekym + '@typescript-eslint/parser': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa + '@yume-chan/eslint-plugin-import': 2.26.0_eslint@8.30.0 + eslint: 8.30.0 + typescript: 4.9.4 + + ../../toolchain/tsconfig: + specifiers: {} packages: @@ -579,7 +645,7 @@ packages: convert-source-map: 1.8.0 debug: 4.3.4 gensync: 1.0.0-beta.2 - json5: 2.2.1 + json5: 2.2.2 lodash: 4.17.21 resolve: 1.22.1 semver: 5.7.1 @@ -605,7 +671,7 @@ packages: convert-source-map: 1.8.0 debug: 4.3.4 gensync: 1.0.0-beta.2 - json5: 2.2.1 + json5: 2.2.2 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -628,7 +694,7 @@ packages: convert-source-map: 1.8.0 debug: 4.3.4 gensync: 1.0.0-beta.2 - json5: 2.2.1 + json5: 2.2.2 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -3365,7 +3431,7 @@ packages: '@docusaurus/react-loadable': 5.5.2_react@18.2.0 '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y '@types/history': 4.7.11 - '@types/react': 18.0.25 + '@types/react': 18.0.26 '@types/react-router-config': 5.0.6 '@types/react-router-dom': 5.3.3 react: 18.2.0 @@ -3664,7 +3730,7 @@ packages: peerDependencies: react: '*' dependencies: - '@types/react': 18.0.25 + '@types/react': 18.0.26 prop-types: 15.8.1 react: 18.2.0 dev: false @@ -3733,7 +3799,7 @@ packages: '@docusaurus/plugin-content-pages': 2.2.0_biqbaboplfbrettd7655fr4n2y '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 '@types/history': 4.7.11 - '@types/react': 18.0.25 + '@types/react': 18.0.26 '@types/react-router-config': 5.0.6 clsx: 1.2.1 parse-numeric-range: 1.3.0 @@ -3818,7 +3884,7 @@ packages: react-dom: ^16.8.4 || ^17.0.0 dependencies: '@types/history': 4.7.11 - '@types/react': 18.0.25 + '@types/react': 18.0.26 commander: 5.1.0 joi: 17.6.0 react: 18.2.0 @@ -3964,14 +4030,14 @@ packages: resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} dev: false - /@eslint/eslintrc/1.3.3: - resolution: {integrity: sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==} + /@eslint/eslintrc/1.4.0: + resolution: {integrity: sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 espree: 9.4.1 - globals: 13.16.0 + globals: 13.19.0 ignore: 5.2.0 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -3979,7 +4045,6 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true /@fluentui/date-time-utilities/8.5.3: resolution: {integrity: sha512-jwbwcJlnerdjENIAfn/YHxl5H2sQruReOMWXWMgmvX0CmcbqsN9VBxBt+E35Tlr4Ds3MbGs60eyfZUIPpaB5RQ==} @@ -3995,29 +4060,29 @@ packages: tslib: 2.4.1 dev: false - /@fluentui/font-icons-mdl2/8.5.4_fan5qbzahqtxlm5dzefqlqx5ia: - resolution: {integrity: sha512-sIf1ND1Qr1Y1A/XAYG3vCAVnjNljXZxrwenv36VGBqjG/xwJ0Lu5bNAUqjmPy6biKiMttz73zcL2ST3QNlYvhw==} + /@fluentui/font-icons-mdl2/8.5.5_kzbn2opkn2327fwg5yzwzya5o4: + resolution: {integrity: sha512-mCyQNGT2axvU2M7+dc0HmwQa9vzE33HXxcz32nZJugliy4lA3H2gIrkEt3xfY80DnzCUWz2Wd9RmComGFrei0g==} dependencies: '@fluentui/set-version': 8.2.3 - '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/style-utilities': 8.8.4_kzbn2opkn2327fwg5yzwzya5o4 + '@fluentui/utilities': 8.13.4_kzbn2opkn2327fwg5yzwzya5o4 tslib: 2.4.1 transitivePeerDependencies: - '@types/react' - react dev: false - /@fluentui/foundation-legacy/8.2.24_fan5qbzahqtxlm5dzefqlqx5ia: - resolution: {integrity: sha512-ccGbQmXW2qXSl/xtFVuAkCFH5TJMJX4+qoQ/CwAq+43ZCJaMQaz0KHmk3t3u+TXUWLCc8EGSEgYAIxMPzHI53A==} + /@fluentui/foundation-legacy/8.2.25_kzbn2opkn2327fwg5yzwzya5o4: + resolution: {integrity: sha512-yK14cYaviKs7UW8GFB5rR1+2GtLOMzZ71pPw8Od5ilOTYD6VgUTTRZZfUjAidFCJ1+XsocNnzUQXX73q4tSC3Q==} peerDependencies: '@types/react': '>=16.8.0 <19.0.0' react: '>=16.8.0 <19.0.0' dependencies: '@fluentui/merge-styles': 8.5.4 '@fluentui/set-version': 8.2.3 - '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia - '@types/react': 18.0.25 + '@fluentui/style-utilities': 8.8.4_kzbn2opkn2327fwg5yzwzya5o4 + '@fluentui/utilities': 8.13.4_kzbn2opkn2327fwg5yzwzya5o4 + '@types/react': 18.0.26 react: 18.2.0 tslib: 2.4.1 dev: false @@ -4035,21 +4100,21 @@ packages: tslib: 2.4.1 dev: false - /@fluentui/react-file-type-icons/8.8.2_fan5qbzahqtxlm5dzefqlqx5ia: - resolution: {integrity: sha512-FYJq8vR8DgZot//oUgV3x9TOFT1y/180kUAMXqo8EH106ijk2M4hXdg6Q1o9gM1Zy66Od951gr9u84r0+JucFA==} + /@fluentui/react-file-type-icons/8.8.4_kzbn2opkn2327fwg5yzwzya5o4: + resolution: {integrity: sha512-2dGugzqK1W7Lb8nJJ6xtuxx85bqEAx5oJ2OUohfZbBVIVr7KUDWnZvbEsaeHvsDA6gbNH1YHGGdnhWb2zFvjbg==} peerDependencies: '@types/react': '>=16.8.0 <19.0.0' react: '>=16.8.0 <19.0.0' dependencies: '@fluentui/set-version': 8.2.3 - '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia - '@types/react': 18.0.25 + '@fluentui/style-utilities': 8.8.4_kzbn2opkn2327fwg5yzwzya5o4 + '@types/react': 18.0.26 react: 18.2.0 tslib: 2.4.1 dev: false - /@fluentui/react-focus/8.8.10_fan5qbzahqtxlm5dzefqlqx5ia: - resolution: {integrity: sha512-CB1/VXRCvy6qLFLY8dCxOF8PPYxM2vayTRSNva4/uDqg60jlMSsdZiPJE1PnC9FQKUKXgMZp78kak/ckGc8VZQ==} + /@fluentui/react-focus/8.8.11_kzbn2opkn2327fwg5yzwzya5o4: + resolution: {integrity: sha512-RJlytqrdhVC6HqtUKk/SGqOx8IW5S6SxxUbutsto7LZT72wFMBf8VsrxvkfweVrWT2jQp+VkH/c0CHJzzZtztQ==} peerDependencies: '@types/react': '>=16.8.0 <19.0.0' react: '>=16.8.0 <19.0.0' @@ -4057,63 +4122,62 @@ packages: '@fluentui/keyboard-key': 0.4.3 '@fluentui/merge-styles': 8.5.4 '@fluentui/set-version': 8.2.3 - '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia - '@types/react': 18.0.25 + '@fluentui/style-utilities': 8.8.4_kzbn2opkn2327fwg5yzwzya5o4 + '@fluentui/utilities': 8.13.4_kzbn2opkn2327fwg5yzwzya5o4 + '@types/react': 18.0.26 react: 18.2.0 tslib: 2.4.1 dev: false - /@fluentui/react-hooks/8.6.14_fan5qbzahqtxlm5dzefqlqx5ia: + /@fluentui/react-hooks/8.6.14_kzbn2opkn2327fwg5yzwzya5o4: resolution: {integrity: sha512-mM2bW7xIRGGx7thBXKDR64SaZB1tYwICdM9qpM/Jfiu0H+VPQhhhtMPJ+ImmG+DM8MxX9n5Su8ePo2QWtz9mYA==} peerDependencies: '@types/react': '>=16.8.0 <19.0.0' react: '>=16.8.0 <19.0.0' dependencies: - '@fluentui/react-window-provider': 2.2.4_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/react-window-provider': 2.2.4_kzbn2opkn2327fwg5yzwzya5o4 '@fluentui/set-version': 8.2.3 - '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia - '@types/react': 18.0.25 + '@fluentui/utilities': 8.13.4_kzbn2opkn2327fwg5yzwzya5o4 + '@types/react': 18.0.26 react: 18.2.0 tslib: 2.4.1 dev: false - /@fluentui/react-icons/2.0.187_it3lvsvbvb6ccu3ygofv6sq6xa: - resolution: {integrity: sha512-KYEEzqzYIMFOkIzYw/pT1FIp0TvSquw7HpYCPn+YX5B3iTrVySfLL0aKBIK/Q7gWexBLVgH8zErUDsZ6r5fGLg==} + /@fluentui/react-icons/2.0.190_react@18.2.0: + resolution: {integrity: sha512-K3z069RT8V8R12U9RRf2rcfLn2dax7YY4O+5nqgmdQN1gBo8o5ZMD5C89woZqIuD+T/sEvhijJ4D5ujFj+n41A==} peerDependencies: - '@griffel/react': ^1.0.0 - react: '>=16.8.0 <18.0.0' + react: '>=16.8.0 <19.0.0' dependencies: - '@griffel/react': 1.4.2_react@18.2.0 + '@griffel/react': 1.5.2_react@18.2.0 react: 18.2.0 tslib: 2.4.1 dev: false - /@fluentui/react-portal-compat-context/9.0.4_fan5qbzahqtxlm5dzefqlqx5ia: + /@fluentui/react-portal-compat-context/9.0.4_kzbn2opkn2327fwg5yzwzya5o4: resolution: {integrity: sha512-qw2lmkxZ2TmgC0pB2dvFyrzVffxBdpCx1BdWRaF+MRGUlTxRtqfybSx3Edsqa6NMewc3J0ThLMFdVFBQ5Yafqw==} peerDependencies: '@types/react': '>=16.8.0 <19.0.0' react: '>=16.8.0 <19.0.0' dependencies: - '@types/react': 18.0.25 + '@types/react': 18.0.26 react: 18.2.0 tslib: 2.4.1 dev: false - /@fluentui/react-window-provider/2.2.4_fan5qbzahqtxlm5dzefqlqx5ia: + /@fluentui/react-window-provider/2.2.4_kzbn2opkn2327fwg5yzwzya5o4: resolution: {integrity: sha512-tCiIGQSILSipcn8DwwRgYq5IMtwBKiSQ+/cVRNq54cJZoq5ie/kMGFpldZ+vREDbM8wjmO3eNgNi63A3QRx39g==} peerDependencies: '@types/react': '>=16.8.0 <19.0.0' react: '>=16.8.0 <19.0.0' dependencies: '@fluentui/set-version': 8.2.3 - '@types/react': 18.0.25 + '@types/react': 18.0.26 react: 18.2.0 tslib: 2.4.1 dev: false - /@fluentui/react/8.101.1_2zx2umvpluuhvlq44va5bta2da: - resolution: {integrity: sha512-9qqxgIzxQe6srEkHO04aYlI41Cz+9nq1QqmC5/QzYzafDkfKlPJ13rZJSO6Hm8mBEIeimMSHew09yvunkS3j1w==} + /@fluentui/react/8.103.10_ib3m5ricvtkl2cll7qpr2f6lvq: + resolution: {integrity: sha512-ivAn05e6JleJsihR46ne8IMRStOM5GUM+XZMoGx1SynXhKvcuR/h2mGl6tXIM+9xoNXhjr5hf9Yx68kCPDWAGw==} peerDependencies: '@types/react': '>=16.8.0 <19.0.0' '@types/react-dom': '>=16.8.0 <19.0.0' @@ -4121,19 +4185,19 @@ packages: react-dom: '>=16.8.0 <19.0.0' dependencies: '@fluentui/date-time-utilities': 8.5.3 - '@fluentui/font-icons-mdl2': 8.5.4_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/foundation-legacy': 8.2.24_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/font-icons-mdl2': 8.5.5_kzbn2opkn2327fwg5yzwzya5o4 + '@fluentui/foundation-legacy': 8.2.25_kzbn2opkn2327fwg5yzwzya5o4 '@fluentui/merge-styles': 8.5.4 - '@fluentui/react-focus': 8.8.10_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/react-hooks': 8.6.14_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/react-portal-compat-context': 9.0.4_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/react-window-provider': 2.2.4_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/react-focus': 8.8.11_kzbn2opkn2327fwg5yzwzya5o4 + '@fluentui/react-hooks': 8.6.14_kzbn2opkn2327fwg5yzwzya5o4 + '@fluentui/react-portal-compat-context': 9.0.4_kzbn2opkn2327fwg5yzwzya5o4 + '@fluentui/react-window-provider': 2.2.4_kzbn2opkn2327fwg5yzwzya5o4 '@fluentui/set-version': 8.2.3 - '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/theme': 2.6.19_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/style-utilities': 8.8.4_kzbn2opkn2327fwg5yzwzya5o4 + '@fluentui/theme': 2.6.20_kzbn2opkn2327fwg5yzwzya5o4 + '@fluentui/utilities': 8.13.4_kzbn2opkn2327fwg5yzwzya5o4 '@microsoft/load-themed-styles': 1.10.281 - '@types/react': 18.0.25 + '@types/react': 18.0.26 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 tslib: 2.4.1 @@ -4145,13 +4209,13 @@ packages: tslib: 2.4.1 dev: false - /@fluentui/style-utilities/8.8.3_fan5qbzahqtxlm5dzefqlqx5ia: - resolution: {integrity: sha512-DxcCIHnKdaBpzdIawZIMcVyn8xVbK6A37J0Q7MPdjb9VV4Nsp/ohWnM9nPrPlbB+RSsKWrIssgWJdn5yZM9Wxg==} + /@fluentui/style-utilities/8.8.4_kzbn2opkn2327fwg5yzwzya5o4: + resolution: {integrity: sha512-Zu7ddNd9p3rQbeHijCWfMzjCt6aWqpr02HNj8qRa8egGuzb5zmVoOXHiuYcJIbHpMvK+TNCbRK1HjUKkHHCusw==} dependencies: '@fluentui/merge-styles': 8.5.4 '@fluentui/set-version': 8.2.3 - '@fluentui/theme': 2.6.19_fan5qbzahqtxlm5dzefqlqx5ia - '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia + '@fluentui/theme': 2.6.20_kzbn2opkn2327fwg5yzwzya5o4 + '@fluentui/utilities': 8.13.4_kzbn2opkn2327fwg5yzwzya5o4 '@microsoft/load-themed-styles': 1.10.281 tslib: 2.4.1 transitivePeerDependencies: @@ -4159,21 +4223,21 @@ packages: - react dev: false - /@fluentui/theme/2.6.19_fan5qbzahqtxlm5dzefqlqx5ia: - resolution: {integrity: sha512-Pk4STq3WAM3Mq4fGCBrq3F43o1u2SitO7CZ6A3/ALreaxTA1LC4bbyKQTYH3tvxapqEOYaEPYZ3dFjWjqYlFfg==} + /@fluentui/theme/2.6.20_kzbn2opkn2327fwg5yzwzya5o4: + resolution: {integrity: sha512-nJbKBx676hqV7e0RWDSavleIZ0ixrIP2/lOcD651PItLogpe1IexlH6LbMIhNI56BfKmDttE+MYEzELK7ORr/w==} peerDependencies: '@types/react': '>=16.8.0 <19.0.0' react: '>=16.8.0 <19.0.0' dependencies: '@fluentui/merge-styles': 8.5.4 '@fluentui/set-version': 8.2.3 - '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia - '@types/react': 18.0.25 + '@fluentui/utilities': 8.13.4_kzbn2opkn2327fwg5yzwzya5o4 + '@types/react': 18.0.26 react: 18.2.0 tslib: 2.4.1 dev: false - /@fluentui/utilities/8.13.4_fan5qbzahqtxlm5dzefqlqx5ia: + /@fluentui/utilities/8.13.4_kzbn2opkn2327fwg5yzwzya5o4: resolution: {integrity: sha512-oJ6q8BvVdr0eEG5RgI/VBtKX2JvJV2h0AUkR7FwZoT8fvUUH/iykPZO/5CAVcQDyiXj73hmBibiEGkWNFFuPfw==} peerDependencies: '@types/react': '>=16.8.0 <19.0.0' @@ -4182,13 +4246,13 @@ packages: '@fluentui/dom-utilities': 2.2.3 '@fluentui/merge-styles': 8.5.4 '@fluentui/set-version': 8.2.3 - '@types/react': 18.0.25 + '@types/react': 18.0.26 react: 18.2.0 tslib: 2.4.1 dev: false - /@griffel/core/1.8.1: - resolution: {integrity: sha512-Zig4h+o2f8v7tV13yQCmRaEKp6Psdi+NZEPQOmM7DJNmAHYQgcHJcLqJH7SOGWr+QOh3ZXVpQ2EP3JDKz479GQ==} + /@griffel/core/1.9.0: + resolution: {integrity: sha512-fiPf/mfcO6B96n4qgRFwA6TBEkPu8x2nWCHEGPnB+RrSttbiwzgsxuy+ojsf6QVeeS+i9qQegRbK2rIow+238Q==} dependencies: '@emotion/hash': 0.8.0 csstype: 3.1.0 @@ -4197,12 +4261,12 @@ packages: tslib: 2.4.1 dev: false - /@griffel/react/1.4.2_react@18.2.0: - resolution: {integrity: sha512-VM047UxJFiq/OX5YkRPVuGB9NdU/TxVX9nrBRncXuxzVRRmvf+1OmHlcXWaFuXVj0JOjiMBzm4jH34lqPRGS+Q==} + /@griffel/react/1.5.2_react@18.2.0: + resolution: {integrity: sha512-y27CVUYIFuJue18AiSnaocfhXvbkjDvH5oafJY+3zdcY7hx17oaGQZ2qdKegRkZJlyKcMU//J/1HJ4SrIDrXRA==} peerDependencies: react: '>=16.8.0 <19.0.0' dependencies: - '@griffel/core': 1.8.1 + '@griffel/core': 1.9.0 react: 18.2.0 tslib: 2.4.1 dev: false @@ -4217,8 +4281,8 @@ packages: '@hapi/hoek': 9.3.0 dev: false - /@humanwhocodes/config-array/0.11.7: - resolution: {integrity: sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==} + /@humanwhocodes/config-array/0.11.8: + resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 @@ -4226,16 +4290,13 @@ packages: minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true /@humanwhocodes/module-importer/1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - dev: true /@humanwhocodes/object-schema/1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - dev: true /@istanbuljs/load-nyc-config/1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} @@ -4258,7 +4319,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.17 chalk: 4.1.2 jest-message-util: 29.3.1 jest-util: 29.3.1 @@ -4279,14 +4340,14 @@ packages: '@jest/test-result': 29.3.1 '@jest/transform': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.17 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.3.2 exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 29.2.0 - jest-config: 29.3.1_@types+node@18.11.9 + jest-config: 29.3.1_@types+node@18.11.17 jest-haste-map: 29.3.1 jest-message-util: 29.3.1 jest-regex-util: 29.2.0 @@ -4313,7 +4374,7 @@ packages: dependencies: '@jest/fake-timers': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.17 jest-mock: 29.3.1 dev: true @@ -4340,7 +4401,7 @@ packages: dependencies: '@jest/types': 29.3.1 '@sinonjs/fake-timers': 9.1.2 - '@types/node': 18.11.9 + '@types/node': 18.11.17 jest-message-util: 29.3.1 jest-mock: 29.3.1 jest-util: 29.3.1 @@ -4373,7 +4434,7 @@ packages: '@jest/transform': 29.3.1 '@jest/types': 29.3.1 '@jridgewell/trace-mapping': 0.3.17 - '@types/node': 18.11.9 + '@types/node': 18.11.17 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -4461,7 +4522,7 @@ packages: '@jest/schemas': 29.0.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.11.9 + '@types/node': 18.11.17 '@types/yargs': 17.0.10 chalk: 4.1.2 dev: true @@ -4516,8 +4577,8 @@ packages: resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} dev: false - /@mdx-js/loader/2.1.5: - resolution: {integrity: sha512-oXjfTa/iAcMmW8DdQ+hQFodPCLqw5VKT2yoZkLwrZfPVVpUgKrI+5/ZePYq328xxtAUStZmR3ed0PWJrwd5Pkg==} + /@mdx-js/loader/2.2.1: + resolution: {integrity: sha512-J4E8A5H+xtk4otZiEZ5AXl61Tj04Avm5MqLQazITdI3+puVXVnTTuZUKM1oNHTtfDIfOl0uMt+o/Ij+x6Fvf+g==} peerDependencies: webpack: '>=4' dependencies: @@ -4585,13 +4646,13 @@ packages: react: 18.2.0 dev: false - /@mdx-js/react/2.1.5_react@18.2.0: - resolution: {integrity: sha512-3Az1I6SAWA9R38rYjz5rXBrGKeZhq96CSSyQtqY+maPj8stBsoUH5pNcmIixuGkufYsh8F5+ka2CVPo2fycWZw==} + /@mdx-js/react/2.2.1_react@18.2.0: + resolution: {integrity: sha512-YdXcMcEnqZhzql98RNrqYo9cEhTTesBiCclEtoiQUbJwx87q9453GTapYU6kJ8ZZ2ek1Vp25SiAXEFy5O/eAPw==} peerDependencies: react: '>=16' dependencies: '@types/mdx': 2.0.2 - '@types/react': 18.0.25 + '@types/react': 18.0.26 react: 18.2.0 dev: false @@ -4603,28 +4664,28 @@ packages: resolution: {integrity: sha512-91uZ4u6p5ZClHQE2RpJKTZALeCl1G9cZB47SPivfPrRtjrhqCfS3gC3zNoikUhpwccWjfSN50zjm289Wxkf/8Q==} dev: false - /@next/env/13.0.3: - resolution: {integrity: sha512-/4WzeG61Ot/PxsghXkSqQJ6UohFfwXoZ3dtsypmR9EBP+OIax9JRq0trq8Z/LCT9Aq4JbihVkaazRWguORjTAw==} + /@next/env/13.0.7: + resolution: {integrity: sha512-ZBclBRB7DbkSswXgbJ+muF5RxfgmAuQKAWL8tcm86aZmoiL1ZainxQK0hMcMYdh+IYG8UObAKV2wKB5O+6P4ng==} dev: false - /@next/eslint-plugin-next/13.0.3: - resolution: {integrity: sha512-slmTAHNKDyc7jhx4VF8lFbmOPWJ3PShtUUWpb6x9+ga59CyOxgP6AdcDhxfapnWYACKe/TwYiaveufu7LqXgZg==} + /@next/eslint-plugin-next/13.0.7: + resolution: {integrity: sha512-Q/Z0V3D3UpKhhzFU6/s17wD4rqJ+ZDGded8UpqNyzX1nUdD+/PnsZexPhSIZ2Yf/c8QESeirmJVRb3eAfCQkRQ==} dependencies: glob: 7.1.7 dev: true - /@next/mdx/13.0.3_@mdx-js+loader@2.1.5: - resolution: {integrity: sha512-0NWKlwQdKsG/KdpTceC17zGlGP7deRAc2/JXpsOcy0744QWd3ai1Eg5g6YsR25giiW6EJVQr0ynfFzTLXdzg9Q==} + /@next/mdx/13.0.7_@mdx-js+loader@2.2.1: + resolution: {integrity: sha512-ekuxCOO7j/Un7qxIYtuBAQN+bduDAtYDEMEf0OqBQ3ZDWJpQYrJ1kGr0uk1WjW5Z1OH7hV8ZlGwuBvhfjaao8Q==} peerDependencies: '@mdx-js/loader': '>=0.15.0' '@mdx-js/react': '*' dependencies: - '@mdx-js/loader': 2.1.5 + '@mdx-js/loader': 2.2.1 source-map: 0.7.4 dev: true - /@next/swc-android-arm-eabi/13.0.3: - resolution: {integrity: sha512-uxfUoj65CdFc1gX2q7GtBX3DhKv9Kn343LMqGNvXyuTpYTGMmIiVY7b9yF8oLWRV0gVKqhZBZifUmoPE8SJU6Q==} + /@next/swc-android-arm-eabi/13.0.7: + resolution: {integrity: sha512-QTEamOK/LCwBf05GZ261rULMbZEpE3TYdjHlXfznV+nXwTztzkBNFXwP67gv2wW44BROzgi/vrR9H8oP+J5jxg==} engines: {node: '>= 10'} cpu: [arm] os: [android] @@ -4632,8 +4693,8 @@ packages: dev: false optional: true - /@next/swc-android-arm64/13.0.3: - resolution: {integrity: sha512-t2k+WDfg7Cq2z/EnalKGsd/9E5F4Hdo1xu+UzZXYDpKUI9zgE6Bz8ajQb8m8txv3qOaWdKuDa5j5ziq9Acd1Xw==} + /@next/swc-android-arm64/13.0.7: + resolution: {integrity: sha512-wcy2H0Tl9ME8vKy2GnJZ7Mybwys+43F/Eh2Pvph7mSDpMbYBJ6iA0zeY62iYYXxlZhnAID3+h79FUqUEakkClw==} engines: {node: '>= 10'} cpu: [arm64] os: [android] @@ -4641,8 +4702,8 @@ packages: dev: false optional: true - /@next/swc-darwin-arm64/13.0.3: - resolution: {integrity: sha512-wV6j6SZ1bc/YHOLCLk9JVqaZTCCey6HBV7inl2DriHsHqIcO6F3+QiYf0KXwRP9BE0GSZZrYd5mZQm2JPTHdJA==} + /@next/swc-darwin-arm64/13.0.7: + resolution: {integrity: sha512-F/mU7csN1/J2cqXJPMgTQ6MwAbc1pJ6sp6W+X0z5JEY4IFDzxKd3wRc3pCiNF7j8xW381JlNpWxhjCctnNmfaw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -4650,8 +4711,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64/13.0.3: - resolution: {integrity: sha512-jaI2CMuYWvUtRixV3AIjUhnxUDU1FKOR+8hADMhYt3Yz+pCKuj4RZ0n0nY5qUf3qT1AtvnJXEgyatSFJhSp/wQ==} + /@next/swc-darwin-x64/13.0.7: + resolution: {integrity: sha512-636AuRQynCPnIPRVzcCk5B7OMq9XjaYam2T0HeWUCE6y7EqEO3kxiuZ4QmN81T7A6Ydb+JnivYrLelHXmgdj6A==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -4659,8 +4720,8 @@ packages: dev: false optional: true - /@next/swc-freebsd-x64/13.0.3: - resolution: {integrity: sha512-nbyT0toBTJrcj5TCB9pVnQpGJ3utGyQj4CWegZs1ulaeUQ5Z7CS/qt8nRyYyOKYHtOdSCJ9Nw5F/RgKNkdpOdw==} + /@next/swc-freebsd-x64/13.0.7: + resolution: {integrity: sha512-92XAMzNgQazowZ9t7uZmHRA5VdBl/SwEdrf5UybdfRovsxB4r3+yJWEvFaqYpSEp0gwndbwLokJdpz7OwFdL3Q==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] @@ -4668,8 +4729,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm-gnueabihf/13.0.3: - resolution: {integrity: sha512-1naLxYvRUQCoFCU1nMkcQueRc0Iux9xBv1L5pzH2ejtIWFg8BrSgyuluJG4nyAhFCx4WG863IEIkAaefOowVdA==} + /@next/swc-linux-arm-gnueabihf/13.0.7: + resolution: {integrity: sha512-3r1CWl5P6I5n5Yxip8EXv/Rfu2Cp6wVmIOpvmczyUR82j+bcMkwPAcUjNkG/vMCagS4xV7NElrcdGb39iFmfLg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] @@ -4677,8 +4738,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu/13.0.3: - resolution: {integrity: sha512-3Z4A8JkuGWpMVbUhUPQInK/SLY+kijTT78Q/NZCrhLlyvwrVxaQALJNlXzxDLraUgv4oVH0Wz/FIw1W9PUUhxA==} + /@next/swc-linux-arm64-gnu/13.0.7: + resolution: {integrity: sha512-RXo8tt6ppiwyS6hpDw3JdAjKcdVewsefxnxk9xOH4mRhMyq9V2lQx0e24X/dRiZqkx3jnWReR2WRrUlgN1UkSQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -4686,8 +4747,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl/13.0.3: - resolution: {integrity: sha512-MoYe9SM40UaunTjC+01c9OILLH3uSoeri58kDMu3KF/EFEvn1LZ6ODeDj+SLGlAc95wn46hrRJS2BPmDDE+jFQ==} + /@next/swc-linux-arm64-musl/13.0.7: + resolution: {integrity: sha512-RWpnW+bmfXyxyY7iARbueYDGuIF+BEp3etLeYh/RUNHb9PhOHLDgJOG8haGSykud3a6CcyBI8hEjqOhoObaDpw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -4695,8 +4756,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu/13.0.3: - resolution: {integrity: sha512-z22T5WGnRanjLMXdF0NaNjSpBlEzzY43t5Ysp3nW1oI6gOkub6WdQNZeHIY7A2JwkgSWZmtjLtf+Fzzz38LHeQ==} + /@next/swc-linux-x64-gnu/13.0.7: + resolution: {integrity: sha512-/ygUIiMMTYnbKlFs5Ba9J5k/tNxFWy8eI1bBF8UuMTvV8QJHl/aLDiA5dwsei2kk99/cu3eay62JnJXkSk3RSQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -4704,8 +4765,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl/13.0.3: - resolution: {integrity: sha512-ZOMT7zjBFmkusAtr47k8xs/oTLsNlTH6xvYb+iux7yly2hZGwhfBLzPGBsbeMZukZ96IphJTagT+C033s6LNVA==} + /@next/swc-linux-x64-musl/13.0.7: + resolution: {integrity: sha512-dLzr6AL77USJN0ejgx5AS8O8SbFlbYTzs0XwAWag4oQpUG2p3ARvxwQgYQ0Z+6EP0zIRZ/XfLkN/mhsyi3m4PA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -4713,8 +4774,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc/13.0.3: - resolution: {integrity: sha512-Q4BM16Djl+Oah9UdGrvjFYgoftYB2jNd+rtRGPX5Mmxo09Ry/KiLbOZnoUyoIxKc1xPyfqMXuaVsAFQLYs0KEQ==} + /@next/swc-win32-arm64-msvc/13.0.7: + resolution: {integrity: sha512-+vFIVa82AwqFkpFClKT+n73fGxrhAZ2u1u3mDYEBdxO6c9U4Pj3S5tZFsGFK9kLT/bFvf/eeVOICSLCC7MSgJQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -4722,8 +4783,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc/13.0.3: - resolution: {integrity: sha512-Sa8yGkNeRUsic8Qjf7MLIAfP0p0+einK/wIqJ8UO1y76j+8rRQu42AMs5H4Ax1fm9GEYq6I8njHtY59TVpTtGQ==} + /@next/swc-win32-ia32-msvc/13.0.7: + resolution: {integrity: sha512-RNLXIhp+assD39dQY9oHhDxw+/qSJRARKhOFsHfOtf8yEfCHqcKkn3X/L+ih60ntaEqK294y1WkMk6ylotsxwA==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -4731,8 +4792,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc/13.0.3: - resolution: {integrity: sha512-IAptmSqA7k4tQzaw2NAkoEjj3+Dz9ceuvlEHwYh770MMDL4V0ku2m+UHrmn5HUCEDHhgwwjg2nyf6728q2jr1w==} + /@next/swc-win32-x64-msvc/13.0.7: + resolution: {integrity: sha512-kvdnlLcrnEq72ZP0lqe2Z5NqvB9N5uSCvtXJ0PhKvNncWWd0fEG9Ec9erXgwCmVlM2ytw41k9/uuQ+SVw4Pihw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -4758,13 +4819,24 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.13.0 + /@pkgr/utils/2.3.1: + resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + is-glob: 4.0.3 + open: 8.4.0 + picocolors: 1.0.0 + tiny-glob: 0.2.9 + tslib: 2.4.1 + dev: true + /@polka/url/1.0.0-next.21: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} dev: false - /@rushstack/eslint-patch/1.1.4: - resolution: {integrity: sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA==} - dev: true + /@rushstack/eslint-patch/1.2.0: + resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} /@sideway/address/4.1.4: resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} @@ -4968,8 +5040,8 @@ packages: - supports-color dev: false - /@swc/helpers/0.4.11: - resolution: {integrity: sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==} + /@swc/helpers/0.4.14: + resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} dependencies: tslib: 2.4.1 dev: false @@ -5025,26 +5097,26 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.11.9 + '@types/node': 18.11.17 dev: false /@types/bonjour/3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.17 dev: false /@types/connect-history-api-fallback/1.3.5: resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} dependencies: '@types/express-serve-static-core': 4.17.29 - '@types/node': 18.11.9 + '@types/node': 18.11.17 dev: false /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.17 dev: false /@types/debug/4.1.7: @@ -5056,7 +5128,7 @@ packages: /@types/decompress/4.2.4: resolution: {integrity: sha512-/C8kTMRTNiNuWGl5nEyKbPiMv6HA+0RbEXzFhFBEzASM6+oa4tJro9b8nj7eRlOFfuLdzUU+DS/GPDlvvzMOhA==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.17 dev: true /@types/dom-webcodecs/0.1.5: @@ -5068,7 +5140,7 @@ packages: dependencies: '@types/decompress': 4.2.4 '@types/got': 8.3.6 - '@types/node': 18.11.9 + '@types/node': 18.11.17 dev: true /@types/eslint-scope/3.7.4: @@ -5100,7 +5172,7 @@ packages: /@types/express-serve-static-core/4.17.29: resolution: {integrity: sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.17 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: false @@ -5117,13 +5189,13 @@ packages: /@types/got/8.3.6: resolution: {integrity: sha512-nvLlj+831dhdm4LR2Ly+HTpdLyBaMynoOr6wpIxS19d/bPeHQxFU5XQ6Gp6ohBpxvCWZM1uHQIC2+ySRH1rGrQ==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.17 dev: true /@types/graceful-fs/4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.17 dev: true /@types/hast/2.3.4: @@ -5142,7 +5214,7 @@ packages: /@types/http-proxy/1.17.9: resolution: {integrity: sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.17 dev: false /@types/istanbul-lib-coverage/2.0.4: @@ -5167,7 +5239,6 @@ packages: /@types/json5/0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} @@ -5197,15 +5268,15 @@ packages: /@types/node-fetch/2.6.2: resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.17 form-data: 3.0.1 dev: true /@types/node/17.0.45: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - /@types/node/18.11.9: - resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==} + /@types/node/18.11.17: + resolution: {integrity: sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==} /@types/parse-json/4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} @@ -5234,7 +5305,7 @@ packages: resolution: {integrity: sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.0.25 + '@types/react': 18.0.26 '@types/react-router': 5.1.18 dev: false @@ -5242,7 +5313,7 @@ packages: resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.0.25 + '@types/react': 18.0.26 '@types/react-router': 5.1.18 dev: false @@ -5250,11 +5321,11 @@ packages: resolution: {integrity: sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.0.25 + '@types/react': 18.0.26 dev: false - /@types/react/18.0.25: - resolution: {integrity: sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==} + /@types/react/18.0.26: + resolution: {integrity: sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==} dependencies: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.2 @@ -5272,7 +5343,7 @@ packages: /@types/sax/1.2.4: resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.17 dev: false /@types/scheduler/0.16.2: @@ -5282,6 +5353,10 @@ packages: resolution: {integrity: sha512-zsv3fsC7S84NN6nPK06u79oWgrPVd0NvOyqgghV1haPaFcVxIrP4DLomRwGAXk0ui4HZA7mOcSFL98sMVW9viw==} dev: true + /@types/semver/7.3.13: + resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} + dev: false + /@types/serve-index/1.9.1: resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} dependencies: @@ -5292,13 +5367,13 @@ packages: resolution: {integrity: sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==} dependencies: '@types/mime': 1.3.2 - '@types/node': 18.11.9 + '@types/node': 18.11.17 dev: false /@types/sockjs/0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.17 dev: false /@types/stack-utils/2.0.1: @@ -5315,7 +5390,7 @@ packages: /@types/ws/8.5.3: resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.17 dev: false /@types/yargs-parser/21.0.0: @@ -5328,41 +5403,85 @@ packages: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/parser/5.42.1_rmayb2veg2btbq6mbmnyivgasy: - resolution: {integrity: sha512-kAV+NiNBWVQDY9gDJDToTE/NO8BHi4f6b7zTsVAJoTkmB/zlfOpiEVBzHOKtlgTndCKe8vj9F/PuolemZSh50Q==} + /@typescript-eslint/eslint-plugin/5.47.0_ncmi6noazr3nzas7jxykisekym: + resolution: {integrity: sha512-AHZtlXAMGkDmyLuLZsRpH3p4G/1iARIwc/T0vIem2YB+xW6pZaXYXzCBnZSF/5fdM97R9QqZWZ+h3iW10XgevQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: + '@typescript-eslint/parser': ^5.0.0 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.42.1 - '@typescript-eslint/types': 5.42.1 - '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4 + '@typescript-eslint/parser': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa + '@typescript-eslint/scope-manager': 5.47.0 + '@typescript-eslint/type-utils': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa + '@typescript-eslint/utils': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa debug: 4.3.4 - eslint: 8.27.0 - typescript: 4.8.4 + eslint: 8.30.0 + ignore: 5.2.0 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.3.7 + tsutils: 3.21.0_typescript@4.9.4 + typescript: 4.9.4 transitivePeerDependencies: - supports-color - dev: true + dev: false - /@typescript-eslint/scope-manager/5.42.1: - resolution: {integrity: sha512-QAZY/CBP1Emx4rzxurgqj3rUinfsh/6mvuKbLNMfJMMKYLRBfweus8brgXF8f64ABkIZ3zdj2/rYYtF8eiuksQ==} + /@typescript-eslint/parser/5.47.0_lzzuuodtsqwxnvqeq4g4likcqa: + resolution: {integrity: sha512-udPU4ckK+R1JWCGdQC4Qa27NtBg7w020ffHqGyAK8pAgOVuNw7YaKXGChk+udh+iiGIJf6/E/0xhVXyPAbsczw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: - '@typescript-eslint/types': 5.42.1 - '@typescript-eslint/visitor-keys': 5.42.1 - dev: true + '@typescript-eslint/scope-manager': 5.47.0 + '@typescript-eslint/types': 5.47.0 + '@typescript-eslint/typescript-estree': 5.47.0_typescript@4.9.4 + debug: 4.3.4 + eslint: 8.30.0 + typescript: 4.9.4 + transitivePeerDependencies: + - supports-color - /@typescript-eslint/types/5.42.1: - resolution: {integrity: sha512-Qrco9dsFF5lhalz+lLFtxs3ui1/YfC6NdXu+RAGBa8uSfn01cjO7ssCsjIsUs484vny9Xm699FSKwpkCcqwWwA==} + /@typescript-eslint/scope-manager/5.47.0: + resolution: {integrity: sha512-dvJab4bFf7JVvjPuh3sfBUWsiD73aiftKBpWSfi3sUkysDQ4W8x+ZcFpNp7Kgv0weldhpmMOZBjx1wKN8uWvAw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + dependencies: + '@typescript-eslint/types': 5.47.0 + '@typescript-eslint/visitor-keys': 5.47.0 + + /@typescript-eslint/type-utils/5.47.0_lzzuuodtsqwxnvqeq4g4likcqa: + resolution: {integrity: sha512-1J+DFFrYoDUXQE1b7QjrNGARZE6uVhBqIvdaXTe5IN+NmEyD68qXR1qX1g2u4voA+nCaelQyG8w30SAOihhEYg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.47.0_typescript@4.9.4 + '@typescript-eslint/utils': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa + debug: 4.3.4 + eslint: 8.30.0 + tsutils: 3.21.0_typescript@4.9.4 + typescript: 4.9.4 + transitivePeerDependencies: + - supports-color + dev: false - /@typescript-eslint/typescript-estree/5.42.1_typescript@4.8.4: - resolution: {integrity: sha512-qElc0bDOuO0B8wDhhW4mYVgi/LZL+igPwXtV87n69/kYC/7NG3MES0jHxJNCr4EP7kY1XVsRy8C/u3DYeTKQmw==} + /@typescript-eslint/types/5.47.0: + resolution: {integrity: sha512-eslFG0Qy8wpGzDdYKu58CEr3WLkjwC5Usa6XbuV89ce/yN5RITLe1O8e+WFEuxnfftHiJImkkOBADj58ahRxSg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /@typescript-eslint/typescript-estree/5.47.0_typescript@4.9.4: + resolution: {integrity: sha512-LxfKCG4bsRGq60Sqqu+34QT5qT2TEAHvSCCJ321uBWywgE2dS0LKcu5u+3sMGo+Vy9UmLOhdTw5JHzePV/1y4Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -5370,25 +5489,43 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.42.1 - '@typescript-eslint/visitor-keys': 5.42.1 + '@typescript-eslint/types': 5.47.0 + '@typescript-eslint/visitor-keys': 5.47.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.7 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 + tsutils: 3.21.0_typescript@4.9.4 + typescript: 4.9.4 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/visitor-keys/5.42.1: - resolution: {integrity: sha512-LOQtSF4z+hejmpUvitPlc4hA7ERGoj2BVkesOcG91HCn8edLGUXbTrErmutmPbl8Bo9HjAvOO/zBKQHExXNA2A==} + /@typescript-eslint/utils/5.47.0_lzzuuodtsqwxnvqeq4g4likcqa: + resolution: {integrity: sha512-U9xcc0N7xINrCdGVPwABjbAKqx4GK67xuMV87toI+HUqgXj26m6RBp9UshEXcTrgCkdGYFzgKLt8kxu49RilDw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/types': 5.42.1 + '@types/json-schema': 7.0.11 + '@types/semver': 7.3.13 + '@typescript-eslint/scope-manager': 5.47.0 + '@typescript-eslint/types': 5.47.0 + '@typescript-eslint/typescript-estree': 5.47.0_typescript@4.9.4 + eslint: 8.30.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.30.0 + semver: 7.3.7 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/visitor-keys/5.47.0: + resolution: {integrity: sha512-ByPi5iMa6QqDXe/GmT/hR6MZtVPi0SqMQPDx15FczCBXJo/7M8T88xReOALAfpBLm+zxpPfmhuEvPb577JRAEg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.47.0 eslint-visitor-keys: 3.3.0 - dev: true /@webassemblyjs/ast/1.11.1: resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} @@ -5510,6 +5647,28 @@ packages: tslib: 2.4.1 dev: false + /@yume-chan/eslint-plugin-import/2.26.0_eslint@8.30.0: + resolution: {integrity: sha512-mfuDL1+UCnrSfKTP17/jz2158SZXfu7qn1cZDVMV08NxPa0bA9WdNJQT+JML6Z9PQLLGBaheEcBxWi3XOYfuPQ==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + dependencies: + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + debug: 2.6.9 + doctrine: 2.1.0 + eslint: 8.30.0 + eslint-import-resolver-node: 0.3.6 + eslint-module-utils: 2.7.4_eslint@8.30.0 + has: 1.0.3 + is-core-module: 2.11.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.1 + tsconfig-paths: 3.14.1 + dev: false + /@yume-chan/stream-saver/2.0.6: resolution: {integrity: sha512-DzRADjLoHcz18ocgGHvLIanapxygX3o9dlWwE32EUZqhyAsopfdvZ79ttR9+7pqAXIQamP9M4mbDy8hHgFKOIA==} dev: false @@ -5534,21 +5693,12 @@ packages: acorn: 8.7.1 dev: false - /acorn-jsx/5.3.2_acorn@8.7.1: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.7.1 - dev: true - /acorn-jsx/5.3.2_acorn@8.8.1: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: acorn: 8.8.1 - dev: true /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} @@ -5559,12 +5709,12 @@ packages: resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==} engines: {node: '>=0.4.0'} hasBin: true + dev: false /acorn/8.8.1: resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /address/1.2.0: resolution: {integrity: sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==} @@ -5753,6 +5903,17 @@ packages: is-string: 1.0.7 dev: true + /array-includes/3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.5 + get-intrinsic: 1.1.3 + is-string: 1.0.7 + dev: false + /array-union/2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -5767,6 +5928,16 @@ packages: es-shim-unscopables: 1.0.0 dev: true + /array.prototype.flat/1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.5 + es-shim-unscopables: 1.0.0 + dev: false + /array.prototype.flatmap/1.3.0: resolution: {integrity: sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==} engines: {node: '>= 0.4'} @@ -6892,7 +7063,6 @@ packages: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} dependencies: ms: 2.1.3 - dev: true /debug/4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -6986,7 +7156,6 @@ packages: /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true /deepmerge/4.2.2: resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} @@ -7006,7 +7175,6 @@ packages: /define-lazy-prop/2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} - dev: false /define-properties/1.1.4: resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} @@ -7119,14 +7287,12 @@ packages: engines: {node: '>=0.10.0'} dependencies: esutils: 2.0.3 - dev: true /doctrine/3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 - dev: true /dom-converter/0.2.0: resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} @@ -7273,7 +7439,6 @@ packages: dependencies: graceful-fs: 4.2.10 tapable: 2.2.1 - dev: false /entities/2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -7316,7 +7481,37 @@ packages: string.prototype.trimend: 1.0.5 string.prototype.trimstart: 1.0.5 unbox-primitive: 1.0.2 - dev: true + + /es-abstract/1.20.5: + resolution: {integrity: sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.1.3 + get-symbol-description: 1.0.0 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-symbols: 1.0.3 + internal-slot: 1.0.3 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-weakref: 1.0.2 + object-inspect: 1.12.2 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 + safe-regex-test: 1.0.0 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + unbox-primitive: 1.0.2 + dev: false /es-module-lexer/0.9.3: resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} @@ -7326,7 +7521,6 @@ packages: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: has: 1.0.3 - dev: true /es-to-primitive/1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} @@ -7335,7 +7529,6 @@ packages: is-callable: 1.2.4 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: true /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -7363,8 +7556,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /eslint-config-next/13.0.3_rmayb2veg2btbq6mbmnyivgasy: - resolution: {integrity: sha512-i2JoQP8gGv303GjXTonA27fm1ckRRkRoAP1WYEQgN0D2DDoFeBPqlJgHlMHnXKWjmNct/sW8jQEvy9am2juc8g==} + /eslint-config-next/13.0.7_lzzuuodtsqwxnvqeq4g4likcqa: + resolution: {integrity: sha512-X7DB7iDJ9iHi5DAZbnFdWm4M0dwarj5h5y6Vpm9INCYzFgAwSWslq3v0qjYEjtUO5IQ8n1WK6IU5FkOQ2HBhOA==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: '>=3.3.1' @@ -7372,17 +7565,17 @@ packages: typescript: optional: true dependencies: - '@next/eslint-plugin-next': 13.0.3 - '@rushstack/eslint-patch': 1.1.4 - '@typescript-eslint/parser': 5.42.1_rmayb2veg2btbq6mbmnyivgasy - eslint: 8.27.0 + '@next/eslint-plugin-next': 13.0.7 + '@rushstack/eslint-patch': 1.2.0 + '@typescript-eslint/parser': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa + eslint: 8.30.0 eslint-import-resolver-node: 0.3.6 - eslint-import-resolver-typescript: 2.7.1_dcpv4nbdr5ks2h5677xdltrk6e - eslint-plugin-import: 2.26.0_eslint@8.27.0 - eslint-plugin-jsx-a11y: 6.6.0_eslint@8.27.0 - eslint-plugin-react: 7.31.10_eslint@8.27.0 - eslint-plugin-react-hooks: 4.6.0_eslint@8.27.0 - typescript: 4.8.4 + eslint-import-resolver-typescript: 3.5.2_2lbwmhbr7bncddqbzzpg77o75m + eslint-plugin-import: 2.26.0_eslint@8.30.0 + eslint-plugin-jsx-a11y: 6.6.0_eslint@8.30.0 + eslint-plugin-react: 7.31.10_eslint@8.30.0 + eslint-plugin-react-hooks: 4.6.0_eslint@8.30.0 + typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true @@ -7392,22 +7585,23 @@ packages: dependencies: debug: 3.2.7 resolve: 1.22.1 - dev: true - /eslint-import-resolver-typescript/2.7.1_dcpv4nbdr5ks2h5677xdltrk6e: - resolution: {integrity: sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==} - engines: {node: '>=4'} + /eslint-import-resolver-typescript/3.5.2_2lbwmhbr7bncddqbzzpg77o75m: + resolution: {integrity: sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' dependencies: debug: 4.3.4 - eslint: 8.27.0 - eslint-plugin-import: 2.26.0_eslint@8.27.0 - glob: 7.2.3 + enhanced-resolve: 5.10.0 + eslint: 8.30.0 + eslint-plugin-import: 2.26.0_eslint@8.30.0 + get-tsconfig: 4.2.0 + globby: 13.1.2 + is-core-module: 2.11.0 is-glob: 4.0.3 - resolve: 1.22.1 - tsconfig-paths: 3.14.1 + synckit: 0.8.4 transitivePeerDependencies: - supports-color dev: true @@ -7420,7 +7614,20 @@ packages: find-up: 2.1.0 dev: true - /eslint-plugin-import/2.26.0_eslint@8.27.0: + /eslint-module-utils/2.7.4_eslint@8.30.0: + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + engines: {node: '>=4'} + peerDependencies: + eslint: '*' + peerDependenciesMeta: + eslint: + optional: true + dependencies: + debug: 3.2.7 + eslint: 8.30.0 + dev: false + + /eslint-plugin-import/2.26.0_eslint@8.30.0: resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} engines: {node: '>=4'} peerDependencies: @@ -7430,11 +7637,11 @@ packages: array.prototype.flat: 1.3.0 debug: 2.6.9 doctrine: 2.1.0 - eslint: 8.27.0 + eslint: 8.30.0 eslint-import-resolver-node: 0.3.6 eslint-module-utils: 2.7.3 has: 1.0.3 - is-core-module: 2.9.0 + is-core-module: 2.11.0 is-glob: 4.0.3 minimatch: 3.1.2 object.values: 1.1.5 @@ -7442,7 +7649,7 @@ packages: tsconfig-paths: 3.14.1 dev: true - /eslint-plugin-jsx-a11y/6.6.0_eslint@8.27.0: + /eslint-plugin-jsx-a11y/6.6.0_eslint@8.30.0: resolution: {integrity: sha512-kTeLuIzpNhXL2CwLlc8AHI0aFRwWHcg483yepO9VQiHzM9bZwJdzTkzBszbuPrbgGmq2rlX/FaT2fJQsjUSHsw==} engines: {node: '>=4.0'} peerDependencies: @@ -7456,7 +7663,7 @@ packages: axobject-query: 2.2.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.27.0 + eslint: 8.30.0 has: 1.0.3 jsx-ast-utils: 3.3.2 language-tags: 1.0.5 @@ -7464,16 +7671,16 @@ packages: semver: 6.3.0 dev: true - /eslint-plugin-react-hooks/4.6.0_eslint@8.27.0: + /eslint-plugin-react-hooks/4.6.0_eslint@8.30.0: resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.27.0 + eslint: 8.30.0 dev: true - /eslint-plugin-react/7.31.10_eslint@8.27.0: + /eslint-plugin-react/7.31.10_eslint@8.30.0: resolution: {integrity: sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==} engines: {node: '>=4'} peerDependencies: @@ -7482,7 +7689,7 @@ packages: array-includes: 3.1.5 array.prototype.flatmap: 1.3.0 doctrine: 2.1.0 - eslint: 8.27.0 + eslint: 8.30.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.2 minimatch: 3.1.2 @@ -7510,35 +7717,31 @@ packages: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-utils/3.0.0_eslint@8.27.0: + /eslint-utils/3.0.0_eslint@8.30.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.27.0 + eslint: 8.30.0 eslint-visitor-keys: 2.1.0 - dev: true /eslint-visitor-keys/2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} - dev: true /eslint-visitor-keys/3.3.0: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /eslint/8.27.0: - resolution: {integrity: sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==} + /eslint/8.30.0: + resolution: {integrity: sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint/eslintrc': 1.3.3 - '@humanwhocodes/config-array': 0.11.7 + '@eslint/eslintrc': 1.4.0 + '@humanwhocodes/config-array': 0.11.8 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 @@ -7548,7 +7751,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.27.0 + eslint-utils: 3.0.0_eslint@8.30.0 eslint-visitor-keys: 3.3.0 espree: 9.4.1 esquery: 1.4.0 @@ -7557,7 +7760,7 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.16.0 + globals: 13.19.0 grapheme-splitter: 1.0.4 ignore: 5.2.0 import-fresh: 3.3.0 @@ -7578,7 +7781,6 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true /espree/9.4.1: resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} @@ -7587,7 +7789,6 @@ packages: acorn: 8.8.1 acorn-jsx: 5.3.2_acorn@8.8.1 eslint-visitor-keys: 3.3.0 - dev: true /esprima/4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} @@ -7599,7 +7800,6 @@ packages: engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 - dev: true /esrecurse/4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} @@ -7663,7 +7863,7 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.17 require-like: 0.1.2 dev: false @@ -7786,7 +7986,6 @@ packages: /fast-levenshtein/2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true /fast-url-parser/1.1.3: resolution: {integrity: sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=} @@ -7864,7 +8063,6 @@ packages: engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 - dev: true /file-loader/6.2.0: resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} @@ -7993,11 +8191,9 @@ packages: dependencies: flatted: 3.2.6 rimraf: 3.0.2 - dev: true /flatted/3.2.6: resolution: {integrity: sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==} - dev: true /flux/4.0.3_react@18.2.0: resolution: {integrity: sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==} @@ -8136,11 +8332,9 @@ packages: define-properties: 1.1.4 es-abstract: 1.20.1 functions-have-names: 1.2.3 - dev: true /functions-have-names/1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} @@ -8158,6 +8352,14 @@ packages: has: 1.0.3 has-symbols: 1.0.3 + /get-intrinsic/1.1.3: + resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + dev: false + /get-own-enumerable-property-symbols/3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} dev: false @@ -8203,6 +8405,9 @@ packages: dependencies: call-bind: 1.0.2 get-intrinsic: 1.1.2 + + /get-tsconfig/4.2.0: + resolution: {integrity: sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg==} dev: true /gh-release-fetch/3.0.2: @@ -8287,11 +8492,14 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - /globals/13.16.0: - resolution: {integrity: sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==} + /globals/13.19.0: + resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 + + /globalyzer/0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} dev: true /globby/11.1.0: @@ -8314,6 +8522,15 @@ packages: ignore: 5.2.0 merge2: 1.4.1 slash: 4.0.0 + + /globrex/0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /gopd/1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.1.3 dev: false /got/8.3.2: @@ -8365,7 +8582,6 @@ packages: /grapheme-splitter/1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true /gray-matter/4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} @@ -8390,7 +8606,6 @@ packages: /has-bigints/1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true /has-flag/3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -8424,7 +8639,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - dev: true /has-yarn/2.1.0: resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} @@ -8799,7 +9013,6 @@ packages: get-intrinsic: 1.1.2 has: 1.0.3 side-channel: 1.0.4 - dev: true /interpret/1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} @@ -8859,7 +9072,6 @@ packages: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 - dev: true /is-binary-path/2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} @@ -8874,7 +9086,6 @@ packages: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: true /is-buffer/2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} @@ -8883,7 +9094,11 @@ packages: /is-callable/1.2.4: resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} engines: {node: '>= 0.4'} - dev: true + + /is-callable/1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: false /is-ci/2.0.0: resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} @@ -8892,8 +9107,8 @@ packages: ci-info: 2.0.0 dev: false - /is-core-module/2.9.0: - resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + /is-core-module/2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} dependencies: has: 1.0.3 @@ -8902,7 +9117,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-decimal/1.0.4: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} @@ -8916,7 +9130,6 @@ packages: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true - dev: false /is-extendable/0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} @@ -8965,7 +9178,6 @@ packages: /is-negative-zero/2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} - dev: true /is-npm/5.0.0: resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==} @@ -8977,7 +9189,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-number/7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} @@ -9045,7 +9256,6 @@ packages: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: true /is-regexp/1.0.0: resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} @@ -9066,7 +9276,6 @@ packages: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: call-bind: 1.0.2 - dev: true /is-stream/1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} @@ -9082,14 +9291,12 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-symbol/1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - dev: true /is-typedarray/1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -9099,7 +9306,6 @@ packages: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 - dev: true /is-whitespace-character/1.0.4: resolution: {integrity: sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==} @@ -9114,7 +9320,6 @@ packages: engines: {node: '>=8'} dependencies: is-docker: 2.2.1 - dev: false /is-yarn-global/0.3.0: resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} @@ -9205,7 +9410,7 @@ packages: '@jest/expect': 29.3.1 '@jest/test-result': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.17 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -9252,7 +9457,7 @@ packages: - ts-node dev: true - /jest-cli/29.3.1_@types+node@18.11.9: + /jest-cli/29.3.1_@types+node@18.11.17: resolution: {integrity: sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -9269,7 +9474,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.10 import-local: 3.1.0 - jest-config: 29.3.1_@types+node@18.11.9 + jest-config: 29.3.1_@types+node@18.11.17 jest-util: 29.3.1 jest-validate: 29.3.1 prompts: 2.4.2 @@ -9318,7 +9523,7 @@ packages: - supports-color dev: true - /jest-config/29.3.1_@types+node@18.11.9: + /jest-config/29.3.1_@types+node@18.11.17: resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -9333,7 +9538,7 @@ packages: '@babel/core': 7.20.2 '@jest/test-sequencer': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.17 babel-jest: 29.3.1_@babel+core@7.20.2 chalk: 4.1.2 ci-info: 3.3.2 @@ -9392,7 +9597,7 @@ packages: '@jest/environment': 29.3.1 '@jest/fake-timers': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.17 jest-mock: 29.3.1 jest-util: 29.3.1 dev: true @@ -9408,7 +9613,7 @@ packages: dependencies: '@jest/types': 29.3.1 '@types/graceful-fs': 4.1.5 - '@types/node': 18.11.9 + '@types/node': 18.11.17 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.10 @@ -9459,7 +9664,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.17 jest-util: 29.3.1 dev: true @@ -9514,7 +9719,7 @@ packages: '@jest/test-result': 29.3.1 '@jest/transform': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.17 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.10 @@ -9545,7 +9750,7 @@ packages: '@jest/test-result': 29.3.1 '@jest/transform': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.17 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -9601,7 +9806,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.17 chalk: 4.1.2 ci-info: 3.3.2 graceful-fs: 4.2.10 @@ -9626,7 +9831,7 @@ packages: dependencies: '@jest/test-result': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.9 + '@types/node': 18.11.17 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -9638,7 +9843,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.17 merge-stream: 2.0.0 supports-color: 8.1.1 dev: false @@ -9647,7 +9852,7 @@ packages: resolution: {integrity: sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.11.9 + '@types/node': 18.11.17 jest-util: 29.3.1 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -9673,7 +9878,7 @@ packages: - ts-node dev: true - /jest/29.3.1_@types+node@18.11.9: + /jest/29.3.1_@types+node@18.11.17: resolution: {integrity: sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -9686,7 +9891,7 @@ packages: '@jest/core': 29.3.1 '@jest/types': 29.3.1 import-local: 3.1.0 - jest-cli: 29.3.1_@types+node@18.11.9 + jest-cli: 29.3.1_@types+node@18.11.17 transitivePeerDependencies: - '@types/node' - supports-color @@ -9705,7 +9910,6 @@ packages: /js-sdsl/4.1.5: resolution: {integrity: sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==} - dev: true /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -9748,17 +9952,15 @@ packages: /json-stable-stringify-without-jsonify/1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true /json5/1.0.1: resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} hasBin: true dependencies: minimist: 1.2.6 - dev: true - /json5/2.2.1: - resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} + /json5/2.2.2: + resolution: {integrity: sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==} engines: {node: '>=6'} hasBin: true @@ -9836,7 +10038,6 @@ packages: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true /lilconfig/2.0.6: resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} @@ -9857,7 +10058,7 @@ packages: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 - json5: 2.2.1 + json5: 2.2.2 dev: false /loader-utils/3.2.0: @@ -9910,7 +10111,6 @@ packages: /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true /lodash.uniq/4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} @@ -10237,8 +10437,8 @@ packages: /micromark-extension-mdxjs/1.0.0: resolution: {integrity: sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==} dependencies: - acorn: 8.7.1 - acorn-jsx: 5.3.2_acorn@8.7.1 + acorn: 8.8.1 + acorn-jsx: 5.3.2_acorn@8.8.1 micromark-extension-mdx-expression: 1.0.3 micromark-extension-mdx-jsx: 1.0.3 micromark-extension-mdx-md: 1.0.0 @@ -10571,9 +10771,12 @@ packages: hasBin: true dev: false + /natural-compare-lite/1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: false + /natural-compare/1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true /negotiator/0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} @@ -10584,8 +10787,8 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: false - /next/13.0.3_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-rFQeepcenRxKzeKlh1CsmEnxsJwhIERtbUjmYnKZyDInZsU06lvaGw5DT44rlNp1Rv2MT/e9vffZ8vK+ytwXHA==} + /next/13.0.7_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-YfTifqX9vfHm+rSU/H/3xvzOHDkYuMuh4wsvTjiqj9h7qHEF7KHB66X4qrH96Po+ohdid4JY8YVGPziDwdXL0A==} engines: {node: '>=14.6.0'} hasBin: true peerDependencies: @@ -10602,28 +10805,27 @@ packages: sass: optional: true dependencies: - '@next/env': 13.0.3 - '@swc/helpers': 0.4.11 + '@next/env': 13.0.7 + '@swc/helpers': 0.4.14 caniuse-lite: 1.0.30001431 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 styled-jsx: 5.1.0_react@18.2.0 - use-sync-external-store: 1.2.0_react@18.2.0 optionalDependencies: - '@next/swc-android-arm-eabi': 13.0.3 - '@next/swc-android-arm64': 13.0.3 - '@next/swc-darwin-arm64': 13.0.3 - '@next/swc-darwin-x64': 13.0.3 - '@next/swc-freebsd-x64': 13.0.3 - '@next/swc-linux-arm-gnueabihf': 13.0.3 - '@next/swc-linux-arm64-gnu': 13.0.3 - '@next/swc-linux-arm64-musl': 13.0.3 - '@next/swc-linux-x64-gnu': 13.0.3 - '@next/swc-linux-x64-musl': 13.0.3 - '@next/swc-win32-arm64-msvc': 13.0.3 - '@next/swc-win32-ia32-msvc': 13.0.3 - '@next/swc-win32-x64-msvc': 13.0.3 + '@next/swc-android-arm-eabi': 13.0.7 + '@next/swc-android-arm64': 13.0.7 + '@next/swc-darwin-arm64': 13.0.7 + '@next/swc-darwin-x64': 13.0.7 + '@next/swc-freebsd-x64': 13.0.7 + '@next/swc-linux-arm-gnueabihf': 13.0.7 + '@next/swc-linux-arm64-gnu': 13.0.7 + '@next/swc-linux-arm64-musl': 13.0.7 + '@next/swc-linux-x64-gnu': 13.0.7 + '@next/swc-linux-x64-musl': 13.0.7 + '@next/swc-win32-arm64-msvc': 13.0.7 + '@next/swc-win32-ia32-msvc': 13.0.7 + '@next/swc-win32-x64-msvc': 13.0.7 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -10743,6 +10945,16 @@ packages: has-symbols: 1.0.3 object-keys: 1.1.1 + /object.assign/4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: false + /object.entries/1.1.5: resolution: {integrity: sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==} engines: {node: '>= 0.4'} @@ -10777,6 +10989,15 @@ packages: es-abstract: 1.20.1 dev: true + /object.values/1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.5 + dev: false + /obuf/1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} dev: false @@ -10811,7 +11032,6 @@ packages: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - dev: false /opener/1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} @@ -10828,7 +11048,6 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 word-wrap: 1.2.3 - dev: true /p-cancelable/0.4.1: resolution: {integrity: sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==} @@ -11541,7 +11760,6 @@ packages: /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - dev: true /prepend-http/2.0.0: resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} @@ -11962,12 +12180,10 @@ packages: call-bind: 1.0.2 define-properties: 1.1.4 functions-have-names: 1.2.3 - dev: true /regexpp/3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} - dev: true /regexpu-core/5.1.0: resolution: {integrity: sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==} @@ -12155,7 +12371,7 @@ packages: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: - is-core-module: 2.9.0 + is-core-module: 2.11.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -12163,7 +12379,7 @@ packages: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} hasBin: true dependencies: - is-core-module: 2.9.0 + is-core-module: 2.11.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -12232,6 +12448,14 @@ packages: /safe-buffer/5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + /safe-regex-test/1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.3 + is-regex: 1.1.4 + dev: false + /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -12478,7 +12702,6 @@ packages: /slash/4.0.0: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} - dev: false /sockjs/0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} @@ -12673,7 +12896,14 @@ packages: call-bind: 1.0.2 define-properties: 1.1.4 es-abstract: 1.20.1 - dev: true + + /string.prototype.trimend/1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.5 + dev: false /string.prototype.trimstart/1.0.5: resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==} @@ -12681,7 +12911,14 @@ packages: call-bind: 1.0.2 define-properties: 1.1.4 es-abstract: 1.20.1 - dev: true + + /string.prototype.trimstart/1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.5 + dev: false /string_decoder/1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -12731,7 +12968,6 @@ packages: /strip-bom/3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - dev: true /strip-bom/4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} @@ -12841,6 +13077,14 @@ packages: stable: 0.1.8 dev: false + /synckit/0.8.4: + resolution: {integrity: sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.3.1 + tslib: 2.4.1 + dev: true + /tapable/1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} @@ -12849,7 +13093,6 @@ packages: /tapable/2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - dev: false /tar-stream/1.6.2: resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} @@ -12924,6 +13167,13 @@ packages: engines: {node: '>=0.10.0'} dev: true + /tiny-glob/0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + dependencies: + globalyzer: 0.1.0 + globrex: 0.1.2 + dev: true + /tiny-invariant/1.2.0: resolution: {integrity: sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==} dev: false @@ -12999,7 +13249,7 @@ packages: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: true - /ts-jest/29.0.3_r24ewcothphvclnu77pxb4u4se: + /ts-jest/29.0.3_p6ekqnroyms5nhqbfxosryz7rm: resolution: {integrity: sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -13022,13 +13272,13 @@ packages: dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.3.1_@types+node@18.11.9 + jest: 29.3.1_@types+node@18.11.17 jest-util: 29.3.1 - json5: 2.2.1 + json5: 2.2.2 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.3.7 - typescript: 4.8.4 + typescript: 4.9.4 yargs-parser: 21.0.1 dev: true @@ -13039,32 +13289,27 @@ packages: json5: 1.0.1 minimist: 1.2.6 strip-bom: 3.0.0 - dev: true /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true /tslib/2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} - dev: false - /tsutils/3.21.0_typescript@4.8.4: + /tsutils/3.21.0_typescript@4.9.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 4.8.4 - dev: true + typescript: 4.9.4 /type-check/0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 - dev: true /type-detect/4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} @@ -13099,11 +13344,10 @@ packages: is-typedarray: 1.0.0 dev: false - /typescript/4.8.4: - resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} + /typescript/4.9.4: + resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} engines: {node: '>=4.2.0'} hasBin: true - dev: true /ua-parser-js/0.7.31: resolution: {integrity: sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==} @@ -13116,7 +13360,6 @@ packages: has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: true /unbzip2-stream/1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} @@ -13429,14 +13672,6 @@ packages: use-isomorphic-layout-effect: 1.1.2_react@18.2.0 dev: false - /use-sync-external-store/1.2.0_react@18.2.0: - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.2.0 - dev: false - /util-deprecate/1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -13757,7 +13992,6 @@ packages: is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: true /which/1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} @@ -13794,7 +14028,6 @@ packages: /word-wrap/1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} - dev: true /wrap-ansi/7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -13875,32 +14108,32 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - /xterm-addon-fit/0.6.0_xterm@5.0.0: + /xterm-addon-fit/0.6.0_xterm@5.1.0: resolution: {integrity: sha512-9/7A+1KEjkFam0yxTaHfuk9LEvvTSBi0PZmEkzJqgafXPEXL9pCMAVV7rB09sX6ATRDXAdBpQhZkhKj7CGvYeg==} peerDependencies: xterm: ^5.0.0 dependencies: - xterm: 5.0.0 + xterm: 5.1.0 dev: false - /xterm-addon-search/0.10.0_xterm@5.0.0: + /xterm-addon-search/0.10.0_xterm@5.1.0: resolution: {integrity: sha512-l+kjDxNDQbkniU5OUo9BHknxUEPZGM0OFpVpc2sMmrb97S0FKJVJO4wAZPJvSGVJ8ZEG6KuDyzXluvnb08t71Q==} peerDependencies: xterm: ^5.0.0 dependencies: - xterm: 5.0.0 + xterm: 5.1.0 dev: false - /xterm-addon-webgl/0.13.0_xterm@5.0.0: - resolution: {integrity: sha512-xL4qBQWUHjFR620/8VHCtrTMVQsnZaAtd1IxFoiKPhC63wKp6b+73a45s97lb34yeo57PoqZhE9Jq5pB++ksPQ==} + /xterm-addon-webgl/0.14.0_xterm@5.1.0: + resolution: {integrity: sha512-zcxL4RVVjeS7NNFeKe5HHQI8OUEx3wZpE4EqLoTVipa2UrTR+qLsigo16UEp/yVcYBMhK7tsJ/AJokoEe/f0mw==} peerDependencies: xterm: ^5.0.0 dependencies: - xterm: 5.0.0 + xterm: 5.1.0 dev: false - /xterm/5.0.0: - resolution: {integrity: sha512-tmVsKzZovAYNDIaUinfz+VDclraQpPUnAME+JawosgWRMphInDded/PuY0xmU5dOhyeYZsI0nz5yd8dPYsdLTA==} + /xterm/5.1.0: + resolution: {integrity: sha512-LovENH4WDzpwynj+OTkLyZgJPeDom9Gra4DMlGAgz6pZhIDCQ+YuO7yfwanY+gVbn/mmZIStNOnVRU/ikQuAEQ==} dev: false /y18n/5.0.8: diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json index c8f1c469..8cfd0c8c 100644 --- a/common/config/rush/repo-state.json +++ b/common/config/rush/repo-state.json @@ -1,5 +1,5 @@ // DO NOT MODIFY THIS FILE MANUALLY BUT DO COMMIT IT. It is generated and used by Rush. { - "pnpmShrinkwrapHash": "0befa221b0ddd68c63c5522f8e772fd52f418d83", + "pnpmShrinkwrapHash": "299fc3205952059fcc5f33d350852a626eb6dff2", "preferredVersionsHash": "bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f" } diff --git a/libraries/adb-backend-direct-sockets/.eslintrc.cjs b/libraries/adb-backend-direct-sockets/.eslintrc.cjs new file mode 100644 index 00000000..40d283a4 --- /dev/null +++ b/libraries/adb-backend-direct-sockets/.eslintrc.cjs @@ -0,0 +1,11 @@ +module.exports = { + "extends": [ + "@yume-chan" + ], + parserOptions: { + tsconfigRootDir: __dirname, + project: [ + "./tsconfig.build.json" + ], + }, +} diff --git a/libraries/adb-backend-direct-sockets/.npmignore b/libraries/adb-backend-direct-sockets/.npmignore index a5599a2d..e44e2e62 100644 --- a/libraries/adb-backend-direct-sockets/.npmignore +++ b/libraries/adb-backend-direct-sockets/.npmignore @@ -8,7 +8,9 @@ coverage **/__helpers__ jest.config.js +.eslintrc.cjs tsconfig.json +tsconfig.test.json # Logs *.log diff --git a/libraries/adb-backend-direct-sockets/package.json b/libraries/adb-backend-direct-sockets/package.json index b0497d70..5ad4fa2b 100644 --- a/libraries/adb-backend-direct-sockets/package.json +++ b/libraries/adb-backend-direct-sockets/package.json @@ -26,13 +26,16 @@ "main": "esm/index.js", "types": "esm/index.d.ts", "scripts": { - "build": "build-ts-package", - "build:watch": "build-ts-package --incremental", + "build": "tsc -b tsconfig.build.json", + "build:watch": "tsc -b tsconfig.build.json", + "lint": "eslint src/**/*.ts --fix", "prepublishOnly": "npm run build" }, "devDependencies": { - "@yume-chan/ts-package-builder": "workspace:^1.0.0", - "typescript": "^4.8.4" + "@yume-chan/eslint-config": "workspace:^1.0.0", + "@yume-chan/tsconfig": "workspace:^1.0.0", + "eslint": "^8.30.0", + "typescript": "^4.9.4" }, "dependencies": { "@yume-chan/adb": "workspace:^0.0.17", diff --git a/libraries/adb-backend-direct-sockets/src/index.ts b/libraries/adb-backend-direct-sockets/src/index.ts index 6cf2c078..2edcd7c4 100644 --- a/libraries/adb-backend-direct-sockets/src/index.ts +++ b/libraries/adb-backend-direct-sockets/src/index.ts @@ -1,5 +1,16 @@ -import { AdbBackend, AdbPacket, AdbPacketSerializeStream } from '@yume-chan/adb'; -import { pipeFrom, ReadableStream, StructDeserializeStream, WrapReadableStream, WrapWritableStream, WritableStream } from '@yume-chan/stream-extra'; +import { + AdbPacket, + AdbPacketSerializeStream, + type AdbBackend, +} from "@yume-chan/adb"; +import { + StructDeserializeStream, + WrapReadableStream, + WrapWritableStream, + pipeFrom, + type ReadableStream, + type WritableStream, +} from "@yume-chan/stream-extra"; declare global { interface TCPSocket { @@ -32,7 +43,9 @@ declare global { export default class AdbDirectSocketsBackend implements AdbBackend { public static isSupported(): boolean { - return typeof window !== 'undefined' && !!window.navigator?.openTCPSocket; + return ( + typeof window !== "undefined" && !!window.navigator?.openTCPSocket + ); } public readonly serial: string; @@ -43,7 +56,7 @@ export default class AdbDirectSocketsBackend implements AdbBackend { public name: string | undefined; - public constructor(host: string, port: number = 5555, name?: string) { + public constructor(host: string, port = 5555, name?: string) { this.host = host; this.port = port; this.serial = `${host}:${port}`; @@ -59,8 +72,9 @@ export default class AdbDirectSocketsBackend implements AdbBackend { // Native streams can't `pipeTo()` or `pipeThrough()` polyfilled streams, so we need to wrap them return { - readable: new WrapReadableStream(readable) - .pipeThrough(new StructDeserializeStream(AdbPacket)), + readable: new WrapReadableStream(readable).pipeThrough( + new StructDeserializeStream(AdbPacket) + ), writable: pipeFrom( new WrapWritableStream(writable), new AdbPacketSerializeStream() diff --git a/libraries/adb-backend-direct-sockets/tsconfig.build.json b/libraries/adb-backend-direct-sockets/tsconfig.build.json new file mode 100644 index 00000000..549c3a15 --- /dev/null +++ b/libraries/adb-backend-direct-sockets/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./node_modules/@yume-chan/tsconfig/tsconfig.base.json", + "compilerOptions": { + "lib": [ + "ESNext", + "DOM" + ], + } +} diff --git a/libraries/adb-backend-direct-sockets/tsconfig.json b/libraries/adb-backend-direct-sockets/tsconfig.json index 5232116b..89469380 100644 --- a/libraries/adb-backend-direct-sockets/tsconfig.json +++ b/libraries/adb-backend-direct-sockets/tsconfig.json @@ -1,17 +1,13 @@ { - "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json", - "compilerOptions": { - "lib": [ - "ESNext", - "DOM" - ], - }, "references": [ { "path": "../adb/tsconfig.build.json" }, { "path": "../stream-extra/tsconfig.build.json" - } + }, + { + "path": "./tsconfig.build.json" + }, ] } diff --git a/libraries/adb-backend-webusb/.eslintrc.cjs b/libraries/adb-backend-webusb/.eslintrc.cjs new file mode 100644 index 00000000..40d283a4 --- /dev/null +++ b/libraries/adb-backend-webusb/.eslintrc.cjs @@ -0,0 +1,11 @@ +module.exports = { + "extends": [ + "@yume-chan" + ], + parserOptions: { + tsconfigRootDir: __dirname, + project: [ + "./tsconfig.build.json" + ], + }, +} diff --git a/libraries/adb-backend-webusb/.npmignore b/libraries/adb-backend-webusb/.npmignore index a5599a2d..e44e2e62 100644 --- a/libraries/adb-backend-webusb/.npmignore +++ b/libraries/adb-backend-webusb/.npmignore @@ -8,7 +8,9 @@ coverage **/__helpers__ jest.config.js +.eslintrc.cjs tsconfig.json +tsconfig.test.json # Logs *.log diff --git a/libraries/adb-backend-webusb/package.json b/libraries/adb-backend-webusb/package.json index f8159752..e1b12382 100644 --- a/libraries/adb-backend-webusb/package.json +++ b/libraries/adb-backend-webusb/package.json @@ -25,9 +25,10 @@ "main": "esm/index.js", "types": "esm/index.d.ts", "scripts": { - "build": "build-ts-package", - "build:watch": "build-ts-package --incremental", + "build": "tsc -b tsconfig.build.json", + "build:watch": "tsc -b tsconfig.build.json", "//test": "jest --coverage", + "lint": "eslint src/**/*.ts --fix", "prepublishOnly": "npm run build" }, "dependencies": { @@ -38,8 +39,10 @@ "tslib": "^2.4.1" }, "devDependencies": { - "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "@yume-chan/eslint-config": "workspace:^1.0.0", + "@yume-chan/tsconfig": "workspace:^1.0.0", + "eslint": "^8.30.0", "jest": "^29.3.1", - "typescript": "^4.8.4" + "typescript": "^4.9.4" } } diff --git a/libraries/adb-backend-webusb/src/backend.ts b/libraries/adb-backend-webusb/src/backend.ts index 1dde6a0a..8e7685ca 100644 --- a/libraries/adb-backend-webusb/src/backend.ts +++ b/libraries/adb-backend-webusb/src/backend.ts @@ -1,9 +1,24 @@ -import { AdbPacketHeader, AdbPacketSerializeStream, type AdbBackend, type AdbPacketData, type AdbPacketInit } from '@yume-chan/adb'; -import { DuplexStreamFactory, pipeFrom, ReadableStream, WritableStream, type ReadableWritablePair } from '@yume-chan/stream-extra'; -import { EMPTY_UINT8_ARRAY, StructDeserializeStream } from '@yume-chan/struct'; +import { + AdbPacketHeader, + AdbPacketSerializeStream, + type AdbBackend, + type AdbPacketData, + type AdbPacketInit, +} from "@yume-chan/adb"; +import { + DuplexStreamFactory, + pipeFrom, + ReadableStream, + WritableStream, + type ReadableWritablePair, +} from "@yume-chan/stream-extra"; +import { + EMPTY_UINT8_ARRAY, + type StructDeserializeStream, +} from "@yume-chan/struct"; export const ADB_DEVICE_FILTER: USBDeviceFilter = { - classCode: 0xFF, + classCode: 0xff, subclassCode: 0x42, protocolCode: 1, }; @@ -25,67 +40,108 @@ class Uint8ArrayStructDeserializeStream implements StructDeserializeStream { } } -export class AdbWebUsbBackendStream implements ReadableWritablePair{ +export class AdbWebUsbBackendStream + implements ReadableWritablePair +{ private _readable: ReadableStream; - public get readable() { return this._readable; } + public get readable() { + return this._readable; + } private _writable: WritableStream; - public get writable() { return this._writable; } + public get writable() { + return this._writable; + } - public constructor(device: USBDevice, inEndpoint: USBEndpoint, outEndpoint: USBEndpoint) { + public constructor( + device: USBDevice, + inEndpoint: USBEndpoint, + outEndpoint: USBEndpoint + ) { const factory = new DuplexStreamFactory({ close: async () => { - try { await device.close(); } catch { /* device may have already disconnected */ } + try { + await device.close(); + } catch { + /* device may have already disconnected */ + } }, - dispose: async () => { - navigator.usb.removeEventListener('disconnect', handleUsbDisconnect); + dispose: () => { + navigator.usb.removeEventListener( + "disconnect", + handleUsbDisconnect + ); }, }); function handleUsbDisconnect(e: USBConnectionEvent) { if (e.device === device) { - factory.dispose(); + factory.dispose().catch((e) => { + void e; + }); } } - navigator.usb.addEventListener('disconnect', handleUsbDisconnect); - - this._readable = factory.wrapReadable(new ReadableStream({ - async pull(controller) { - // The `length` argument in `transferIn` must not be smaller than what the device sent, - // otherwise it will return `babble` status without any data. - // Here we read exactly 24 bytes (packet header) followed by exactly `payloadLength`. - const result = await device.transferIn(inEndpoint.endpointNumber, 24); - - // TODO: webusb: handle `babble` by discarding the data and receive again - // TODO: webusb: on Windows, `transferIn` throws an NetworkError when device disconnected, check with other OSs. - - // From spec, the `result.data` always covers the whole `buffer`. - const buffer = new Uint8Array(result.data!.buffer); - const stream = new Uint8ArrayStructDeserializeStream(buffer); - - // Add `payload` field to its type, because we will assign `payload` in next step. - const packet = AdbPacketHeader.deserialize(stream) as AdbPacketHeader & { payload: Uint8Array; }; - if (packet.payloadLength !== 0) { - const result = await device.transferIn(inEndpoint.endpointNumber, packet.payloadLength); - packet.payload = new Uint8Array(result.data!.buffer); - } else { - packet.payload = EMPTY_UINT8_ARRAY; - } + navigator.usb.addEventListener("disconnect", handleUsbDisconnect); - controller.enqueue(packet); - }, - })); + this._readable = factory.wrapReadable( + new ReadableStream({ + async pull(controller) { + // The `length` argument in `transferIn` must not be smaller than what the device sent, + // otherwise it will return `babble` status without any data. + // Here we read exactly 24 bytes (packet header) followed by exactly `payloadLength`. + const result = await device.transferIn( + inEndpoint.endpointNumber, + 24 + ); - this._writable = pipeFrom( - factory.createWritable(new WritableStream({ - write: async (chunk) => { - await device.transferOut(outEndpoint.endpointNumber, chunk); + // TODO: webusb: handle `babble` by discarding the data and receive again + // TODO: webusb: on Windows, `transferIn` throws an NetworkError when device disconnected, check with other OSs. + + // From spec, the `result.data` always covers the whole `buffer`. + const buffer = new Uint8Array(result.data!.buffer); + const stream = new Uint8ArrayStructDeserializeStream( + buffer + ); + + // Add `payload` field to its type, because we will assign `payload` in next step. + const packet = AdbPacketHeader.deserialize( + stream + ) as AdbPacketHeader & { payload: Uint8Array }; + if (packet.payloadLength !== 0) { + const result = await device.transferIn( + inEndpoint.endpointNumber, + packet.payloadLength + ); + packet.payload = new Uint8Array(result.data!.buffer); + } else { + packet.payload = EMPTY_UINT8_ARRAY; + } + + controller.enqueue(packet); }, - }, { - highWaterMark: 16 * 1024, - size(chunk) { return chunk.byteLength; }, - })), + }) + ); + + this._writable = pipeFrom( + factory.createWritable( + new WritableStream( + { + write: async (chunk) => { + await device.transferOut( + outEndpoint.endpointNumber, + chunk + ); + }, + }, + { + highWaterMark: 16 * 1024, + size(chunk) { + return chunk.byteLength; + }, + } + ) + ), new AdbPacketSerializeStream() ); } @@ -98,16 +154,18 @@ export class AdbWebUsbBackend implements AdbBackend { public static async getDevices(): Promise { const devices = await window.navigator.usb.getDevices(); - return devices.map(device => new AdbWebUsbBackend(device)); + return devices.map((device) => new AdbWebUsbBackend(device)); } public static async requestDevice(): Promise { try { - const device = await navigator.usb.requestDevice({ filters: [ADB_DEVICE_FILTER] }); + const device = await navigator.usb.requestDevice({ + filters: [ADB_DEVICE_FILTER], + }); return new AdbWebUsbBackend(device); } catch (e) { // User cancelled the device picker - if (e instanceof DOMException && e.name === 'NotFoundError') { + if (e instanceof DOMException && e.name === "NotFoundError") { return undefined; } @@ -117,9 +175,13 @@ export class AdbWebUsbBackend implements AdbBackend { private _device: USBDevice; - public get serial(): string { return this._device.serialNumber!; } + public get serial(): string { + return this._device.serialNumber!; + } - public get name(): string { return this._device.productName!; } + public get name(): string { + return this._device.productName!; + } public constructor(device: USBDevice) { this._device = device; @@ -133,21 +195,39 @@ export class AdbWebUsbBackend implements AdbBackend { for (const configuration of this._device.configurations) { for (const interface_ of configuration.interfaces) { for (const alternate of interface_.alternates) { - if (alternate.interfaceSubclass === ADB_DEVICE_FILTER.subclassCode && - alternate.interfaceClass === ADB_DEVICE_FILTER.classCode && - alternate.interfaceSubclass === ADB_DEVICE_FILTER.subclassCode) { - if (this._device.configuration?.configurationValue !== configuration.configurationValue) { + if ( + alternate.interfaceSubclass === + ADB_DEVICE_FILTER.subclassCode && + alternate.interfaceClass === + ADB_DEVICE_FILTER.classCode && + alternate.interfaceSubclass === + ADB_DEVICE_FILTER.subclassCode + ) { + if ( + this._device.configuration?.configurationValue !== + configuration.configurationValue + ) { // Note: Switching configuration is not supported on Windows, // but Android devices should always expose ADB function at the first (default) configuration. - await this._device.selectConfiguration(configuration.configurationValue); + await this._device.selectConfiguration( + configuration.configurationValue + ); } if (!interface_.claimed) { - await this._device.claimInterface(interface_.interfaceNumber); + await this._device.claimInterface( + interface_.interfaceNumber + ); } - if (interface_.alternate.alternateSetting !== alternate.alternateSetting) { - await this._device.selectAlternateInterface(interface_.interfaceNumber, alternate.alternateSetting); + if ( + interface_.alternate.alternateSetting !== + alternate.alternateSetting + ) { + await this._device.selectAlternateInterface( + interface_.interfaceNumber, + alternate.alternateSetting + ); } let inEndpoint: USBEndpoint | undefined; @@ -155,16 +235,24 @@ export class AdbWebUsbBackend implements AdbBackend { for (const endpoint of alternate.endpoints) { switch (endpoint.direction) { - case 'in': + case "in": inEndpoint = endpoint; if (outEndpoint) { - return new AdbWebUsbBackendStream(this._device, inEndpoint, outEndpoint); + return new AdbWebUsbBackendStream( + this._device, + inEndpoint, + outEndpoint + ); } break; - case 'out': + case "out": outEndpoint = endpoint; if (inEndpoint) { - return new AdbWebUsbBackendStream(this._device, inEndpoint, outEndpoint); + return new AdbWebUsbBackendStream( + this._device, + inEndpoint, + outEndpoint + ); } break; } @@ -174,6 +262,6 @@ export class AdbWebUsbBackend implements AdbBackend { } } - throw new Error('Can not find ADB interface'); + throw new Error("Can not find ADB interface"); } } diff --git a/libraries/adb-backend-webusb/tsconfig.build.json b/libraries/adb-backend-webusb/tsconfig.build.json new file mode 100644 index 00000000..1092d69f --- /dev/null +++ b/libraries/adb-backend-webusb/tsconfig.build.json @@ -0,0 +1,12 @@ +{ + "extends": "./node_modules/@yume-chan/tsconfig/tsconfig.base.json", + "compilerOptions": { + "lib": [ + "ESNext", + "DOM" + ], + "types": [ + "w3c-web-usb", + ] + }, +} diff --git a/libraries/adb-backend-webusb/tsconfig.json b/libraries/adb-backend-webusb/tsconfig.json index dfcfd348..3846b76d 100644 --- a/libraries/adb-backend-webusb/tsconfig.json +++ b/libraries/adb-backend-webusb/tsconfig.json @@ -1,14 +1,4 @@ { - "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json", - "compilerOptions": { - "lib": [ - "ESNext", - "DOM" - ], - "types": [ - "w3c-web-usb", - ] - }, "references": [ { "path": "../adb/tsconfig.build.json" @@ -18,6 +8,9 @@ }, { "path": "../struct/tsconfig.build.json" - } + }, + { + "path": "./tsconfig.build.json" + }, ] } diff --git a/libraries/adb-backend-ws/.eslintrc.cjs b/libraries/adb-backend-ws/.eslintrc.cjs new file mode 100644 index 00000000..40d283a4 --- /dev/null +++ b/libraries/adb-backend-ws/.eslintrc.cjs @@ -0,0 +1,11 @@ +module.exports = { + "extends": [ + "@yume-chan" + ], + parserOptions: { + tsconfigRootDir: __dirname, + project: [ + "./tsconfig.build.json" + ], + }, +} diff --git a/libraries/adb-backend-ws/.npmignore b/libraries/adb-backend-ws/.npmignore index a5599a2d..e44e2e62 100644 --- a/libraries/adb-backend-ws/.npmignore +++ b/libraries/adb-backend-ws/.npmignore @@ -8,7 +8,9 @@ coverage **/__helpers__ jest.config.js +.eslintrc.cjs tsconfig.json +tsconfig.test.json # Logs *.log diff --git a/libraries/adb-backend-ws/package.json b/libraries/adb-backend-ws/package.json index 1a6292c9..c164de31 100644 --- a/libraries/adb-backend-ws/package.json +++ b/libraries/adb-backend-ws/package.json @@ -26,13 +26,16 @@ "main": "esm/index.js", "types": "esm/index.d.ts", "scripts": { - "build": "build-ts-package", - "build:watch": "build-ts-package --incremental" + "build": "tsc -b tsconfig.build.json", + "build:watch": "tsc -b tsconfig.build.json", + "lint": "eslint src/**/*.ts --fix" }, "devDependencies": { - "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "@yume-chan/eslint-config": "workspace:^1.0.0", + "@yume-chan/tsconfig": "workspace:^1.0.0", + "eslint": "^8.30.0", "jest": "^29.3.1", - "typescript": "^4.8.4" + "typescript": "^4.9.4" }, "dependencies": { "@yume-chan/adb": "workspace:^0.0.17", diff --git a/libraries/adb-backend-ws/src/index.ts b/libraries/adb-backend-ws/src/index.ts index d5e93dc3..9611ea55 100644 --- a/libraries/adb-backend-ws/src/index.ts +++ b/libraries/adb-backend-ws/src/index.ts @@ -1,5 +1,15 @@ -import { AdbPacket, AdbPacketSerializeStream, type AdbBackend } from '@yume-chan/adb'; -import { DuplexStreamFactory, pipeFrom, ReadableStream, StructDeserializeStream, WritableStream } from '@yume-chan/stream-extra'; +import { + AdbPacket, + AdbPacketSerializeStream, + type AdbBackend, +} from "@yume-chan/adb"; +import { + DuplexStreamFactory, + ReadableStream, + StructDeserializeStream, + WritableStream, + pipeFrom, +} from "@yume-chan/stream-extra"; export default class AdbWsBackend implements AdbBackend { public readonly serial: string; @@ -13,12 +23,12 @@ export default class AdbWsBackend implements AdbBackend { public async connect() { const socket = new WebSocket(this.serial); - socket.binaryType = 'arraybuffer'; + socket.binaryType = "arraybuffer"; await new Promise((resolve, reject) => { socket.onopen = resolve; socket.onerror = () => { - reject(new Error('WebSocket connect failed')); + reject(new Error("WebSocket connect failed")); }; }); @@ -29,31 +39,53 @@ export default class AdbWsBackend implements AdbBackend { }); socket.onclose = () => { - factory.dispose(); + factory.dispose().catch((e) => { + void e; + }); }; - const readable = factory.wrapReadable(new ReadableStream({ - start: (controller) => { - socket.onmessage = ({ data }: { data: ArrayBuffer; }) => { - controller.enqueue(new Uint8Array(data)); - }; - } - }, { - highWaterMark: 16 * 1024, - size(chunk) { return chunk.byteLength; }, - })); - - const writable = factory.createWritable(new WritableStream({ - write: (chunk) => { - socket.send(chunk); - }, - }, { - highWaterMark: 16 * 1024, - size(chunk) { return chunk.byteLength; }, - })); + const readable = factory.wrapReadable( + new ReadableStream( + { + start: (controller) => { + socket.onmessage = ({ + data, + }: { + data: ArrayBuffer; + }) => { + controller.enqueue(new Uint8Array(data)); + }; + }, + }, + { + highWaterMark: 16 * 1024, + size(chunk) { + return chunk.byteLength; + }, + } + ) + ); + + const writable = factory.createWritable( + new WritableStream( + { + write: (chunk) => { + socket.send(chunk); + }, + }, + { + highWaterMark: 16 * 1024, + size(chunk) { + return chunk.byteLength; + }, + } + ) + ); return { - readable: readable.pipeThrough(new StructDeserializeStream(AdbPacket)), + readable: readable.pipeThrough( + new StructDeserializeStream(AdbPacket) + ), writable: pipeFrom(writable, new AdbPacketSerializeStream()), }; } diff --git a/libraries/adb-backend-ws/tsconfig.build.json b/libraries/adb-backend-ws/tsconfig.build.json new file mode 100644 index 00000000..bae95b66 --- /dev/null +++ b/libraries/adb-backend-ws/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./node_modules/@yume-chan/tsconfig/tsconfig.base.json", + "compilerOptions": { + "lib": [ + "ESNext", + "DOM" + ] + }, +} diff --git a/libraries/adb-backend-ws/tsconfig.json b/libraries/adb-backend-ws/tsconfig.json index 5232116b..89469380 100644 --- a/libraries/adb-backend-ws/tsconfig.json +++ b/libraries/adb-backend-ws/tsconfig.json @@ -1,17 +1,13 @@ { - "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json", - "compilerOptions": { - "lib": [ - "ESNext", - "DOM" - ], - }, "references": [ { "path": "../adb/tsconfig.build.json" }, { "path": "../stream-extra/tsconfig.build.json" - } + }, + { + "path": "./tsconfig.build.json" + }, ] } diff --git a/libraries/adb-credential-web/.eslintrc.cjs b/libraries/adb-credential-web/.eslintrc.cjs new file mode 100644 index 00000000..40d283a4 --- /dev/null +++ b/libraries/adb-credential-web/.eslintrc.cjs @@ -0,0 +1,11 @@ +module.exports = { + "extends": [ + "@yume-chan" + ], + parserOptions: { + tsconfigRootDir: __dirname, + project: [ + "./tsconfig.build.json" + ], + }, +} diff --git a/libraries/adb-credential-web/.npmignore b/libraries/adb-credential-web/.npmignore new file mode 100644 index 00000000..e44e2e62 --- /dev/null +++ b/libraries/adb-credential-web/.npmignore @@ -0,0 +1,16 @@ +.rush + +# Test +coverage +**/*.spec.ts +**/*.spec.js +**/*.spec.js.map +**/__helpers__ +jest.config.js + +.eslintrc.cjs +tsconfig.json +tsconfig.test.json + +# Logs +*.log diff --git a/libraries/adb-credential-web/package.json b/libraries/adb-credential-web/package.json index dea5c63f..868dde42 100644 --- a/libraries/adb-credential-web/package.json +++ b/libraries/adb-credential-web/package.json @@ -24,13 +24,16 @@ "main": "esm/index.js", "types": "esm/index.d.ts", "scripts": { - "build": "build-ts-package", - "build:watch": "build-ts-package --incremental", + "build": "tsc -b tsconfig.build.json", + "build:watch": "tsc -b tsconfig.build.json", + "lint": "eslint src/**/*.ts --fix", "prepublishOnly": "npm run build" }, "devDependencies": { - "@yume-chan/ts-package-builder": "workspace:^1.0.0", - "typescript": "^4.8.4" + "@yume-chan/eslint-config": "workspace:^1.0.0", + "@yume-chan/tsconfig": "workspace:^1.0.0", + "eslint": "^8.30.0", + "typescript": "^4.9.4" }, "dependencies": { "@yume-chan/adb": "workspace:^0.0.17", diff --git a/libraries/adb-credential-web/src/index.ts b/libraries/adb-credential-web/src/index.ts index 42f5ead9..d89b8ef4 100644 --- a/libraries/adb-credential-web/src/index.ts +++ b/libraries/adb-credential-web/src/index.ts @@ -1,11 +1,19 @@ // cspell: ignore RSASSA -import { calculateBase64EncodedLength, calculatePublicKey, calculatePublicKeyLength, decodeBase64, decodeUtf8, encodeBase64, type AdbCredentialStore } from "@yume-chan/adb"; +import { + calculateBase64EncodedLength, + calculatePublicKey, + calculatePublicKeyLength, + decodeBase64, + decodeUtf8, + encodeBase64, + type AdbCredentialStore, +} from "@yume-chan/adb"; export default class AdbWebCredentialStore implements AdbCredentialStore { public readonly localStorageKey: string; - public constructor(localStorageKey = 'private-key') { + public constructor(localStorageKey = "private-key") { this.localStorageKey = localStorageKey; } @@ -19,32 +27,41 @@ export default class AdbWebCredentialStore implements AdbCredentialStore { public async generateKey(): Promise { const { privateKey: cryptoKey } = await crypto.subtle.generateKey( { - name: 'RSASSA-PKCS1-v1_5', + name: "RSASSA-PKCS1-v1_5", modulusLength: 2048, // 65537 publicExponent: new Uint8Array([0x01, 0x00, 0x01]), - hash: 'SHA-1', + hash: "SHA-1", }, true, - ['sign', 'verify'] + ["sign", "verify"] ); - const privateKey = new Uint8Array(await crypto.subtle.exportKey('pkcs8', cryptoKey!)); - window.localStorage.setItem(this.localStorageKey, decodeUtf8(encodeBase64(privateKey))); + const privateKey = new Uint8Array( + await crypto.subtle.exportKey("pkcs8", cryptoKey) + ); + window.localStorage.setItem( + this.localStorageKey, + decodeUtf8(encodeBase64(privateKey)) + ); // The authentication module in core doesn't need public keys. // It will generate the public key from private key every time. // However, maybe there are people want to manually put this public key onto their device, // so also save the public key for their convenience. const publicKeyLength = calculatePublicKeyLength(); - const [publicKeyBase64Length] = calculateBase64EncodedLength(publicKeyLength); + const [publicKeyBase64Length] = + calculateBase64EncodedLength(publicKeyLength); const publicKeyBuffer = new Uint8Array(publicKeyBase64Length); calculatePublicKey(privateKey, publicKeyBuffer); encodeBase64( publicKeyBuffer.subarray(0, publicKeyLength), publicKeyBuffer ); - window.localStorage.setItem(this.localStorageKey + '.pub', decodeUtf8(publicKeyBuffer)); + window.localStorage.setItem( + this.localStorageKey + ".pub", + decodeUtf8(publicKeyBuffer) + ); return privateKey; } diff --git a/libraries/adb-credential-web/tsconfig.build.json b/libraries/adb-credential-web/tsconfig.build.json new file mode 100644 index 00000000..bae95b66 --- /dev/null +++ b/libraries/adb-credential-web/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./node_modules/@yume-chan/tsconfig/tsconfig.base.json", + "compilerOptions": { + "lib": [ + "ESNext", + "DOM" + ] + }, +} diff --git a/libraries/adb-credential-web/tsconfig.json b/libraries/adb-credential-web/tsconfig.json index 43cb24d0..cddd729b 100644 --- a/libraries/adb-credential-web/tsconfig.json +++ b/libraries/adb-credential-web/tsconfig.json @@ -1,14 +1,10 @@ { - "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json", - "compilerOptions": { - "lib": [ - "ESNext", - "DOM" - ], - }, "references": [ { "path": "../adb/tsconfig.build.json" - } + }, + { + "path": "./tsconfig.build.json" + }, ] } diff --git a/libraries/adb/.eslintrc.cjs b/libraries/adb/.eslintrc.cjs new file mode 100644 index 00000000..e225d0db --- /dev/null +++ b/libraries/adb/.eslintrc.cjs @@ -0,0 +1,11 @@ +module.exports = { + "extends": [ + "@yume-chan" + ], + parserOptions: { + tsconfigRootDir: __dirname, + project: [ + "./tsconfig.test.json" + ], + }, +} diff --git a/libraries/adb/.npmignore b/libraries/adb/.npmignore index 667ace40..e44e2e62 100644 --- a/libraries/adb/.npmignore +++ b/libraries/adb/.npmignore @@ -8,6 +8,7 @@ coverage **/__helpers__ jest.config.js +.eslintrc.cjs tsconfig.json tsconfig.test.json diff --git a/libraries/adb/package.json b/libraries/adb/package.json index ed463485..7ff751d0 100644 --- a/libraries/adb/package.json +++ b/libraries/adb/package.json @@ -28,6 +28,7 @@ "build": "tsc -b tsconfig.build.json", "build:watch": "tsc -b tsconfig.build.json", "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage", + "lint": "eslint src/**/*.ts --fix", "prepublishOnly": "npm run build" }, "dependencies": { @@ -40,11 +41,13 @@ }, "devDependencies": { "@jest/globals": "^29.3.1", - "@types/node": "^18.11.9", - "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "@types/node": "^18.11.17", + "@yume-chan/tsconfig": "workspace:^1.0.0", + "@yume-chan/eslint-config": "workspace:^1.0.0", "cross-env": "^7.0.3", + "eslint": "^8.30.0", "jest": "^29.3.1", "ts-jest": "^29.0.3", - "typescript": "^4.8.4" + "typescript": "^4.9.4" } } diff --git a/libraries/adb/src/adb.ts b/libraries/adb/src/adb.ts index f781fb38..eed5aa33 100644 --- a/libraries/adb/src/adb.ts +++ b/libraries/adb/src/adb.ts @@ -1,20 +1,50 @@ // cspell: ignore libusb -import { PromiseResolver } from '@yume-chan/async'; -import { AbortController, DecodeUtf8Stream, GatherStringStream, WritableStream, type ReadableWritablePair } from '@yume-chan/stream-extra'; - -import { AdbAuthenticationProcessor, ADB_DEFAULT_AUTHENTICATORS, type AdbCredentialStore } from './auth.js'; -import { AdbPower, AdbReverseCommand, AdbSubprocess, AdbSync, AdbTcpIpCommand, escapeArg, framebuffer, install, type AdbFrameBuffer } from './commands/index.js'; -import { AdbFeatures } from './features.js'; -import { AdbCommand, calculateChecksum, type AdbPacketData, type AdbPacketInit } from './packet.js'; -import { AdbIncomingSocketHandler, AdbPacketDispatcher, type AdbSocket, type Closeable } from './socket/index.js'; -import { decodeUtf8, encodeUtf8 } from './utils/index.js'; +import { PromiseResolver } from "@yume-chan/async"; +import { + AbortController, + DecodeUtf8Stream, + GatherStringStream, + WritableStream, + type ReadableWritablePair, +} from "@yume-chan/stream-extra"; + +import { + ADB_DEFAULT_AUTHENTICATORS, + AdbAuthenticationProcessor, + type AdbCredentialStore, +} from "./auth.js"; +import { + AdbPower, + AdbReverseCommand, + AdbSubprocess, + AdbSync, + AdbTcpIpCommand, + escapeArg, + framebuffer, + install, + type AdbFrameBuffer, +} from "./commands/index.js"; +import { AdbFeatures } from "./features.js"; +import { + AdbCommand, + calculateChecksum, + type AdbPacketData, + type AdbPacketInit, +} from "./packet.js"; +import { + AdbPacketDispatcher, + type AdbIncomingSocketHandler, + type AdbSocket, + type Closeable, +} from "./socket/index.js"; +import { decodeUtf8, encodeUtf8 } from "./utils/index.js"; export enum AdbPropKey { - Product = 'ro.product.name', - Model = 'ro.product.model', - Device = 'ro.product.device', - Features = 'features', + Product = "ro.product.name", + Model = "ro.product.model", + Device = "ro.product.device", + Features = "features", } export const VERSION_OMIT_CHECKSUM = 0x01000001; @@ -28,45 +58,57 @@ export class Adb implements Closeable { public static async authenticate( connection: ReadableWritablePair, credentialStore: AdbCredentialStore, - authenticators = ADB_DEFAULT_AUTHENTICATORS, + authenticators = ADB_DEFAULT_AUTHENTICATORS ): Promise { // Initially, set to highest-supported version and payload size. let version = 0x01000001; let maxPayloadSize = 0x100000; const resolver = new PromiseResolver(); - const authProcessor = new AdbAuthenticationProcessor(authenticators, credentialStore); + const authProcessor = new AdbAuthenticationProcessor( + authenticators, + credentialStore + ); // Here is similar to `AdbPacketDispatcher`, // But the received packet types and send packet processing are different. const abortController = new AbortController(); const pipe = connection.readable - .pipeTo(new WritableStream({ - async write(packet) { - switch (packet.command) { - case AdbCommand.Connect: - version = Math.min(version, packet.arg0); - maxPayloadSize = Math.min(maxPayloadSize, packet.arg1); - resolver.resolve(decodeUtf8(packet.payload)); - break; - case AdbCommand.Auth: - const response = await authProcessor.process(packet); - await sendPacket(response); - break; - default: - // Maybe the previous ADB client exited without reading all packets, - // so they are still waiting in OS internal buffer. - // Just ignore them. - // Because a `Connect` packet will reset the device, - // Eventually there will be `Connect` and `Auth` response packets. - break; - } + .pipeTo( + new WritableStream({ + async write(packet) { + switch (packet.command) { + case AdbCommand.Connect: + version = Math.min(version, packet.arg0); + maxPayloadSize = Math.min( + maxPayloadSize, + packet.arg1 + ); + resolver.resolve(decodeUtf8(packet.payload)); + break; + case AdbCommand.Auth: { + const response = await authProcessor.process( + packet + ); + await sendPacket(response); + break; + } + default: + // Maybe the previous ADB client exited without reading all packets, + // so they are still waiting in OS internal buffer. + // Just ignore them. + // Because a `Connect` packet will reset the device, + // Eventually there will be `Connect` and `Auth` response packets. + break; + } + }, + }), + { + // Don't cancel the source ReadableStream on AbortSignal abort. + preventCancel: true, + signal: abortController.signal, } - }), { - // Don't cancel the source ReadableStream on AbortSignal abort. - preventCancel: true, - signal: abortController.signal, - }) + ) .catch((e) => { resolver.reject(e); }); @@ -88,20 +130,20 @@ export class Adb implements Closeable { AdbFeatures.StatV2, AdbFeatures.ListV2, AdbFeatures.FixedPushMkdir, - 'apex', - 'abb', + "apex", + "abb", // only tells the client the symlink timestamp issue in `adb push --sync` has been fixed. // No special handling required. - 'fixed_push_symlink_timestamp', - 'abb_exec', - 'remount_shell', - 'track_app', - 'sendrecv_v2', - 'sendrecv_v2_brotli', - 'sendrecv_v2_lz4', - 'sendrecv_v2_zstd', - 'sendrecv_v2_dry_run_send', - ].join(','); + "fixed_push_symlink_timestamp", + "abb_exec", + "remount_shell", + "track_app", + "sendrecv_v2", + "sendrecv_v2_brotli", + "sendrecv_v2_lz4", + "sendrecv_v2_zstd", + "sendrecv_v2_dry_run_send", + ].join(","); await sendPacket({ command: AdbCommand.Connect, @@ -123,32 +165,39 @@ export class Adb implements Closeable { await pipe; } - return new Adb( - connection, - version, - maxPayloadSize, - banner, - ); + return new Adb(connection, version, maxPayloadSize, banner); } private readonly dispatcher: AdbPacketDispatcher; - public get disconnected() { return this.dispatcher.disconnected; } + public get disconnected() { + return this.dispatcher.disconnected; + } private _protocolVersion: number | undefined; - public get protocolVersion() { return this._protocolVersion; } + public get protocolVersion() { + return this._protocolVersion; + } private _product: string | undefined; - public get product() { return this._product; } + public get product() { + return this._product; + } private _model: string | undefined; - public get model() { return this._model; } + public get model() { + return this._model; + } private _device: string | undefined; - public get device() { return this._device; } + public get device() { + return this._device; + } private _features: AdbFeatures[] = []; - public get features() { return this._features; } + public get features() { + return this._features; + } public readonly subprocess: AdbSubprocess; public readonly power: AdbPower; @@ -159,7 +208,7 @@ export class Adb implements Closeable { connection: ReadableWritablePair, version: number, maxPayloadSize: number, - banner: string, + banner: string ) { this.parseBanner(banner); @@ -173,14 +222,11 @@ export class Adb implements Closeable { appendNullToServiceString = true; } - this.dispatcher = new AdbPacketDispatcher( - connection, - { - calculateChecksum, - appendNullToServiceString, - maxPayloadSize, - } - ); + this.dispatcher = new AdbPacketDispatcher(connection, { + calculateChecksum, + appendNullToServiceString, + maxPayloadSize, + }); this._protocolVersion = version; @@ -191,15 +237,15 @@ export class Adb implements Closeable { } private parseBanner(banner: string): void { - const pieces = banner.split('::'); + const pieces = banner.split("::"); if (pieces.length > 1) { const props = pieces[1]!; - for (const prop of props.split(';')) { + for (const prop of props.split(";")) { if (!prop) { continue; } - const keyValue = prop.split('='); + const keyValue = prop.split("="); if (keyValue.length !== 2) { continue; } @@ -216,7 +262,7 @@ export class Adb implements Closeable { this._device = value; break; case AdbPropKey.Features: - this._features = value!.split(',') as AdbFeatures[]; + this._features = value!.split(",") as AdbFeatures[]; break; } } @@ -246,16 +292,19 @@ export class Adb implements Closeable { } public async getProp(key: string): Promise { - const stdout = await this.subprocess.spawnAndWaitLegacy( - ['getprop', key] - ); + const stdout = await this.subprocess.spawnAndWaitLegacy([ + "getprop", + key, + ]); return stdout.trim(); } public async rm(...filenames: string[]): Promise { - const stdout = await this.subprocess.spawnAndWaitLegacy( - ['rm', '-rf', ...filenames.map(arg => escapeArg(arg))], - ); + const stdout = await this.subprocess.spawnAndWaitLegacy([ + "rm", + "-rf", + ...filenames.map((arg) => escapeArg(arg)), + ]); return stdout; } @@ -264,7 +313,7 @@ export class Adb implements Closeable { } public async sync(): Promise { - const socket = await this.createSocket('sync:'); + const socket = await this.createSocket("sync:"); return new AdbSync(this, socket); } diff --git a/libraries/adb/src/auth.ts b/libraries/adb/src/auth.ts index 9894a644..2ab8008a 100644 --- a/libraries/adb/src/auth.ts +++ b/libraries/adb/src/auth.ts @@ -1,10 +1,14 @@ -import { PromiseResolver } from '@yume-chan/async'; -import type { Disposable } from '@yume-chan/event'; -import type { ValueOrPromise } from '@yume-chan/struct'; - -import { calculatePublicKey, calculatePublicKeyLength, sign } from './crypto.js'; -import { AdbCommand, type AdbPacketData } from './packet.js'; -import { calculateBase64EncodedLength, encodeBase64 } from './utils/index.js'; +import { PromiseResolver } from "@yume-chan/async"; +import { type Disposable } from "@yume-chan/event"; +import { type ValueOrPromise } from "@yume-chan/struct"; + +import { + calculatePublicKey, + calculatePublicKeyLength, + sign, +} from "./crypto.js"; +import { AdbCommand, type AdbPacketData } from "./packet.js"; +import { calculateBase64EncodedLength, encodeBase64 } from "./utils/index.js"; export type AdbKeyIterable = Iterable | AsyncIterable; @@ -50,7 +54,7 @@ export interface AdbAuthenticator { export const AdbSignatureAuthenticator: AdbAuthenticator = async function* ( credentialStore: AdbCredentialStore, - getNextRequest: () => Promise, + getNextRequest: () => Promise ): AsyncIterable { for await (const key of credentialStore.iterateKeys()) { const packet = await getNextRequest(); @@ -71,7 +75,7 @@ export const AdbSignatureAuthenticator: AdbAuthenticator = async function* ( export const AdbPublicKeyAuthenticator: AdbAuthenticator = async function* ( credentialStore: AdbCredentialStore, - getNextRequest: () => Promise, + getNextRequest: () => Promise ): AsyncIterable { const packet = await getNextRequest(); @@ -85,23 +89,20 @@ export const AdbPublicKeyAuthenticator: AdbAuthenticator = async function* ( break; } - if (!privateKey) { privateKey = await credentialStore.generateKey(); } const publicKeyLength = calculatePublicKeyLength(); - const [publicKeyBase64Length] = calculateBase64EncodedLength(publicKeyLength); + const [publicKeyBase64Length] = + calculateBase64EncodedLength(publicKeyLength); // The public key is null terminated, // So we allocate the buffer with one extra byte. const publicKeyBuffer = new Uint8Array(publicKeyBase64Length + 1); calculatePublicKey(privateKey, publicKeyBuffer); - encodeBase64( - publicKeyBuffer.subarray(0, publicKeyLength), - publicKeyBuffer - ); + encodeBase64(publicKeyBuffer.subarray(0, publicKeyLength), publicKeyBuffer); yield { command: AdbCommand.Auth, @@ -137,9 +138,16 @@ export class AdbAuthenticationProcessor implements Disposable { return this.pendingRequest.promise; }; - private async* invokeAuthenticator(): AsyncGenerator { + private async *invokeAuthenticator(): AsyncGenerator< + AdbPacketData, + void, + void + > { for (const authenticator of this.authenticators) { - for await (const packet of authenticator(this.credentialStore, this.getNextRequest)) { + for await (const packet of authenticator( + this.credentialStore, + this.getNextRequest + )) { // If the authenticator yielded a response // Prepare `nextRequest` for next authentication request this.pendingRequest = new PromiseResolver(); @@ -162,13 +170,13 @@ export class AdbAuthenticationProcessor implements Disposable { const result = await this.iterator.next(); if (result.done) { - throw new Error('No authenticator can handle the request'); + throw new Error("No authenticator can handle the request"); } return result.value; } public dispose() { - this.iterator?.return?.(); + void this.iterator?.return?.(); } } diff --git a/libraries/adb/src/backend.ts b/libraries/adb/src/backend.ts index b1e6c56f..c77aad75 100644 --- a/libraries/adb/src/backend.ts +++ b/libraries/adb/src/backend.ts @@ -1,12 +1,14 @@ -import type { ReadableWritablePair } from '@yume-chan/stream-extra'; -import type { ValueOrPromise } from '@yume-chan/struct'; +import { type ReadableWritablePair } from "@yume-chan/stream-extra"; +import { type ValueOrPromise } from "@yume-chan/struct"; -import type { AdbPacketData, AdbPacketInit } from './packet.js'; +import { type AdbPacketData, type AdbPacketInit } from "./packet.js"; export interface AdbBackend { readonly serial: string; readonly name: string | undefined; - connect(): ValueOrPromise>; + connect(): ValueOrPromise< + ReadableWritablePair + >; } diff --git a/libraries/adb/src/commands/base.ts b/libraries/adb/src/commands/base.ts index 1e5ac5a5..96a98b70 100644 --- a/libraries/adb/src/commands/base.ts +++ b/libraries/adb/src/commands/base.ts @@ -1,6 +1,6 @@ -import { AutoDisposable } from '@yume-chan/event'; +import { AutoDisposable } from "@yume-chan/event"; -import type { Adb } from '../adb.js'; +import { type Adb } from "../adb.js"; export class AdbCommandBase extends AutoDisposable { protected adb: Adb; diff --git a/libraries/adb/src/commands/framebuffer.ts b/libraries/adb/src/commands/framebuffer.ts index b9a20b54..fc3d6fc9 100644 --- a/libraries/adb/src/commands/framebuffer.ts +++ b/libraries/adb/src/commands/framebuffer.ts @@ -1,48 +1,44 @@ -import { BufferedReadableStream } from '@yume-chan/stream-extra'; -import Struct from '@yume-chan/struct'; +import { BufferedReadableStream } from "@yume-chan/stream-extra"; +import Struct from "@yume-chan/struct"; -import type { Adb } from '../adb.js'; +import { type Adb } from "../adb.js"; -const Version = - new Struct({ littleEndian: true }) - .uint32('version'); +const Version = new Struct({ littleEndian: true }).uint32("version"); -export const AdbFrameBufferV1 = - new Struct({ littleEndian: true }) - .uint32('bpp') - .uint32('size') - .uint32('width') - .uint32('height') - .uint32('red_offset') - .uint32('red_length') - .uint32('blue_offset') - .uint32('blue_length') - .uint32('green_offset') - .uint32('green_length') - .uint32('alpha_offset') - .uint32('alpha_length') - .uint8Array('data', { lengthField: 'size' }); +export const AdbFrameBufferV1 = new Struct({ littleEndian: true }) + .uint32("bpp") + .uint32("size") + .uint32("width") + .uint32("height") + .uint32("red_offset") + .uint32("red_length") + .uint32("blue_offset") + .uint32("blue_length") + .uint32("green_offset") + .uint32("green_length") + .uint32("alpha_offset") + .uint32("alpha_length") + .uint8Array("data", { lengthField: "size" }); -export type AdbFrameBufferV1 = typeof AdbFrameBufferV1['TDeserializeResult']; +export type AdbFrameBufferV1 = typeof AdbFrameBufferV1["TDeserializeResult"]; -export const AdbFrameBufferV2 = - new Struct({ littleEndian: true }) - .uint32('bpp') - .uint32('colorSpace') - .uint32('size') - .uint32('width') - .uint32('height') - .uint32('red_offset') - .uint32('red_length') - .uint32('blue_offset') - .uint32('blue_length') - .uint32('green_offset') - .uint32('green_length') - .uint32('alpha_offset') - .uint32('alpha_length') - .uint8Array('data', { lengthField: 'size' }); +export const AdbFrameBufferV2 = new Struct({ littleEndian: true }) + .uint32("bpp") + .uint32("colorSpace") + .uint32("size") + .uint32("width") + .uint32("height") + .uint32("red_offset") + .uint32("red_length") + .uint32("blue_offset") + .uint32("blue_length") + .uint32("green_offset") + .uint32("green_length") + .uint32("alpha_offset") + .uint32("alpha_length") + .uint8Array("data", { lengthField: "size" }); -export type AdbFrameBufferV2 = typeof AdbFrameBufferV2['TDeserializeResult']; +export type AdbFrameBufferV2 = typeof AdbFrameBufferV2["TDeserializeResult"]; /** * ADB uses 8 int32 fields to describe bit depths @@ -63,7 +59,7 @@ export type AdbFrameBufferV2 = typeof AdbFrameBufferV2['TDeserializeResult']; export type AdbFrameBuffer = AdbFrameBufferV1 | AdbFrameBufferV2; export async function framebuffer(adb: Adb): Promise { - const socket = await adb.createSocket('framebuffer:'); + const socket = await adb.createSocket("framebuffer:"); const stream = new BufferedReadableStream(socket.readable); const { version } = await Version.deserialize(stream); switch (version) { @@ -73,6 +69,6 @@ export async function framebuffer(adb: Adb): Promise { case 2: return AdbFrameBufferV2.deserialize(stream); default: - throw new Error('Unknown FrameBuffer version'); + throw new Error("Unknown FrameBuffer version"); } } diff --git a/libraries/adb/src/commands/install.ts b/libraries/adb/src/commands/install.ts index d6f9b3ab..d26841cf 100644 --- a/libraries/adb/src/commands/install.ts +++ b/libraries/adb/src/commands/install.ts @@ -1,13 +1,17 @@ -import { WrapWritableStream, WritableStream } from '@yume-chan/stream-extra'; +import { + WrapWritableStream, + type WritableStream, +} from "@yume-chan/stream-extra"; -import type { Adb } from '../adb.js'; -import { escapeArg } from './subprocess/index.js'; -import type { AdbSync } from './sync/index.js'; +import { type Adb } from "../adb.js"; -export function install( - adb: Adb, -): WritableStream { - const filename = `/data/local/tmp/${Math.random().toString().substring(2)}.apk`; +import { escapeArg } from "./subprocess/index.js"; +import { type AdbSync } from "./sync/index.js"; + +export function install(adb: Adb): WritableStream { + const filename = `/data/local/tmp/${Math.random() + .toString() + .substring(2)}.apk`; let sync!: AdbSync; return new WrapWritableStream({ @@ -20,13 +24,17 @@ export function install( return sync.write(filename, undefined, undefined); }, async close() { - sync.dispose(); + await sync.dispose(); // Invoke `pm install` to install it - await adb.subprocess.spawnAndWaitLegacy(['pm', 'install', escapeArg(filename)]); + await adb.subprocess.spawnAndWaitLegacy([ + "pm", + "install", + escapeArg(filename), + ]); // Remove the temp file await adb.rm(filename); - } + }, }); } diff --git a/libraries/adb/src/commands/power.ts b/libraries/adb/src/commands/power.ts index 6cc68e47..3e923495 100644 --- a/libraries/adb/src/commands/power.ts +++ b/libraries/adb/src/commands/power.ts @@ -3,27 +3,27 @@ // cspell: ignore keyevent // cspell: ignore longpress -import { AdbCommandBase } from './base.js'; +import { AdbCommandBase } from "./base.js"; export class AdbPower extends AdbCommandBase { - public reboot(name: string = '') { + public reboot(name = "") { return this.adb.createSocketAndWait(`reboot:${name}`); } public bootloader() { - return this.reboot('bootloader'); + return this.reboot("bootloader"); } public fastboot() { - return this.reboot('fastboot'); + return this.reboot("fastboot"); } public recovery() { - return this.reboot('recovery'); + return this.reboot("recovery"); } public sideload() { - return this.reboot('sideload'); + return this.reboot("sideload"); } /** @@ -32,15 +32,19 @@ export class AdbPower extends AdbCommandBase { * Only works on some Qualcomm devices. */ public qualcommEdlMode() { - return this.reboot('edl'); + return this.reboot("edl"); } public powerOff() { - return this.adb.subprocess.spawnAndWaitLegacy(['reboot', '-p']); + return this.adb.subprocess.spawnAndWaitLegacy(["reboot", "-p"]); } - public powerButton(longPress: boolean = false) { - return this.adb.subprocess.spawnAndWaitLegacy(['input', 'keyevent', longPress ? '--longpress POWER' : 'POWER']); + public powerButton(longPress = false) { + return this.adb.subprocess.spawnAndWaitLegacy([ + "input", + "keyevent", + longPress ? "--longpress POWER" : "POWER", + ]); } /** @@ -49,6 +53,6 @@ export class AdbPower extends AdbCommandBase { * Only works on Samsung devices. */ public samsungOdin() { - return this.reboot('download'); + return this.reboot("download"); } } diff --git a/libraries/adb/src/commands/reverse.ts b/libraries/adb/src/commands/reverse.ts index 4bef1434..29c9b925 100644 --- a/libraries/adb/src/commands/reverse.ts +++ b/libraries/adb/src/commands/reverse.ts @@ -1,12 +1,18 @@ // cspell: ignore killforward -import { AutoDisposable } from '@yume-chan/event'; -import { BufferedReadableStream, BufferedReadableStreamEndedError } from '@yume-chan/stream-extra'; -import Struct from '@yume-chan/struct'; - -import type { Adb } from '../adb.js'; -import type { AdbIncomingSocketHandler, AdbSocket } from '../socket/index.js'; -import { decodeUtf8 } from '../utils/index.js'; +import { AutoDisposable } from "@yume-chan/event"; +import { + BufferedReadableStream, + BufferedReadableStreamEndedError, +} from "@yume-chan/stream-extra"; +import Struct from "@yume-chan/struct"; + +import { type Adb } from "../adb.js"; +import { + type AdbIncomingSocketHandler, + type AdbSocket, +} from "../socket/index.js"; +import { decodeUtf8 } from "../utils/index.js"; export interface AdbForwardListener { deviceSerial: string; @@ -16,20 +22,21 @@ export interface AdbForwardListener { remoteName: string; } -const AdbReverseStringResponse = - new Struct() - .string('length', { length: 4 }) - .string('content', { lengthField: 'length', lengthFieldRadix: 16 }); +const AdbReverseStringResponse = new Struct() + .string("length", { length: 4 }) + .string("content", { lengthField: "length", lengthFieldRadix: 16 }); -const AdbReverseErrorResponse = - new Struct() - .fields(AdbReverseStringResponse) - .postDeserialize((value) => { - throw new Error(value.content); - }); +const AdbReverseErrorResponse = new Struct() + .fields(AdbReverseStringResponse) + .postDeserialize((value) => { + throw new Error(value.content); + }); export class AdbReverseCommand extends AutoDisposable { - protected localAddressToHandler = new Map(); + protected localAddressToHandler = new Map< + string, + AdbIncomingSocketHandler + >(); protected deviceAddressToLocalAddress = new Map(); @@ -41,13 +48,15 @@ export class AdbReverseCommand extends AutoDisposable { super(); this.adb = adb; - this.addDisposable(this.adb.onIncomingSocket(this.handleIncomingSocket)); + this.addDisposable( + this.adb.onIncomingSocket(this.handleIncomingSocket) + ); } protected handleIncomingSocket = async (socket: AdbSocket) => { let address = socket.serviceString; // ADB daemon appends `\0` to the service string - address = address.replace(/\0/g, ''); + address = address.replace(/\0/g, ""); return !!(await this.localAddressToHandler.get(address)?.(socket)); }; @@ -58,7 +67,7 @@ export class AdbReverseCommand extends AutoDisposable { private async sendRequest(service: string) { const stream = await this.createBufferedStream(service); - const success = decodeUtf8(await stream.read(4)) === 'OKAY'; + const success = decodeUtf8(await stream.read(4)) === "OKAY"; if (!success) { await AdbReverseErrorResponse.deserialize(stream); } @@ -66,11 +75,15 @@ export class AdbReverseCommand extends AutoDisposable { } public async list(): Promise { - const stream = await this.createBufferedStream('reverse:list-forward'); + const stream = await this.createBufferedStream("reverse:list-forward"); const response = await AdbReverseStringResponse.deserialize(stream); - return response.content!.split('\n').map(line => { - const [deviceSerial, localName, remoteName] = line.split(' ') as [string, string, string]; + return response.content!.split("\n").map((line) => { + const [deviceSerial, localName, remoteName] = line.split(" ") as [ + string, + string, + string + ]; return { deviceSerial, localName, remoteName }; }); @@ -86,13 +99,15 @@ export class AdbReverseCommand extends AutoDisposable { public async add( deviceAddress: string, localAddress: string, - handler: AdbIncomingSocketHandler, + handler: AdbIncomingSocketHandler ): Promise { - const stream = await this.sendRequest(`reverse:forward:${deviceAddress};${localAddress}`); + const stream = await this.sendRequest( + `reverse:forward:${deviceAddress};${localAddress}` + ); // `tcp:0` tells the device to pick an available port. // On Android >=8, device will respond with the selected port for all `tcp:` requests. - if (deviceAddress.startsWith('tcp:')) { + if (deviceAddress.startsWith("tcp:")) { let length: number | undefined; try { length = Number.parseInt(decodeUtf8(await stream.read(4)), 16); @@ -107,7 +122,7 @@ export class AdbReverseCommand extends AutoDisposable { } if (length !== undefined) { - const port = decodeUtf8(await stream.read(length!)); + const port = decodeUtf8(await stream.read(length)); deviceAddress = `tcp:${Number.parseInt(port, 10)}`; } } @@ -123,7 +138,9 @@ export class AdbReverseCommand extends AutoDisposable { await this.sendRequest(`reverse:killforward:${deviceAddress}`); if (this.deviceAddressToLocalAddress.has(deviceAddress)) { - this.localAddressToHandler.delete(this.deviceAddressToLocalAddress.get(deviceAddress)!); + this.localAddressToHandler.delete( + this.deviceAddressToLocalAddress.get(deviceAddress)! + ); this.deviceAddressToLocalAddress.delete(deviceAddress); } diff --git a/libraries/adb/src/commands/subprocess/command.ts b/libraries/adb/src/commands/subprocess/command.ts index d85bc63d..28803871 100644 --- a/libraries/adb/src/commands/subprocess/command.ts +++ b/libraries/adb/src/commands/subprocess/command.ts @@ -1,7 +1,13 @@ -import { GatherStringStream, DecodeUtf8Stream } from '@yume-chan/stream-extra'; +import { DecodeUtf8Stream, GatherStringStream } from "@yume-chan/stream-extra"; -import { AdbCommandBase } from '../base.js'; -import { AdbSubprocessNoneProtocol, AdbSubprocessProtocol, AdbSubprocessProtocolConstructor, AdbSubprocessShellProtocol } from './protocols/index.js'; +import { AdbCommandBase } from "../base.js"; + +import { + AdbSubprocessNoneProtocol, + AdbSubprocessShellProtocol, + type AdbSubprocessProtocol, + type AdbSubprocessProtocolConstructor, +} from "./protocols/index.js"; export interface AdbSubprocessOptions { /** @@ -30,7 +36,7 @@ export interface AdbSubprocessWaitResult { export class AdbSubprocess extends AdbCommandBase { private async createProtocol( - mode: 'pty' | 'raw', + mode: "pty" | "raw", command?: string | string[], options?: Partial ): Promise { @@ -46,14 +52,14 @@ export class AdbSubprocess extends AdbCommandBase { } if (!Constructor) { - throw new Error('No specified protocol is supported by the device'); + throw new Error("No specified protocol is supported by the device"); } if (Array.isArray(command)) { - command = command.join(' '); + command = command.join(" "); } else if (command === undefined) { // spawn the default shell - command = ''; + command = ""; } return await Constructor[mode](this.adb, command); } @@ -68,7 +74,7 @@ export class AdbSubprocess extends AdbCommandBase { command?: string | string[], options?: Partial ): Promise { - return this.createProtocol('pty', command, options); + return this.createProtocol("pty", command, options); } /** @@ -81,7 +87,7 @@ export class AdbSubprocess extends AdbCommandBase { command: string | string[], options?: Partial ): Promise { - return this.createProtocol('raw', command, options); + return this.createProtocol("raw", command, options); } /** @@ -100,13 +106,9 @@ export class AdbSubprocess extends AdbCommandBase { const stderr = new GatherStringStream(); const [, , exitCode] = await Promise.all([ - shell.stdout - .pipeThrough(new DecodeUtf8Stream()) - .pipeTo(stdout), - shell.stderr - .pipeThrough(new DecodeUtf8Stream()) - .pipeTo(stderr), - shell.exit + shell.stdout.pipeThrough(new DecodeUtf8Stream()).pipeTo(stdout), + shell.stderr.pipeThrough(new DecodeUtf8Stream()).pipeTo(stderr), + shell.exit, ]); return { @@ -121,11 +123,12 @@ export class AdbSubprocess extends AdbCommandBase { * @param command The command to run * @returns The entire output of the command */ - public async spawnAndWaitLegacy(command: string | string[]): Promise { - const { stdout } = await this.spawnAndWait( - command, - { protocols: [AdbSubprocessNoneProtocol] } - ); + public async spawnAndWaitLegacy( + command: string | string[] + ): Promise { + const { stdout } = await this.spawnAndWait(command, { + protocols: [AdbSubprocessNoneProtocol], + }); return stdout; } } diff --git a/libraries/adb/src/commands/subprocess/protocols/none.ts b/libraries/adb/src/commands/subprocess/protocols/none.ts index 26eea50d..65982f56 100644 --- a/libraries/adb/src/commands/subprocess/protocols/none.ts +++ b/libraries/adb/src/commands/subprocess/protocols/none.ts @@ -1,8 +1,9 @@ import { DuplexStreamFactory, ReadableStream } from '@yume-chan/stream-extra'; -import type { Adb } from '../../../adb.js'; -import type { AdbSocket } from '../../../socket/index.js'; -import type { AdbSubprocessProtocol } from './types.js'; +import { type Adb } from "../../../adb.js"; +import { type AdbSocket } from "../../../socket/index.js"; + +import { type AdbSubprocessProtocol } from "./types.js"; /** * The legacy shell diff --git a/libraries/adb/src/commands/subprocess/protocols/shell.ts b/libraries/adb/src/commands/subprocess/protocols/shell.ts index 15347d6c..37407f50 100644 --- a/libraries/adb/src/commands/subprocess/protocols/shell.ts +++ b/libraries/adb/src/commands/subprocess/protocols/shell.ts @@ -1,12 +1,23 @@ import { PromiseResolver } from '@yume-chan/async'; -import { pipeFrom, PushReadableStream, StructDeserializeStream, StructSerializeStream, TransformStream, WritableStream, type PushReadableStreamController, type ReadableStream, type WritableStreamDefaultWriter } from '@yume-chan/stream-extra'; +import { + PushReadableStream, + StructDeserializeStream, + StructSerializeStream, + TransformStream, + WritableStream, + pipeFrom, + type PushReadableStreamController, + type ReadableStream, + type WritableStreamDefaultWriter, +} from "@yume-chan/stream-extra"; import Struct, { placeholder, type StructValueType } from '@yume-chan/struct'; -import type { Adb } from '../../../adb.js'; +import { type Adb } from "../../../adb.js"; import { AdbFeatures } from '../../../features.js'; -import type { AdbSocket } from '../../../socket/index.js'; +import { type AdbSocket } from "../../../socket/index.js"; import { encodeUtf8 } from '../../../utils/index.js'; -import type { AdbSubprocessProtocol } from './types.js'; + +import { type AdbSubprocessProtocol } from "./types.js"; export enum AdbShellProtocolId { Stdin, @@ -56,15 +67,17 @@ class StdoutDeserializeStream extends TransformStream{ +class MultiplexStream { private _readable: PushReadableStream; private _readableController!: PushReadableStreamController; - public get readable() { return this._readable; } + public get readable() { + return this._readable; + } private _activeCount = 0; constructor() { - this._readable = new PushReadableStream(controller => { + this._readable = new PushReadableStream((controller) => { this._readableController = controller; }); } @@ -77,13 +90,13 @@ class MultiplexStream{ write: async (chunk) => { await this._readableController.enqueue(chunk); }, - abort: async (e) => { + abort: () => { this._activeCount -= 1; if (this._activeCount === 0) { this._readableController.close(); } }, - close: async () => { + close: () => { this._activeCount -= 1; if (this._activeCount === 0) { this._readableController.close(); @@ -108,27 +121,39 @@ export class AdbSubprocessShellProtocol implements AdbSubprocessProtocol { public static async pty(adb: Adb, command: string) { // TODO: AdbShellSubprocessProtocol: Support setting `XTERM` environment variable - return new AdbSubprocessShellProtocol(await adb.createSocket(`shell,v2,pty:${command}`)); + return new AdbSubprocessShellProtocol( + await adb.createSocket(`shell,v2,pty:${command}`) + ); } public static async raw(adb: Adb, command: string) { - return new AdbSubprocessShellProtocol(await adb.createSocket(`shell,v2,raw:${command}`)); + return new AdbSubprocessShellProtocol( + await adb.createSocket(`shell,v2,raw:${command}`) + ); } private readonly _socket: AdbSocket; private _socketWriter: WritableStreamDefaultWriter; private _stdin: WritableStream; - public get stdin() { return this._stdin; } + public get stdin() { + return this._stdin; + } private _stdout: ReadableStream; - public get stdout() { return this._stdout; } + public get stdout() { + return this._stdout; + } private _stderr: ReadableStream; - public get stderr() { return this._stderr; } + public get stderr() { + return this._stderr; + } private readonly _exit = new PromiseResolver(); - public get exit() { return this._exit.promise; } + public get exit() { + return this._exit.promise; + } public constructor(socket: AdbSocket) { this._socket = socket; @@ -141,27 +166,34 @@ export class AdbSubprocessShellProtocol implements AdbSubprocessProtocol { const [stdout, stderr] = socket.readable .pipeThrough(new StructDeserializeStream(AdbShellProtocolPacket)) - .pipeThrough(new TransformStream({ - transform: (chunk, controller) => { - if (chunk.id === AdbShellProtocolId.Exit) { - this._exit.resolve(new Uint8Array(chunk.data)[0]!); - // We can let `StdoutDeserializeStream` to process `AdbShellProtocolId.Exit`, - // but since we need this `TransformStream` to capture the exit code anyway, - // terminating child streams here is killing two birds with one stone. - controller.terminate(); - return; - } - controller.enqueue(chunk); - } - })) + .pipeThrough( + new TransformStream< + AdbShellProtocolPacket, + AdbShellProtocolPacket + >({ + transform: (chunk, controller) => { + if (chunk.id === AdbShellProtocolId.Exit) { + this._exit.resolve(new Uint8Array(chunk.data)[0]!); + // We can let `StdoutDeserializeStream` to process `AdbShellProtocolId.Exit`, + // but since we need this `TransformStream` to capture the exit code anyway, + // terminating child streams here is killing two birds with one stone. + controller.terminate(); + return; + } + controller.enqueue(chunk); + }, + }) + ) .tee(); - this._stdout = stdout - .pipeThrough(new StdoutDeserializeStream(AdbShellProtocolId.Stdout)); - this._stderr = stderr - .pipeThrough(new StdoutDeserializeStream(AdbShellProtocolId.Stderr)); + this._stdout = stdout.pipeThrough( + new StdoutDeserializeStream(AdbShellProtocolId.Stdout) + ); + this._stderr = stderr.pipeThrough( + new StdoutDeserializeStream(AdbShellProtocolId.Stderr) + ); const multiplexer = new MultiplexStream(); - multiplexer.readable + void multiplexer.readable .pipeThrough(new StructSerializeStream(AdbShellProtocolPacket)) .pipeTo(socket.writable); diff --git a/libraries/adb/src/commands/subprocess/protocols/types.ts b/libraries/adb/src/commands/subprocess/protocols/types.ts index 61c65691..411d620d 100644 --- a/libraries/adb/src/commands/subprocess/protocols/types.ts +++ b/libraries/adb/src/commands/subprocess/protocols/types.ts @@ -1,8 +1,11 @@ -import type { ReadableStream, WritableStream } from '@yume-chan/stream-extra'; -import type { ValueOrPromise } from '@yume-chan/struct'; +import { + type ReadableStream, + type WritableStream, +} from "@yume-chan/stream-extra"; +import { type ValueOrPromise } from "@yume-chan/struct"; -import type { Adb } from '../../../adb.js'; -import type { AdbSocket } from '../../../socket/index.js'; +import { type Adb } from "../../../adb.js"; +import { type AdbSocket } from "../../../socket/index.js"; export interface AdbSubprocessProtocol { /** @@ -56,5 +59,5 @@ export interface AdbSubprocessProtocolConstructor { raw(adb: Adb, command: string): ValueOrPromise; /** Creates a new `AdbShell` by attaching to an exist `AdbSocket` */ - new(socket: AdbSocket): AdbSubprocessProtocol; + new (socket: AdbSocket): AdbSubprocessProtocol; } diff --git a/libraries/adb/src/commands/sync/list.ts b/libraries/adb/src/commands/sync/list.ts index e61f785d..885b52f4 100644 --- a/libraries/adb/src/commands/sync/list.ts +++ b/libraries/adb/src/commands/sync/list.ts @@ -1,41 +1,52 @@ -import type { BufferedReadableStream, WritableStreamDefaultWriter } from '@yume-chan/stream-extra'; -import Struct from '@yume-chan/struct'; +import { + type BufferedReadableStream, + type WritableStreamDefaultWriter, +} from "@yume-chan/stream-extra"; +import Struct from "@yume-chan/struct"; -import { AdbSyncRequestId, adbSyncWriteRequest } from './request.js'; -import { adbSyncReadResponses, AdbSyncResponseId } from './response.js'; -import { AdbSyncLstatResponse, AdbSyncStatResponse, type AdbSyncStat } from './stat.js'; +import { AdbSyncRequestId, adbSyncWriteRequest } from "./request.js"; +import { AdbSyncResponseId, adbSyncReadResponses } from "./response.js"; +import { + AdbSyncLstatResponse, + AdbSyncStatResponse, + type AdbSyncStat, +} from "./stat.js"; export interface AdbSyncEntry extends AdbSyncStat { name: string; } -export const AdbSyncEntryResponse = - new Struct({ littleEndian: true }) - .fields(AdbSyncLstatResponse) - .uint32('nameLength') - .string('name', { lengthField: 'nameLength' }) - .extra({ id: AdbSyncResponseId.Entry as const }); +export const AdbSyncEntryResponse = new Struct({ littleEndian: true }) + .fields(AdbSyncLstatResponse) + .uint32("nameLength") + .string("name", { lengthField: "nameLength" }) + .extra({ id: AdbSyncResponseId.Entry as const }); -export type AdbSyncEntryResponse = typeof AdbSyncEntryResponse['TDeserializeResult']; +export type AdbSyncEntryResponse = + typeof AdbSyncEntryResponse["TDeserializeResult"]; -export const AdbSyncEntry2Response = - new Struct({ littleEndian: true }) - .fields(AdbSyncStatResponse) - .uint32('nameLength') - .string('name', { lengthField: 'nameLength' }) - .extra({ id: AdbSyncResponseId.Entry2 as const }); +export const AdbSyncEntry2Response = new Struct({ littleEndian: true }) + .fields(AdbSyncStatResponse) + .uint32("nameLength") + .string("name", { lengthField: "nameLength" }) + .extra({ id: AdbSyncResponseId.Entry2 as const }); -export type AdbSyncEntry2Response = typeof AdbSyncEntry2Response['TDeserializeResult']; +export type AdbSyncEntry2Response = + typeof AdbSyncEntry2Response["TDeserializeResult"]; export async function* adbSyncOpenDir( stream: BufferedReadableStream, writer: WritableStreamDefaultWriter, path: string, - v2: boolean, + v2: boolean ): AsyncGenerator { if (v2) { await adbSyncWriteRequest(writer, AdbSyncRequestId.List2, path); - for await (const item of adbSyncReadResponses(stream, AdbSyncResponseId.Entry2, AdbSyncEntry2Response)) { + for await (const item of adbSyncReadResponses( + stream, + AdbSyncResponseId.Entry2, + AdbSyncEntry2Response + )) { // `LST2` can return error codes for failed `lstat` calls. // `LIST` just ignores them. // But they only contain `name` so still pretty useless. @@ -46,15 +57,23 @@ export async function* adbSyncOpenDir( } } else { await adbSyncWriteRequest(writer, AdbSyncRequestId.List, path); - for await (const item of adbSyncReadResponses(stream, AdbSyncResponseId.Entry, AdbSyncEntryResponse)) { + for await (const item of adbSyncReadResponses( + stream, + AdbSyncResponseId.Entry, + AdbSyncEntryResponse + )) { // Convert to same format as `AdbSyncEntry2Response` for easier consumption. // However it will add some overhead. yield { mode: item.mode, size: BigInt(item.size), mtime: BigInt(item.mtime), - get type() { return item.type; }, - get permission() { return item.permission; }, + get type() { + return item.type; + }, + get permission() { + return item.permission; + }, name: item.name, }; } diff --git a/libraries/adb/src/commands/sync/pull.ts b/libraries/adb/src/commands/sync/pull.ts index 13c8bf1b..bbc149a4 100644 --- a/libraries/adb/src/commands/sync/pull.ts +++ b/libraries/adb/src/commands/sync/pull.ts @@ -1,45 +1,62 @@ -import { BufferedReadableStream, ReadableStream, WritableStreamDefaultWriter } from '@yume-chan/stream-extra'; -import Struct from '@yume-chan/struct'; +import { + ReadableStream, + type BufferedReadableStream, + type WritableStreamDefaultWriter, +} from "@yume-chan/stream-extra"; +import Struct from "@yume-chan/struct"; -import { AdbSyncRequestId, adbSyncWriteRequest } from './request.js'; -import { adbSyncReadResponses, AdbSyncResponseId } from './response.js'; +import { AdbSyncRequestId, adbSyncWriteRequest } from "./request.js"; +import { AdbSyncResponseId, adbSyncReadResponses } from "./response.js"; -export const AdbSyncDataResponse = - new Struct({ littleEndian: true }) - .uint32('dataLength') - .uint8Array('data', { lengthField: 'dataLength' }) - .extra({ id: AdbSyncResponseId.Data as const }); +export const AdbSyncDataResponse = new Struct({ littleEndian: true }) + .uint32("dataLength") + .uint8Array("data", { lengthField: "dataLength" }) + .extra({ id: AdbSyncResponseId.Data as const }); -export type AdbSyncDataResponse = typeof AdbSyncDataResponse['TDeserializeResult']; +export type AdbSyncDataResponse = + typeof AdbSyncDataResponse["TDeserializeResult"]; export function adbSyncPull( stream: BufferedReadableStream, writer: WritableStreamDefaultWriter, - path: string, + path: string ): ReadableStream { let generator!: AsyncGenerator; - return new ReadableStream({ - async start() { - // TODO: If `ReadableStream.from(AsyncGenerator)` is added to spec, use it instead. - await adbSyncWriteRequest(writer, AdbSyncRequestId.Receive, path); - generator = adbSyncReadResponses(stream, AdbSyncResponseId.Data, AdbSyncDataResponse); + return new ReadableStream( + { + async start() { + // TODO: If `ReadableStream.from(AsyncGenerator)` is added to spec, use it instead. + await adbSyncWriteRequest( + writer, + AdbSyncRequestId.Receive, + path + ); + generator = adbSyncReadResponses( + stream, + AdbSyncResponseId.Data, + AdbSyncDataResponse + ); + }, + async pull(controller) { + const { done, value } = await generator.next(); + if (done) { + controller.close(); + return; + } + controller.enqueue(value.data); + }, + cancel() { + generator.return().catch((e) => { + void e; + }); + throw new Error(`Sync commands can't be canceled.`); + }, }, - async pull(controller) { - const { done, value } = await generator.next(); - if (done) { - controller.close(); - return; - } - controller.enqueue(value.data); - }, - cancel() { - try { - generator.return(); - } catch { } - throw new Error(`Sync commands can't be canceled.`); - }, - }, { - highWaterMark: 16 * 1024, - size(chunk) { return chunk.byteLength; } - }); + { + highWaterMark: 16 * 1024, + size(chunk) { + return chunk.byteLength; + }, + } + ); } diff --git a/libraries/adb/src/commands/sync/push.ts b/libraries/adb/src/commands/sync/push.ts index 335ad4da..b2d752cb 100644 --- a/libraries/adb/src/commands/sync/push.ts +++ b/libraries/adb/src/commands/sync/push.ts @@ -1,13 +1,19 @@ -import { BufferedReadableStream, ChunkStream, pipeFrom, WritableStream, WritableStreamDefaultWriter } from '@yume-chan/stream-extra'; -import Struct from '@yume-chan/struct'; +import { + ChunkStream, + WritableStream, + pipeFrom, + type BufferedReadableStream, + type WritableStreamDefaultWriter, +} from "@yume-chan/stream-extra"; +import Struct from "@yume-chan/struct"; -import { AdbSyncRequestId, adbSyncWriteRequest } from './request.js'; -import { adbSyncReadResponse, AdbSyncResponseId } from './response.js'; -import { LinuxFileType } from './stat.js'; +import { AdbSyncRequestId, adbSyncWriteRequest } from "./request.js"; +import { AdbSyncResponseId, adbSyncReadResponse } from "./response.js"; +import { LinuxFileType } from "./stat.js"; -export const AdbSyncOkResponse = - new Struct({ littleEndian: true }) - .uint32('unused'); +export const AdbSyncOkResponse = new Struct({ littleEndian: true }).uint32( + "unused" +); export const ADB_SYNC_MAX_PACKET_SIZE = 64 * 1024; @@ -17,20 +23,28 @@ export function adbSyncPush( filename: string, mode: number = (LinuxFileType.File << 12) | 0o666, mtime: number = (Date.now() / 1000) | 0, - packetSize: number = ADB_SYNC_MAX_PACKET_SIZE, + packetSize: number = ADB_SYNC_MAX_PACKET_SIZE ): WritableStream { return pipeFrom( new WritableStream({ async start() { const pathAndMode = `${filename},${mode.toString()}`; - await adbSyncWriteRequest(writer, AdbSyncRequestId.Send, pathAndMode); + await adbSyncWriteRequest( + writer, + AdbSyncRequestId.Send, + pathAndMode + ); }, async write(chunk) { await adbSyncWriteRequest(writer, AdbSyncRequestId.Data, chunk); }, async close() { await adbSyncWriteRequest(writer, AdbSyncRequestId.Done, mtime); - await adbSyncReadResponse(stream, AdbSyncResponseId.Ok, AdbSyncOkResponse); + await adbSyncReadResponse( + stream, + AdbSyncResponseId.Ok, + AdbSyncOkResponse + ); }, }), new ChunkStream(packetSize) diff --git a/libraries/adb/src/commands/sync/request.ts b/libraries/adb/src/commands/sync/request.ts index cf850b28..88965577 100644 --- a/libraries/adb/src/commands/sync/request.ts +++ b/libraries/adb/src/commands/sync/request.ts @@ -1,29 +1,27 @@ -import type { WritableStreamDefaultWriter } from '@yume-chan/stream-extra'; -import Struct from '@yume-chan/struct'; +import { type WritableStreamDefaultWriter } from "@yume-chan/stream-extra"; +import Struct from "@yume-chan/struct"; -import { encodeUtf8 } from '../../utils/index.js'; +import { encodeUtf8 } from "../../utils/index.js"; export enum AdbSyncRequestId { - List = 'LIST', - List2 = 'LIS2', - Send = 'SEND', - Lstat = 'STAT', - Stat = 'STA2', - Lstat2 = 'LST2', - Data = 'DATA', - Done = 'DONE', - Receive = 'RECV', + List = "LIST", + List2 = "LIS2", + Send = "SEND", + Lstat = "STAT", + Stat = "STA2", + Lstat2 = "LST2", + Data = "DATA", + Done = "DONE", + Receive = "RECV", } -export const AdbSyncNumberRequest = - new Struct({ littleEndian: true }) - .string('id', { length: 4 }) - .uint32('arg'); +export const AdbSyncNumberRequest = new Struct({ littleEndian: true }) + .string("id", { length: 4 }) + .uint32("arg"); -export const AdbSyncDataRequest = - new Struct({ littleEndian: true }) - .fields(AdbSyncNumberRequest) - .uint8Array('data', { lengthField: 'arg' }); +export const AdbSyncDataRequest = new Struct({ littleEndian: true }) + .fields(AdbSyncNumberRequest) + .uint8Array("data", { lengthField: "arg" }); export async function adbSyncWriteRequest( writer: WritableStreamDefaultWriter, @@ -31,12 +29,12 @@ export async function adbSyncWriteRequest( value: number | string | Uint8Array ): Promise { let buffer: Uint8Array; - if (typeof value === 'number') { + if (typeof value === "number") { buffer = AdbSyncNumberRequest.serialize({ id, arg: value, }); - } else if (typeof value === 'string') { + } else if (typeof value === "string") { buffer = AdbSyncDataRequest.serialize({ id, data: encodeUtf8(value), diff --git a/libraries/adb/src/commands/sync/response.ts b/libraries/adb/src/commands/sync/response.ts index 8e7b7900..4dff704f 100644 --- a/libraries/adb/src/commands/sync/response.ts +++ b/libraries/adb/src/commands/sync/response.ts @@ -1,38 +1,40 @@ -import type { BufferedReadableStream } from '@yume-chan/stream-extra'; -import Struct, { StructValueType, type StructLike } from '@yume-chan/struct'; +import { type BufferedReadableStream } from "@yume-chan/stream-extra"; +import Struct, { + type StructLike, + type StructValueType, +} from "@yume-chan/struct"; -import { decodeUtf8 } from '../../utils/index.js'; +import { decodeUtf8 } from "../../utils/index.js"; export enum AdbSyncResponseId { - Entry = 'DENT', - Entry2 = 'DNT2', - Lstat = 'STAT', - Stat = 'STA2', - Lstat2 = 'LST2', - Done = 'DONE', - Data = 'DATA', - Ok = 'OKAY', - Fail = 'FAIL', + Entry = "DENT", + Entry2 = "DNT2", + Lstat = "STAT", + Stat = "STA2", + Lstat2 = "LST2", + Done = "DONE", + Data = "DATA", + Ok = "OKAY", + Fail = "FAIL", } -export const AdbSyncFailResponse = - new Struct({ littleEndian: true }) - .uint32('messageLength') - .string('message', { lengthField: 'messageLength' }) - .postDeserialize(object => { - throw new Error(object.message); - }); +export const AdbSyncFailResponse = new Struct({ littleEndian: true }) + .uint32("messageLength") + .string("message", { lengthField: "messageLength" }) + .postDeserialize((object) => { + throw new Error(object.message); + }); export async function adbSyncReadResponse( stream: BufferedReadableStream, id: AdbSyncResponseId, - type: StructLike, + type: StructLike ): Promise { const actualId = decodeUtf8(await stream.read(4)); switch (actualId) { case AdbSyncResponseId.Fail: await AdbSyncFailResponse.deserialize(stream); - throw new Error('Unreachable'); + throw new Error("Unreachable"); case id: return await type.deserialize(stream); default: @@ -40,17 +42,19 @@ export async function adbSyncReadResponse( } } -export async function* adbSyncReadResponses>( +export async function* adbSyncReadResponses< + T extends Struct +>( stream: BufferedReadableStream, id: AdbSyncResponseId, - type: T, + type: T ): AsyncGenerator, void, void> { while (true) { const actualId = decodeUtf8(await stream.read(4)); switch (actualId) { case AdbSyncResponseId.Fail: await AdbSyncFailResponse.deserialize(stream); - throw new Error('Unreachable'); + throw new Error("Unreachable"); case AdbSyncResponseId.Done: // `DONE` responses' size are always same as the request's normal response. // @@ -62,7 +66,9 @@ export async function* adbSyncReadResponses yield await type.deserialize(stream); break; default: - throw new Error(`Expected '${id}' or '${AdbSyncResponseId.Done}', but got '${actualId}'`); + throw new Error( + `Expected '${id}' or '${AdbSyncResponseId.Done}', but got '${actualId}'` + ); } } } diff --git a/libraries/adb/src/commands/sync/stat.ts b/libraries/adb/src/commands/sync/stat.ts index 88f93e62..39e25949 100644 --- a/libraries/adb/src/commands/sync/stat.ts +++ b/libraries/adb/src/commands/sync/stat.ts @@ -1,8 +1,11 @@ -import type { BufferedReadableStream, WritableStreamDefaultWriter } from '@yume-chan/stream-extra'; -import Struct, { placeholder } from '@yume-chan/struct'; +import { + type BufferedReadableStream, + type WritableStreamDefaultWriter, +} from "@yume-chan/stream-extra"; +import Struct, { placeholder } from "@yume-chan/struct"; -import { AdbSyncRequestId, adbSyncWriteRequest } from './request.js'; -import { adbSyncReadResponse, AdbSyncResponseId } from './response.js'; +import { AdbSyncRequestId, adbSyncWriteRequest } from "./request.js"; +import { AdbSyncResponseId, adbSyncReadResponse } from "./response.js"; // https://github.com/python/cpython/blob/4e581d64b8aff3e2eda99b12f080c877bb78dfca/Lib/stat.py#L36 export enum LinuxFileType { @@ -24,27 +27,27 @@ export interface AdbSyncStat { ctime?: bigint; } -export const AdbSyncLstatResponse = - new Struct({ littleEndian: true }) - .int32('mode') - .int32('size') - .int32('mtime') - .extra({ - id: AdbSyncResponseId.Lstat as const, - get type() { return this.mode >> 12 as LinuxFileType; }, - get permission() { return this.mode & 0b00001111_11111111; }, - }) - .postDeserialize((object) => { - if ( - object.mode === 0 && - object.size === 0 && - object.mtime === 0 - ) { - throw new Error('lstat failed'); - } - }); +export const AdbSyncLstatResponse = new Struct({ littleEndian: true }) + .int32("mode") + .int32("size") + .int32("mtime") + .extra({ + id: AdbSyncResponseId.Lstat as const, + get type() { + return (this.mode >> 12) as LinuxFileType; + }, + get permission() { + return this.mode & 0b00001111_11111111; + }, + }) + .postDeserialize((object) => { + if (object.mode === 0 && object.size === 0 && object.mtime === 0) { + throw new Error("lstat error"); + } + }); -export type AdbSyncLstatResponse = typeof AdbSyncLstatResponse['TDeserializeResult']; +export type AdbSyncLstatResponse = + typeof AdbSyncLstatResponse["TDeserializeResult"]; export enum AdbSyncStatErrorCode { SUCCESS = 0, @@ -70,51 +73,67 @@ export enum AdbSyncStatErrorCode { ETXTBSY = 26, } -export const AdbSyncStatResponse = - new Struct({ littleEndian: true }) - .uint32('error', placeholder()) - .uint64('dev') - .uint64('ino') - .uint32('mode') - .uint32('nlink') - .uint32('uid') - .uint32('gid') - .uint64('size') - .uint64('atime') - .uint64('mtime') - .uint64('ctime') - .extra({ - id: AdbSyncResponseId.Stat as const, - get type() { return this.mode >> 12 as LinuxFileType; }, - get permission() { return this.mode & 0b00001111_11111111; }, - }) - .postDeserialize((object) => { - if (object.error) { - throw new Error(AdbSyncStatErrorCode[object.error]); - } - }); +export const AdbSyncStatResponse = new Struct({ littleEndian: true }) + .uint32("error", placeholder()) + .uint64("dev") + .uint64("ino") + .uint32("mode") + .uint32("nlink") + .uint32("uid") + .uint32("gid") + .uint64("size") + .uint64("atime") + .uint64("mtime") + .uint64("ctime") + .extra({ + id: AdbSyncResponseId.Stat as const, + get type() { + return (this.mode >> 12) as LinuxFileType; + }, + get permission() { + return this.mode & 0b00001111_11111111; + }, + }) + .postDeserialize((object) => { + if (object.error) { + throw new Error(AdbSyncStatErrorCode[object.error]); + } + }); -export type AdbSyncStatResponse = typeof AdbSyncStatResponse['TDeserializeResult']; +export type AdbSyncStatResponse = + typeof AdbSyncStatResponse["TDeserializeResult"]; export async function adbSyncLstat( stream: BufferedReadableStream, writer: WritableStreamDefaultWriter, path: string, - v2: boolean, + v2: boolean ): Promise { if (v2) { await adbSyncWriteRequest(writer, AdbSyncRequestId.Lstat2, path); - return await adbSyncReadResponse(stream, AdbSyncResponseId.Lstat2, AdbSyncStatResponse); + return await adbSyncReadResponse( + stream, + AdbSyncResponseId.Lstat2, + AdbSyncStatResponse + ); } else { await adbSyncWriteRequest(writer, AdbSyncRequestId.Lstat, path); - const response = await adbSyncReadResponse(stream, AdbSyncResponseId.Lstat, AdbSyncLstatResponse); + const response = await adbSyncReadResponse( + stream, + AdbSyncResponseId.Lstat, + AdbSyncLstatResponse + ); return { mode: response.mode, // Convert to `BigInt` to make it compatible with `AdbSyncStatResponse` size: BigInt(response.size), mtime: BigInt(response.mtime), - get type() { return response.type; }, - get permission() { return response.permission; }, + get type() { + return response.type; + }, + get permission() { + return response.permission; + }, }; } } @@ -122,8 +141,12 @@ export async function adbSyncLstat( export async function adbSyncStat( stream: BufferedReadableStream, writer: WritableStreamDefaultWriter, - path: string, + path: string ): Promise { await adbSyncWriteRequest(writer, AdbSyncRequestId.Stat, path); - return await adbSyncReadResponse(stream, AdbSyncResponseId.Stat, AdbSyncStatResponse); + return await adbSyncReadResponse( + stream, + AdbSyncResponseId.Stat, + AdbSyncStatResponse + ); } diff --git a/libraries/adb/src/commands/sync/sync.ts b/libraries/adb/src/commands/sync/sync.ts index bf52810b..ac184f3b 100644 --- a/libraries/adb/src/commands/sync/sync.ts +++ b/libraries/adb/src/commands/sync/sync.ts @@ -1,15 +1,23 @@ -import { AutoDisposable } from '@yume-chan/event'; -import { BufferedReadableStream, ReadableStream, WrapReadableStream, WrapWritableStream, WritableStream, WritableStreamDefaultWriter } from '@yume-chan/stream-extra'; - -import type { Adb } from '../../adb.js'; -import { AdbFeatures } from '../../features.js'; -import type { AdbSocket } from '../../socket/index.js'; -import { AutoResetEvent } from '../../utils/index.js'; -import { escapeArg } from '../subprocess/index.js'; -import { adbSyncOpenDir, type AdbSyncEntry } from './list.js'; -import { adbSyncPull } from './pull.js'; -import { adbSyncPush } from './push.js'; -import { adbSyncLstat, adbSyncStat } from './stat.js'; +import { AutoDisposable } from "@yume-chan/event"; +import { + BufferedReadableStream, + WrapReadableStream, + WrapWritableStream, + type ReadableStream, + type WritableStream, + type WritableStreamDefaultWriter, +} from "@yume-chan/stream-extra"; + +import { type Adb } from "../../adb.js"; +import { AdbFeatures } from "../../features.js"; +import { type AdbSocket } from "../../socket/index.js"; +import { AutoResetEvent } from "../../utils/index.js"; +import { escapeArg } from "../subprocess/index.js"; + +import { adbSyncOpenDir, type AdbSyncEntry } from "./list.js"; +import { adbSyncPull } from "./pull.js"; +import { adbSyncPush } from "./push.js"; +import { adbSyncLstat, adbSyncStat } from "./stat.js"; /** * A simplified `dirname` function that only handles absolute unix paths. @@ -17,12 +25,12 @@ import { adbSyncLstat, adbSyncStat } from './stat.js'; * @returns the directory name of the input path */ export function dirname(path: string): string { - const end = path.lastIndexOf('/'); + const end = path.lastIndexOf("/"); if (end === -1) { throw new Error(`Invalid path`); } if (end === 0) { - return '/'; + return "/"; } return path.substring(0, end); } @@ -51,7 +59,10 @@ export class AdbSync extends AutoDisposable { public get needPushMkdirWorkaround(): boolean { // https://android.googlesource.com/platform/packages/modules/adb/+/91768a57b7138166e0a3d11f79cd55909dda7014/client/file_sync_client.cpp#1361 - return this.adb.features.includes(AdbFeatures.ShellV2) && !this.fixedPushMkdir; + return ( + this.adb.features.includes(AdbFeatures.ShellV2) && + !this.fixedPushMkdir + ); } public constructor(adb: Adb, socket: AdbSocket) { @@ -66,7 +77,12 @@ export class AdbSync extends AutoDisposable { await this.sendLock.wait(); try { - return adbSyncLstat(this.stream, this.writer, path, this.supportsStat); + return adbSyncLstat( + this.stream, + this.writer, + path, + this.supportsStat + ); } finally { this.sendLock.notify(); } @@ -74,7 +90,7 @@ export class AdbSync extends AutoDisposable { public async stat(path: string) { if (!this.supportsStat) { - throw new Error('Not supported'); + throw new Error("Not supported"); } await this.sendLock.wait(); @@ -88,7 +104,7 @@ export class AdbSync extends AutoDisposable { public async isDirectory(path: string): Promise { try { - await this.lstat(path + '/'); + await this.lstat(path + "/"); return true; } catch (e) { return false; @@ -101,7 +117,12 @@ export class AdbSync extends AutoDisposable { await this.sendLock.wait(); try { - yield* adbSyncOpenDir(this.stream, this.writer, path, this.supportsList2); + yield* adbSyncOpenDir( + this.stream, + this.writer, + path, + this.supportsList2 + ); } finally { this.sendLock.notify(); } @@ -127,7 +148,7 @@ export class AdbSync extends AutoDisposable { await this.sendLock.wait(); return adbSyncPull(this.stream, this.writer, filename); }, - close: async () => { + close: () => { this.sendLock.notify(); }, }); @@ -144,7 +165,7 @@ export class AdbSync extends AutoDisposable { public write( filename: string, mode?: number, - mtime?: number, + mtime?: number ): WritableStream { return new WrapWritableStream({ start: async () => { @@ -155,8 +176,8 @@ export class AdbSync extends AutoDisposable { // Ignore the result. // TODO: sync: test push mkdir workaround (need an Android 8 device) await this.adb.subprocess.spawnAndWait([ - 'mkdir', - '-p', + "mkdir", + "-p", escapeArg(dirname(filename)), ]); } @@ -166,12 +187,12 @@ export class AdbSync extends AutoDisposable { this.writer, filename, mode, - mtime, + mtime ); }, - close: async () => { + close: () => { this.sendLock.notify(); - } + }, }); } diff --git a/libraries/adb/src/crypto.ts b/libraries/adb/src/crypto.ts index f61a0d43..ac1a7827 100644 --- a/libraries/adb/src/crypto.ts +++ b/libraries/adb/src/crypto.ts @@ -1,4 +1,7 @@ -import { getBigUint64, setBigUint64 } from '@yume-chan/dataview-bigint-polyfill/esm/fallback.js'; +import { + getBigUint64, + setBigUint64, +} from "@yume-chan/dataview-bigint-polyfill/esm/fallback.js"; const BigInt0 = BigInt(0); const BigInt1 = BigInt(1); @@ -12,7 +15,11 @@ const BigInt64 = BigInt(64); * Only supports Big-Endian, because that's what ADB uses. * @param byteOffset The place in the buffer at which the value should be retrieved. */ -export function getBigUint(dataView: DataView, byteOffset: number, length: number): bigint { +export function getBigUint( + dataView: DataView, + byteOffset: number, + length: number +): bigint { let result = BigInt0; // Currently `length` must be a multiplication of 8 @@ -34,7 +41,12 @@ export function getBigUint(dataView: DataView, byteOffset: number, length: numbe * @param littleEndian If `false` or `undefined`, a big-endian value should be written, * otherwise a little-endian value should be written. */ -export function setBigUint(dataView: DataView, byteOffset: number, value: bigint, littleEndian?: boolean) { +export function setBigUint( + dataView: DataView, + byteOffset: number, + value: bigint, + littleEndian?: boolean +) { const start = byteOffset; if (littleEndian) { @@ -98,7 +110,7 @@ export function parsePrivateKey(key: Uint8Array): [n: bigint, d: bigint] { // I can't understand, but it does work // Only used with numbers smaller than 2^32 so doesn't need BigInt export function modInverse(a: number, m: number) { - a = (a % m + m) % m; + a = ((a % m) + m) % m; if (!a || m < 2) { return NaN; // invalid input } @@ -115,26 +127,24 @@ export function modInverse(a: number, m: number) { // find the inverse let x = 1; let y = 0; - for (let i = s.length - 2; i >= 0; --i) { + for (let i = s.length - 2; i >= 0; i -= 1) { [x, y] = [y, x - y * Math.floor(s[i]!.a / s[i]!.b)]; } - return (y % m + m) % m; + return ((y % m) + m) % m; } export function calculatePublicKeyLength() { return 4 + 4 + 2048 / 8 + 2048 / 8 + 4; } -export function calculatePublicKey( - privateKey: Uint8Array -): Uint8Array; +export function calculatePublicKey(privateKey: Uint8Array): Uint8Array; export function calculatePublicKey( privateKey: Uint8Array, - output: Uint8Array, + output: Uint8Array ): number; export function calculatePublicKey( privateKey: Uint8Array, - output?: Uint8Array, + output?: Uint8Array ): Uint8Array | number { // Android has its own public key generation algorithm // See https://android.googlesource.com/platform/system/core.git/+/91784040db2b9273687f88d8b95f729d4a61ecc2/libcrypto_utils/android_pubkey.cpp#111 @@ -156,20 +166,24 @@ export function calculatePublicKey( // extract `n` from private key const [n] = parsePrivateKey(privateKey); - let outputType: 'Uint8Array' | 'number'; + let outputType: "Uint8Array" | "number"; const outputLength = calculatePublicKeyLength(); if (!output) { output = new Uint8Array(outputLength); - outputType = 'Uint8Array'; + outputType = "Uint8Array"; } else { if (output.byteLength < outputLength) { - throw new Error('output buffer is too small'); + throw new Error("output buffer is too small"); } - outputType = 'number'; + outputType = "number"; } - const outputView = new DataView(output.buffer, output.byteOffset, output.byteLength); + const outputView = new DataView( + output.buffer, + output.byteOffset, + output.byteLength + ); let outputOffset = 0; // modulusLengthInWords @@ -179,7 +193,10 @@ export function calculatePublicKey( // Calculate `n0inv` // Don't know why need to multiple -1 // Didn't exist in Android codebase - const n0inv = modInverse(Number(BigInt.asUintN(32, n) * BigInt(-1)), 2 ** 32); + const n0inv = modInverse( + Number(BigInt.asUintN(32, n) * BigInt(-1)), + 2 ** 32 + ); outputView.setUint32(outputOffset, n0inv, true); outputOffset += 4; @@ -188,14 +205,14 @@ export function calculatePublicKey( outputOffset += 256; // Calculate rr = (2^(rsa_size)) ^ 2 mod n - let rr = BigInt(2) ** BigInt(4096) % n; + const rr = BigInt(2) ** BigInt(4096) % n; outputOffset += setBigUint(outputView, outputOffset, rr, true); // exponent outputView.setUint32(outputOffset, 65537, true); outputOffset += 4; - if (outputType === 'Uint8Array') { + if (outputType === "Uint8Array") { return output; } else { return outputLength; @@ -209,7 +226,11 @@ export function calculatePublicKey( * * See https://en.wikipedia.org/wiki/Modular_exponentiation#Implementation_in_Lua */ -export function powMod(base: bigint, exponent: bigint, modulus: bigint): bigint { +export function powMod( + base: bigint, + exponent: bigint, + modulus: bigint +): bigint { if (modulus === BigInt1) { return BigInt0; } @@ -219,7 +240,7 @@ export function powMod(base: bigint, exponent: bigint, modulus: bigint): bigint while (exponent > BigInt0) { if (BigInt.asUintN(1, exponent) === BigInt1) { - r = r * base % modulus; + r = (r * base) % modulus; } exponent >>= BigInt1; @@ -238,12 +259,22 @@ export const ASN1_OID = 0x06; // PKCS#1 SHA-1 hash digest info export const SHA1_DIGEST_INFO = new Uint8Array([ - ASN1_SEQUENCE, 0x0d + SHA1_DIGEST_LENGTH, - ASN1_SEQUENCE, 0x09, + ASN1_SEQUENCE, + 0x0d + SHA1_DIGEST_LENGTH, + ASN1_SEQUENCE, + 0x09, // SHA-1 (1 3 14 3 2 26) - ASN1_OID, 0x05, 1 * 40 + 3, 14, 3, 2, 26, - ASN1_NULL, 0x00, - ASN1_OCTET_STRING, SHA1_DIGEST_LENGTH + ASN1_OID, + 0x05, + 1 * 40 + 3, + 14, + 3, + 2, + 26, + ASN1_NULL, + 0x00, + ASN1_OCTET_STRING, + SHA1_DIGEST_LENGTH, ]); // SubtleCrypto.sign() will hash the given data and sign the hash @@ -265,7 +296,8 @@ export function sign(privateKey: Uint8Array, data: Uint8Array): Uint8Array { padded[index] = 1; index += 1; - const fillLength = padded.length - SHA1_DIGEST_INFO.length - data.length - 1; + const fillLength = + padded.length - SHA1_DIGEST_INFO.length - data.length - 1; while (index < fillLength) { padded[index] = 0xff; index += 1; @@ -282,11 +314,7 @@ export function sign(privateKey: Uint8Array, data: Uint8Array): Uint8Array { // Encryption // signature = padded ** d % n const view = new DataView(padded.buffer); - const signature = powMod( - getBigUint(view, 0, view.byteLength), - d, - n - ); + const signature = powMod(getBigUint(view, 0, view.byteLength), d, n); // `padded` is not used anymore, // re-use the buffer to store the result diff --git a/libraries/adb/src/index.ts b/libraries/adb/src/index.ts index ea616238..3e140e36 100644 --- a/libraries/adb/src/index.ts +++ b/libraries/adb/src/index.ts @@ -1,10 +1,9 @@ - -export * from './adb.js'; -export * from './auth.js'; -export * from './backend.js'; -export * from './commands/index.js'; -export * from './crypto.js'; -export * from './features.js'; -export * from './packet.js'; -export * from './socket/index.js'; -export * from './utils/index.js'; +export * from "./adb.js"; +export * from "./auth.js"; +export * from "./backend.js"; +export * from "./commands/index.js"; +export * from "./crypto.js"; +export * from "./features.js"; +export * from "./packet.js"; +export * from "./socket/index.js"; +export * from "./utils/index.js"; diff --git a/libraries/adb/src/packet.ts b/libraries/adb/src/packet.ts index fd44db94..cc5389dc 100644 --- a/libraries/adb/src/packet.ts +++ b/libraries/adb/src/packet.ts @@ -1,34 +1,32 @@ -import { TransformStream } from '@yume-chan/stream-extra'; -import Struct from '@yume-chan/struct'; +import { TransformStream } from "@yume-chan/stream-extra"; +import Struct from "@yume-chan/struct"; export enum AdbCommand { - Auth = 0x48545541, // 'AUTH' - Close = 0x45534c43, // 'CLSE' + Auth = 0x48545541, // 'AUTH' + Close = 0x45534c43, // 'CLSE' Connect = 0x4e584e43, // 'CNXN' - OK = 0x59414b4f, // 'OKAY' - Open = 0x4e45504f, // 'OPEN' - Write = 0x45545257, // 'WRTE' + OK = 0x59414b4f, // 'OKAY' + Open = 0x4e45504f, // 'OPEN' + Write = 0x45545257, // 'WRTE' } -export const AdbPacketHeader = - new Struct({ littleEndian: true }) - .uint32('command') - .uint32('arg0') - .uint32('arg1') - .uint32('payloadLength') - .uint32('checksum') - .int32('magic'); +export const AdbPacketHeader = new Struct({ littleEndian: true }) + .uint32("command") + .uint32("arg0") + .uint32("arg1") + .uint32("payloadLength") + .uint32("checksum") + .int32("magic"); -export type AdbPacketHeader = typeof AdbPacketHeader['TDeserializeResult']; +export type AdbPacketHeader = typeof AdbPacketHeader["TDeserializeResult"]; -type AdbPacketHeaderInit = typeof AdbPacketHeader['TInit']; +type AdbPacketHeaderInit = typeof AdbPacketHeader["TInit"]; -export const AdbPacket = - new Struct({ littleEndian: true }) - .fields(AdbPacketHeader) - .uint8Array('payload', { lengthField: 'payloadLength' }); +export const AdbPacket = new Struct({ littleEndian: true }) + .fields(AdbPacketHeader) + .uint8Array("payload", { lengthField: "payloadLength" }); -export type AdbPacket = typeof AdbPacket['TDeserializeResult']; +export type AdbPacket = typeof AdbPacket["TDeserializeResult"]; /** * `AdbPacketData` contains all the useful fields of `AdbPacket`. @@ -40,29 +38,41 @@ export type AdbPacket = typeof AdbPacket['TDeserializeResult']; * however, `AdbPacketDispatcher` will transform `AdbPacketData` to `AdbPacketInit` for you, * so `AdbSocket#writable#write` only needs `AdbPacketData`. */ -export type AdbPacketData = Omit; +export type AdbPacketData = Omit< + typeof AdbPacket["TInit"], + "checksum" | "magic" +>; // All fields except `magic`, which can be calculated in `AdbPacketSerializeStream` -export type AdbPacketInit = Omit; +export type AdbPacketInit = Omit; export function calculateChecksum(payload: Uint8Array): number; export function calculateChecksum(init: AdbPacketData): AdbPacketInit; -export function calculateChecksum(payload: Uint8Array | AdbPacketData): number | AdbPacketInit { +export function calculateChecksum( + payload: Uint8Array | AdbPacketData +): number | AdbPacketInit { if (payload instanceof Uint8Array) { return payload.reduce((result, item) => result + item, 0); } else { - (payload as AdbPacketInit).checksum = calculateChecksum(payload.payload); + (payload as AdbPacketInit).checksum = calculateChecksum( + payload.payload + ); return payload as AdbPacketInit; } } -export class AdbPacketSerializeStream extends TransformStream{ +export class AdbPacketSerializeStream extends TransformStream< + AdbPacketInit, + Uint8Array +> { public constructor() { super({ - transform: async (init, controller) => { + transform: (init, controller) => { // This syntax is ugly, but I don't want to create a new object. - (init as unknown as AdbPacketHeaderInit).magic = init.command ^ 0xFFFFFFFF; - (init as unknown as AdbPacketHeaderInit).payloadLength = init.payload.byteLength; + (init as unknown as AdbPacketHeaderInit).magic = + init.command ^ 0xffffffff; + (init as unknown as AdbPacketHeaderInit).payloadLength = + init.payload.byteLength; controller.enqueue( AdbPacketHeader.serialize( diff --git a/libraries/adb/src/socket/dispatcher.ts b/libraries/adb/src/socket/dispatcher.ts index 14b00bb5..c36de67c 100644 --- a/libraries/adb/src/socket/dispatcher.ts +++ b/libraries/adb/src/socket/dispatcher.ts @@ -1,11 +1,22 @@ -import { AsyncOperationManager, PromiseResolver } from '@yume-chan/async'; -import type { RemoveEventListener } from '@yume-chan/event'; -import { AbortController, WritableStream, WritableStreamDefaultWriter, type ReadableWritablePair } from '@yume-chan/stream-extra'; -import { EMPTY_UINT8_ARRAY, type ValueOrPromise } from '@yume-chan/struct'; - -import { AdbCommand, calculateChecksum, type AdbPacketData, type AdbPacketInit } from '../packet.js'; -import { decodeUtf8, encodeUtf8 } from '../utils/index.js'; -import { AdbSocket, AdbSocketController } from './socket.js'; +import { AsyncOperationManager, PromiseResolver } from "@yume-chan/async"; +import { type RemoveEventListener } from "@yume-chan/event"; +import { + AbortController, + WritableStream, + type ReadableWritablePair, + type WritableStreamDefaultWriter, +} from "@yume-chan/stream-extra"; +import { EMPTY_UINT8_ARRAY, type ValueOrPromise } from "@yume-chan/struct"; + +import { + AdbCommand, + calculateChecksum, + type AdbPacketData, + type AdbPacketInit, +} from "../packet.js"; +import { decodeUtf8, encodeUtf8 } from "../utils/index.js"; + +import { AdbSocketController, type AdbSocket } from "./socket.js"; export interface AdbPacketDispatcherOptions { calculateChecksum: boolean; @@ -19,7 +30,9 @@ export interface AdbPacketDispatcherOptions { maxPayloadSize: number; } -export type AdbIncomingSocketHandler = (socket: AdbSocket) => ValueOrPromise; +export type AdbIncomingSocketHandler = ( + socket: AdbSocket +) => ValueOrPromise; export interface Closeable { close(): ValueOrPromise; @@ -50,7 +63,9 @@ export class AdbPacketDispatcher implements Closeable { private _closed = false; private _disconnected = new PromiseResolver(); - public get disconnected() { return this._disconnected.promise; } + public get disconnected() { + return this._disconnected.promise; + } private _incomingSocketHandlers: Set = new Set(); @@ -63,50 +78,68 @@ export class AdbPacketDispatcher implements Closeable { this.options = options; connection.readable - .pipeTo(new WritableStream({ - write: async (packet) => { - switch (packet.command) { - case AdbCommand.OK: - this.handleOk(packet); - break; - case AdbCommand.Close: - await this.handleClose(packet); - break; - case AdbCommand.Write: - if (this.sockets.has(packet.arg1)) { - await this.sockets.get(packet.arg1)!.enqueue(packet.payload); - await this.sendPacket(AdbCommand.OK, packet.arg1, packet.arg0); + .pipeTo( + new WritableStream({ + write: async (packet) => { + switch (packet.command) { + case AdbCommand.OK: + this.handleOk(packet); break; - } - throw new Error(`Unknown local socket id: ${packet.arg1}`); - case AdbCommand.Open: - await this.handleOpen(packet); - break; - default: - // Junk data may only appear in the authentication phase, - // since the dispatcher only works after authentication, - // all packets should have a valid command. - // (although it's possible that Adb added new commands in the future) - throw new Error(`Unknown command: ${packet.command.toString(16)}`); - } + case AdbCommand.Close: + await this.handleClose(packet); + break; + case AdbCommand.Write: + if (this.sockets.has(packet.arg1)) { + await this.sockets + .get(packet.arg1)! + .enqueue(packet.payload); + await this.sendPacket( + AdbCommand.OK, + packet.arg1, + packet.arg0 + ); + break; + } + throw new Error( + `Unknown local socket id: ${packet.arg1}` + ); + case AdbCommand.Open: + await this.handleOpen(packet); + break; + default: + // Junk data may only appear in the authentication phase, + // since the dispatcher only works after authentication, + // all packets should have a valid command. + // (although it's possible that Adb added new commands in the future) + throw new Error( + `Unknown command: ${packet.command.toString( + 16 + )}` + ); + } + }, + }), + { + // There are multiple reasons for the pipe to stop, + // (device disconnection, protocol error, or user abortion) + // if the underlying streams are still open, + // it's still possible to create another ADB connection. + // So don't close `readable` here. + preventCancel: true, + signal: this._abortController.signal, + } + ) + .then( + () => { + this.dispose(); }, - }), { - // There are multiple reasons for the pipe to stop, - // (device disconnection, protocol error, or user abortion) - // if the underlying streams are still open, - // it's still possible to create another ADB connection. - // So don't close `readable` here. - preventCancel: true, - signal: this._abortController.signal, - }) - .then(() => { - this.dispose(); - }, (e) => { - if (!this._closed) { - this._disconnected.reject(e); + (e) => { + if (!this._closed) { + this._disconnected.reject(e); + } + this.dispose(); } - this.dispose(); - }); + ); this._writer = connection.writable.getWriter(); } @@ -126,13 +159,18 @@ export class AdbPacketDispatcher implements Closeable { // Maybe the device is responding to a packet of last connection // Tell the device to close the socket - this.sendPacket(AdbCommand.Close, packet.arg1, packet.arg0); + void this.sendPacket(AdbCommand.Close, packet.arg1, packet.arg0); } private async handleClose(packet: AdbPacketData) { // If the socket is still pending - if (packet.arg0 === 0 && - this.initializers.reject(packet.arg1, new Error('Socket open failed'))) { + if ( + packet.arg0 === 0 && + this.initializers.reject( + packet.arg1, + new Error("Socket open failed") + ) + ) { // Device failed to create the socket // (unknown service string, failed to execute command, etc.) // it doesn't break the connection, @@ -153,9 +191,13 @@ export class AdbPacketDispatcher implements Closeable { if (socket) { // The device want to close the socket if (!socket.closed) { - await this.sendPacket(AdbCommand.Close, packet.arg1, packet.arg0); + await this.sendPacket( + AdbCommand.Close, + packet.arg1, + packet.arg0 + ); } - socket.dispose(); + await socket.dispose(); this.sockets.delete(packet.arg1); return; } @@ -170,7 +212,9 @@ export class AdbPacketDispatcher implements Closeable { * @param handler A function to call with new incoming sockets. It must return `true` if it accepts the socket. * @returns A function to remove the handler. */ - public onIncomingSocket(handler: AdbIncomingSocketHandler): RemoveEventListener { + public onIncomingSocket( + handler: AdbIncomingSocketHandler + ): RemoveEventListener { this._incomingSocketHandlers.add(handler); const remove = () => { this._incomingSocketHandlers.delete(handler); @@ -209,16 +253,11 @@ export class AdbPacketDispatcher implements Closeable { public async createSocket(serviceString: string): Promise { if (this.options.appendNullToServiceString) { - serviceString += '\0'; + serviceString += "\0"; } const [localId, initializer] = this.initializers.add(); - await this.sendPacket( - AdbCommand.Open, - localId, - 0, - serviceString - ); + await this.sendPacket(AdbCommand.Open, localId, 0, serviceString); // Fulfilled by `handleOk` const remoteId = await initializer; @@ -245,27 +284,29 @@ export class AdbPacketDispatcher implements Closeable { packetOrCommand: AdbPacketInit | AdbCommand, arg0?: number, arg1?: number, - payload: string | Uint8Array = EMPTY_UINT8_ARRAY, + payload: string | Uint8Array = EMPTY_UINT8_ARRAY ): Promise { let init: AdbPacketData; if (arg0 === undefined) { init = packetOrCommand as AdbPacketInit; } else { - if (typeof payload === 'string') { + if (typeof payload === "string") { payload = encodeUtf8(payload); } init = { command: packetOrCommand as AdbCommand, - arg0: arg0 as number, + arg0: arg0, arg1: arg1 as number, payload, }; } - if (init.payload && - init.payload.byteLength > this.options.maxPayloadSize) { - throw new Error('payload too large'); + if ( + init.payload && + init.payload.byteLength > this.options.maxPayloadSize + ) { + throw new Error("payload too large"); } if (this.options.calculateChecksum) { @@ -281,10 +322,7 @@ export class AdbPacketDispatcher implements Closeable { public async close() { // Send `CLSE` packets for all sockets await Promise.all( - Array.from( - this.sockets.values(), - socket => socket.close(), - ) + Array.from(this.sockets.values(), (socket) => socket.close()) ); // Stop receiving @@ -299,7 +337,9 @@ export class AdbPacketDispatcher implements Closeable { private dispose() { for (const socket of this.sockets.values()) { - socket.dispose(); + socket.dispose().catch((e) => { + void e; + }); } this._disconnected.resolve(); diff --git a/libraries/adb/src/socket/socket.ts b/libraries/adb/src/socket/socket.ts index 0f77af24..eaa1a18e 100644 --- a/libraries/adb/src/socket/socket.ts +++ b/libraries/adb/src/socket/socket.ts @@ -1,9 +1,19 @@ -import { PromiseResolver } from '@yume-chan/async'; -import type { Disposable } from '@yume-chan/event'; -import { ChunkStream, DuplexStreamFactory, pipeFrom, PushReadableStream, WritableStream, type PushReadableStreamController, type ReadableStream, type ReadableWritablePair } from '@yume-chan/stream-extra'; - -import { AdbCommand } from '../packet.js'; -import type { AdbPacketDispatcher, Closeable } from './dispatcher.js'; +import { PromiseResolver } from "@yume-chan/async"; +import { type Disposable } from "@yume-chan/event"; +import { + ChunkStream, + DuplexStreamFactory, + PushReadableStream, + WritableStream, + pipeFrom, + type PushReadableStreamController, + type ReadableStream, + type ReadableWritablePair, +} from "@yume-chan/stream-extra"; + +import { AdbCommand } from "../packet.js"; + +import { type AdbPacketDispatcher, type Closeable } from "./dispatcher.js"; export interface AdbSocketInfo { localId: number; @@ -19,7 +29,13 @@ export interface AdbSocketConstructionOptions extends AdbSocketInfo { highWaterMark?: number | undefined; } -export class AdbSocketController implements AdbSocketInfo, ReadableWritablePair, Closeable, Disposable { +export class AdbSocketController + implements + AdbSocketInfo, + ReadableWritablePair, + Closeable, + Disposable +{ private readonly dispatcher!: AdbPacketDispatcher; public readonly localId!: number; @@ -31,7 +47,9 @@ export class AdbSocketController implements AdbSocketInfo, ReadableWritablePair< private _readable: ReadableStream; private _readableController!: PushReadableStreamController; - public get readable() { return this._readable; } + public get readable() { + return this._readable; + } private _writePromise: PromiseResolver | undefined; public readonly writable: WritableStream; @@ -42,10 +60,14 @@ export class AdbSocketController implements AdbSocketInfo, ReadableWritablePair< * * It's only used by dispatcher to avoid sending another `CLSE` packet to remote. */ - public get closed() { return this._closed; } + public get closed() { + return this._closed; + } private _socket: AdbSocket; - public get socket() { return this._socket; } + public get socket() { + return this._socket; + } public constructor(options: AdbSocketConstructionOptions) { Object.assign(this, options); @@ -69,17 +91,22 @@ export class AdbSocketController implements AdbSocketInfo, ReadableWritablePair< }, dispose: () => { // Error out the pending writes - this._writePromise?.reject(new Error('Socket closed')); + this._writePromise?.reject(new Error("Socket closed")); }, }); this._readable = this._duplex.wrapReadable( - new PushReadableStream(controller => { - this._readableController = controller; - }, { - highWaterMark: options.highWaterMark ?? 16 * 1024, - size(chunk) { return chunk.byteLength; } - }) + new PushReadableStream( + (controller) => { + this._readableController = controller; + }, + { + highWaterMark: options.highWaterMark ?? 16 * 1024, + size(chunk) { + return chunk.byteLength; + }, + } + ) ); this.writable = pipeFrom( @@ -95,8 +122,8 @@ export class AdbSocketController implements AdbSocketInfo, ReadableWritablePair< chunk ); await this._writePromise.promise; - } - }), + }, + }) ), new ChunkStream(this.dispatcher.options.maxPayloadSize) ); @@ -123,7 +150,7 @@ export class AdbSocketController implements AdbSocketInfo, ReadableWritablePair< } public dispose() { - this._duplex.dispose(); + return this._duplex.dispose(); } } @@ -135,16 +162,30 @@ export class AdbSocketController implements AdbSocketInfo, ReadableWritablePair< * `socket.writable.abort()`, `socket.writable.getWriter().abort()`, * `socket.writable.close()` or `socket.writable.getWriter().close()`. */ -export class AdbSocket implements AdbSocketInfo, ReadableWritablePair{ +export class AdbSocket + implements AdbSocketInfo, ReadableWritablePair +{ private _controller: AdbSocketController; - public get localId(): number { return this._controller.localId; } - public get remoteId(): number { return this._controller.remoteId; } - public get localCreated(): boolean { return this._controller.localCreated; } - public get serviceString(): string { return this._controller.serviceString; } + public get localId(): number { + return this._controller.localId; + } + public get remoteId(): number { + return this._controller.remoteId; + } + public get localCreated(): boolean { + return this._controller.localCreated; + } + public get serviceString(): string { + return this._controller.serviceString; + } - public get readable(): ReadableStream { return this._controller.readable; } - public get writable(): WritableStream { return this._controller.writable; } + public get readable(): ReadableStream { + return this._controller.readable; + } + public get writable(): WritableStream { + return this._controller.writable; + } public constructor(controller: AdbSocketController) { this._controller = controller; diff --git a/libraries/adb/src/utils/auto-reset-event.ts b/libraries/adb/src/utils/auto-reset-event.ts index 672fafe9..2aa6a2e6 100644 --- a/libraries/adb/src/utils/auto-reset-event.ts +++ b/libraries/adb/src/utils/auto-reset-event.ts @@ -1,5 +1,5 @@ -import { PromiseResolver } from '@yume-chan/async'; -import type { Disposable } from '@yume-chan/event'; +import { PromiseResolver } from "@yume-chan/async"; +import { type Disposable } from "@yume-chan/event"; export class AutoResetEvent implements Disposable { private readonly list: PromiseResolver[] = []; @@ -34,7 +34,7 @@ export class AutoResetEvent implements Disposable { public dispose() { for (const item of this.list) { - item.reject(new Error('The AutoResetEvent has been disposed')); + item.reject(new Error("The AutoResetEvent has been disposed")); } this.list.length = 0; } diff --git a/libraries/adb/tsconfig.build.json b/libraries/adb/tsconfig.build.json index b4bb73dd..2cb23249 100644 --- a/libraries/adb/tsconfig.build.json +++ b/libraries/adb/tsconfig.build.json @@ -1,3 +1,3 @@ { - "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json" + "extends": "./node_modules/@yume-chan/tsconfig/tsconfig.base.json" } diff --git a/libraries/adb/tsconfig.json b/libraries/adb/tsconfig.json index 220bb2a4..ad740cce 100644 --- a/libraries/adb/tsconfig.json +++ b/libraries/adb/tsconfig.json @@ -1,5 +1,4 @@ { - "references": [ { "path": "../event/tsconfig.build.json" diff --git a/libraries/adb/tsconfig.test.json b/libraries/adb/tsconfig.test.json index 6a105912..70f0e028 100644 --- a/libraries/adb/tsconfig.test.json +++ b/libraries/adb/tsconfig.test.json @@ -3,7 +3,7 @@ "compilerOptions": { "types": [ "node" - ], + ] }, "exclude": [] } diff --git a/libraries/android-bin/.eslintrc.cjs b/libraries/android-bin/.eslintrc.cjs new file mode 100644 index 00000000..40d283a4 --- /dev/null +++ b/libraries/android-bin/.eslintrc.cjs @@ -0,0 +1,11 @@ +module.exports = { + "extends": [ + "@yume-chan" + ], + parserOptions: { + tsconfigRootDir: __dirname, + project: [ + "./tsconfig.build.json" + ], + }, +} diff --git a/libraries/android-bin/.npmignore b/libraries/android-bin/.npmignore new file mode 100644 index 00000000..e44e2e62 --- /dev/null +++ b/libraries/android-bin/.npmignore @@ -0,0 +1,16 @@ +.rush + +# Test +coverage +**/*.spec.ts +**/*.spec.js +**/*.spec.js.map +**/__helpers__ +jest.config.js + +.eslintrc.cjs +tsconfig.json +tsconfig.test.json + +# Logs +*.log diff --git a/libraries/android-bin/package.json b/libraries/android-bin/package.json index a886ad0e..738f74cc 100644 --- a/libraries/android-bin/package.json +++ b/libraries/android-bin/package.json @@ -25,13 +25,16 @@ "main": "esm/index.js", "types": "esm/index.d.ts", "scripts": { - "build": "build-ts-package", - "build:watch": "build-ts-package --incremental", + "build": "tsc -b tsconfig.build.json", + "build:watch": "tsc -b tsconfig.build.json", + "lint": "eslint src/**/*.ts --fix", "prepublishOnly": "npm run build" }, "devDependencies": { - "@yume-chan/ts-package-builder": "workspace:^1.0.0", - "typescript": "^4.8.4" + "@yume-chan/eslint-config": "workspace:^1.0.0", + "@yume-chan/tsconfig": "workspace:^1.0.0", + "eslint": "^8.30.0", + "typescript": "^4.9.4" }, "dependencies": { "@yume-chan/adb": "workspace:^0.0.17", diff --git a/libraries/android-bin/src/bu.ts b/libraries/android-bin/src/bu.ts index cd4d6867..4d0e07b0 100644 --- a/libraries/android-bin/src/bu.ts +++ b/libraries/android-bin/src/bu.ts @@ -4,7 +4,7 @@ import { AdbCommandBase } from "@yume-chan/adb"; export interface AdbBackupOptions { - apps: string[] | 'all' | 'all-including-system'; + apps: string[] | "all" | "all-including-system"; apks: boolean; obbs: boolean; shared: boolean; @@ -14,9 +14,13 @@ export interface AdbBackupOptions { } export class AdbBackup extends AdbCommandBase { - async backup(options: AdbBackupOptions): Promise { + backup(options: AdbBackupOptions): Promise { + void options; + throw new Error("Not implemented"); } - async restore(options: AdbBackupOptions): Promise { + restore(options: AdbBackupOptions): Promise { + void options; + throw new Error("Not implemented"); } } diff --git a/libraries/android-bin/src/bug-report.ts b/libraries/android-bin/src/bug-report.ts index 6ddd7519..967ce853 100644 --- a/libraries/android-bin/src/bug-report.ts +++ b/libraries/android-bin/src/bug-report.ts @@ -1,8 +1,15 @@ // cspell: ignore bugreport // cspell: ignore bugreportz -import { AdbCommandBase, AdbSubprocessShellProtocol } from '@yume-chan/adb'; -import { DecodeUtf8Stream, PushReadableStream, ReadableStream, SplitStringStream, WrapReadableStream, WritableStream } from '@yume-chan/stream-extra'; +import { AdbCommandBase, AdbSubprocessShellProtocol } from "@yume-chan/adb"; +import { + DecodeUtf8Stream, + PushReadableStream, + SplitStringStream, + WrapReadableStream, + WritableStream, + type ReadableStream, +} from "@yume-chan/stream-extra"; export interface BugReportZVersion { major: number; @@ -34,8 +41,11 @@ export class BugReportZ extends AdbCommandBase { return undefined; } - const { stderr, exitCode } = await this.adb.subprocess.spawnAndWait(['bugreportz', '-v']); - if (exitCode !== 0 || stderr === '') { + const { stderr, exitCode } = await this.adb.subprocess.spawnAndWait([ + "bugreportz", + "-v", + ]); + if (exitCode !== 0 || stderr === "") { return undefined; } @@ -68,10 +78,12 @@ export class BugReportZ extends AdbCommandBase { * @param onProgress Progress callback. Only specify this if `supportsProgress` is `true`. * @returns The path of the bugreport file. */ - public async generate(onProgress?: (progress: string, total: string) => void): Promise { + public async generate( + onProgress?: (progress: string, total: string) => void + ): Promise { const process = await this.adb.subprocess.spawn([ - 'bugreportz', - ...(onProgress ? ['-p'] : []), + "bugreportz", + ...(onProgress ? ["-p"] : []), ]); let filename: string | undefined; @@ -79,40 +91,42 @@ export class BugReportZ extends AdbCommandBase { await process.stdout .pipeThrough(new DecodeUtf8Stream()) - .pipeThrough(new SplitStringStream('\n')) - .pipeTo(new WritableStream({ - write(line) { - // `BEGIN:` and `PROGRESS:` only appear when `-p` is specified. - let match = line.match(BugReportZ.PROGRESS_REGEX); - if (match) { - onProgress?.(match[1]!, match[2]!); - } - - match = line.match(BugReportZ.BEGIN_REGEX); - if (match) { - filename = match[1]!; - } - - match = line.match(BugReportZ.OK_REGEX); - if (match) { - filename = match[1]; - } - - match = line.match(BugReportZ.FAIL_REGEX); - if (match) { - // Don't report error now - // We want to gather all output. - error = match[1]; - } - } - })); + .pipeThrough(new SplitStringStream("\n")) + .pipeTo( + new WritableStream({ + write(line) { + // `BEGIN:` and `PROGRESS:` only appear when `-p` is specified. + let match = line.match(BugReportZ.PROGRESS_REGEX); + if (match) { + onProgress?.(match[1]!, match[2]!); + } + + match = line.match(BugReportZ.BEGIN_REGEX); + if (match) { + filename = match[1]!; + } + + match = line.match(BugReportZ.OK_REGEX); + if (match) { + filename = match[1]; + } + + match = line.match(BugReportZ.FAIL_REGEX); + if (match) { + // Don't report error now + // We want to gather all output. + error = match[1]; + } + }, + }) + ); if (error) { throw new Error(error); } if (!filename) { - throw new Error('bugreportz did not return file name'); + throw new Error("bugreportz did not return file name"); } // Design choice: we don't automatically pull the file to avoid more dependency on `@yume-chan/adb` @@ -125,22 +139,34 @@ export class BugReportZ extends AdbCommandBase { public stream(): ReadableStream { return new PushReadableStream(async (controller) => { - const process = await this.adb.subprocess.spawn(['bugreportz', '-s']); + const process = await this.adb.subprocess.spawn([ + "bugreportz", + "-s", + ]); process.stdout - .pipeTo(new WritableStream({ - async write(chunk) { - await controller.enqueue(chunk); - }, - })); + .pipeTo( + new WritableStream({ + async write(chunk) { + await controller.enqueue(chunk); + }, + }) + ) + .catch((e) => { + void e; + }); process.stderr .pipeThrough(new DecodeUtf8Stream()) - .pipeTo(new WritableStream({ - async write(chunk) { - controller.error(new Error(chunk)); - } - })); + .pipeTo( + new WritableStream({ + write(chunk) { + controller.error(new Error(chunk)); + }, + }) + ) + .catch((e) => { + void e; + }); await process.exit; - controller.close(); }); } } @@ -149,7 +175,7 @@ export class BugReportZ extends AdbCommandBase { export class BugReport extends AdbCommandBase { public generate(): ReadableStream { return new WrapReadableStream(async () => { - const process = await this.adb.subprocess.spawn(['bugreport']); + const process = await this.adb.subprocess.spawn(["bugreport"]); return process.stdout; }); } diff --git a/libraries/android-bin/src/demo-mode.ts b/libraries/android-bin/src/demo-mode.ts index 7e0b062a..53399472 100644 --- a/libraries/android-bin/src/demo-mode.ts +++ b/libraries/android-bin/src/demo-mode.ts @@ -4,28 +4,51 @@ // cspell: ignore systemui // cspell: ignore sysui -import { Adb, AdbCommandBase } from '@yume-chan/adb'; +import { type Adb, AdbCommandBase } from "@yume-chan/adb"; + import { Settings } from "./settings.js"; export enum DemoModeSignalStrength { - Hidden = 'null', - Level0 = '0', - Level1 = '1', - Level2 = '2', - Level3 = '3', - Level4 = '4', + Hidden = "null", + Level0 = "0", + Level1 = "1", + Level2 = "2", + Level3 = "3", + Level4 = "4", } // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java;l=1362;drc=3b775bf7ad89902f94e03d191b0d8fbdebf2bdbf -export const DemoModeMobileDataTypes = ['1x', '3g', '4g', '4g+', '5g', '5ge', '5g+', - 'e', 'g', 'h', 'h+', 'lte', 'lte+', 'dis', 'not', 'null'] as const; - -export type DemoModeMobileDataType = (typeof DemoModeMobileDataTypes)[number]; +export const DemoModeMobileDataTypes = [ + "1x", + "3g", + "4g", + "4g+", + "5g", + "5ge", + "5g+", + "e", + "g", + "h", + "h+", + "lte", + "lte+", + "dis", + "not", + "null", +] as const; + +export type DemoModeMobileDataType = typeof DemoModeMobileDataTypes[number]; // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java;l=3136 -export const DemoModeStatusBarModes = ['opaque', 'translucent', 'semi-transparent', 'transparent', 'warning'] as const; +export const DemoModeStatusBarModes = [ + "opaque", + "translucent", + "semi-transparent", + "transparent", + "warning", +] as const; -export type DemoModeStatusBarMode = (typeof DemoModeStatusBarModes)[number]; +export type DemoModeStatusBarMode = typeof DemoModeStatusBarModes[number]; export class DemoMode extends AdbCommandBase { private settings: Settings; @@ -35,145 +58,170 @@ export class DemoMode extends AdbCommandBase { this.settings = new Settings(adb); } - public static readonly AllowedSettingKey = 'sysui_demo_allowed'; + public static readonly AllowedSettingKey = "sysui_demo_allowed"; // Demo Mode actually doesn't have a setting indicates its enablement // However Developer Mode menu uses this key // So we can only try our best to guess if it's enabled - public static readonly EnabledSettingKey = 'sysui_tuner_demo_on'; + public static readonly EnabledSettingKey = "sysui_tuner_demo_on"; public async getAllowed(): Promise { - const output = await this.settings.get('global', DemoMode.AllowedSettingKey); - return output.trim() === '1'; + const output = await this.settings.get( + "global", + DemoMode.AllowedSettingKey + ); + return output.trim() === "1"; } public async setAllowed(value: boolean): Promise { if (value) { - await this.settings.put('global', DemoMode.AllowedSettingKey, '1'); + await this.settings.put("global", DemoMode.AllowedSettingKey, "1"); } else { await this.setEnabled(false); - await this.settings.delete('global', DemoMode.AllowedSettingKey); + await this.settings.delete("global", DemoMode.AllowedSettingKey); } } public async getEnabled(): Promise { - const result = await this.settings.get('global', DemoMode.EnabledSettingKey); - return result.trim() === '1'; + const result = await this.settings.get( + "global", + DemoMode.EnabledSettingKey + ); + return result.trim() === "1"; } public async setEnabled(value: boolean): Promise { if (value) { - await this.settings.put('global', DemoMode.EnabledSettingKey, '1'); + await this.settings.put("global", DemoMode.EnabledSettingKey, "1"); } else { - await this.settings.delete('global', DemoMode.EnabledSettingKey); - await this.broadcast('exit'); + await this.settings.delete("global", DemoMode.EnabledSettingKey); + await this.broadcast("exit"); } } - public async broadcast(command: string, extra?: Record): Promise { + public async broadcast( + command: string, + extra?: Record + ): Promise { await this.adb.subprocess.spawnAndWaitLegacy([ - 'am', - 'broadcast', - '-a', - 'com.android.systemui.demo', - '-e', - 'command', + "am", + "broadcast", + "-a", + "com.android.systemui.demo", + "-e", + "command", command, - ...(extra ? Object.entries(extra).flatMap(([key, value]) => ['-e', key, value]) : []), + ...(extra + ? Object.entries(extra).flatMap(([key, value]) => [ + "-e", + key, + value, + ]) + : []), ]); } public async setBatteryLevel(level: number): Promise { - await this.broadcast('battery', { level: level.toString() }); + await this.broadcast("battery", { level: level.toString() }); } public async setBatteryCharging(value: boolean): Promise { - await this.broadcast('battery', { plugged: value.toString() }); + await this.broadcast("battery", { plugged: value.toString() }); } public async setPowerSaveMode(value: boolean): Promise { - await this.broadcast('battery', { powersave: value.toString() }); + await this.broadcast("battery", { powersave: value.toString() }); } public async setAirplaneMode(show: boolean): Promise { - await this.broadcast('network', { airplane: show ? 'show' : 'hide' }); + await this.broadcast("network", { airplane: show ? "show" : "hide" }); } - public async setWifiSignalStrength(value: DemoModeSignalStrength): Promise { - await this.broadcast('network', { wifi: 'show', level: value }); + public async setWifiSignalStrength( + value: DemoModeSignalStrength + ): Promise { + await this.broadcast("network", { wifi: "show", level: value }); } - public async setMobileDataType(value: DemoModeMobileDataType): Promise { + public async setMobileDataType( + value: DemoModeMobileDataType + ): Promise { for (let i = 0; i < 2; i += 1) { - await this.broadcast('network', { - mobile: 'show', - sims: '1', - nosim: 'hide', - slot: '0', + await this.broadcast("network", { + mobile: "show", + sims: "1", + nosim: "hide", + slot: "0", datatype: value, - fully: 'true', - roam: 'false', - level: '4', - inflate: 'false', - activity: 'in', - carriernetworkchange: 'hide', + fully: "true", + roam: "false", + level: "4", + inflate: "false", + activity: "in", + carriernetworkchange: "hide", }); } } - public async setMobileSignalStrength(value: DemoModeSignalStrength): Promise { - await this.broadcast('network', { mobile: 'show', level: value }); + public async setMobileSignalStrength( + value: DemoModeSignalStrength + ): Promise { + await this.broadcast("network", { mobile: "show", level: value }); } public async setNoSimCardIcon(show: boolean): Promise { - await this.broadcast('network', { nosim: show ? 'show' : 'hide' }); + await this.broadcast("network", { nosim: show ? "show" : "hide" }); } public async setStatusBarMode(mode: DemoModeStatusBarMode): Promise { - await this.broadcast('bars', { mode }); + await this.broadcast("bars", { mode }); } public async setVibrateModeEnabled(value: boolean): Promise { // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java;l=103 - await this.broadcast('status', { volume: value ? 'vibrate' : 'hide' }); + await this.broadcast("status", { volume: value ? "vibrate" : "hide" }); } public async setBluetoothConnected(value: boolean): Promise { // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java;l=114 - await this.broadcast('status', { bluetooth: value ? 'connected' : 'hide' }); + await this.broadcast("status", { + bluetooth: value ? "connected" : "hide", + }); } public async setLocatingIcon(show: boolean): Promise { - await this.broadcast('status', { location: show ? 'show' : 'hide' }); + await this.broadcast("status", { location: show ? "show" : "hide" }); } public async setAlarmIcon(show: boolean): Promise { - await this.broadcast('status', { alarm: show ? 'show' : 'hide' }); + await this.broadcast("status", { alarm: show ? "show" : "hide" }); } public async setSyncingIcon(show: boolean): Promise { - await this.broadcast('status', { sync: show ? 'show' : 'hide' }); + await this.broadcast("status", { sync: show ? "show" : "hide" }); } public async setMuteIcon(show: boolean): Promise { - await this.broadcast('status', { mute: show ? 'show' : 'hide' }); + await this.broadcast("status", { mute: show ? "show" : "hide" }); } public async setSpeakerPhoneIcon(show: boolean): Promise { - await this.broadcast('status', { speakerphone: show ? 'show' : 'hide' }); + await this.broadcast("status", { + speakerphone: show ? "show" : "hide", + }); } public async setNotificationsVisibility(show: boolean): Promise { // https://cs.android.com/android/platform/superproject/+/master:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java;l=3131 - await this.broadcast('notifications', { visible: show.toString() }); + await this.broadcast("notifications", { visible: show.toString() }); } public async setTime(hour: number, minute: number): Promise { - await this.broadcast('clock', { + await this.broadcast("clock", { // cspell: disable-next-line hhmm: - hour.toString().padStart(2, '0') + - minute.toString().padStart(2, '0'), + hour.toString().padStart(2, "0") + + minute.toString().padStart(2, "0"), }); } } diff --git a/libraries/android-bin/src/logcat.ts b/libraries/android-bin/src/logcat.ts index 2dc17937..16b2c1a0 100644 --- a/libraries/android-bin/src/logcat.ts +++ b/libraries/android-bin/src/logcat.ts @@ -1,8 +1,18 @@ // cspell: ignore logcat -import { AdbCommandBase, AdbSubprocessNoneProtocol } from '@yume-chan/adb'; -import { BufferedTransformStream, DecodeUtf8Stream, SplitStringStream, WrapReadableStream, WritableStream, type ReadableStream } from '@yume-chan/stream-extra'; -import Struct, { decodeUtf8, StructAsyncDeserializeStream } from '@yume-chan/struct'; +import { AdbCommandBase, AdbSubprocessNoneProtocol } from "@yume-chan/adb"; +import { + BufferedTransformStream, + DecodeUtf8Stream, + SplitStringStream, + WrapReadableStream, + WritableStream, + type ReadableStream, +} from "@yume-chan/stream-extra"; +import Struct, { + decodeUtf8, + type StructAsyncDeserializeStream, +} from "@yume-chan/struct"; // `adb logcat` is an alias to `adb shell logcat` // so instead of adding to core library, it's implemented here @@ -34,17 +44,18 @@ export enum AndroidLogPriority { } // https://cs.android.com/android/platform/superproject/+/master:system/logging/liblog/logprint.cpp;l=140;drc=8dbf3b2bb6b6d1652d9797e477b9abd03278bb79 -export const AndroidLogPriorityToCharacter: Record = { - [AndroidLogPriority.Unknown]: '?', - [AndroidLogPriority.Default]: '?', - [AndroidLogPriority.Verbose]: 'V', - [AndroidLogPriority.Debug]: 'D', - [AndroidLogPriority.Info]: 'I', - [AndroidLogPriority.Warn]: 'W', - [AndroidLogPriority.Error]: 'E', - [AndroidLogPriority.Fatal]: 'F', - [AndroidLogPriority.Silent]: 'S', -}; +export const AndroidLogPriorityToCharacter: Record = + { + [AndroidLogPriority.Unknown]: "?", + [AndroidLogPriority.Default]: "?", + [AndroidLogPriority.Verbose]: "V", + [AndroidLogPriority.Debug]: "D", + [AndroidLogPriority.Info]: "I", + [AndroidLogPriority.Warn]: "W", + [AndroidLogPriority.Error]: "E", + [AndroidLogPriority.Fatal]: "F", + [AndroidLogPriority.Silent]: "S", + }; export enum LogcatFormat { Brief, @@ -54,7 +65,7 @@ export enum LogcatFormat { Raw, Time, ThreadTime, - Long + Long, } export interface LogcatFormatModifiers { @@ -76,23 +87,25 @@ export interface LogcatOptions { const NANOSECONDS_PER_SECOND = BigInt(1e9); // https://cs.android.com/android/platform/superproject/+/master:system/logging/liblog/include/log/log_read.h;l=39;drc=82b5738732161dbaafb2e2f25cce19cd26b9157d -export const LoggerEntry = - new Struct({ littleEndian: true }) - .uint16('payloadSize') - .uint16('headerSize') - .int32('pid') - .uint32('tid') - .uint32('second') - .uint32('nanoseconds') - .uint32('logId') - .uint32('uid') - .extra({ - get timestamp() { - return BigInt(this.second) * NANOSECONDS_PER_SECOND + BigInt(this.nanoseconds); - }, - }); - -export type LoggerEntry = typeof LoggerEntry['TDeserializeResult']; +export const LoggerEntry = new Struct({ littleEndian: true }) + .uint16("payloadSize") + .uint16("headerSize") + .int32("pid") + .uint32("tid") + .uint32("second") + .uint32("nanoseconds") + .uint32("logId") + .uint32("uid") + .extra({ + get timestamp() { + return ( + BigInt(this.second) * NANOSECONDS_PER_SECOND + + BigInt(this.nanoseconds) + ); + }, + }); + +export type LoggerEntry = typeof LoggerEntry["TDeserializeResult"]; // https://cs.android.com/android/platform/superproject/+/master:system/logging/liblog/logprint.cpp;drc=bbe77d66e7bee8bd1f0bc7e5492b5376b0207ef6;bpv=0 export interface AndroidLogEntry extends LoggerEntry { @@ -107,24 +120,28 @@ export function formatAndroidLogEntry( format: LogcatFormat = LogcatFormat.Brief, modifier?: LogcatFormatModifiers ) { - const uid = modifier?.uid ? `${entry.uid.toString().padStart(5)}:` : ''; + const uid = modifier?.uid ? `${entry.uid.toString().padStart(5)}:` : ""; switch (format) { // TODO: implement other formats default: - return `${AndroidLogPriorityToCharacter[entry.priority]}/${entry.tag.padEnd(8)}(${uid}${entry.pid.toString().padStart(5)}): ${entry.message}`; + return `${ + AndroidLogPriorityToCharacter[entry.priority] + }/${entry.tag.padEnd(8)}(${uid}${entry.pid + .toString() + .padStart(5)}): ${entry.message}`; } } function findTagEnd(payload: Uint8Array) { - for (const separator of [0, ' '.charCodeAt(0), ':'.charCodeAt(0)]) { + for (const separator of [0, " ".charCodeAt(0), ":".charCodeAt(0)]) { const index = payload.indexOf(separator); if (index !== -1) { return index; } } - const index = payload.findIndex(x => x >= 0x7f); + const index = payload.findIndex((x) => x >= 0x7f); if (index !== -1) { return index; } @@ -132,8 +149,12 @@ function findTagEnd(payload: Uint8Array) { return payload.length; } -export async function deserializeAndroidLogEntry(stream: StructAsyncDeserializeStream): Promise { - const entry = await LoggerEntry.deserialize(stream) as unknown as AndroidLogEntry; +export async function deserializeAndroidLogEntry( + stream: StructAsyncDeserializeStream +): Promise { + const entry = (await LoggerEntry.deserialize( + stream + )) as unknown as AndroidLogEntry; if (entry.headerSize !== LoggerEntry.size) { await stream.read(entry.headerSize - LoggerEntry.size); } @@ -146,7 +167,10 @@ export async function deserializeAndroidLogEntry(stream: StructAsyncDeserializeS payload = payload.subarray(1); const tagEnd = findTagEnd(payload); entry.tag = decodeUtf8(payload.subarray(0, tagEnd)); - entry.message = tagEnd < payload.length - 1 ? decodeUtf8(payload.subarray(tagEnd + 1)) : ''; + entry.message = + tagEnd < payload.length - 1 + ? decodeUtf8(payload.subarray(tagEnd + 1)) + : ""; return entry; } @@ -166,72 +190,91 @@ export class Logcat extends AdbCommandBase { public static logNameToId(name: string): LogId { const key = name[0]!.toUpperCase() + name.substring(1); - return (LogId as any)[key]; + return LogId[key as keyof typeof LogId]; } public static joinLogId(ids: LogId[]): string { - return ids.map(id => Logcat.logIdToName(id)).join(','); + return ids.map((id) => Logcat.logIdToName(id)).join(","); } public static parseSize(value: number, multiplier: string): number { - const MULTIPLIERS = ['', 'Ki', 'Mi', 'Gi']; + const MULTIPLIERS = ["", "Ki", "Mi", "Gi"]; return value * 1024 ** (MULTIPLIERS.indexOf(multiplier) || 0); } // TODO: logcat: Support output format before Android 10 // ref https://android-review.googlesource.com/c/platform/system/core/+/748128 - public static readonly LOG_SIZE_REGEX_10 = /(.*): ring buffer is (.*) (.*)B \((.*) (.*)B consumed\), max entry is (.*) B, max payload is (.*) B/; + public static readonly LOG_SIZE_REGEX_10 = + /(.*): ring buffer is (.*) (.*)B \((.*) (.*)B consumed\), max entry is (.*) B, max payload is (.*) B/; // Android 11 added `readable` part // ref https://android-review.googlesource.com/c/platform/system/core/+/1390940 - public static readonly LOG_SIZE_REGEX_11 = /(.*): ring buffer is (.*) (.*)B \((.*) (.*)B consumed, (.*) (.*)B readable\), max entry is (.*) B, max payload is (.*) B/; + public static readonly LOG_SIZE_REGEX_11 = + /(.*): ring buffer is (.*) (.*)B \((.*) (.*)B consumed, (.*) (.*)B readable\), max entry is (.*) B, max payload is (.*) B/; public async getLogSize(ids?: LogId[]): Promise { const { stdout } = await this.adb.subprocess.spawn([ - 'logcat', - '-g', - ...(ids ? ['-b', Logcat.joinLogId(ids)] : []) + "logcat", + "-g", + ...(ids ? ["-b", Logcat.joinLogId(ids)] : []), ]); const result: LogSize[] = []; await stdout .pipeThrough(new DecodeUtf8Stream()) - .pipeThrough(new SplitStringStream('\n')) - .pipeTo(new WritableStream({ - write(chunk) { - let match = chunk.match(Logcat.LOG_SIZE_REGEX_11); - if (match) { - result.push({ - id: Logcat.logNameToId(match[1]!), - size: Logcat.parseSize(Number.parseInt(match[2]!, 10), match[3]!), - readable: Logcat.parseSize(Number.parseInt(match[6]!, 10), match[7]!), - consumed: Logcat.parseSize(Number.parseInt(match[4]!, 10), match[5]!), - maxEntrySize: parseInt(match[8]!, 10), - maxPayloadSize: parseInt(match[9]!, 10), - }); - } - - match = chunk.match(Logcat.LOG_SIZE_REGEX_10); - if (match) { - result.push({ - id: Logcat.logNameToId(match[1]!), - size: Logcat.parseSize(Number.parseInt(match[2]!, 10), match[3]!), - consumed: Logcat.parseSize(Number.parseInt(match[4]!, 10), match[5]!), - maxEntrySize: parseInt(match[6]!, 10), - maxPayloadSize: parseInt(match[7]!, 10), - }); - } - }, - })); + .pipeThrough(new SplitStringStream("\n")) + .pipeTo( + new WritableStream({ + write(chunk) { + let match = chunk.match(Logcat.LOG_SIZE_REGEX_11); + if (match) { + result.push({ + id: Logcat.logNameToId(match[1]!), + size: Logcat.parseSize( + Number.parseInt(match[2]!, 10), + match[3]! + ), + readable: Logcat.parseSize( + Number.parseInt(match[6]!, 10), + match[7]! + ), + consumed: Logcat.parseSize( + Number.parseInt(match[4]!, 10), + match[5]! + ), + maxEntrySize: parseInt(match[8]!, 10), + maxPayloadSize: parseInt(match[9]!, 10), + }); + } + + match = chunk.match(Logcat.LOG_SIZE_REGEX_10); + if (match) { + result.push({ + id: Logcat.logNameToId(match[1]!), + size: Logcat.parseSize( + Number.parseInt(match[2]!, 10), + match[3]! + ), + consumed: Logcat.parseSize( + Number.parseInt(match[4]!, 10), + match[5]! + ), + maxEntrySize: parseInt(match[6]!, 10), + maxPayloadSize: parseInt(match[7]!, 10), + }); + } + }, + }) + ); return result; } public async clear(ids?: LogId[]) { await this.adb.subprocess.spawnAndWait([ - 'logcat', - '-c', - ...(ids ? ['-b', Logcat.joinLogId(ids)] : []), + "logcat", + "-c", + ...(ids ? ["-b", Logcat.joinLogId(ids)] : []), ]); } @@ -239,18 +282,25 @@ export class Logcat extends AdbCommandBase { return new WrapReadableStream(async () => { // TODO: make `spawn` return synchronously with streams pending // so it's easier to chain them. - const { stdout } = await this.adb.subprocess.spawn([ - 'logcat', - '-B', - ...(options?.pid ? ['--pid', options.pid.toString()] : []), - ...(options?.ids ? ['-b', Logcat.joinLogId(options.ids)] : []) - ], { - // PERF: None protocol is 150% faster then Shell protocol - protocols: [AdbSubprocessNoneProtocol], - }); + const { stdout } = await this.adb.subprocess.spawn( + [ + "logcat", + "-B", + ...(options?.pid ? ["--pid", options.pid.toString()] : []), + ...(options?.ids + ? ["-b", Logcat.joinLogId(options.ids)] + : []), + ], + { + // PERF: None protocol is 150% faster then Shell protocol + protocols: [AdbSubprocessNoneProtocol], + } + ); return stdout; - }).pipeThrough(new BufferedTransformStream(stream => { - return deserializeAndroidLogEntry(stream); - })); + }).pipeThrough( + new BufferedTransformStream((stream) => { + return deserializeAndroidLogEntry(stream); + }) + ); } } diff --git a/libraries/android-bin/tsconfig.build.json b/libraries/android-bin/tsconfig.build.json new file mode 100644 index 00000000..785678ad --- /dev/null +++ b/libraries/android-bin/tsconfig.build.json @@ -0,0 +1,3 @@ +{ + "extends": "./node_modules/@yume-chan/tsconfig/tsconfig.base.json", +} diff --git a/libraries/android-bin/tsconfig.json b/libraries/android-bin/tsconfig.json index d0e54ec5..89469380 100644 --- a/libraries/android-bin/tsconfig.json +++ b/libraries/android-bin/tsconfig.json @@ -1,11 +1,13 @@ { - "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json", "references": [ { "path": "../adb/tsconfig.build.json" }, { "path": "../stream-extra/tsconfig.build.json" - } + }, + { + "path": "./tsconfig.build.json" + }, ] } diff --git a/libraries/b-tree/.eslintrc.cjs b/libraries/b-tree/.eslintrc.cjs new file mode 100644 index 00000000..e225d0db --- /dev/null +++ b/libraries/b-tree/.eslintrc.cjs @@ -0,0 +1,11 @@ +module.exports = { + "extends": [ + "@yume-chan" + ], + parserOptions: { + tsconfigRootDir: __dirname, + project: [ + "./tsconfig.test.json" + ], + }, +} diff --git a/libraries/b-tree/.npmignore b/libraries/b-tree/.npmignore index 667ace40..e44e2e62 100644 --- a/libraries/b-tree/.npmignore +++ b/libraries/b-tree/.npmignore @@ -8,6 +8,7 @@ coverage **/__helpers__ jest.config.js +.eslintrc.cjs tsconfig.json tsconfig.test.json diff --git a/libraries/b-tree/package.json b/libraries/b-tree/package.json index 084d8e90..3922b0a8 100644 --- a/libraries/b-tree/package.json +++ b/libraries/b-tree/package.json @@ -30,6 +30,7 @@ "build": "tsc -b tsconfig.build.json", "build:watch": "tsc -b tsconfig.build.json", "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage", + "lint": "eslint src/**/*.ts --fix", "prepublishOnly": "npm run build" }, "dependencies": { @@ -37,10 +38,12 @@ }, "devDependencies": { "@jest/globals": "^29.3.1", - "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "@yume-chan/eslint-config": "workspace:^1.0.0", + "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", + "eslint": "^8.30.0", "jest": "^29.3.1", "ts-jest": "^29.0.3", - "typescript": "^4.8.4" + "typescript": "^4.9.4" } } diff --git a/libraries/b-tree/src/index.spec.ts b/libraries/b-tree/src/index.spec.ts index 37905214..1cf8c0ce 100644 --- a/libraries/b-tree/src/index.spec.ts +++ b/libraries/b-tree/src/index.spec.ts @@ -1,5 +1,6 @@ -import { describe, expect, it } from '@jest/globals'; -import { BTree, BTreeNode } from "./index.js"; +import { describe, expect, it } from "@jest/globals"; + +import { BTree, type BTreeNode } from "./index.js"; const LENGTH = 128; @@ -10,67 +11,73 @@ function shuffle(array: T[]) { } } -describe('BTree', () => { - for (let order = 3; order < 10; order += 1) { - // Math.ceil(order / 2) - 1 - const MIN_KEY_COUNT = ((order + 1) >> 1) - 1; - - function validateNode(node: BTreeNode, root: boolean, min = -Infinity) { - if (node.height === 0) { - expect(node.keyCount).toBeGreaterThan(0); - expect(node.keyCount).toBeLessThan(order); - for (let i = 0; i < node.keyCount; i += 1) { - expect(node.keys[i]).toBeGreaterThan(min); - min = node.keys[i]!; - } - return min; - } - - if (!root) { - expect(node.keyCount).toBeGreaterThanOrEqual(MIN_KEY_COUNT); - } - expect(node.keyCount).toBeLessThan(order); - +describe("BTree", () => { + function validateNode(node: BTreeNode, root: boolean, min = -Infinity) { + if (node.height === 0) { + expect(node.keyCount).toBeGreaterThan(0); + expect(node.keyCount).toBeLessThan(node.order); for (let i = 0; i < node.keyCount; i += 1) { - min = validateNode(node.children[i]!, false, min); expect(node.keys[i]).toBeGreaterThan(min); min = node.keys[i]!; } - min = validateNode(node.children[node.keyCount]!, false, min); return min; } - function validateTree(tree: BTree) { - if (tree.size === 0) { - expect(tree.root.keyCount).toBe(0); - return; - } + if (!root) { + // Math.ceil(order / 2) - 1 + expect(node.keyCount).toBeGreaterThanOrEqual( + ((node.order + 1) >> 1) - 1 + ); + } + expect(node.keyCount).toBeLessThan(node.order); - validateNode(tree.root, true); + for (let i = 0; i < node.keyCount; i += 1) { + min = validateNode(node.children[i]!, false, min); + expect(node.keys[i]).toBeGreaterThan(min); + min = node.keys[i]!; } + min = validateNode(node.children[node.keyCount]!, false, min); + return min; + } + function validateTree(tree: BTree) { + if (tree.size === 0) { + expect(tree.root.keyCount).toBe(0); + return; + } + + validateNode(tree.root, true); + } + + for (let order = 3; order < 10; order += 1) { describe(`order ${order}`, () => { - it('should generate valid tree with incremental values', () => { + it("should generate valid tree with incremental values", () => { const tree = new BTree(order); - const values = Array.from({ length: LENGTH }, (_, i) => i - LENGTH / 2); - for (let value of values) { + const values = Array.from( + { length: LENGTH }, + (_, i) => i - LENGTH / 2 + ); + for (const value of values) { tree.add(value); validateTree(tree); expect(tree.has(value)).toBe(true); } - for (let value of values) { + for (const value of values) { tree.delete(value); validateTree(tree); expect(tree.has(value)).toBe(false); } }); - it('should generate valid tree with random values', () => { + it("should generate valid tree with random values", () => { const tree = new BTree(order); - const values = Array.from({ length: LENGTH }, (_, i) => i - LENGTH / 2); + const values = Array.from( + { length: LENGTH }, + (_, i) => i - LENGTH / 2 + ); shuffle(values); for (const value of values) { tree.add(value); diff --git a/libraries/b-tree/src/index.ts b/libraries/b-tree/src/index.ts index fe2e59f3..70d0e562 100644 --- a/libraries/b-tree/src/index.ts +++ b/libraries/b-tree/src/index.ts @@ -3,7 +3,12 @@ interface BTreeInsertionResult { child: BTreeNode; } -function insert(array: Int32Array, length: number, value: number, index: number) { +function insert( + array: Int32Array, + length: number, + value: number, + index: number +) { if (index !== length) { array.set(array.subarray(index, length), index + 1); } @@ -54,7 +59,11 @@ export class BTreeNode { * @returns The new key and child need to be inserted to its parent. * The new key is the middle key of the current node, and the child contains the right half of the current node. */ - protected split(value: number, index: number, child?: BTreeNode): BTreeInsertionResult { + protected split( + value: number, + index: number, + child?: BTreeNode + ): BTreeInsertionResult { let middleKey: number; const rightKeys = new Int32Array(this.order - 1); let rightChildren: BTreeNode[]; @@ -67,13 +76,16 @@ export class BTreeNode { if (child) { // internal node - rightChildren = this.children.splice(this.mid, this.order - this.mid); + rightChildren = this.children.splice( + this.mid, + this.order - this.mid + ); // TODO: this may cause the underlying array to grow (re-alloc and copy) // investigate if this hurts performance. this.children.splice(index + 1, 0, child); } else { // leaf node, doesn't have children, create am empty array for it. - rightChildren = new Array(this.order); + rightChildren = new Array(this.order); } } else { if (index === this.mid) { @@ -89,10 +101,13 @@ export class BTreeNode { } if (child) { - rightChildren = this.children.splice(this.mid + 1, this.order - this.mid - 1); + rightChildren = this.children.splice( + this.mid + 1, + this.order - this.mid - 1 + ); rightChildren.splice(index - this.mid, 0, child); } else { - rightChildren = new Array(this.order); + rightChildren = new Array(this.order); } } @@ -156,7 +171,7 @@ export class BTreeNode { } const split = this.children[index]!.add(value); - if (typeof split === 'object') { + if (typeof split === "object") { if (this.keyCount === this.order - 1) { return this.split(split.key, index, split.child); } @@ -221,9 +236,12 @@ export class BTreeNode { // merge with left left.keys[left.keyCount] = this.keys[index - 1]!; left.keyCount += 1; - left.keys.set(child.keys.subarray(0, child.keyCount), left.keyCount); + left.keys.set( + child.keys.subarray(0, child.keyCount), + left.keyCount + ); if (this.height > 1) { - for (let i = 0; i <= child.keyCount; i++) { + for (let i = 0; i <= child.keyCount; i += 1) { left.children[left.keyCount + i] = child.children[i]!; } } @@ -239,7 +257,10 @@ export class BTreeNode { // rotate left child.keys[child.keyCount] = this.keys[index]!; if (this.height > 1) { - child.children[child.keyCount + 1] = right.children.splice(0, 1)[0]!; + child.children[child.keyCount + 1] = right.children.splice( + 0, + 1 + )[0]!; } child.keyCount += 1; @@ -255,7 +276,7 @@ export class BTreeNode { child.keyCount += 1; child.keys.set(right.keys.subarray(0, right.keyCount), child.keyCount); if (this.height > 1) { - for (let i = 0; i <= right.keyCount; i++) { + for (let i = 0; i <= right.keyCount; i += 1) { child.children[child.keyCount + i] = right.children[i]!; } } @@ -308,7 +329,7 @@ export class BTree { order: number; root: BTreeNode; - size: number = 0; + size = 0; public constructor(order: number) { this.order = order; @@ -317,7 +338,7 @@ export class BTree { new Int32Array(order - 1), 0, 0, - new Array(order) + new Array(order) ); } @@ -339,11 +360,11 @@ export class BTree { public add(value: number) { const split = this.root.add(value); - if (typeof split === 'object') { + if (typeof split === "object") { const keys = new Int32Array(this.order - 1); keys[0] = split.key; - const children = new Array(this.order); + const children = new Array(this.order); children[0] = this.root; children[1] = split.child; @@ -376,7 +397,7 @@ export class BTree { this.root.keyCount = 0; this.root.height = 0; // immediately release all references - this.root.children = new Array(this.order); + this.root.children = new Array(this.order); this.size = 0; } diff --git a/libraries/b-tree/tsconfig.build.json b/libraries/b-tree/tsconfig.build.json index b4bb73dd..2cb23249 100644 --- a/libraries/b-tree/tsconfig.build.json +++ b/libraries/b-tree/tsconfig.build.json @@ -1,3 +1,3 @@ { - "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json" + "extends": "./node_modules/@yume-chan/tsconfig/tsconfig.base.json" } diff --git a/libraries/dataview-bigint-polyfill/.eslintrc.cjs b/libraries/dataview-bigint-polyfill/.eslintrc.cjs new file mode 100644 index 00000000..40d283a4 --- /dev/null +++ b/libraries/dataview-bigint-polyfill/.eslintrc.cjs @@ -0,0 +1,11 @@ +module.exports = { + "extends": [ + "@yume-chan" + ], + parserOptions: { + tsconfigRootDir: __dirname, + project: [ + "./tsconfig.build.json" + ], + }, +} diff --git a/libraries/dataview-bigint-polyfill/.npmignore b/libraries/dataview-bigint-polyfill/.npmignore index 667ace40..e44e2e62 100644 --- a/libraries/dataview-bigint-polyfill/.npmignore +++ b/libraries/dataview-bigint-polyfill/.npmignore @@ -8,6 +8,7 @@ coverage **/__helpers__ jest.config.js +.eslintrc.cjs tsconfig.json tsconfig.test.json diff --git a/libraries/dataview-bigint-polyfill/package.json b/libraries/dataview-bigint-polyfill/package.json index f34416ad..b0b4f110 100644 --- a/libraries/dataview-bigint-polyfill/package.json +++ b/libraries/dataview-bigint-polyfill/package.json @@ -29,17 +29,20 @@ "main": "esm/index.js", "types": "esm/index.d.ts", "scripts": { - "build": "build-ts-package", - "build:watch": "build-ts-package --incremental", + "build": "tsc -b tsconfig.build.json", + "build:watch": "tsc -b tsconfig.build.json", "//test": "jest --coverage", + "lint": "eslint src/**/*.ts --fix", "prepublishOnly": "npm run build" }, "dependencies": { "tslib": "^2.4.1" }, "devDependencies": { - "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "@yume-chan/eslint-config": "workspace:^1.0.0", + "@yume-chan/tsconfig": "workspace:^1.0.0", + "eslint": "^8.30.0", "jest": "^29.3.1", - "typescript": "^4.8.4" + "typescript": "^4.9.4" } } diff --git a/libraries/dataview-bigint-polyfill/src/pure.ts b/libraries/dataview-bigint-polyfill/src/pure.ts index 276b543e..668059a5 100644 --- a/libraries/dataview-bigint-polyfill/src/pure.ts +++ b/libraries/dataview-bigint-polyfill/src/pure.ts @@ -1,21 +1,32 @@ const BigInt32 = BigInt(32); -export function getBigInt64(dataView: DataView, byteOffset: number, littleEndian: boolean | undefined): bigint { +export function getBigInt64( + dataView: DataView, + byteOffset: number, + littleEndian: boolean | undefined +): bigint { const littleEndianMask = Number(!!littleEndian); const bigEndianMask = Number(!littleEndian); return ( - BigInt( + (BigInt( dataView.getInt32(byteOffset, littleEndian) * bigEndianMask + - dataView.getInt32(byteOffset + 4, littleEndian) * littleEndianMask - ) << BigInt32) | + dataView.getInt32(byteOffset + 4, littleEndian) * + littleEndianMask + ) << + BigInt32) | BigInt( dataView.getUint32(byteOffset, littleEndian) * littleEndianMask + - dataView.getUint32(byteOffset + 4, littleEndian) * bigEndianMask - ); + dataView.getUint32(byteOffset + 4, littleEndian) * bigEndianMask + ) + ); } -export function getBigUint64(dataView: DataView, byteOffset: number, littleEndian: boolean | undefined): bigint { +export function getBigUint64( + dataView: DataView, + byteOffset: number, + littleEndian: boolean | undefined +): bigint { const a = dataView.getUint32(byteOffset, littleEndian); const b = dataView.getUint32(byteOffset + 4, littleEndian); @@ -25,13 +36,20 @@ export function getBigUint64(dataView: DataView, byteOffset: number, littleEndia // This branch-less optimization is 77x faster than normal ternary operator. // and only 3% slower than native implementation // https://jsbench.me/p8kyhg1eqv/1 - return (BigInt(a * bigEndianMask + b * littleEndianMask) << BigInt32) | - BigInt(a * littleEndianMask + b * bigEndianMask); -}; + return ( + (BigInt(a * bigEndianMask + b * littleEndianMask) << BigInt32) | + BigInt(a * littleEndianMask + b * bigEndianMask) + ); +} -export function setBigInt64(dataView: DataView, byteOffset: number, value: bigint, littleEndian: boolean | undefined) { +export function setBigInt64( + dataView: DataView, + byteOffset: number, + value: bigint, + littleEndian: boolean | undefined +) { const hi = Number(value >> BigInt32); - const lo = Number(value & BigInt(0xFFFFFFFF)); + const lo = Number(value & BigInt(0xffffffff)); if (littleEndian) { dataView.setInt32(byteOffset + 4, hi, littleEndian); @@ -42,9 +60,14 @@ export function setBigInt64(dataView: DataView, byteOffset: number, value: bigin } } -export function setBigUint64(dataView: DataView, byteOffset: number, value: bigint, littleEndian: boolean | undefined) { +export function setBigUint64( + dataView: DataView, + byteOffset: number, + value: bigint, + littleEndian: boolean | undefined +) { const hi = Number(value >> BigInt32); - const lo = Number(value & BigInt(0xFFFFFFFF)); + const lo = Number(value & BigInt(0xffffffff)); if (littleEndian) { dataView.setUint32(byteOffset + 4, hi, littleEndian); @@ -53,4 +76,4 @@ export function setBigUint64(dataView: DataView, byteOffset: number, value: bigi dataView.setUint32(byteOffset, hi, littleEndian); dataView.setUint32(byteOffset + 4, lo, littleEndian); } -}; +} diff --git a/libraries/dataview-bigint-polyfill/tsconfig.build.json b/libraries/dataview-bigint-polyfill/tsconfig.build.json new file mode 100644 index 00000000..785678ad --- /dev/null +++ b/libraries/dataview-bigint-polyfill/tsconfig.build.json @@ -0,0 +1,3 @@ +{ + "extends": "./node_modules/@yume-chan/tsconfig/tsconfig.base.json", +} diff --git a/libraries/dataview-bigint-polyfill/tsconfig.json b/libraries/dataview-bigint-polyfill/tsconfig.json index 45ccd9e9..3dce3aea 100644 --- a/libraries/dataview-bigint-polyfill/tsconfig.json +++ b/libraries/dataview-bigint-polyfill/tsconfig.json @@ -1,3 +1,7 @@ { - "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json", + "references": [ + { + "path": "./tsconfig.build.json" + }, + ] } diff --git a/libraries/event/.eslintrc.cjs b/libraries/event/.eslintrc.cjs new file mode 100644 index 00000000..e225d0db --- /dev/null +++ b/libraries/event/.eslintrc.cjs @@ -0,0 +1,11 @@ +module.exports = { + "extends": [ + "@yume-chan" + ], + parserOptions: { + tsconfigRootDir: __dirname, + project: [ + "./tsconfig.test.json" + ], + }, +} diff --git a/libraries/event/.npmignore b/libraries/event/.npmignore index a5599a2d..e44e2e62 100644 --- a/libraries/event/.npmignore +++ b/libraries/event/.npmignore @@ -8,7 +8,9 @@ coverage **/__helpers__ jest.config.js +.eslintrc.cjs tsconfig.json +tsconfig.test.json # Logs *.log diff --git a/libraries/event/package.json b/libraries/event/package.json index b9bff3eb..bfe6e818 100644 --- a/libraries/event/package.json +++ b/libraries/event/package.json @@ -29,6 +29,7 @@ "build": "tsc -b tsconfig.build.json", "build:watch": "tsc -b tsconfig.build.json", "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage", + "lint": "eslint src/**/*.ts --fix", "prepublishOnly": "npm run build" }, "dependencies": { @@ -37,10 +38,12 @@ }, "devDependencies": { "@jest/globals": "^29.3.1", - "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "@yume-chan/eslint-config": "workspace:^1.0.0", + "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", + "eslint": "^8.30.0", "jest": "^29.3.1", "ts-jest": "^29.0.3", - "typescript": "^4.8.4" + "typescript": "^4.9.4" } } diff --git a/libraries/event/src/disposable.spec.ts b/libraries/event/src/disposable.spec.ts index 004a7901..9a6088e7 100644 --- a/libraries/event/src/disposable.spec.ts +++ b/libraries/event/src/disposable.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, it, jest } from "@jest/globals"; -import { AutoDisposable, Disposable } from "./disposable.js"; +import { AutoDisposable, type Disposable } from "./disposable.js"; describe("Event", () => { describe("AutoDisposable", () => { diff --git a/libraries/event/src/event-emitter.ts b/libraries/event/src/event-emitter.ts index de773ddf..d8972466 100644 --- a/libraries/event/src/event-emitter.ts +++ b/libraries/event/src/event-emitter.ts @@ -1,14 +1,25 @@ -import type { Disposable } from './disposable.js'; -import type { EventListener, RemoveEventListener } from './event.js'; +import { type Disposable } from "./disposable.js"; +import { type EventListener, type RemoveEventListener } from "./event.js"; export interface EventListenerInfo { - listener: EventListener; + listener: EventListener; thisArg: unknown; args: unknown[]; } +export interface AddEventListener { + ( + listener: EventListener + ): RemoveEventListener; + ( + listener: EventListener, + thisArg: TThis, + ...args: TArgs + ): RemoveEventListener; +} + export class EventEmitter implements Disposable { protected readonly listeners: EventListenerInfo[] = []; @@ -16,7 +27,9 @@ export class EventEmitter implements Disposable { this.event = this.event.bind(this); } - protected addEventListener(info: EventListenerInfo): RemoveEventListener { + protected addEventListener( + info: EventListenerInfo + ): RemoveEventListener { this.listeners.push(info); const remove: RemoveEventListener = () => { @@ -29,26 +42,26 @@ export class EventEmitter implements Disposable { return remove; } - public event( - listener: EventListener - ): RemoveEventListener; - public event( - listener: EventListener, - thisArg: TThis, - ...args: TArgs - ): RemoveEventListener; - public event( + public event: AddEventListener = < + TThis, + TArgs extends unknown[] + >( listener: EventListener, thisArg?: TThis, ...args: TArgs - ): RemoveEventListener { + ) => { const info: EventListenerInfo = { - listener, + listener: listener as EventListener< + TEvent, + unknown, + unknown[], + TResult + >, thisArg, args, }; return this.addEventListener(info); - } + }; public fire(e: TEvent) { for (const info of this.listeners.slice()) { diff --git a/libraries/event/src/event.ts b/libraries/event/src/event.ts index aba0d8f8..1c0ee654 100644 --- a/libraries/event/src/event.ts +++ b/libraries/event/src/event.ts @@ -1,6 +1,11 @@ -import type { Disposable } from './disposable.js'; +import { type Disposable } from "./disposable.js"; -export interface EventListener { +export interface EventListener< + TEvent, + TThis, + TArgs extends unknown[], + TResult +> { (this: TThis, e: TEvent, ...args: TArgs): TResult; } @@ -12,7 +17,9 @@ export interface Event { /** * Attaches an event listener. */ - (listener: EventListener): RemoveEventListener; + ( + listener: EventListener + ): RemoveEventListener; /** * Attaches an event listener that bind to `this` and `args`. diff --git a/libraries/event/src/utils.ts b/libraries/event/src/utils.ts index df890994..2bc42743 100644 --- a/libraries/event/src/utils.ts +++ b/libraries/event/src/utils.ts @@ -1,7 +1,8 @@ -import { PromiseResolver } from '@yume-chan/async'; -import type { Event } from './event.js'; +import { PromiseResolver } from "@yume-chan/async"; -export async function once(event: Event): Promise { +import { type Event } from "./event.js"; + +export async function once(event: Event): Promise { const resolver = new PromiseResolver(); const dispose = event(resolver.resolve); const result = await resolver.promise; diff --git a/libraries/event/tsconfig.build.json b/libraries/event/tsconfig.build.json index b4bb73dd..2cb23249 100644 --- a/libraries/event/tsconfig.build.json +++ b/libraries/event/tsconfig.build.json @@ -1,3 +1,3 @@ { - "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json" + "extends": "./node_modules/@yume-chan/tsconfig/tsconfig.base.json" } diff --git a/libraries/scrcpy-decoder-tinyh264/.eslintrc.cjs b/libraries/scrcpy-decoder-tinyh264/.eslintrc.cjs new file mode 100644 index 00000000..e225d0db --- /dev/null +++ b/libraries/scrcpy-decoder-tinyh264/.eslintrc.cjs @@ -0,0 +1,11 @@ +module.exports = { + "extends": [ + "@yume-chan" + ], + parserOptions: { + tsconfigRootDir: __dirname, + project: [ + "./tsconfig.test.json" + ], + }, +} diff --git a/libraries/scrcpy-decoder-tinyh264/.npmignore b/libraries/scrcpy-decoder-tinyh264/.npmignore new file mode 100644 index 00000000..e44e2e62 --- /dev/null +++ b/libraries/scrcpy-decoder-tinyh264/.npmignore @@ -0,0 +1,16 @@ +.rush + +# Test +coverage +**/*.spec.ts +**/*.spec.js +**/*.spec.js.map +**/__helpers__ +jest.config.js + +.eslintrc.cjs +tsconfig.json +tsconfig.test.json + +# Logs +*.log diff --git a/libraries/scrcpy-decoder-tinyh264/package.json b/libraries/scrcpy-decoder-tinyh264/package.json index 5ea70dae..d1a0dc34 100644 --- a/libraries/scrcpy-decoder-tinyh264/package.json +++ b/libraries/scrcpy-decoder-tinyh264/package.json @@ -29,6 +29,7 @@ "build": "tsc -b tsconfig.build.json", "build:watch": "tsc -b tsconfig.build.json", "//test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage", + "lint": "eslint src/**/*.ts --fix", "prepublishOnly": "npm run build" }, "dependencies": { @@ -43,10 +44,12 @@ }, "devDependencies": { "@jest/globals": "^29.3.1", - "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "@yume-chan/eslint-config": "workspace:^1.0.0", + "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", + "eslint": "^8.30.0", "jest": "^29.3.1", "ts-jest": "^29.0.3", - "typescript": "^4.8.4" + "typescript": "^4.9.4" } } diff --git a/libraries/scrcpy-decoder-tinyh264/src/index.ts b/libraries/scrcpy-decoder-tinyh264/src/index.ts index 886e3323..32c9d484 100644 --- a/libraries/scrcpy-decoder-tinyh264/src/index.ts +++ b/libraries/scrcpy-decoder-tinyh264/src/index.ts @@ -1,16 +1,27 @@ -import { PromiseResolver } from '@yume-chan/async'; -import { AndroidCodecLevel, AndroidCodecProfile, type H264Configuration, type ScrcpyVideoStreamPacket } from '@yume-chan/scrcpy'; -import { WritableStream } from '@yume-chan/stream-extra'; - -import { createTinyH264Wrapper, type TinyH264Wrapper } from './wrapper.js'; - -let cachedInitializePromise: Promise<{ YuvBuffer: typeof import('yuv-buffer'), YuvCanvas: typeof import('yuv-canvas').default; }> | undefined; +import { PromiseResolver } from "@yume-chan/async"; +import { + AndroidCodecLevel, + AndroidCodecProfile, + type H264Configuration, + type ScrcpyVideoStreamPacket, +} from "@yume-chan/scrcpy"; +import { WritableStream } from "@yume-chan/stream-extra"; +import { type default as YuvBuffer } from "yuv-buffer"; +import { type default as YuvCanvas } from "yuv-canvas"; + +import { createTinyH264Wrapper, type TinyH264Wrapper } from "./wrapper.js"; + +let cachedInitializePromise: + | Promise<{ YuvBuffer: typeof YuvBuffer; YuvCanvas: typeof YuvCanvas }> + | undefined; function initialize() { if (!cachedInitializePromise) { - cachedInitializePromise = Promise.all( - [import('yuv-buffer'), import('yuv-canvas')] - ).then(([YuvBuffer, { default: YuvCanvas }]) => ({ - YuvBuffer, YuvCanvas + cachedInitializePromise = Promise.all([ + import("yuv-buffer"), + import("yuv-canvas"), + ]).then(([YuvBuffer, { default: YuvCanvas }]) => ({ + YuvBuffer, + YuvCanvas, })); } @@ -23,38 +34,45 @@ export class TinyH264Decoder { public readonly maxLevel = AndroidCodecLevel.Level4; private _renderer: HTMLCanvasElement; - public get renderer() { return this._renderer; } + public get renderer() { + return this._renderer; + } private _frameRendered = 0; - public get frameRendered() { return this._frameRendered; } + public get frameRendered() { + return this._frameRendered; + } private _writable: WritableStream; - public get writable() { return this._writable; } + public get writable() { + return this._writable; + } - private _yuvCanvas: import('yuv-canvas').default | undefined; + private _yuvCanvas: YuvCanvas | undefined; private _initializer: PromiseResolver | undefined; public constructor() { - initialize(); + void initialize(); - this._renderer = document.createElement('canvas'); + this._renderer = document.createElement("canvas"); this._writable = new WritableStream({ write: async (packet) => { switch (packet.type) { - case 'configuration': - this.configure(packet.data); + case "configuration": + void this.configure(packet.data); break; - case 'frame': + case "frame": { if (!this._initializer) { - throw new Error('Decoder not initialized'); + throw new Error("Decoder not configured"); } const wrapper = await this._initializer.promise; wrapper.feed(packet.data.slice().buffer); break; + } } - } + }, }); } @@ -65,7 +83,7 @@ export class TinyH264Decoder { const { YuvBuffer, YuvCanvas } = await initialize(); if (!this._yuvCanvas) { - this._yuvCanvas = YuvCanvas.attach(this._renderer);; + this._yuvCanvas = YuvCanvas.attach(this._renderer); } const { encodedWidth, encodedHeight } = config; @@ -95,7 +113,8 @@ export class TinyH264Decoder { wrapper.onPictureReady(({ data }) => { this._frameRendered += 1; const array = new Uint8Array(data); - const frame = YuvBuffer.frame(format, + const frame = YuvBuffer.frame( + format, YuvBuffer.lumaPlane(format, array, encodedWidth, 0), YuvBuffer.chromaPlane(format, array, chromaWidth, uPlaneOffset), YuvBuffer.chromaPlane(format, array, chromaWidth, vPlaneOffset) @@ -105,7 +124,11 @@ export class TinyH264Decoder { } public dispose(): void { - this._initializer?.promise.then(wrapper => wrapper.dispose()); + this._initializer?.promise + .then((wrapper) => wrapper.dispose()) + .catch((e) => { + void e; + }); this._initializer = undefined; } } diff --git a/libraries/scrcpy-decoder-tinyh264/src/types.d.ts b/libraries/scrcpy-decoder-tinyh264/src/types.d.ts index e28de2f8..6829189a 100644 --- a/libraries/scrcpy-decoder-tinyh264/src/types.d.ts +++ b/libraries/scrcpy-decoder-tinyh264/src/types.d.ts @@ -1,8 +1,8 @@ -declare module 'tinyh264' { +declare module "tinyh264" { export function init(): void; } -declare module 'yuv-buffer' { +declare module "yuv-buffer" { /** * Validate and fill out a YUVFormat object structure. * @@ -27,7 +27,12 @@ declare module 'yuv-buffer' { * @param {number} offset - offset into source array to extract; optional (will start at 0 if missing) * @returns {YUVPlane} - freshly allocated planar buffer */ - export function lumaPlane(format: YUVFormat, source: Uint8Array, stride: number, offset: number): YUVPlane; + export function lumaPlane( + format: YUVFormat, + source: Uint8Array, + stride: number, + offset: number + ): YUVPlane; /** * Allocate a new YUVPlane object big enough for a chroma plane in the given format, @@ -39,7 +44,12 @@ declare module 'yuv-buffer' { * @param {number} offset - offset into source array to extract; optional (will start at 0 if missing) * @returns {YUVPlane} - freshly allocated planar buffer */ - export function chromaPlane(format: YUVFormat, source: Uint8Array, stride: number, offset: number): YUVPlane; + export function chromaPlane( + format: YUVFormat, + source: Uint8Array, + stride: number, + offset: number + ): YUVPlane; /** * Allocate a new YUVFrame object big enough for the given format @@ -49,7 +59,12 @@ declare module 'yuv-buffer' { * @param {YUVPlane} v - optional V plane; if missing, fresh one will be allocated * @returns {YUVFrame} - freshly allocated frame buffer */ - export function frame(format: YUVFormat, y: YUVPlane, u: YUVPlane, v: YUVPlane): YUVFrame; + export function frame( + format: YUVFormat, + y: YUVPlane, + u: YUVPlane, + v: YUVPlane + ): YUVFrame; /** * Duplicate a frame using new buffer memory. @@ -64,8 +79,9 @@ declare module 'yuv-buffer' { * @param {YUVFrame} frame - input frame * @returns {Array} - list of transferable objects */ - export function transferables(frame: YUVFrame): (ArrayBuffer | SharedArrayBuffer)[]; - + export function transferables( + frame: YUVFrame + ): (ArrayBuffer | SharedArrayBuffer)[]; /** * Represents metadata about a YUV frame format. @@ -126,8 +142,8 @@ declare module 'yuv-buffer' { } } -declare module 'yuv-canvas' { - import { YUVFrame } from 'yuv-buffer'; +declare module "yuv-canvas" { + import { type YUVFrame } from "yuv-buffer"; export default class YUVCanvas { public static attach(canvas: HTMLCanvasElement): YUVCanvas; diff --git a/libraries/scrcpy-decoder-tinyh264/src/wrapper.ts b/libraries/scrcpy-decoder-tinyh264/src/wrapper.ts index 9eca3d86..82a906a5 100644 --- a/libraries/scrcpy-decoder-tinyh264/src/wrapper.ts +++ b/libraries/scrcpy-decoder-tinyh264/src/wrapper.ts @@ -1,5 +1,9 @@ -import { PromiseResolver } from '@yume-chan/async'; -import { AutoDisposable, Disposable, EventEmitter } from '@yume-chan/event'; +import { PromiseResolver } from "@yume-chan/async"; +import { + AutoDisposable, + EventEmitter, + type Disposable, +} from "@yume-chan/event"; let worker: Worker | undefined; let workerReady = false; @@ -16,29 +20,40 @@ export interface PictureReadyEventArgs { data: ArrayBuffer; } -const PICTURE_READY_SUBSCRIPTIONS = new Map void>(); +const PICTURE_READY_SUBSCRIPTIONS = new Map< + number, + (e: PictureReadyEventArgs) => void +>(); -function subscribePictureReady(streamId: number, handler: (e: PictureReadyEventArgs) => void): Disposable { +function subscribePictureReady( + streamId: number, + handler: (e: PictureReadyEventArgs) => void +): Disposable { PICTURE_READY_SUBSCRIPTIONS.set(streamId, handler); return { dispose() { PICTURE_READY_SUBSCRIPTIONS.delete(streamId); - } + }, }; } export class TinyH264Wrapper extends AutoDisposable { public readonly streamId: number; - private readonly pictureReadyEvent = new EventEmitter(); - public get onPictureReady() { return this.pictureReadyEvent.event; } + private readonly pictureReadyEvent = + new EventEmitter(); + public get onPictureReady() { + return this.pictureReadyEvent.event; + } public constructor(streamId: number) { super(); this.streamId = streamId; - this.addDisposable(subscribePictureReady(streamId, this.handlePictureReady)); + this.addDisposable( + subscribePictureReady(streamId, this.handlePictureReady) + ); } private handlePictureReady = (e: PictureReadyEventArgs) => { @@ -46,43 +61,68 @@ export class TinyH264Wrapper extends AutoDisposable { }; public feed(data: ArrayBuffer) { - worker!.postMessage({ - type: 'decode', - data: data, - offset: 0, - length: data.byteLength, - renderStateId: this.streamId, - }, [data]); + worker!.postMessage( + { + type: "decode", + data: data, + offset: 0, + length: data.byteLength, + renderStateId: this.streamId, + }, + [data] + ); } public override dispose() { super.dispose(); worker!.postMessage({ - type: 'release', + type: "release", renderStateId: this.streamId, }); } } +interface TinyH264MessageBase { + type: string; +} + +interface TinyH264DecoderReadyMessage extends TinyH264MessageBase { + type: "decoderReady"; +} + +interface TinyH264PictureReadyMessage + extends TinyH264MessageBase, + PictureReadyEventArgs { + type: "pictureReady"; +} + +type TinyH264Message = + | TinyH264DecoderReadyMessage + | TinyH264PictureReadyMessage; + export function createTinyH264Wrapper(): Promise { if (!worker) { - worker = new Worker(new URL('./worker.js', import.meta.url)); - worker.addEventListener('message', (e) => { - const { data } = e; - switch (data.type) { - case 'decoderReady': - workerReady = true; - for (const resolver of pendingResolvers) { - resolver.resolve(new TinyH264Wrapper(streamId)); - streamId += 1; - } - pendingResolvers.length = 0; - break; - case 'pictureReady': - PICTURE_READY_SUBSCRIPTIONS.get(data.renderStateId)?.(data); - break; + worker = new Worker(new URL("./worker.js", import.meta.url)); + worker.addEventListener( + "message", + ({ data }: MessageEvent) => { + switch (data.type) { + case "decoderReady": + workerReady = true; + for (const resolver of pendingResolvers) { + resolver.resolve(new TinyH264Wrapper(streamId)); + streamId += 1; + } + pendingResolvers.length = 0; + break; + case "pictureReady": + PICTURE_READY_SUBSCRIPTIONS.get(data.renderStateId)?.( + data + ); + break; + } } - }); + ); } if (!workerReady) { diff --git a/libraries/scrcpy-decoder-tinyh264/tsconfig.build.json b/libraries/scrcpy-decoder-tinyh264/tsconfig.build.json index 2b5f616b..549c3a15 100644 --- a/libraries/scrcpy-decoder-tinyh264/tsconfig.build.json +++ b/libraries/scrcpy-decoder-tinyh264/tsconfig.build.json @@ -1,5 +1,5 @@ { - "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json", + "extends": "./node_modules/@yume-chan/tsconfig/tsconfig.base.json", "compilerOptions": { "lib": [ "ESNext", diff --git a/libraries/scrcpy-decoder-webcodecs/.eslintrc.cjs b/libraries/scrcpy-decoder-webcodecs/.eslintrc.cjs new file mode 100644 index 00000000..e225d0db --- /dev/null +++ b/libraries/scrcpy-decoder-webcodecs/.eslintrc.cjs @@ -0,0 +1,11 @@ +module.exports = { + "extends": [ + "@yume-chan" + ], + parserOptions: { + tsconfigRootDir: __dirname, + project: [ + "./tsconfig.test.json" + ], + }, +} diff --git a/libraries/scrcpy-decoder-webcodecs/.npmignore b/libraries/scrcpy-decoder-webcodecs/.npmignore new file mode 100644 index 00000000..e44e2e62 --- /dev/null +++ b/libraries/scrcpy-decoder-webcodecs/.npmignore @@ -0,0 +1,16 @@ +.rush + +# Test +coverage +**/*.spec.ts +**/*.spec.js +**/*.spec.js.map +**/__helpers__ +jest.config.js + +.eslintrc.cjs +tsconfig.json +tsconfig.test.json + +# Logs +*.log diff --git a/libraries/scrcpy-decoder-webcodecs/package.json b/libraries/scrcpy-decoder-webcodecs/package.json index f4213e1c..52bb30f3 100644 --- a/libraries/scrcpy-decoder-webcodecs/package.json +++ b/libraries/scrcpy-decoder-webcodecs/package.json @@ -29,6 +29,7 @@ "build": "tsc -b tsconfig.build.json", "build:watch": "tsc -b tsconfig.build.json", "//test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage", + "lint": "eslint src/**/*.ts --fix", "prepublishOnly": "npm run build" }, "dependencies": { @@ -39,10 +40,12 @@ }, "devDependencies": { "@jest/globals": "^29.3.1", - "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "@yume-chan/eslint-config": "workspace:^1.0.0", + "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", + "eslint": "^8.30.0", "jest": "^29.3.1", "ts-jest": "^29.0.3", - "typescript": "^4.8.4" + "typescript": "^4.9.4" } } diff --git a/libraries/scrcpy-decoder-webcodecs/src/index.ts b/libraries/scrcpy-decoder-webcodecs/src/index.ts index ec3ce0aa..8a6dbc93 100644 --- a/libraries/scrcpy-decoder-webcodecs/src/index.ts +++ b/libraries/scrcpy-decoder-webcodecs/src/index.ts @@ -1,8 +1,11 @@ -import type { H264Configuration, ScrcpyVideoStreamPacket } from '@yume-chan/scrcpy'; -import { WritableStream } from '@yume-chan/stream-extra'; +import { + type H264Configuration, + type ScrcpyVideoStreamPacket, +} from "@yume-chan/scrcpy"; +import { WritableStream } from "@yume-chan/stream-extra"; function toHex(value: number) { - return value.toString(16).padStart(2, '0').toUpperCase(); + return value.toString(16).padStart(2, "0").toUpperCase(); } export class WebCodecsDecoder { @@ -12,25 +15,31 @@ export class WebCodecsDecoder { public readonly maxLevel = undefined; private _writable: WritableStream; - public get writable() { return this._writable; } + public get writable() { + return this._writable; + } private _renderer: HTMLCanvasElement; - public get renderer() { return this._renderer; } + public get renderer() { + return this._renderer; + } private _frameRendered = 0; - public get frameRendered() { return this._frameRendered; } + public get frameRendered() { + return this._frameRendered; + } private context: CanvasRenderingContext2D; private decoder: VideoDecoder; // Limit FPS to system refresh rate private lastFrame: VideoFrame | undefined; - private animationFrame: number = 0; + private animationFrame = 0; public constructor() { - this._renderer = document.createElement('canvas'); + this._renderer = document.createElement("canvas"); - this.context = this._renderer.getContext('2d')!; + this.context = this._renderer.getContext("2d")!; this.decoder = new VideoDecoder({ output: (frame) => { if (this.lastFrame) { @@ -43,25 +52,30 @@ export class WebCodecsDecoder { this.render(); } }, - error() { }, + error(e) { + void e; + }, }); this._writable = new WritableStream({ - write: async (packet) => { + write: (packet) => { switch (packet.type) { - case 'configuration': + case "configuration": this.configure(packet.data); break; - case 'frame': - this.decoder.decode(new EncodedVideoChunk({ - // Treat `undefined` as `key`, otherwise won't decode. - type: packet.keyframe === false ? 'delta' : 'key', - timestamp: 0, - data: packet.data, - })); + case "frame": + this.decoder.decode( + new EncodedVideoChunk({ + // Treat `undefined` as `key`, otherwise won't decode. + type: + packet.keyframe === false ? "delta" : "key", + timestamp: 0, + data: packet.data, + }) + ); break; } - } + }, }); } @@ -84,7 +98,9 @@ export class WebCodecsDecoder { // https://www.rfc-editor.org/rfc/rfc6381#section-3.3 // ISO Base Media File Format Name Space - const codec = `avc1.${[profileIndex, constraintSet, levelIndex].map(toHex).join('')}`; + const codec = `avc1.${[profileIndex, constraintSet, levelIndex] + .map(toHex) + .join("")}`; this.decoder.configure({ codec: codec, optimizeForLatency: true, diff --git a/libraries/scrcpy-decoder-webcodecs/tsconfig.build.json b/libraries/scrcpy-decoder-webcodecs/tsconfig.build.json index 9916d4b3..97a26443 100644 --- a/libraries/scrcpy-decoder-webcodecs/tsconfig.build.json +++ b/libraries/scrcpy-decoder-webcodecs/tsconfig.build.json @@ -1,5 +1,5 @@ { - "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json", + "extends": "./node_modules/@yume-chan/tsconfig/tsconfig.base.json", "compilerOptions": { "lib": [ "ESNext", diff --git a/libraries/scrcpy-decoder-webcodecs/tsconfig.test.json b/libraries/scrcpy-decoder-webcodecs/tsconfig.test.json index e987f757..91bf2e04 100644 --- a/libraries/scrcpy-decoder-webcodecs/tsconfig.test.json +++ b/libraries/scrcpy-decoder-webcodecs/tsconfig.test.json @@ -1,8 +1,6 @@ { "extends": "./tsconfig.build.json", "compilerOptions": { - "types": [ - ], }, "exclude": [] } diff --git a/libraries/scrcpy/.eslintrc.cjs b/libraries/scrcpy/.eslintrc.cjs new file mode 100644 index 00000000..e225d0db --- /dev/null +++ b/libraries/scrcpy/.eslintrc.cjs @@ -0,0 +1,11 @@ +module.exports = { + "extends": [ + "@yume-chan" + ], + parserOptions: { + tsconfigRootDir: __dirname, + project: [ + "./tsconfig.test.json" + ], + }, +} diff --git a/libraries/scrcpy/.npmignore b/libraries/scrcpy/.npmignore index 667ace40..e44e2e62 100644 --- a/libraries/scrcpy/.npmignore +++ b/libraries/scrcpy/.npmignore @@ -8,6 +8,7 @@ coverage **/__helpers__ jest.config.js +.eslintrc.cjs tsconfig.json tsconfig.test.json diff --git a/libraries/scrcpy/package.json b/libraries/scrcpy/package.json index 62a11277..3228eff8 100644 --- a/libraries/scrcpy/package.json +++ b/libraries/scrcpy/package.json @@ -32,6 +32,7 @@ "build": "tsc -b tsconfig.build.json", "build:watch": "tsc -b tsconfig.build.json", "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage", + "lint": "eslint src/**/*.ts --fix", "prepublishOnly": "npm run build" }, "dependencies": { @@ -44,12 +45,14 @@ "devDependencies": { "@jest/globals": "^29.3.1", "@yume-chan/adb": "workspace:^0.0.17", - "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "@yume-chan/eslint-config": "workspace:^1.0.0", + "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", + "eslint": "^8.30.0", "gh-release-fetch": "^3.0.2", "jest": "^29.3.1", "ts-jest": "^29.0.3", - "typescript": "^4.8.4" + "typescript": "^4.9.4" }, "peerDependencies": { "@yume-chan/adb": "workspace:^0.0.17", diff --git a/libraries/scrcpy/src/adb/client.ts b/libraries/scrcpy/src/adb/client.ts index 5c6ed190..f3262eda 100644 --- a/libraries/scrcpy/src/adb/client.ts +++ b/libraries/scrcpy/src/adb/client.ts @@ -1,12 +1,35 @@ -import { Adb, AdbSubprocessNoneProtocol, AdbSubprocessProtocol, AdbSync } from '@yume-chan/adb'; -import { AbortController, DecodeUtf8Stream, InspectStream, ReadableStream, SplitStringStream, WrapWritableStream, WritableStream, type ReadableStreamDefaultController, type ReadableStreamDefaultReader, type ReadableWritablePair } from '@yume-chan/stream-extra'; - -import { ScrcpyControlMessageSerializer } from '../control/index.js'; -import { ScrcpyDeviceMessageDeserializeStream, type ScrcpyDeviceMessage } from '../device-message/index.js'; -import { DEFAULT_SERVER_PATH, type ScrcpyVideoStreamPacket } from '../options/index.js'; -import type { AdbScrcpyOptions } from './options/index.js'; - -class ArrayToStream extends ReadableStream{ +import { + AdbSubprocessNoneProtocol, + type Adb, + type AdbSubprocessProtocol, + type AdbSync, +} from "@yume-chan/adb"; +import { + AbortController, + DecodeUtf8Stream, + InspectStream, + ReadableStream, + SplitStringStream, + WrapWritableStream, + WritableStream, + type ReadableStreamDefaultController, + type ReadableStreamDefaultReader, + type ReadableWritablePair, +} from "@yume-chan/stream-extra"; + +import { ScrcpyControlMessageSerializer } from "../control/index.js"; +import { + ScrcpyDeviceMessageDeserializeStream, + type ScrcpyDeviceMessage, +} from "../device-message/index.js"; +import { + DEFAULT_SERVER_PATH, + type ScrcpyVideoStreamPacket, +} from "../options/index.js"; + +import { type AdbScrcpyOptions } from "./options/index.js"; + +class ArrayToStream extends ReadableStream { private array!: T[]; private index = 0; @@ -28,7 +51,7 @@ class ArrayToStream extends ReadableStream{ } } -class ConcatStream extends ReadableStream{ +class ConcatStream extends ReadableStream { private streams!: ReadableStream[]; private index = 0; private reader!: ReadableStreamDefaultReader; @@ -48,7 +71,7 @@ class ConcatStream extends ReadableStream{ return; } this.advance(controller); - } + }, }); } @@ -62,11 +85,17 @@ class ConcatStream extends ReadableStream{ } } +export class ScrcpyExitedError extends Error { + public output: string[]; + + public constructor(output: string[]) { + super("scrcpy server exited prematurely"); + this.output = output; + } +} + export class AdbScrcpyClient { - public static pushServer( - adb: Adb, - path = DEFAULT_SERVER_PATH, - ) { + public static pushServer(adb: Adb, path = DEFAULT_SERVER_PATH) { let sync!: AdbSync; return new WrapWritableStream({ async start() { @@ -83,7 +112,7 @@ export class AdbScrcpyClient { adb: Adb, path: string, version: string, - options: AdbScrcpyOptions + options: AdbScrcpyOptions ) { const connection = options.createConnection(adb); let process: AdbSubprocessProtocol | undefined; @@ -95,9 +124,9 @@ export class AdbScrcpyClient { [ // cspell: disable-next-line `CLASSPATH=${path}`, - 'app_process', - /* unused */ '/', - 'com.genymobile.scrcpy.Server', + "app_process", + /* unused */ "/", + "com.genymobile.scrcpy.Server", version, ...options.formatServerArguments(), ], @@ -110,31 +139,34 @@ export class AdbScrcpyClient { const stdout = process.stdout .pipeThrough(new DecodeUtf8Stream()) - .pipeThrough(new SplitStringStream('\n')); + .pipeThrough(new SplitStringStream("\n")); // Read stdout, otherwise `process.exit` won't resolve. const output: string[] = []; const abortController = new AbortController(); const pipe = stdout - .pipeTo(new WritableStream({ - write(chunk) { - output.push(chunk); + .pipeTo( + new WritableStream({ + write(chunk) { + output.push(chunk); + }, + }), + { + signal: abortController.signal, + preventCancel: true, } - }), { - signal: abortController.signal, - preventCancel: true, - }) - .catch(() => { }); + ) + .catch((e) => { + void e; + }); const result = await Promise.race([ process.exit, connection.getStreams(), ]); - if (typeof result === 'number') { - const error = new Error('scrcpy server exited prematurely'); - (error as any).output = output; - throw error; + if (typeof result === "number") { + throw new ScrcpyExitedError(output); } abortController.abort(); @@ -144,10 +176,7 @@ export class AdbScrcpyClient { return new AdbScrcpyClient( options, process, - new ConcatStream( - new ArrayToStream(output), - stdout, - ), + new ConcatStream(new ArrayToStream(output), stdout), videoStream, controlStream ); @@ -167,35 +196,34 @@ export class AdbScrcpyClient { adb: Adb, path: string, version: string, - options: AdbScrcpyOptions + options: AdbScrcpyOptions ): Promise { - // Provide an invalid encoder name - // So the server will return all available encoders - options.value.encoderName = '_'; - // Disable control for faster connection in 1.22+ - options.value.control = false; - options.value.sendDeviceMeta = false; - options.value.sendDummyByte = false; + Object.assign(options.value, { + // Provide an invalid encoder name + // So the server will return all available encoders + encoderName: "_", + // Disable control for faster connection in 1.22+ + control: false, + sendDeviceMeta: false, + sendDummyByte: false, + }); // Scrcpy server will open connections, before initializing encoder // Thus although an invalid encoder name is given, the start process will success - const client = await AdbScrcpyClient.start( - adb, - path, - version, - options - ); + const client = await AdbScrcpyClient.start(adb, path, version, options); const encoderNameRegex = options.getOutputEncoderNameRegex(); const encoders: string[] = []; - await client.stdout.pipeTo(new WritableStream({ - write(line) { - const match = line.match(encoderNameRegex); - if (match) { - encoders.push(match[1]!); - } - }, - })); + await client.stdout.pipeTo( + new WritableStream({ + write(line) { + const match = line.match(encoderNameRegex); + if (match) { + encoders.push(match[1]!); + } + }, + }) + ); return encoders; } @@ -208,25 +236,25 @@ export class AdbScrcpyClient { adb: Adb, path: string, version: string, - options: AdbScrcpyOptions + options: AdbScrcpyOptions ): Promise { - // Similar to `getEncoders`, pass an invalid option and parse the output - options.value.displayId = -1; - - options.value.control = false; - options.value.sendDeviceMeta = false; - options.value.sendDummyByte = false; + Object.assign(options.value, { + // Similar to `getEncoders`, pass an invalid option and parse the output + displayId: -1, + // Disable control for faster connection in 1.22+ + control: false, + sendDeviceMeta: false, + sendDummyByte: false, + }); try { // Server will exit before opening connections when an invalid display id was given. await AdbScrcpyClient.start(adb, path, version, options); } catch (e) { - if (e instanceof Error) { - const output = (e as any).output as string[]; - + if (e instanceof ScrcpyExitedError) { const displayIdRegex = /\s+scrcpy --display (\d+)/; const displays: number[] = []; - for (const line of output) { + for (const line of e.output) { const match = line.match(displayIdRegex); if (match) { displays.push(Number.parseInt(match[1]!, 10)); @@ -236,53 +264,78 @@ export class AdbScrcpyClient { } } - throw new Error('failed to get displays'); + throw new Error("failed to get displays"); } private process: AdbSubprocessProtocol; private _stdout: ReadableStream; - public get stdout() { return this._stdout; } + public get stdout() { + return this._stdout; + } - public get exit() { return this.process.exit; } + public get exit() { + return this.process.exit; + } private _screenWidth: number | undefined; - public get screenWidth() { return this._screenWidth; } + public get screenWidth() { + return this._screenWidth; + } private _screenHeight: number | undefined; - public get screenHeight() { return this._screenHeight; } + public get screenHeight() { + return this._screenHeight; + } private _videoStream: ReadableStream; - public get videoStream() { return this._videoStream; } + public get videoStream() { + return this._videoStream; + } - private _controlMessageSerializer: ScrcpyControlMessageSerializer | undefined; - public get controlMessageSerializer() { return this._controlMessageSerializer; } + private _controlMessageSerializer: + | ScrcpyControlMessageSerializer + | undefined; + public get controlMessageSerializer() { + return this._controlMessageSerializer; + } - private _deviceMessageStream: ReadableStream | undefined; - public get deviceMessageStream() { return this._deviceMessageStream; } + private _deviceMessageStream: + | ReadableStream + | undefined; + public get deviceMessageStream() { + return this._deviceMessageStream; + } public constructor( - options: AdbScrcpyOptions, + options: AdbScrcpyOptions, process: AdbSubprocessProtocol, stdout: ReadableStream, videoStream: ReadableStream, - controlStream: ReadableWritablePair | undefined, + controlStream: ReadableWritablePair | undefined ) { this.process = process; this._stdout = stdout; this._videoStream = videoStream .pipeThrough(options.createVideoStreamTransformer()) - .pipeThrough(new InspectStream(packet => { - if (packet.type === 'configuration') { - this._screenWidth = packet.data.croppedWidth; - this._screenHeight = packet.data.croppedHeight; - } - })); + .pipeThrough( + new InspectStream((packet) => { + if (packet.type === "configuration") { + this._screenWidth = packet.data.croppedWidth; + this._screenHeight = packet.data.croppedHeight; + } + }) + ); if (controlStream) { - this._controlMessageSerializer = new ScrcpyControlMessageSerializer(controlStream.writable, options); - this._deviceMessageStream = controlStream.readable.pipeThrough(new ScrcpyDeviceMessageDeserializeStream()); + this._controlMessageSerializer = new ScrcpyControlMessageSerializer( + controlStream.writable, + options + ); + this._deviceMessageStream = controlStream.readable.pipeThrough( + new ScrcpyDeviceMessageDeserializeStream() + ); } } diff --git a/libraries/scrcpy/src/adb/connection.ts b/libraries/scrcpy/src/adb/connection.ts index 890c8eed..3e0d3134 100644 --- a/libraries/scrcpy/src/adb/connection.ts +++ b/libraries/scrcpy/src/adb/connection.ts @@ -1,8 +1,13 @@ -import type { Adb } from '@yume-chan/adb'; -import { delay } from '@yume-chan/async'; -import type { Disposable } from '@yume-chan/event'; -import { TransformStream, type ReadableStream, type ReadableStreamDefaultReader, type ReadableWritablePair } from '@yume-chan/stream-extra'; -import type { ValueOrPromise } from '@yume-chan/struct'; +import { type Adb } from "@yume-chan/adb"; +import { delay } from "@yume-chan/async"; +import { type Disposable } from "@yume-chan/event"; +import { + TransformStream, + type ReadableStream, + type ReadableStreamDefaultReader, + type ReadableWritablePair, +} from "@yume-chan/stream-extra"; +import { type ValueOrPromise } from "@yume-chan/struct"; export interface AdbScrcpyConnectionOptions { control: boolean; @@ -28,20 +33,33 @@ export abstract class AdbScrcpyConnection implements Disposable { this.options = options; } - public initialize(): ValueOrPromise { } - - public abstract getStreams(): ValueOrPromise<[videoSteam: ReadableStream, controlStream: ReadableWritablePair | undefined]>; + public initialize(): ValueOrPromise { + // do nothing + } - public dispose(): void { } + public abstract getStreams(): ValueOrPromise< + [ + videoSteam: ReadableStream, + controlStream: + | ReadableWritablePair + | undefined + ] + >; + + public dispose(): void { + // do nothing + } } export class AdbScrcpyForwardConnection extends AdbScrcpyConnection { private connect(): Promise> { - return this.adb.createSocket('localabstract:scrcpy'); + return this.adb.createSocket("localabstract:scrcpy"); } - private async connectAndRetry(): Promise> { - for (let i = 0; i < 100; i++) { + private async connectAndRetry(): Promise< + ReadableWritablePair + > { + for (let i = 0; i < 100; i += 1) { try { return await this.connect(); } catch (e) { @@ -58,17 +76,26 @@ export class AdbScrcpyForwardConnection extends AdbScrcpyConnection { const { done, value } = await reader.read(); // server will write a `0` to signal connection success if (done || value.byteLength !== 1 || value[0] !== 0) { - throw new Error('Unexpected response from server'); + throw new Error("Unexpected response from server"); } reader.releaseLock(); } return videoStream; } - public async getStreams(): Promise<[videoSteam: ReadableStream, controlStream: ReadableWritablePair | undefined]> { + public async getStreams(): Promise< + [ + videoSteam: ReadableStream, + controlStream: + | ReadableWritablePair + | undefined + ] + > { const videoStream = await this.connectVideoStream(); - let controlStream: ReadableWritablePair | undefined; + let controlStream: + | ReadableWritablePair + | undefined; if (this.options.control) { controlStream = await this.connectAndRetry(); } @@ -79,7 +106,7 @@ export class AdbScrcpyForwardConnection extends AdbScrcpyConnection { const { done, value } = await reader.read(); // 64 bytes device name + 2 bytes video width + 2 bytes video height if (done || value.byteLength !== 64 + 2 + 2) { - throw new Error('Unexpected response from server'); + throw new Error("Unexpected response from server"); } reader.releaseLock(); } @@ -89,35 +116,53 @@ export class AdbScrcpyForwardConnection extends AdbScrcpyConnection { } export class AdbScrcpyReverseConnection extends AdbScrcpyConnection { - private streams!: ReadableStreamDefaultReader>; + private streams!: ReadableStreamDefaultReader< + ReadableWritablePair + >; private address!: string; public override async initialize(): Promise { // try to unbind first, ignore errors - await this.adb.reverse.remove('localabstract:scrcpy').catch(() => { }); - - const queue = new TransformStream>(); + await this.adb.reverse.remove("localabstract:scrcpy").catch((e) => { + void e; + }); + + const queue = new TransformStream< + ReadableWritablePair, + ReadableWritablePair + >(); this.streams = queue.readable.getReader(); const writer = queue.writable.getWriter(); this.address = await this.adb.reverse.add( - 'localabstract:scrcpy', - 'tcp:27183', - socket => { - writer.write(socket); + "localabstract:scrcpy", + "tcp:27183", + (socket) => { + void writer.write(socket); return true; - }, + } ); } - private async accept(): Promise> { + private async accept(): Promise< + ReadableWritablePair + > { return (await this.streams.read()).value!; } - public async getStreams(): Promise<[videoSteam: ReadableStream, controlStream: ReadableWritablePair | undefined]> { + public async getStreams(): Promise< + [ + videoSteam: ReadableStream, + controlStream: + | ReadableWritablePair + | undefined + ] + > { const { readable: videoStream } = await this.accept(); - let controlStream: ReadableWritablePair | undefined; + let controlStream: + | ReadableWritablePair + | undefined; if (this.options.control) { controlStream = await this.accept(); } @@ -128,7 +173,7 @@ export class AdbScrcpyReverseConnection extends AdbScrcpyConnection { const { done, value } = await reader.read(); // 64 bytes device name + 2 bytes video width + 2 bytes video height if (done || value.byteLength !== 64 + 2 + 2) { - throw new Error('Unexpected response from server'); + throw new Error("Unexpected response from server"); } reader.releaseLock(); } @@ -140,6 +185,8 @@ export class AdbScrcpyReverseConnection extends AdbScrcpyConnection { // Don't await this! // `reverse.remove`'s response will never arrive // before we read all pending data from `videoStream` - this.adb.reverse.remove(this.address); + this.adb.reverse.remove(this.address).catch((e) => { + void e; + }); } } diff --git a/libraries/scrcpy/src/adb/options/1_16.ts b/libraries/scrcpy/src/adb/options/1_16.ts index a3c53dec..49e0b28b 100644 --- a/libraries/scrcpy/src/adb/options/1_16.ts +++ b/libraries/scrcpy/src/adb/options/1_16.ts @@ -1,11 +1,18 @@ -import type { Adb } from '@yume-chan/adb'; +import { type Adb } from "@yume-chan/adb"; -import type { ScrcpyOptionsInit1_16 } from '../../options/index.js'; -import { AdbScrcpyConnection, AdbScrcpyConnectionOptions, AdbScrcpyForwardConnection, AdbScrcpyReverseConnection } from '../connection.js'; -import { AdbScrcpyOptionsBase } from './types.js'; +import { type ScrcpyOptionsInit1_16 } from "../../options/index.js"; +import { + AdbScrcpyForwardConnection, + AdbScrcpyReverseConnection, + type AdbScrcpyConnection, + type AdbScrcpyConnectionOptions, +} from "../connection.js"; -export class AdbScrcpyOptions1_16 - extends AdbScrcpyOptionsBase { +import { AdbScrcpyOptionsBase } from "./types.js"; + +export class AdbScrcpyOptions1_16< + T extends ScrcpyOptionsInit1_16 = ScrcpyOptionsInit1_16 +> extends AdbScrcpyOptionsBase { public override createConnection(adb: Adb): AdbScrcpyConnection { const options: AdbScrcpyConnectionOptions = { // Old versions always have control stream no matter what the option is diff --git a/libraries/scrcpy/src/adb/options/1_22.ts b/libraries/scrcpy/src/adb/options/1_22.ts index 57dea46d..3054e1a9 100644 --- a/libraries/scrcpy/src/adb/options/1_22.ts +++ b/libraries/scrcpy/src/adb/options/1_22.ts @@ -1,11 +1,17 @@ -import type { Adb } from '@yume-chan/adb'; +import { type Adb } from "@yume-chan/adb"; -import type { ScrcpyOptionsInit1_22 } from '../../options/index.js'; -import { AdbScrcpyConnection, AdbScrcpyForwardConnection, AdbScrcpyReverseConnection } from '../connection.js'; -import { AdbScrcpyOptions1_16 } from './1_16.js'; +import { type ScrcpyOptionsInit1_22 } from "../../options/index.js"; +import { + type AdbScrcpyConnection, + AdbScrcpyForwardConnection, + AdbScrcpyReverseConnection, +} from "../connection.js"; -export class AdbScrcpyOptions1_22 - extends AdbScrcpyOptions1_16 { +import { AdbScrcpyOptions1_16 } from "./1_16.js"; + +export class AdbScrcpyOptions1_22< + T extends ScrcpyOptionsInit1_22 = ScrcpyOptionsInit1_22 +> extends AdbScrcpyOptions1_16 { public override createConnection(adb: Adb): AdbScrcpyConnection { const options = { ...this.getDefaultValue(), diff --git a/libraries/scrcpy/src/adb/options/types.ts b/libraries/scrcpy/src/adb/options/types.ts index bf5aed40..70460ae6 100644 --- a/libraries/scrcpy/src/adb/options/types.ts +++ b/libraries/scrcpy/src/adb/options/types.ts @@ -1,19 +1,30 @@ -import type { Adb } from '@yume-chan/adb'; -import type { TransformStream } from '@yume-chan/stream-extra'; +import { type Adb } from "@yume-chan/adb"; +import { type TransformStream } from "@yume-chan/stream-extra"; -import type { ScrcpyControlMessageType } from '../../control/index.js'; -import type { ScrcpyBackOrScreenOnControlMessage1_18, ScrcpyInjectScrollControlMessage1_22, ScrcpyOptions, ScrcpyVideoStreamPacket } from '../../options/index.js'; -import type { AdbScrcpyConnection } from '../connection.js'; +import { type ScrcpyControlMessageType } from "../../control/index.js"; +import { + type ScrcpyBackOrScreenOnControlMessage1_18, + type ScrcpyInjectScrollControlMessage1_22, + type ScrcpyOptions, + type ScrcpyVideoStreamPacket, +} from "../../options/index.js"; +import { type AdbScrcpyConnection } from "../connection.js"; -export interface AdbScrcpyOptions extends ScrcpyOptions { +export interface AdbScrcpyOptions extends ScrcpyOptions { createConnection(adb: Adb): AdbScrcpyConnection; } -export abstract class AdbScrcpyOptionsBase implements ScrcpyOptions { +export abstract class AdbScrcpyOptionsBase + implements ScrcpyOptions +{ private raw: ScrcpyOptions; - public get value(): Partial { return this.raw.value; } - public set value(value: Partial) { this.raw.value = value; } + public get value(): Partial { + return this.raw.value; + } + public set value(value: Partial) { + this.raw.value = value; + } public constructor(raw: ScrcpyOptions) { this.raw = raw; @@ -31,7 +42,10 @@ export abstract class AdbScrcpyOptionsBase implements ScrcpyOptions { return this.raw.getOutputEncoderNameRegex(); } - public createVideoStreamTransformer(): TransformStream { + public createVideoStreamTransformer(): TransformStream< + Uint8Array, + ScrcpyVideoStreamPacket + > { return this.raw.createVideoStreamTransformer(); } @@ -40,13 +54,13 @@ export abstract class AdbScrcpyOptionsBase implements ScrcpyOptions { } public serializeBackOrScreenOnControlMessage( - message: ScrcpyBackOrScreenOnControlMessage1_18, + message: ScrcpyBackOrScreenOnControlMessage1_18 ): Uint8Array | undefined { return this.raw.serializeBackOrScreenOnControlMessage(message); } public serializeInjectScrollControlMessage( - message: ScrcpyInjectScrollControlMessage1_22, + message: ScrcpyInjectScrollControlMessage1_22 ): Uint8Array { return this.raw.serializeInjectScrollControlMessage(message); } diff --git a/libraries/scrcpy/src/control/inject-touch.ts b/libraries/scrcpy/src/control/inject-touch.ts index 52b5cfb2..00a8ad40 100644 --- a/libraries/scrcpy/src/control/inject-touch.ts +++ b/libraries/scrcpy/src/control/inject-touch.ts @@ -1,5 +1,6 @@ -import Struct, { placeholder } from '@yume-chan/struct'; -import { ScrcpyControlMessageType } from './type.js'; +import Struct, { placeholder } from "@yume-chan/struct"; + +import { ScrcpyControlMessageType } from "./type.js"; // https://developer.android.com/reference/android/view/MotionEvent#constants_1 export enum AndroidMotionEventAction { @@ -18,17 +19,16 @@ export enum AndroidMotionEventAction { ButtonRelease, } -export const ScrcpyInjectTouchControlMessage = - new Struct() - .uint8('type', ScrcpyControlMessageType.InjectTouch as const) - .uint8('action', placeholder()) - .uint64('pointerId') - .uint32('pointerX') - .uint32('pointerY') - .uint16('screenWidth') - .uint16('screenHeight') - .uint16('pressure') - .uint32('buttons'); +export const ScrcpyInjectTouchControlMessage = new Struct() + .uint8("type", ScrcpyControlMessageType.InjectTouch as const) + .uint8("action", placeholder()) + .uint64("pointerId") + .uint32("pointerX") + .uint32("pointerY") + .uint16("screenWidth") + .uint16("screenHeight") + .uint16("pressure") + .uint32("buttons"); export type ScrcpyInjectTouchControlMessage = - typeof ScrcpyInjectTouchControlMessage['TInit']; + typeof ScrcpyInjectTouchControlMessage["TInit"]; diff --git a/libraries/scrcpy/src/control/serializer.ts b/libraries/scrcpy/src/control/serializer.ts index b818f18d..8d487b2b 100644 --- a/libraries/scrcpy/src/control/serializer.ts +++ b/libraries/scrcpy/src/control/serializer.ts @@ -1,20 +1,36 @@ -import type { WritableStream, WritableStreamDefaultWriter } from '@yume-chan/stream-extra'; +import { + type WritableStream, + type WritableStreamDefaultWriter, +} from "@yume-chan/stream-extra"; -import type { ScrcpyInjectScrollControlMessage1_22, ScrcpyOptions } from '../options/index.js'; -import { AndroidKeyEventAction, ScrcpyInjectKeyCodeControlMessage } from './inject-keycode.js'; -import { ScrcpyInjectTextControlMessage } from './inject-text.js'; -import { ScrcpyInjectTouchControlMessage } from './inject-touch.js'; -import { ScrcpyRotateDeviceControlMessage } from './rotate-device.js'; -import { AndroidScreenPowerMode, ScrcpySetScreenPowerModeControlMessage } from './set-screen-power-mode.js'; -import { ScrcpyControlMessageType } from './type.js'; +import { + type ScrcpyInjectScrollControlMessage1_22, + type ScrcpyOptions, +} from "../options/index.js"; + +import { + ScrcpyInjectKeyCodeControlMessage, + type AndroidKeyEventAction, +} from "./inject-keycode.js"; +import { ScrcpyInjectTextControlMessage } from "./inject-text.js"; +import { ScrcpyInjectTouchControlMessage } from "./inject-touch.js"; +import { ScrcpyRotateDeviceControlMessage } from "./rotate-device.js"; +import { + ScrcpySetScreenPowerModeControlMessage, + type AndroidScreenPowerMode, +} from "./set-screen-power-mode.js"; +import { ScrcpyControlMessageType } from "./type.js"; export class ScrcpyControlMessageSerializer { - private options: ScrcpyOptions; + private options: ScrcpyOptions; /** Control message type values for current version of server */ private types: ScrcpyControlMessageType[]; private writer: WritableStreamDefaultWriter; - public constructor(stream: WritableStream, options: ScrcpyOptions) { + public constructor( + stream: WritableStream, + options: ScrcpyOptions + ) { this.options = options; this.types = options.getControlMessageTypes(); this.writer = stream.getWriter(); @@ -23,37 +39,49 @@ export class ScrcpyControlMessageSerializer { public getTypeValue(type: ScrcpyControlMessageType): number { const value = this.types.indexOf(type); if (value === -1) { - throw new Error('Not supported'); + throw new Error("Not supported"); } return value; } - public injectKeyCode(message: Omit) { - return this.writer.write(ScrcpyInjectKeyCodeControlMessage.serialize({ - ...message, - type: this.getTypeValue(ScrcpyControlMessageType.InjectKeyCode), - })); + public injectKeyCode( + message: Omit + ) { + return this.writer.write( + ScrcpyInjectKeyCodeControlMessage.serialize({ + ...message, + type: this.getTypeValue(ScrcpyControlMessageType.InjectKeyCode), + }) + ); } public injectText(text: string) { - return this.writer.write(ScrcpyInjectTextControlMessage.serialize({ - text, - type: this.getTypeValue(ScrcpyControlMessageType.InjectText), - })); + return this.writer.write( + ScrcpyInjectTextControlMessage.serialize({ + text, + type: this.getTypeValue(ScrcpyControlMessageType.InjectText), + }) + ); } - public injectTouch(message: Omit) { - return this.writer.write(ScrcpyInjectTouchControlMessage.serialize({ - ...message, - type: this.getTypeValue(ScrcpyControlMessageType.InjectTouch), - })); + public injectTouch(message: Omit) { + return this.writer.write( + ScrcpyInjectTouchControlMessage.serialize({ + ...message, + type: this.getTypeValue(ScrcpyControlMessageType.InjectTouch), + }) + ); } - public injectScroll(message: Omit) { - return this.writer.write(this.options.serializeInjectScrollControlMessage({ - ...message, - type: this.getTypeValue(ScrcpyControlMessageType.InjectScroll), - })); + public injectScroll( + message: Omit + ) { + return this.writer.write( + this.options.serializeInjectScrollControlMessage({ + ...message, + type: this.getTypeValue(ScrcpyControlMessageType.InjectScroll), + }) + ); } public async backOrScreenOn(action: AndroidKeyEventAction) { @@ -68,19 +96,25 @@ export class ScrcpyControlMessageSerializer { } public setScreenPowerMode(mode: AndroidScreenPowerMode) { - return this.writer.write(ScrcpySetScreenPowerModeControlMessage.serialize({ - mode, - type: this.getTypeValue(ScrcpyControlMessageType.SetScreenPowerMode), - })); + return this.writer.write( + ScrcpySetScreenPowerModeControlMessage.serialize({ + mode, + type: this.getTypeValue( + ScrcpyControlMessageType.SetScreenPowerMode + ), + }) + ); } public rotateDevice() { - return this.writer.write(ScrcpyRotateDeviceControlMessage.serialize({ - type: this.getTypeValue(ScrcpyControlMessageType.RotateDevice), - })); + return this.writer.write( + ScrcpyRotateDeviceControlMessage.serialize({ + type: this.getTypeValue(ScrcpyControlMessageType.RotateDevice), + }) + ); } public close() { return this.writer.close(); } -}; +} diff --git a/libraries/scrcpy/src/device-message/clipboard.ts b/libraries/scrcpy/src/device-message/clipboard.ts index 1d72feb9..dcab57c8 100644 --- a/libraries/scrcpy/src/device-message/clipboard.ts +++ b/libraries/scrcpy/src/device-message/clipboard.ts @@ -1,11 +1,11 @@ -import Struct from '@yume-chan/struct'; -import { ScrcpyDeviceMessageType } from './type.js'; +import Struct from "@yume-chan/struct"; -export const ScrcpyClipboardDeviceMessage = - new Struct() - .uint32('length') - .string('content', { lengthField: 'length' }) - .extra({ type: ScrcpyDeviceMessageType.Clipboard as const }); +import { ScrcpyDeviceMessageType } from "./type.js"; + +export const ScrcpyClipboardDeviceMessage = new Struct() + .uint32("length") + .string("content", { lengthField: "length" }) + .extra({ type: ScrcpyDeviceMessageType.Clipboard as const }); export type ScrcpyClipboardDeviceMessage = - typeof ScrcpyClipboardDeviceMessage['TDeserializeResult']; + typeof ScrcpyClipboardDeviceMessage["TDeserializeResult"]; diff --git a/libraries/scrcpy/src/device-message/stream.ts b/libraries/scrcpy/src/device-message/stream.ts index 821ca5e2..7d19b713 100644 --- a/libraries/scrcpy/src/device-message/stream.ts +++ b/libraries/scrcpy/src/device-message/stream.ts @@ -1,8 +1,8 @@ -import { BufferedTransformStream } from '@yume-chan/stream-extra'; -import { ScrcpyClipboardDeviceMessage } from './clipboard.js'; +import { BufferedTransformStream } from "@yume-chan/stream-extra"; -export type ScrcpyDeviceMessage = - | ScrcpyClipboardDeviceMessage; +import { ScrcpyClipboardDeviceMessage } from "./clipboard.js"; + +export type ScrcpyDeviceMessage = ScrcpyClipboardDeviceMessage; export class ScrcpyDeviceMessageDeserializeStream extends BufferedTransformStream { constructor() { @@ -10,10 +10,12 @@ export class ScrcpyDeviceMessageDeserializeStream extends BufferedTransformStrea const type = await stream.read(1); switch (type[0]) { case 0: - return await ScrcpyClipboardDeviceMessage.deserialize(stream); + return await ScrcpyClipboardDeviceMessage.deserialize( + stream + ); default: - throw new Error('unknown control message type'); + throw new Error("unknown control message type"); } - }) + }); } } diff --git a/libraries/scrcpy/src/options/1_16/codec-options.spec.ts b/libraries/scrcpy/src/options/1_16/codec-options.spec.ts index a6ffbf3a..929d3a84 100644 --- a/libraries/scrcpy/src/options/1_16/codec-options.spec.ts +++ b/libraries/scrcpy/src/options/1_16/codec-options.spec.ts @@ -1,8 +1,9 @@ -import { describe, expect, it } from '@jest/globals'; -import { CodecOptions } from './codec-options.js'; +import { describe, expect, it } from "@jest/globals"; -describe('CodecOptions', () => { - it('ignore empty options', () => { +import { CodecOptions } from "./codec-options.js"; + +describe("CodecOptions", () => { + it("ignore empty options", () => { expect(new CodecOptions({}).toOptionValue()).toBeUndefined(); }); }); diff --git a/libraries/scrcpy/src/options/1_16/codec-options.ts b/libraries/scrcpy/src/options/1_16/codec-options.ts index 0c071cce..0e47576f 100644 --- a/libraries/scrcpy/src/options/1_16/codec-options.ts +++ b/libraries/scrcpy/src/options/1_16/codec-options.ts @@ -1,5 +1,8 @@ -import type { AndroidCodecLevel, AndroidCodecProfile } from '../../codec.js'; -import type { ScrcpyOptionValue } from '../types.js'; +import { + type AndroidCodecLevel, + type AndroidCodecProfile, +} from "../../codec.js"; +import { type ScrcpyOptionValue } from "../types.js"; /** * If the option you need is not in this type, @@ -15,12 +18,14 @@ export interface CodecOptionsInit { } function toDashCase(input: string) { - return input.replace(/([A-Z])/g, '-$1').toLowerCase(); + return input.replace(/([A-Z])/g, "-$1").toLowerCase(); } -const CODEC_OPTION_TYPES: Partial> = { - repeatPreviousFrameAfter: 'long', - maxPtsGapToEncoder: 'long', +const CODEC_OPTION_TYPES: Partial< + Record +> = { + repeatPreviousFrameAfter: "long", + maxPtsGapToEncoder: "long", }; export class CodecOptions implements ScrcpyOptionValue { @@ -31,8 +36,9 @@ export class CodecOptions implements ScrcpyOptionValue { } public toOptionValue(): string | undefined { - const entries = Object.entries(this.value) - .filter(([key, value]) => value !== undefined); + const entries = Object.entries(this.value).filter( + ([, value]) => value !== undefined + ); if (entries.length === 0) { return undefined; @@ -41,8 +47,8 @@ export class CodecOptions implements ScrcpyOptionValue { return entries .map(([key, value]) => { const type = CODEC_OPTION_TYPES[key as keyof CodecOptionsInit]; - return `${toDashCase(key)}${type ? `:${type}` : ''}=${value}`; + return `${toDashCase(key)}${type ? `:${type}` : ""}=${value}`; }) - .join(','); + .join(","); } } diff --git a/libraries/scrcpy/src/options/1_16/options.ts b/libraries/scrcpy/src/options/1_16/options.ts index 0c165ade..f21f8dee 100644 --- a/libraries/scrcpy/src/options/1_16/options.ts +++ b/libraries/scrcpy/src/options/1_16/options.ts @@ -1,19 +1,30 @@ -import { StructDeserializeStream, TransformStream } from '@yume-chan/stream-extra'; -import Struct from '@yume-chan/struct'; - -import { AndroidKeyEventAction, ScrcpyControlMessageType } from '../../control/index.js'; -import type { ScrcpyBackOrScreenOnControlMessage1_18 } from '../1_18.js'; -import type { ScrcpyInjectScrollControlMessage1_22 } from '../1_22.js'; -import { toScrcpyOptionValue, type ScrcpyOptions, type ScrcpyVideoStreamPacket } from '../types.js'; -import { CodecOptions } from './codec-options.js'; -import { parse_sequence_parameter_set } from './sps.js'; +import { + StructDeserializeStream, + TransformStream, +} from "@yume-chan/stream-extra"; +import Struct from "@yume-chan/struct"; + +import { + AndroidKeyEventAction, + ScrcpyControlMessageType, +} from "../../control/index.js"; +import { type ScrcpyBackOrScreenOnControlMessage1_18 } from "../1_18.js"; +import { type ScrcpyInjectScrollControlMessage1_22 } from "../1_22.js"; +import { + toScrcpyOptionValue, + type ScrcpyOptions, + type ScrcpyVideoStreamPacket, +} from "../types.js"; + +import { CodecOptions } from "./codec-options.js"; +import { parse_sequence_parameter_set } from "./sps.js"; export enum ScrcpyLogLevel { - Verbose = 'verbose', - Debug = 'debug', - Info = 'info', - Warn = 'warn', - Error = 'error', + Verbose = "verbose", + Debug = "debug", + Info = "info", + Warn = "warn", + Error = "error", } export enum ScrcpyVideoOrientation { @@ -83,40 +94,45 @@ export interface ScrcpyOptionsInit1_16 { encoderName: string; } -export const VideoPacket = - new Struct() - .uint64('pts') - .uint32('size') - .uint8Array('data', { lengthField: 'size' }); +export const VideoPacket = new Struct() + .uint64("pts") + .uint32("size") + .uint8Array("data", { lengthField: "size" }); export const NO_PTS = BigInt(1) << BigInt(63); -export const ScrcpyBackOrScreenOnControlMessage1_16 = - new Struct() - .uint8('type', ScrcpyControlMessageType.BackOrScreenOn as const); - -export const ScrcpyInjectScrollControlMessage1_16 = - new Struct() - .uint8('type', ScrcpyControlMessageType.InjectScroll as const) - .uint32('pointerX') - .uint32('pointerY') - .uint16('screenWidth') - .uint16('screenHeight') - .int32('scrollX') - .int32('scrollY'); - -export class ScrcpyOptions1_16 - implements ScrcpyOptions { +export const ScrcpyBackOrScreenOnControlMessage1_16 = new Struct().uint8( + "type", + ScrcpyControlMessageType.BackOrScreenOn as const +); + +export const ScrcpyInjectScrollControlMessage1_16 = new Struct() + .uint8("type", ScrcpyControlMessageType.InjectScroll as const) + .uint32("pointerX") + .uint32("pointerY") + .uint16("screenWidth") + .uint16("screenHeight") + .int32("scrollX") + .int32("scrollY"); + +export class ScrcpyOptions1_16< + T extends ScrcpyOptionsInit1_16 = ScrcpyOptionsInit1_16 +> implements ScrcpyOptions +{ public value: Partial; public constructor(value: Partial) { - if (new.target === ScrcpyOptions1_16 && - value.logLevel === ScrcpyLogLevel.Verbose) { + if ( + new.target === ScrcpyOptions1_16 && + value.logLevel === ScrcpyLogLevel.Verbose + ) { value.logLevel = ScrcpyLogLevel.Debug; } - if (new.target === ScrcpyOptions1_16 && - value.lockVideoOrientation === ScrcpyVideoOrientation.Initial) { + if ( + new.target === ScrcpyOptions1_16 && + value.lockVideoOrientation === ScrcpyVideoOrientation.Initial + ) { value.lockVideoOrientation = ScrcpyVideoOrientation.Unlocked; } @@ -125,20 +141,20 @@ export class ScrcpyOptions1_16 - toScrcpyOptionValue(this.value[key] || defaults[key], '-') - ); + return this.getArgumentOrder().map((key) => + toScrcpyOptionValue(this.value[key] || defaults[key], "-") + ); } public getOutputEncoderNameRegex(): RegExp { return /\s+scrcpy --encoder-name '(.*?)'/; } - public createVideoStreamTransformer(): TransformStream { + public createVideoStreamTransformer(): TransformStream< + Uint8Array, + ScrcpyVideoStreamPacket + > { // Optimized path for video frames only if (this.value.sendFrameMeta === false) { return new TransformStream({ transform(chunk, controller) { controller.enqueue({ - type: 'frame', + type: "frame", data: chunk, }); }, @@ -189,74 +206,87 @@ export class ScrcpyOptions1_16> (7 - this.bitPosition)) & 1; + const value = + (this.buffer[this.bytePosition]! >> (7 - this.bitPosition)) & 1; this.bitPosition += 1; if (this.bitPosition === 8) { this.bytePosition += 1; @@ -38,7 +39,7 @@ class BitReader { if (length === 0) { return 0; } - return (1 << length | this.read(length)) - 1; + return ((1 << length) | this.read(length)) - 1; } } @@ -59,7 +60,7 @@ function* iterateNalu(buffer: Uint8Array): Generator { if (inEmulation) { if (byte > 0x03) { // `0x00000304` or larger are invalid - throw new Error('Invalid data'); + throw new Error("Invalid data"); } inEmulation = false; @@ -86,7 +87,7 @@ function* iterateNalu(buffer: Uint8Array): Generator { } // Not begin with start code - throw new Error('Invalid data'); + throw new Error("Invalid data"); } if (lastZeroCount < 2) { @@ -107,13 +108,13 @@ function* iterateNalu(buffer: Uint8Array): Generator { if (lastZeroCount > 2) { // Too much `0x00`s - throw new Error('Invalid data'); + throw new Error("Invalid data"); } switch (byte) { case 0x02: // Didn't find why, but 7.4.1 NAL unit semantics forbids `0x000002` appearing in NAL units - throw new Error('Invalid data'); + throw new Error("Invalid data"); case 0x03: // `0x000003` is the "emulation_prevention_three_byte" // `0x00000300`, `0x00000301`, `0x00000302` and `0x00000303` represent @@ -131,7 +132,7 @@ function* iterateNalu(buffer: Uint8Array): Generator { } if (inEmulation || zeroCount !== 0) { - throw new Error('Invalid data'); + throw new Error("Invalid data"); } yield buffer.subarray(start, writeIndex); @@ -142,7 +143,7 @@ export function parse_sequence_parameter_set(buffer: ArrayBuffer) { for (const nalu of iterateNalu(new Uint8Array(buffer))) { const reader = new BitReader(nalu); if (reader.next() !== 0) { - throw new Error('Invalid data'); + throw new Error("Invalid data"); } const nal_ref_idc = reader.read(2); @@ -153,13 +154,15 @@ export function parse_sequence_parameter_set(buffer: ArrayBuffer) { } if (nal_ref_idc === 0) { - throw new Error('Invalid data'); + throw new Error("Invalid data"); } const profile_idc = reader.read(8); const constraint_set = reader.read(8); - const constraint_set_reader = new BitReader(new Uint8Array([constraint_set])); + const constraint_set_reader = new BitReader( + new Uint8Array([constraint_set]) + ); const constraint_set0_flag = !!constraint_set_reader.next(); const constraint_set1_flag = !!constraint_set_reader.next(); const constraint_set2_flag = !!constraint_set_reader.next(); @@ -169,17 +172,26 @@ export function parse_sequence_parameter_set(buffer: ArrayBuffer) { // reserved_zero_2bits if (constraint_set_reader.read(2) !== 0) { - throw new Error('Invalid data'); + throw new Error("Invalid data"); } const level_idc = reader.read(8); const seq_parameter_set_id = reader.decodeExponentialGolombNumber(); - if (profile_idc === 100 || profile_idc === 110 || - profile_idc === 122 || profile_idc === 244 || profile_idc === 44 || - profile_idc === 83 || profile_idc === 86 || profile_idc === 118 || - profile_idc === 128 || profile_idc === 138 || profile_idc === 139 || - profile_idc === 134) { + if ( + profile_idc === 100 || + profile_idc === 110 || + profile_idc === 122 || + profile_idc === 244 || + profile_idc === 44 || + profile_idc === 83 || + profile_idc === 86 || + profile_idc === 118 || + profile_idc === 128 || + profile_idc === 138 || + profile_idc === 139 || + profile_idc === 134 + ) { const chroma_format_idc = reader.decodeExponentialGolombNumber(); if (chroma_format_idc === 3) { // separate_colour_plane_flag @@ -197,7 +209,11 @@ export function parse_sequence_parameter_set(buffer: ArrayBuffer) { const seq_scaling_matrix_present_flag = !!reader.next(); if (seq_scaling_matrix_present_flag) { const seq_scaling_list_present_flag: boolean[] = []; - for (let i = 0; i < ((chroma_format_idc !== 3) ? 8 : 12); i++) { + for ( + let i = 0; + i < (chroma_format_idc !== 3 ? 8 : 12); + i += 1 + ) { seq_scaling_list_present_flag[i] = !!reader.next(); if (seq_scaling_list_present_flag[i]) if (i < 6) { @@ -226,10 +242,12 @@ export function parse_sequence_parameter_set(buffer: ArrayBuffer) { reader.decodeExponentialGolombNumber(); // offset_for_top_to_bottom_field reader.decodeExponentialGolombNumber(); - const num_ref_frames_in_pic_order_cnt_cycle = reader.decodeExponentialGolombNumber(); + const num_ref_frames_in_pic_order_cnt_cycle = + reader.decodeExponentialGolombNumber(); const offset_for_ref_frame: number[] = []; - for (let i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) { - offset_for_ref_frame[i] = reader.decodeExponentialGolombNumber(); + for (let i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i += 1) { + offset_for_ref_frame[i] = + reader.decodeExponentialGolombNumber(); } } @@ -238,7 +256,8 @@ export function parse_sequence_parameter_set(buffer: ArrayBuffer) { // gaps_in_frame_num_value_allowed_flag reader.next(); const pic_width_in_mbs_minus1 = reader.decodeExponentialGolombNumber(); - const pic_height_in_map_units_minus1 = reader.decodeExponentialGolombNumber(); + const pic_height_in_map_units_minus1 = + reader.decodeExponentialGolombNumber(); const frame_mbs_only_flag = reader.next(); if (!frame_mbs_only_flag) { @@ -294,7 +313,9 @@ export function parse_sequence_parameter_set(buffer: ArrayBuffer) { }; } - throw new Error('Invalid data'); + throw new Error("Invalid data"); } -export type SequenceParameterSet = ReturnType; +export type SequenceParameterSet = ReturnType< + typeof parse_sequence_parameter_set +>; diff --git a/libraries/scrcpy/src/options/1_18.ts b/libraries/scrcpy/src/options/1_18.ts index cde757ac..db83d777 100644 --- a/libraries/scrcpy/src/options/1_18.ts +++ b/libraries/scrcpy/src/options/1_18.ts @@ -1,27 +1,36 @@ -import Struct, { placeholder } from '@yume-chan/struct'; +import Struct, { placeholder } from "@yume-chan/struct"; -import { AndroidKeyEventAction, ScrcpyControlMessageType } from '../control/index.js'; -import { ScrcpyBackOrScreenOnControlMessage1_16, ScrcpyOptions1_16, type ScrcpyOptionsInit1_16 } from './1_16/options.js'; +import { + type AndroidKeyEventAction, + ScrcpyControlMessageType, +} from "../control/index.js"; + +import { + ScrcpyBackOrScreenOnControlMessage1_16, + ScrcpyOptions1_16, + type ScrcpyOptionsInit1_16, +} from "./1_16/options.js"; export interface ScrcpyOptionsInit1_18 extends ScrcpyOptionsInit1_16 { powerOffOnClose: boolean; } -export const ScrcpyBackOrScreenOnControlMessage1_18 = - new Struct() - .fields(ScrcpyBackOrScreenOnControlMessage1_16) - .uint8('action', placeholder()); +export const ScrcpyBackOrScreenOnControlMessage1_18 = new Struct() + .fields(ScrcpyBackOrScreenOnControlMessage1_16) + .uint8("action", placeholder()); -export type ScrcpyBackOrScreenOnControlMessage1_18 = typeof ScrcpyBackOrScreenOnControlMessage1_18['TInit']; +export type ScrcpyBackOrScreenOnControlMessage1_18 = + typeof ScrcpyBackOrScreenOnControlMessage1_18["TInit"]; -export class ScrcpyOptions1_18 - extends ScrcpyOptions1_16 { +export class ScrcpyOptions1_18< + T extends ScrcpyOptionsInit1_18 = ScrcpyOptionsInit1_18 +> extends ScrcpyOptions1_16 { constructor(value: Partial) { super(value); } protected override getArgumentOrder(): (keyof T)[] { - return super.getArgumentOrder().concat(['powerOffOnClose']); + return super.getArgumentOrder().concat(["powerOffOnClose"]); } public override getDefaultValue(): T { @@ -56,7 +65,7 @@ export class ScrcpyOptions1_18 - extends ScrcpyOptions1_22 { +export class ScrcpyOptions1_23< + T extends ScrcpyOptionsInit1_23 = ScrcpyOptionsInit1_23 +> extends ScrcpyOptions1_22 { public constructor(init: Partial) { super(init); } @@ -22,25 +23,33 @@ export class ScrcpyOptions1_23 { + public override createVideoStreamTransformer(): TransformStream< + Uint8Array, + ScrcpyVideoStreamPacket + > { const superStream = super.createVideoStreamTransformer(); return { writable: superStream.writable, - readable: superStream.readable.pipeThrough(new TransformStream({ - transform(packet, controller): void { - if (packet.type !== 'frame') { - controller.enqueue(packet); - return; - } - - if (packet.pts !== undefined && packet.pts & KEYFRAME_PTS) { - packet.keyframe = true; - packet.pts &= ~KEYFRAME_PTS; - } + readable: superStream.readable.pipeThrough( + new TransformStream({ + transform(packet, controller): void { + if (packet.type !== "frame") { + controller.enqueue(packet); + return; + } + + if ( + packet.pts !== undefined && + packet.pts & KEYFRAME_PTS + ) { + packet.keyframe = true; + packet.pts &= ~KEYFRAME_PTS; + } - controller.enqueue(packet); - } - })) + controller.enqueue(packet); + }, + }) + ), }; } } diff --git a/libraries/scrcpy/src/options/types.ts b/libraries/scrcpy/src/options/types.ts index e836e118..92e73e70 100644 --- a/libraries/scrcpy/src/options/types.ts +++ b/libraries/scrcpy/src/options/types.ts @@ -1,31 +1,37 @@ -import type { TransformStream } from '@yume-chan/stream-extra'; +import { type TransformStream } from "@yume-chan/stream-extra"; -import type { ScrcpyControlMessageType } from '../control/index.js'; -import type { ScrcpyBackOrScreenOnControlMessage1_18 } from './1_18.js'; -import type { ScrcpyInjectScrollControlMessage1_22 } from './1_22.js'; +import { type ScrcpyControlMessageType } from "../control/index.js"; -export const DEFAULT_SERVER_PATH = '/data/local/tmp/scrcpy-server.jar'; +import { type ScrcpyBackOrScreenOnControlMessage1_18 } from "./1_18.js"; +import { type ScrcpyInjectScrollControlMessage1_22 } from "./1_22.js"; + +export const DEFAULT_SERVER_PATH = "/data/local/tmp/scrcpy-server.jar"; export interface ScrcpyOptionValue { toOptionValue(): string | undefined; } -export function isScrcpyOptionValue(value: any): value is ScrcpyOptionValue { - return typeof value === 'object' && +export function isScrcpyOptionValue( + value: unknown +): value is ScrcpyOptionValue { + return ( + typeof value === "object" && value !== null && - typeof value.toOptionValue === 'function'; + "toOptionValue" in value && + typeof value.toOptionValue === "function" + ); } -export function toScrcpyOptionValue(value: any, empty: T): string | T { - if (isScrcpyOptionValue(value)) { - value = value.toOptionValue(); - } - +export function toScrcpyOptionValue(value: unknown, empty: T): string | T { if (value === undefined) { return empty; } - return `${value}`; + if (isScrcpyOptionValue(value)) { + value = value.toOptionValue(); + } + + return String(value); } export interface H264Configuration { @@ -47,12 +53,12 @@ export interface H264Configuration { } export interface ScrcpyVideoStreamConfigurationPacket { - type: 'configuration'; + type: "configuration"; data: H264Configuration; } export interface ScrcpyVideoStreamFramePacket { - type: 'frame'; + type: "frame"; keyframe?: boolean | undefined; pts?: bigint | undefined; data: Uint8Array; @@ -62,7 +68,7 @@ export type ScrcpyVideoStreamPacket = | ScrcpyVideoStreamConfigurationPacket | ScrcpyVideoStreamFramePacket; -export interface ScrcpyOptions { +export interface ScrcpyOptions { value: Partial; getDefaultValue(): T; @@ -71,15 +77,18 @@ export interface ScrcpyOptions { getOutputEncoderNameRegex(): RegExp; - createVideoStreamTransformer(): TransformStream; + createVideoStreamTransformer(): TransformStream< + Uint8Array, + ScrcpyVideoStreamPacket + >; getControlMessageTypes(): ScrcpyControlMessageType[]; serializeBackOrScreenOnControlMessage( - message: ScrcpyBackOrScreenOnControlMessage1_18, + message: ScrcpyBackOrScreenOnControlMessage1_18 ): Uint8Array | undefined; serializeInjectScrollControlMessage( - message: ScrcpyInjectScrollControlMessage1_22, + message: ScrcpyInjectScrollControlMessage1_22 ): Uint8Array; } diff --git a/libraries/scrcpy/tsconfig.build.json b/libraries/scrcpy/tsconfig.build.json index b4bb73dd..2cb23249 100644 --- a/libraries/scrcpy/tsconfig.build.json +++ b/libraries/scrcpy/tsconfig.build.json @@ -1,3 +1,3 @@ { - "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json" + "extends": "./node_modules/@yume-chan/tsconfig/tsconfig.base.json" } diff --git a/libraries/stream-extra/.eslintrc.cjs b/libraries/stream-extra/.eslintrc.cjs new file mode 100644 index 00000000..9b1ad208 --- /dev/null +++ b/libraries/stream-extra/.eslintrc.cjs @@ -0,0 +1,19 @@ +module.exports = { + "extends": [ + "@yume-chan" + ], + parserOptions: { + tsconfigRootDir: __dirname, + project: [ + "./tsconfig.test.json" + ], + }, + rules: { + "@typescript-eslint/no-explicit-any": "off", + // "@typescript-eslint/no-unsafe-argument": "off", + // "@typescript-eslint/no-unsafe-assignment": "off", + // "@typescript-eslint/no-unsafe-call": "off", + // "@typescript-eslint/no-unsafe-member-access": "off", + // "@typescript-eslint/no-unsafe-return": "off", + }, +} diff --git a/libraries/stream-extra/.npmignore b/libraries/stream-extra/.npmignore index 667ace40..e44e2e62 100644 --- a/libraries/stream-extra/.npmignore +++ b/libraries/stream-extra/.npmignore @@ -8,6 +8,7 @@ coverage **/__helpers__ jest.config.js +.eslintrc.cjs tsconfig.json tsconfig.test.json diff --git a/libraries/stream-extra/package.json b/libraries/stream-extra/package.json index 725fc701..946dedc7 100644 --- a/libraries/stream-extra/package.json +++ b/libraries/stream-extra/package.json @@ -28,6 +28,7 @@ "build": "tsc -b tsconfig.build.json", "build:watch": "tsc -b tsconfig.build.json", "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage", + "lint": "eslint src/**/*.ts --fix", "prepublishOnly": "npm run build" }, "dependencies": { @@ -38,10 +39,12 @@ }, "devDependencies": { "@jest/globals": "^29.3.1", - "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "@yume-chan/eslint-config": "workspace:^1.0.0", + "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", + "eslint": "^8.30.0", "jest": "^29.3.1", "ts-jest": "^29.0.3", - "typescript": "^4.8.4" + "typescript": "^4.9.4" } } diff --git a/libraries/stream-extra/src/buffered-transform.ts b/libraries/stream-extra/src/buffered-transform.ts index d458fcfe..e5fa9e39 100644 --- a/libraries/stream-extra/src/buffered-transform.ts +++ b/libraries/stream-extra/src/buffered-transform.ts @@ -1,24 +1,44 @@ -import type { ValueOrPromise } from '@yume-chan/struct'; -import { BufferedReadableStream, BufferedReadableStreamEndedError } from './buffered.js'; -import { PushReadableStream, PushReadableStreamController } from './push-readable.js'; -import { ReadableStream, ReadableWritablePair, WritableStream } from './stream.js'; +import { type ValueOrPromise } from "@yume-chan/struct"; + +import { + BufferedReadableStream, + BufferedReadableStreamEndedError, +} from "./buffered.js"; +import { + PushReadableStream, + type PushReadableStreamController, +} from "./push-readable.js"; +import { + ReadableStream, + WritableStream, + type ReadableWritablePair, +} from "./stream.js"; // TODO: BufferedTransformStream: find better implementation -export class BufferedTransformStream implements ReadableWritablePair { +export class BufferedTransformStream + implements ReadableWritablePair +{ private _readable: ReadableStream; - public get readable() { return this._readable; } + public get readable() { + return this._readable; + } private _writable: WritableStream; - public get writable() { return this._writable; } + public get writable() { + return this._writable; + } - constructor(transform: (stream: BufferedReadableStream) => ValueOrPromise) { + constructor( + transform: (stream: BufferedReadableStream) => ValueOrPromise + ) { // Convert incoming chunks to a `BufferedReadableStream` let sourceStreamController!: PushReadableStreamController; - const buffered = new BufferedReadableStream(new PushReadableStream( - controller => - sourceStreamController = controller, - )); + const buffered = new BufferedReadableStream( + new PushReadableStream((controller) => { + sourceStreamController = controller; + }) + ); this._readable = new ReadableStream({ async pull(controller) { @@ -39,8 +59,8 @@ export class BufferedTransformStream implements ReadableWritablePair { // Propagate cancel to the source stream // So future writes will be rejected - buffered.cancel(reason); - } + return buffered.cancel(reason); + }, }); this._writable = new WritableStream({ diff --git a/libraries/stream-extra/src/buffered.spec.ts b/libraries/stream-extra/src/buffered.spec.ts index 85eb891f..adcd5c2a 100644 --- a/libraries/stream-extra/src/buffered.spec.ts +++ b/libraries/stream-extra/src/buffered.spec.ts @@ -1,11 +1,11 @@ -import { describe, expect, it } from '@jest/globals'; +import { describe, expect, it } from "@jest/globals"; import { BufferedReadableStream } from "./buffered.js"; import { ReadableStream } from "./stream.js"; function randomUint8Array(length: number) { const array = new Uint8Array(length); - for (let i = 0; i < length; i++) { + for (let i = 0; i < length; i += 1) { array[i] = Math.floor(Math.random() * 256); } return array; @@ -22,7 +22,7 @@ class MockReadableStream extends ReadableStream { } controller.enqueue(buffers[index]!); index += 1; - } + }, }); } } @@ -48,76 +48,79 @@ async function runTest(inputSizes: number[], readSizes: number[]) { } } -describe('BufferedStream', () => { - describe('read 1 time', () => { - it('read 0 buffer', async () => { +describe("BufferedStream", () => { + describe("read 1 time", () => { + it("read 0 buffer", async () => { const source = new MockReadableStream([]); const buffered = new BufferedReadableStream(source); await expect(buffered.read(10)).rejects.toThrow(); }); - it('input 1 exact buffer', async () => { + it("input 1 exact buffer", async () => { const input = randomUint8Array(10); const source = new MockReadableStream([input]); const buffered = new BufferedReadableStream(source); await expect(buffered.read(10)).resolves.toBe(input); }); - it('input 1 large buffer', () => { + it("input 1 large buffer", () => { return runTest([20], [10]); }); - it('read 1 small buffer', async () => { + it("read 1 small buffer", async () => { const source = new MockReadableStream([randomUint8Array(5)]); const buffered = new BufferedReadableStream(source); await expect(buffered.read(10)).rejects.toThrow(); }); - it('input 2 small buffers', () => { + it("input 2 small buffers", () => { return runTest([5, 5], [10]); }); - it('read 2 small buffers', async () => { - const source = new MockReadableStream([randomUint8Array(5), randomUint8Array(5)]); + it("read 2 small buffers", async () => { + const source = new MockReadableStream([ + randomUint8Array(5), + randomUint8Array(5), + ]); const buffered = new BufferedReadableStream(source); await expect(buffered.read(20)).rejects.toThrow(); }); - it('input 2 small + large buffers', () => { + it("input 2 small + large buffers", () => { return runTest([5, 10], [10]); }); }); - describe('read 2 times', () => { - it('input 1 exact buffer', () => { + describe("read 2 times", () => { + it("input 1 exact buffer", () => { return runTest([10], [5, 5]); }); - it('input 1 large buffer', () => { + it("input 1 large buffer", () => { return runTest([20], [5, 5]); }); - it('input 2 exact buffers', () => { + it("input 2 exact buffers", () => { return runTest([5, 5], [5, 5]); }); - it('input 2 exact + large buffers', () => { + it("input 2 exact + large buffers", () => { return runTest([5, 10], [5, 8]); }); - it('input 2 small + large buffers', () => { + it("input 2 small + large buffers", () => { return runTest([5, 10], [7, 8]); }); - it('input 2 large buffers', () => { + it("input 2 large buffers", () => { return runTest([10, 10], [8, 8]); }); - it('input 3 small buffers', () => { + it("input 3 small buffers", () => { return runTest([3, 3, 3], [5, 4]); }); - it('input 3 small buffers 2', () => { + it("input 3 small buffers 2", () => { return runTest([3, 3, 3], [7, 2]); }); }); diff --git a/libraries/stream-extra/src/buffered.ts b/libraries/stream-extra/src/buffered.ts index ae7e0145..185a37bd 100644 --- a/libraries/stream-extra/src/buffered.ts +++ b/libraries/stream-extra/src/buffered.ts @@ -1,9 +1,12 @@ import { PushReadableStream } from "./push-readable.js"; -import type { ReadableStream, ReadableStreamDefaultReader } from "./stream.js"; +import { + type ReadableStream, + type ReadableStreamDefaultReader, +} from "./stream.js"; export class BufferedReadableStreamEndedError extends Error { public constructor() { - super('Stream ended'); + super("Stream ended"); // Fix Error's prototype chain when compiling to ES5 Object.setPrototypeOf(this, new.target.prototype); @@ -115,23 +118,17 @@ export class BufferedReadableStream { */ public release(): ReadableStream { if (this.buffered) { - return new PushReadableStream(async controller => { + return new PushReadableStream(async (controller) => { // Put the remaining data back to the stream await controller.enqueue(this.buffered!); // Manually pipe the stream while (true) { - try { - const { done, value } = await this.reader.read(); - if (done) { - controller.close(); - break; - } else { - await controller.enqueue(value); - } - } catch (e) { - controller.error(e); - break; + const { done, value } = await this.reader.read(); + if (done) { + return; + } else { + await controller.enqueue(value); } } }); @@ -142,7 +139,7 @@ export class BufferedReadableStream { } } - public cancel(reason?: any) { + public cancel(reason?: unknown) { return this.reader.cancel(reason); } } diff --git a/libraries/stream-extra/src/decode-utf8.ts b/libraries/stream-extra/src/decode-utf8.ts index c432c846..bc3d145f 100644 --- a/libraries/stream-extra/src/decode-utf8.ts +++ b/libraries/stream-extra/src/decode-utf8.ts @@ -1,7 +1,8 @@ -import { decodeUtf8 } from '@yume-chan/struct'; +import { decodeUtf8 } from "@yume-chan/struct"; + import { TransformStream } from "./stream.js"; -export class DecodeUtf8Stream extends TransformStream{ +export class DecodeUtf8Stream extends TransformStream { public constructor() { super({ transform(chunk, controller) { diff --git a/libraries/stream-extra/src/duplex.spec.ts b/libraries/stream-extra/src/duplex.spec.ts index be2ed165..111405cd 100644 --- a/libraries/stream-extra/src/duplex.spec.ts +++ b/libraries/stream-extra/src/duplex.spec.ts @@ -1,11 +1,12 @@ -import { describe, it } from '@jest/globals'; +import { describe, it } from "@jest/globals"; + import { DuplexStreamFactory } from "./duplex.js"; import { ReadableStream } from "./stream.js"; -describe('DuplexStreamFactory', () => { - it('should close all readable', async () => { +describe("DuplexStreamFactory", () => { + it("should close all readable", async () => { const factory = new DuplexStreamFactory(); - const readable = factory.wrapReadable(new ReadableStream() as any); + const readable = factory.wrapReadable(new ReadableStream()); const reader = readable.getReader(); await factory.close(); await reader.closed; diff --git a/libraries/stream-extra/src/duplex.ts b/libraries/stream-extra/src/duplex.ts index 76a6f6e0..79e4bf63 100644 --- a/libraries/stream-extra/src/duplex.ts +++ b/libraries/stream-extra/src/duplex.ts @@ -1,6 +1,12 @@ import { PromiseResolver } from "@yume-chan/async"; -import type { ValueOrPromise } from "@yume-chan/struct"; -import { WritableStream, type ReadableStream, type ReadableStreamDefaultController, type WritableStreamDefaultWriter } from "./stream.js"; +import { type ValueOrPromise } from "@yume-chan/struct"; + +import { + WritableStream, + type ReadableStream, + type ReadableStreamDefaultController, + type WritableStreamDefaultWriter, +} from "./stream.js"; import { WrapReadableStream } from "./wrap-readable.js"; export interface DuplexStreamFactoryOptions { @@ -9,7 +15,7 @@ export interface DuplexStreamFactoryOptions { * or `WritableStream` is ended (the user won't produce any more data), * or `DuplexStreamFactory#close` is called. * - * Usually you want to let the other peer know that the duplex stream should be clsoed. + * Usually you want to let the other peer know that the duplex stream should be closed. * * `dispose` will automatically be called after `close` completes, * but if you want to wait another peer for a close confirmation and call @@ -40,10 +46,14 @@ export class DuplexStreamFactory { private writers: WritableStreamDefaultWriter[] = []; private _writableClosed = false; - public get writableClosed() { return this._writableClosed; } + public get writableClosed() { + return this._writableClosed; + } private _closed = new PromiseResolver(); - public get closed() { return this._closed.promise; } + public get closed() { + return this._closed.promise; + } private options: DuplexStreamFactoryOptions; @@ -84,7 +94,9 @@ export class DuplexStreamFactory { await this.close(); }, close: async () => { - try { await writer.close(); } catch { } + await writer.close().catch((e) => { + void e; + }); await this.close(); }, }); @@ -97,13 +109,15 @@ export class DuplexStreamFactory { this._writableClosed = true; // Call `close` first, so it can still write data to `WritableStream`s. - if (await this.options.close?.() !== false) { + if ((await this.options.close?.()) !== false) { // `close` can return `false` to disable automatic `dispose`. await this.dispose(); } for (const writer of this.writers) { - try { await writer.close(); } catch { } + await writer.close().catch((e) => { + void e; + }); } } @@ -112,7 +126,11 @@ export class DuplexStreamFactory { this._closed.resolve(); for (const controller of this.readableControllers) { - try { controller.close(); } catch { } + try { + controller.close(); + } catch (e) { + void e; + } } await this.options.dispose?.(); diff --git a/libraries/stream-extra/src/native.ts b/libraries/stream-extra/src/native.ts deleted file mode 100644 index a82c5d19..00000000 --- a/libraries/stream-extra/src/native.ts +++ /dev/null @@ -1,362 +0,0 @@ -// cspell: ignore chainable -// cspell: ignore backpressure -// cspell: ignore endregion - -// Because Node.js exports Web Streams types from `stream/web` package, -// this module uses Top-Level Await to support both Web Browsers and Node.js. -// For Webpack, the `experimental.topLevelAwait` option is required. -// (See: https://webpack.js.org/configuration/experiments/) - -// It's also possible to add fallback to some polyfill. - -//#region borrowed -// from https://github.com/microsoft/TypeScript/blob/38da7c600c83e7b31193a62495239a0fe478cb67/lib/lib.webworker.d.ts#L633 until moved to separate lib -/** A controller object that allows you to abort one or more DOM requests as and when desired. */ -export interface AbortController { - /** - * Returns the AbortSignal object associated with this object. - */ - - readonly signal: AbortSignal; - /** - * Invoking this method will set this object's AbortSignal's aborted flag and signal to any observers that the associated activity is to be aborted. - */ - abort(): void; -} - -// A simplified version of AbortSignal events. -export interface AbortSignalEventMap { - "abort": any; -} - -export interface EventListenerOptions { - capture?: boolean; -} - -export interface AddEventListenerOptions extends EventListenerOptions { - once?: boolean; - passive?: boolean; - signal?: AbortSignal; -} - -/** A signal object that allows you to communicate with a DOM request (such as a Fetch) and abort it if required via an AbortController object. */ -export interface AbortSignal { - /** - * Returns true if this AbortSignal's AbortController has signaled to abort, and false otherwise. - */ - readonly aborted: boolean; - - onabort: ((this: AbortSignal, ev: any) => any) | null; - addEventListener(type: K, listener: (this: AbortSignal, ev: AbortSignalEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; - addEventListener(type: string, listener: (ev: any) => void, options?: boolean | AddEventListenerOptions): void; - removeEventListener(type: K, listener: (this: AbortSignal, ev: AbortSignalEventMap[K]) => any, options?: boolean | EventListenerOptions): void; - removeEventListener(type: string, listener: (ev: any) => void, options?: boolean | EventListenerOptions): void; -} - -export let AbortController: { - prototype: AbortController; - new(): AbortController; -}; - -export let AbortSignal: { - prototype: AbortSignal; - new(): AbortSignal; - // TODO: Add abort() static -}; - -({ AbortController, AbortSignal } = globalThis as any); -//#endregion borrowed - -// https://github.com/microsoft/TypeScript-DOM-lib-generator/blob/11d922f302743cb3fcee9ab59b03d40074a2965c/baselines/dom.generated.d.ts#L1194-L1206 -export interface QueuingStrategy { - highWaterMark?: number; - size?: QueuingStrategySize; -} - -export interface QueuingStrategyInit { - /** - * Creates a new ByteLengthQueuingStrategy with the provided high water mark. - * - * Note that the provided high water mark will not be validated ahead of time. Instead, if it is negative, NaN, or not a number, the resulting ByteLengthQueuingStrategy will cause the corresponding stream constructor to throw. - */ - highWaterMark: number; -} - -// https://github.com/microsoft/TypeScript-DOM-lib-generator/blob/11d922f302743cb3fcee9ab59b03d40074a2965c/baselines/dom.generated.d.ts#L1450-L1468 -export interface ReadableStreamDefaultReadDoneResult { - done: true; - value?: undefined; -} - -export interface ReadableStreamDefaultReadValueResult { - done: false; - value: T; -} - -export interface ReadableWritablePair { - readable: ReadableStream; - /** - * Provides a convenient, chainable way of piping this readable stream through a transform stream (or any other { writable, readable } pair). It simply pipes the stream into the writable side of the supplied pair, and returns the readable side for further use. - * - * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader. - */ - writable: WritableStream; -} - -// https://github.com/microsoft/TypeScript-DOM-lib-generator/blob/11d922f302743cb3fcee9ab59b03d40074a2965c/baselines/dom.generated.d.ts#L1636 -export interface StreamPipeOptions { - preventAbort?: boolean; - preventCancel?: boolean; - /** - * Pipes this readable stream to a given writable stream destination. The way in which the piping process behaves under various error conditions can be customized with a number of passed options. It returns a promise that fulfills when the piping process completes successfully, or rejects if any errors were encountered. - * - * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader. - * - * Errors and closures of the source and destination streams propagate as follows: - * - * An error in this source readable stream will abort destination, unless preventAbort is truthy. The returned promise will be rejected with the source's error, or with any error that occurs during aborting the destination. - * - * An error in destination will cancel this source readable stream, unless preventCancel is truthy. The returned promise will be rejected with the destination's error, or with any error that occurs during canceling the source. - * - * When this source readable stream closes, destination will be closed, unless preventClose is truthy. The returned promise will be fulfilled once this process completes, unless an error is encountered while closing the destination, in which case it will be rejected with that error. - * - * If destination starts out closed or closing, this source readable stream will be canceled, unless preventCancel is true. The returned promise will be rejected with an error indicating piping to a closed stream failed, or with any error that occurs during canceling the source. - * - * The signal option can be set to an AbortSignal to allow aborting an ongoing pipe operation via the corresponding AbortController. In this case, this source readable stream will be canceled, and destination aborted, unless the respective options preventCancel or preventAbort are set. - */ - preventClose?: boolean; - signal?: AbortSignal; -} - -// https://github.com/microsoft/TypeScript-DOM-lib-generator/blob/11d922f302743cb3fcee9ab59b03d40074a2965c/baselines/dom.generated.d.ts#L1710 -export interface Transformer { - flush?: TransformerFlushCallback; - readableType?: undefined; - start?: TransformerStartCallback; - transform?: TransformerTransformCallback; - writableType?: undefined; -} - -// https://github.com/microsoft/TypeScript-DOM-lib-generator/blob/11d922f302743cb3fcee9ab59b03d40074a2965c/baselines/dom.generated.d.ts#L11132-L11172 -/** This Streams API interface represents a readable stream of byte data. The Fetch API offers a concrete instance of a ReadableStream through the body property of a Response object. */ -export interface ReadableStream { - readonly locked: boolean; - cancel(reason?: any): Promise; - getReader(): ReadableStreamDefaultReader; - pipeThrough(transform: ReadableWritablePair, options?: StreamPipeOptions): ReadableStream; - pipeTo(destination: WritableStream, options?: StreamPipeOptions): Promise; - tee(): [ReadableStream, ReadableStream]; -} - -export let ReadableStream: { - prototype: ReadableStream; - new (underlyingSource?: UnderlyingSource, strategy?: QueuingStrategy): ReadableStream; -}; - -export interface ReadableStreamDefaultController { - readonly desiredSize: number | null; - close(): void; - enqueue(chunk?: R): void; - error(e?: any): void; -} - -export let ReadableStreamDefaultController: { - prototype: ReadableStreamDefaultController; - new(): ReadableStreamDefaultController; -}; - -export interface ReadableStreamDefaultReader extends ReadableStreamGenericReader { - read(): Promise>; - releaseLock(): void; -} - -export let ReadableStreamDefaultReader: { - prototype: ReadableStreamDefaultReader; - new (stream: ReadableStream): ReadableStreamDefaultReader; -}; - -export interface ReadableStreamGenericReader { - readonly closed: Promise; - cancel(reason?: any): Promise; -} - -// https://github.com/microsoft/TypeScript-DOM-lib-generator/blob/11d922f302743cb3fcee9ab59b03d40074a2965c/baselines/dom.generated.d.ts#L13924-L13944 -export interface TransformStream { - readonly readable: ReadableStream; - readonly writable: WritableStream; -} - -export let TransformStream: { - prototype: TransformStream; - new (transformer?: Transformer, writableStrategy?: QueuingStrategy, readableStrategy?: QueuingStrategy): TransformStream; -}; - -export interface TransformStreamDefaultController { - readonly desiredSize: number | null; - enqueue(chunk?: O): void; - error(reason?: any): void; - terminate(): void; -} - -export let TransformStreamDefaultController: { - prototype: TransformStreamDefaultController; - new(): TransformStreamDefaultController; -}; - -// https://github.com/microsoft/TypeScript-DOM-lib-generator/blob/11d922f302743cb3fcee9ab59b03d40074a2965c/baselines/dom.generated.d.ts#L16509-L16546 -/** This Streams API interface provides a standard abstraction for writing streaming data to a destination, known as a sink. This object comes with built-in backpressure and queuing. */ -export interface WritableStream { - readonly locked: boolean; - abort(reason?: any): Promise; - close(): Promise; - getWriter(): WritableStreamDefaultWriter; -} - -export let WritableStream: { - prototype: WritableStream; - new (underlyingSink?: UnderlyingSink, strategy?: QueuingStrategy): WritableStream; -}; - -/** This Streams API interface represents a controller allowing control of a WritableStream's state. When constructing a WritableStream, the underlying sink is given a corresponding WritableStreamDefaultController instance to manipulate. */ -export interface WritableStreamDefaultController { - error(e?: any): void; -} - -export let WritableStreamDefaultController: { - prototype: WritableStreamDefaultController; - new(): WritableStreamDefaultController; -}; - -/** This Streams API interface is the object returned by WritableStream.getWriter() and once created locks the < writer to the WritableStream ensuring that no other streams can write to the underlying sink. */ -export interface WritableStreamDefaultWriter { - readonly closed: Promise; - readonly desiredSize: number | null; - readonly ready: Promise; - abort(reason?: any): Promise; - close(): Promise; - releaseLock(): void; - write(chunk?: W): Promise; -} - -export let WritableStreamDefaultWriter: { - prototype: WritableStreamDefaultWriter; - new (stream: WritableStream): WritableStreamDefaultWriter; -}; - -// https://github.com/microsoft/TypeScript-DOM-lib-generator/blob/11d922f302743cb3fcee9ab59b03d40074a2965c/baselines/dom.generated.d.ts#L17045 -export interface QueuingStrategySize { - (chunk: T): number; -} - -// https://github.com/microsoft/TypeScript-DOM-lib-generator/blob/11d922f302743cb3fcee9ab59b03d40074a2965c/baselines/dom.generated.d.ts#L17065-L17103 -export interface TransformerFlushCallback { - (controller: TransformStreamDefaultController): void | PromiseLike; -} - -export interface TransformerStartCallback { - (controller: TransformStreamDefaultController): any; -} - -export interface TransformerTransformCallback { - (chunk: I, controller: TransformStreamDefaultController): void | PromiseLike; -} - -export interface UnderlyingSink { - abort?: UnderlyingSinkAbortCallback; - close?: UnderlyingSinkCloseCallback; - start?: UnderlyingSinkStartCallback; - type?: undefined; - write?: UnderlyingSinkWriteCallback; -} - -export interface UnderlyingSource { - cancel?: UnderlyingSourceCancelCallback; - pull?: UnderlyingSourcePullCallback | undefined; - start?: UnderlyingSourceStartCallback; - type?: undefined; -} - -export interface UnderlyingSinkAbortCallback { - (reason?: any): void | PromiseLike; -} - -export interface UnderlyingSinkCloseCallback { - (): void | PromiseLike; -} - -export interface UnderlyingSinkStartCallback { - (controller: WritableStreamDefaultController): any; -} - -export interface UnderlyingSinkWriteCallback { - (chunk: W, controller: WritableStreamDefaultController): void | PromiseLike; -} - -export interface UnderlyingSourceCancelCallback { - (reason?: any): void | PromiseLike; -} - -export interface UnderlyingSourcePullCallback { - (controller: ReadableStreamController): void | PromiseLike; -} - -export interface UnderlyingSourceStartCallback { - (controller: ReadableStreamController): any; -} - -// https://github.com/microsoft/TypeScript-DOM-lib-generator/blob/11d922f302743cb3fcee9ab59b03d40074a2965c/baselines/dom.generated.d.ts#L17796-L17798 -export type ReadableStreamController = ReadableStreamDefaultController; -export type ReadableStreamDefaultReadResult = ReadableStreamDefaultReadValueResult | ReadableStreamDefaultReadDoneResult; -export type ReadableStreamReader = ReadableStreamDefaultReader; - -// Extra -export interface ReadableStreamIteratorOptions { - preventCancel?: boolean; -} - -// This library can't use `@types/node` or `lib: dom` -// because they will pollute the global scope -// So `ReadableStream`, `WritableStream` and `TransformStream` are not available - -if ('ReadableStream' in globalThis && 'WritableStream' in globalThis && 'TransformStream' in globalThis) { - ({ - ReadableStream, - ReadableStreamDefaultController, - ReadableStreamDefaultReader, - TransformStream, - TransformStreamDefaultController, - WritableStream, - WritableStreamDefaultController, - WritableStreamDefaultWriter, - } = globalThis as any); -} else { - try { - // // Node.js 16 has Web Streams types in `stream/web` module - ({ - // @ts-ignore - ReadableStream, - // @ts-ignore - ReadableStreamDefaultController, - // @ts-ignore - ReadableStreamDefaultReader, - // @ts-ignore - TransformStream, - // @ts-ignore - TransformStreamDefaultController, - // @ts-ignore - WritableStream, - // @ts-ignore - WritableStreamDefaultController, - // @ts-ignore - WritableStreamDefaultWriter, - // @ts-ignore - } = await import(/* webpackIgnore: true */ 'stream/web')); - } catch { } -} - -// TODO: stream/detect: Load some polyfills - -// @ts-ignore -if (!ReadableStream || !WritableStream || !TransformStream) { - // throw new Error('Web Streams API is not available'); -} diff --git a/libraries/stream-extra/src/push-readable.ts b/libraries/stream-extra/src/push-readable.ts index 0592c63c..11c6ab25 100644 --- a/libraries/stream-extra/src/push-readable.ts +++ b/libraries/stream-extra/src/push-readable.ts @@ -1,5 +1,11 @@ -import { PromiseResolver } from '@yume-chan/async'; -import { AbortController, AbortSignal, QueuingStrategy, ReadableStream } from "./stream.js"; +import { PromiseResolver } from "@yume-chan/async"; + +import { + AbortController, + ReadableStream, + type AbortSignal, + type QueuingStrategy, +} from "./stream.js"; export interface PushReadableStreamController { abortSignal: AbortSignal; @@ -8,55 +14,84 @@ export interface PushReadableStreamController { close(): void; - error(e?: any): void; + error(e?: unknown): void; } -export type PushReadableStreamSource = (controller: PushReadableStreamController) => void; +export type PushReadableStreamSource = ( + controller: PushReadableStreamController +) => void | Promise; export class PushReadableStream extends ReadableStream { - public constructor(source: PushReadableStreamSource, strategy?: QueuingStrategy) { + /** + * Create a new `PushReadableStream` from a source. + * + * @param source If `source` returns a `Promise`, the stream will be closed + * when the `Promise` is resolved, and be errored when the `Promise` is rejected. + * @param strategy + */ + public constructor( + source: PushReadableStreamSource, + strategy?: QueuingStrategy + ) { let waterMarkLow: PromiseResolver | undefined; const canceled: AbortController = new AbortController(); - super({ - start: (controller) => { - source({ - abortSignal: canceled.signal, - async enqueue(chunk) { - if (canceled.signal.aborted) { - // If the stream is already cancelled, - // throw immediately. - throw canceled.signal.reason ?? new Error('Aborted'); - } - - // Only when the stream is errored, `desiredSize` will be `null`. - // But since `null <= 0` is `true` - // (`null <= 0` is evaluated as `!(null > 0)` => `!false` => `true`), - // not handling it will cause a deadlock. - if ((controller.desiredSize ?? 1) <= 0) { - waterMarkLow = new PromiseResolver(); - await waterMarkLow.promise; - } - - // `controller.enqueue` will throw error for us - // if the stream is already errored. - controller.enqueue(chunk); - }, - close() { - controller.close(); - }, - error(e) { - controller.error(e); - }, - }); - }, - pull: () => { - waterMarkLow?.resolve(); - }, - cancel: async (reason) => { - canceled.abort(reason); - waterMarkLow?.reject(reason); + super( + { + start: (controller) => { + const result = source({ + abortSignal: canceled.signal, + async enqueue(chunk) { + if (canceled.signal.aborted) { + // If the stream is already cancelled, + // throw immediately. + throw ( + canceled.signal.reason ?? + new Error("Aborted") + ); + } + + // Only when the stream is errored, `desiredSize` will be `null`. + // But since `null <= 0` is `true` + // (`null <= 0` is evaluated as `!(null > 0)` => `!false` => `true`), + // not handling it will cause a deadlock. + if ((controller.desiredSize ?? 1) <= 0) { + waterMarkLow = new PromiseResolver(); + await waterMarkLow.promise; + } + + // `controller.enqueue` will throw error for us + // if the stream is already errored. + controller.enqueue(chunk); + }, + close() { + controller.close(); + }, + error(e) { + controller.error(e); + }, + }); + + if (result && "then" in result) { + result.then( + () => { + controller.close(); + }, + (e) => { + controller.error(e); + } + ); + } + }, + pull: () => { + waterMarkLow?.resolve(); + }, + cancel: (reason) => { + canceled.abort(reason); + waterMarkLow?.reject(reason); + }, }, - }, strategy); + strategy + ); } } diff --git a/libraries/stream-extra/src/stream.ts b/libraries/stream-extra/src/stream.ts index 3c6345b7..6662b4ff 100644 --- a/libraries/stream-extra/src/stream.ts +++ b/libraries/stream-extra/src/stream.ts @@ -1,22 +1,28 @@ -import type { AbortSignal } from "web-streams-polyfill"; -export * from 'web-streams-polyfill'; +import { type AbortSignal } from "web-streams-polyfill"; +export * from "web-streams-polyfill"; /** A controller object that allows you to abort one or more DOM requests as and when desired. */ export interface AbortController { /** * Returns the AbortSignal object associated with this object. */ - readonly signal: AbortSignal; + /** * Invoking this method will set this object's AbortSignal's aborted flag and signal to any observers that the associated activity is to be aborted. */ abort(reason?: any): void; } -export let AbortController: { +interface AbortControllerConstructor { prototype: AbortController; - new(): AbortController; -}; + new (): AbortController; +} + +declare global { + // eslint-disable-next-line no-var + var AbortController: AbortControllerConstructor; +} -({ AbortController } = globalThis as any); +export const AbortController: AbortControllerConstructor = + globalThis.AbortController; diff --git a/libraries/stream-extra/src/struct-deserialize.ts b/libraries/stream-extra/src/struct-deserialize.ts index dc8ddb99..d59ef23d 100644 --- a/libraries/stream-extra/src/struct-deserialize.ts +++ b/libraries/stream-extra/src/struct-deserialize.ts @@ -1,12 +1,14 @@ import type Struct from "@yume-chan/struct"; -import type { StructValueType } from "@yume-chan/struct"; -import { BufferedTransformStream } from './buffered-transform.js'; +import { type StructValueType } from "@yume-chan/struct"; -export class StructDeserializeStream> - extends BufferedTransformStream> { +import { BufferedTransformStream } from "./buffered-transform.js"; + +export class StructDeserializeStream< + T extends Struct +> extends BufferedTransformStream> { public constructor(struct: T) { super((stream) => { - return struct.deserialize(stream) + return struct.deserialize(stream); }); } } diff --git a/libraries/stream-extra/src/struct-serialize.ts b/libraries/stream-extra/src/struct-serialize.ts index 8c3948a0..2392ca01 100644 --- a/libraries/stream-extra/src/struct-serialize.ts +++ b/libraries/stream-extra/src/struct-serialize.ts @@ -1,8 +1,10 @@ import type Struct from "@yume-chan/struct"; + import { TransformStream } from "./stream.js"; -export class StructSerializeStream> - extends TransformStream{ +export class StructSerializeStream< + T extends Struct +> extends TransformStream { constructor(struct: T) { super({ transform(chunk, controller) { diff --git a/libraries/stream-extra/src/wrap-readable.ts b/libraries/stream-extra/src/wrap-readable.ts index 9db6c3ea..facfa124 100644 --- a/libraries/stream-extra/src/wrap-readable.ts +++ b/libraries/stream-extra/src/wrap-readable.ts @@ -1,21 +1,31 @@ -import type { ValueOrPromise } from "@yume-chan/struct"; -import { ReadableStream, ReadableStreamDefaultController, ReadableStreamDefaultReader } from "./stream.js"; +import { type ValueOrPromise } from "@yume-chan/struct"; -export type WrapReadableStreamStart = (controller: ReadableStreamDefaultController) => ValueOrPromise>; +import { + ReadableStream, + type ReadableStreamDefaultController, + type ReadableStreamDefaultReader, +} from "./stream.js"; + +export type WrapReadableStreamStart = ( + controller: ReadableStreamDefaultController +) => ValueOrPromise>; export interface ReadableStreamWrapper { start: WrapReadableStreamStart; - cancel?(reason?: any): ValueOrPromise; + cancel?(reason?: unknown): ValueOrPromise; close?(): ValueOrPromise; } function getWrappedReadableStream( - wrapper: ReadableStream | WrapReadableStreamStart | ReadableStreamWrapper, + wrapper: + | ReadableStream + | WrapReadableStreamStart + | ReadableStreamWrapper, controller: ReadableStreamDefaultController ) { - if ('start' in wrapper) { + if ("start" in wrapper) { return wrapper.start(controller); - } else if (typeof wrapper === 'function') { + } else if (typeof wrapper === "function") { return wrapper(controller); } else { // Can't use `wrapper instanceof ReadableStream` @@ -31,12 +41,17 @@ function getWrappedReadableStream( * 2. Synchronously create a `ReadableStream` by asynchronously return another `ReadableStream`. * 3. Convert native `ReadableStream`s to polyfilled ones so they can `pipe` between. */ -export class WrapReadableStream extends ReadableStream{ +export class WrapReadableStream extends ReadableStream { public readable!: ReadableStream; private reader!: ReadableStreamDefaultReader; - public constructor(wrapper: ReadableStream | WrapReadableStreamStart | ReadableStreamWrapper) { + public constructor( + wrapper: + | ReadableStream + | WrapReadableStreamStart + | ReadableStreamWrapper + ) { super({ start: async (controller) => { // `start` is invoked before `ReadableStream`'s constructor finish, @@ -45,12 +60,15 @@ export class WrapReadableStream extends ReadableStream{ // Queue a microtask to avoid this. await Promise.resolve(); - this.readable = await getWrappedReadableStream(wrapper, controller); + this.readable = await getWrappedReadableStream( + wrapper, + controller + ); this.reader = this.readable.getReader(); }, cancel: async (reason) => { await this.reader.cancel(reason); - if ('cancel' in wrapper) { + if ("cancel" in wrapper) { await wrapper.cancel?.(reason); } }, @@ -58,13 +76,13 @@ export class WrapReadableStream extends ReadableStream{ const result = await this.reader.read(); if (result.done) { controller.close(); - if ('close' in wrapper) { + if ("close" in wrapper) { await wrapper.close?.(); } } else { controller.enqueue(result.value); } - } + }, }); } } diff --git a/libraries/stream-extra/src/wrap-writable.ts b/libraries/stream-extra/src/wrap-writable.ts index f89b6a21..e84f8b14 100644 --- a/libraries/stream-extra/src/wrap-writable.ts +++ b/libraries/stream-extra/src/wrap-writable.ts @@ -1,19 +1,25 @@ -import type { ValueOrPromise } from "@yume-chan/struct"; -import { WritableStream, WritableStreamDefaultWriter } from "./stream.js"; +import { type ValueOrPromise } from "@yume-chan/struct"; -export type WrapWritableStreamStart = () => ValueOrPromise>; +import { WritableStream, type WritableStreamDefaultWriter } from "./stream.js"; + +export type WrapWritableStreamStart = () => ValueOrPromise< + WritableStream +>; export interface WritableStreamWrapper { start: WrapWritableStreamStart; - close?(): Promise; + close?(): void | Promise; } async function getWrappedWritableStream( - wrapper: WritableStream | WrapWritableStreamStart | WritableStreamWrapper + wrapper: + | WritableStream + | WrapWritableStreamStart + | WritableStreamWrapper ) { - if ('start' in wrapper) { + if ("start" in wrapper) { return await wrapper.start(); - } else if (typeof wrapper === 'function') { + } else if (typeof wrapper === "function") { return await wrapper(); } else { // Can't use `wrapper instanceof WritableStream` @@ -27,7 +33,12 @@ export class WrapWritableStream extends WritableStream { private writer!: WritableStreamDefaultWriter; - public constructor(wrapper: WritableStream | WrapWritableStreamStart | WritableStreamWrapper) { + public constructor( + wrapper: + | WritableStream + | WrapWritableStreamStart + | WritableStreamWrapper + ) { super({ start: async () => { // `start` is invoked before `ReadableStream`'s constructor finish, @@ -46,7 +57,7 @@ export class WrapWritableStream extends WritableStream { }, abort: async (reason) => { await this.writer.abort(reason); - if ('close' in wrapper) { + if ("close" in wrapper) { await wrapper.close?.(); } }, @@ -56,7 +67,7 @@ export class WrapWritableStream extends WritableStream { // closing the outer stream first will make the inner stream incapable of // sending data in its `close` handler. await this.writer.close(); - if ('close' in wrapper) { + if ("close" in wrapper) { await wrapper.close?.(); } }, diff --git a/libraries/stream-extra/tsconfig.build.json b/libraries/stream-extra/tsconfig.build.json index b4bb73dd..2cb23249 100644 --- a/libraries/stream-extra/tsconfig.build.json +++ b/libraries/stream-extra/tsconfig.build.json @@ -1,3 +1,3 @@ { - "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json" + "extends": "./node_modules/@yume-chan/tsconfig/tsconfig.base.json" } diff --git a/libraries/struct/.eslintrc.cjs b/libraries/struct/.eslintrc.cjs new file mode 100644 index 00000000..cdd01f72 --- /dev/null +++ b/libraries/struct/.eslintrc.cjs @@ -0,0 +1,15 @@ +module.exports = { + extends: ["@yume-chan"], + parserOptions: { + tsconfigRootDir: __dirname, + project: ["./tsconfig.test.json"], + }, + rules: { + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unsafe-argument": "off", + "@typescript-eslint/no-unsafe-assignment": "off", + "@typescript-eslint/no-unsafe-call": "off", + "@typescript-eslint/no-unsafe-member-access": "off", + "@typescript-eslint/no-unsafe-return": "off", + }, +}; diff --git a/libraries/struct/.npmignore b/libraries/struct/.npmignore index 667ace40..e44e2e62 100644 --- a/libraries/struct/.npmignore +++ b/libraries/struct/.npmignore @@ -8,6 +8,7 @@ coverage **/__helpers__ jest.config.js +.eslintrc.cjs tsconfig.json tsconfig.test.json diff --git a/libraries/struct/package.json b/libraries/struct/package.json index 0694a308..2968225c 100644 --- a/libraries/struct/package.json +++ b/libraries/struct/package.json @@ -30,6 +30,7 @@ "build": "tsc -b tsconfig.build.json", "build:watch": "tsc -b tsconfig.build.json", "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage", + "lint": "eslint src/**/*.ts --fix", "prepublishOnly": "npm run build" }, "dependencies": { @@ -38,10 +39,12 @@ }, "devDependencies": { "@jest/globals": "^29.3.1", - "@yume-chan/ts-package-builder": "workspace:^1.0.0", + "@yume-chan/eslint-config": "workspace:^1.0.0", + "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", + "eslint": "^8.30.0", "jest": "^29.3.1", "ts-jest": "^29.0.3", - "typescript": "^4.8.4" + "typescript": "^4.9.4" } } diff --git a/libraries/struct/src/basic/definition.spec.ts b/libraries/struct/src/basic/definition.spec.ts index b761adfa..7f5e774f 100644 --- a/libraries/struct/src/basic/definition.spec.ts +++ b/libraries/struct/src/basic/definition.spec.ts @@ -1,45 +1,61 @@ -import { describe, expect, it } from '@jest/globals'; +import { describe, expect, it } from "@jest/globals"; -import type { ValueOrPromise } from '../utils.js'; -import { StructFieldDefinition } from './definition.js'; -import type { StructFieldValue } from './field-value.js'; -import type { StructOptions } from './options.js'; -import type { StructAsyncDeserializeStream, StructDeserializeStream } from './stream.js'; -import type { StructValue } from './struct-value.js'; +import { type ValueOrPromise } from "../utils.js"; -describe('StructFieldDefinition', () => { - describe('.constructor', () => { - it('should save the `options` parameter', () => { - class MockFieldDefinition extends StructFieldDefinition{ +import { StructFieldDefinition } from "./definition.js"; +import { type StructFieldValue } from "./field-value.js"; +import { type StructOptions } from "./options.js"; +import { + type StructAsyncDeserializeStream, + type StructDeserializeStream, +} from "./stream.js"; +import { type StructValue } from "./struct-value.js"; + +describe("StructFieldDefinition", () => { + describe(".constructor", () => { + it("should save the `options` parameter", () => { + class MockFieldDefinition extends StructFieldDefinition { public constructor(options: number) { super(options); } public getSize(): number { - throw new Error('Method not implemented.'); + throw new Error("Method not implemented."); } - public create(options: Readonly, struct: StructValue, value: unknown): StructFieldValue { - throw new Error('Method not implemented.'); + public create( + options: Readonly, + struct: StructValue, + value: unknown + ): StructFieldValue { + void options; + void struct; + void value; + throw new Error("Method not implemented."); } public override deserialize( options: Readonly, stream: StructDeserializeStream, - struct: StructValue, + struct: StructValue ): StructFieldValue; public override deserialize( options: Readonly, stream: StructAsyncDeserializeStream, - struct: StructValue, + struct: StructValue ): Promise>; public deserialize( options: Readonly, - stream: StructDeserializeStream | StructAsyncDeserializeStream, + stream: + | StructDeserializeStream + | StructAsyncDeserializeStream, struct: StructValue ): ValueOrPromise> { - throw new Error('Method not implemented.'); + void options; + void stream; + void struct; + throw new Error("Method not implemented."); } } - expect(new MockFieldDefinition(42)).toHaveProperty('options', 42); + expect(new MockFieldDefinition(42)).toHaveProperty("options", 42); }); }); }); diff --git a/libraries/struct/src/basic/definition.ts b/libraries/struct/src/basic/definition.ts index 55bfabb9..a9a17867 100644 --- a/libraries/struct/src/basic/definition.ts +++ b/libraries/struct/src/basic/definition.ts @@ -1,7 +1,10 @@ -import type { StructAsyncDeserializeStream, StructDeserializeStream } from "./stream.js"; -import type { StructFieldValue } from "./field-value.js"; -import type { StructValue } from "./struct-value.js"; -import type { StructOptions } from "./options.js"; +import { type StructFieldValue } from "./field-value.js"; +import { type StructOptions } from "./options.js"; +import { + type StructAsyncDeserializeStream, + type StructDeserializeStream, +} from "./stream.js"; +import { type StructValue } from "./struct-value.js"; /** * A field definition defines how to deserialize a field. @@ -13,8 +16,8 @@ import type { StructOptions } from "./options.js"; export abstract class StructFieldDefinition< TOptions = void, TValue = unknown, - TOmitInitKey extends PropertyKey = never, - > { + TOmitInitKey extends PropertyKey = never +> { /** * When `T` is a type initiated `StructFieldDefinition`, * use `T['TValue']` to retrieve its `TValue` type parameter. @@ -46,7 +49,7 @@ export abstract class StructFieldDefinition< public abstract create( options: Readonly, structValue: StructValue, - value: TValue, + value: TValue ): StructFieldValue; /** @@ -58,11 +61,11 @@ export abstract class StructFieldDefinition< public abstract deserialize( options: Readonly, stream: StructDeserializeStream, - structValue: StructValue, + structValue: StructValue ): StructFieldValue; public abstract deserialize( options: Readonly, stream: StructAsyncDeserializeStream, - struct: StructValue, + struct: StructValue ): Promise>; } diff --git a/libraries/struct/src/basic/field-value.spec.ts b/libraries/struct/src/basic/field-value.spec.ts index 4b1f17d3..acfb5b3a 100644 --- a/libraries/struct/src/basic/field-value.spec.ts +++ b/libraries/struct/src/basic/field-value.spec.ts @@ -1,18 +1,24 @@ -import { describe, expect, it } from '@jest/globals'; +import { describe, expect, it } from "@jest/globals"; + +import { type ValueOrPromise } from "../utils.js"; -import type { ValueOrPromise } from "../utils.js"; import { StructFieldDefinition } from "./definition.js"; import { StructFieldValue } from "./field-value.js"; -import type { StructOptions } from "./options.js"; -import type { StructAsyncDeserializeStream, StructDeserializeStream } from "./stream.js"; -import type { StructValue } from "./struct-value.js"; +import { type StructOptions } from "./options.js"; +import { + type StructAsyncDeserializeStream, + type StructDeserializeStream, +} from "./stream.js"; +import { type StructValue } from "./struct-value.js"; -describe('StructFieldValue', () => { - describe('.constructor', () => { - it('should save parameters', () => { +describe("StructFieldValue", () => { + describe(".constructor", () => { + it("should save parameters", () => { class MockStructFieldValue extends StructFieldValue { public serialize(dataView: DataView, offset: number): void { - throw new Error('Method not implemented.'); + void dataView; + void offset; + throw new Error("Method not implemented."); } } @@ -21,64 +27,95 @@ describe('StructFieldValue', () => { const struct = {} as any; const value = {} as any; - const fieldValue = new MockStructFieldValue(definition, options, struct, value); - expect(fieldValue).toHaveProperty('definition', definition); - expect(fieldValue).toHaveProperty('options', options); - expect(fieldValue).toHaveProperty('struct', struct); + const fieldValue = new MockStructFieldValue( + definition, + options, + struct, + value + ); + expect(fieldValue).toHaveProperty("definition", definition); + expect(fieldValue).toHaveProperty("options", options); + expect(fieldValue).toHaveProperty("struct", struct); expect(fieldValue.get()).toBe(value); }); }); - describe('#getSize', () => { - it('should return same value as definition\'s', () => { + describe("#getSize", () => { + it("should return same value as definition's", () => { class MockFieldDefinition extends StructFieldDefinition { public getSize(): number { return 42; } - public create(options: Readonly, struct: StructValue, value: unknown): StructFieldValue { - throw new Error('Method not implemented.'); + public create( + options: Readonly, + struct: StructValue, + value: unknown + ): StructFieldValue { + void options; + void struct; + void value; + throw new Error("Method not implemented."); } public override deserialize( options: Readonly, stream: StructDeserializeStream, - struct: StructValue, + struct: StructValue ): StructFieldValue; public override deserialize( options: Readonly, stream: StructAsyncDeserializeStream, - struct: StructValue, + struct: StructValue ): Promise>; public override deserialize( options: Readonly, - stream: StructDeserializeStream | StructAsyncDeserializeStream, - struct: StructValue, + stream: + | StructDeserializeStream + | StructAsyncDeserializeStream, + struct: StructValue ): ValueOrPromise> { - throw new Error('Method not implemented.'); + void options; + void stream; + void struct; + throw new Error("Method not implemented."); } } class MockStructFieldValue extends StructFieldValue { public serialize(dataView: DataView, offset: number): void { - throw new Error('Method not implemented.'); + void dataView; + void offset; + throw new Error("Method not implemented."); } } const fieldDefinition = new MockFieldDefinition(); - const fieldValue = new MockStructFieldValue(fieldDefinition, undefined as any, undefined as any, undefined as any); + const fieldValue = new MockStructFieldValue( + fieldDefinition, + undefined as any, + undefined as any, + undefined as any + ); expect(fieldValue.getSize()).toBe(42); }); }); - describe('#set', () => { - it('should update its internal value', () => { + describe("#set", () => { + it("should update its internal value", () => { class MockStructFieldValue extends StructFieldValue { public serialize(dataView: DataView, offset: number): void { - throw new Error('Method not implemented.'); + void dataView; + void offset; + throw new Error("Method not implemented."); } } - const fieldValue = new MockStructFieldValue(undefined as any, undefined as any, undefined as any, undefined as any); + const fieldValue = new MockStructFieldValue( + undefined as any, + undefined as any, + undefined as any, + undefined as any + ); fieldValue.set(1); expect(fieldValue.get()).toBe(1); diff --git a/libraries/struct/src/basic/field-value.ts b/libraries/struct/src/basic/field-value.ts index 593cfecc..f107ce01 100644 --- a/libraries/struct/src/basic/field-value.ts +++ b/libraries/struct/src/basic/field-value.ts @@ -1,6 +1,6 @@ -import type { StructFieldDefinition } from "./definition.js"; -import type { StructOptions } from "./options.js"; -import type { StructValue } from "./struct-value.js"; +import { type StructFieldDefinition } from "./definition.js"; +import { type StructOptions } from "./options.js"; +import { type StructValue } from "./struct-value.js"; /** * A field value defines how to serialize a field. @@ -9,8 +9,12 @@ import type { StructValue } from "./struct-value.js"; * helpful for the serialization process. */ export abstract class StructFieldValue< - TDefinition extends StructFieldDefinition = StructFieldDefinition - > { + TDefinition extends StructFieldDefinition< + any, + any, + any + > = StructFieldDefinition +> { /** Gets the definition associated with this runtime value */ public readonly definition: TDefinition; @@ -21,17 +25,19 @@ export abstract class StructFieldValue< public readonly struct: StructValue; public get hasCustomAccessors(): boolean { - return this.get !== StructFieldValue.prototype.get || - this.set !== StructFieldValue.prototype.set; + return ( + this.get !== StructFieldValue.prototype.get || + this.set !== StructFieldValue.prototype.set + ); } - protected value: TDefinition['TValue']; + protected value: TDefinition["TValue"]; public constructor( definition: TDefinition, options: Readonly, struct: StructValue, - value: TDefinition['TValue'], + value: TDefinition["TValue"] ) { this.definition = definition; this.options = options; @@ -51,22 +57,19 @@ export abstract class StructFieldValue< /** * When implemented in derived classes, reads current field's value. */ - public get(): TDefinition['TValue'] { + public get(): TDefinition["TValue"] { return this.value; } /** * When implemented in derived classes, updates current field's value. */ - public set(value: TDefinition['TValue']): void { + public set(value: TDefinition["TValue"]): void { this.value = value; } /** * When implemented in derived classes, serializes this field into `dataView` at `offset` */ - public abstract serialize( - dataView: DataView, - offset: number, - ): void; + public abstract serialize(dataView: DataView, offset: number): void; } diff --git a/libraries/struct/src/basic/options.spec.ts b/libraries/struct/src/basic/options.spec.ts index 25eadb5d..0316ba6b 100644 --- a/libraries/struct/src/basic/options.spec.ts +++ b/libraries/struct/src/basic/options.spec.ts @@ -1,10 +1,11 @@ import { describe, expect, it } from "@jest/globals"; -import { StructDefaultOptions } from './options.js'; -describe('StructDefaultOptions', () => { - describe('.littleEndian', () => { - it('should be `false`', () => { - expect(StructDefaultOptions).toHaveProperty('littleEndian', false); +import { StructDefaultOptions } from "./options.js"; + +describe("StructDefaultOptions", () => { + describe(".littleEndian", () => { + it("should be `false`", () => { + expect(StructDefaultOptions).toHaveProperty("littleEndian", false); }); }); }); diff --git a/libraries/struct/src/basic/stream.ts b/libraries/struct/src/basic/stream.ts index 4713bd5c..ab9e3183 100644 --- a/libraries/struct/src/basic/stream.ts +++ b/libraries/struct/src/basic/stream.ts @@ -1,4 +1,4 @@ -import type { ValueOrPromise } from "../utils.js"; +import { type ValueOrPromise } from "../utils.js"; // TODO: allow over reading (returning a `Uint8Array`, an `offset` and a `length`) to avoid copying diff --git a/libraries/struct/src/basic/struct-value.spec.ts b/libraries/struct/src/basic/struct-value.spec.ts index 2c523604..b546f567 100644 --- a/libraries/struct/src/basic/struct-value.spec.ts +++ b/libraries/struct/src/basic/struct-value.spec.ts @@ -1,50 +1,62 @@ -import { describe, expect, it, jest } from '@jest/globals'; +import { describe, expect, it, jest } from "@jest/globals"; import { StructValue } from "./struct-value.js"; -describe('StructValue', () => { - describe('.constructor', () => { - it('should create `fieldValues` and `value`', () => { +describe("StructValue", () => { + describe(".constructor", () => { + it("should create `fieldValues` and `value`", () => { const foo = new StructValue({}); const bar = new StructValue({}); - expect(foo).toHaveProperty('fieldValues', {}); - expect(foo).toHaveProperty('value', {}); - expect(bar).toHaveProperty('fieldValues', {}); - expect(bar).toHaveProperty('value', {}); + expect(foo).toHaveProperty("fieldValues", {}); + expect(foo).toHaveProperty("value", {}); + expect(bar).toHaveProperty("fieldValues", {}); + expect(bar).toHaveProperty("value", {}); expect(foo.fieldValues).not.toBe(bar.fieldValues); expect(foo.value).not.toBe(bar.fieldValues); }); }); - describe('#set', () => { - it('should save the `StructFieldValue`', () => { + describe("#set", () => { + it("should save the `StructFieldValue`", () => { const object = new StructValue({}); - const foo = 'foo'; - const fooValue = { get() { return 42; } } as any; + const foo = "foo"; + const fooValue = { + get() { + return 42; + }, + } as any; object.set(foo, fooValue); - const bar = 'bar'; - const barValue = { get() { return 'foo'; } } as any; + const bar = "bar"; + const barValue = { + get() { + return "foo"; + }, + } as any; object.set(bar, barValue); expect(object.fieldValues[foo]).toBe(fooValue); expect(object.fieldValues[bar]).toBe(barValue); }); - it('should define a property for `key`', () => { + it("should define a property for `key`", () => { const object = new StructValue({}); - const foo = 'foo'; + const foo = "foo"; const fooGetter = jest.fn(() => 42); - const fooSetter = jest.fn((value: number) => { }); + const fooSetter = jest.fn((value: number) => { + void value; + }); const fooValue = { get: fooGetter, set: fooSetter } as any; object.set(foo, fooValue); - const bar = 'bar'; + const bar = "bar"; const barGetter = jest.fn(() => true); - const barSetter = jest.fn((value: number) => { }); + const barSetter = jest.fn((value: number) => { + void value; + }); const barValue = { get: barGetter, set: barSetter } as any; object.set(bar, barValue); @@ -58,12 +70,16 @@ describe('StructValue', () => { }); }); - describe('#get', () => { - it('should return previously set `StructFieldValue`', () => { + describe("#get", () => { + it("should return previously set `StructFieldValue`", () => { const object = new StructValue({}); - const foo = 'foo'; - const fooValue = { get() { return 'foo'; } } as any; + const foo = "foo"; + const fooValue = { + get() { + return "foo"; + }, + } as any; object.set(foo, fooValue); expect(object.get(foo)).toBe(fooValue); diff --git a/libraries/struct/src/basic/struct-value.ts b/libraries/struct/src/basic/struct-value.ts index a3fd6b45..ed775bf8 100644 --- a/libraries/struct/src/basic/struct-value.ts +++ b/libraries/struct/src/basic/struct-value.ts @@ -1,4 +1,4 @@ -import type { StructFieldValue } from "./field-value.js"; +import { type StructFieldValue } from "./field-value.js"; export const STRUCT_VALUE_SYMBOL = Symbol("struct-value"); @@ -6,25 +6,27 @@ export const STRUCT_VALUE_SYMBOL = Symbol("struct-value"); * A struct value is a map between keys in a struct and their field values. */ export class StructValue { - /** @internal */ readonly fieldValues: Record = {}; + /** @internal */ readonly fieldValues: Record< + PropertyKey, + StructFieldValue + > = {}; /** * Gets the result struct value object */ public readonly value: Record; - public constructor(prototype: any) { + public constructor(prototype: object) { // PERF: `Object.create(extra)` is 50% faster // than `Object.defineProperties(this.value, extra)` - this.value = Object.create(prototype); + this.value = Object.create(prototype) as Record; // PERF: `Object.defineProperty` is slow // but we need it to be non-enumerable - Object.defineProperty( - this.value, - STRUCT_VALUE_SYMBOL, - { enumerable: false, value: this } - ); + Object.defineProperty(this.value, STRUCT_VALUE_SYMBOL, { + enumerable: false, + value: this, + }); } /** @@ -42,8 +44,12 @@ export class StructValue { Object.defineProperty(this.value, name, { configurable: true, enumerable: true, - get() { return fieldValue.get(); }, - set(v) { fieldValue.set(v); }, + get() { + return fieldValue.get(); + }, + set(v) { + fieldValue.set(v); + }, }); } else { this.value[name] = fieldValue.get(); diff --git a/libraries/struct/src/struct.spec.ts b/libraries/struct/src/struct.spec.ts index 1ddcab92..eb8d3cab 100644 --- a/libraries/struct/src/struct.spec.ts +++ b/libraries/struct/src/struct.spec.ts @@ -1,27 +1,45 @@ -import { describe, expect, it, jest } from '@jest/globals'; - -import { StructAsyncDeserializeStream, StructDefaultOptions, StructDeserializeStream, StructFieldDefinition, StructFieldValue, StructOptions, StructValue } from './basic/index.js'; -import { BigIntFieldDefinition, BigIntFieldType, BufferFieldSubType, FixedLengthBufferLikeFieldDefinition, NumberFieldDefinition, NumberFieldType, VariableLengthBufferLikeFieldDefinition } from "./index.js"; -import { Struct } from './struct.js'; -import type { ValueOrPromise } from './utils.js'; +import { describe, expect, it, jest } from "@jest/globals"; + +import { + StructDefaultOptions, + StructFieldDefinition, + type StructAsyncDeserializeStream, + type StructDeserializeStream, + type StructFieldValue, + type StructOptions, + type StructValue, +} from "./basic/index.js"; + +import { + BigIntFieldDefinition, + BigIntFieldType, + BufferFieldSubType, + FixedLengthBufferLikeFieldDefinition, + NumberFieldDefinition, + NumberFieldType, + VariableLengthBufferLikeFieldDefinition, +} from "./index.js"; + +import { Struct } from "./struct.js"; +import { type ValueOrPromise } from "./utils.js"; class MockDeserializationStream implements StructDeserializeStream { public buffer = new Uint8Array(0); - public read = jest.fn((length: number) => this.buffer); + public read = jest.fn(() => this.buffer); } -describe('Struct', () => { - describe('.constructor', () => { - it('should initialize fields', () => { +describe("Struct", () => { + describe(".constructor", () => { + it("should initialize fields", () => { const struct = new Struct(); - expect(struct).toHaveProperty('options', StructDefaultOptions); - expect(struct).toHaveProperty('size', 0); + expect(struct).toHaveProperty("options", StructDefaultOptions); + expect(struct).toHaveProperty("size", 0); }); }); - describe('#field', () => { - class MockFieldDefinition extends StructFieldDefinition{ + describe("#field", () => { + class MockFieldDefinition extends StructFieldDefinition { public constructor(size: number) { super(size); } @@ -30,234 +48,274 @@ describe('Struct', () => { return this.options; }); - public create(options: Readonly, struct: StructValue, value: unknown): StructFieldValue { - throw new Error('Method not implemented.'); + public create( + options: Readonly, + struct: StructValue, + value: unknown + ): StructFieldValue { + void options; + void struct; + void value; + throw new Error("Method not implemented."); } public override deserialize( options: Readonly, stream: StructDeserializeStream, - struct: StructValue, + struct: StructValue ): StructFieldValue; public override deserialize( options: Readonly, stream: StructAsyncDeserializeStream, - struct: StructValue, + struct: StructValue ): Promise>; public override deserialize( options: Readonly, stream: StructDeserializeStream | StructAsyncDeserializeStream, struct: StructValue ): ValueOrPromise> { - throw new Error('Method not implemented.'); + void options; + void stream; + void struct; + throw new Error("Method not implemented."); } } - it('should push a field and update size', () => { + it("should push a field and update size", () => { const struct = new Struct(); - const field1 = 'foo'; + const field1 = "foo"; const fieldDefinition1 = new MockFieldDefinition(4); struct.field(field1, fieldDefinition1); - expect(struct).toHaveProperty('size', 4); + expect(struct).toHaveProperty("size", 4); expect(fieldDefinition1.getSize).toBeCalledTimes(1); - expect(struct['_fields']).toEqual([[field1, fieldDefinition1]]); + expect(struct["_fields"]).toEqual([[field1, fieldDefinition1]]); - const field2 = 'bar'; + const field2 = "bar"; const fieldDefinition2 = new MockFieldDefinition(8); struct.field(field2, fieldDefinition2); - expect(struct).toHaveProperty('size', 12); + expect(struct).toHaveProperty("size", 12); expect(fieldDefinition2.getSize).toBeCalledTimes(1); - expect(struct['_fields']).toEqual([ + expect(struct["_fields"]).toEqual([ [field1, fieldDefinition1], [field2, fieldDefinition2], ]); }); - it('should throw an error if field name already exists', () => { + it("should throw an error if field name already exists", () => { const struct = new Struct(); - const fieldName = 'foo'; + const fieldName = "foo"; struct.field(fieldName, new MockFieldDefinition(4)); - expect(() => struct.field(fieldName, new MockFieldDefinition(4))).toThrowError(); + expect(() => + struct.field(fieldName, new MockFieldDefinition(4)) + ).toThrowError(); }); }); - describe('#number', () => { - it('`int8` should append an `int8` field', () => { + describe("#number", () => { + it("`int8` should append an `int8` field", () => { const struct = new Struct(); - struct.int8('foo'); - expect(struct).toHaveProperty('size', 1); + struct.int8("foo"); + expect(struct).toHaveProperty("size", 1); - const definition = struct['_fields'][0]![1] as NumberFieldDefinition; + const definition = struct[ + "_fields" + ][0]![1] as NumberFieldDefinition; expect(definition).toBeInstanceOf(NumberFieldDefinition); expect(definition.type).toBe(NumberFieldType.Int8); }); - it('`uint8` should append an `uint8` field', () => { + it("`uint8` should append an `uint8` field", () => { const struct = new Struct(); - struct.uint8('foo'); - expect(struct).toHaveProperty('size', 1); + struct.uint8("foo"); + expect(struct).toHaveProperty("size", 1); - const definition = struct['_fields'][0]![1] as NumberFieldDefinition; + const definition = struct[ + "_fields" + ][0]![1] as NumberFieldDefinition; expect(definition).toBeInstanceOf(NumberFieldDefinition); expect(definition.type).toBe(NumberFieldType.Uint8); }); - it('`int16` should append an `int16` field', () => { + it("`int16` should append an `int16` field", () => { const struct = new Struct(); - struct.int16('foo'); - expect(struct).toHaveProperty('size', 2); + struct.int16("foo"); + expect(struct).toHaveProperty("size", 2); - const definition = struct['_fields'][0]![1] as NumberFieldDefinition; + const definition = struct[ + "_fields" + ][0]![1] as NumberFieldDefinition; expect(definition).toBeInstanceOf(NumberFieldDefinition); expect(definition.type).toBe(NumberFieldType.Int16); }); - it('`uint16` should append an `uint16` field', () => { + it("`uint16` should append an `uint16` field", () => { const struct = new Struct(); - struct.uint16('foo'); - expect(struct).toHaveProperty('size', 2); + struct.uint16("foo"); + expect(struct).toHaveProperty("size", 2); - const definition = struct['_fields'][0]![1] as NumberFieldDefinition; + const definition = struct[ + "_fields" + ][0]![1] as NumberFieldDefinition; expect(definition).toBeInstanceOf(NumberFieldDefinition); expect(definition.type).toBe(NumberFieldType.Uint16); }); - it('`int32` should append an `int32` field', () => { + it("`int32` should append an `int32` field", () => { const struct = new Struct(); - struct.int32('foo'); - expect(struct).toHaveProperty('size', 4); + struct.int32("foo"); + expect(struct).toHaveProperty("size", 4); - const definition = struct['_fields'][0]![1] as NumberFieldDefinition; + const definition = struct[ + "_fields" + ][0]![1] as NumberFieldDefinition; expect(definition).toBeInstanceOf(NumberFieldDefinition); expect(definition.type).toBe(NumberFieldType.Int32); }); - it('`uint32` should append an `uint32` field', () => { + it("`uint32` should append an `uint32` field", () => { const struct = new Struct(); - struct.uint32('foo'); - expect(struct).toHaveProperty('size', 4); + struct.uint32("foo"); + expect(struct).toHaveProperty("size", 4); - const definition = struct['_fields'][0]![1] as NumberFieldDefinition; + const definition = struct[ + "_fields" + ][0]![1] as NumberFieldDefinition; expect(definition).toBeInstanceOf(NumberFieldDefinition); expect(definition.type).toBe(NumberFieldType.Uint32); }); - it('`int64` should append an `int64` field', () => { + it("`int64` should append an `int64` field", () => { const struct = new Struct(); - struct.int64('foo'); - expect(struct).toHaveProperty('size', 8); + struct.int64("foo"); + expect(struct).toHaveProperty("size", 8); - const definition = struct['_fields'][0]![1] as BigIntFieldDefinition; + const definition = struct[ + "_fields" + ][0]![1] as BigIntFieldDefinition; expect(definition).toBeInstanceOf(BigIntFieldDefinition); expect(definition.type).toBe(BigIntFieldType.Int64); }); - it('`uint64` should append an `uint64` field', () => { + it("`uint64` should append an `uint64` field", () => { const struct = new Struct(); - struct.uint64('foo'); - expect(struct).toHaveProperty('size', 8); + struct.uint64("foo"); + expect(struct).toHaveProperty("size", 8); - const definition = struct['_fields'][0]![1] as BigIntFieldDefinition; + const definition = struct[ + "_fields" + ][0]![1] as BigIntFieldDefinition; expect(definition).toBeInstanceOf(BigIntFieldDefinition); expect(definition.type).toBe(BigIntFieldType.Uint64); }); - describe('#uint8ArrayLike', () => { - describe('FixedLengthBufferLikeFieldDefinition', () => { - it('`#uint8Array` with fixed length', () => { - let struct = new Struct(); - struct.uint8Array('foo', { length: 10 }); - expect(struct).toHaveProperty('size', 10); - - const definition = struct['_fields'][0]![1] as FixedLengthBufferLikeFieldDefinition; - expect(definition).toBeInstanceOf(FixedLengthBufferLikeFieldDefinition); + describe("#uint8ArrayLike", () => { + describe("FixedLengthBufferLikeFieldDefinition", () => { + it("`#uint8Array` with fixed length", () => { + const struct = new Struct(); + struct.uint8Array("foo", { length: 10 }); + expect(struct).toHaveProperty("size", 10); + + const definition = struct[ + "_fields" + ][0]![1] as FixedLengthBufferLikeFieldDefinition; + expect(definition).toBeInstanceOf( + FixedLengthBufferLikeFieldDefinition + ); expect(definition.type).toBeInstanceOf(BufferFieldSubType); expect(definition.options.length).toBe(10); }); - it('`#string` with fixed length', () => { - let struct = new Struct(); - struct.string('foo', { length: 10 }); - expect(struct).toHaveProperty('size', 10); - - const definition = struct['_fields'][0]![1] as FixedLengthBufferLikeFieldDefinition; - expect(definition).toBeInstanceOf(FixedLengthBufferLikeFieldDefinition); + it("`#string` with fixed length", () => { + const struct = new Struct(); + struct.string("foo", { length: 10 }); + expect(struct).toHaveProperty("size", 10); + + const definition = struct[ + "_fields" + ][0]![1] as FixedLengthBufferLikeFieldDefinition; + expect(definition).toBeInstanceOf( + FixedLengthBufferLikeFieldDefinition + ); expect(definition.type).toBeInstanceOf(BufferFieldSubType); expect(definition.options.length).toBe(10); }); }); - describe('VariableLengthBufferLikeFieldDefinition', () => { - it('`#uint8Array` with variable length', () => { - const struct = new Struct().int8('barLength'); - expect(struct).toHaveProperty('size', 1); + describe("VariableLengthBufferLikeFieldDefinition", () => { + it("`#uint8Array` with variable length", () => { + const struct = new Struct().int8("barLength"); + expect(struct).toHaveProperty("size", 1); - struct.uint8Array('bar', { lengthField: 'barLength' }); - expect(struct).toHaveProperty('size', 1); + struct.uint8Array("bar", { lengthField: "barLength" }); + expect(struct).toHaveProperty("size", 1); - const definition = struct['_fields'][1]![1] as VariableLengthBufferLikeFieldDefinition; - expect(definition).toBeInstanceOf(VariableLengthBufferLikeFieldDefinition); + const definition = struct[ + "_fields" + ][1]![1] as VariableLengthBufferLikeFieldDefinition; + expect(definition).toBeInstanceOf( + VariableLengthBufferLikeFieldDefinition + ); expect(definition.type).toBeInstanceOf(BufferFieldSubType); - expect(definition.options.lengthField).toBe('barLength'); + expect(definition.options.lengthField).toBe("barLength"); }); - it('`#string` with variable length', () => { - const struct = new Struct().int8('barLength'); - expect(struct).toHaveProperty('size', 1); + it("`#string` with variable length", () => { + const struct = new Struct().int8("barLength"); + expect(struct).toHaveProperty("size", 1); - struct.string('bar', { lengthField: 'barLength' }); - expect(struct).toHaveProperty('size', 1); + struct.string("bar", { lengthField: "barLength" }); + expect(struct).toHaveProperty("size", 1); - const definition = struct['_fields'][1]![1] as VariableLengthBufferLikeFieldDefinition; - expect(definition).toBeInstanceOf(VariableLengthBufferLikeFieldDefinition); + const definition = struct[ + "_fields" + ][1]![1] as VariableLengthBufferLikeFieldDefinition; + expect(definition).toBeInstanceOf( + VariableLengthBufferLikeFieldDefinition + ); expect(definition.type).toBeInstanceOf(BufferFieldSubType); - expect(definition.options.lengthField).toBe('barLength'); + expect(definition.options.lengthField).toBe("barLength"); }); }); }); - describe('#fields', () => { - it('should append all fields from other struct', async () => { - const sub = new Struct() - .int16('int16') - .int32('int32'); + describe("#fields", () => { + it("should append all fields from other struct", () => { + const sub = new Struct().int16("int16").int32("int32"); const struct = new Struct() - .int8('int8') + .int8("int8") .fields(sub) - .int64('int64'); + .int64("int64"); - const field0 = struct['_fields'][0]!; - expect(field0).toHaveProperty('0', 'int8'); - expect(field0[1]).toHaveProperty('type', NumberFieldType.Int8); + const field0 = struct["_fields"][0]!; + expect(field0).toHaveProperty("0", "int8"); + expect(field0[1]).toHaveProperty("type", NumberFieldType.Int8); - const field1 = struct['_fields'][1]!; - expect(field1).toHaveProperty('0', 'int16'); - expect(field1[1]).toHaveProperty('type', NumberFieldType.Int16); + const field1 = struct["_fields"][1]!; + expect(field1).toHaveProperty("0", "int16"); + expect(field1[1]).toHaveProperty("type", NumberFieldType.Int16); - const field2 = struct['_fields'][2]!; - expect(field2).toHaveProperty('0', 'int32'); - expect(field2[1]).toHaveProperty('type', NumberFieldType.Int32); + const field2 = struct["_fields"][2]!; + expect(field2).toHaveProperty("0", "int32"); + expect(field2[1]).toHaveProperty("type", NumberFieldType.Int32); - const field3 = struct['_fields'][3]!; - expect(field3).toHaveProperty('0', 'int64'); - expect(field3[1]).toHaveProperty('type', BigIntFieldType.Int64); + const field3 = struct["_fields"][3]!; + expect(field3).toHaveProperty("0", "int64"); + expect(field3[1]).toHaveProperty("type", BigIntFieldType.Int64); }); }); - describe('deserialize', () => { - it('should deserialize without dynamic size fields', async () => { - const struct = new Struct() - .int8('foo') - .int16('bar'); + describe("deserialize", () => { + it("should deserialize without dynamic size fields", () => { + const struct = new Struct().int8("foo").int16("bar"); const stream = new MockDeserializationStream(); stream.read .mockReturnValueOnce(new Uint8Array([2])) .mockReturnValueOnce(new Uint8Array([0, 16])); - const result = await struct.deserialize(stream); + const result = struct.deserialize(stream); expect(result).toEqual({ foo: 2, bar: 16 }); expect(stream.read).toBeCalledTimes(2); @@ -265,79 +323,131 @@ describe('Struct', () => { expect(stream.read).nthCalledWith(2, 2); }); - it('should deserialize with dynamic size fields', async () => { + it("should deserialize with dynamic size fields", () => { const struct = new Struct() - .int8('fooLength') - .uint8Array('foo', { lengthField: 'fooLength' }); + .int8("fooLength") + .uint8Array("foo", { lengthField: "fooLength" }); const stream = new MockDeserializationStream(); stream.read .mockReturnValueOnce(new Uint8Array([2])) .mockReturnValueOnce(new Uint8Array([3, 4])); - const result = await struct.deserialize(stream); - expect(result).toEqual({ fooLength: 2, foo: new Uint8Array([3, 4]) }); + const result = struct.deserialize(stream); + expect(result).toEqual({ + fooLength: 2, + foo: new Uint8Array([3, 4]), + }); expect(stream.read).toBeCalledTimes(2); expect(stream.read).nthCalledWith(1, 1); expect(stream.read).nthCalledWith(2, 2); }); }); - describe('#extra', () => { - it('should accept plain field', async () => { - const struct = new Struct() - .extra({ foo: 42, bar: true }); + describe("#extra", () => { + it("should accept plain field", () => { + const struct = new Struct().extra({ foo: 42, bar: true }); const stream = new MockDeserializationStream(); - const result = await struct.deserialize(stream); + const result = struct.deserialize(stream); - expect(Object.entries(Object.getOwnPropertyDescriptors(Object.getPrototypeOf(result)))).toEqual([ - ['foo', { configurable: true, enumerable: true, writable: true, value: 42 }], - ['bar', { configurable: true, enumerable: true, writable: true, value: true }], + expect( + Object.entries( + Object.getOwnPropertyDescriptors( + Object.getPrototypeOf(result) + ) + ) + ).toEqual([ + [ + "foo", + { + configurable: true, + enumerable: true, + writable: true, + value: 42, + }, + ], + [ + "bar", + { + configurable: true, + enumerable: true, + writable: true, + value: true, + }, + ], ]); }); - it('should accept accessors', async () => { - const struct = new Struct() - .extra({ - get foo() { return 42; }, - get bar() { return true; }, - set bar(value) { }, - }); + it("should accept accessors", () => { + const struct = new Struct().extra({ + get foo() { + return 42; + }, + get bar() { + return true; + }, + set bar(value) { + void value; + }, + }); const stream = new MockDeserializationStream(); - const result = await struct.deserialize(stream); + const result = struct.deserialize(stream); - expect(Object.entries(Object.getOwnPropertyDescriptors(Object.getPrototypeOf(result)))).toEqual([ - ['foo', { configurable: true, enumerable: true, get: expect.any(Function) }], - ['bar', { configurable: true, enumerable: true, get: expect.any(Function), set: expect.any(Function) }], + expect( + Object.entries( + Object.getOwnPropertyDescriptors( + Object.getPrototypeOf(result) + ) + ) + ).toEqual([ + [ + "foo", + { + configurable: true, + enumerable: true, + get: expect.any(Function), + }, + ], + [ + "bar", + { + configurable: true, + enumerable: true, + get: expect.any(Function), + set: expect.any(Function), + }, + ], ]); }); }); - describe('#postDeserialize', () => { - it('can throw errors', () => { + describe("#postDeserialize", () => { + it("can throw errors", () => { const struct = new Struct(); - const callback = jest.fn(() => { throw new Error('mock'); }); + const callback = jest.fn(() => { + throw new Error("mock"); + }); struct.postDeserialize(callback); const stream = new MockDeserializationStream(); - expect(() => struct.deserialize(stream)).toThrowError('mock'); + expect(() => struct.deserialize(stream)).toThrowError("mock"); expect(callback).toBeCalledTimes(1); }); - it('can replace return value', () => { + it("can replace return value", () => { const struct = new Struct(); - const callback = jest.fn(() => 'mock'); + const callback = jest.fn(() => "mock"); struct.postDeserialize(callback); const stream = new MockDeserializationStream(); - expect(struct.deserialize(stream)).toBe('mock'); + expect(struct.deserialize(stream)).toBe("mock"); expect(callback).toBeCalledTimes(1); expect(callback).toBeCalledWith({}); }); - it('can return nothing', () => { + it("can return nothing", () => { const struct = new Struct(); const callback = jest.fn(); struct.postDeserialize(callback); @@ -349,7 +459,7 @@ describe('Struct', () => { expect(callback).toBeCalledWith(result); }); - it('should overwrite callback', () => { + it("should overwrite callback", () => { const struct = new Struct(); const callback1 = jest.fn(); @@ -367,25 +477,31 @@ describe('Struct', () => { }); }); - describe('#serialize', () => { - it('should serialize without dynamic size fields', () => { - const struct = new Struct() - .int8('foo') - .int16('bar'); + describe("#serialize", () => { + it("should serialize without dynamic size fields", () => { + const struct = new Struct().int8("foo").int16("bar"); - const result = new Uint8Array(struct.serialize({ foo: 0x42, bar: 0x1024 })); + const result = new Uint8Array( + struct.serialize({ foo: 0x42, bar: 0x1024 }) + ); expect(result).toEqual(new Uint8Array([0x42, 0x10, 0x24])); }); - it('should serialize with dynamic size fields', () => { + it("should serialize with dynamic size fields", () => { const struct = new Struct() - .int8('fooLength') - .uint8Array('foo', { lengthField: 'fooLength' }); - - const result = new Uint8Array(struct.serialize({ foo: new Uint8Array([0x03, 0x04, 0x05]) })); - - expect(result).toEqual(new Uint8Array([0x03, 0x03, 0x04, 0x05])); + .int8("fooLength") + .uint8Array("foo", { lengthField: "fooLength" }); + + const result = new Uint8Array( + struct.serialize({ + foo: new Uint8Array([0x03, 0x04, 0x05]), + }) + ); + + expect(result).toEqual( + new Uint8Array([0x03, 0x03, 0x04, 0x05]) + ); }); }); }); diff --git a/libraries/struct/src/struct.ts b/libraries/struct/src/struct.ts index 7eb1f901..730dfd5e 100644 --- a/libraries/struct/src/struct.ts +++ b/libraries/struct/src/struct.ts @@ -1,17 +1,47 @@ -import { StructAsyncDeserializeStream, StructDefaultOptions, StructDeserializeStream, StructFieldDefinition, StructFieldValue, StructOptions, StructValue, STRUCT_VALUE_SYMBOL } from './basic/index.js'; +import { + STRUCT_VALUE_SYMBOL, + StructDefaultOptions, + StructValue, + type StructAsyncDeserializeStream, + type StructDeserializeStream, + type StructFieldDefinition, + type StructFieldValue, + type StructOptions, +} from "./basic/index.js"; import { SyncPromise } from "./sync-promise.js"; -import { BigIntFieldDefinition, BigIntFieldType, BufferFieldSubType, FixedLengthBufferLikeFieldDefinition, NumberFieldDefinition, NumberFieldType, StringBufferFieldSubType, Uint8ArrayBufferFieldSubType, VariableLengthBufferLikeFieldDefinition, type FixedLengthBufferLikeFieldOptions, type LengthField, type VariableLengthBufferLikeFieldOptions } from './types/index.js'; -import type { Evaluate, Identity, Overwrite, ValueOrPromise } from "./utils.js"; +import { + BigIntFieldDefinition, + BigIntFieldType, + FixedLengthBufferLikeFieldDefinition, + NumberFieldDefinition, + NumberFieldType, + StringBufferFieldSubType, + Uint8ArrayBufferFieldSubType, + VariableLengthBufferLikeFieldDefinition, + type BufferFieldSubType, + type FixedLengthBufferLikeFieldOptions, + type LengthField, + type VariableLengthBufferLikeFieldOptions, +} from "./types/index.js"; +import { + type Evaluate, + type Identity, + type Overwrite, + type ValueOrPromise, +} from "./utils.js"; export interface StructLike { - deserialize(stream: StructDeserializeStream | StructAsyncDeserializeStream): Promise; + deserialize( + stream: StructDeserializeStream | StructAsyncDeserializeStream + ): Promise; } /** * Extract the value type of the specified `Struct` */ -export type StructValueType> = - Awaited>; +export type StructValueType> = Awaited< + ReturnType +>; /** * Create a new `Struct` type with `TDefinition` appended @@ -23,16 +53,17 @@ type AddFieldDescriptor< TPostDeserialized, TFieldName extends PropertyKey, TDefinition extends StructFieldDefinition - > = - Identity = Identity< + Struct< // Merge two types // Evaluate immediately to optimize editor hover tooltip - Evaluate>, + Evaluate>, // Merge two `TOmitInitKey`s - TOmitInitKey | TDefinition['TOmitInitKey'], + TOmitInitKey | TDefinition["TOmitInitKey"], TExtra, TPostDeserialized - >>; + > +>; /** * Overload methods to add an array buffer like field @@ -42,7 +73,7 @@ interface ArrayBufferLikeFieldCreator< TOmitInitKey extends PropertyKey, TExtra extends object, TPostDeserialized - > { +> { /** * Append a fixed-length array buffer like field to the `Struct` * @@ -55,12 +86,12 @@ interface ArrayBufferLikeFieldCreator< < TName extends PropertyKey, TType extends BufferFieldSubType, - TTypeScriptType = TType['TTypeScriptType'], - >( + TTypeScriptType = TType["TTypeScriptType"] + >( name: TName, type: TType, options: FixedLengthBufferLikeFieldOptions, - typeScriptType?: TTypeScriptType, + typeScriptType?: TTypeScriptType ): AddFieldDescriptor< TFields, TOmitInitKey, @@ -80,22 +111,19 @@ interface ArrayBufferLikeFieldCreator< TName extends PropertyKey, TType extends BufferFieldSubType, TOptions extends VariableLengthBufferLikeFieldOptions, - TTypeScriptType = TType['TTypeScriptType'], - >( + TTypeScriptType = TType["TTypeScriptType"] + >( name: TName, type: TType, options: TOptions, - typeScriptType?: TTypeScriptType, + typeScriptType?: TTypeScriptType ): AddFieldDescriptor< TFields, TOmitInitKey, TExtra, TPostDeserialized, TName, - VariableLengthBufferLikeFieldDefinition< - TType, - TOptions - > + VariableLengthBufferLikeFieldDefinition >; } @@ -108,14 +136,11 @@ interface BoundArrayBufferLikeFieldDefinitionCreator< TExtra extends object, TPostDeserialized, TType extends BufferFieldSubType - > { - < - TName extends PropertyKey, - TTypeScriptType = TType['TTypeScriptType'], - >( +> { + ( name: TName, options: FixedLengthBufferLikeFieldOptions, - typeScriptType?: TTypeScriptType, + typeScriptType?: TTypeScriptType ): AddFieldDescriptor< TFields, TOmitInitKey, @@ -132,12 +157,15 @@ interface BoundArrayBufferLikeFieldDefinitionCreator< < TName extends PropertyKey, TLengthField extends LengthField, - TOptions extends VariableLengthBufferLikeFieldOptions, - TTypeScriptType = TType['TTypeScriptType'], - >( + TOptions extends VariableLengthBufferLikeFieldOptions< + TFields, + TLengthField + >, + TTypeScriptType = TType["TTypeScriptType"] + >( name: TName, options: TOptions, - typeScriptType?: TTypeScriptType, + typeScriptType?: TTypeScriptType ): AddFieldDescriptor< TFields, TOmitInitKey, @@ -152,18 +180,29 @@ interface BoundArrayBufferLikeFieldDefinitionCreator< >; } -export type StructPostDeserialized = - (this: TFields, object: TFields) => TPostDeserialized; +export type StructPostDeserialized = ( + this: TFields, + object: TFields +) => TPostDeserialized; -export type StructDeserializedResult = - TPostDeserialized extends undefined ? Overwrite : TPostDeserialized; +export type StructDeserializedResult< + TFields extends object, + TExtra extends object, + TPostDeserialized +> = TPostDeserialized extends undefined + ? Overwrite + : TPostDeserialized; export class Struct< - TFields extends object = {}, + TFields extends object = Record, TOmitInitKey extends PropertyKey = never, - TExtra extends object = {}, - TPostDeserialized = undefined, - > implements StructLike>{ + TExtra extends object = Record, + TPostDeserialized = undefined +> implements + StructLike< + StructDeserializedResult + > +{ public readonly TFields!: TFields; public readonly TOmitInitKey!: TOmitInitKey; @@ -172,7 +211,11 @@ export class Struct< public readonly TInit!: Evaluate>; - public readonly TDeserializeResult!: StructDeserializedResult; + public readonly TDeserializeResult!: StructDeserializedResult< + TFields, + TExtra, + TPostDeserialized + >; public readonly options: Readonly; @@ -180,9 +223,14 @@ export class Struct< /** * Gets the static size (exclude fields that can change size at runtime) */ - public get size() { return this._size; } + public get size() { + return this._size; + } - private _fields: [name: PropertyKey, definition: StructFieldDefinition][] = []; + private _fields: [ + name: PropertyKey, + definition: StructFieldDefinition + ][] = []; private _extra: Record = {}; @@ -200,7 +248,7 @@ export class Struct< TDefinition extends StructFieldDefinition >( name: TName, - definition: TDefinition, + definition: TDefinition ): AddFieldDescriptor< TFields, TOmitInitKey, @@ -211,7 +259,11 @@ export class Struct< > { for (const field of this._fields) { if (field[0] === name) { - throw new Error(`This struct already have a field with name '${String(name)}'`); + throw new Error( + `This struct already have a field with name '${String( + name + )}'` + ); } } @@ -230,31 +282,30 @@ export class Struct< public fields>( other: TOther ): Struct< - TFields & TOther['TFields'], - TOmitInitKey | TOther['TOmitInitKey'], - TExtra & TOther['TExtra'], + TFields & TOther["TFields"], + TOmitInitKey | TOther["TOmitInitKey"], + TExtra & TOther["TExtra"], TPostDeserialized > { for (const field of other._fields) { this._fields.push(field); } this._size += other._size; - Object.defineProperties(this._extra, Object.getOwnPropertyDescriptors(other._extra)); + Object.defineProperties( + this._extra, + Object.getOwnPropertyDescriptors(other._extra) + ); return this as any; } private number< TName extends PropertyKey, TType extends NumberFieldType = NumberFieldType, - TTypeScriptType = TType['TTypeScriptType'] - >( - name: TName, - type: TType, - typeScriptType?: TTypeScriptType, - ) { + TTypeScriptType = TType["TTypeScriptType"] + >(name: TName, type: TType, typeScriptType?: TTypeScriptType) { return this.field( name, - new NumberFieldDefinition(type, typeScriptType), + new NumberFieldDefinition(type, typeScriptType) ); } @@ -263,16 +314,9 @@ export class Struct< */ public int8< TName extends PropertyKey, - TTypeScriptType = (typeof NumberFieldType)['Uint8']['TTypeScriptType'] - >( - name: TName, - typeScriptType?: TTypeScriptType, - ) { - return this.number( - name, - NumberFieldType.Int8, - typeScriptType - ); + TTypeScriptType = typeof NumberFieldType["Uint8"]["TTypeScriptType"] + >(name: TName, typeScriptType?: TTypeScriptType) { + return this.number(name, NumberFieldType.Int8, typeScriptType); } /** @@ -280,16 +324,9 @@ export class Struct< */ public uint8< TName extends PropertyKey, - TTypeScriptType = (typeof NumberFieldType)['Uint8']['TTypeScriptType'] - >( - name: TName, - typeScriptType?: TTypeScriptType, - ) { - return this.number( - name, - NumberFieldType.Uint8, - typeScriptType - ); + TTypeScriptType = typeof NumberFieldType["Uint8"]["TTypeScriptType"] + >(name: TName, typeScriptType?: TTypeScriptType) { + return this.number(name, NumberFieldType.Uint8, typeScriptType); } /** @@ -297,16 +334,9 @@ export class Struct< */ public int16< TName extends PropertyKey, - TTypeScriptType = (typeof NumberFieldType)['Uint16']['TTypeScriptType'] - >( - name: TName, - typeScriptType?: TTypeScriptType, - ) { - return this.number( - name, - NumberFieldType.Int16, - typeScriptType - ); + TTypeScriptType = typeof NumberFieldType["Uint16"]["TTypeScriptType"] + >(name: TName, typeScriptType?: TTypeScriptType) { + return this.number(name, NumberFieldType.Int16, typeScriptType); } /** @@ -314,16 +344,9 @@ export class Struct< */ public uint16< TName extends PropertyKey, - TTypeScriptType = (typeof NumberFieldType)['Uint16']['TTypeScriptType'] - >( - name: TName, - typeScriptType?: TTypeScriptType, - ) { - return this.number( - name, - NumberFieldType.Uint16, - typeScriptType - ); + TTypeScriptType = typeof NumberFieldType["Uint16"]["TTypeScriptType"] + >(name: TName, typeScriptType?: TTypeScriptType) { + return this.number(name, NumberFieldType.Uint16, typeScriptType); } /** @@ -331,16 +354,9 @@ export class Struct< */ public int32< TName extends PropertyKey, - TTypeScriptType = (typeof NumberFieldType)['Int32']['TTypeScriptType'] - >( - name: TName, - typeScriptType?: TTypeScriptType, - ) { - return this.number( - name, - NumberFieldType.Int32, - typeScriptType - ); + TTypeScriptType = typeof NumberFieldType["Int32"]["TTypeScriptType"] + >(name: TName, typeScriptType?: TTypeScriptType) { + return this.number(name, NumberFieldType.Int32, typeScriptType); } /** @@ -348,30 +364,19 @@ export class Struct< */ public uint32< TName extends PropertyKey, - TTypeScriptType = (typeof NumberFieldType)['Uint32']['TTypeScriptType'] - >( - name: TName, - typeScriptType?: TTypeScriptType, - ) { - return this.number( - name, - NumberFieldType.Uint32, - typeScriptType - ); + TTypeScriptType = typeof NumberFieldType["Uint32"]["TTypeScriptType"] + >(name: TName, typeScriptType?: TTypeScriptType) { + return this.number(name, NumberFieldType.Uint32, typeScriptType); } private bigint< TName extends PropertyKey, TType extends BigIntFieldType = BigIntFieldType, - TTypeScriptType = TType['TTypeScriptType'] - >( - name: TName, - type: TType, - typeScriptType?: TTypeScriptType, - ) { + TTypeScriptType = TType["TTypeScriptType"] + >(name: TName, type: TType, typeScriptType?: TTypeScriptType) { return this.field( name, - new BigIntFieldDefinition(type, typeScriptType), + new BigIntFieldDefinition(type, typeScriptType) ); } @@ -382,16 +387,9 @@ export class Struct< */ public int64< TName extends PropertyKey, - TTypeScriptType = BigIntFieldType['TTypeScriptType'] - >( - name: TName, - typeScriptType?: TTypeScriptType, - ) { - return this.bigint( - name, - BigIntFieldType.Int64, - typeScriptType - ); + TTypeScriptType = BigIntFieldType["TTypeScriptType"] + >(name: TName, typeScriptType?: TTypeScriptType) { + return this.bigint(name, BigIntFieldType.Int64, typeScriptType); } /** @@ -401,16 +399,9 @@ export class Struct< */ public uint64< TName extends PropertyKey, - TTypeScriptType = BigIntFieldType['TTypeScriptType'] - >( - name: TName, - typeScriptType?: TTypeScriptType, - ) { - return this.bigint( - name, - BigIntFieldType.Uint64, - typeScriptType - ); + TTypeScriptType = BigIntFieldType["TTypeScriptType"] + >(name: TName, typeScriptType?: TTypeScriptType) { + return this.bigint(name, BigIntFieldType.Uint64, typeScriptType); } private arrayBufferLike: ArrayBufferLikeFieldCreator< @@ -421,20 +412,22 @@ export class Struct< > = ( name: PropertyKey, type: BufferFieldSubType, - options: FixedLengthBufferLikeFieldOptions | VariableLengthBufferLikeFieldOptions + options: + | FixedLengthBufferLikeFieldOptions + | VariableLengthBufferLikeFieldOptions ): any => { - if ('length' in options) { - return this.field( - name, - new FixedLengthBufferLikeFieldDefinition(type, options), - ); - } else { - return this.field( - name, - new VariableLengthBufferLikeFieldDefinition(type, options), - ); - } - }; + if ("length" in options) { + return this.field( + name, + new FixedLengthBufferLikeFieldDefinition(type, options) + ); + } else { + return this.field( + name, + new VariableLengthBufferLikeFieldDefinition(type, options) + ); + } + }; public uint8Array: BoundArrayBufferLikeFieldDefinitionCreator< TFields, @@ -442,13 +435,14 @@ export class Struct< TExtra, TPostDeserialized, Uint8ArrayBufferFieldSubType - > = ( - name: PropertyKey, - options: any, - typeScriptType: any, - ): any => { - return this.arrayBufferLike(name, Uint8ArrayBufferFieldSubType.Instance, options, typeScriptType); - }; + > = (name: PropertyKey, options: any, typeScriptType: any): any => { + return this.arrayBufferLike( + name, + Uint8ArrayBufferFieldSubType.Instance, + options, + typeScriptType + ); + }; public string: BoundArrayBufferLikeFieldDefinitionCreator< TFields, @@ -456,13 +450,14 @@ export class Struct< TExtra, TPostDeserialized, StringBufferFieldSubType - > = ( - name: PropertyKey, - options: any, - typeScriptType: any, - ): any => { - return this.arrayBufferLike(name, StringBufferFieldSubType.Instance, options, typeScriptType); - }; + > = (name: PropertyKey, options: any, typeScriptType: any): any => { + return this.arrayBufferLike( + name, + StringBufferFieldSubType.Instance, + options, + typeScriptType + ); + }; /** * Adds some extra properties into every `Struct` value. @@ -474,21 +469,15 @@ export class Struct< * @param value * An object containing properties to be added to the result value. Accessors and methods are also allowed. */ - public extra - >, - never - >>( + public extra< + T extends Record< + // This trick disallows any keys that are already in `TValue` + Exclude>, + never + > + >( value: T & ThisType, TFields>> - ): Struct< - TFields, - TOmitInitKey, - Overwrite, - TPostDeserialized - > { + ): Struct, TPostDeserialized> { Object.defineProperties( this._extra, Object.getOwnPropertyDescriptors(value) @@ -523,9 +512,7 @@ export class Struct< public postDeserialize( callback?: StructPostDeserialized ): Struct; - public postDeserialize( - callback?: StructPostDeserialized - ) { + public postDeserialize(callback?: StructPostDeserialized) { this._postDeserialized = callback; return this as any; } @@ -534,14 +521,16 @@ export class Struct< * Deserialize a struct value from `stream`. */ public deserialize( - stream: StructDeserializeStream, + stream: StructDeserializeStream ): StructDeserializedResult; public deserialize( - stream: StructAsyncDeserializeStream, + stream: StructAsyncDeserializeStream ): Promise>; public deserialize( - stream: StructDeserializeStream | StructAsyncDeserializeStream, - ): ValueOrPromise> { + stream: StructDeserializeStream | StructAsyncDeserializeStream + ): ValueOrPromise< + StructDeserializedResult + > { const structValue = new StructValue(this._extra); let promise = SyncPromise.resolve(); @@ -549,9 +538,13 @@ export class Struct< for (const [name, definition] of this._fields) { promise = promise .then(() => - definition.deserialize(this.options, stream as any, structValue) + definition.deserialize( + this.options, + stream as any, + structValue + ) ) - .then(fieldValue => { + .then((fieldValue) => { structValue.set(name, fieldValue); }); } @@ -562,7 +555,10 @@ export class Struct< // Run `postDeserialized` if (this._postDeserialized) { - const override = this._postDeserialized.call(object, object); + const override = this._postDeserialized.call( + object, + object + ); // If it returns a new value, use that as result // Otherwise it only inspects/mutates the object in place. if (override !== undefined) { @@ -576,8 +572,14 @@ export class Struct< } public serialize(init: Evaluate>): Uint8Array; - public serialize(init: Evaluate>, output: Uint8Array): number; - public serialize(init: Evaluate>, output?: Uint8Array): Uint8Array | number { + public serialize( + init: Evaluate>, + output: Uint8Array + ): number; + public serialize( + init: Evaluate>, + output?: Uint8Array + ): Uint8Array | number { let structValue: StructValue; if (STRUCT_VALUE_SYMBOL in init) { structValue = (init as any)[STRUCT_VALUE_SYMBOL]; @@ -600,7 +602,7 @@ export class Struct< } let structSize = 0; - const fieldsInfo: { fieldValue: StructFieldValue, size: number; }[] = []; + const fieldsInfo: { fieldValue: StructFieldValue; size: number }[] = []; for (const [name] of this._fields) { const fieldValue = structValue.get(name); @@ -609,20 +611,24 @@ export class Struct< structSize += size; } - let outputType = 'number'; + let outputType = "number"; if (!output) { output = new Uint8Array(structSize); - outputType = 'Uint8Array'; + outputType = "Uint8Array"; } - const dataView = new DataView(output.buffer, output.byteOffset, output.byteLength); + const dataView = new DataView( + output.buffer, + output.byteOffset, + output.byteLength + ); let offset = 0; for (const { fieldValue, size } of fieldsInfo) { fieldValue.serialize(dataView, offset); offset += size; } - if (outputType === 'number') { + if (outputType === "number") { return structSize; } else { return output; diff --git a/libraries/struct/src/sync-promise.spec.ts b/libraries/struct/src/sync-promise.spec.ts index 9582b29f..5656898b 100644 --- a/libraries/struct/src/sync-promise.spec.ts +++ b/libraries/struct/src/sync-promise.spec.ts @@ -3,93 +3,103 @@ import { describe, expect, it, jest } from "@jest/globals"; import { SyncPromise } from "./sync-promise.js"; function delay(timeout: number) { - return new Promise(resolve => setTimeout(resolve, timeout)); + return new Promise((resolve) => setTimeout(resolve, timeout)); } -describe('SyncPromise', () => { - describe('.resolve', () => { - it('should resolve with undefined', () => { +describe("SyncPromise", () => { + describe(".resolve", () => { + it("should resolve with undefined", () => { const promise = SyncPromise.resolve(); expect(promise.valueOrPromise()).toBe(undefined); }); - it('should resolve with a value', () => { + it("should resolve with a value", () => { const promise = SyncPromise.resolve(42); expect(promise.valueOrPromise()).toBe(42); }); - it('should resolve with a promise', async () => { + it("should resolve with a promise", async () => { const promise = SyncPromise.resolve(Promise.resolve(42)); await expect(promise.valueOrPromise()).resolves.toBe(42); }); - it('should resolve with a pending SyncPromise', async () => { - const promise = SyncPromise.resolve(SyncPromise.resolve(Promise.resolve(42))); + it("should resolve with a pending SyncPromise", async () => { + const promise = SyncPromise.resolve( + SyncPromise.resolve(Promise.resolve(42)) + ); await expect(promise.valueOrPromise()).resolves.toBe(42); }); - it('should resolve with a resolved SyncPromise', () => { + it("should resolve with a resolved SyncPromise", () => { const promise = SyncPromise.resolve(SyncPromise.resolve(42)); expect(promise.valueOrPromise()).toBe(42); }); - it('should resolve with a rejected SyncPromise', () => { - const promise = SyncPromise.resolve(SyncPromise.reject(new Error('error'))); - expect(() => promise.valueOrPromise()).toThrowError('error'); + it("should resolve with a rejected SyncPromise", () => { + const promise = SyncPromise.resolve( + SyncPromise.reject(new Error("error")) + ); + expect(() => promise.valueOrPromise()).toThrowError("error"); }); }); - describe('.reject', () => { - it('should reject with the reason', () => { - const promise = SyncPromise.reject(new Error('error')); - expect(() => promise.valueOrPromise()).toThrowError('error'); + describe(".reject", () => { + it("should reject with the reason", () => { + const promise = SyncPromise.reject(new Error("error")); + expect(() => promise.valueOrPromise()).toThrowError("error"); }); }); - describe('.try', () => { - it('should call executor', () => { + describe(".try", () => { + it("should call executor", () => { const executor = jest.fn(() => { return 42; }); - SyncPromise.try(executor); + void SyncPromise.try(executor); expect(executor).toHaveBeenCalledTimes(1); }); - it('should resolve with a value', () => { + it("should resolve with a value", () => { const promise = SyncPromise.try(() => 42); expect(promise.valueOrPromise()).toBe(42); }); - it('should resolve with a promise', async () => { + it("should resolve with a promise", async () => { const promise = SyncPromise.try(() => Promise.resolve(42)); await expect(promise.valueOrPromise()).resolves.toBe(42); }); - it('should resolve with a pending SyncPromise', async () => { - const promise = SyncPromise.try(() => SyncPromise.resolve(Promise.resolve(42))); + it("should resolve with a pending SyncPromise", async () => { + const promise = SyncPromise.try(() => + SyncPromise.resolve(Promise.resolve(42)) + ); await expect(promise.valueOrPromise()).resolves.toBe(42); }); - it('should resolve with a resolved SyncPromise', () => { + it("should resolve with a resolved SyncPromise", () => { const promise = SyncPromise.try(() => SyncPromise.resolve(42)); expect(promise.valueOrPromise()).toBe(42); }); - it('should resolve with a rejected SyncPromise', () => { - const promise = SyncPromise.try(() => SyncPromise.reject(new Error('error'))); - expect(() => promise.valueOrPromise()).toThrowError('error'); + it("should resolve with a rejected SyncPromise", () => { + const promise = SyncPromise.try(() => + SyncPromise.reject(new Error("error")) + ); + expect(() => promise.valueOrPromise()).toThrowError("error"); }); - it('should reject with the error thrown', () => { - const promise = SyncPromise.try(() => { throw new Error('error'); }); - expect(() => promise.valueOrPromise()).toThrowError('error'); + it("should reject with the error thrown", () => { + const promise = SyncPromise.try(() => { + throw new Error("error"); + }); + expect(() => promise.valueOrPromise()).toThrowError("error"); }); }); - describe('#then', () => { - it('chain a pending SyncPromise with value', async () => { + describe("#then", () => { + it("chain a pending SyncPromise with value", async () => { const promise = SyncPromise.resolve(Promise.resolve(42)); - const handler = jest.fn(() => 'foo'); + const handler = jest.fn(() => "foo"); const result = promise.then(handler); await delay(0); @@ -97,12 +107,12 @@ describe('SyncPromise', () => { expect(handler).toBeCalledTimes(1); expect(handler).toBeCalledWith(42); - await expect(result.valueOrPromise()).resolves.toBe('foo'); + await expect(result.valueOrPromise()).resolves.toBe("foo"); }); - it('chian a pending SyncPromise with a promise', async () => { + it("chian a pending SyncPromise with a promise", async () => { const promise = SyncPromise.resolve(Promise.resolve(42)); - const handler = jest.fn(() => Promise.resolve('foo')); + const handler = jest.fn(() => Promise.resolve("foo")); const result = promise.then(handler); await delay(0); @@ -110,7 +120,7 @@ describe('SyncPromise', () => { expect(handler).toBeCalledTimes(1); expect(handler).toBeCalledWith(42); - await expect(result.valueOrPromise()).resolves.toBe('foo'); + await expect(result.valueOrPromise()).resolves.toBe("foo"); }); }); }); diff --git a/libraries/struct/src/sync-promise.ts b/libraries/struct/src/sync-promise.ts index fa8250e3..0145b7f6 100644 --- a/libraries/struct/src/sync-promise.ts +++ b/libraries/struct/src/sync-promise.ts @@ -1,7 +1,13 @@ export interface SyncPromise { then( - onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null | undefined, - onrejected?: ((reason: any) => TResult2 | PromiseLike) | null | undefined + onfulfilled?: + | ((value: T) => TResult1 | PromiseLike) + | null + | undefined, + onrejected?: + | ((reason: any) => TResult2 | PromiseLike) + | null + | undefined ): SyncPromise; valueOrPromise(): T | PromiseLike; @@ -22,9 +28,9 @@ export const SyncPromise: SyncPromiseStatic = { }, resolve(value?: T | PromiseLike): SyncPromise { if ( - typeof value === 'object' && + typeof value === "object" && value !== null && - typeof (value as PromiseLike).then === 'function' + typeof (value as PromiseLike).then === "function" ) { if ( value instanceof PendingSyncPromise || @@ -45,7 +51,7 @@ export const SyncPromise: SyncPromiseStatic = { } catch (e) { return SyncPromise.reject(e); } - } + }, }; class PendingSyncPromise implements SyncPromise { @@ -56,8 +62,14 @@ class PendingSyncPromise implements SyncPromise { } public then( - onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null | undefined, - onrejected?: ((reason: any) => TResult2 | PromiseLike) | null | undefined + onfulfilled?: + | ((value: T) => TResult1 | PromiseLike) + | null + | undefined, + onrejected?: + | ((reason: any) => TResult2 | PromiseLike) + | null + | undefined ) { return new PendingSyncPromise( this.promise.then(onfulfilled, onrejected) @@ -76,9 +88,11 @@ class ResolvedSyncPromise implements SyncPromise { this.value = value; } - public then( - onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null | undefined, - onrejected?: ((reason: any) => TResult2 | PromiseLike) | null | undefined + public then( + onfulfilled?: + | ((value: T) => TResult1 | PromiseLike) + | null + | undefined ) { if (!onfulfilled) { return this as any; @@ -99,8 +113,14 @@ class RejectedSyncPromise implements SyncPromise { } public then( - onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null | undefined, - onrejected?: ((reason: any) => TResult2 | PromiseLike) | null | undefined + onfulfilled?: + | ((value: T) => TResult1 | PromiseLike) + | null + | undefined, + onrejected?: + | ((reason: any) => TResult2 | PromiseLike) + | null + | undefined ) { if (!onrejected) { return this as any; diff --git a/libraries/struct/src/types/bigint.ts b/libraries/struct/src/types/bigint.ts index 44608a9b..cfcff6c4 100644 --- a/libraries/struct/src/types/bigint.ts +++ b/libraries/struct/src/types/bigint.ts @@ -1,11 +1,33 @@ -import { getBigInt64, getBigUint64, setBigInt64, setBigUint64 } from '@yume-chan/dataview-bigint-polyfill/esm/fallback.js'; -import { StructFieldDefinition, StructFieldValue, StructValue, type StructAsyncDeserializeStream, type StructDeserializeStream, type StructOptions } from "../basic/index.js"; +import { + getBigInt64, + getBigUint64, + setBigInt64, + setBigUint64, +} from "@yume-chan/dataview-bigint-polyfill/esm/fallback.js"; + +import { + StructFieldDefinition, + StructFieldValue, + type StructAsyncDeserializeStream, + type StructDeserializeStream, + type StructOptions, + type StructValue, +} from "../basic/index.js"; import { SyncPromise } from "../sync-promise.js"; -import type { ValueOrPromise } from "../utils.js"; +import { type ValueOrPromise } from "../utils.js"; -type DataViewBigInt64Getter = (dataView: DataView, byteOffset: number, littleEndian: boolean | undefined) => bigint; +type DataViewBigInt64Getter = ( + dataView: DataView, + byteOffset: number, + littleEndian: boolean | undefined +) => bigint; -type DataViewBigInt64Setter = (dataView: DataView, byteOffset: number, value: bigint, littleEndian: boolean | undefined) => void; +type DataViewBigInt64Setter = ( + dataView: DataView, + byteOffset: number, + value: bigint, + littleEndian: boolean | undefined +) => void; export class BigIntFieldType { public readonly TTypeScriptType!: bigint; @@ -19,28 +41,34 @@ export class BigIntFieldType { public constructor( size: number, getter: DataViewBigInt64Getter, - setter: DataViewBigInt64Setter, + setter: DataViewBigInt64Setter ) { this.size = size; this.getter = getter; this.setter = setter; } - public static readonly Int64 = new BigIntFieldType(8, getBigInt64, setBigInt64); + public static readonly Int64 = new BigIntFieldType( + 8, + getBigInt64, + setBigInt64 + ); - public static readonly Uint64 = new BigIntFieldType(8, getBigUint64, setBigUint64); + public static readonly Uint64 = new BigIntFieldType( + 8, + getBigUint64, + setBigUint64 + ); } export class BigIntFieldDefinition< TType extends BigIntFieldType = BigIntFieldType, - TTypeScriptType = TType["TTypeScriptType"], - > extends StructFieldDefinition< - void, - TTypeScriptType - > { + TTypeScriptType = TType["TTypeScriptType"] +> extends StructFieldDefinition { public readonly type: TType; - public constructor(type: TType, _typescriptType?: TTypeScriptType) { + public constructor(type: TType, typescriptType?: TTypeScriptType) { + void typescriptType; super(); this.type = type; } @@ -52,7 +80,7 @@ export class BigIntFieldDefinition< public create( options: Readonly, struct: StructValue, - value: TTypeScriptType, + value: TTypeScriptType ): BigIntFieldValue { return new BigIntFieldValue(this, options, struct, value); } @@ -60,29 +88,28 @@ export class BigIntFieldDefinition< public override deserialize( options: Readonly, stream: StructDeserializeStream, - struct: StructValue, + struct: StructValue ): BigIntFieldValue; public override deserialize( options: Readonly, stream: StructAsyncDeserializeStream, - struct: StructValue, + struct: StructValue ): Promise>; public override deserialize( options: Readonly, stream: StructDeserializeStream | StructAsyncDeserializeStream, - struct: StructValue, + struct: StructValue ): ValueOrPromise> { - return SyncPromise - .try(() => { - return stream.read(this.getSize()); - }) - .then(array => { - const view = new DataView(array.buffer, array.byteOffset, array.byteLength); - const value = this.type.getter( - view, - 0, - options.littleEndian + return SyncPromise.try(() => { + return stream.read(this.getSize()); + }) + .then((array) => { + const view = new DataView( + array.buffer, + array.byteOffset, + array.byteLength ); + const value = this.type.getter(view, 0, options.littleEndian); return this.create(options, struct, value as any); }) .valueOrPromise(); @@ -90,13 +117,13 @@ export class BigIntFieldDefinition< } export class BigIntFieldValue< - TDefinition extends BigIntFieldDefinition, - > extends StructFieldValue { + TDefinition extends BigIntFieldDefinition +> extends StructFieldValue { public serialize(dataView: DataView, offset: number): void { this.definition.type.setter( dataView, offset, - this.value!, + this.value, this.options.littleEndian ); } diff --git a/libraries/struct/src/types/buffer/base.spec.ts b/libraries/struct/src/types/buffer/base.spec.ts index 849179ca..105ff732 100644 --- a/libraries/struct/src/types/buffer/base.spec.ts +++ b/libraries/struct/src/types/buffer/base.spec.ts @@ -1,136 +1,192 @@ -import { describe, expect, it, jest } from '@jest/globals'; - -import { StructDefaultOptions, StructDeserializeStream, StructValue } from '../../basic/index.js'; -import { BufferFieldSubType, BufferLikeFieldDefinition, EMPTY_UINT8_ARRAY, StringBufferFieldSubType, Uint8ArrayBufferFieldSubType } from './base.js'; +import { describe, expect, it, jest } from "@jest/globals"; + +import { + StructDefaultOptions, + StructValue, + type StructDeserializeStream, +} from "../../basic/index.js"; + +import { + BufferLikeFieldDefinition, + EMPTY_UINT8_ARRAY, + StringBufferFieldSubType, + Uint8ArrayBufferFieldSubType, + type BufferFieldSubType, +} from "./base.js"; class MockDeserializationStream implements StructDeserializeStream { public array = EMPTY_UINT8_ARRAY; - public read = jest.fn((length: number) => this.array); + public read = jest.fn(() => this.array); } -describe('Types', () => { - describe('Buffer', () => { - describe('Uint8ArrayBufferFieldSubType', () => { - it('should have a static instance', () => { - expect(Uint8ArrayBufferFieldSubType.Instance).toBeInstanceOf(Uint8ArrayBufferFieldSubType); +describe("Types", () => { + describe("Buffer", () => { + describe("Uint8ArrayBufferFieldSubType", () => { + it("should have a static instance", () => { + expect(Uint8ArrayBufferFieldSubType.Instance).toBeInstanceOf( + Uint8ArrayBufferFieldSubType + ); }); - it('`#toBuffer` should return the same `Uint8Array`', () => { + it("`#toBuffer` should return the same `Uint8Array`", () => { const array = new Uint8Array(10); - expect(Uint8ArrayBufferFieldSubType.Instance.toBuffer(array)).toBe(array); + expect( + Uint8ArrayBufferFieldSubType.Instance.toBuffer(array) + ).toBe(array); }); - it('`#fromBuffer` should return the same `Uint8Array`', () => { + it("`#fromBuffer` should return the same `Uint8Array`", () => { const buffer = new Uint8Array(10); - expect(Uint8ArrayBufferFieldSubType.Instance.toValue(buffer)).toBe(buffer); + expect( + Uint8ArrayBufferFieldSubType.Instance.toValue(buffer) + ).toBe(buffer); }); - it('`#getSize` should return the `byteLength` of the `Uint8Array`', () => { + it("`#getSize` should return the `byteLength` of the `Uint8Array`", () => { const array = new Uint8Array(10); - expect(Uint8ArrayBufferFieldSubType.Instance.getSize(array)).toBe(10); + expect( + Uint8ArrayBufferFieldSubType.Instance.getSize(array) + ).toBe(10); }); }); - describe('StringBufferFieldSubType', () => { - it('should have a static instance', () => { - expect(StringBufferFieldSubType.Instance).toBeInstanceOf(StringBufferFieldSubType); + describe("StringBufferFieldSubType", () => { + it("should have a static instance", () => { + expect(StringBufferFieldSubType.Instance).toBeInstanceOf( + StringBufferFieldSubType + ); }); - it('`#toBuffer` should return the decoded string', () => { - const text = 'foo'; - const array = new Uint8Array(Buffer.from(text, 'utf-8')); - expect(StringBufferFieldSubType.Instance.toBuffer(text)).toEqual(array); + it("`#toBuffer` should return the decoded string", () => { + const text = "foo"; + const array = new Uint8Array(Buffer.from(text, "utf-8")); + expect( + StringBufferFieldSubType.Instance.toBuffer(text) + ).toEqual(array); }); - it('`#fromBuffer` should return the encoded ArrayBuffer', () => { - const text = 'foo'; - const array = new Uint8Array(Buffer.from(text, 'utf-8')); - expect(StringBufferFieldSubType.Instance.toValue(array)).toBe(text); + it("`#fromBuffer` should return the encoded ArrayBuffer", () => { + const text = "foo"; + const array = new Uint8Array(Buffer.from(text, "utf-8")); + expect(StringBufferFieldSubType.Instance.toValue(array)).toBe( + text + ); }); - it('`#getSize` should return -1', () => { + it("`#getSize` should return -1", () => { expect(StringBufferFieldSubType.Instance.getSize()).toBe(-1); }); }); - class MockArrayBufferFieldDefinition - extends BufferLikeFieldDefinition { + class MockArrayBufferFieldDefinition< + TType extends BufferFieldSubType + > extends BufferLikeFieldDefinition { public getSize(): number { return this.options; } } - describe('BufferLikeFieldDefinition', () => { - it('should work with `Uint8ArrayBufferFieldSubType`', async () => { + describe("BufferLikeFieldDefinition", () => { + it("should work with `Uint8ArrayBufferFieldSubType`", () => { const size = 10; - const definition = new MockArrayBufferFieldDefinition(Uint8ArrayBufferFieldSubType.Instance, size); + const definition = new MockArrayBufferFieldDefinition( + Uint8ArrayBufferFieldSubType.Instance, + size + ); const context = new MockDeserializationStream(); const array = new Uint8Array(size); context.array = array; const struct = new StructValue({}); - const fieldValue = await definition.deserialize(StructDefaultOptions, context, struct); + const fieldValue = definition.deserialize( + StructDefaultOptions, + context, + struct + ); expect(context.read).toBeCalledTimes(1); expect(context.read).toBeCalledWith(size); - expect(fieldValue).toHaveProperty('array', array); + expect(fieldValue).toHaveProperty("array", array); expect(fieldValue.get()).toBe(array); }); - it('should work when `#getSize` returns `0`', async () => { + it("should work when `#getSize` returns `0`", () => { const size = 0; - const definition = new MockArrayBufferFieldDefinition(Uint8ArrayBufferFieldSubType.Instance, size); + const definition = new MockArrayBufferFieldDefinition( + Uint8ArrayBufferFieldSubType.Instance, + size + ); const context = new MockDeserializationStream(); const buffer = new Uint8Array(size); context.array = buffer; const struct = new StructValue({}); - const fieldValue = await definition.deserialize(StructDefaultOptions, context, struct); + const fieldValue = definition.deserialize( + StructDefaultOptions, + context, + struct + ); expect(context.read).toBeCalledTimes(0); - expect(fieldValue['array']).toBeInstanceOf(Uint8Array); - expect(fieldValue['array']).toHaveProperty('byteLength', 0); + expect(fieldValue["array"]).toBeInstanceOf(Uint8Array); + expect(fieldValue["array"]).toHaveProperty("byteLength", 0); const value = fieldValue.get(); expect(value).toBeInstanceOf(Uint8Array); - expect(value).toHaveProperty('byteLength', 0); + expect(value).toHaveProperty("byteLength", 0); }); }); - describe('ArrayBufferLikeFieldValue', () => { - describe('#set', () => { - it('should clear `array` field', async () => { + describe("ArrayBufferLikeFieldValue", () => { + describe("#set", () => { + it("should clear `array` field", () => { const size = 0; - const definition = new MockArrayBufferFieldDefinition(Uint8ArrayBufferFieldSubType.Instance, size); + const definition = new MockArrayBufferFieldDefinition( + Uint8ArrayBufferFieldSubType.Instance, + size + ); const context = new MockDeserializationStream(); const array = new Uint8Array(size); context.array = array; const struct = new StructValue({}); - const fieldValue = await definition.deserialize(StructDefaultOptions, context, struct); + const fieldValue = definition.deserialize( + StructDefaultOptions, + context, + struct + ); const newValue = new Uint8Array(20); fieldValue.set(newValue); expect(fieldValue.get()).toBe(newValue); - expect(fieldValue).toHaveProperty('array', undefined); + expect(fieldValue).toHaveProperty("array", undefined); }); }); - describe('#serialize', () => { - it('should be able to serialize with cached `array`', async () => { + describe("#serialize", () => { + it("should be able to serialize with cached `array`", () => { const size = 0; - const definition = new MockArrayBufferFieldDefinition(Uint8ArrayBufferFieldSubType.Instance, size); + const definition = new MockArrayBufferFieldDefinition( + Uint8ArrayBufferFieldSubType.Instance, + size + ); const context = new MockDeserializationStream(); - const sourceArray = new Uint8Array(Array.from({ length: size }, (_, i) => i)); + const sourceArray = new Uint8Array( + Array.from({ length: size }, (_, i) => i) + ); const array = sourceArray; context.array = array; const struct = new StructValue({}); - const fieldValue = await definition.deserialize(StructDefaultOptions, context, struct); + const fieldValue = definition.deserialize( + StructDefaultOptions, + context, + struct + ); const targetArray = new Uint8Array(size); const targetView = new DataView(targetArray.buffer); @@ -139,17 +195,26 @@ describe('Types', () => { expect(targetArray).toEqual(sourceArray); }); - it('should be able to serialize a modified value', async () => { + it("should be able to serialize a modified value", () => { const size = 0; - const definition = new MockArrayBufferFieldDefinition(Uint8ArrayBufferFieldSubType.Instance, size); + const definition = new MockArrayBufferFieldDefinition( + Uint8ArrayBufferFieldSubType.Instance, + size + ); const context = new MockDeserializationStream(); - const sourceArray = new Uint8Array(Array.from({ length: size }, (_, i) => i)); + const sourceArray = new Uint8Array( + Array.from({ length: size }, (_, i) => i) + ); const array = sourceArray; context.array = array; const struct = new StructValue({}); - const fieldValue = await definition.deserialize(StructDefaultOptions, context, struct); + const fieldValue = definition.deserialize( + StructDefaultOptions, + context, + struct + ); fieldValue.set(sourceArray); diff --git a/libraries/struct/src/types/buffer/base.ts b/libraries/struct/src/types/buffer/base.ts index c2b36b0e..768b70ab 100644 --- a/libraries/struct/src/types/buffer/base.ts +++ b/libraries/struct/src/types/buffer/base.ts @@ -1,4 +1,11 @@ -import { StructFieldDefinition, StructFieldValue, StructValue, type StructAsyncDeserializeStream, type StructDeserializeStream, type StructOptions } from '../../basic/index.js'; +import { + StructFieldDefinition, + StructFieldValue, + type StructAsyncDeserializeStream, + type StructDeserializeStream, + type StructOptions, + type StructValue, +} from "../../basic/index.js"; import { SyncPromise } from "../../sync-promise.js"; import { decodeUtf8, encodeUtf8, type ValueOrPromise } from "../../utils.js"; @@ -11,7 +18,10 @@ import { decodeUtf8, encodeUtf8, type ValueOrPromise } from "../../utils.js"; * @template TTypeScriptType Optional another type (should be compatible with `TType`) * specified by user when creating field definitions. */ -export abstract class BufferFieldSubType { +export abstract class BufferFieldSubType< + TValue = unknown, + TTypeScriptType = TValue +> { public readonly TTypeScriptType!: TTypeScriptType; /** @@ -36,8 +46,9 @@ export abstract class BufferFieldSubType - extends BufferFieldSubType { +export class Uint8ArrayBufferFieldSubType< + TTypeScriptType = Uint8Array +> extends BufferFieldSubType { public static readonly Instance = new Uint8ArrayBufferFieldSubType(); protected constructor() { @@ -58,8 +69,9 @@ export class Uint8ArrayBufferFieldSubType } /** An `BufferFieldSubType` that converts between `Uint8Array` and `string` */ -export class StringBufferFieldSubType - extends BufferFieldSubType { +export class StringBufferFieldSubType< + TTypeScriptType = string +> extends BufferFieldSubType { public static readonly Instance = new StringBufferFieldSubType(); public toBuffer(value: string): Uint8Array { @@ -81,15 +93,14 @@ export class StringBufferFieldSubType export const EMPTY_UINT8_ARRAY = new Uint8Array(0); export abstract class BufferLikeFieldDefinition< - TType extends BufferFieldSubType = BufferFieldSubType, + TType extends BufferFieldSubType = BufferFieldSubType< + unknown, + unknown + >, TOptions = void, TOmitInitKey extends PropertyKey = never, - TTypeScriptType = TType["TTypeScriptType"], - > extends StructFieldDefinition< - TOptions, - TTypeScriptType, - TOmitInitKey - >{ + TTypeScriptType = TType["TTypeScriptType"] +> extends StructFieldDefinition { public readonly type: TType; public constructor(type: TType, options: TOptions) { @@ -98,6 +109,7 @@ export abstract class BufferLikeFieldDefinition< } protected getDeserializeSize(struct: StructValue): number { + void struct; return this.getSize(); } @@ -107,8 +119,8 @@ export abstract class BufferLikeFieldDefinition< public create( options: Readonly, struct: StructValue, - value: TType['TTypeScriptType'], - array?: Uint8Array, + value: TType["TTypeScriptType"], + array?: Uint8Array ): BufferLikeFieldValue { return new BufferLikeFieldValue(this, options, struct, value, array); } @@ -116,28 +128,27 @@ export abstract class BufferLikeFieldDefinition< public override deserialize( options: Readonly, stream: StructDeserializeStream, - struct: StructValue, + struct: StructValue ): BufferLikeFieldValue; public override deserialize( options: Readonly, stream: StructAsyncDeserializeStream, - struct: StructValue, + struct: StructValue ): Promise>; public override deserialize( options: Readonly, stream: StructDeserializeStream | StructAsyncDeserializeStream, - struct: StructValue, + struct: StructValue ): ValueOrPromise> { - return SyncPromise - .try(() => { - const size = this.getDeserializeSize(struct); - if (size === 0) { - return EMPTY_UINT8_ARRAY; - } else { - return stream.read(size); - } - }) - .then(array => { + return SyncPromise.try(() => { + const size = this.getDeserializeSize(struct); + if (size === 0) { + return EMPTY_UINT8_ARRAY; + } else { + return stream.read(size); + } + }) + .then((array) => { const value = this.type.toValue(array); return this.create(options, struct, value, array); }) @@ -146,22 +157,26 @@ export abstract class BufferLikeFieldDefinition< } export class BufferLikeFieldValue< - TDefinition extends BufferLikeFieldDefinition, any, any>, - > extends StructFieldValue { + TDefinition extends BufferLikeFieldDefinition< + BufferFieldSubType, + any, + any + > +> extends StructFieldValue { protected array: Uint8Array | undefined; public constructor( definition: TDefinition, options: Readonly, struct: StructValue, - value: TDefinition['TValue'], - array?: Uint8Array, + value: TDefinition["TValue"], + array?: Uint8Array ) { super(definition, options, struct, value); this.array = array; } - public override set(value: TDefinition['TValue']): void { + public override set(value: TDefinition["TValue"]): void { super.set(value); // When value changes, clear the cached `array` // It will be lazily calculated in `serialize()` @@ -173,7 +188,10 @@ export class BufferLikeFieldValue< this.array = this.definition.type.toBuffer(this.value); } - new Uint8Array(dataView.buffer, dataView.byteOffset, dataView.byteLength) - .set(this.array, offset); + new Uint8Array( + dataView.buffer, + dataView.byteOffset, + dataView.byteLength + ).set(this.array, offset); } } diff --git a/libraries/struct/src/types/buffer/fixed-length.ts b/libraries/struct/src/types/buffer/fixed-length.ts index e00802d7..30bb06ff 100644 --- a/libraries/struct/src/types/buffer/fixed-length.ts +++ b/libraries/struct/src/types/buffer/fixed-length.ts @@ -7,14 +7,9 @@ export interface FixedLengthBufferLikeFieldOptions { export class FixedLengthBufferLikeFieldDefinition< TType extends BufferFieldSubType = BufferFieldSubType, TOptions extends FixedLengthBufferLikeFieldOptions = FixedLengthBufferLikeFieldOptions, - TTypeScriptType = TType["TTypeScriptType"], - > extends BufferLikeFieldDefinition< - TType, - TOptions, - never, - TTypeScriptType - > { + TTypeScriptType = TType["TTypeScriptType"] +> extends BufferLikeFieldDefinition { public getSize(): number { return this.options.length; } -}; +} diff --git a/libraries/struct/src/types/buffer/variable-length.spec.ts b/libraries/struct/src/types/buffer/variable-length.spec.ts index d7fc473c..1e342ccc 100644 --- a/libraries/struct/src/types/buffer/variable-length.spec.ts +++ b/libraries/struct/src/types/buffer/variable-length.spec.ts @@ -1,8 +1,21 @@ -import { describe, expect, it, jest } from '@jest/globals'; - -import { StructDefaultOptions, StructFieldValue, StructValue } from "../../basic/index.js"; -import { BufferFieldSubType, EMPTY_UINT8_ARRAY, Uint8ArrayBufferFieldSubType } from "./base.js"; -import { VariableLengthBufferLikeFieldDefinition, VariableLengthBufferLikeFieldLengthValue, VariableLengthBufferLikeStructFieldValue } from "./variable-length.js"; +import { describe, expect, it, jest } from "@jest/globals"; + +import { + StructDefaultOptions, + StructFieldValue, + StructValue, +} from "../../basic/index.js"; + +import { + BufferFieldSubType, + EMPTY_UINT8_ARRAY, + Uint8ArrayBufferFieldSubType, +} from "./base.js"; +import { + VariableLengthBufferLikeFieldDefinition, + VariableLengthBufferLikeFieldLengthValue, + VariableLengthBufferLikeStructFieldValue, +} from "./variable-length.js"; class MockLengthFieldValue extends StructFieldValue { public constructor() { @@ -17,9 +30,14 @@ class MockLengthFieldValue extends StructFieldValue { public override getSize = jest.fn((): number => this.size); - public override set = jest.fn((value: string | number) => { }); + public override set = jest.fn((value: string | number) => { + void value; + }); - public serialize = jest.fn((dataView: DataView, offset: number): void => { }); + public serialize = jest.fn((dataView: DataView, offset: number): void => { + void dataView; + void offset; + }); } describe("Types", () => { @@ -34,6 +52,8 @@ describe("Types", () => { public override getSize = jest.fn(() => this.size); public serialize(dataView: DataView, offset: number): void { + void dataView; + void offset; throw new Error("Method not implemented."); } } @@ -41,11 +61,13 @@ describe("Types", () => { describe("#getSize", () => { it("should return size of its original field value", () => { const mockOriginalFieldValue = new MockLengthFieldValue(); - const mockArrayBufferFieldValue = new MockBufferLikeFieldValue(); - const lengthFieldValue = new VariableLengthBufferLikeFieldLengthValue( - mockOriginalFieldValue, - mockArrayBufferFieldValue, - ); + const mockArrayBufferFieldValue = + new MockBufferLikeFieldValue(); + const lengthFieldValue = + new VariableLengthBufferLikeFieldLengthValue( + mockOriginalFieldValue, + mockArrayBufferFieldValue + ); mockOriginalFieldValue.size = 0; expect(lengthFieldValue.getSize()).toBe(0); @@ -59,13 +81,15 @@ describe("Types", () => { }); describe("#get", () => { - it("should return size of its `arrayBufferField`", async () => { + it("should return size of its `arrayBufferField`", () => { const mockOriginalFieldValue = new MockLengthFieldValue(); - const mockArrayBufferFieldValue = new MockBufferLikeFieldValue(); - const lengthFieldValue = new VariableLengthBufferLikeFieldLengthValue( - mockOriginalFieldValue, - mockArrayBufferFieldValue, - ); + const mockArrayBufferFieldValue = + new MockBufferLikeFieldValue(); + const lengthFieldValue = + new VariableLengthBufferLikeFieldLengthValue( + mockOriginalFieldValue, + mockArrayBufferFieldValue + ); mockOriginalFieldValue.value = 0; mockArrayBufferFieldValue.size = 0; @@ -81,13 +105,15 @@ describe("Types", () => { expect(mockOriginalFieldValue.get).toBeCalledTimes(1); }); - it("should return size of its `arrayBufferField` as string", async () => { + it("should return size of its `arrayBufferField` as string", () => { const mockOriginalFieldValue = new MockLengthFieldValue(); - const mockArrayBufferFieldValue = new MockBufferLikeFieldValue(); - const lengthFieldValue = new VariableLengthBufferLikeFieldLengthValue( - mockOriginalFieldValue, - mockArrayBufferFieldValue, - ); + const mockArrayBufferFieldValue = + new MockBufferLikeFieldValue(); + const lengthFieldValue = + new VariableLengthBufferLikeFieldLengthValue( + mockOriginalFieldValue, + mockArrayBufferFieldValue + ); mockOriginalFieldValue.value = "0"; mockArrayBufferFieldValue.size = 0; @@ -105,13 +131,15 @@ describe("Types", () => { }); describe("#set", () => { - it("should does nothing", async () => { + it("should does nothing", () => { const mockOriginalFieldValue = new MockLengthFieldValue(); - const mockArrayBufferFieldValue = new MockBufferLikeFieldValue(); - const lengthFieldValue = new VariableLengthBufferLikeFieldLengthValue( - mockOriginalFieldValue, - mockArrayBufferFieldValue, - ); + const mockArrayBufferFieldValue = + new MockBufferLikeFieldValue(); + const lengthFieldValue = + new VariableLengthBufferLikeFieldLengthValue( + mockOriginalFieldValue, + mockArrayBufferFieldValue + ); mockOriginalFieldValue.value = 0; mockArrayBufferFieldValue.size = 0; @@ -123,16 +151,18 @@ describe("Types", () => { }); describe("#serialize", () => { - it("should call `serialize` of its `originalField`", async () => { + it("should call `serialize` of its `originalField`", () => { const mockOriginalFieldValue = new MockLengthFieldValue(); - const mockArrayBufferFieldValue = new MockBufferLikeFieldValue(); - const lengthFieldValue = new VariableLengthBufferLikeFieldLengthValue( - mockOriginalFieldValue, - mockArrayBufferFieldValue, - ); + const mockArrayBufferFieldValue = + new MockBufferLikeFieldValue(); + const lengthFieldValue = + new VariableLengthBufferLikeFieldLengthValue( + mockOriginalFieldValue, + mockArrayBufferFieldValue + ); - let dataView = 0 as any; - let offset = 1 as any; + const dataView = 0 as any; + const offset = 1 as any; mockOriginalFieldValue.value = 10; mockArrayBufferFieldValue.size = 0; @@ -142,7 +172,10 @@ describe("Types", () => { expect(mockOriginalFieldValue.set).toBeCalledTimes(1); expect(mockOriginalFieldValue.set).toBeCalledWith(0); expect(mockOriginalFieldValue.serialize).toBeCalledTimes(1); - expect(mockOriginalFieldValue.serialize).toBeCalledWith(dataView, offset); + expect(mockOriginalFieldValue.serialize).toBeCalledWith( + dataView, + offset + ); mockOriginalFieldValue.set.mockClear(); mockOriginalFieldValue.serialize.mockClear(); @@ -151,19 +184,24 @@ describe("Types", () => { expect(mockOriginalFieldValue.set).toBeCalledTimes(1); expect(mockOriginalFieldValue.set).toBeCalledWith(100); expect(mockOriginalFieldValue.serialize).toBeCalledTimes(1); - expect(mockOriginalFieldValue.serialize).toBeCalledWith(dataView, offset); + expect(mockOriginalFieldValue.serialize).toBeCalledWith( + dataView, + offset + ); }); - it("should stringify its length if `originalField` is a string", async () => { + it("should stringify its length if `originalField` is a string", () => { const mockOriginalFieldValue = new MockLengthFieldValue(); - const mockArrayBufferFieldValue = new MockBufferLikeFieldValue(); - const lengthFieldValue = new VariableLengthBufferLikeFieldLengthValue( - mockOriginalFieldValue, - mockArrayBufferFieldValue, - ); + const mockArrayBufferFieldValue = + new MockBufferLikeFieldValue(); + const lengthFieldValue = + new VariableLengthBufferLikeFieldLengthValue( + mockOriginalFieldValue, + mockArrayBufferFieldValue + ); - let dataView = 0 as any; - let offset = 1 as any; + const dataView = 0 as any; + const offset = 1 as any; mockOriginalFieldValue.value = "10"; mockArrayBufferFieldValue.size = 0; @@ -173,7 +211,10 @@ describe("Types", () => { expect(mockOriginalFieldValue.set).toBeCalledTimes(1); expect(mockOriginalFieldValue.set).toBeCalledWith("0"); expect(mockOriginalFieldValue.serialize).toBeCalledTimes(1); - expect(mockOriginalFieldValue.serialize).toBeCalledWith(dataView, offset); + expect(mockOriginalFieldValue.serialize).toBeCalledWith( + dataView, + offset + ); mockOriginalFieldValue.set.mockClear(); mockOriginalFieldValue.serialize.mockClear(); @@ -182,22 +223,28 @@ describe("Types", () => { expect(mockOriginalFieldValue.set).toBeCalledTimes(1); expect(mockOriginalFieldValue.set).toBeCalledWith("100"); expect(mockOriginalFieldValue.serialize).toBeCalledTimes(1); - expect(mockOriginalFieldValue.serialize).toBeCalledWith(dataView, offset); + expect(mockOriginalFieldValue.serialize).toBeCalledWith( + dataView, + offset + ); }); - it("should stringify its length in specified radix if `originalField` is a string", async () => { + it("should stringify its length in specified radix if `originalField` is a string", () => { const mockOriginalFieldValue = new MockLengthFieldValue(); - const mockArrayBufferFieldValue = new MockBufferLikeFieldValue(); - const lengthFieldValue = new VariableLengthBufferLikeFieldLengthValue( - mockOriginalFieldValue, - mockArrayBufferFieldValue, - ); + const mockArrayBufferFieldValue = + new MockBufferLikeFieldValue(); + const lengthFieldValue = + new VariableLengthBufferLikeFieldLengthValue( + mockOriginalFieldValue, + mockArrayBufferFieldValue + ); const radix = 16; - mockArrayBufferFieldValue.definition.options.lengthFieldRadix = radix; + mockArrayBufferFieldValue.definition.options.lengthFieldRadix = + radix; - let dataView = 0 as any; - let offset = 1 as any; + const dataView = 0 as any; + const offset = 1 as any; mockOriginalFieldValue.value = "10"; mockArrayBufferFieldValue.size = 0; @@ -207,16 +254,24 @@ describe("Types", () => { expect(mockOriginalFieldValue.set).toBeCalledTimes(1); expect(mockOriginalFieldValue.set).toBeCalledWith("0"); expect(mockOriginalFieldValue.serialize).toBeCalledTimes(1); - expect(mockOriginalFieldValue.serialize).toBeCalledWith(dataView, offset); + expect(mockOriginalFieldValue.serialize).toBeCalledWith( + dataView, + offset + ); mockOriginalFieldValue.set.mockClear(); mockOriginalFieldValue.serialize.mockClear(); mockArrayBufferFieldValue.size = 100; lengthFieldValue.serialize(dataView, offset); expect(mockOriginalFieldValue.set).toBeCalledTimes(1); - expect(mockOriginalFieldValue.set).toBeCalledWith((100).toString(radix)); + expect(mockOriginalFieldValue.set).toBeCalledWith( + (100).toString(radix) + ); expect(mockOriginalFieldValue.serialize).toBeCalledTimes(1); - expect(mockOriginalFieldValue.serialize).toBeCalledWith(dataView, offset); + expect(mockOriginalFieldValue.serialize).toBeCalledWith( + dataView, + offset + ); }); }); }); @@ -230,22 +285,30 @@ describe("Types", () => { const originalLengthFieldValue = new MockLengthFieldValue(); struct.set(lengthField, originalLengthFieldValue); - const arrayBufferFieldDefinition = new VariableLengthBufferLikeFieldDefinition( - Uint8ArrayBufferFieldSubType.Instance, - { lengthField }, - ); + const arrayBufferFieldDefinition = + new VariableLengthBufferLikeFieldDefinition( + Uint8ArrayBufferFieldSubType.Instance, + { lengthField } + ); const value = EMPTY_UINT8_ARRAY; - const bufferFieldValue = new VariableLengthBufferLikeStructFieldValue( - arrayBufferFieldDefinition, - StructDefaultOptions, - struct, - value, + const bufferFieldValue = + new VariableLengthBufferLikeStructFieldValue( + arrayBufferFieldDefinition, + StructDefaultOptions, + struct, + value + ); + + expect(bufferFieldValue).toHaveProperty( + "definition", + arrayBufferFieldDefinition + ); + expect(bufferFieldValue).toHaveProperty( + "options", + StructDefaultOptions ); - - expect(bufferFieldValue).toHaveProperty("definition", arrayBufferFieldDefinition); - expect(bufferFieldValue).toHaveProperty("options", StructDefaultOptions); expect(bufferFieldValue).toHaveProperty("struct", struct); expect(bufferFieldValue).toHaveProperty("value", value); expect(bufferFieldValue).toHaveProperty("array", undefined); @@ -259,23 +322,31 @@ describe("Types", () => { const originalLengthFieldValue = new MockLengthFieldValue(); struct.set(lengthField, originalLengthFieldValue); - const arrayBufferFieldDefinition = new VariableLengthBufferLikeFieldDefinition( - Uint8ArrayBufferFieldSubType.Instance, - { lengthField }, - ); + const arrayBufferFieldDefinition = + new VariableLengthBufferLikeFieldDefinition( + Uint8ArrayBufferFieldSubType.Instance, + { lengthField } + ); const value = new Uint8Array(100); - const bufferFieldValue = new VariableLengthBufferLikeStructFieldValue( - arrayBufferFieldDefinition, - StructDefaultOptions, - struct, - value, - value, + const bufferFieldValue = + new VariableLengthBufferLikeStructFieldValue( + arrayBufferFieldDefinition, + StructDefaultOptions, + struct, + value, + value + ); + + expect(bufferFieldValue).toHaveProperty( + "definition", + arrayBufferFieldDefinition + ); + expect(bufferFieldValue).toHaveProperty( + "options", + StructDefaultOptions ); - - expect(bufferFieldValue).toHaveProperty("definition", arrayBufferFieldDefinition); - expect(bufferFieldValue).toHaveProperty("options", StructDefaultOptions); expect(bufferFieldValue).toHaveProperty("struct", struct); expect(bufferFieldValue).toHaveProperty("value", value); expect(bufferFieldValue).toHaveProperty("array", value); @@ -289,43 +360,56 @@ describe("Types", () => { const originalLengthFieldValue = new MockLengthFieldValue(); struct.set(lengthField, originalLengthFieldValue); - const arrayBufferFieldDefinition = new VariableLengthBufferLikeFieldDefinition( - Uint8ArrayBufferFieldSubType.Instance, - { lengthField }, - ); + const arrayBufferFieldDefinition = + new VariableLengthBufferLikeFieldDefinition( + Uint8ArrayBufferFieldSubType.Instance, + { lengthField } + ); const value = EMPTY_UINT8_ARRAY; - const bufferFieldValue = new VariableLengthBufferLikeStructFieldValue( - arrayBufferFieldDefinition, - StructDefaultOptions, - struct, - value, - ); + const bufferFieldValue = + new VariableLengthBufferLikeStructFieldValue( + arrayBufferFieldDefinition, + StructDefaultOptions, + struct, + value + ); - expect(bufferFieldValue["lengthFieldValue"]).toBeInstanceOf(StructFieldValue); - expect(struct.fieldValues[lengthField]).toBe(bufferFieldValue["lengthFieldValue"]); + expect(bufferFieldValue["lengthFieldValue"]).toBeInstanceOf( + StructFieldValue + ); + expect(struct.fieldValues[lengthField]).toBe( + bufferFieldValue["lengthFieldValue"] + ); }); }); describe("#getSize", () => { class MockArrayBufferFieldType extends BufferFieldSubType { - public override toBuffer = jest.fn((value: Uint8Array): Uint8Array => { - return value; - }); + public override toBuffer = jest.fn( + (value: Uint8Array): Uint8Array => { + return value; + } + ); - public override toValue = jest.fn((arrayBuffer: Uint8Array): Uint8Array => { - return arrayBuffer; - }); + public override toValue = jest.fn( + (arrayBuffer: Uint8Array): Uint8Array => { + return arrayBuffer; + } + ); public size = 0; - public override getSize = jest.fn((value: Uint8Array): number => { - return this.size; - }); + public override getSize = jest.fn( + (value: Uint8Array): number => { + void value; + return this.size; + } + ); } - it("should return cached size if exist", async () => { + it("should return cached size if exist", () => { const struct = new StructValue({}); const lengthField = "foo"; @@ -333,20 +417,22 @@ describe("Types", () => { struct.set(lengthField, originalLengthFieldValue); const arrayBufferFieldType = new MockArrayBufferFieldType(); - const arrayBufferFieldDefinition = new VariableLengthBufferLikeFieldDefinition( - arrayBufferFieldType, - { lengthField }, - ); + const arrayBufferFieldDefinition = + new VariableLengthBufferLikeFieldDefinition( + arrayBufferFieldType, + { lengthField } + ); const value = new Uint8Array(100); - const bufferFieldValue = new VariableLengthBufferLikeStructFieldValue( - arrayBufferFieldDefinition, - StructDefaultOptions, - struct, - value, - value, - ); + const bufferFieldValue = + new VariableLengthBufferLikeStructFieldValue( + arrayBufferFieldDefinition, + StructDefaultOptions, + struct, + value, + value + ); expect(bufferFieldValue.getSize()).toBe(100); expect(arrayBufferFieldType.toValue).toBeCalledTimes(0); @@ -362,19 +448,21 @@ describe("Types", () => { struct.set(lengthField, originalLengthFieldValue); const arrayBufferFieldType = new MockArrayBufferFieldType(); - const arrayBufferFieldDefinition = new VariableLengthBufferLikeFieldDefinition( - arrayBufferFieldType, - { lengthField }, - ); + const arrayBufferFieldDefinition = + new VariableLengthBufferLikeFieldDefinition( + arrayBufferFieldType, + { lengthField } + ); const value = new Uint8Array(100); - const bufferFieldValue = new VariableLengthBufferLikeStructFieldValue( - arrayBufferFieldDefinition, - StructDefaultOptions, - struct, - value, - ); + const bufferFieldValue = + new VariableLengthBufferLikeStructFieldValue( + arrayBufferFieldDefinition, + StructDefaultOptions, + struct, + value + ); arrayBufferFieldType.size = 100; expect(bufferFieldValue.getSize()).toBe(100); @@ -393,19 +481,21 @@ describe("Types", () => { struct.set(lengthField, originalLengthFieldValue); const arrayBufferFieldType = new MockArrayBufferFieldType(); - const arrayBufferFieldDefinition = new VariableLengthBufferLikeFieldDefinition( - arrayBufferFieldType, - { lengthField }, - ); + const arrayBufferFieldDefinition = + new VariableLengthBufferLikeFieldDefinition( + arrayBufferFieldType, + { lengthField } + ); const value = new Uint8Array(100); - const bufferFieldValue = new VariableLengthBufferLikeStructFieldValue( - arrayBufferFieldDefinition, - StructDefaultOptions, - struct, - value, - ); + const bufferFieldValue = + new VariableLengthBufferLikeStructFieldValue( + arrayBufferFieldDefinition, + StructDefaultOptions, + struct, + value + ); arrayBufferFieldType.size = -1; expect(bufferFieldValue.getSize()).toBe(100); @@ -425,20 +515,22 @@ describe("Types", () => { const originalLengthFieldValue = new MockLengthFieldValue(); struct.set(lengthField, originalLengthFieldValue); - const arrayBufferFieldDefinition = new VariableLengthBufferLikeFieldDefinition( - Uint8ArrayBufferFieldSubType.Instance, - { lengthField }, - ); + const arrayBufferFieldDefinition = + new VariableLengthBufferLikeFieldDefinition( + Uint8ArrayBufferFieldSubType.Instance, + { lengthField } + ); const value = new Uint8Array(100); - const bufferFieldValue = new VariableLengthBufferLikeStructFieldValue( - arrayBufferFieldDefinition, - StructDefaultOptions, - struct, - value, - value, - ); + const bufferFieldValue = + new VariableLengthBufferLikeStructFieldValue( + arrayBufferFieldDefinition, + StructDefaultOptions, + struct, + value, + value + ); const newValue = new ArrayBuffer(100); bufferFieldValue.set(newValue); @@ -453,20 +545,22 @@ describe("Types", () => { const originalLengthFieldValue = new MockLengthFieldValue(); struct.set(lengthField, originalLengthFieldValue); - const arrayBufferFieldDefinition = new VariableLengthBufferLikeFieldDefinition( - Uint8ArrayBufferFieldSubType.Instance, - { lengthField }, - ); + const arrayBufferFieldDefinition = + new VariableLengthBufferLikeFieldDefinition( + Uint8ArrayBufferFieldSubType.Instance, + { lengthField } + ); const value = new Uint8Array(100); - const bufferFieldValue = new VariableLengthBufferLikeStructFieldValue( - arrayBufferFieldDefinition, - StructDefaultOptions, - struct, - value, - value, - ); + const bufferFieldValue = + new VariableLengthBufferLikeStructFieldValue( + arrayBufferFieldDefinition, + StructDefaultOptions, + struct, + value, + value + ); const newValue = new ArrayBuffer(100); bufferFieldValue.set(newValue); @@ -480,14 +574,14 @@ describe("Types", () => { it("should always return `0`", () => { const definition = new VariableLengthBufferLikeFieldDefinition( Uint8ArrayBufferFieldSubType.Instance, - { lengthField: "foo" }, + { lengthField: "foo" } ); expect(definition.getSize()).toBe(0); }); }); describe("#getDeserializeSize", () => { - it("should return value of its `lengthField`", async () => { + it("should return value of its `lengthField`", () => { const struct = new StructValue({}); const lengthField = "foo"; @@ -496,7 +590,7 @@ describe("Types", () => { const definition = new VariableLengthBufferLikeFieldDefinition( Uint8ArrayBufferFieldSubType.Instance, - { lengthField }, + { lengthField } ); originalLengthFieldValue.value = 0; @@ -509,7 +603,7 @@ describe("Types", () => { expect(originalLengthFieldValue.get).toBeCalledTimes(1); }); - it("should return value of its `lengthField` as number", async () => { + it("should return value of its `lengthField` as number", () => { const struct = new StructValue({}); const lengthField = "foo"; @@ -518,7 +612,7 @@ describe("Types", () => { const definition = new VariableLengthBufferLikeFieldDefinition( Uint8ArrayBufferFieldSubType.Instance, - { lengthField }, + { lengthField } ); originalLengthFieldValue.value = "0"; @@ -531,7 +625,7 @@ describe("Types", () => { expect(originalLengthFieldValue.get).toBeCalledTimes(1); }); - it("should return value of its `lengthField` as number with specified radix", async () => { + it("should return value of its `lengthField` as number with specified radix", () => { const struct = new StructValue({}); const lengthField = "foo"; @@ -541,7 +635,7 @@ describe("Types", () => { const radix = 8; const definition = new VariableLengthBufferLikeFieldDefinition( Uint8ArrayBufferFieldSubType.Instance, - { lengthField, lengthFieldRadix: radix }, + { lengthField, lengthFieldRadix: radix } ); originalLengthFieldValue.value = "0"; @@ -550,7 +644,9 @@ describe("Types", () => { originalLengthFieldValue.get.mockClear(); originalLengthFieldValue.value = "100"; - expect(definition["getDeserializeSize"](struct)).toBe(Number.parseInt("100", radix)); + expect(definition["getDeserializeSize"](struct)).toBe( + Number.parseInt("100", radix) + ); expect(originalLengthFieldValue.get).toBeCalledTimes(1); }); }); @@ -565,18 +661,24 @@ describe("Types", () => { const definition = new VariableLengthBufferLikeFieldDefinition( Uint8ArrayBufferFieldSubType.Instance, - { lengthField }, + { lengthField } ); const value = new Uint8Array(100); const bufferFieldValue = definition.create( StructDefaultOptions, struct, - value, + value ); - expect(bufferFieldValue).toHaveProperty("definition", definition); - expect(bufferFieldValue).toHaveProperty("options", StructDefaultOptions); + expect(bufferFieldValue).toHaveProperty( + "definition", + definition + ); + expect(bufferFieldValue).toHaveProperty( + "options", + StructDefaultOptions + ); expect(bufferFieldValue).toHaveProperty("struct", struct); expect(bufferFieldValue).toHaveProperty("value", value); expect(bufferFieldValue).toHaveProperty("array", undefined); @@ -592,7 +694,7 @@ describe("Types", () => { const definition = new VariableLengthBufferLikeFieldDefinition( Uint8ArrayBufferFieldSubType.Instance, - { lengthField }, + { lengthField } ); const value = new Uint8Array(100); @@ -600,11 +702,17 @@ describe("Types", () => { StructDefaultOptions, struct, value, - value, + value ); - expect(bufferFieldValue).toHaveProperty("definition", definition); - expect(bufferFieldValue).toHaveProperty("options", StructDefaultOptions); + expect(bufferFieldValue).toHaveProperty( + "definition", + definition + ); + expect(bufferFieldValue).toHaveProperty( + "options", + StructDefaultOptions + ); expect(bufferFieldValue).toHaveProperty("struct", struct); expect(bufferFieldValue).toHaveProperty("value", value); expect(bufferFieldValue).toHaveProperty("array", value); diff --git a/libraries/struct/src/types/buffer/variable-length.ts b/libraries/struct/src/types/buffer/variable-length.ts index d9f168f2..49f27b46 100644 --- a/libraries/struct/src/types/buffer/variable-length.ts +++ b/libraries/struct/src/types/buffer/variable-length.ts @@ -1,13 +1,23 @@ -import { StructFieldValue, type StructFieldDefinition, type StructOptions, type StructValue } from '../../basic/index.js'; -import type { KeysOfType } from '../../utils.js'; -import { BufferLikeFieldDefinition, BufferLikeFieldValue, type BufferFieldSubType } from './base.js'; +import { + StructFieldValue, + type StructFieldDefinition, + type StructOptions, + type StructValue, +} from "../../basic/index.js"; +import { type KeysOfType } from "../../utils.js"; + +import { + BufferLikeFieldDefinition, + BufferLikeFieldValue, + type BufferFieldSubType, +} from "./base.js"; export type LengthField = KeysOfType; export interface VariableLengthBufferLikeFieldOptions< TFields = object, - TLengthField extends LengthField = any, - > { + TLengthField extends LengthField = any +> { /** * The name of the field that contains the length of the buffer. * @@ -27,20 +37,20 @@ export interface VariableLengthBufferLikeFieldOptions< export class VariableLengthBufferLikeFieldDefinition< TType extends BufferFieldSubType = BufferFieldSubType, TOptions extends VariableLengthBufferLikeFieldOptions = VariableLengthBufferLikeFieldOptions, - TTypeScriptType = TType["TTypeScriptType"], - > extends BufferLikeFieldDefinition< + TTypeScriptType = TType["TTypeScriptType"] +> extends BufferLikeFieldDefinition< TType, TOptions, - TOptions['lengthField'], + TOptions["lengthField"], TTypeScriptType - > { +> { public getSize(): number { return 0; } protected override getDeserializeSize(struct: StructValue) { let value = struct.value[this.options.lengthField] as number | string; - if (typeof value === 'string') { + if (typeof value === "string") { value = Number.parseInt(value, this.options.lengthFieldRadix ?? 10); } return value; @@ -57,14 +67,14 @@ export class VariableLengthBufferLikeFieldDefinition< options, struct, value, - array, + array ); } } export class VariableLengthBufferLikeStructFieldValue< - TDefinition extends VariableLengthBufferLikeFieldDefinition = VariableLengthBufferLikeFieldDefinition, - > extends BufferLikeFieldValue { + TDefinition extends VariableLengthBufferLikeFieldDefinition = VariableLengthBufferLikeFieldDefinition +> extends BufferLikeFieldValue { protected length: number | undefined; protected lengthFieldValue: VariableLengthBufferLikeFieldLengthValue; @@ -73,8 +83,8 @@ export class VariableLengthBufferLikeStructFieldValue< definition: TDefinition, options: Readonly, struct: StructValue, - value: TDefinition['TValue'], - array?: Uint8Array, + value: TDefinition["TValue"], + array?: Uint8Array ) { super(definition, options, struct, value, array); @@ -88,7 +98,7 @@ export class VariableLengthBufferLikeStructFieldValue< const originalValue = struct.get(lengthField); this.lengthFieldValue = new VariableLengthBufferLikeFieldLengthValue( originalValue, - this, + this ); struct.set(lengthField, this.lengthFieldValue); } @@ -113,20 +123,25 @@ export class VariableLengthBufferLikeStructFieldValue< } // Not using `VariableLengthBufferLikeStructFieldValue` directly makes writing tests much easier... -type VariableLengthBufferLikeFieldValueLike = - StructFieldValue>; +type VariableLengthBufferLikeFieldValueLike = StructFieldValue< + StructFieldDefinition +>; -export class VariableLengthBufferLikeFieldLengthValue - extends StructFieldValue { +export class VariableLengthBufferLikeFieldLengthValue extends StructFieldValue { protected originalField: StructFieldValue; protected bufferField: VariableLengthBufferLikeFieldValueLike; public constructor( originalField: StructFieldValue, - arrayBufferField: VariableLengthBufferLikeFieldValueLike, + arrayBufferField: VariableLengthBufferLikeFieldValueLike ) { - super(originalField.definition, originalField.options, originalField.struct, 0); + super( + originalField.definition, + originalField.options, + originalField.struct, + 0 + ); this.originalField = originalField; this.bufferField = arrayBufferField; } @@ -139,8 +154,10 @@ export class VariableLengthBufferLikeFieldLengthValue let value: string | number = this.bufferField.getSize(); const originalValue = this.originalField.get(); - if (typeof originalValue === 'string') { - value = value.toString(this.bufferField.definition.options.lengthFieldRadix ?? 10); + if (typeof originalValue === "string") { + value = value.toString( + this.bufferField.definition.options.lengthFieldRadix ?? 10 + ); } return value; diff --git a/libraries/struct/src/types/number.spec.ts b/libraries/struct/src/types/number.spec.ts index 11d19003..e65ef764 100644 --- a/libraries/struct/src/types/number.spec.ts +++ b/libraries/struct/src/types/number.spec.ts @@ -1,32 +1,60 @@ -import { describe, expect, it, jest, test } from '@jest/globals'; +import { describe, expect, it, jest, test } from "@jest/globals"; + +import { + StructDefaultOptions, + StructValue, + type StructDeserializeStream, +} from "../basic/index.js"; -import { StructDefaultOptions, StructDeserializeStream, StructValue } from "../basic/index.js"; import { NumberFieldDefinition, NumberFieldType } from "./number.js"; -function testEndian(type: NumberFieldType, min: number, max: number, littleEndian: boolean) { - test('min', () => { +function testEndian( + type: NumberFieldType, + min: number, + max: number, + littleEndian: boolean +) { + test("min", () => { const buffer = new ArrayBuffer(type.size); const view = new DataView(buffer); - (view[`set${type.signed ? 'I' : 'Ui'}nt${type.size * 8}` as keyof DataView] as any)(0, min, littleEndian); + ( + view[ + `set${type.signed ? "I" : "Ui"}nt${ + type.size * 8 + }` as keyof DataView + ] as any + )(0, min, littleEndian); let output = type.deserializer(new Uint8Array(buffer), littleEndian); output = type.convertSign(output); expect(output).toBe(min); }); - test('1', () => { + test("1", () => { const buffer = new ArrayBuffer(type.size); const view = new DataView(buffer); const input = 1; - (view[`set${type.signed ? 'I' : 'Ui'}nt${type.size * 8}` as keyof DataView] as any)(0, input, littleEndian); + ( + view[ + `set${type.signed ? "I" : "Ui"}nt${ + type.size * 8 + }` as keyof DataView + ] as any + )(0, input, littleEndian); let output = type.deserializer(new Uint8Array(buffer), littleEndian); output = type.convertSign(output); expect(output).toBe(input); }); - test('max', () => { + test("max", () => { const buffer = new ArrayBuffer(type.size); const view = new DataView(buffer); - (view[`set${type.signed ? 'I' : 'Ui'}nt${type.size * 8}` as keyof DataView] as any)(0, max, littleEndian); + ( + view[ + `set${type.signed ? "I" : "Ui"}nt${ + type.size * 8 + }` as keyof DataView + ] as any + )(0, max, littleEndian); let output = type.deserializer(new Uint8Array(buffer), littleEndian); output = type.convertSign(output); expect(output).toBe(max); @@ -36,25 +64,40 @@ function testEndian(type: NumberFieldType, min: number, max: number, littleEndia function testDeserialize(type: NumberFieldType) { if (type.size === 1) { if (type.signed) { - testEndian(type, 2 ** (type.size * 8) / -2, 2 ** (type.size * 8) / 2 - 1, false); + testEndian( + type, + 2 ** (type.size * 8) / -2, + 2 ** (type.size * 8) / 2 - 1, + false + ); } else { testEndian(type, 0, 2 ** (type.size * 8) - 1, false); } } else { if (type.signed) { - describe('big endian', () => { - testEndian(type, 2 ** (type.size * 8) / -2, 2 ** (type.size * 8) / 2 - 1, false); + describe("big endian", () => { + testEndian( + type, + 2 ** (type.size * 8) / -2, + 2 ** (type.size * 8) / 2 - 1, + false + ); }); - describe('little endian', () => { - testEndian(type, 2 ** (type.size * 8) / -2, 2 ** (type.size * 8) / 2 - 1, true); + describe("little endian", () => { + testEndian( + type, + 2 ** (type.size * 8) / -2, + 2 ** (type.size * 8) / 2 - 1, + true + ); }); } else { - describe('big endian', () => { + describe("big endian", () => { testEndian(type, 0, 2 ** (type.size * 8) - 1, false); }); - describe('little endian', () => { + describe("little endian", () => { testEndian(type, 0, 2 ** (type.size * 8) - 1, true); }); } @@ -64,99 +107,140 @@ function testDeserialize(type: NumberFieldType) { describe("Types", () => { describe("Number", () => { describe("NumberFieldType", () => { - describe('Int8', () => { + describe("Int8", () => { const key = "Int8"; - test('basic', () => { + test("basic", () => { expect(NumberFieldType[key]).toHaveProperty("size", 1); - expect(NumberFieldType[key]).toHaveProperty("dataViewSetter", "set" + key); + expect(NumberFieldType[key]).toHaveProperty( + "dataViewSetter", + "set" + key + ); }); testDeserialize(NumberFieldType[key]); }); - describe('Uint8', () => { + describe("Uint8", () => { const key = "Uint8"; - test('basic', () => { + test("basic", () => { expect(NumberFieldType[key]).toHaveProperty("size", 1); - expect(NumberFieldType[key]).toHaveProperty("dataViewSetter", "set" + key); + expect(NumberFieldType[key]).toHaveProperty( + "dataViewSetter", + "set" + key + ); }); testDeserialize(NumberFieldType[key]); }); - describe('Int16', () => { + describe("Int16", () => { const key = "Int16"; - test('basic', () => { + test("basic", () => { expect(NumberFieldType[key]).toHaveProperty("size", 2); - expect(NumberFieldType[key]).toHaveProperty("dataViewSetter", "set" + key); + expect(NumberFieldType[key]).toHaveProperty( + "dataViewSetter", + "set" + key + ); }); testDeserialize(NumberFieldType[key]); }); - describe('Uint16', () => { + describe("Uint16", () => { const key = "Uint16"; - test('basic', () => { + test("basic", () => { expect(NumberFieldType[key]).toHaveProperty("size", 2); - expect(NumberFieldType[key]).toHaveProperty("dataViewSetter", "set" + key); + expect(NumberFieldType[key]).toHaveProperty( + "dataViewSetter", + "set" + key + ); }); testDeserialize(NumberFieldType[key]); }); - - describe('Int32', () => { + describe("Int32", () => { const key = "Int32"; - test('basic', () => { + test("basic", () => { expect(NumberFieldType[key]).toHaveProperty("size", 4); - expect(NumberFieldType[key]).toHaveProperty("dataViewSetter", "set" + key); + expect(NumberFieldType[key]).toHaveProperty( + "dataViewSetter", + "set" + key + ); }); testDeserialize(NumberFieldType[key]); }); - describe('Uint32', () => { + describe("Uint32", () => { const key = "Uint32"; - test('basic', () => { + test("basic", () => { expect(NumberFieldType[key]).toHaveProperty("size", 4); - expect(NumberFieldType[key]).toHaveProperty("dataViewSetter", "set" + key); + expect(NumberFieldType[key]).toHaveProperty( + "dataViewSetter", + "set" + key + ); }); testDeserialize(NumberFieldType[key]); }); - - }); describe("NumberFieldDefinition", () => { describe("#getSize", () => { it("should return size of its type", () => { - expect(new NumberFieldDefinition(NumberFieldType.Int8).getSize()).toBe(1); - expect(new NumberFieldDefinition(NumberFieldType.Uint8).getSize()).toBe(1); - expect(new NumberFieldDefinition(NumberFieldType.Int16).getSize()).toBe(2); - expect(new NumberFieldDefinition(NumberFieldType.Uint16).getSize()).toBe(2); - expect(new NumberFieldDefinition(NumberFieldType.Int32).getSize()).toBe(4); - expect(new NumberFieldDefinition(NumberFieldType.Uint32).getSize()).toBe(4); + expect( + new NumberFieldDefinition( + NumberFieldType.Int8 + ).getSize() + ).toBe(1); + expect( + new NumberFieldDefinition( + NumberFieldType.Uint8 + ).getSize() + ).toBe(1); + expect( + new NumberFieldDefinition( + NumberFieldType.Int16 + ).getSize() + ).toBe(2); + expect( + new NumberFieldDefinition( + NumberFieldType.Uint16 + ).getSize() + ).toBe(2); + expect( + new NumberFieldDefinition( + NumberFieldType.Int32 + ).getSize() + ).toBe(4); + expect( + new NumberFieldDefinition( + NumberFieldType.Uint32 + ).getSize() + ).toBe(4); }); }); describe("#deserialize", () => { it("should deserialize Uint8", () => { - const read = jest.fn((length: number) => new Uint8Array([1, 2, 3, 4])); + const read = jest.fn(() => new Uint8Array([1, 2, 3, 4])); const stream: StructDeserializeStream = { read }; - const definition = new NumberFieldDefinition(NumberFieldType.Uint8); + const definition = new NumberFieldDefinition( + NumberFieldType.Uint8 + ); const struct = new StructValue({}); const value = definition.deserialize( StructDefaultOptions, stream, - struct, + struct ); expect(value.get()).toBe(1); @@ -165,15 +249,17 @@ describe("Types", () => { }); it("should deserialize Uint16", () => { - const read = jest.fn((length: number) => new Uint8Array([1, 2, 3, 4])); + const read = jest.fn(() => new Uint8Array([1, 2, 3, 4])); const stream: StructDeserializeStream = { read }; - const definition = new NumberFieldDefinition(NumberFieldType.Uint16); + const definition = new NumberFieldDefinition( + NumberFieldType.Uint16 + ); const struct = new StructValue({}); const value = definition.deserialize( StructDefaultOptions, stream, - struct, + struct ); expect(value.get()).toBe((1 << 8) | 2); @@ -182,15 +268,17 @@ describe("Types", () => { }); it("should deserialize Uint16LE", () => { - const read = jest.fn((length: number) => new Uint8Array([1, 2, 3, 4])); + const read = jest.fn(() => new Uint8Array([1, 2, 3, 4])); const stream: StructDeserializeStream = { read }; - const definition = new NumberFieldDefinition(NumberFieldType.Uint16); + const definition = new NumberFieldDefinition( + NumberFieldType.Uint16 + ); const struct = new StructValue({}); const value = definition.deserialize( { ...StructDefaultOptions, littleEndian: true }, stream, - struct, + struct ); expect(value.get()).toBe((2 << 8) | 1); @@ -207,61 +295,37 @@ describe("Types", () => { expect( new NumberFieldDefinition(NumberFieldType.Int8) - .create( - StructDefaultOptions, - struct, - 42, - ) + .create(StructDefaultOptions, struct, 42) .getSize() ).toBe(1); expect( new NumberFieldDefinition(NumberFieldType.Uint8) - .create( - StructDefaultOptions, - struct, - 42, - ) + .create(StructDefaultOptions, struct, 42) .getSize() ).toBe(1); expect( new NumberFieldDefinition(NumberFieldType.Int16) - .create( - StructDefaultOptions, - struct, - 42, - ) + .create(StructDefaultOptions, struct, 42) .getSize() ).toBe(2); expect( new NumberFieldDefinition(NumberFieldType.Uint16) - .create( - StructDefaultOptions, - struct, - 42, - ) + .create(StructDefaultOptions, struct, 42) .getSize() ).toBe(2); expect( new NumberFieldDefinition(NumberFieldType.Int32) - .create( - StructDefaultOptions, - struct, - 42, - ) + .create(StructDefaultOptions, struct, 42) .getSize() ).toBe(4); expect( new NumberFieldDefinition(NumberFieldType.Uint32) - .create( - StructDefaultOptions, - struct, - 42, - ) + .create(StructDefaultOptions, struct, 42) .getSize() ).toBe(4); }); @@ -269,19 +333,23 @@ describe("Types", () => { describe("#serialize", () => { it("should serialize uint8", () => { - const definition = new NumberFieldDefinition(NumberFieldType.Int8); + const definition = new NumberFieldDefinition( + NumberFieldType.Int8 + ); const struct = new StructValue({}); const value = definition.create( StructDefaultOptions, struct, - 42, + 42 ); const array = new Uint8Array(10); const dataView = new DataView(array.buffer); value.serialize(dataView, 2); - expect(Array.from(array)).toEqual([0, 0, 42, 0, 0, 0, 0, 0, 0, 0]); + expect(Array.from(array)).toEqual([ + 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, + ]); }); }); }); diff --git a/libraries/struct/src/types/number.ts b/libraries/struct/src/types/number.ts index e8505264..e3bd05bb 100644 --- a/libraries/struct/src/types/number.ts +++ b/libraries/struct/src/types/number.ts @@ -1,22 +1,40 @@ -import { StructFieldDefinition, StructFieldValue, StructValue, type StructAsyncDeserializeStream, type StructDeserializeStream, type StructOptions } from '../basic/index.js'; +import { + StructFieldDefinition, + StructFieldValue, + type StructAsyncDeserializeStream, + type StructDeserializeStream, + type StructOptions, + type StructValue, +} from "../basic/index.js"; import { SyncPromise } from "../sync-promise.js"; -import type { ValueOrPromise } from "../utils.js"; +import { type ValueOrPromise } from "../utils.js"; -type NumberTypeDeserializer = (array: Uint8Array, littleEndian: boolean) => number; +type NumberTypeDeserializer = ( + array: Uint8Array, + littleEndian: boolean +) => number; const DESERIALIZERS: Record = { - 1: (array, littleEndian) => - array[0]!, + 1: (array) => array[0]!, 2: (array, littleEndian) => - ((array[1]! << 8) | array[0]!) * (littleEndian as any) | - ((array[0]! << 8) | array[1]!) * (!littleEndian as any), + (((array[1]! << 8) | array[0]!) * (littleEndian as any)) | + (((array[0]! << 8) | array[1]!) * (!littleEndian as any)), 4: (array, littleEndian) => - ((array[3]! << 24) | (array[2]! << 16) | (array[1]! << 8) | array[0]!) * (littleEndian as any) | - ((array[0]! << 24) | (array[1]! << 16) | (array[2]! << 8) | array[3]!) * (!littleEndian as any), + (((array[3]! << 24) | + (array[2]! << 16) | + (array[1]! << 8) | + array[0]!) * + (littleEndian as any)) | + (((array[0]! << 24) | + (array[1]! << 16) | + (array[2]! << 8) | + array[3]!) * + (!littleEndian as any)), }; -export type DataViewSetters = - { [TKey in keyof DataView]: TKey extends `set${string}` ? TKey : never }[keyof DataView]; +export type DataViewSetters = { + [TKey in keyof DataView]: TKey extends `set${string}` ? TKey : never; +}[keyof DataView]; export class NumberFieldType { public readonly TTypeScriptType!: number; @@ -43,29 +61,57 @@ export class NumberFieldType { this.dataViewSetter = dataViewSetter; } - public static readonly Int8 = new NumberFieldType(1, true, value => value << 24 >> 24, 'setInt8'); - - public static readonly Uint8 = new NumberFieldType(1, false, value => value, 'setUint8'); - - public static readonly Int16 = new NumberFieldType(2, true, value => value << 16 >> 16, 'setInt16'); - - public static readonly Uint16 = new NumberFieldType(2, false, value => value, 'setUint16'); - - public static readonly Int32 = new NumberFieldType(4, true, value => value, 'setInt32'); - - public static readonly Uint32 = new NumberFieldType(4, false, value => value >>> 0, 'setUint32'); + public static readonly Int8 = new NumberFieldType( + 1, + true, + (value) => (value << 24) >> 24, + "setInt8" + ); + + public static readonly Uint8 = new NumberFieldType( + 1, + false, + (value) => value, + "setUint8" + ); + + public static readonly Int16 = new NumberFieldType( + 2, + true, + (value) => (value << 16) >> 16, + "setInt16" + ); + + public static readonly Uint16 = new NumberFieldType( + 2, + false, + (value) => value, + "setUint16" + ); + + public static readonly Int32 = new NumberFieldType( + 4, + true, + (value) => value, + "setInt32" + ); + + public static readonly Uint32 = new NumberFieldType( + 4, + false, + (value) => value >>> 0, + "setUint32" + ); } export class NumberFieldDefinition< TType extends NumberFieldType = NumberFieldType, - TTypeScriptType = TType["TTypeScriptType"], - > extends StructFieldDefinition< - void, - TTypeScriptType - > { + TTypeScriptType = TType["TTypeScriptType"] +> extends StructFieldDefinition { public readonly type: TType; - public constructor(type: TType, _typescriptType?: TTypeScriptType) { + public constructor(type: TType, typescriptType?: TTypeScriptType) { + void typescriptType; super(); this.type = type; } @@ -77,7 +123,7 @@ export class NumberFieldDefinition< public create( options: Readonly, struct: StructValue, - value: TTypeScriptType, + value: TTypeScriptType ): NumberFieldValue { return new NumberFieldValue(this, options, struct, value); } @@ -85,23 +131,22 @@ export class NumberFieldDefinition< public override deserialize( options: Readonly, stream: StructDeserializeStream, - struct: StructValue, + struct: StructValue ): NumberFieldValue; public override deserialize( options: Readonly, stream: StructAsyncDeserializeStream, - struct: StructValue, + struct: StructValue ): Promise>; public override deserialize( options: Readonly, stream: StructDeserializeStream | StructAsyncDeserializeStream, - struct: StructValue, + struct: StructValue ): ValueOrPromise> { - return SyncPromise - .try(() => { - return stream.read(this.getSize()); - }) - .then(array => { + return SyncPromise.try(() => { + return stream.read(this.getSize()); + }) + .then((array) => { let value: number; value = this.type.deserializer(array, options.littleEndian); value = this.type.convertSign(value); @@ -112,15 +157,15 @@ export class NumberFieldDefinition< } export class NumberFieldValue< - TDefinition extends NumberFieldDefinition, - > extends StructFieldValue { + TDefinition extends NumberFieldDefinition +> extends StructFieldValue { public serialize(dataView: DataView, offset: number): void { // `setBigInt64` requires a `bigint` while others require `number` // So `dataView[DataViewSetters]` requires `bigint & number` // and that is, `never` - (dataView[this.definition.type.dataViewSetter] as any)( + dataView[this.definition.type.dataViewSetter]( offset, - this.value!, + this.value as never, this.options.littleEndian ); } diff --git a/libraries/struct/src/utils.ts b/libraries/struct/src/utils.ts index df77eafb..496179e8 100644 --- a/libraries/struct/src/utils.ts +++ b/libraries/struct/src/utils.ts @@ -25,19 +25,24 @@ export type Evaluate = T extends infer U ? { [K in keyof U]: U[K] } : never; /** * Overwrite fields in `TBase` with fields in `TNew` */ -export type Overwrite = - Evaluate & TNew>; +export type Overwrite = Evaluate< + Omit & TNew +>; /** * Remove fields with `never` type */ -export type OmitNever = Pick; +export type OmitNever = Pick< + T, + { [K in keyof T]: [T[K]] extends [never] ? never : K }[keyof T] +>; /** * Extract keys of fields in `T` that has type `TValue` */ -export type KeysOfType = - { [TKey in keyof T]: T[TKey] extends TValue ? TKey : never }[keyof T]; +export type KeysOfType = { + [TKey in keyof T]: T[TKey] extends TValue ? TKey : never; +}[keyof T]; export type ValueOrPromise = T | PromiseLike; @@ -56,9 +61,9 @@ export function placeholder(): T { // But using top level await to load them requires Node.js 14.1. // So there is no point to do that. Let's just assume they exist in global. -// @ts-expect-error +// @ts-expect-error See reason above const Utf8Encoder = new TextEncoder(); -// @ts-expect-error +// @ts-expect-error See reason above const Utf8Decoder = new TextDecoder(); export function encodeUtf8(input: string): Uint8Array { diff --git a/libraries/struct/tsconfig.build.json b/libraries/struct/tsconfig.build.json index b4bb73dd..2cb23249 100644 --- a/libraries/struct/tsconfig.build.json +++ b/libraries/struct/tsconfig.build.json @@ -1,3 +1,3 @@ { - "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json" + "extends": "./node_modules/@yume-chan/tsconfig/tsconfig.base.json" } diff --git a/rush.json b/rush.json index 313b526e..dd8f256a 100644 --- a/rush.json +++ b/rush.json @@ -462,8 +462,12 @@ "projectFolder": "apps/book" }, { - "packageName": "@yume-chan/ts-package-builder", - "projectFolder": "toolchain/ts-package-builder" + "packageName": "@yume-chan/tsconfig", + "projectFolder": "toolchain/tsconfig" + }, + { + "packageName": "@yume-chan/eslint-config", + "projectFolder": "toolchain/eslint-config" } ] } diff --git a/toolchain/eslint-config/index.js b/toolchain/eslint-config/index.js new file mode 100644 index 00000000..f9dbb2d0 --- /dev/null +++ b/toolchain/eslint-config/index.js @@ -0,0 +1,59 @@ +require("@rushstack/eslint-patch/modern-module-resolution"); + +module.exports = { + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + ], + plugins: ["@typescript-eslint", "@yume-chan/eslint-plugin-import"], + rules: { + "no-constant-condition": ["error", { checkLoops: false }], + "no-plusplus": "error", + "no-multiple-empty-lines": [ + "error", + { + max: 1, + maxEOF: 1, + maxBOF: 0, + }, + ], + + "@yume-chan/import/consistent-type-specifier-style": [ + "error", + "prefer-inline", + ], + "@yume-chan/import/no-cycle": "error", + "@yume-chan/import/no-duplicates": "error", + "@yume-chan/import/order": [ + "error", + { + groups: [ + "builtin", + "external", + "internal", + "parent", + "sibling", + "index", + ], + "newlines-between": "always", + alphabetize: { + order: "asc", + }, + }, + ], + + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/array-type": "error", + "@typescript-eslint/consistent-type-definitions": "error", + "@typescript-eslint/no-this-alias": "error", + "@typescript-eslint/consistent-type-imports": [ + "error", + { + prefer: "type-imports", + disallowTypeAnnotations: true, + fixStyle: "inline-type-imports", + }, + ], + }, +}; diff --git a/toolchain/eslint-config/package.json b/toolchain/eslint-config/package.json new file mode 100644 index 00000000..3c663174 --- /dev/null +++ b/toolchain/eslint-config/package.json @@ -0,0 +1,12 @@ +{ + "name": "@yume-chan/eslint-config", + "version": "1.0.0", + "dependencies": { + "@rushstack/eslint-patch": "^1.2.0", + "@typescript-eslint/eslint-plugin": "^5.47.0", + "@typescript-eslint/parser": "^5.47.0", + "@yume-chan/eslint-plugin-import": "^2.26.0", + "eslint": "^8.30.0", + "typescript": "^4.9.4" + } +} diff --git a/toolchain/ts-package-builder/.gitignore b/toolchain/ts-package-builder/.gitignore deleted file mode 100644 index 9c595a6f..00000000 --- a/toolchain/ts-package-builder/.gitignore +++ /dev/null @@ -1 +0,0 @@ -temp diff --git a/toolchain/ts-package-builder/README.md b/toolchain/ts-package-builder/README.md deleted file mode 100644 index e44eb1b3..00000000 --- a/toolchain/ts-package-builder/README.md +++ /dev/null @@ -1,126 +0,0 @@ -# TypeScript NPM Package Builder (for myself) - -## Installation - -(This package is not yet published to NPM registry, so presumably) - -```shell -$ npm install --dev @yume-chan/ts-package-builder typescript -``` - -TypeScript is a peer dependency that must be installed separately (so you can use any version you want). - -```shell -$ npm install tslib -``` - -The default configuration has `"importHelpers": true`, so `tslib` is required (and it is a production dependency, not dev dependency). - -## Config - -A `tsconfig.json` file at package root is required for both this builder and editors. - -```jsonc -{ - // Extends default configurations. - "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json", - - // (Optional) Add override configurations. - "compilerOptions": { - // All TypeScript configurations are allowed. - "target": "ES2016", - - // Add extra ambient types. - // Don't forget to include "jest" unless you don't write unit tests. - // The default is `[ "jest" ]` - "types": [ - "w3c-web-usb", - "jest", - "node" - ] - }, - // (Optional) Specify types that's only used in tests. - // They will be excluded in ESModule build, - // to make sure library code doesn't accidentally use them. - // (for example, a browser targeted libraries should not use types from `@types/node`) - "testTypes": [ - "jest", - "node" - ], - // (Optional) Add project references to improve editing experience. - // However, because the builder is intended to be used with some monorepo manager - // (lerna, yarn workspace, rush, etc.), and they all have good built-in support - // for building all packages following dependency graph, it **does not** use - // project references when building. - "references": [ - { - "path": "../dependency-a/tsconfig.json" - }, - { - "path": "../dependency-b/tsconfig.json" - } - ] -} -``` - -## Building - -```shell -$ npx build-ts-package -``` - -Or add a script to `package.json` - -```json -{ - "scripts": { - "build": "build-ts-package", - }, -} -``` - -The builder outputs Node.js compatible ES Module, with source maps, TypeScript declarations, and declaration maps. - -| Module | Output Directory | Excluded Files | Excluded Types | -| ------------------ | ---------------- | -------------- | -------------- | -| ESModule | `esm` | `*.spec.ts` | `@types/jest` | -| Declaration (d.ts) | `dts` | `*.spec.ts` | `@types/jest` | - -Example `package.json`: - -```json -{ - "main": "esm/index.js", - "types": "dts/index.d.ts", -} -``` - -## Unit test with Jest - -Test file convention: put `.spec.ts` files inside `src`, alongside the source file that will be tested. - -Like this: - -- src - - index.ts - - index.spec.ts - -The `.spec.ts` files will be compiled to CommonJS for Jest (so no `ts-jest` required). - -Use the following `jest.config.js` file to find them: - -```js -module.exports = { - testMatch: ['/cjs/**/*.spec.js'], -}; -``` - -## Publishing - -Because `.spec.ts` files have been compiled to CommonJS, you can exclude them using `.npmignore`: - -```gitignore -**/*.spec.ts -**/*.spec.js -**/*.spec.js.map -``` diff --git a/toolchain/ts-package-builder/jsconfig.json b/toolchain/ts-package-builder/jsconfig.json deleted file mode 100644 index 46366b84..00000000 --- a/toolchain/ts-package-builder/jsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "compilerOptions": { - "rootDir": "src" - } -} diff --git a/toolchain/ts-package-builder/package.json b/toolchain/ts-package-builder/package.json deleted file mode 100644 index e47d1997..00000000 --- a/toolchain/ts-package-builder/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "@yume-chan/ts-package-builder", - "version": "1.0.0", - "description": "", - "main": "index.js", - "bin": { - "build-ts-package": "./src/index.js" - }, - "scripts": { - "build": "" - }, - "keywords": [], - "author": "", - "license": "MIT", - "devDependencies": { - "@types/node": "^18.11.9" - }, - "dependencies": { - "json5": "^2.2.0" - }, - "peerDependencies": { - "typescript": "^4.0.0" - } -} diff --git a/toolchain/ts-package-builder/src/index.js b/toolchain/ts-package-builder/src/index.js deleted file mode 100755 index 493a0bdb..00000000 --- a/toolchain/ts-package-builder/src/index.js +++ /dev/null @@ -1,54 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const childProcess = require('child_process'); -const JSON5 = require('json5'); - -const cwd = process.cwd(); -const temp = path.resolve(__dirname, '..', 'temp', process.pid.toString()); -fs.mkdirSync(temp, { recursive: true }); - -if (process.argv[2] !== '--incremental') { - fs.rmSync(path.resolve(cwd, 'esm'), { force: true, recursive: true }); -} - -const tsconfigPath = path.resolve(cwd, 'tsconfig.json'); -const tsconfigValue = JSON5.parse(fs.readFileSync(tsconfigPath), 'utf8'); - -const esmTsconfigPath = path.resolve(temp, 'tsconfig.esm.json'); -const testTypes = tsconfigValue.testTypes || ['jest']; -const esmTsconfigValue = { - ...tsconfigValue, - extends: tsconfigPath, - compilerOptions: { - composite: false, - outDir: path.resolve(cwd, 'esm'), - module: 'ESNext', - types: (tsconfigValue.compilerOptions?.types || []).filter(x => !testTypes.includes(x)), - typeRoots: [ - ...(tsconfigValue.compilerOptions?.typeRoots || []), - path.resolve(cwd, 'node_modules', '@types'), - path.resolve(__dirname, '..', 'node_modules', '@types'), - ], - }, - exclude: [ - ...(tsconfigValue.exclude || []).map(x => path.resolve(cwd, x)), - cwd.replace(/\\/g, '/') + '/src/**/*.spec.ts', - ], - references: [], -}; -fs.writeFileSync(esmTsconfigPath, JSON.stringify(esmTsconfigValue, undefined, 4)); - -const tsc = path.resolve(cwd, 'node_modules', '.bin', 'tsc'); -const tscResult = childProcess.spawnSync(tsc, [ - '--build', - esmTsconfigPath, -], { - cwd, - stdio: 'inherit', - shell: true, - windowsHide: true, -}); - -fs.rmSync(temp, { force: true, recursive: true }); - -process.exit(tscResult.status); diff --git a/toolchain/tsconfig/package.json b/toolchain/tsconfig/package.json new file mode 100644 index 00000000..8a316a65 --- /dev/null +++ b/toolchain/tsconfig/package.json @@ -0,0 +1,4 @@ +{ + "name": "@yume-chan/tsconfig", + "version": "1.0.0" +} diff --git a/toolchain/ts-package-builder/tsconfig.base.json b/toolchain/tsconfig/tsconfig.base.json similarity index 90% rename from toolchain/ts-package-builder/tsconfig.base.json rename to toolchain/tsconfig/tsconfig.base.json index 7c52c7c7..0a86aaa3 100644 --- a/toolchain/ts-package-builder/tsconfig.base.json +++ b/toolchain/tsconfig/tsconfig.base.json @@ -3,7 +3,7 @@ "composite": true, /* Basic Options */ "target": "ES2022", // /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ - "module": "NodeNext", // /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + "module": "NodeNext", // /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ "lib": [ // /* Specify library files to be included in the compilation. */ "ESNext" ], @@ -34,7 +34,7 @@ "noUncheckedIndexedAccess": true, "resolveJsonModule": true, /* Module Resolution Options */ - "moduleResolution": "NodeNext", // /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + "moduleResolution": "NodeNext", // /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ @@ -43,7 +43,6 @@ "esModuleInterop": true, // /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - "importsNotUsedAsValues": "error" }, "include": [ "../../../src" From a066bb44827473fc6370aa24aa57048cde3d6255 Mon Sep 17 00:00:00 2001 From: Simon Chan <1330321+yume-chan@users.noreply.github.com> Date: Fri, 23 Dec 2022 03:59:22 +0800 Subject: [PATCH 025/171] feat(scrcpy): support Scrcpy 1.25 --- .vscode/settings.json | 6 + apps/demo/package.json | 14 +- apps/demo/src/components/device-view.tsx | 243 ++-- apps/demo/src/pages/_app.tsx | 161 ++- apps/demo/src/pages/file-manager.tsx | 462 ++++--- apps/demo/src/pages/scrcpy.tsx | 1061 +++++++++++------ common/config/rush/pnpm-lock.yaml | 259 ++-- common/config/rush/repo-state.json | 2 +- libraries/adb-backend-webusb/src/backend.ts | 20 +- libraries/scrcpy/src/adb/options/types.ts | 15 +- .../scrcpy/src/control/back-or-screen-on.ts | 4 + libraries/scrcpy/src/control/index.ts | 16 +- .../scrcpy/src/control/inject-keycode.ts | 33 +- libraries/scrcpy/src/control/inject-scroll.ts | 4 + libraries/scrcpy/src/control/inject-touch.ts | 35 +- libraries/scrcpy/src/control/serializer.ts | 32 +- libraries/scrcpy/src/options/1_16/index.ts | 1 + libraries/scrcpy/src/options/1_16/options.ts | 29 +- libraries/scrcpy/src/options/1_16/scroll.ts | 76 ++ libraries/scrcpy/src/options/1_18.ts | 5 +- libraries/scrcpy/src/options/1_22/index.ts | 2 + .../src/options/{1_22.ts => 1_22/options.ts} | 25 +- libraries/scrcpy/src/options/1_22/scroll.ts | 26 + libraries/scrcpy/src/options/1_23.ts | 5 +- libraries/scrcpy/src/options/1_25/index.ts | 2 + libraries/scrcpy/src/options/1_25/options.ts | 12 + libraries/scrcpy/src/options/1_25/scroll.ts | 50 + libraries/scrcpy/src/options/index.ts | 9 +- libraries/scrcpy/src/options/types.ts | 23 +- libraries/struct/src/struct.ts | 50 +- libraries/struct/src/types/number.ts | 204 ++-- 31 files changed, 1781 insertions(+), 1105 deletions(-) create mode 100644 libraries/scrcpy/src/control/back-or-screen-on.ts create mode 100644 libraries/scrcpy/src/control/inject-scroll.ts create mode 100644 libraries/scrcpy/src/options/1_16/scroll.ts create mode 100644 libraries/scrcpy/src/options/1_22/index.ts rename libraries/scrcpy/src/options/{1_22.ts => 1_22/options.ts} (59%) create mode 100644 libraries/scrcpy/src/options/1_22/scroll.ts create mode 100644 libraries/scrcpy/src/options/1_25/index.ts create mode 100644 libraries/scrcpy/src/options/1_25/options.ts create mode 100644 libraries/scrcpy/src/options/1_25/scroll.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index eef649d8..fbfba239 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -78,7 +78,13 @@ "eslint.workingDirectories": [ "libraries/*", ], + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, "[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" } } diff --git a/apps/demo/package.json b/apps/demo/package.json index 17f218a0..ecc643dd 100644 --- a/apps/demo/package.json +++ b/apps/demo/package.json @@ -3,14 +3,14 @@ "version": "0.1.0", "private": true, "scripts": { - "postinstall": "fetch-scrcpy-server 1.24", + "postinstall": "fetch-scrcpy-server 1.25", "dev": "next dev", "build": "next build", "start": "next start", "lint": "next lint" }, "dependencies": { - "@fluentui/react": "^8.103.10", + "@fluentui/react": "^8.104.0", "@fluentui/react-file-type-icons": "^8.8.4", "@fluentui/react-hooks": "^8.6.14", "@fluentui/react-icons": "^2.0.190", @@ -33,20 +33,20 @@ "@yume-chan/struct": "workspace:^0.0.17", "mobx": "^6.7.0", "mobx-react-lite": "^3.4.0", - "next": "13.0.7", + "next": "13.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", "xterm": "^5.1.0", - "xterm-addon-fit": "^0.6.0", - "xterm-addon-search": "^0.10.0", + "xterm-addon-fit": "^0.7.0", + "xterm-addon-search": "^0.11.0", "xterm-addon-webgl": "^0.14.0" }, "devDependencies": { "@mdx-js/loader": "^2.2.1", - "@next/mdx": "^13.0.7", + "@next/mdx": "^13.1.0", "@types/react": "18.0.26", "eslint": "^8.30.0", - "eslint-config-next": "13.0.7", + "eslint-config-next": "13.1.0", "source-map-loader": "^4.0.1", "typescript": "^4.9.4" } diff --git a/apps/demo/src/components/device-view.tsx b/apps/demo/src/components/device-view.tsx index c5cd85ae..ad88df69 100644 --- a/apps/demo/src/components/device-view.tsx +++ b/apps/demo/src/components/device-view.tsx @@ -1,14 +1,27 @@ -import { mergeStyleSets, StackItem } from '@fluentui/react'; -import { ComponentType, CSSProperties, ReactNode, useImperativeHandle, useMemo, useRef, useState } from 'react'; -import { forwardRef } from '../utils/with-display-name'; -import { ResizeObserver, Size } from './resize-observer'; +import { StackItem } from "@fluentui/react"; +import { makeStyles } from "@griffel/react"; +import { + CSSProperties, + ComponentType, + ReactNode, + useImperativeHandle, + useMemo, + useRef, + useState, +} from "react"; +import { forwardRef } from "../utils/with-display-name"; +import { ResizeObserver, Size } from "./resize-observer"; export interface DeviceViewProps { width: number; height: number; - BottomElement?: ComponentType<{ className: string, style: CSSProperties, children: ReactNode; }>; + BottomElement?: ComponentType<{ + className: string; + style: CSSProperties; + children: ReactNode; + }>; children?: ReactNode; } @@ -17,114 +30,128 @@ export interface DeviceViewRef { enterFullscreen(): void; } -export const DeviceView = forwardRef('DeviceView')(({ - width, - height, - BottomElement, - children, -}: DeviceViewProps, ref) => { - const styles = mergeStyleSets({ - outer: { - width: '100%', - height: '100%', - backgroundColor: 'black', - }, - inner: { - position: 'absolute', - transformOrigin: 'top left', - }, - bottom: { - position: 'absolute', - }, - }); - - const [containerSize, setContainerSize] = useState({ width: 0, height: 0 }); - const [bottomSize, setBottomSize] = useState({ width: 0, height: 0 }); - - // Container size minus bottom element size - const usableSize = useMemo(() => ({ - width: containerSize.width, - height: containerSize.height - bottomSize.height, - }), [containerSize, bottomSize]); - - // Compute sizes after scaling - const childrenStyle = useMemo(() => { - let scale: number; - let childrenWidth: number; - let childrenHeight: number; - let childrenTop: number; - let childrenLeft: number; - - if (width === 0 || usableSize.width === 0) { - scale = 1; - childrenWidth = 0; - childrenHeight = 0; - childrenTop = 0; - childrenLeft = 0; - } else { - const videoRatio = width / height; - const containerRatio = usableSize.width / usableSize.height; - - if (videoRatio > containerRatio) { - scale = usableSize.width / width; - childrenWidth = usableSize.width; - childrenHeight = height * scale; - childrenTop = (usableSize.height - childrenHeight) / 2; +const useClasses = makeStyles({ + outer: { + width: "100%", + height: "100%", + backgroundColor: "black", + }, + inner: { + position: "absolute", + transformOrigin: "top left", + }, + bottom: { + position: "absolute", + }, +}); + +export const DeviceView = forwardRef("DeviceView")( + ({ width, height, BottomElement, children }: DeviceViewProps, ref) => { + const classes = useClasses(); + + const [containerSize, setContainerSize] = useState({ + width: 0, + height: 0, + }); + const [bottomSize, setBottomSize] = useState({ + width: 0, + height: 0, + }); + + // Container size minus bottom element size + const usableSize = useMemo( + () => ({ + width: containerSize.width, + height: containerSize.height - bottomSize.height, + }), + [containerSize, bottomSize] + ); + + // Compute sizes after scaling + const childrenStyle = useMemo(() => { + let scale: number; + let childrenWidth: number; + let childrenHeight: number; + let childrenTop: number; + let childrenLeft: number; + + if (width === 0 || usableSize.width === 0) { + scale = 1; + childrenWidth = 0; + childrenHeight = 0; + childrenTop = 0; childrenLeft = 0; } else { - scale = usableSize.height / height; - childrenWidth = width * scale; - childrenHeight = usableSize.height; - childrenTop = 0; - childrenLeft = (usableSize.width - childrenWidth) / 2; + const videoRatio = width / height; + const containerRatio = usableSize.width / usableSize.height; + + if (videoRatio > containerRatio) { + scale = usableSize.width / width; + childrenWidth = usableSize.width; + childrenHeight = height * scale; + childrenTop = (usableSize.height - childrenHeight) / 2; + childrenLeft = 0; + } else { + scale = usableSize.height / height; + childrenWidth = width * scale; + childrenHeight = usableSize.height; + childrenTop = 0; + childrenLeft = (usableSize.width - childrenWidth) / 2; + } } - } - - return { - scale, - width: childrenWidth, - height: childrenHeight, - top: childrenTop, - left: childrenLeft, - }; - }, [width, height, usableSize]); - - const containerRef = useRef(null); - useImperativeHandle(ref, () => ({ - enterFullscreen() { containerRef.current!.requestFullscreen(); }, - }), []); - - return ( - -
- - -
- {children} -
- {(!!width && !!BottomElement) && ( - (null); + useImperativeHandle( + ref, + () => ({ + enterFullscreen() { + containerRef.current!.requestFullscreen(); + }, + }), + [] + ); + + return ( + +
+ + +
- - - )} -
- - ); -}); + {children} +
+ + {!!width && !!BottomElement && ( + + + + )} +
+
+ ); + } +); diff --git a/apps/demo/src/pages/_app.tsx b/apps/demo/src/pages/_app.tsx index c82a2cf9..cbdc0760 100644 --- a/apps/demo/src/pages/_app.tsx +++ b/apps/demo/src/pages/_app.tsx @@ -1,80 +1,92 @@ -import { IComponentAsProps, IconButton, INavButtonProps, mergeStyles, mergeStyleSets, Nav, Stack, StackItem } from "@fluentui/react"; -import type { AppProps } from 'next/app'; +import { + IComponentAsProps, + INavButtonProps, + IconButton, + Nav, + Stack, + StackItem, +} from "@fluentui/react"; +import { makeStyles, mergeClasses, shorthands } from "@griffel/react"; +import type { AppProps } from "next/app"; import Head from "next/head"; -import Link from 'next/link'; -import { useRouter } from 'next/router'; +import Link from "next/link"; +import { useRouter } from "next/router"; import { useCallback, useEffect, useState } from "react"; import { Connect, ErrorDialogProvider } from "../components"; -import '../styles/globals.css'; +import "../styles/globals.css"; import { Icons } from "../utils"; -import { register as registerIcons } from '../utils/icons'; +import { register as registerIcons } from "../utils/icons"; registerIcons(); const ROUTES = [ { - url: '/', + url: "/", icon: Icons.Bookmark, - name: 'README', + name: "README", }, { - url: '/device-info', + url: "/device-info", icon: Icons.Phone, - name: 'Device Info', + name: "Device Info", }, { - url: '/file-manager', + url: "/file-manager", icon: Icons.Folder, - name: 'File Manager', + name: "File Manager", }, { - url: '/framebuffer', + url: "/framebuffer", icon: Icons.Camera, - name: 'Screen Capture', + name: "Screen Capture", }, { - url: '/shell', + url: "/shell", icon: Icons.WindowConsole, - name: 'Interactive Shell', + name: "Interactive Shell", }, { - url: '/scrcpy', + url: "/scrcpy", icon: Icons.PhoneLaptop, - name: 'Scrcpy', + name: "Scrcpy", }, { - url: '/tcpip', + url: "/tcpip", icon: Icons.WifiSettings, - name: 'ADB over WiFi', + name: "ADB over WiFi", }, { - url: '/install', + url: "/install", icon: Icons.Box, - name: 'Install APK', + name: "Install APK", }, { - url: '/logcat', + url: "/logcat", icon: Icons.BookSearch, - name: 'Logcat', + name: "Logcat", }, { - url: '/power', + url: "/power", icon: Icons.Power, - name: 'Power Menu', + name: "Power Menu", }, { - url: '/bug-report', + url: "/bug-report", icon: Icons.Bug, - name: 'Bug Report', + name: "Bug Report", }, { - url: '/packet-log', + url: "/packet-log", icon: Icons.TextGrammarError, - name: 'Packet Log', + name: "Packet Log", }, ]; -function NavLink({ link, defaultRender: DefaultRender, ...props }: IComponentAsProps) { +function NavLink({ + link, + defaultRender: DefaultRender, + ...props +}: IComponentAsProps) { if (!link) { return null; } @@ -86,30 +98,32 @@ function NavLink({ link, defaultRender: DefaultRender, ...props }: IComponentAsP ); } +const useClasses = makeStyles({ + titleContainer: { + ...shorthands.borderBottom("1px", "solid", "rgb(243, 242, 241)"), + }, + hidden: { + display: "none", + }, + title: { + ...shorthands.padding("4px", "0"), + fontSize: "20px", + textAlign: "center", + }, + leftColumn: { + width: "270px", + paddingRight: "8px", + ...shorthands.borderRight("1px", "solid", "rgb(243, 242, 241)"), + overflowY: "auto", + }, +}); + function App({ Component, pageProps }: AppProps) { - const classNames = mergeStyleSets({ - 'title-container': { - borderBottom: '1px solid rgb(243, 242, 241)', - }, - title: { - padding: '4px 0', - fontSize: 20, - textAlign: 'center', - }, - 'left-column': { - width: 270, - paddingRight: 8, - borderRight: '1px solid rgb(243, 242, 241)', - overflow: 'auto', - }, - 'right-column': { - borderLeft: '1px solid rgb(243, 242, 241)', - } - }); + const classes = useClasses(); const [leftPanelVisible, setLeftPanelVisible] = useState(false); const toggleLeftPanel = useCallback(() => { - setLeftPanelVisible(value => !value); + setLeftPanelVisible((value) => !value); }, []); useEffect(() => { setLeftPanelVisible(innerWidth > 650); @@ -124,7 +138,11 @@ function App({ Component, pageProps }: AppProps) { - + -
Android Web Toolbox
+
Android Web Toolbox
- - + +