diff --git a/apps/cli/package.json b/apps/cli/package.json index b804c2de..7a0a0996 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -43,11 +43,11 @@ "tslib": "^2.6.2" }, "devDependencies": { - "@types/node": "^20.12.12", + "@types/node": "^20.13.0", "@yume-chan/eslint-config": "workspace:^1.0.0", "@yume-chan/tsconfig": "workspace:^1.0.0", "jest": "^30.0.0-alpha.4", - "prettier": "^3.2.5", + "prettier": "^3.3.0", "typescript": "^5.4.5" } } diff --git a/common/changes/@yume-chan/adb/main_2024-05-10-00-33.json b/common/changes/@yume-chan/adb/main_2024-05-10-00-33.json new file mode 100644 index 00000000..9057135e --- /dev/null +++ b/common/changes/@yume-chan/adb/main_2024-05-10-00-33.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@yume-chan/adb", + "comment": "`AdbServerClient#getDevices()` and `AdbServerClient#trackDevices()` now include unauthorized devices", + "type": "none" + } + ], + "packageName": "@yume-chan/adb" +} diff --git a/common/changes/@yume-chan/adb/main_2024-05-10-00-34.json b/common/changes/@yume-chan/adb/main_2024-05-10-00-34.json new file mode 100644 index 00000000..e7231c2a --- /dev/null +++ b/common/changes/@yume-chan/adb/main_2024-05-10-00-34.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@yume-chan/adb", + "comment": "Add `pairDevice`, `connectDevice`, `disconnectDevice`, `reconnectDevice`, `mDnsCheck` and `mDnsGetServices` methods to `AdbServerClient`", + "type": "none" + } + ], + "packageName": "@yume-chan/adb" +} diff --git a/common/changes/@yume-chan/adb/main_2024-05-10-00-35.json b/common/changes/@yume-chan/adb/main_2024-05-10-00-35.json new file mode 100644 index 00000000..66d28d74 --- /dev/null +++ b/common/changes/@yume-chan/adb/main_2024-05-10-00-35.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@yume-chan/adb", + "comment": "Group `AdbServerClient` related types into the `AdbServerClient` namespace. In future, more types will be moved to namespaces.", + "type": "none" + } + ], + "packageName": "@yume-chan/adb" +} diff --git a/common/changes/@yume-chan/android-bin/main_2024-05-10-00-32.json b/common/changes/@yume-chan/android-bin/main_2024-05-10-00-32.json new file mode 100644 index 00000000..a661076a --- /dev/null +++ b/common/changes/@yume-chan/android-bin/main_2024-05-10-00-32.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@yume-chan/android-bin", + "comment": "Add all supported fields to `DumpSys.Battery.Info`", + "type": "none" + } + ], + "packageName": "@yume-chan/android-bin" +} diff --git a/common/changes/@yume-chan/scrcpy-decoder-webcodecs/main_2024-05-10-00-32.json b/common/changes/@yume-chan/scrcpy-decoder-webcodecs/main_2024-05-10-00-32.json new file mode 100644 index 00000000..30167f06 --- /dev/null +++ b/common/changes/@yume-chan/scrcpy-decoder-webcodecs/main_2024-05-10-00-32.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@yume-chan/scrcpy-decoder-webcodecs", + "comment": "Add `enableCapture` option to `WebCodecsVideoDecoder` which allows `renderer.readPixels` and `renderer.toDataURL` to work. The performance will be slightly affected when enabled.", + "type": "none" + } + ], + "packageName": "@yume-chan/scrcpy-decoder-webcodecs" +} diff --git a/common/changes/@yume-chan/scrcpy/main_2024-05-10-00-31.json b/common/changes/@yume-chan/scrcpy/main_2024-05-10-00-31.json index 9377f85e..1da48601 100644 --- a/common/changes/@yume-chan/scrcpy/main_2024-05-10-00-31.json +++ b/common/changes/@yume-chan/scrcpy/main_2024-05-10-00-31.json @@ -1,10 +1,10 @@ { - "changes": [ - { - "packageName": "@yume-chan/scrcpy", - "comment": "Support parsing AV1 metadata", - "type": "none" - } - ], - "packageName": "@yume-chan/scrcpy" -} \ No newline at end of file + "changes": [ + { + "packageName": "@yume-chan/scrcpy", + "comment": "Add AV1 metadata parser `Av1`", + "type": "none" + } + ], + "packageName": "@yume-chan/scrcpy" +} diff --git a/common/changes/@yume-chan/scrcpy/main_2024-05-10-00-32.json b/common/changes/@yume-chan/scrcpy/main_2024-05-10-00-32.json new file mode 100644 index 00000000..7038972a --- /dev/null +++ b/common/changes/@yume-chan/scrcpy/main_2024-05-10-00-32.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@yume-chan/scrcpy", + "comment": "Move clipboard stream to `ScrcpyOptions#clipboard`", + "type": "none" + } + ], + "packageName": "@yume-chan/scrcpy" +} diff --git a/common/changes/@yume-chan/scrcpy/main_2024-05-10-00-33.json b/common/changes/@yume-chan/scrcpy/main_2024-05-10-00-33.json new file mode 100644 index 00000000..a9ec2bc2 --- /dev/null +++ b/common/changes/@yume-chan/scrcpy/main_2024-05-10-00-33.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@yume-chan/scrcpy", + "comment": "Add support for `setClipboard` to wait for the clipboard to be updated (when `sequence` is not 0)", + "type": "none" + } + ], + "packageName": "@yume-chan/scrcpy" +} diff --git a/common/changes/@yume-chan/scrcpy/main_2024-05-10-00-34.json b/common/changes/@yume-chan/scrcpy/main_2024-05-10-00-34.json new file mode 100644 index 00000000..d4d43f4c --- /dev/null +++ b/common/changes/@yume-chan/scrcpy/main_2024-05-10-00-34.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@yume-chan/scrcpy", + "comment": "Add options class for version 2.3", + "type": "none" + } + ], + "packageName": "@yume-chan/scrcpy" +} diff --git a/common/changes/@yume-chan/stream-extra/main_2024-05-10-00-31.json b/common/changes/@yume-chan/stream-extra/main_2024-05-10-00-31.json index 948a9001..faee8c6b 100644 --- a/common/changes/@yume-chan/stream-extra/main_2024-05-10-00-31.json +++ b/common/changes/@yume-chan/stream-extra/main_2024-05-10-00-31.json @@ -1,10 +1,10 @@ { - "changes": [ - { - "packageName": "@yume-chan/stream-extra", - "comment": "Add `MaybeConsumable` and helpers", - "type": "none" - } - ], - "packageName": "@yume-chan/stream-extra" -} \ No newline at end of file + "changes": [ + { + "packageName": "@yume-chan/stream-extra", + "comment": "Add `MaybeConsumable` type. It's also a namespace containing related types.", + "type": "none" + } + ], + "packageName": "@yume-chan/stream-extra" +} diff --git a/common/changes/@yume-chan/stream-extra/main_2024-05-10-00-32.json b/common/changes/@yume-chan/stream-extra/main_2024-05-10-00-32.json index 8e9845ef..459898e7 100644 --- a/common/changes/@yume-chan/stream-extra/main_2024-05-10-00-32.json +++ b/common/changes/@yume-chan/stream-extra/main_2024-05-10-00-32.json @@ -2,7 +2,7 @@ "changes": [ { "packageName": "@yume-chan/stream-extra", - "comment": "Re-export global `TextDecoderStream` instead of implementing our own one which doesn't work correctly in stream mode", + "comment": "Re-export global `TextDecoderStream` to replace `DecodeUtf8Stream` which doesn't work correctly in stream mode", "type": "none" } ], diff --git a/common/changes/@yume-chan/stream-extra/main_2024-05-10-00-33.json b/common/changes/@yume-chan/stream-extra/main_2024-05-10-00-33.json new file mode 100644 index 00000000..f2e02203 --- /dev/null +++ b/common/changes/@yume-chan/stream-extra/main_2024-05-10-00-33.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@yume-chan/stream-extra", + "comment": "Move `Consumable` related types to the `Consumable` namespace. In future, more types will be moved to namespaces.", + "type": "none" + } + ], + "packageName": "@yume-chan/stream-extra" +} diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index ac8acc38..1b49aff9 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -33,8 +33,8 @@ importers: version: 2.6.2 devDependencies: '@types/node': - specifier: ^20.12.12 - version: 20.12.12 + specifier: ^20.13.0 + version: 20.13.0 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -43,10 +43,10 @@ importers: version: link:../../toolchain/tsconfig jest: specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4(@types/node@20.12.12) + version: 30.0.0-alpha.5(@types/node@20.13.0) prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 typescript: specifier: ^5.4.5 version: 5.4.5 @@ -71,10 +71,10 @@ importers: devDependencies: '@jest/globals': specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4 + version: 30.0.0-alpha.5 '@types/node': - specifier: ^20.12.12 - version: 20.12.12 + specifier: ^20.13.0 + version: 20.13.0 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -86,13 +86,13 @@ importers: version: 7.0.3 jest: specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4(@types/node@20.12.12) + version: 30.0.0-alpha.5(@types/node@20.13.0) prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 ts-jest: - specifier: ^29.1.2 - version: 29.1.2(jest@30.0.0-alpha.4)(typescript@5.4.5) + specifier: ^29.1.4 + version: 29.1.4(jest@30.0.0-alpha.5)(typescript@5.4.5) typescript: specifier: ^5.4.5 version: 5.4.5 @@ -110,8 +110,8 @@ importers: specifier: workspace:^1.0.0 version: link:../../toolchain/tsconfig prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 typescript: specifier: ^5.4.5 version: 5.4.5 @@ -138,8 +138,8 @@ importers: specifier: workspace:^1.0.0 version: link:../../toolchain/tsconfig prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 typescript: specifier: ^5.4.5 version: 5.4.5 @@ -167,7 +167,7 @@ importers: devDependencies: '@jest/globals': specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4 + version: 30.0.0-alpha.5 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -179,13 +179,13 @@ importers: version: 7.0.3 jest: specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4(@types/node@20.12.12) + version: 30.0.0-alpha.5(@types/node@20.13.0) prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 ts-jest: - specifier: ^29.1.2 - version: 29.1.2(jest@30.0.0-alpha.4)(typescript@5.4.5) + specifier: ^29.1.4 + version: 29.1.4(jest@30.0.0-alpha.5)(typescript@5.4.5) typescript: specifier: ^5.4.5 version: 5.4.5 @@ -203,8 +203,8 @@ importers: version: link:../struct devDependencies: '@types/node': - specifier: ^20.12.12 - version: 20.12.12 + specifier: ^20.13.0 + version: 20.13.0 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -213,10 +213,10 @@ importers: version: link:../../toolchain/tsconfig jest: specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4(@types/node@20.12.12) + version: 30.0.0-alpha.5(@types/node@20.13.0) prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 typescript: specifier: ^5.4.5 version: 5.4.5 @@ -235,7 +235,7 @@ importers: devDependencies: '@jest/globals': specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4 + version: 30.0.0-alpha.5 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -247,13 +247,13 @@ importers: version: 7.0.3 jest: specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4(@types/node@20.12.12) + version: 30.0.0-alpha.5(@types/node@20.13.0) prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 ts-jest: - specifier: ^29.1.2 - version: 29.1.2(jest@30.0.0-alpha.4)(typescript@5.4.5) + specifier: ^29.1.4 + version: 29.1.4(jest@30.0.0-alpha.5)(typescript@5.4.5) typescript: specifier: ^5.4.5 version: 5.4.5 @@ -282,7 +282,7 @@ importers: devDependencies: '@jest/globals': specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4 + version: 30.0.0-alpha.5 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -294,13 +294,13 @@ importers: version: 7.0.3 jest: specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4(@types/node@20.12.12) + version: 30.0.0-alpha.5(@types/node@20.13.0) prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 ts-jest: - specifier: ^29.1.2 - version: 29.1.2(jest@30.0.0-alpha.4)(typescript@5.4.5) + specifier: ^29.1.4 + version: 29.1.4(jest@30.0.0-alpha.5)(typescript@5.4.5) typescript: specifier: ^5.4.5 version: 5.4.5 @@ -312,17 +312,17 @@ importers: version: 4.0.3 devDependencies: '@types/node': - specifier: ^20.12.12 - version: 20.12.12 + specifier: ^20.13.0 + version: 20.13.0 ../../libraries/no-data-view: devDependencies: '@jest/globals': specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4 + version: 30.0.0-alpha.5 '@types/node': - specifier: ^20.12.12 - version: 20.12.12 + specifier: ^20.13.0 + version: 20.13.0 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -334,16 +334,16 @@ importers: version: 7.0.3 jest: specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4(@types/node@20.12.12) + version: 30.0.0-alpha.5(@types/node@20.13.0) prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 tinybench: specifier: ^2.8.0 version: 2.8.0 ts-jest: - specifier: ^29.1.2 - version: 29.1.2(jest@30.0.0-alpha.4)(typescript@5.4.5) + specifier: ^29.1.4 + version: 29.1.4(jest@30.0.0-alpha.5)(typescript@5.4.5) typescript: specifier: ^5.4.5 version: 5.4.5 @@ -352,7 +352,7 @@ importers: devDependencies: '@jest/globals': specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4 + version: 30.0.0-alpha.5 '@types/audioworklet': specifier: ^0.0.55 version: 0.0.55 @@ -367,13 +367,13 @@ importers: version: 7.0.3 jest: specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4(@types/node@20.12.12) + version: 30.0.0-alpha.5(@types/node@20.13.0) prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 ts-jest: - specifier: ^29.1.2 - version: 29.1.2(jest@30.0.0-alpha.4)(typescript@5.4.5) + specifier: ^29.1.4 + version: 29.1.4(jest@30.0.0-alpha.5)(typescript@5.4.5) typescript: specifier: ^5.4.5 version: 5.4.5 @@ -398,7 +398,7 @@ importers: devDependencies: '@jest/globals': specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4 + version: 30.0.0-alpha.5 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -410,13 +410,13 @@ importers: version: 7.0.3 jest: specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4(@types/node@20.12.12) + version: 30.0.0-alpha.5(@types/node@20.13.0) prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 ts-jest: - specifier: ^29.1.2 - version: 29.1.2(jest@30.0.0-alpha.4)(typescript@5.4.5) + specifier: ^29.1.4 + version: 29.1.4(jest@30.0.0-alpha.5)(typescript@5.4.5) typescript: specifier: ^5.4.5 version: 5.4.5 @@ -447,7 +447,7 @@ importers: devDependencies: '@jest/globals': specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4 + version: 30.0.0-alpha.5 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -459,13 +459,13 @@ importers: version: 7.0.3 jest: specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4(@types/node@20.12.12) + version: 30.0.0-alpha.5(@types/node@20.13.0) prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 ts-jest: - specifier: ^29.1.2 - version: 29.1.2(jest@30.0.0-alpha.4)(typescript@5.4.5) + specifier: ^29.1.4 + version: 29.1.4(jest@30.0.0-alpha.5)(typescript@5.4.5) typescript: specifier: ^5.4.5 version: 5.4.5 @@ -490,7 +490,7 @@ importers: devDependencies: '@jest/globals': specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4 + version: 30.0.0-alpha.5 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -502,13 +502,13 @@ importers: version: 7.0.3 jest: specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4(@types/node@20.12.12) + version: 30.0.0-alpha.5(@types/node@20.13.0) prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 ts-jest: - specifier: ^29.1.2 - version: 29.1.2(jest@30.0.0-alpha.4)(typescript@5.4.5) + specifier: ^29.1.4 + version: 29.1.4(jest@30.0.0-alpha.5)(typescript@5.4.5) typescript: specifier: ^5.4.5 version: 5.4.5 @@ -524,7 +524,7 @@ importers: devDependencies: '@jest/globals': specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4 + version: 30.0.0-alpha.5 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -536,13 +536,13 @@ importers: version: 7.0.3 jest: specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4(@types/node@20.12.12) + version: 30.0.0-alpha.5(@types/node@20.13.0) prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 ts-jest: - specifier: ^29.1.2 - version: 29.1.2(jest@30.0.0-alpha.4)(typescript@5.4.5) + specifier: ^29.1.4 + version: 29.1.4(jest@30.0.0-alpha.5)(typescript@5.4.5) typescript: specifier: ^5.4.5 version: 5.4.5 @@ -555,7 +555,7 @@ importers: devDependencies: '@jest/globals': specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4 + version: 30.0.0-alpha.5 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -567,13 +567,13 @@ importers: version: 7.0.3 jest: specifier: ^30.0.0-alpha.4 - version: 30.0.0-alpha.4(@types/node@20.12.12) + version: 30.0.0-alpha.5(@types/node@20.13.0) prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 ts-jest: - specifier: ^29.1.2 - version: 29.1.2(jest@30.0.0-alpha.4)(typescript@5.4.5) + specifier: ^29.1.4 + version: 29.1.4(jest@30.0.0-alpha.5)(typescript@5.4.5) typescript: specifier: ^5.4.5 version: 5.4.5 @@ -581,33 +581,33 @@ importers: ../../toolchain/eslint-config: dependencies: '@eslint/js': - specifier: ^9.3.0 - version: 9.3.0 + specifier: ^9.4.0 + version: 9.4.0 '@types/node': - specifier: ^20.12.12 - version: 20.12.12 + specifier: ^20.13.0 + version: 20.13.0 eslint: - specifier: ^9.3.0 - version: 9.3.0 + specifier: ^9.4.0 + version: 9.4.0 eslint-plugin-import-x: - specifier: ^0.5.0 - version: 0.5.0(eslint@9.3.0)(typescript@5.4.5) + specifier: ^0.5.1 + version: 0.5.1(eslint@9.4.0)(typescript@5.4.5) typescript: specifier: ^5.4.5 version: 5.4.5 typescript-eslint: - specifier: ^7.9.0 - version: 7.9.0(eslint@9.3.0)(typescript@5.4.5) + specifier: ^7.11.0 + version: 7.11.0(eslint@9.4.0)(typescript@5.4.5) devDependencies: prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 ../../toolchain/tsconfig: devDependencies: prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 packages: @@ -619,33 +619,33 @@ packages: '@jridgewell/trace-mapping': 0.3.25 dev: true - /@babel/code-frame@7.24.2: - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + /@babel/code-frame@7.24.6: + resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.24.5 + '@babel/highlight': 7.24.6 picocolors: 1.0.1 dev: true - /@babel/compat-data@7.24.4: - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + /@babel/compat-data@7.24.6: + resolution: {integrity: sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.24.5: - resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + /@babel/core@7.24.6: + resolution: {integrity: sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helpers': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helpers': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/template': 7.24.6 + '@babel/traverse': 7.24.6 + '@babel/types': 7.24.6 convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -655,291 +655,288 @@ packages: - supports-color dev: true - /@babel/generator@7.24.5: - resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + /@babel/generator@7.24.6: + resolution: {integrity: sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.6 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 dev: true - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + /@babel/helper-compilation-targets@7.24.6: + resolution: {integrity: sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.24.4 - '@babel/helper-validator-option': 7.23.5 + '@babel/compat-data': 7.24.6 + '@babel/helper-validator-option': 7.24.6 browserslist: 4.23.0 lru-cache: 5.1.1 semver: 6.3.1 dev: true - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + /@babel/helper-environment-visitor@7.24.6: + resolution: {integrity: sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + /@babel/helper-function-name@7.24.6: + resolution: {integrity: sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 dev: true - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + /@babel/helper-hoist-variables@7.24.6: + resolution: {integrity: sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.6 dev: true - /@babel/helper-module-imports@7.24.3: - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + /@babel/helper-module-imports@7.24.6: + resolution: {integrity: sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.6 dev: true - /@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + /@babel/helper-module-transforms@7.24.6(@babel/core@7.24.6): + resolution: {integrity: sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.24.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-module-imports': 7.24.6 + '@babel/helper-simple-access': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 dev: true - /@babel/helper-plugin-utils@7.24.5: - resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + /@babel/helper-plugin-utils@7.24.6: + resolution: {integrity: sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-simple-access@7.24.5: - resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} + /@babel/helper-simple-access@7.24.6: + resolution: {integrity: sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.6 dev: true - /@babel/helper-split-export-declaration@7.24.5: - resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + /@babel/helper-split-export-declaration@7.24.6: + resolution: {integrity: sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.6 dev: true - /@babel/helper-string-parser@7.24.1: - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + /@babel/helper-string-parser@7.24.6: + resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier@7.24.5: - resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + /@babel/helper-validator-identifier@7.24.6: + resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + /@babel/helper-validator-option@7.24.6: + resolution: {integrity: sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helpers@7.24.5: - resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} + /@babel/helpers@7.24.6: + resolution: {integrity: sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - transitivePeerDependencies: - - supports-color + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 dev: true - /@babel/highlight@7.24.5: - resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} + /@babel/highlight@7.24.6: + resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-validator-identifier': 7.24.6 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.1 dev: true - /@babel/parser@7.24.5: - resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + /@babel/parser@7.24.6: + resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} engines: {node: '>=6.0.0'} hasBin: true dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.6): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.5): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.6): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.6): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.6): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.6): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 dev: true - /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + /@babel/plugin-syntax-jsx@7.24.6(@babel/core@7.24.6): + resolution: {integrity: sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.6): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.6): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.6): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.6): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.6): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.6): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.6): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 dev: true - /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + /@babel/plugin-syntax-typescript@7.24.6(@babel/core@7.24.6): + resolution: {integrity: sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 dev: true - /@babel/template@7.24.0: - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + /@babel/template@7.24.6: + resolution: {integrity: sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/code-frame': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 dev: true - /@babel/traverse@7.24.5: - resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} + /@babel/traverse@7.24.6: + resolution: {integrity: sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-hoist-variables': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.24.5: - resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} + /@babel/types@7.24.6: + resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-string-parser': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 to-fast-properties: 2.0.0 dev: true @@ -947,13 +944,13 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@9.3.0): + /@eslint-community/eslint-utils@4.4.0(eslint@9.4.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 9.3.0 + eslint: 9.4.0 eslint-visitor-keys: 3.4.3 dev: false @@ -962,6 +959,17 @@ packages: engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: false + /@eslint/config-array@0.15.1: + resolution: {integrity: sha512-K4gzNq+yymn/EVsXYmf+SBcBro8MTf+aXJZUphM96CdzUEr+ClGDvAbpmaEK+cGVigVXIgs9gNmvHAlrzzY5JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@eslint/object-schema': 2.1.3 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: false + /@eslint/eslintrc@3.1.0: resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -979,20 +987,14 @@ packages: - supports-color dev: false - /@eslint/js@9.3.0: - resolution: {integrity: sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw==} + /@eslint/js@9.4.0: + resolution: {integrity: sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: false - /@humanwhocodes/config-array@0.13.0: - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + /@eslint/object-schema@2.1.3: + resolution: {integrity: sha512-HAbhAYKfsAC2EkTqve00ibWIZlaU74Z1EHwAjYr4PXF0YU2VEA1zSIKSSpKszRLRWwHzzRZXvK632u+uXzvsvw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: false /@humanwhocodes/module-importer@1.0.1: @@ -1000,10 +1002,6 @@ packages: engines: {node: '>=12.22'} dev: false - /@humanwhocodes/object-schema@2.0.3: - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - dev: false - /@humanwhocodes/retry@0.3.0: resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} engines: {node: '>=18.18'} @@ -1037,20 +1035,20 @@ packages: engines: {node: '>=8'} dev: true - /@jest/console@30.0.0-alpha.4: - resolution: {integrity: sha512-CVV3rvFJW1QOaRtSK02NUUCqfhc7FnDFNL28/fo4qO5+feSQtD7NlnRxub1FXRnTec8jdUHUE4469nBiDc0d7Q==} + /@jest/console@30.0.0-alpha.5: + resolution: {integrity: sha512-60bIFNdU3otnWJljjfnbIntLJ9JUiULI3o+uslyao2j2yP7rYfKdg8sye7NfQ29Zb0IoluBefpEN7s2hVzyz3A==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/types': 30.0.0-alpha.4 - '@types/node': 20.12.12 + '@jest/types': 30.0.0-alpha.5 + '@types/node': 20.13.0 chalk: 4.1.2 - jest-message-util: 30.0.0-alpha.4 - jest-util: 30.0.0-alpha.4 + jest-message-util: 30.0.0-alpha.5 + jest-util: 30.0.0-alpha.5 slash: 3.0.0 dev: true - /@jest/core@30.0.0-alpha.4: - resolution: {integrity: sha512-gZJWIJTtLM4D2WnFkXGE1WvUBye117K8wOwbUMxSULxVYnwGX7CvhacfGFetPWja93BVyIWx+VKZ/jt4j1+tFg==} + /@jest/core@30.0.0-alpha.5: + resolution: {integrity: sha512-AozuDUK5nPLStNN5W6D4MArMIbA2zxV2NqK+wiJEXQQA2PapiWuOxpLo+mUKMwoA1VQ/afOre1neZ6NpkjPNaw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1058,32 +1056,33 @@ packages: node-notifier: optional: true dependencies: - '@jest/console': 30.0.0-alpha.4 - '@jest/reporters': 30.0.0-alpha.4 - '@jest/test-result': 30.0.0-alpha.4 - '@jest/transform': 30.0.0-alpha.4 - '@jest/types': 30.0.0-alpha.4 - '@types/node': 20.12.12 + '@jest/console': 30.0.0-alpha.5 + '@jest/pattern': 30.0.0-alpha.5 + '@jest/reporters': 30.0.0-alpha.5 + '@jest/test-result': 30.0.0-alpha.5 + '@jest/transform': 30.0.0-alpha.5 + '@jest/types': 30.0.0-alpha.5 + '@types/node': 20.13.0 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 4.0.0 exit: 0.1.2 graceful-fs: 4.2.11 - jest-changed-files: 30.0.0-alpha.4 - jest-config: 30.0.0-alpha.4(@types/node@20.12.12) - jest-haste-map: 30.0.0-alpha.4 - jest-message-util: 30.0.0-alpha.4 - jest-regex-util: 30.0.0-alpha.4 - jest-resolve: 30.0.0-alpha.4 - jest-resolve-dependencies: 30.0.0-alpha.4 - jest-runner: 30.0.0-alpha.4 - jest-runtime: 30.0.0-alpha.4 - jest-snapshot: 30.0.0-alpha.4 - jest-util: 30.0.0-alpha.4 - jest-validate: 30.0.0-alpha.4 - jest-watcher: 30.0.0-alpha.4 - micromatch: 4.0.5 - pretty-format: 30.0.0-alpha.4 + jest-changed-files: 30.0.0-alpha.5 + jest-config: 30.0.0-alpha.5(@types/node@20.13.0) + jest-haste-map: 30.0.0-alpha.5 + jest-message-util: 30.0.0-alpha.5 + jest-regex-util: 30.0.0-alpha.5 + jest-resolve: 30.0.0-alpha.5 + jest-resolve-dependencies: 30.0.0-alpha.5 + jest-runner: 30.0.0-alpha.5 + jest-runtime: 30.0.0-alpha.5 + jest-snapshot: 30.0.0-alpha.5 + jest-util: 30.0.0-alpha.5 + jest-validate: 30.0.0-alpha.5 + jest-watcher: 30.0.0-alpha.5 + micromatch: 4.0.7 + pretty-format: 30.0.0-alpha.5 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: @@ -1092,59 +1091,67 @@ packages: - ts-node dev: true - /@jest/environment@30.0.0-alpha.4: - resolution: {integrity: sha512-2bjXGDOkvr2o6zJmTDIKNC1mKruFhtgV/LEfXbw7BwfXSxRBcA1stRRbkbBxX8Ibk2hWLsL4Y5Q98OmHt22ZLg==} + /@jest/environment@30.0.0-alpha.5: + resolution: {integrity: sha512-uWnbbtArBcrR6T2XKPlNp5eCxe/48U0imDJMr2t63FIqoIZJOvrVbRtKQEhjzt+c9YkzNoVBOvgu7aLdwVrZ8g==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/fake-timers': 30.0.0-alpha.4 - '@jest/types': 30.0.0-alpha.4 - '@types/node': 20.12.12 - jest-mock: 30.0.0-alpha.4 + '@jest/fake-timers': 30.0.0-alpha.5 + '@jest/types': 30.0.0-alpha.5 + '@types/node': 20.13.0 + jest-mock: 30.0.0-alpha.5 dev: true - /@jest/expect-utils@30.0.0-alpha.4: - resolution: {integrity: sha512-vZmmZ2Jp+SJ1z6fdbUQaalpWMrOEqfCV06OXGuBAhhRIPttX6jsiZRru5nIiLk7OnfFRsOwhepVdHO3nPUYtMA==} + /@jest/expect-utils@30.0.0-alpha.5: + resolution: {integrity: sha512-DwWb4vqgp+Wc/vyrPY3afa5J2PnrKpzW+ckrViWMhp5gu4hnktatBiad9/E8+buUEZWFZLamcqpqk6KtuPQBXw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - jest-get-type: 30.0.0-alpha.4 + jest-get-type: 30.0.0-alpha.5 dev: true - /@jest/expect@30.0.0-alpha.4: - resolution: {integrity: sha512-lpFBk4BegBcJyYo1Jr8+hWeGoxu2yRAO9P+IcIgGlO77XOseWlwKP42vYpRezWS6IKp3QnG3s6AQTCa5y1DwVQ==} + /@jest/expect@30.0.0-alpha.5: + resolution: {integrity: sha512-Gp4hyR6UUPyplIO9ipcXSSM19xMoWro3+W8VbPrqw9IuOpOs/rVfh3Tn62WP8ZfYYK7CAtUI+Fhx/jiqwTGPtw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - expect: 30.0.0-alpha.4 - jest-snapshot: 30.0.0-alpha.4 + expect: 30.0.0-alpha.5 + jest-snapshot: 30.0.0-alpha.5 transitivePeerDependencies: - supports-color dev: true - /@jest/fake-timers@30.0.0-alpha.4: - resolution: {integrity: sha512-CRpPH235ek0Kgl5/LdmFMrIbRiIgIJtyOaFqsxxTBxqqKETloC9H4UiaWdFfZ3bOdKc4DYoxggxwYbCnwCWRKw==} + /@jest/fake-timers@30.0.0-alpha.5: + resolution: {integrity: sha512-DuQpJP7zz/vBd6/BweFit7+MJVgIEb4gHfoEd9TKIuvoQ4wcIm05LtMDIJYlPe+g/w/Ew01uMYNJ7acvbwxY0g==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/types': 30.0.0-alpha.4 + '@jest/types': 30.0.0-alpha.5 '@sinonjs/fake-timers': 11.2.2 - '@types/node': 20.12.12 - jest-message-util: 30.0.0-alpha.4 - jest-mock: 30.0.0-alpha.4 - jest-util: 30.0.0-alpha.4 + '@types/node': 20.13.0 + jest-message-util: 30.0.0-alpha.5 + jest-mock: 30.0.0-alpha.5 + jest-util: 30.0.0-alpha.5 dev: true - /@jest/globals@30.0.0-alpha.4: - resolution: {integrity: sha512-m6e8GKdLSXf1RPAHx2bL2szUSL8Oo4z28s/CyIVGVFjDcJ4xWZ+Y8kpaP+Xd4sIpiV/FfH/lfUVmspuxKPg+IA==} + /@jest/globals@30.0.0-alpha.5: + resolution: {integrity: sha512-4J+6X5IUmrzN3MNLK8BEJxOiA1iDCi7E3gmaIiTxc2w+E+wApxM7XZW7gvJFwqBJLCeo6uSPQ3vr2kcIABxzNQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/environment': 30.0.0-alpha.4 - '@jest/expect': 30.0.0-alpha.4 - '@jest/types': 30.0.0-alpha.4 - jest-mock: 30.0.0-alpha.4 + '@jest/environment': 30.0.0-alpha.5 + '@jest/expect': 30.0.0-alpha.5 + '@jest/types': 30.0.0-alpha.5 + jest-mock: 30.0.0-alpha.5 transitivePeerDependencies: - supports-color dev: true - /@jest/reporters@30.0.0-alpha.4: - resolution: {integrity: sha512-AiJIkRYwZvjvRzak+qpsq2ojKch/3QIVmIkYl4OMRWr3iY5qJtJaCOSVPA82y7hVuyYy9H1w1RZbZB920NrVag==} + /@jest/pattern@30.0.0-alpha.5: + resolution: {integrity: sha512-NkN0G84UurVpBkiKyar+S0smZgnDnUCSPzhqCSrTWMRaoWzBQJTAA0hZkz29nBMEYHtDAWNfimcBlfZMU+H+gQ==} + engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} + dependencies: + '@types/node': 20.13.0 + jest-regex-util: 30.0.0-alpha.5 + dev: true + + /@jest/reporters@30.0.0-alpha.5: + resolution: {integrity: sha512-opFmlGKqNvzMc6nrtxPzm15uJaJx8WZE85fLFt5r/kxipIHGuZ2vPFXfjOJvJENgawYSNL+8Emv51Mm9ZhnJ3A==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -1153,25 +1160,25 @@ packages: optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 30.0.0-alpha.4 - '@jest/test-result': 30.0.0-alpha.4 - '@jest/transform': 30.0.0-alpha.4 - '@jest/types': 30.0.0-alpha.4 + '@jest/console': 30.0.0-alpha.5 + '@jest/test-result': 30.0.0-alpha.5 + '@jest/transform': 30.0.0-alpha.5 + '@jest/types': 30.0.0-alpha.5 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.12.12 + '@types/node': 20.13.0 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 - glob: 10.3.15 + glob: 10.4.1 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.2 istanbul-lib-instrument: 6.0.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.4 istanbul-reports: 3.1.7 - jest-message-util: 30.0.0-alpha.4 - jest-util: 30.0.0-alpha.4 - jest-worker: 30.0.0-alpha.4 + jest-message-util: 30.0.0-alpha.5 + jest-util: 30.0.0-alpha.5 + jest-worker: 30.0.0-alpha.5 slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 @@ -1187,15 +1194,25 @@ packages: '@sinclair/typebox': 0.27.8 dev: true - /@jest/schemas@30.0.0-alpha.4: - resolution: {integrity: sha512-/iFNfQeWfrbZOz4AQ8oC/ZD45tgo5fEutKEDO7G39Mh3ZyzSaRXwo/JGWsRXOlOUfPOQLtvQa/ayeLwZvqM8LQ==} + /@jest/schemas@30.0.0-alpha.5: + resolution: {integrity: sha512-um74b5FzrExOuilDqOEcBS0C3lAhR/2sjyNPjLypOkksjtmUZbn9oJTMJ3UmYW5CHoRKOXVnjU/CrOtbfFqrqg==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@sinclair/typebox': 0.32.30 + '@sinclair/typebox': 0.32.31 dev: true - /@jest/source-map@30.0.0-alpha.4: - resolution: {integrity: sha512-Fpn783ZD8VQVTZg1s+tB0vB6/x7i4/Y2Es1HySA4hv1hIDN/MLrY1feIAViyBk4P1BTSdOsIXr1HKFC6P4VLog==} + /@jest/snapshot-utils@30.0.0-alpha.5: + resolution: {integrity: sha512-dWf93VC3+f1ZI/pvvyng2m1ffk2giooPayKNVwGxKM8i2WnDcI+4CqZlCQ3mX7b7NYkF9L4xRNrJ3KWuvJR5aA==} + engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} + dependencies: + '@jest/types': 30.0.0-alpha.5 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + dev: true + + /@jest/source-map@30.0.0-alpha.5: + resolution: {integrity: sha512-Um5aULXncGNoj3FTNobPoV0Cj8glvEczqSN3AkyvLgprEnjGNWyQi9NPPPcGWBwHmaJBWCUP8+xeTbGalAB9Og==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -1203,42 +1220,42 @@ packages: graceful-fs: 4.2.11 dev: true - /@jest/test-result@30.0.0-alpha.4: - resolution: {integrity: sha512-8b0gjk+95jtqhU+GyEtNCTLPeN1Y5IIGUtPQwb0ep+VAdvpzmtGRvNqQwmxf8Dl6iy5Fz7PqH27Fe2YkDbOzOw==} + /@jest/test-result@30.0.0-alpha.5: + resolution: {integrity: sha512-aI9sw/JkUb1BnnH4JWX7vsFRP9pXrN8Yjm+ZLXdjtejY7z/oBPz6imx6+lRt/H4u/OhvqrnaA46cQmYNh2977w==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/console': 30.0.0-alpha.4 - '@jest/types': 30.0.0-alpha.4 + '@jest/console': 30.0.0-alpha.5 + '@jest/types': 30.0.0-alpha.5 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 dev: true - /@jest/test-sequencer@30.0.0-alpha.4: - resolution: {integrity: sha512-S375F8oZd8yS/3obeDtXzEUHry97oqw1RwVEuOngf7ieMqldTY5bIvnG1xo0dNHrIE3xvrhlGxUZRYKiNXH15A==} + /@jest/test-sequencer@30.0.0-alpha.5: + resolution: {integrity: sha512-h8ZCs9XTPLJCxbc2o0EHCFsogx6j2RFJQsWuEoD7drnGw9cGYoopgZUjf64WaptGxh+WUwuqadfceKDQ//usMg==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/test-result': 30.0.0-alpha.4 + '@jest/test-result': 30.0.0-alpha.5 graceful-fs: 4.2.11 - jest-haste-map: 30.0.0-alpha.4 + jest-haste-map: 30.0.0-alpha.5 slash: 3.0.0 dev: true - /@jest/transform@30.0.0-alpha.4: - resolution: {integrity: sha512-wipt89BUw5hEuBzSvOq+4Og0UV5ipDgdHOIxfyLRs6flFvh8afvvaubvHh6He5alOnImVcwrq4zUMO1vJd+OIA==} + /@jest/transform@30.0.0-alpha.5: + resolution: {integrity: sha512-ng0RZBbSVWzkcLscV/orutlgz6WnVA1yUNGruZ6p8QLow628Gndpmd4JrOGRm66v8DFhwtPUkxzucTJ+3VNpkA==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@babel/core': 7.24.5 - '@jest/types': 30.0.0-alpha.4 + '@babel/core': 7.24.6 + '@jest/types': 30.0.0-alpha.5 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 30.0.0-alpha.4 - jest-regex-util: 30.0.0-alpha.4 - jest-util: 30.0.0-alpha.4 - micromatch: 4.0.5 + jest-haste-map: 30.0.0-alpha.5 + jest-regex-util: 30.0.0-alpha.5 + jest-util: 30.0.0-alpha.5 + micromatch: 4.0.7 pirates: 4.0.6 slash: 3.0.0 write-file-atomic: 5.0.1 @@ -1253,19 +1270,20 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.12.12 + '@types/node': 20.13.0 '@types/yargs': 17.0.32 chalk: 4.1.2 dev: true - /@jest/types@30.0.0-alpha.4: - resolution: {integrity: sha512-Yxj+Iw62WVn2C9zhFrem8vKKhuC7kLR4DWmOZf6d9Z+eayCmYenZdyFA7P7X688gzGmZ1Qu71snJnLfvEetNdw==} + /@jest/types@30.0.0-alpha.5: + resolution: {integrity: sha512-Qu4PmAPX6sT2RrodqERoBkbrGz6suKDk/PdaL72q6G4ERg8OspP+ODit+JBJe20F+0QW4v6wsf2vD/L6lCzYcw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/schemas': 30.0.0-alpha.4 + '@jest/pattern': 30.0.0-alpha.5 + '@jest/schemas': 30.0.0-alpha.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.12.12 + '@types/node': 20.13.0 '@types/yargs': 17.0.32 chalk: 4.1.2 dev: true @@ -1337,8 +1355,8 @@ packages: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true - /@sinclair/typebox@0.32.30: - resolution: {integrity: sha512-IYK1H0k2sHVB2GjzBK2DXBErhex45GoLuPdgn8lNw5t0+5elIuhpixOMPobFyq6kE0AGIBa4+76Ph4enco0q2Q==} + /@sinclair/typebox@0.32.31: + resolution: {integrity: sha512-rYB0tgGHawpom3ZwwsGidvI0NI+W/rRHu1dyyO1KlIoH8iMdg3esSnYQxQtyJ8eflhqxmzEV7Nu8zT4JY7CHKw==} dev: true /@sindresorhus/is@5.6.0: @@ -1376,30 +1394,30 @@ packages: /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 dev: true /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.6 dev: true /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 dev: true - /@types/babel__traverse@7.20.5: - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + /@types/babel__traverse@7.20.6: + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.6 dev: true /@types/http-cache-semantics@4.0.4: @@ -1422,8 +1440,8 @@ packages: '@types/istanbul-lib-report': 3.0.3 dev: true - /@types/node@20.12.12: - resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} + /@types/node@20.13.0: + resolution: {integrity: sha512-FM6AOb3khNkNIXPnHFDYaHerSv8uN22C91z098AnGccVu+Pcdhi+pNUFDi0iLmPIsVE0JBD0KVS7mzUYt4nRzQ==} dependencies: undici-types: 5.26.5 @@ -1445,8 +1463,8 @@ packages: '@types/yargs-parser': 21.0.3 dev: true - /@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0)(eslint@9.3.0)(typescript@5.4.5): - resolution: {integrity: sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==} + /@typescript-eslint/eslint-plugin@7.11.0(@typescript-eslint/parser@7.11.0)(eslint@9.4.0)(typescript@5.4.5): + resolution: {integrity: sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -1457,12 +1475,12 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.9.0(eslint@9.3.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/type-utils': 7.9.0(eslint@9.3.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.9.0(eslint@9.3.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.9.0 - eslint: 9.3.0 + '@typescript-eslint/parser': 7.11.0(eslint@9.4.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.11.0 + '@typescript-eslint/type-utils': 7.11.0(eslint@9.4.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.11.0(eslint@9.4.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.11.0 + eslint: 9.4.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 @@ -1472,8 +1490,8 @@ packages: - supports-color dev: false - /@typescript-eslint/parser@7.9.0(eslint@9.3.0)(typescript@5.4.5): - resolution: {integrity: sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==} + /@typescript-eslint/parser@7.11.0(eslint@9.4.0)(typescript@5.4.5): + resolution: {integrity: sha512-yimw99teuaXVWsBcPO1Ais02kwJ1jmNA1KxE7ng0aT7ndr1pT1wqj0OJnsYVGKKlc4QJai86l/025L6z8CljOg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1482,27 +1500,27 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.9.0 + '@typescript-eslint/scope-manager': 7.11.0 + '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.11.0 debug: 4.3.4 - eslint: 9.3.0 + eslint: 9.4.0 typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/scope-manager@7.9.0: - resolution: {integrity: sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==} + /@typescript-eslint/scope-manager@7.11.0: + resolution: {integrity: sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/visitor-keys': 7.9.0 + '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/visitor-keys': 7.11.0 dev: false - /@typescript-eslint/type-utils@7.9.0(eslint@9.3.0)(typescript@5.4.5): - resolution: {integrity: sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==} + /@typescript-eslint/type-utils@7.11.0(eslint@9.4.0)(typescript@5.4.5): + resolution: {integrity: sha512-WmppUEgYy+y1NTseNMJ6mCFxt03/7jTOy08bcg7bxJJdsM4nuhnchyBbE8vryveaJUf62noH7LodPSo5Z0WUCg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1511,23 +1529,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.9.0(eslint@9.3.0)(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.11.0(eslint@9.4.0)(typescript@5.4.5) debug: 4.3.4 - eslint: 9.3.0 + eslint: 9.4.0 ts-api-utils: 1.3.0(typescript@5.4.5) typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/types@7.9.0: - resolution: {integrity: sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==} + /@typescript-eslint/types@7.11.0: + resolution: {integrity: sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==} engines: {node: ^18.18.0 || >=20.0.0} dev: false - /@typescript-eslint/typescript-estree@7.9.0(typescript@5.4.5): - resolution: {integrity: sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==} + /@typescript-eslint/typescript-estree@7.11.0(typescript@5.4.5): + resolution: {integrity: sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -1535,8 +1553,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/visitor-keys': 7.9.0 + '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/visitor-keys': 7.11.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -1548,27 +1566,27 @@ packages: - supports-color dev: false - /@typescript-eslint/utils@7.9.0(eslint@9.3.0)(typescript@5.4.5): - resolution: {integrity: sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==} + /@typescript-eslint/utils@7.11.0(eslint@9.4.0)(typescript@5.4.5): + resolution: {integrity: sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.3.0) - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) - eslint: 9.3.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) + '@typescript-eslint/scope-manager': 7.11.0 + '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5) + eslint: 9.4.0 transitivePeerDependencies: - supports-color - typescript dev: false - /@typescript-eslint/visitor-keys@7.9.0: - resolution: {integrity: sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==} + /@typescript-eslint/visitor-keys@7.11.0: + resolution: {integrity: sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/types': 7.11.0 eslint-visitor-keys: 3.4.3 dev: false @@ -1741,17 +1759,17 @@ packages: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} dev: false - /babel-jest@30.0.0-alpha.4(@babel/core@7.24.5): - resolution: {integrity: sha512-Fvi4Mg3VqFaIapJ7t6FHHH+GWUGysQtHIzy3gSXlG1TwmAhxjvOGfcJzWoma7cNBEvjgZE+MIr1Ub2Tpxp7qtw==} + /babel-jest@30.0.0-alpha.5(@babel/core@7.24.6): + resolution: {integrity: sha512-58KT2/OgHBdfOmM7FdDmWWVKrvrHborUpNys/tu0nnlTyfAqB/lRvqOGN4y8JFe6q9pdTf2AzxU5prFTDbxVMg==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} peerDependencies: '@babel/core': ^7.11.0 dependencies: - '@babel/core': 7.24.5 - '@jest/transform': 30.0.0-alpha.4 + '@babel/core': 7.24.6 + '@jest/transform': 30.0.0-alpha.5 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 30.0.0-alpha.4(@babel/core@7.24.5) + babel-preset-jest: 30.0.0-alpha.5(@babel/core@7.24.6) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -1763,7 +1781,7 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.6 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -1772,52 +1790,52 @@ packages: - supports-color dev: true - /babel-plugin-jest-hoist@30.0.0-alpha.4: - resolution: {integrity: sha512-VN6UBGa+rFMyLoEpMfhi59ryOQWp+RFCWAr3Vt3TLhPEVxFxP2BruYxyBBa3TtHfHIyz0YIL1FdCvRj5BA7NOQ==} + /babel-plugin-jest-hoist@30.0.0-alpha.5: + resolution: {integrity: sha512-Vx32ynouoDRR85S3giKaEfYrZ3Nc73XfCITi4EftNQ16cY/jOPyldrJHIwye79WjTIUj/+bhVgBRZALDYx+Ncw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.5): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.6): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.5 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.5) + '@babel/core': 7.24.6 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.6) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.6) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.6) dev: true - /babel-preset-jest@30.0.0-alpha.4(@babel/core@7.24.5): - resolution: {integrity: sha512-/AhJ06+KEaf1ZvzWJvHSosyk64BKKMj6/gDHE1MwvHFb7AoQI0JHsCp6Hyjsr7k8tQ+w17VAst9HCQ1Wz0Cp+A==} + /babel-preset-jest@30.0.0-alpha.5(@babel/core@7.24.6): + resolution: {integrity: sha512-LmoEZClo/Bk87e7g7PTJq25Ote7Bjw/M0AgvPJHz7yc6OGN5cEasP5Ovew8A5RgAGvO39HfWE2R+p5fol8lAhQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} peerDependencies: '@babel/core': ^7.11.0 dependencies: - '@babel/core': 7.24.5 - babel-plugin-jest-hoist: 30.0.0-alpha.4 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.5) + '@babel/core': 7.24.6 + babel-plugin-jest-hoist: 30.0.0-alpha.5 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.6) dev: true /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /bare-events@2.2.2: - resolution: {integrity: sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==} + /bare-events@2.3.1: + resolution: {integrity: sha512-sJnSOTVESURZ61XgEleqmP255T6zTYwHPwE4r6SssIh0U9/uDvfpdoJYpVUerJJZH2fueO+CdT8ZT+OC/7aZDA==} requiresBuild: true dev: false optional: true @@ -1837,19 +1855,19 @@ packages: dependencies: balanced-match: 1.0.2 - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 /browserslist@4.23.0: resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001620 - electron-to-chromium: 1.4.774 + caniuse-lite: 1.0.30001625 + electron-to-chromium: 1.4.786 node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.0) dev: true @@ -1913,8 +1931,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001620: - resolution: {integrity: sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==} + /caniuse-lite@1.0.30001625: + resolution: {integrity: sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==} dev: true /chalk@2.4.2: @@ -2085,8 +2103,8 @@ packages: engines: {node: '>=8'} dev: true - /diff-sequences@30.0.0-alpha.4: - resolution: {integrity: sha512-6QR1dEtY+srnwESRY+gE9ZwU67/widIC4OUkPusHMiF+MBg161VemMnCS1TAMJqj8ILH75LYdUYprTj/OtW6bw==} + /diff-sequences@30.0.0-alpha.5: + resolution: {integrity: sha512-zztnoTBNChfe30emTHZw382eoMZlTWS/t4R88HU2UCmiw38dlgTwglI+xqaUhZiEg/CnA20ZRVBaBIio3TazIw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dev: true @@ -2108,8 +2126,8 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /electron-to-chromium@1.4.774: - resolution: {integrity: sha512-132O1XCd7zcTkzS3FgkAzKmnBuNJjK8WjcTtNuoylj7MYbqw5eXehjQ5OK91g0zm7OTKIPeaAG4CPoRfD9M1Mg==} + /electron-to-chromium@1.4.786: + resolution: {integrity: sha512-i/A2UB0sxYViMN0M2zIotQFRIOt1jLuVXudACHBDiJ5gGuAUzf/crZxwlBTdA0O52Hy4CNtTzS7AKRAacs/08Q==} dev: true /emittery@0.13.1: @@ -2164,21 +2182,22 @@ packages: resolve: 1.22.8 dev: false - /eslint-plugin-import-x@0.5.0(eslint@9.3.0)(typescript@5.4.5): - resolution: {integrity: sha512-C7R8Z4IzxmsoOPMtSzwuOBW5FH6iRlxHR6iTks+MzVlrk3r3TUxokkWTx3ypdj9nGOEP+CG/5e6ebZzHbxgbbQ==} + /eslint-plugin-import-x@0.5.1(eslint@9.4.0)(typescript@5.4.5): + resolution: {integrity: sha512-2JK8bbFOLes+gG6tgdnM8safCxMAj4u2wjX8X1BRFPfnY7Ct2hFYESoIcVwABX/DDcdpQFLGtKmzbNEWJZD9iQ==} engines: {node: '>=16'} peerDependencies: eslint: ^8.56.0 || ^9.0.0-0 dependencies: - '@typescript-eslint/utils': 7.9.0(eslint@9.3.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.11.0(eslint@9.4.0)(typescript@5.4.5) debug: 4.3.4 doctrine: 3.0.0 - eslint: 9.3.0 + eslint: 9.4.0 eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.7.5 is-glob: 4.0.3 minimatch: 9.0.4 semver: 7.6.2 + tslib: 2.6.2 transitivePeerDependencies: - supports-color - typescript @@ -2202,16 +2221,16 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: false - /eslint@9.3.0: - resolution: {integrity: sha512-5Iv4CsZW030lpUqHBapdPo3MJetAPtejVW8B84GIcIIv8+ohFaddXsrn1Gn8uD9ijDb+kcYKFUVmC8qG8B2ORQ==} + /eslint@9.4.0: + resolution: {integrity: sha512-sjc7Y8cUD1IlwYcTS9qPSvGjAC8Ne9LctpxKKu3x/1IC9bnOg98Zy6GxEJUfr1NojMgVPlyANXYns8oE2c1TAA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.3.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) '@eslint-community/regexpp': 4.10.0 + '@eslint/config-array': 0.15.1 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.3.0 - '@humanwhocodes/config-array': 0.13.0 + '@eslint/js': 9.4.0 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 @@ -2304,15 +2323,15 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /expect@30.0.0-alpha.4: - resolution: {integrity: sha512-guMgaAoWGTUWs8GtSut0TmN0gvZ7ne64ZJjdHtl56GlzAs2rFJ9zgzzBc8FLv1SLSgy/rdZLOlBBETZEL8f5Bw==} + /expect@30.0.0-alpha.5: + resolution: {integrity: sha512-8hBXtSCQuJnZFOUAAiih2GYDRg93h2Ui6XL9BPu6QgSvlSozTLCtCyDsNPq7aL0D43H5uYHwqXiVfWW6MIlJhw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/expect-utils': 30.0.0-alpha.4 - jest-get-type: 30.0.0-alpha.4 - jest-matcher-utils: 30.0.0-alpha.4 - jest-message-util: 30.0.0-alpha.4 - jest-util: 30.0.0-alpha.4 + '@jest/expect-utils': 30.0.0-alpha.5 + jest-get-type: 30.0.0-alpha.5 + jest-matcher-utils: 30.0.0-alpha.5 + jest-message-util: 30.0.0-alpha.5 + jest-util: 30.0.0-alpha.5 dev: true /ext-list@2.2.2: @@ -2346,7 +2365,7 @@ packages: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.7 dev: false /fast-json-stable-stringify@2.1.0: @@ -2412,8 +2431,8 @@ packages: trim-repeated: 2.0.0 dev: false - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 @@ -2529,20 +2548,21 @@ packages: is-glob: 4.0.3 dev: false - /glob@10.3.15: - resolution: {integrity: sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==} + /glob@10.4.1: + resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} engines: {node: '>=16 || 14 >=14.18'} hasBin: true dependencies: foreground-child: 3.1.1 - jackspeak: 2.3.6 + jackspeak: 3.1.2 minimatch: 9.0.4 - minipass: 7.1.1 + minipass: 7.1.2 path-scurry: 1.11.1 dev: true /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -2666,6 +2686,7 @@ packages: /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. dependencies: once: 1.4.0 wrappy: 1.0.2 @@ -2752,8 +2773,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.24.5 - '@babel/parser': 7.24.5 + '@babel/core': 7.24.6 + '@babel/parser': 7.24.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -2765,8 +2786,8 @@ packages: resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.24.5 - '@babel/parser': 7.24.5 + '@babel/core': 7.24.6 + '@babel/parser': 7.24.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.6.2 @@ -2802,8 +2823,8 @@ packages: istanbul-lib-report: 3.0.1 dev: true - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + /jackspeak@3.1.2: + resolution: {integrity: sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==} engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 @@ -2811,36 +2832,36 @@ packages: '@pkgjs/parseargs': 0.11.0 dev: true - /jest-changed-files@30.0.0-alpha.4: - resolution: {integrity: sha512-GZsW7ctDaXXuA7kQNUJJKiY5KZJVr1Fj1wHNvczaJZ3JdzipP/43uR2sYRDMZUC9EyAQYHM43RW7aAtK0UrEGw==} + /jest-changed-files@30.0.0-alpha.5: + resolution: {integrity: sha512-B6GjanWozUsg3tho2CFo4JYZ3iqMOdXexOEre1CQHTUecwAH3uNm9aIy4E1QTX41xEGEbPdBq7b1SHZKe6yPkg==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: execa: 5.1.1 - jest-util: 30.0.0-alpha.4 + jest-util: 30.0.0-alpha.5 p-limit: 3.1.0 dev: true - /jest-circus@30.0.0-alpha.4: - resolution: {integrity: sha512-QVnLnxfUKYsrZEraKmVMsE6rvDMVYjxZGtQDG8JIRm1xa3s8h0HcBgXCg+lH0vBsrvrpLuz8dZU7wjM1oQ/y0Q==} + /jest-circus@30.0.0-alpha.5: + resolution: {integrity: sha512-ENNme2MvQc7WZ7EvcJclSV+MI7cLQzTXY/727Fwy3EojewKYXH8aPeZsnKssI2T3kdnjqTb/8uXryMX5IznuEg==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/environment': 30.0.0-alpha.4 - '@jest/expect': 30.0.0-alpha.4 - '@jest/test-result': 30.0.0-alpha.4 - '@jest/types': 30.0.0-alpha.4 - '@types/node': 20.12.12 + '@jest/environment': 30.0.0-alpha.5 + '@jest/expect': 30.0.0-alpha.5 + '@jest/test-result': 30.0.0-alpha.5 + '@jest/types': 30.0.0-alpha.5 + '@types/node': 20.13.0 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 is-generator-fn: 2.1.0 - jest-each: 30.0.0-alpha.4 - jest-matcher-utils: 30.0.0-alpha.4 - jest-message-util: 30.0.0-alpha.4 - jest-runtime: 30.0.0-alpha.4 - jest-snapshot: 30.0.0-alpha.4 - jest-util: 30.0.0-alpha.4 + jest-each: 30.0.0-alpha.5 + jest-matcher-utils: 30.0.0-alpha.5 + jest-message-util: 30.0.0-alpha.5 + jest-runtime: 30.0.0-alpha.5 + jest-snapshot: 30.0.0-alpha.5 + jest-util: 30.0.0-alpha.5 p-limit: 3.1.0 - pretty-format: 30.0.0-alpha.4 + pretty-format: 30.0.0-alpha.5 pure-rand: 6.1.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -2849,8 +2870,8 @@ packages: - supports-color dev: true - /jest-cli@30.0.0-alpha.4(@types/node@20.12.12): - resolution: {integrity: sha512-GoXlVJ7UU6MuWjFjAJqHFvO/tzRKpQgw08XFaqtNiLzPHtXK4Spi0tkBcr8M98NhUYYPGYSFwO7nevymp0OmYQ==} + /jest-cli@30.0.0-alpha.5(@types/node@20.13.0): + resolution: {integrity: sha512-1POf1608rIeein/m7rarK5grGZGQEhAtRolcKM+qKtvYrJ8O7Cj6Siig0fAadqT0LCRHMgwaU2o6JPewORmMyw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} hasBin: true peerDependencies: @@ -2859,15 +2880,15 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 30.0.0-alpha.4 - '@jest/test-result': 30.0.0-alpha.4 - '@jest/types': 30.0.0-alpha.4 + '@jest/core': 30.0.0-alpha.5 + '@jest/test-result': 30.0.0-alpha.5 + '@jest/types': 30.0.0-alpha.5 chalk: 4.1.2 exit: 0.1.2 import-local: 3.1.0 - jest-config: 30.0.0-alpha.4(@types/node@20.12.12) - jest-util: 30.0.0-alpha.4 - jest-validate: 30.0.0-alpha.4 + jest-config: 30.0.0-alpha.5(@types/node@20.13.0) + jest-util: 30.0.0-alpha.5 + jest-validate: 30.0.0-alpha.5 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -2876,8 +2897,8 @@ packages: - ts-node dev: true - /jest-config@30.0.0-alpha.4(@types/node@20.12.12): - resolution: {integrity: sha512-/iiSwQ+jv5NUimEKzD1BL1zn0rWiVNbRamkFxGwL+xm9J1SKkHL8jEHY0ioim2iymJfsEliUjayY80o16r1sNA==} + /jest-config@30.0.0-alpha.5(@types/node@20.13.0): + resolution: {integrity: sha512-nczn/2mp3+j4pO5wT/fT9l7PY1nFdQZkvskFxsjdlKHP0anDK0i3zZTzVpNpdOqA/lX5lncVedzj2yPzWtv1tQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} peerDependencies: '@types/node': '*' @@ -2888,27 +2909,28 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.24.5 - '@jest/test-sequencer': 30.0.0-alpha.4 - '@jest/types': 30.0.0-alpha.4 - '@types/node': 20.12.12 - babel-jest: 30.0.0-alpha.4(@babel/core@7.24.5) + '@babel/core': 7.24.6 + '@jest/pattern': 30.0.0-alpha.5 + '@jest/test-sequencer': 30.0.0-alpha.5 + '@jest/types': 30.0.0-alpha.5 + '@types/node': 20.13.0 + babel-jest: 30.0.0-alpha.5(@babel/core@7.24.6) chalk: 4.1.2 ci-info: 4.0.0 deepmerge: 4.3.1 - glob: 10.3.15 + glob: 10.4.1 graceful-fs: 4.2.11 - jest-circus: 30.0.0-alpha.4 - jest-environment-node: 30.0.0-alpha.4 - jest-get-type: 30.0.0-alpha.4 - jest-regex-util: 30.0.0-alpha.4 - jest-resolve: 30.0.0-alpha.4 - jest-runner: 30.0.0-alpha.4 - jest-util: 30.0.0-alpha.4 - jest-validate: 30.0.0-alpha.4 - micromatch: 4.0.5 + jest-circus: 30.0.0-alpha.5 + jest-environment-node: 30.0.0-alpha.5 + jest-get-type: 30.0.0-alpha.5 + jest-regex-util: 30.0.0-alpha.5 + jest-resolve: 30.0.0-alpha.5 + jest-runner: 30.0.0-alpha.5 + jest-util: 30.0.0-alpha.5 + jest-validate: 30.0.0-alpha.5 + micromatch: 4.0.7 parse-json: 5.2.0 - pretty-format: 30.0.0-alpha.4 + pretty-format: 30.0.0-alpha.5 slash: 3.0.0 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -2916,112 +2938,112 @@ packages: - supports-color dev: true - /jest-diff@30.0.0-alpha.4: - resolution: {integrity: sha512-64Tz+2s1d9xY1+WfR1s70z6JydNqNxD6TIwUMyUsrPqWOwaouGPzJyJbS3eYTI+9Sqkuptk6sNC3nPDbIQrSMA==} + /jest-diff@30.0.0-alpha.5: + resolution: {integrity: sha512-IX4X/Ubh3LmlsL5iFUUpYNvGsO+Il1tgu7HFdlrRFEIr0WbpAittobjIQJpoE2PJZbJ8oenxilcVyFjx0tZXNg==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: chalk: 4.1.2 - diff-sequences: 30.0.0-alpha.4 - jest-get-type: 30.0.0-alpha.4 - pretty-format: 30.0.0-alpha.4 + diff-sequences: 30.0.0-alpha.5 + jest-get-type: 30.0.0-alpha.5 + pretty-format: 30.0.0-alpha.5 dev: true - /jest-docblock@30.0.0-alpha.4: - resolution: {integrity: sha512-3X7UlE3VW40oZDjdtQuznLIVCNpCt1cNUV0bm/c+gzkQjccyqiSNCKlGkjDCWhhhzsWbEu3GZidkQAKvTXXRMg==} + /jest-docblock@30.0.0-alpha.5: + resolution: {integrity: sha512-P3BGGmZ7z0pyD1mgVRzsfMmjyj+zpn839p/y44tRS8k50Fg+NCL5qUoKHjDLAUnLHcwQxFfk8nrqraebphHfZA==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: detect-newline: 3.1.0 dev: true - /jest-each@30.0.0-alpha.4: - resolution: {integrity: sha512-69AtAHAR+E8pMAizBU3ge0AxZFXOKsfsiXmSRox9HTETa19NDhjbUU+fWwkkFn+pSjQlucIlkmenwIPV7Ifk6Q==} + /jest-each@30.0.0-alpha.5: + resolution: {integrity: sha512-7a+NZmWFU5oPYjon0uG76rDLMVK2TKrrMZOBtROE3nnnrXuwp5TMKqMV8xpX3I8q7qJA/IIoW7EzFnR/XhnzzQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/types': 30.0.0-alpha.4 + '@jest/types': 30.0.0-alpha.5 chalk: 4.1.2 - jest-get-type: 30.0.0-alpha.4 - jest-util: 30.0.0-alpha.4 - pretty-format: 30.0.0-alpha.4 + jest-get-type: 30.0.0-alpha.5 + jest-util: 30.0.0-alpha.5 + pretty-format: 30.0.0-alpha.5 dev: true - /jest-environment-node@30.0.0-alpha.4: - resolution: {integrity: sha512-uf0r6hoGDrFDMxihJpUXJlsZsFhgis+8XlAw/BYhBDce1SYDc4az7kybSgLNZd7BhgRfuFf/EPGbTqSItETkcg==} + /jest-environment-node@30.0.0-alpha.5: + resolution: {integrity: sha512-UzHsz+aarw8e2+JVvpFA1Qi+2Az/nfCcvgir9nP/JvHRqM+I6wG8LLGhpihp1nraYtmhwu5+kxGbEjOe0UYMgg==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/environment': 30.0.0-alpha.4 - '@jest/fake-timers': 30.0.0-alpha.4 - '@jest/types': 30.0.0-alpha.4 - '@types/node': 20.12.12 - jest-mock: 30.0.0-alpha.4 - jest-util: 30.0.0-alpha.4 + '@jest/environment': 30.0.0-alpha.5 + '@jest/fake-timers': 30.0.0-alpha.5 + '@jest/types': 30.0.0-alpha.5 + '@types/node': 20.13.0 + jest-mock: 30.0.0-alpha.5 + jest-util: 30.0.0-alpha.5 dev: true - /jest-get-type@30.0.0-alpha.4: - resolution: {integrity: sha512-FOuIavT3Gn4O+AWVNeMMlxtcLP57RdTLdip1T+3Hgz8grSoQR0sshhhUqnDBGbpYqffPR5EJWxApIa7tVR8JtA==} + /jest-get-type@30.0.0-alpha.5: + resolution: {integrity: sha512-ARPyHe90hG5fJH7nkxnmSCIUpeCIJcsGAUA2+a0MwptFfNJKBOYpkq/SnFaS7i994R50E4n9Beq8kUC2vVVVkw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dev: true - /jest-haste-map@30.0.0-alpha.4: - resolution: {integrity: sha512-lnomPxgLWMK6xSkG+QWEcDwrf7jgf8/cw9MX5cTYF5EPGsxZGgc7jYj3I2ciJdRTwk3FOiAxRng/BtY1yQt28w==} + /jest-haste-map@30.0.0-alpha.5: + resolution: {integrity: sha512-9wCSxvqItNAiXfzEf7zuYG0mcmDCFKnkrneH0M60aDfnsQ5B4dHjs4UHcjtUJiM1txWMCa2fjTvNUP4RhwaGnQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/types': 30.0.0-alpha.4 - '@types/node': 20.12.12 + '@jest/types': 30.0.0-alpha.5 + '@types/node': 20.13.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 - jest-regex-util: 30.0.0-alpha.4 - jest-util: 30.0.0-alpha.4 - jest-worker: 30.0.0-alpha.4 - micromatch: 4.0.5 + jest-regex-util: 30.0.0-alpha.5 + jest-util: 30.0.0-alpha.5 + jest-worker: 30.0.0-alpha.5 + micromatch: 4.0.7 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 dev: true - /jest-leak-detector@30.0.0-alpha.4: - resolution: {integrity: sha512-vTdkvX49K5R0Dybliz2acVmI1hbfYfgvWHUULs63FCT08Mw6Q8GvGRQiaEg3DZf01MYO6Ta7/HlVedHwpK7lxw==} + /jest-leak-detector@30.0.0-alpha.5: + resolution: {integrity: sha512-GTvYhmVSWajONNYHy6XsEjXbz/d97kmyn9JLzT5Cdlzxftwx1j/1c6HrTIYTQPC1JnYoVty5GQRMZilXgSi5kA==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - jest-get-type: 30.0.0-alpha.4 - pretty-format: 30.0.0-alpha.4 + jest-get-type: 30.0.0-alpha.5 + pretty-format: 30.0.0-alpha.5 dev: true - /jest-matcher-utils@30.0.0-alpha.4: - resolution: {integrity: sha512-4MsfeVfMm0cEhBdG3YR88DaGp4oO35sm4eV76O4GtFwLMZ0424atTv9AlAz6SqM3hUTn97oYWFDGzCw4BmUEfQ==} + /jest-matcher-utils@30.0.0-alpha.5: + resolution: {integrity: sha512-VYGnROjw1x18rplUzGhccox9AynqQDQgDyhCzAQXmilDlk+quGt6J+sURa7kGwcVcZO+nF/ICGHphrcAvavMqA==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: chalk: 4.1.2 - jest-diff: 30.0.0-alpha.4 - jest-get-type: 30.0.0-alpha.4 - pretty-format: 30.0.0-alpha.4 + jest-diff: 30.0.0-alpha.5 + jest-get-type: 30.0.0-alpha.5 + pretty-format: 30.0.0-alpha.5 dev: true - /jest-message-util@30.0.0-alpha.4: - resolution: {integrity: sha512-vuLWsT/6VM3PP9jLjsQ2AJMSWRZaskKyUFZtjFSk35HJKzyiB8Grgt+TqFMreHxLpG2ucyrkHX0fWq5n9wNMWw==} + /jest-message-util@30.0.0-alpha.5: + resolution: {integrity: sha512-adNjtJLdcE0r1AlaV/9sSwBm6cT6c8/CdHE6IMTEIItvn/6+eSACom0ZaYVUkz8mCdE87DVp4E9JaI7CyfybNw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@babel/code-frame': 7.24.2 - '@jest/types': 30.0.0-alpha.4 + '@babel/code-frame': 7.24.6 + '@jest/types': 30.0.0-alpha.5 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 30.0.0-alpha.4 + micromatch: 4.0.7 + pretty-format: 30.0.0-alpha.5 slash: 3.0.0 stack-utils: 2.0.6 dev: true - /jest-mock@30.0.0-alpha.4: - resolution: {integrity: sha512-l9VpP6MaYEhxr3ChZt3SqwRcxUklMQWXtMc5tOmFxQVg+Q11hDyNaw2jNC7Cfke6uQmG3fDJKGoZ65PCQfGmSg==} + /jest-mock@30.0.0-alpha.5: + resolution: {integrity: sha512-n+KPnCMJOs+W4mhIQzaO0wVJiAbGDH/HMqa/Hq8V/QLNKNzCF9jqN+DHVn3OKmizyjX7fQmp/fg0SVHQTh/SCw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/types': 30.0.0-alpha.4 - '@types/node': 20.12.12 - jest-util: 30.0.0-alpha.4 + '@jest/types': 30.0.0-alpha.5 + '@types/node': 20.13.0 + jest-util: 30.0.0-alpha.5 dev: true - /jest-pnp-resolver@1.2.3(jest-resolve@30.0.0-alpha.4): + /jest-pnp-resolver@1.2.3(jest-resolve@30.0.0-alpha.5): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -3030,121 +3052,121 @@ packages: jest-resolve: optional: true dependencies: - jest-resolve: 30.0.0-alpha.4 + jest-resolve: 30.0.0-alpha.5 dev: true - /jest-regex-util@30.0.0-alpha.4: - resolution: {integrity: sha512-smK/jzd6Cgc8iMbBw0tsG0lnPJ2ue9u+h1c7uckyWHZh1MwwAq9PRf7qVQ6ys2//r5104bGWgb8q646iR8pROw==} + /jest-regex-util@30.0.0-alpha.5: + resolution: {integrity: sha512-b8LtZJTG17X/1Hm+s2A+YOh3pJbBoOV/K91N2Pl29MjcwsKwwlOUjkeY2GJwid+Z8kFZ7cbLYadDI7YCV+YEOA==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dev: true - /jest-resolve-dependencies@30.0.0-alpha.4: - resolution: {integrity: sha512-5utfwCU0BV/tht+fvtGQdpYlQw50napCRCy0c7soJwh/Ei0ebJpLX+w73SvmjzqIHNfEAYxcGJKW5BfdLEUcMQ==} + /jest-resolve-dependencies@30.0.0-alpha.5: + resolution: {integrity: sha512-9urYvTflJ2+rnZHbI71gBUXpqIrB/G9OxUybzrw1IJML6jc88pbvE/b5xz1+G2TI4pygEbALRhHGAdw/k1e6+g==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - jest-regex-util: 30.0.0-alpha.4 - jest-snapshot: 30.0.0-alpha.4 + jest-regex-util: 30.0.0-alpha.5 + jest-snapshot: 30.0.0-alpha.5 transitivePeerDependencies: - supports-color dev: true - /jest-resolve@30.0.0-alpha.4: - resolution: {integrity: sha512-Cv0kbbqbqJqHN2ygLwWECVHpk2XLe5eLoMnngeihRniWMdkcP9kaJHOctzwWhLgQgA0J0qb8FHxyFTv05fOdiA==} + /jest-resolve@30.0.0-alpha.5: + resolution: {integrity: sha512-tuAhahDAPeMzYJDA0FoJV2kXdKWTueLTohy2vPJRp3Xk9eyHwVNxtsB5QwQv/4FWQ3xto9mfGW0F+8RzRAtFkQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 30.0.0-alpha.4 - jest-pnp-resolver: 1.2.3(jest-resolve@30.0.0-alpha.4) - jest-util: 30.0.0-alpha.4 - jest-validate: 30.0.0-alpha.4 + jest-haste-map: 30.0.0-alpha.5 + jest-pnp-resolver: 1.2.3(jest-resolve@30.0.0-alpha.5) + jest-util: 30.0.0-alpha.5 + jest-validate: 30.0.0-alpha.5 resolve: 1.22.8 resolve.exports: 2.0.2 slash: 3.0.0 dev: true - /jest-runner@30.0.0-alpha.4: - resolution: {integrity: sha512-iJnbF0YZsuijwscEMaly91URBcXueY0+BtWjs/WmJMV6cNxqvgCG5i5euBhupQDV4LjAfVboXve0MNCSDFBlrg==} + /jest-runner@30.0.0-alpha.5: + resolution: {integrity: sha512-w85S1WNna31g/vHpfS5vGDkSEjZGv8YIJUclieJpcbEHZSg5vSs9VlbnMo4N8f5oYYm0TzxBfkcL4JKyIojnWw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/console': 30.0.0-alpha.4 - '@jest/environment': 30.0.0-alpha.4 - '@jest/test-result': 30.0.0-alpha.4 - '@jest/transform': 30.0.0-alpha.4 - '@jest/types': 30.0.0-alpha.4 - '@types/node': 20.12.12 + '@jest/console': 30.0.0-alpha.5 + '@jest/environment': 30.0.0-alpha.5 + '@jest/test-result': 30.0.0-alpha.5 + '@jest/transform': 30.0.0-alpha.5 + '@jest/types': 30.0.0-alpha.5 + '@types/node': 20.13.0 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 - jest-docblock: 30.0.0-alpha.4 - jest-environment-node: 30.0.0-alpha.4 - jest-haste-map: 30.0.0-alpha.4 - jest-leak-detector: 30.0.0-alpha.4 - jest-message-util: 30.0.0-alpha.4 - jest-resolve: 30.0.0-alpha.4 - jest-runtime: 30.0.0-alpha.4 - jest-util: 30.0.0-alpha.4 - jest-watcher: 30.0.0-alpha.4 - jest-worker: 30.0.0-alpha.4 + jest-docblock: 30.0.0-alpha.5 + jest-environment-node: 30.0.0-alpha.5 + jest-haste-map: 30.0.0-alpha.5 + jest-leak-detector: 30.0.0-alpha.5 + jest-message-util: 30.0.0-alpha.5 + jest-resolve: 30.0.0-alpha.5 + jest-runtime: 30.0.0-alpha.5 + jest-util: 30.0.0-alpha.5 + jest-watcher: 30.0.0-alpha.5 + jest-worker: 30.0.0-alpha.5 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color dev: true - /jest-runtime@30.0.0-alpha.4: - resolution: {integrity: sha512-eyMzZ06j+Ni+aA7NEzWna5nmPOcYuNPuYsq8TqkunidKgljlslexOpdBVgMAsMMz/mV/P/f8u18AJEjjxL7gEw==} + /jest-runtime@30.0.0-alpha.5: + resolution: {integrity: sha512-u49zkJUaWV11sFtIFCOpOPhT2WDEYBjWiQ2vkiIZ+CqkWjjAdojnEJKwU9lVabUNo4JlKOBhbYpXaJyFak0EaQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/environment': 30.0.0-alpha.4 - '@jest/fake-timers': 30.0.0-alpha.4 - '@jest/globals': 30.0.0-alpha.4 - '@jest/source-map': 30.0.0-alpha.4 - '@jest/test-result': 30.0.0-alpha.4 - '@jest/transform': 30.0.0-alpha.4 - '@jest/types': 30.0.0-alpha.4 - '@types/node': 20.12.12 + '@jest/environment': 30.0.0-alpha.5 + '@jest/fake-timers': 30.0.0-alpha.5 + '@jest/globals': 30.0.0-alpha.5 + '@jest/source-map': 30.0.0-alpha.5 + '@jest/test-result': 30.0.0-alpha.5 + '@jest/transform': 30.0.0-alpha.5 + '@jest/types': 30.0.0-alpha.5 + '@types/node': 20.13.0 chalk: 4.1.2 cjs-module-lexer: 1.3.1 collect-v8-coverage: 1.0.2 - glob: 10.3.15 + glob: 10.4.1 graceful-fs: 4.2.11 - jest-haste-map: 30.0.0-alpha.4 - jest-message-util: 30.0.0-alpha.4 - jest-mock: 30.0.0-alpha.4 - jest-regex-util: 30.0.0-alpha.4 - jest-resolve: 30.0.0-alpha.4 - jest-snapshot: 30.0.0-alpha.4 - jest-util: 30.0.0-alpha.4 + jest-haste-map: 30.0.0-alpha.5 + jest-message-util: 30.0.0-alpha.5 + jest-mock: 30.0.0-alpha.5 + jest-regex-util: 30.0.0-alpha.5 + jest-resolve: 30.0.0-alpha.5 + jest-snapshot: 30.0.0-alpha.5 + jest-util: 30.0.0-alpha.5 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color dev: true - /jest-snapshot@30.0.0-alpha.4: - resolution: {integrity: sha512-1PrpjOk77Tha7jD5cHA0Dn0rdGgQG95wuMosS98EwpF3UeHDPvoaeBcVIxLFH7N+MHCZUnKoIxALCVm61lGzSA==} + /jest-snapshot@30.0.0-alpha.5: + resolution: {integrity: sha512-XMAnYEAgehvxNu+Hb+fJFf725XKp7WjbaWaPFpUJaxBXx/dGYCvyZxT+zONU6WbeYAguhQ33HeTxH3uAPAfhUw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.5) - '@babel/types': 7.24.5 - '@jest/expect-utils': 30.0.0-alpha.4 - '@jest/transform': 30.0.0-alpha.4 - '@jest/types': 30.0.0-alpha.4 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.5) + '@babel/core': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-syntax-typescript': 7.24.6(@babel/core@7.24.6) + '@babel/types': 7.24.6 + '@jest/expect-utils': 30.0.0-alpha.5 + '@jest/snapshot-utils': 30.0.0-alpha.5 + '@jest/transform': 30.0.0-alpha.5 + '@jest/types': 30.0.0-alpha.5 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.6) chalk: 4.1.2 - expect: 30.0.0-alpha.4 + expect: 30.0.0-alpha.5 graceful-fs: 4.2.11 - jest-diff: 30.0.0-alpha.4 - jest-get-type: 30.0.0-alpha.4 - jest-matcher-utils: 30.0.0-alpha.4 - jest-message-util: 30.0.0-alpha.4 - jest-util: 30.0.0-alpha.4 - natural-compare: 1.4.0 - pretty-format: 30.0.0-alpha.4 + jest-diff: 30.0.0-alpha.5 + jest-get-type: 30.0.0-alpha.5 + jest-matcher-utils: 30.0.0-alpha.5 + jest-message-util: 30.0.0-alpha.5 + jest-util: 30.0.0-alpha.5 + pretty-format: 30.0.0-alpha.5 semver: 7.6.2 synckit: 0.9.0 transitivePeerDependencies: @@ -3156,64 +3178,63 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.12 + '@types/node': 20.13.0 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 dev: true - /jest-util@30.0.0-alpha.4: - resolution: {integrity: sha512-4puZaMXBWhuZHcMwNUkYtVjzfjo2T4HQ68BtqRsqj4+fmRZci0Btz5r2qoiGys/HgxmfFd1PtEmVc7mOnY2BlA==} + /jest-util@30.0.0-alpha.5: + resolution: {integrity: sha512-sWme530oJ6RXgXSgORZqV0YnPaG/Mb+VM8EJxr2AMOwc6YS63KDGI/NKT1M+rfFDD+U9VU3IBpnkEo5Ywi8LjQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/types': 30.0.0-alpha.4 - '@types/node': 20.12.12 + '@jest/types': 30.0.0-alpha.5 + '@types/node': 20.13.0 chalk: 4.1.2 ci-info: 4.0.0 graceful-fs: 4.2.11 - jest-regex-util: 30.0.0-alpha.4 picomatch: 4.0.2 dev: true - /jest-validate@30.0.0-alpha.4: - resolution: {integrity: sha512-oQhYEZeQAAhneoKKq4q5XDCrMG7iXCXPaRIOVB/g/AwRxeRVD/q9owjHWbeuiC/QIybEtLG82PpB7Ckv+ugFHg==} + /jest-validate@30.0.0-alpha.5: + resolution: {integrity: sha512-Xy2X/q2SGx1YYHBZ7XE4k0cNHpvCsW45TI1QngVxzNpnbl+VUgIGb+YTc/EnKFckQj13w9ReMVQwqZViSjSB/g==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/types': 30.0.0-alpha.4 + '@jest/types': 30.0.0-alpha.5 camelcase: 6.3.0 chalk: 4.1.2 - jest-get-type: 30.0.0-alpha.4 + jest-get-type: 30.0.0-alpha.5 leven: 3.1.0 - pretty-format: 30.0.0-alpha.4 + pretty-format: 30.0.0-alpha.5 dev: true - /jest-watcher@30.0.0-alpha.4: - resolution: {integrity: sha512-BSIF4lklBvNMRu+VyuoPfgvBmA8XBqmX6Y9pi6GQCHOrKhcUvTjSpiy7eLnhhaawpDkYYUuioaH4szDaYH/hlw==} + /jest-watcher@30.0.0-alpha.5: + resolution: {integrity: sha512-TFzV/GtI3tA4ab0IP2HZyaZ7skMS1yu2HmLfznAjhFixZpdkA3zsRevH5nX0YZo+2zAO/jgrJoXdWH8OexjMug==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/test-result': 30.0.0-alpha.4 - '@jest/types': 30.0.0-alpha.4 - '@types/node': 20.12.12 + '@jest/test-result': 30.0.0-alpha.5 + '@jest/types': 30.0.0-alpha.5 + '@types/node': 20.13.0 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 30.0.0-alpha.4 + jest-util: 30.0.0-alpha.5 string-length: 4.0.2 dev: true - /jest-worker@30.0.0-alpha.4: - resolution: {integrity: sha512-01gbBNwDRU3VTZXW8H/TuD0+FkTo/f4huMsbJskL4CkYe6Bylze4aAsezRNZPEcxHn6lnlk+nu8f0FWnnTnGzQ==} + /jest-worker@30.0.0-alpha.5: + resolution: {integrity: sha512-BNOP7TMpf4Fw+f7IiVxXS//NroCY/nAzR4yAr5ABkHZDTh3eWIBwGWNCBqK/IBZcaStQYqvgTwjVWgfPAUalPQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@types/node': 20.12.12 - jest-util: 30.0.0-alpha.4 + '@types/node': 20.13.0 + jest-util: 30.0.0-alpha.5 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest@30.0.0-alpha.4(@types/node@20.12.12): - resolution: {integrity: sha512-8GerI17cOfl6AtmlRhzFoMctula9bbUUV67eaAOl58BkIDGqDHoVASjArRRqg/cF2iFnSwwnZ5W6S5JW00j/rg==} + /jest@30.0.0-alpha.5(@types/node@20.13.0): + resolution: {integrity: sha512-9NLqkZFNNONpDxBV95Zm3NRGMssGYH1x7SD+4fnzy5Wf6RaFv1buG3Zwb8nkAeZPIhsTmNFKCMiFCGSrPDeiaQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} hasBin: true peerDependencies: @@ -3222,10 +3243,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 30.0.0-alpha.4 - '@jest/types': 30.0.0-alpha.4 + '@jest/core': 30.0.0-alpha.5 + '@jest/types': 30.0.0-alpha.5 import-local: 3.1.0 - jest-cli: 30.0.0-alpha.4(@types/node@20.12.12) + jest-cli: 30.0.0-alpha.5(@types/node@20.13.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -3378,11 +3399,11 @@ packages: engines: {node: '>= 8'} dev: false - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + /micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 /mime-db@1.52.0: @@ -3416,8 +3437,8 @@ packages: dependencies: brace-expansion: 2.0.1 - /minipass@7.1.1: - resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==} + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} dev: true @@ -3555,7 +3576,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.6 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -3582,7 +3603,7 @@ packages: engines: {node: '>=16 || 14 >=14.18'} dependencies: lru-cache: 10.2.2 - minipass: 7.1.1 + minipass: 7.1.2 dev: true /path-type@4.0.0: @@ -3629,17 +3650,17 @@ packages: engines: {node: '>= 0.8.0'} dev: false - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + /prettier@3.3.0: + resolution: {integrity: sha512-J9odKxERhCQ10OC2yb93583f6UnYutOeiV5i0zEDS7UGTdUt0u+y8erxl3lBKvwo/JHyyoEdXjwp4dke9oyZ/g==} engines: {node: '>=14'} hasBin: true dev: true - /pretty-format@30.0.0-alpha.4: - resolution: {integrity: sha512-emTMNZqvLg7I4GPkNTOyscYyTnSzWffTIwTRZVEwzHdQhSfoX8JWGVxPb4KLIQkwy4x2uY5XD+0+alRYPlBFgw==} + /pretty-format@30.0.0-alpha.5: + resolution: {integrity: sha512-qRzqj0zWh2CRvL9UbWGksN9YSSuzzvNqexrDBwKiH48RVX00BQCxHwSfWF+sigp3IZGKxjG2nud42SQQU8q3Yg==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dependencies: - '@jest/schemas': 30.0.0-alpha.4 + '@jest/schemas': 30.0.0-alpha.5 ansi-styles: 5.2.0 react-is: 18.3.1 dev: true @@ -3840,7 +3861,7 @@ packages: fast-fifo: 1.3.2 queue-tick: 1.0.1 optionalDependencies: - bare-events: 2.2.2 + bare-events: 2.3.1 dev: false /string-length@4.0.2: @@ -4026,12 +4047,13 @@ packages: typescript: 5.4.5 dev: false - /ts-jest@29.1.2(jest@30.0.0-alpha.4)(typescript@5.4.5): - resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} - engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} + /ts-jest@29.1.4(jest@30.0.0-alpha.5)(typescript@5.4.5): + resolution: {integrity: sha512-YiHwDhSvCiItoAgsKtoLFCuakDzDsJ1DLDnSouTaTmdOcOwIkSzbLXduaQ6M5DRVhuZC/NYaaZ/mtHbWMv/S6Q==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 '@jest/types': ^29.0.0 babel-jest: ^29.0.0 esbuild: '*' @@ -4040,6 +4062,8 @@ packages: peerDependenciesMeta: '@babel/core': optional: true + '@jest/transform': + optional: true '@jest/types': optional: true babel-jest: @@ -4049,7 +4073,7 @@ packages: dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 30.0.0-alpha.4(@types/node@20.12.12) + jest: 30.0.0-alpha.5(@types/node@20.13.0) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -4079,8 +4103,8 @@ packages: engines: {node: '>=10'} dev: true - /typescript-eslint@7.9.0(eslint@9.3.0)(typescript@5.4.5): - resolution: {integrity: sha512-7iTn9c10teHHCys5Ud/yaJntXZrjt3h2mrx3feJGBOLgQkF3TB1X89Xs3aVQ/GgdXRAXpk2bPTdpRwHP4YkUow==} + /typescript-eslint@7.11.0(eslint@9.4.0)(typescript@5.4.5): + resolution: {integrity: sha512-ZKe3yHF/IS/kCUE4CGE3UgtK+Q7yRk1e9kwEI0rqm9XxMTd9P1eHe0LVVtrZ3oFuIQ2unJ9Xn0vTsLApzJ3aPw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -4089,10 +4113,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 7.9.0(@typescript-eslint/parser@7.9.0)(eslint@9.3.0)(typescript@5.4.5) - '@typescript-eslint/parser': 7.9.0(eslint@9.3.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.9.0(eslint@9.3.0)(typescript@5.4.5) - eslint: 9.3.0 + '@typescript-eslint/eslint-plugin': 7.11.0(@typescript-eslint/parser@7.11.0)(eslint@9.4.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.11.0(eslint@9.4.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.11.0(eslint@9.4.0)(typescript@5.4.5) + eslint: 9.4.0 typescript: 5.4.5 transitivePeerDependencies: - supports-color diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json index 1fea0a3c..6f3c0c5c 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": "ab66fdfb3a225f67f9a6328586015487b6aa4d04", + "pnpmShrinkwrapHash": "895e057684935072ab804a0383ca7ff2f544239a", "preferredVersionsHash": "bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f" } diff --git a/libraries/adb-credential-web/package.json b/libraries/adb-credential-web/package.json index afd20e78..b8dc30cb 100644 --- a/libraries/adb-credential-web/package.json +++ b/libraries/adb-credential-web/package.json @@ -35,7 +35,7 @@ "devDependencies": { "@yume-chan/eslint-config": "workspace:^1.0.0", "@yume-chan/tsconfig": "workspace:^1.0.0", - "prettier": "^3.2.5", + "prettier": "^3.3.0", "typescript": "^5.4.5" } } diff --git a/libraries/adb-daemon-webusb/package.json b/libraries/adb-daemon-webusb/package.json index 5052b6a2..1415369a 100644 --- a/libraries/adb-daemon-webusb/package.json +++ b/libraries/adb-daemon-webusb/package.json @@ -39,7 +39,7 @@ "devDependencies": { "@yume-chan/eslint-config": "workspace:^1.0.0", "@yume-chan/tsconfig": "workspace:^1.0.0", - "prettier": "^3.2.5", + "prettier": "^3.3.0", "typescript": "^5.4.5" } } diff --git a/libraries/adb-daemon-webusb/src/device.ts b/libraries/adb-daemon-webusb/src/device.ts index dd7ebf14..8cc42678 100644 --- a/libraries/adb-daemon-webusb/src/device.ts +++ b/libraries/adb-daemon-webusb/src/device.ts @@ -45,7 +45,7 @@ export const ADB_DEFAULT_DEVICE_FILTER = { */ function findUsbEndpoints(endpoints: USBEndpoint[]) { if (endpoints.length === 0) { - throw new Error("No endpoints given"); + throw new TypeError("No endpoints given"); } let inEndpoint: USBEndpoint | undefined; @@ -69,10 +69,10 @@ function findUsbEndpoints(endpoints: USBEndpoint[]) { } if (!inEndpoint) { - throw new Error("No input endpoint found."); + throw new TypeError("No input endpoint found."); } if (!outEndpoint) { - throw new Error("No output endpoint found."); + throw new TypeError("No output endpoint found."); } throw new Error("unreachable"); } @@ -200,10 +200,7 @@ export class AdbDaemonWebUsbConnection // If the payload size is a multiple of the packet size, // we need to send an empty packet to indicate the end, // so the OS will send it to the device immediately. - if ( - zeroMask && - (chunk.byteLength & zeroMask) === 0 - ) { + if (zeroMask && (chunk.length & zeroMask) === 0) { await device.raw.transferOut( outEndpoint.endpointNumber, EMPTY_UINT8_ARRAY, diff --git a/libraries/adb-daemon-webusb/src/utils.ts b/libraries/adb-daemon-webusb/src/utils.ts index 606d0748..a7baad14 100644 --- a/libraries/adb-daemon-webusb/src/utils.ts +++ b/libraries/adb-daemon-webusb/src/utils.ts @@ -42,7 +42,7 @@ export function findUsbAlternateInterface( } } - throw new Error("No matched alternate interface found"); + throw new TypeError("No matched alternate interface found"); } function padNumber(value: number) { diff --git a/libraries/adb-scrcpy/package.json b/libraries/adb-scrcpy/package.json index 69108e17..f03eb95d 100644 --- a/libraries/adb-scrcpy/package.json +++ b/libraries/adb-scrcpy/package.json @@ -45,8 +45,8 @@ "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", "jest": "^30.0.0-alpha.4", - "prettier": "^3.2.5", - "ts-jest": "^29.1.2", + "prettier": "^3.3.0", + "ts-jest": "^29.1.4", "typescript": "^5.4.5" } } diff --git a/libraries/adb-server-node-tcp/package.json b/libraries/adb-server-node-tcp/package.json index 47b111d0..f7f2f522 100644 --- a/libraries/adb-server-node-tcp/package.json +++ b/libraries/adb-server-node-tcp/package.json @@ -37,11 +37,11 @@ "@yume-chan/struct": "workspace:^0.0.23" }, "devDependencies": { - "@types/node": "^20.12.12", + "@types/node": "^20.13.0", "@yume-chan/eslint-config": "workspace:^1.0.0", "@yume-chan/tsconfig": "workspace:^1.0.0", "jest": "^30.0.0-alpha.4", - "prettier": "^3.2.5", + "prettier": "^3.3.0", "typescript": "^5.4.5" } } diff --git a/libraries/adb-server-node-tcp/src/index.ts b/libraries/adb-server-node-tcp/src/index.ts index 43abef78..bb42b6dc 100644 --- a/libraries/adb-server-node-tcp/src/index.ts +++ b/libraries/adb-server-node-tcp/src/index.ts @@ -120,7 +120,7 @@ export class AdbServerNodeTcpConnector } else if (url.protocol === "unix:") { server.listen(url.pathname); } else { - throw new Error(`Unsupported protocol ${url.protocol}`); + throw new TypeError(`Unsupported protocol ${url.protocol}`); } } else { server.listen(); diff --git a/libraries/adb/package.json b/libraries/adb/package.json index 59737a35..e866e294 100644 --- a/libraries/adb/package.json +++ b/libraries/adb/package.json @@ -40,13 +40,13 @@ }, "devDependencies": { "@jest/globals": "^30.0.0-alpha.4", - "@types/node": "^20.12.12", + "@types/node": "^20.13.0", "@yume-chan/eslint-config": "workspace:^1.0.0", "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", "jest": "^30.0.0-alpha.4", - "prettier": "^3.2.5", - "ts-jest": "^29.1.2", + "prettier": "^3.3.0", + "ts-jest": "^29.1.4", "typescript": "^5.4.5" } } diff --git a/libraries/adb/src/commands/reverse.ts b/libraries/adb/src/commands/reverse.ts index da3dade8..487717ea 100644 --- a/libraries/adb/src/commands/reverse.ts +++ b/libraries/adb/src/commands/reverse.ts @@ -5,7 +5,7 @@ import { BufferedReadableStream } from "@yume-chan/stream-extra"; import Struct, { ExactReadableEndedError, encodeUtf8 } from "@yume-chan/struct"; import type { Adb, AdbIncomingSocketHandler } from "../adb.js"; -import { hexToNumber } from "../utils/index.js"; +import { hexToNumber, sequenceEqual } from "../utils/index.js"; export interface AdbForwardListener { deviceSerial: string; @@ -82,10 +82,8 @@ export class AdbReverseCommand extends AutoDisposable { const stream = await this.createBufferedStream(service); const response = await stream.readExactly(4); - for (let i = 0; i < 4; i += 1) { - if (response[i] !== OKAY[i]) { - await AdbReverseErrorResponse.deserialize(stream); - } + if (!sequenceEqual(response, OKAY)) { + await AdbReverseErrorResponse.deserialize(stream); } return stream; diff --git a/libraries/adb/src/commands/sync/request.ts b/libraries/adb/src/commands/sync/request.ts index 3521b1c7..788a18b8 100644 --- a/libraries/adb/src/commands/sync/request.ts +++ b/libraries/adb/src/commands/sync/request.ts @@ -48,7 +48,7 @@ export async function adbSyncWriteRequest( // `writable` is buffered, it copies inputs to an internal buffer, // so don't concatenate headers and data here, that will be an unnecessary copy. await writable.write( - AdbSyncNumberRequest.serialize({ id, arg: value.byteLength }), + AdbSyncNumberRequest.serialize({ id, arg: value.length }), ); await writable.write(value); } diff --git a/libraries/adb/src/commands/sync/response.ts b/libraries/adb/src/commands/sync/response.ts index 75760ad0..4309041f 100644 --- a/libraries/adb/src/commands/sync/response.ts +++ b/libraries/adb/src/commands/sync/response.ts @@ -4,9 +4,7 @@ import type { StructLike, StructValueType, } from "@yume-chan/struct"; -import Struct from "@yume-chan/struct"; - -import { decodeUtf8 } from "../../utils/index.js"; +import Struct, { decodeUtf8 } from "@yume-chan/struct"; function encodeAsciiUnchecked(value: string): Uint8Array { const result = new Uint8Array(value.length); diff --git a/libraries/adb/src/commands/sync/socket.spec.ts b/libraries/adb/src/commands/sync/socket.spec.ts new file mode 100644 index 00000000..cc4775f3 --- /dev/null +++ b/libraries/adb/src/commands/sync/socket.spec.ts @@ -0,0 +1,46 @@ +import { describe, expect, it } from "@jest/globals"; +import { ReadableStream, WritableStream } from "@yume-chan/stream-extra"; + +import { AdbSyncSocket } from "./socket.js"; + +describe("AdbSyncSocket", () => { + describe("lock", () => { + it("should wait for the previous lock to be released", async () => { + const result: number[] = []; + + const socket = new AdbSyncSocket( + { + service: "", + close() {}, + closed: Promise.resolve(), + readable: new ReadableStream(), + writable: new WritableStream(), + }, + 1024, + ); + + const locked = await socket.lock(); + result.push(1); + + void socket.lock().then((locked) => { + result.push(3); + locked.release(); + }); + + // Queue some microtasks to allow the above `then` callback run (although it shouldn't) + for (let i = 0; i < 10; i += 1) { + await Promise.resolve(); + } + + locked.release(); + result.push(2); + + // Queue some microtasks to allow the above `then` callback run + for (let i = 0; i < 10; i += 1) { + await Promise.resolve(); + } + + expect(result).toEqual([1, 2, 3]); + }); + }); +}); diff --git a/libraries/adb/src/commands/tcpip.ts b/libraries/adb/src/commands/tcpip.ts index b2683e22..e334c19c 100644 --- a/libraries/adb/src/commands/tcpip.ts +++ b/libraries/adb/src/commands/tcpip.ts @@ -47,7 +47,7 @@ export class AdbTcpIpCommand extends AdbCommandBase { async setPort(port: number): Promise { if (port <= 0) { - throw new Error(`Invalid port ${port}`); + throw new TypeError(`Invalid port ${port}`); } const output = await this.adb.createSocketAndWait(`tcpip:${port}`); diff --git a/libraries/adb/src/daemon/crypto.ts b/libraries/adb/src/daemon/crypto.ts index 3d4b264c..9720afb6 100644 --- a/libraries/adb/src/daemon/crypto.ts +++ b/libraries/adb/src/daemon/crypto.ts @@ -175,8 +175,8 @@ export function adbGeneratePublicKey( output = new Uint8Array(outputLength); outputType = "Uint8Array"; } else { - if (output.byteLength < outputLength) { - throw new Error("output buffer is too small"); + if (output.length < outputLength) { + throw new TypeError("output buffer is too small"); } outputType = "number"; @@ -185,7 +185,7 @@ export function adbGeneratePublicKey( const outputView = new DataView( output.buffer, output.byteOffset, - output.byteLength, + output.length, ); let outputOffset = 0; diff --git a/libraries/adb/src/daemon/dispatcher.ts b/libraries/adb/src/daemon/dispatcher.ts index 580fd45c..1c104c59 100644 --- a/libraries/adb/src/daemon/dispatcher.ts +++ b/libraries/adb/src/daemon/dispatcher.ts @@ -16,10 +16,9 @@ import { Consumable, WritableStream, } from "@yume-chan/stream-extra"; -import { EMPTY_UINT8_ARRAY } from "@yume-chan/struct"; +import { EMPTY_UINT8_ARRAY, decodeUtf8, encodeUtf8 } from "@yume-chan/struct"; import type { AdbIncomingSocketHandler, AdbSocket, Closeable } from "../adb.js"; -import { decodeUtf8, encodeUtf8 } from "../utils/index.js"; import type { AdbPacketData, AdbPacketInit } from "./packet.js"; import { AdbCommand, calculateChecksum } from "./packet.js"; @@ -219,14 +218,14 @@ export class AdbPacketDispatcher implements Closeable { #handleOkay(packet: AdbPacketData) { let ackBytes: number; if (this.options.initialDelayedAckBytes !== 0) { - if (packet.payload.byteLength !== 4) { + if (packet.payload.length !== 4) { throw new Error( "Invalid OKAY packet. Payload size should be 4", ); } ackBytes = getUint32LittleEndian(packet.payload, 0); } else { - if (packet.payload.byteLength !== 0) { + if (packet.payload.length !== 0) { throw new Error( "Invalid OKAY packet. Payload size should be 0", ); @@ -429,8 +428,8 @@ export class AdbPacketDispatcher implements Closeable { payload = encodeUtf8(payload); } - if (payload.byteLength > this.options.maxPayloadSize) { - throw new Error("payload too large"); + if (payload.length > this.options.maxPayloadSize) { + throw new TypeError("payload too large"); } await Consumable.WritableStream.write(this.#writer, { diff --git a/libraries/adb/src/daemon/packet.ts b/libraries/adb/src/daemon/packet.ts index 0cfb0c94..995641cc 100644 --- a/libraries/adb/src/daemon/packet.ts +++ b/libraries/adb/src/daemon/packet.ts @@ -59,14 +59,14 @@ export class AdbPacketSerializeStream extends TransformStream< transform: async (chunk, controller) => { await chunk.tryConsume(async (chunk) => { const init = chunk as AdbPacketInit & AdbPacketHeaderInit; - init.payloadLength = init.payload.byteLength; + init.payloadLength = init.payload.length; await Consumable.ReadableStream.enqueue( controller, AdbPacketHeader.serialize(init, headerBuffer), ); - if (init.payload.byteLength) { + if (init.payloadLength) { // USB protocol preserves packet boundaries, // so we must write payload separately as native ADB does, // otherwise the read operation on device will fail. diff --git a/libraries/adb/src/daemon/socket.ts b/libraries/adb/src/daemon/socket.ts index ef2ed347..26d25ee6 100644 --- a/libraries/adb/src/daemon/socket.ts +++ b/libraries/adb/src/daemon/socket.ts @@ -110,7 +110,7 @@ export class AdbDaemonSocketController } async #writeChunk(data: Uint8Array, signal: AbortSignal) { - const length = data.byteLength; + const length = data.length; while (this.#availableWriteBytes < length) { // Only one lock is required because Web Streams API guarantees // that `write` is not reentrant. diff --git a/libraries/adb/src/daemon/transport.ts b/libraries/adb/src/daemon/transport.ts index efe41951..989dd904 100644 --- a/libraries/adb/src/daemon/transport.ts +++ b/libraries/adb/src/daemon/transport.ts @@ -215,11 +215,10 @@ export class AdbDaemonTransport implements AdbTransport { ) .then( () => { - if (resolver.state === "running") { - resolver.reject( - new Error("Connection closed unexpectedly"), - ); - } + // If `resolver` is already settled, call `reject` won't do anything. + resolver.reject( + new Error("Connection closed unexpectedly"), + ); }, (e) => { resolver.reject(e); @@ -333,7 +332,7 @@ export class AdbDaemonTransport implements AdbTransport { if (features.includes(AdbFeature.DelayedAck)) { if (initialDelayedAckBytes <= 0) { - throw new Error( + throw new TypeError( "`initialDelayedAckBytes` must be greater than 0 when DelayedAck feature is enabled.", ); } diff --git a/libraries/adb/src/server/client.ts b/libraries/adb/src/server/client.ts index 52519910..77f4197b 100644 --- a/libraries/adb/src/server/client.ts +++ b/libraries/adb/src/server/client.ts @@ -23,24 +23,15 @@ import { import type { AdbIncomingSocketHandler, AdbSocket, Closeable } from "../adb.js"; import { AdbBanner } from "../banner.js"; import type { AdbFeature } from "../features.js"; -import { NOOP, hexToNumber, write4HexDigits } from "../utils/index.js"; +import { + NOOP, + hexToNumber, + sequenceEqual, + write4HexDigits, +} from "../utils/index.js"; import { AdbServerTransport } from "./transport.js"; -function sequenceEqual(a: Uint8Array, b: Uint8Array): boolean { - if (a.length !== b.length) { - return false; - } - - for (let i = 0; i < a.length; i += 1) { - if (a[i] !== b[i]) { - return false; - } - } - - return true; -} - const OKAY = encodeUtf8("OKAY"); const FAIL = encodeUtf8("FAIL"); @@ -108,8 +99,8 @@ class AdbServerStream { const response = await this.readExactly(4); if (sequenceEqual(response, OKAY)) { // `OKAY` is followed by data length and data - // But different services want to read the data differently - // So we don't read the data here + // But different services want to parse the data differently + // So don't read the data here return; } @@ -421,7 +412,7 @@ export class AdbServerClient { if ("tcp" in device) { return `host-local:${command}`; } - throw new Error("Invalid device selector"); + throw new TypeError("Invalid device selector"); } /** @@ -507,7 +498,7 @@ export class AdbServerClient { } else if ("tcp" in device) { switchService = `host:tport:local`; } else { - throw new Error("Invalid device selector"); + throw new TypeError("Invalid device selector"); } const connection = await this.createConnection(switchService); @@ -576,7 +567,7 @@ export class AdbServerClient { } else if ("tcp" in device) { type = "local"; } else { - throw new Error("Invalid device selector"); + throw new TypeError("Invalid device selector"); } // `waitFor` can't use `connectDevice`, because the device diff --git a/libraries/adb/src/utils/base64.ts b/libraries/adb/src/utils/base64.ts index 88c61503..fd0fa542 100644 --- a/libraries/adb/src/utils/base64.ts +++ b/libraries/adb/src/utils/base64.ts @@ -66,7 +66,7 @@ export function encodeBase64( return output; } else { if (output.length < outputLength) { - throw new Error("output buffer is too small"); + throw new TypeError("output buffer is too small"); } output = output.subarray(0, outputLength); @@ -124,7 +124,7 @@ export function encodeBase64( // Input is in the middle of output, // It's not possible to read either the first or the last three bytes // before they are overwritten by the output. - throw new Error("input and output cannot overlap"); + throw new TypeError("input and output cannot overlap"); } return outputLength; diff --git a/libraries/adb/src/utils/conditional-variable.ts b/libraries/adb/src/utils/conditional-variable.ts deleted file mode 100644 index 6038cbe9..00000000 --- a/libraries/adb/src/utils/conditional-variable.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { PromiseResolver } from "@yume-chan/async"; -import type { Disposable } from "@yume-chan/event"; - -interface WaitEntry { - condition: () => boolean; - resolver: PromiseResolver; -} - -export class ConditionalVariable implements Disposable { - #locked = false; - readonly #queue: WaitEntry[] = []; - - wait(condition: () => boolean): Promise { - if (!this.#locked) { - this.#locked = true; - if (this.#queue.length === 0 && condition()) { - return Promise.resolve(); - } - } - - const resolver = new PromiseResolver(); - this.#queue.push({ condition, resolver }); - return resolver.promise; - } - - notifyOne() { - const entry = this.#queue.shift(); - if (entry) { - if (entry.condition()) { - entry.resolver.resolve(); - } - } else { - this.#locked = false; - } - } - - dispose(): void { - for (const item of this.#queue) { - item.resolver.reject( - new Error("The ConditionalVariable has been disposed"), - ); - } - this.#queue.length = 0; - } -} diff --git a/libraries/adb/src/utils/hex.ts b/libraries/adb/src/utils/hex.ts index 1f8994bf..c6c420fe 100644 --- a/libraries/adb/src/utils/hex.ts +++ b/libraries/adb/src/utils/hex.ts @@ -1,6 +1,6 @@ function hexCharToNumber(char: number) { if (char < 48) { - throw new Error(`Invalid hex char ${char}`); + throw new TypeError(`Invalid hex char ${char}`); } if (char < 58) { // 0-9 @@ -8,7 +8,7 @@ function hexCharToNumber(char: number) { } if (char < 65) { - throw new Error(`Invalid hex char ${char}`); + throw new TypeError(`Invalid hex char ${char}`); } if (char < 71) { // A-F @@ -16,14 +16,14 @@ function hexCharToNumber(char: number) { } if (char < 97) { - throw new Error(`Invalid hex char ${char}`); + throw new TypeError(`Invalid hex char ${char}`); } if (char < 103) { // a-f return char - 87; } - throw new Error(`Invalid hex char ${char}`); + throw new TypeError(`Invalid hex char ${char}`); } // It's 22x faster than converting `data` to string then `Number.parseInt` diff --git a/libraries/adb/src/utils/index.ts b/libraries/adb/src/utils/index.ts index 64ce89f1..45f66e79 100644 --- a/libraries/adb/src/utils/index.ts +++ b/libraries/adb/src/utils/index.ts @@ -1,6 +1,6 @@ export { decodeUtf8, encodeUtf8 } from "@yume-chan/struct"; export * from "./auto-reset-event.js"; export * from "./base64.js"; -export * from "./conditional-variable.js"; export * from "./hex.js"; export * from "./no-op.js"; +export * from "./sequence-equal.js"; diff --git a/libraries/adb/src/utils/sequence-equal.ts b/libraries/adb/src/utils/sequence-equal.ts new file mode 100644 index 00000000..b3f80e91 --- /dev/null +++ b/libraries/adb/src/utils/sequence-equal.ts @@ -0,0 +1,13 @@ +export function sequenceEqual(a: Uint8Array, b: Uint8Array): boolean { + if (a.length !== b.length) { + return false; + } + + for (let i = 0; i < a.length; i += 1) { + if (a[i] !== b[i]) { + return false; + } + } + + return true; +} diff --git a/libraries/android-bin/package.json b/libraries/android-bin/package.json index a13d0e11..bfe4e334 100644 --- a/libraries/android-bin/package.json +++ b/libraries/android-bin/package.json @@ -42,8 +42,8 @@ "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", "jest": "^30.0.0-alpha.4", - "prettier": "^3.2.5", - "ts-jest": "^29.1.2", + "prettier": "^3.3.0", + "ts-jest": "^29.1.4", "typescript": "^5.4.5" } } diff --git a/libraries/android-bin/src/pm.ts b/libraries/android-bin/src/pm.ts index cd372460..3aa4ce78 100644 --- a/libraries/android-bin/src/pm.ts +++ b/libraries/android-bin/src/pm.ts @@ -395,7 +395,7 @@ export class PackageManager extends AdbCommandBase { let installer: string | undefined; let uid: number | undefined; - // The output format is easier to parse backwards + // The output format is easier to parse in backwards let index = line.indexOf(" uid:"); if (index !== -1) { uid = Number.parseInt(line.substring(index + " uid:".length), 10); diff --git a/libraries/aoa/src/audio.ts b/libraries/aoa/src/audio.ts index 7fc467c7..eee0dd04 100644 --- a/libraries/aoa/src/audio.ts +++ b/libraries/aoa/src/audio.ts @@ -58,7 +58,7 @@ function findAudioStreamingInterface(device: USBDevice) { } } - throw new Error("No matched alternate interface found"); + throw new TypeError("No matched alternate interface found"); } /** @@ -102,7 +102,7 @@ export function aoaGetAudioStream(device: USBDevice) { endpoint.direction === "in", ); if (!endpoint) { - throw new Error("No matched endpoint found"); + throw new TypeError("No matched endpoint found"); } endpointNumber = endpoint.endpointNumber; diff --git a/libraries/event/package.json b/libraries/event/package.json index 13972221..f5a81f58 100644 --- a/libraries/event/package.json +++ b/libraries/event/package.json @@ -41,8 +41,8 @@ "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", "jest": "^30.0.0-alpha.4", - "prettier": "^3.2.5", - "ts-jest": "^29.1.2", + "prettier": "^3.3.0", + "ts-jest": "^29.1.4", "typescript": "^5.4.5" } } diff --git a/libraries/fetch-scrcpy-server/package.json b/libraries/fetch-scrcpy-server/package.json index bc1e6c95..3f959ae9 100644 --- a/libraries/fetch-scrcpy-server/package.json +++ b/libraries/fetch-scrcpy-server/package.json @@ -30,6 +30,6 @@ "gh-release-fetch": "^4.0.3" }, "devDependencies": { - "@types/node": "^20.12.12" + "@types/node": "^20.13.0" } } diff --git a/libraries/no-data-view/package.json b/libraries/no-data-view/package.json index a2948127..cc432431 100644 --- a/libraries/no-data-view/package.json +++ b/libraries/no-data-view/package.json @@ -31,14 +31,14 @@ }, "devDependencies": { "@jest/globals": "^30.0.0-alpha.4", - "@types/node": "^20.12.12", + "@types/node": "^20.13.0", "@yume-chan/eslint-config": "workspace:^1.0.0", "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", "jest": "^30.0.0-alpha.4", - "prettier": "^3.2.5", + "prettier": "^3.3.0", "tinybench": "^2.8.0", - "ts-jest": "^29.1.2", + "ts-jest": "^29.1.4", "typescript": "^5.4.5" } } diff --git a/libraries/pcm-player/package.json b/libraries/pcm-player/package.json index 95fb1934..df474d01 100644 --- a/libraries/pcm-player/package.json +++ b/libraries/pcm-player/package.json @@ -36,8 +36,8 @@ "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", "jest": "^30.0.0-alpha.4", - "prettier": "^3.2.5", - "ts-jest": "^29.1.2", + "prettier": "^3.3.0", + "ts-jest": "^29.1.4", "typescript": "^5.4.5" } } diff --git a/libraries/pcm-player/src/index.ts b/libraries/pcm-player/src/index.ts index f21c81e2..4a2edff6 100644 --- a/libraries/pcm-player/src/index.ts +++ b/libraries/pcm-player/src/index.ts @@ -21,6 +21,11 @@ export abstract class PcmPlayer { protected abstract feedCore(worklet: AudioWorkletNode, source: T): void; + /** + * Feed the samples to the player. + * @param source An array of samples. It will be transferred if it's an `ArrayBuffer`, + * or an `ArrayBufferView` that covers the whole `ArrayBuffer`. Otherwise, it will be copied. + */ feed(source: T) { if (this.#stopped) { throw new Error("PcmPlayer is stopped"); diff --git a/libraries/scrcpy-decoder-tinyh264/package.json b/libraries/scrcpy-decoder-tinyh264/package.json index 8e921c8d..98ad547b 100644 --- a/libraries/scrcpy-decoder-tinyh264/package.json +++ b/libraries/scrcpy-decoder-tinyh264/package.json @@ -48,8 +48,8 @@ "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", "jest": "^30.0.0-alpha.4", - "prettier": "^3.2.5", - "ts-jest": "^29.1.2", + "prettier": "^3.3.0", + "ts-jest": "^29.1.4", "typescript": "^5.4.5" } } diff --git a/libraries/scrcpy-decoder-webcodecs/package.json b/libraries/scrcpy-decoder-webcodecs/package.json index c86a0bc3..613512b7 100644 --- a/libraries/scrcpy-decoder-webcodecs/package.json +++ b/libraries/scrcpy-decoder-webcodecs/package.json @@ -45,8 +45,8 @@ "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", "jest": "^30.0.0-alpha.4", - "prettier": "^3.2.5", - "ts-jest": "^29.1.2", + "prettier": "^3.3.0", + "ts-jest": "^29.1.4", "typescript": "^5.4.5" } } diff --git a/libraries/scrcpy-decoder-webcodecs/src/index.ts b/libraries/scrcpy-decoder-webcodecs/src/index.ts index 16687dd5..a0819001 100644 --- a/libraries/scrcpy-decoder-webcodecs/src/index.ts +++ b/libraries/scrcpy-decoder-webcodecs/src/index.ts @@ -339,11 +339,9 @@ export class WebCodecsVideoDecoder implements ScrcpyVideoDecoder { // AV1 doesn't need to do this, the handling code also doesn't set `#config`. let data: Uint8Array; if (this.#config !== undefined) { - data = new Uint8Array( - this.#config.byteLength + packet.data.byteLength, - ); + data = new Uint8Array(this.#config.length + packet.data.length); data.set(this.#config, 0); - data.set(packet.data, this.#config.byteLength); + data.set(packet.data, this.#config.length); this.#config = undefined; } else { data = packet.data; diff --git a/libraries/scrcpy/package.json b/libraries/scrcpy/package.json index b251870c..c63d1177 100644 --- a/libraries/scrcpy/package.json +++ b/libraries/scrcpy/package.json @@ -45,8 +45,8 @@ "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", "jest": "^30.0.0-alpha.4", - "prettier": "^3.2.5", - "ts-jest": "^29.1.2", + "prettier": "^3.3.0", + "ts-jest": "^29.1.4", "typescript": "^5.4.5" } } diff --git a/libraries/scrcpy/src/codec/nalu.ts b/libraries/scrcpy/src/codec/nalu.ts index 9cd7f44e..d660c228 100644 --- a/libraries/scrcpy/src/codec/nalu.ts +++ b/libraries/scrcpy/src/codec/nalu.ts @@ -202,13 +202,16 @@ export class NaluSodbBitReader { return result; } + /** + * Throws an error if the current position is invalid for `skip`. + * + * Usually it will throw if `ended` is `true`, + * except when the bit position is at the stop bit, + * in which case `ended` will be `true`, but it won't throw. + * `skip` can skip all remaining bits, and stop at the end position. + * The next `next` call will throw since there is no more bits to read. + */ #checkSkipPosition() { - // This is different from `ended`, - // as it allows the bit position to be at the stop bit. - // In this case, there is no more bits to read, `ended` is `true`, - // and the next `next` call will throw an error. - // However, it's still a valid position for `skip`, which can skip all remaining bits, - // and stop at the end position. if ( this.#bytePosition >= this.#byteLength && this.#bitPosition < this.#stopBitIndex diff --git a/libraries/scrcpy/src/control/type.ts b/libraries/scrcpy/src/control/type.ts index 474ac2bc..6e9773a4 100644 --- a/libraries/scrcpy/src/control/type.ts +++ b/libraries/scrcpy/src/control/type.ts @@ -34,7 +34,7 @@ export class ScrcpyControlMessageTypeValue { get(type: ScrcpyControlMessageType): number { const value = this.#types.indexOf(type); if (value === -1) { - throw new Error("Not supported"); + throw new TypeError("Invalid or unsupported control message type"); } return value; } diff --git a/libraries/scrcpy/src/control/writer.ts b/libraries/scrcpy/src/control/writer.ts index b259e3ea..eed2c4a4 100644 --- a/libraries/scrcpy/src/control/writer.ts +++ b/libraries/scrcpy/src/control/writer.ts @@ -88,9 +88,13 @@ export class ScrcpyControlMessageWriter { async setClipboard( message: Omit, ) { - const [data, promise] = this.#serializer.setClipboard(message); - await this.write(data); - await promise; + const result = this.#serializer.setClipboard(message); + if (result instanceof Uint8Array) { + await this.write(result); + } else { + await this.write(result[0]); + await result[1]; + } } releaseLock() { diff --git a/libraries/scrcpy/src/options/1_16/options.ts b/libraries/scrcpy/src/options/1_16/options.ts index 3e85eaca..e786d5fa 100644 --- a/libraries/scrcpy/src/options/1_16/options.ts +++ b/libraries/scrcpy/src/options/1_16/options.ts @@ -260,11 +260,8 @@ export class ScrcpyOptions1_16 extends ScrcpyOptions { override serializeSetClipboardControlMessage( message: ScrcpySetClipboardControlMessage, - ): [Uint8Array, Promise | undefined] { - return [ - ScrcpySetClipboardControlMessage1_15.serialize(message), - undefined, - ]; + ): Uint8Array { + return ScrcpySetClipboardControlMessage1_15.serialize(message); } override createScrollController(): ScrcpyScrollController { diff --git a/libraries/scrcpy/src/options/1_21.ts b/libraries/scrcpy/src/options/1_21.ts index f48f3cd1..aa2b8a19 100644 --- a/libraries/scrcpy/src/options/1_21.ts +++ b/libraries/scrcpy/src/options/1_21.ts @@ -97,12 +97,9 @@ export class ScrcpyOptions1_21 extends ScrcpyOptions { override serializeSetClipboardControlMessage( message: ScrcpySetClipboardControlMessage, - ): [Uint8Array, Promise | undefined] { + ): Uint8Array | [Uint8Array, Promise] { if (message.sequence === 0n) { - return [ - ScrcpySetClipboardControlMessage1_21.serialize(message), - undefined, - ]; + return ScrcpySetClipboardControlMessage1_21.serialize(message); } const resolver = new PromiseResolver(); diff --git a/libraries/scrcpy/src/options/types.ts b/libraries/scrcpy/src/options/types.ts index 2dbb258b..2806f574 100644 --- a/libraries/scrcpy/src/options/types.ts +++ b/libraries/scrcpy/src/options/types.ts @@ -47,7 +47,7 @@ export function toScrcpyOptionValue(value: unknown, empty: T): string | T { typeof value !== "number" && typeof value !== "boolean" ) { - throw new Error(`Invalid option value: ${String(value)}`); + throw new TypeError(`Invalid option value: ${String(value)}`); } return String(value); @@ -81,12 +81,30 @@ export abstract class ScrcpyOptions { return this.#base.clipboard; } + /** + * Creates a new instance of `ScrcpyOptions`, delegating all methods to the `Base` class. + * The derived class can override the methods to provide different behaviors. + * In those override methods, the derived class can call `super.currentMethodName()` to + * include the behavior of the `Base` class. + * + * Because `Base` is another derived class of `ScrcpyOptions`, its constructor might + * call this constructor with another `Base` class, forming a chain of classes, but without + * direct derivation to avoid type incompatibility when options are changed. + * + * When the `Base` class is constructed, its `value` field will be the same object as `value`, + * so the `setListXXX` methods in `Base` will modify `this.value`. + * + * @param Base The base class's constructor + * @param value The options value + * @param defaults The default option values + */ constructor( - base: (new (value: never) => ScrcpyOptions) | undefined, + Base: (new (value: never) => ScrcpyOptions) | undefined, value: T, defaults: Required, ) { if (!(SkipDefaultMark in value)) { + // Only combine the default values when the outermost class is constructed value = { ...defaults, ...value, @@ -96,8 +114,16 @@ export abstract class ScrcpyOptions { this.value = value as Required; - if (base !== undefined) { - this.#base = new base(value as never); + if (Base !== undefined) { + // `value` might be incompatible with `Base`, + // but the derive class must ensure the incompatible values are not used by base class, + // and only the `setListXXX` methods in base class will modify the value, + // which is common to all versions. + // + // `Base` is a derived class of `ScrcpyOptions`, its constructor will call + // this constructor with `value`, which contains `SkipDefaultMark`, + // so `Base#value` will be the same object as `value`. + this.#base = new Base(value as never); } } @@ -179,9 +205,14 @@ export abstract class ScrcpyOptions { return this.#base.serializeBackOrScreenOnControlMessage(message); } + /** + * Convert a clipboard control message to binary data + * @param message The clipboard control message + * @returns A `Uint8Array` containing the binary data, or a tuple of the binary data and a promise that resolves when the clipboard is updated on the device + */ serializeSetClipboardControlMessage( message: ScrcpySetClipboardControlMessage, - ): [Uint8Array, Promise | undefined] { + ): Uint8Array | [Uint8Array, Promise] { return this.#base.serializeSetClipboardControlMessage(message); } diff --git a/libraries/stream-extra/package.json b/libraries/stream-extra/package.json index d9237058..acff527a 100644 --- a/libraries/stream-extra/package.json +++ b/libraries/stream-extra/package.json @@ -41,8 +41,8 @@ "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", "jest": "^30.0.0-alpha.4", - "prettier": "^3.2.5", - "ts-jest": "^29.1.2", + "prettier": "^3.3.0", + "ts-jest": "^29.1.4", "typescript": "^5.4.5" } } diff --git a/libraries/stream-extra/src/distribution.ts b/libraries/stream-extra/src/distribution.ts index 293d05e2..2f064eee 100644 --- a/libraries/stream-extra/src/distribution.ts +++ b/libraries/stream-extra/src/distribution.ts @@ -27,7 +27,7 @@ export class BufferCombiner { */ *push(data: Uint8Array): Generator { let offset = 0; - let available = data.byteLength; + let available = data.length; if (this.#offset !== 0) { if (available >= this.#available) { @@ -97,7 +97,7 @@ export class DistributionStream extends TransformStream< } } else { let offset = 0; - let available = chunk.byteLength; + let available = chunk.length; while (available > 0) { const end = offset + size; await Consumable.ReadableStream.enqueue( diff --git a/libraries/struct/package.json b/libraries/struct/package.json index cc0df568..32e4dafa 100644 --- a/libraries/struct/package.json +++ b/libraries/struct/package.json @@ -42,8 +42,8 @@ "@yume-chan/tsconfig": "workspace:^1.0.0", "cross-env": "^7.0.3", "jest": "^30.0.0-alpha.4", - "prettier": "^3.2.5", - "ts-jest": "^29.1.2", + "prettier": "^3.3.0", + "ts-jest": "^29.1.4", "typescript": "^5.4.5" } } diff --git a/libraries/struct/src/struct.ts b/libraries/struct/src/struct.ts index 58eb8f56..0d823cf2 100644 --- a/libraries/struct/src/struct.ts +++ b/libraries/struct/src/struct.ts @@ -335,7 +335,7 @@ export class Struct< TPostDeserialized > { if (!(other instanceof Struct)) { - throw new Error("The other value must be a `Struct` instance"); + throw new TypeError("The other value must be a `Struct` instance"); } for (const field of other.#fields) { @@ -687,7 +687,7 @@ export class Struct< if (!output) { output = new Uint8Array(structSize); } else if (output.length < structSize) { - throw new Error("Output buffer is too small"); + throw new TypeError("Output buffer is too small"); } const dataView = new DataView( diff --git a/libraries/struct/src/types/buffer/variable-length.spec.ts b/libraries/struct/src/types/buffer/variable-length.spec.ts index 03b3ff47..41dcba4c 100644 --- a/libraries/struct/src/types/buffer/variable-length.spec.ts +++ b/libraries/struct/src/types/buffer/variable-length.spec.ts @@ -79,12 +79,11 @@ describe("Types", () => { describe("#getSize", () => { it("should return size of its original field value", () => { const mockOriginalFieldValue = new MockLengthFieldValue(); - const mockArrayBufferFieldValue = - new MockBufferLikeFieldValue(); + const mockBufferFieldValue = new MockBufferLikeFieldValue(); const lengthFieldValue = new VariableLengthBufferLikeFieldLengthValue( mockOriginalFieldValue, - mockArrayBufferFieldValue, + mockBufferFieldValue, ); mockOriginalFieldValue.size = 0; @@ -99,59 +98,49 @@ describe("Types", () => { }); describe("#get", () => { - it("should return size of its `arrayBufferField`", () => { + it("should return size of its `bufferValue`", () => { const mockOriginalFieldValue = new MockLengthFieldValue(); - const mockArrayBufferFieldValue = - new MockBufferLikeFieldValue(); + const mockBufferFieldValue = new MockBufferLikeFieldValue(); const lengthFieldValue = new VariableLengthBufferLikeFieldLengthValue( mockOriginalFieldValue, - mockArrayBufferFieldValue, + mockBufferFieldValue, ); mockOriginalFieldValue.value = 0; - mockArrayBufferFieldValue.size = 0; + mockBufferFieldValue.size = 0; expect(lengthFieldValue.get()).toBe(0); - expect(mockArrayBufferFieldValue.getSize).toHaveBeenCalledTimes( - 1, - ); + expect(mockBufferFieldValue.getSize).toHaveBeenCalledTimes(1); expect(mockOriginalFieldValue.get).toHaveBeenCalledTimes(1); - mockArrayBufferFieldValue.getSize.mockClear(); + mockBufferFieldValue.getSize.mockClear(); mockOriginalFieldValue.get.mockClear(); - mockArrayBufferFieldValue.size = 100; + mockBufferFieldValue.size = 100; expect(lengthFieldValue.get()).toBe(100); - expect(mockArrayBufferFieldValue.getSize).toHaveBeenCalledTimes( - 1, - ); + expect(mockBufferFieldValue.getSize).toHaveBeenCalledTimes(1); expect(mockOriginalFieldValue.get).toHaveBeenCalledTimes(1); }); - it("should return size of its `arrayBufferField` as string", () => { + it("should return size of its `bufferValue` as string", () => { const mockOriginalFieldValue = new MockLengthFieldValue(); - const mockArrayBufferFieldValue = - new MockBufferLikeFieldValue(); + mockOriginalFieldValue.value = "0"; + const mockBufferFieldValue = new MockBufferLikeFieldValue(); const lengthFieldValue = new VariableLengthBufferLikeFieldLengthValue( mockOriginalFieldValue, - mockArrayBufferFieldValue, + mockBufferFieldValue, ); - mockOriginalFieldValue.value = "0"; - mockArrayBufferFieldValue.size = 0; + mockBufferFieldValue.size = 0; expect(lengthFieldValue.get()).toBe("0"); - expect(mockArrayBufferFieldValue.getSize).toHaveBeenCalledTimes( - 1, - ); + expect(mockBufferFieldValue.getSize).toHaveBeenCalledTimes(1); expect(mockOriginalFieldValue.get).toHaveBeenCalledTimes(1); - mockArrayBufferFieldValue.getSize.mockClear(); + mockBufferFieldValue.getSize.mockClear(); mockOriginalFieldValue.get.mockClear(); - mockArrayBufferFieldValue.size = 100; + mockBufferFieldValue.size = 100; expect(lengthFieldValue.get()).toBe("100"); - expect(mockArrayBufferFieldValue.getSize).toHaveBeenCalledTimes( - 1, - ); + expect(mockBufferFieldValue.getSize).toHaveBeenCalledTimes(1); expect(mockOriginalFieldValue.get).toHaveBeenCalledTimes(1); }); }); @@ -159,16 +148,15 @@ describe("Types", () => { describe("#set", () => { it("should does nothing", () => { const mockOriginalFieldValue = new MockLengthFieldValue(); - const mockArrayBufferFieldValue = - new MockBufferLikeFieldValue(); + const mockBufferFieldValue = new MockBufferLikeFieldValue(); const lengthFieldValue = new VariableLengthBufferLikeFieldLengthValue( mockOriginalFieldValue, - mockArrayBufferFieldValue, + mockBufferFieldValue, ); mockOriginalFieldValue.value = 0; - mockArrayBufferFieldValue.size = 0; + mockBufferFieldValue.size = 0; expect(lengthFieldValue.get()).toBe(0); (lengthFieldValue as StructFieldValue).set(100); @@ -177,22 +165,21 @@ describe("Types", () => { }); describe("#serialize", () => { - it("should call `serialize` of its `originalField`", () => { + it("should call `serialize` of its `originalValue`", () => { const mockOriginalFieldValue = new MockLengthFieldValue(); - const mockArrayBufferFieldValue = - new MockBufferLikeFieldValue(); + const mockBufferFieldValue = new MockBufferLikeFieldValue(); const lengthFieldValue = new VariableLengthBufferLikeFieldLengthValue( mockOriginalFieldValue, - mockArrayBufferFieldValue, + mockBufferFieldValue, ); - const dataView = 0 as any; - const array = 2 as any; - const offset = 1 as any; + const dataView = {} as any; + const array = {} as any; + const offset = {} as any; mockOriginalFieldValue.value = 10; - mockArrayBufferFieldValue.size = 0; + mockBufferFieldValue.size = 0; lengthFieldValue.serialize(dataView, array, offset); expect(mockOriginalFieldValue.get).toHaveBeenCalledTimes(1); expect(mockOriginalFieldValue.get).toHaveReturnedWith(10); @@ -209,7 +196,7 @@ describe("Types", () => { mockOriginalFieldValue.set.mockClear(); mockOriginalFieldValue.serialize.mockClear(); - mockArrayBufferFieldValue.size = 100; + mockBufferFieldValue.size = 100; lengthFieldValue.serialize(dataView, array, offset); expect(mockOriginalFieldValue.set).toHaveBeenCalledTimes(1); expect(mockOriginalFieldValue.set).toHaveBeenCalledWith(100); @@ -223,22 +210,21 @@ describe("Types", () => { ); }); - it("should stringify its length if `originalField` is a string", () => { + it("should stringify its length if `originalValue` is a string", () => { const mockOriginalFieldValue = new MockLengthFieldValue(); - const mockArrayBufferFieldValue = - new MockBufferLikeFieldValue(); + const mockBufferFieldValue = new MockBufferLikeFieldValue(); const lengthFieldValue = new VariableLengthBufferLikeFieldLengthValue( mockOriginalFieldValue, - mockArrayBufferFieldValue, + mockBufferFieldValue, ); - const dataView = 0 as any; - const array = 2 as any; - const offset = 1 as any; + const dataView = {} as any; + const array = {} as any; + const offset = {} as any; mockOriginalFieldValue.value = "10"; - mockArrayBufferFieldValue.size = 0; + mockBufferFieldValue.size = 0; lengthFieldValue.serialize(dataView, array, offset); expect(mockOriginalFieldValue.get).toHaveBeenCalledTimes(1); expect(mockOriginalFieldValue.get).toHaveReturnedWith("10"); @@ -255,7 +241,7 @@ describe("Types", () => { mockOriginalFieldValue.set.mockClear(); mockOriginalFieldValue.serialize.mockClear(); - mockArrayBufferFieldValue.size = 100; + mockBufferFieldValue.size = 100; lengthFieldValue.serialize(dataView, array, offset); expect(mockOriginalFieldValue.set).toHaveBeenCalledTimes(1); expect(mockOriginalFieldValue.set).toHaveBeenCalledWith("100"); @@ -269,26 +255,25 @@ describe("Types", () => { ); }); - it("should stringify its length in specified radix if `originalField` is a string", () => { + it("should stringify its length in specified radix if `originalValue` is a string", () => { const mockOriginalFieldValue = new MockLengthFieldValue(); - const mockArrayBufferFieldValue = - new MockBufferLikeFieldValue(); + const mockBufferFieldValue = new MockBufferLikeFieldValue(); const lengthFieldValue = new VariableLengthBufferLikeFieldLengthValue( mockOriginalFieldValue, - mockArrayBufferFieldValue, + mockBufferFieldValue, ); const radix = 16; - mockArrayBufferFieldValue.definition.options.lengthFieldRadix = + mockBufferFieldValue.definition.options.lengthFieldRadix = radix; - const dataView = 0 as any; - const array = 2 as any; - const offset = 1 as any; + const dataView = {} as any; + const array = {} as any; + const offset = {} as any; mockOriginalFieldValue.value = "10"; - mockArrayBufferFieldValue.size = 0; + mockBufferFieldValue.size = 0; lengthFieldValue.serialize(dataView, array, offset); expect(mockOriginalFieldValue.get).toHaveBeenCalledTimes(1); expect(mockOriginalFieldValue.get).toHaveReturnedWith("10"); @@ -305,7 +290,7 @@ describe("Types", () => { mockOriginalFieldValue.set.mockClear(); mockOriginalFieldValue.serialize.mockClear(); - mockArrayBufferFieldValue.size = 100; + mockBufferFieldValue.size = 100; lengthFieldValue.serialize(dataView, array, offset); expect(mockOriginalFieldValue.set).toHaveBeenCalledTimes(1); expect(mockOriginalFieldValue.set).toHaveBeenCalledWith( @@ -323,7 +308,7 @@ describe("Types", () => { }); }); - describe("VariableLengthArrayBufferLikeStructFieldValue", () => { + describe("VariableLengthBufferLikeStructFieldValue", () => { describe(".constructor", () => { it("should forward parameters", () => { const struct = new StructValue({}); @@ -332,7 +317,7 @@ describe("Types", () => { const originalLengthFieldValue = new MockLengthFieldValue(); struct.set(lengthField, originalLengthFieldValue); - const arrayBufferFieldDefinition = + const bufferFieldDefinition = new VariableLengthBufferLikeFieldDefinition( Uint8ArrayBufferFieldConverter.Instance, { lengthField }, @@ -342,7 +327,7 @@ describe("Types", () => { const bufferFieldValue = new VariableLengthBufferLikeStructFieldValue( - arrayBufferFieldDefinition, + bufferFieldDefinition, StructDefaultOptions, struct, value, @@ -350,7 +335,7 @@ describe("Types", () => { expect(bufferFieldValue).toHaveProperty( "definition", - arrayBufferFieldDefinition, + bufferFieldDefinition, ); expect(bufferFieldValue).toHaveProperty( "options", @@ -362,14 +347,14 @@ describe("Types", () => { expect(bufferFieldValue).toHaveProperty("length", undefined); }); - it("should forward parameters with `arrayBuffer`", () => { + it("should accept initial `array`", () => { const struct = new StructValue({}); const lengthField = "foo"; const originalLengthFieldValue = new MockLengthFieldValue(); struct.set(lengthField, originalLengthFieldValue); - const arrayBufferFieldDefinition = + const bufferFieldDefinition = new VariableLengthBufferLikeFieldDefinition( Uint8ArrayBufferFieldConverter.Instance, { lengthField }, @@ -379,7 +364,7 @@ describe("Types", () => { const bufferFieldValue = new VariableLengthBufferLikeStructFieldValue( - arrayBufferFieldDefinition, + bufferFieldDefinition, StructDefaultOptions, struct, value, @@ -388,7 +373,7 @@ describe("Types", () => { expect(bufferFieldValue).toHaveProperty( "definition", - arrayBufferFieldDefinition, + bufferFieldDefinition, ); expect(bufferFieldValue).toHaveProperty( "options", @@ -397,7 +382,7 @@ describe("Types", () => { expect(bufferFieldValue).toHaveProperty("struct", struct); expect(bufferFieldValue).toHaveProperty("value", value); expect(bufferFieldValue).toHaveProperty("array", value); - expect(bufferFieldValue).toHaveProperty("length", 100); + expect(bufferFieldValue).toHaveProperty("length", value.length); }); it("should replace `lengthField` on `struct`", () => { @@ -407,7 +392,7 @@ describe("Types", () => { const originalLengthFieldValue = new MockLengthFieldValue(); struct.set(lengthField, originalLengthFieldValue); - const arrayBufferFieldDefinition = + const bufferFieldDefinition = new VariableLengthBufferLikeFieldDefinition( Uint8ArrayBufferFieldConverter.Instance, { lengthField }, @@ -417,7 +402,7 @@ describe("Types", () => { const bufferFieldValue = new VariableLengthBufferLikeStructFieldValue( - arrayBufferFieldDefinition, + bufferFieldDefinition, StructDefaultOptions, struct, value, @@ -433,7 +418,7 @@ describe("Types", () => { }); describe("#getSize", () => { - class MockArrayBufferFieldType extends BufferFieldConverter { + class MockBufferFieldConverter extends BufferFieldConverter { override toBuffer = jest.fn((value: Uint8Array): Uint8Array => { return value; }); @@ -461,20 +446,18 @@ describe("Types", () => { const originalLengthFieldValue = new MockLengthFieldValue(); struct.set(lengthField, originalLengthFieldValue); - const arrayBufferFieldType = new MockArrayBufferFieldType(); - const arrayBufferFieldDefinition = + const bufferFieldConverter = new MockBufferFieldConverter(); + const bufferFieldDefinition = new VariableLengthBufferLikeFieldDefinition( - arrayBufferFieldType, - { - lengthField, - }, + bufferFieldConverter, + { lengthField }, ); const value = new Uint8Array(100); const bufferFieldValue = new VariableLengthBufferLikeStructFieldValue( - arrayBufferFieldDefinition, + bufferFieldDefinition, StructDefaultOptions, struct, value, @@ -482,91 +465,87 @@ describe("Types", () => { ); expect(bufferFieldValue.getSize()).toBe(100); - expect(arrayBufferFieldType.toValue).toHaveBeenCalledTimes(0); - expect(arrayBufferFieldType.toBuffer).toHaveBeenCalledTimes(0); - expect(arrayBufferFieldType.getSize).toHaveBeenCalledTimes(0); + expect(bufferFieldConverter.toValue).toHaveBeenCalledTimes(0); + expect(bufferFieldConverter.toBuffer).toHaveBeenCalledTimes(0); + expect(bufferFieldConverter.getSize).toHaveBeenCalledTimes(0); }); - it("should call `getSize` of its `type`", () => { + it("should call `getSize` of its `converter`", () => { const struct = new StructValue({}); const lengthField = "foo"; const originalLengthFieldValue = new MockLengthFieldValue(); struct.set(lengthField, originalLengthFieldValue); - const arrayBufferFieldType = new MockArrayBufferFieldType(); - const arrayBufferFieldDefinition = + const bufferFieldConverter = new MockBufferFieldConverter(); + const bufferFieldDefinition = new VariableLengthBufferLikeFieldDefinition( - arrayBufferFieldType, - { - lengthField, - }, + bufferFieldConverter, + { lengthField }, ); const value = new Uint8Array(100); const bufferFieldValue = new VariableLengthBufferLikeStructFieldValue( - arrayBufferFieldDefinition, + bufferFieldDefinition, StructDefaultOptions, struct, value, ); - arrayBufferFieldType.size = 100; + bufferFieldConverter.size = 100; expect(bufferFieldValue.getSize()).toBe(100); - expect(arrayBufferFieldType.toValue).toHaveBeenCalledTimes(0); - expect(arrayBufferFieldType.toBuffer).toHaveBeenCalledTimes(0); - expect(arrayBufferFieldType.getSize).toHaveBeenCalledTimes(1); + expect(bufferFieldConverter.toValue).toHaveBeenCalledTimes(0); + expect(bufferFieldConverter.toBuffer).toHaveBeenCalledTimes(0); + expect(bufferFieldConverter.getSize).toHaveBeenCalledTimes(1); expect(bufferFieldValue).toHaveProperty("array", undefined); expect(bufferFieldValue).toHaveProperty("length", 100); }); - it("should call `toArrayBuffer` of its `type` if it does not support `getSize`", () => { + it("should call `toBuffer` of its `converter` if it does not support `getSize`", () => { const struct = new StructValue({}); const lengthField = "foo"; const originalLengthFieldValue = new MockLengthFieldValue(); struct.set(lengthField, originalLengthFieldValue); - const arrayBufferFieldType = new MockArrayBufferFieldType(); - const arrayBufferFieldDefinition = + const bufferFieldConverter = new MockBufferFieldConverter(); + const bufferFieldDefinition = new VariableLengthBufferLikeFieldDefinition( - arrayBufferFieldType, - { - lengthField, - }, + bufferFieldConverter, + { lengthField }, ); const value = new Uint8Array(100); const bufferFieldValue = new VariableLengthBufferLikeStructFieldValue( - arrayBufferFieldDefinition, + bufferFieldDefinition, StructDefaultOptions, struct, value, ); - arrayBufferFieldType.size = undefined; + bufferFieldConverter.size = undefined; expect(bufferFieldValue.getSize()).toBe(100); - expect(arrayBufferFieldType.toValue).toHaveBeenCalledTimes(0); - expect(arrayBufferFieldType.toBuffer).toHaveBeenCalledTimes(1); - expect(arrayBufferFieldType.getSize).toHaveBeenCalledTimes(1); + expect(bufferFieldConverter.toValue).toHaveBeenCalledTimes(0); + expect(bufferFieldConverter.toBuffer).toHaveBeenCalledTimes(1); + expect(bufferFieldConverter.getSize).toHaveBeenCalledTimes(1); expect(bufferFieldValue).toHaveProperty("array", value); expect(bufferFieldValue).toHaveProperty("length", 100); }); }); describe("#set", () => { - it("should call `ArrayBufferLikeFieldValue#set`", () => { + it("should call `BufferLikeFieldValue#set`", () => { const struct = new StructValue({}); const lengthField = "foo"; const originalLengthFieldValue = new MockLengthFieldValue(); struct.set(lengthField, originalLengthFieldValue); - const arrayBufferFieldDefinition = + const bufferFieldDefinition = new VariableLengthBufferLikeFieldDefinition( Uint8ArrayBufferFieldConverter.Instance, { lengthField }, @@ -576,7 +555,7 @@ describe("Types", () => { const bufferFieldValue = new VariableLengthBufferLikeStructFieldValue( - arrayBufferFieldDefinition, + bufferFieldDefinition, StructDefaultOptions, struct, value, @@ -596,7 +575,7 @@ describe("Types", () => { const originalLengthFieldValue = new MockLengthFieldValue(); struct.set(lengthField, originalLengthFieldValue); - const arrayBufferFieldDefinition = + const bufferFieldDefinition = new VariableLengthBufferLikeFieldDefinition( Uint8ArrayBufferFieldConverter.Instance, { lengthField }, @@ -606,7 +585,7 @@ describe("Types", () => { const bufferFieldValue = new VariableLengthBufferLikeStructFieldValue( - arrayBufferFieldDefinition, + bufferFieldDefinition, StructDefaultOptions, struct, value, @@ -620,7 +599,7 @@ describe("Types", () => { }); }); - describe("VariableLengthArrayBufferLikeFieldDefinition", () => { + describe("VariableLengthBufferLikeFieldDefinition", () => { describe("#getSize", () => { it("should always return `0`", () => { const definition = new VariableLengthBufferLikeFieldDefinition( @@ -703,7 +682,7 @@ describe("Types", () => { }); describe("#create", () => { - it("should create a `VariableLengthArrayBufferLikeFieldValue`", () => { + it("should create a `VariableLengthBufferLikeStructFieldValue`", () => { const struct = new StructValue({}); const lengthField = "foo"; @@ -736,7 +715,7 @@ describe("Types", () => { expect(bufferFieldValue).toHaveProperty("length", undefined); }); - it("should create a `VariableLengthArrayBufferLikeFieldValue` with `arrayBuffer`", () => { + it("should create a `VariableLengthBufferLikeStructFieldValue` with `arrayBuffer`", () => { const struct = new StructValue({}); const lengthField = "foo"; diff --git a/libraries/struct/src/types/buffer/variable-length.ts b/libraries/struct/src/types/buffer/variable-length.ts index e83f4bde..8035dda9 100644 --- a/libraries/struct/src/types/buffer/variable-length.ts +++ b/libraries/struct/src/types/buffer/variable-length.ts @@ -91,7 +91,7 @@ export class VariableLengthBufferLikeStructFieldValue< super(definition, options, struct, value, array); if (array) { - this.length = array.byteLength; + this.length = array.length; } // Patch the associated length field. @@ -105,25 +105,26 @@ export class VariableLengthBufferLikeStructFieldValue< struct.set(lengthField, this.lengthFieldValue); } - override getSize() { - if (this.length !== undefined) { - // Have cached length - return this.length; + #tryGetSize() { + const length = this.definition.converter.getSize(this.value); + if (length !== undefined && length < 0) { + throw new Error("Invalid length"); + } + return length; + } + + override getSize(): number { + if (this.length === undefined) { + // first try to get the size from the converter + this.length = this.#tryGetSize(); } - this.length = this.definition.converter.getSize(this.value); - if (this.length !== undefined) { - if (this.length < 0) { - throw new Error("Invalid length"); - } - - // The converter knows the size - return this.length; + if (this.length === undefined) { + // The converter doesn't know the size, so convert the value to a buffer to get its size + this.array = this.definition.converter.toBuffer(this.value); + this.length = this.array.length; } - // The converter doesn't know the size, so we need to convert to buffer first - this.array = this.definition.converter.toBuffer(this.value); - this.length = this.array.byteLength; return this.length; } @@ -146,39 +147,39 @@ type VariableLengthBufferLikeFieldValueLike = StructFieldValue< export class VariableLengthBufferLikeFieldLengthValue extends StructFieldValue< StructFieldDefinition > { - protected originalField: StructFieldValue< + protected originalValue: StructFieldValue< StructFieldDefinition >; - protected bufferField: VariableLengthBufferLikeFieldValueLike; + protected bufferValue: VariableLengthBufferLikeFieldValueLike; constructor( - originalField: StructFieldValue< + originalValue: StructFieldValue< StructFieldDefinition >, - arrayBufferField: VariableLengthBufferLikeFieldValueLike, + bufferValue: VariableLengthBufferLikeFieldValueLike, ) { super( - originalField.definition, - originalField.options, - originalField.struct, + originalValue.definition, + originalValue.options, + originalValue.struct, 0, ); - this.originalField = originalField; - this.bufferField = arrayBufferField; + this.originalValue = originalValue; + this.bufferValue = bufferValue; } override getSize() { - return this.originalField.getSize(); + return this.originalValue.getSize(); } override get() { - let value: string | number = this.bufferField.getSize(); + let value: string | number = this.bufferValue.getSize(); - const originalValue = this.originalField.get(); + const originalValue = this.originalValue.get(); if (typeof originalValue === "string") { value = value.toString( - this.bufferField.definition.options.lengthFieldRadix ?? 10, + this.bufferValue.definition.options.lengthFieldRadix ?? 10, ); } @@ -191,7 +192,7 @@ export class VariableLengthBufferLikeFieldLengthValue extends StructFieldValue< } serialize(dataView: DataView, array: Uint8Array, offset: number) { - this.originalField.set(this.get()); - this.originalField.serialize(dataView, array, offset); + this.originalValue.set(this.get()); + this.originalValue.serialize(dataView, array, offset); } } diff --git a/libraries/struct/src/types/number.ts b/libraries/struct/src/types/number.ts index f104bc97..93a14c78 100644 --- a/libraries/struct/src/types/number.ts +++ b/libraries/struct/src/types/number.ts @@ -1,6 +1,7 @@ import { getInt16, getInt32, + getInt8, getUint16, getUint32, } from "@yume-chan/no-data-view"; @@ -43,8 +44,7 @@ export namespace NumberFieldVariant { signed: true, size: 1, deserialize(array) { - const value = Uint8.deserialize(array, false); - return (value << 24) >> 24; + return getInt8(array, 0); }, serialize(dataView, offset, value) { dataView.setInt8(offset, value); diff --git a/libraries/struct/src/utils.ts b/libraries/struct/src/utils.ts index 866ab30c..3431e52d 100644 --- a/libraries/struct/src/utils.ts +++ b/libraries/struct/src/utils.ts @@ -80,15 +80,15 @@ interface GlobalExtension { const { TextEncoder, TextDecoder } = globalThis as unknown as GlobalExtension; -const Utf8Encoder = new TextEncoder(); -const Utf8Decoder = new TextDecoder(); +const SharedEncoder = new TextEncoder(); +const SharedDecoder = new TextDecoder(); export function encodeUtf8(input: string): Uint8Array { - return Utf8Encoder.encode(input); + return SharedEncoder.encode(input); } export function decodeUtf8(buffer: ArrayBufferView | ArrayBuffer): string { // `TextDecoder` has internal states in stream mode, - // but we don't use stream mode here, so it's safe to reuse the instance - return Utf8Decoder.decode(buffer); + // but this method is not for stream mode, so the instance can be reused + return SharedDecoder.decode(buffer); } diff --git a/rush.json b/rush.json index 7678d601..533f8032 100644 --- a/rush.json +++ b/rush.json @@ -24,7 +24,7 @@ * Specify one of: "pnpmVersion", "npmVersion", or "yarnVersion". See the Rush documentation * for details about these alternatives. */ - "pnpmVersion": "8.15.6", + "pnpmVersion": "9.1.4", // "npmVersion": "6.14.15", // "yarnVersion": "1.9.4", /** diff --git a/toolchain/eslint-config/package.json b/toolchain/eslint-config/package.json index 2d9b7ec2..8a65c14c 100644 --- a/toolchain/eslint-config/package.json +++ b/toolchain/eslint-config/package.json @@ -7,14 +7,14 @@ "run-eslint": "run-eslint.js" }, "dependencies": { - "@eslint/js": "^9.3.0", - "@types/node": "^20.12.12", - "eslint": "^9.3.0", - "eslint-plugin-import-x": "^0.5.0", + "@eslint/js": "^9.4.0", + "@types/node": "^20.13.0", + "eslint": "^9.4.0", + "eslint-plugin-import-x": "^0.5.1", "typescript": "^5.4.5", - "typescript-eslint": "^7.9.0" + "typescript-eslint": "^7.11.0" }, "devDependencies": { - "prettier": "^3.2.5" + "prettier": "^3.3.0" } } diff --git a/toolchain/tsconfig/package.json b/toolchain/tsconfig/package.json index b9dd3049..624e470d 100644 --- a/toolchain/tsconfig/package.json +++ b/toolchain/tsconfig/package.json @@ -2,6 +2,6 @@ "name": "@yume-chan/tsconfig", "version": "1.0.0", "devDependencies": { - "prettier": "^3.2.5" + "prettier": "^3.3.0" } }