diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6095fcd4..8ee285e7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,17 +1,15 @@ ## Development -The repository uses [Rush](https://rushjs.io/) for monorepo management. +The repository uses [PNPM](https://pnpm.io/) for monorepo management. -### Install Rush globally +### Install PNPM globally ```sh -$ npm i -g @microsoft/rush +$ npm i -g pnpm ``` ### Get code -The build script only works inside a Git repository, so, always use `git` to clone this repository. "Download ZIP" option in GitHub code menu or source code tarball in GitHub releases will NOT work. - ```sh git clone https://github.com/yume-chan/ya-webadb.git cd ya-webadb @@ -20,30 +18,61 @@ cd ya-webadb ### Install dependencies ```sh -$ rush install +$ pnpm install ``` -### Everyday commands +### Build all packages -- Build all packages: +```sh +$ pnpm build +``` - ```sh - $ rush build - ``` +### Run all tests -- Watch changes and rebuild in all libraries: +Tests are written using Node.js built-in test runner. Node.js 20.x is used in local development and GitHub Actions, Node.js 22.x might have a regression on parsing source maps. - ```sh - $ rush build:watch - ``` +```sh +$ pnpm test +``` + +### Run ESLint and Prettier + +```sh +$ pnpm lint +``` + +## Update dependencies + +```sh +$ pnpm recursive update --latest --interactive +$ pnpm dedupe +``` + +Renovate is also enabled, but since it doesn't update `package.json` files, it's recommended to run the above commands manually. + +Run `pnpm build` and `pnpm test` to make sure everything works after updating dependencies. + +## Creating Pull Requests + +When creating a pull request, use `changeset` command to add a new changelog: + +```sh +$ pnpm changeset +``` + +Then follow the instructions to select changed packages and write a summary of the changes. ## Release new versions +NPM packages are released using GitHub Actions. Create a new tag and push it to the repository to trigger the release workflow. + ```sh -rush version --bump -export NPM_AUTH_TOKEN=... # Copy NPM auth token from ~/.npmrc -rush publish -p --include-all --set-access-level public -rush update # Update lock file +pnpm changeset version +git add -A +git commit -m "chore: release new version" +git push +git tag vX.Y.Z +git push --tags ``` ## FAQ diff --git a/apps/cli/package.json b/apps/cli/package.json index 547d8a60..627864f1 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -27,7 +27,6 @@ "types": "esm/index.d.ts", "scripts": { "build": "tsc -b tsconfig.build.json", - "build:watch": "tsc -b tsconfig.build.json", "lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4" }, "bin": { @@ -42,7 +41,7 @@ "source-map-support": "^0.5.21" }, "devDependencies": { - "@types/node": "^20.14.11", + "@types/node": "^20.14.12", "@yume-chan/eslint-config": "workspace:^1.0.0", "@yume-chan/tsconfig": "workspace:^1.0.0", "prettier": "^3.3.3", diff --git a/libraries/adb-credential-web/package.json b/libraries/adb-credential-web/package.json index ab811e1d..96435ec2 100644 --- a/libraries/adb-credential-web/package.json +++ b/libraries/adb-credential-web/package.json @@ -26,7 +26,6 @@ "sideEffects": false, "scripts": { "build": "tsc -b tsconfig.build.json", - "build:watch": "tsc -b tsconfig.build.json", "lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4", "prepublishOnly": "npm run build" }, diff --git a/libraries/adb-daemon-webusb/package.json b/libraries/adb-daemon-webusb/package.json index c7dc5d5e..aa3ec7f4 100644 --- a/libraries/adb-daemon-webusb/package.json +++ b/libraries/adb-daemon-webusb/package.json @@ -27,7 +27,6 @@ "sideEffects": false, "scripts": { "build": "tsc -b tsconfig.build.json", - "build:watch": "tsc -b tsconfig.build.json", "lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4", "prepublishOnly": "npm run build", "test": "run-test" @@ -39,7 +38,7 @@ "@yume-chan/struct": "workspace:^0.0.24" }, "devDependencies": { - "@types/node": "^20.14.11", + "@types/node": "^20.14.12", "@yume-chan/eslint-config": "workspace:^1.0.0", "@yume-chan/test-runner": "workspace:^1.0.0", "@yume-chan/tsconfig": "workspace:^1.0.0", diff --git a/libraries/adb-scrcpy/package.json b/libraries/adb-scrcpy/package.json index f9f932b0..f7689d46 100644 --- a/libraries/adb-scrcpy/package.json +++ b/libraries/adb-scrcpy/package.json @@ -28,7 +28,6 @@ "sideEffects": false, "scripts": { "build": "tsc -b tsconfig.build.json", - "build:watch": "tsc -b tsconfig.build.json", "lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4", "prepublishOnly": "npm run build" }, diff --git a/libraries/adb-server-node-tcp/package.json b/libraries/adb-server-node-tcp/package.json index 8902d13e..c7f9fe9d 100644 --- a/libraries/adb-server-node-tcp/package.json +++ b/libraries/adb-server-node-tcp/package.json @@ -29,7 +29,6 @@ "sideEffects": false, "scripts": { "build": "tsc -b tsconfig.build.json", - "build:watch": "tsc -b tsconfig.build.json", "lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4" }, "dependencies": { @@ -38,7 +37,7 @@ "@yume-chan/struct": "workspace:^0.0.24" }, "devDependencies": { - "@types/node": "^20.14.11", + "@types/node": "^20.14.12", "@yume-chan/eslint-config": "workspace:^1.0.0", "@yume-chan/tsconfig": "workspace:^1.0.0", "prettier": "^3.3.3", diff --git a/libraries/adb/package.json b/libraries/adb/package.json index 1aef7d89..3a5b6eb9 100644 --- a/libraries/adb/package.json +++ b/libraries/adb/package.json @@ -27,7 +27,6 @@ "sideEffects": false, "scripts": { "build": "tsc -b tsconfig.build.json", - "build:watch": "tsc -b tsconfig.build.json", "lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4", "prepublishOnly": "npm run build", "test": "run-test" @@ -40,7 +39,7 @@ "@yume-chan/struct": "workspace:^0.0.24" }, "devDependencies": { - "@types/node": "^20.14.11", + "@types/node": "^20.14.12", "@yume-chan/eslint-config": "workspace:^1.0.0", "@yume-chan/test-runner": "workspace:^1.0.0", "@yume-chan/tsconfig": "workspace:^1.0.0", diff --git a/libraries/android-bin/package.json b/libraries/android-bin/package.json index 6782c3f7..a96365a1 100644 --- a/libraries/android-bin/package.json +++ b/libraries/android-bin/package.json @@ -27,7 +27,6 @@ "sideEffects": false, "scripts": { "build": "tsc -b tsconfig.build.json", - "build:watch": "tsc -b tsconfig.build.json", "lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4", "prepublishOnly": "npm run build", "test": "run-test" @@ -38,7 +37,7 @@ "@yume-chan/struct": "workspace:^0.0.24" }, "devDependencies": { - "@types/node": "^20.14.11", + "@types/node": "^20.14.12", "@yume-chan/eslint-config": "workspace:^1.0.0", "@yume-chan/test-runner": "workspace:^1.0.0", "@yume-chan/tsconfig": "workspace:^1.0.0", diff --git a/libraries/aoa/package.json b/libraries/aoa/package.json index 65b067d8..e7c676a9 100644 --- a/libraries/aoa/package.json +++ b/libraries/aoa/package.json @@ -27,7 +27,6 @@ "sideEffects": false, "scripts": { "build": "tsc -b tsconfig.build.json", - "build:watch": "tsc -b tsconfig.build.json", "lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4", "prepublishOnly": "npm run build" }, diff --git a/libraries/event/package.json b/libraries/event/package.json index 566eec40..363e0fb1 100644 --- a/libraries/event/package.json +++ b/libraries/event/package.json @@ -28,7 +28,6 @@ "sideEffects": false, "scripts": { "build": "tsc -b tsconfig.build.json", - "build:watch": "tsc -b tsconfig.build.json", "lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4", "prepublishOnly": "npm run build", "test": "run-test" @@ -37,7 +36,7 @@ "@yume-chan/async": "^2.2.0" }, "devDependencies": { - "@types/node": "^20.14.11", + "@types/node": "^20.14.12", "@yume-chan/eslint-config": "workspace:^1.0.0", "@yume-chan/test-runner": "workspace:^1.0.0", "@yume-chan/tsconfig": "workspace:^1.0.0", diff --git a/libraries/fetch-scrcpy-server/package.json b/libraries/fetch-scrcpy-server/package.json index d77d77aa..3d76b9e9 100644 --- a/libraries/fetch-scrcpy-server/package.json +++ b/libraries/fetch-scrcpy-server/package.json @@ -31,6 +31,6 @@ "gh-release-fetch": "^4.0.3" }, "devDependencies": { - "@types/node": "^20.14.11" + "@types/node": "^20.14.12" } } diff --git a/libraries/no-data-view/package.json b/libraries/no-data-view/package.json index 7b504089..9ebee6b3 100644 --- a/libraries/no-data-view/package.json +++ b/libraries/no-data-view/package.json @@ -25,13 +25,12 @@ "scripts": { "benchmark": "node benchmark.js", "build": "tsc -b tsconfig.build.json", - "build:watch": "tsc -b tsconfig.build.json", "lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4", "prepublishOnly": "npm run build", "test": "run-test" }, "devDependencies": { - "@types/node": "^20.14.11", + "@types/node": "^20.14.12", "@yume-chan/eslint-config": "workspace:^1.0.0", "@yume-chan/test-runner": "workspace:^1.0.0", "@yume-chan/tsconfig": "workspace:^1.0.0", diff --git a/libraries/pcm-player/package.json b/libraries/pcm-player/package.json index 544cc2fc..eabba454 100644 --- a/libraries/pcm-player/package.json +++ b/libraries/pcm-player/package.json @@ -26,7 +26,6 @@ "sideEffects": false, "scripts": { "build": "tsc -b tsconfig.dom.json && tsc -b tsconfig.worker.json", - "build:watch": "tsc -b tsconfig.dom.json && tsc -b tsconfig.worker.json", "lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4", "prepublishOnly": "npm run build" }, diff --git a/libraries/scrcpy-decoder-tinyh264/package.json b/libraries/scrcpy-decoder-tinyh264/package.json index cbf03627..2881f6fd 100644 --- a/libraries/scrcpy-decoder-tinyh264/package.json +++ b/libraries/scrcpy-decoder-tinyh264/package.json @@ -29,7 +29,6 @@ "sideEffects": false, "scripts": { "build": "tsc -b tsconfig.build.json", - "build:watch": "tsc -b tsconfig.build.json", "lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4", "prepublishOnly": "npm run build" }, diff --git a/libraries/scrcpy-decoder-webcodecs/package.json b/libraries/scrcpy-decoder-webcodecs/package.json index 02860882..937f88aa 100644 --- a/libraries/scrcpy-decoder-webcodecs/package.json +++ b/libraries/scrcpy-decoder-webcodecs/package.json @@ -29,7 +29,6 @@ "sideEffects": false, "scripts": { "build": "tsc -b tsconfig.build.json", - "build:watch": "tsc -b tsconfig.build.json", "lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4", "prepublishOnly": "npm run build" }, diff --git a/libraries/scrcpy/package.json b/libraries/scrcpy/package.json index bfdf9a67..942d4b33 100644 --- a/libraries/scrcpy/package.json +++ b/libraries/scrcpy/package.json @@ -28,7 +28,6 @@ "sideEffects": false, "scripts": { "build": "tsc -b tsconfig.build.json", - "build:watch": "tsc -b tsconfig.build.json", "lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4", "prepublishOnly": "npm run build", "test": "run-test" @@ -40,7 +39,7 @@ "@yume-chan/struct": "workspace:^0.0.24" }, "devDependencies": { - "@types/node": "^20.14.11", + "@types/node": "^20.14.12", "@yume-chan/eslint-config": "workspace:^1.0.0", "@yume-chan/test-runner": "workspace:^1.0.0", "@yume-chan/tsconfig": "workspace:^1.0.0", diff --git a/libraries/stream-extra/package.json b/libraries/stream-extra/package.json index 9a279701..a2fb5ef9 100644 --- a/libraries/stream-extra/package.json +++ b/libraries/stream-extra/package.json @@ -27,7 +27,6 @@ "sideEffects": false, "scripts": { "build": "tsc -b tsconfig.build.json", - "build:watch": "tsc -b tsconfig.build.json", "lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4", "prepublishOnly": "npm run build", "test": "run-test" @@ -37,7 +36,7 @@ "@yume-chan/struct": "workspace:^0.0.24" }, "devDependencies": { - "@types/node": "^20.14.11", + "@types/node": "^20.14.12", "@yume-chan/eslint-config": "workspace:^1.0.0", "@yume-chan/test-runner": "workspace:^1.0.0", "@yume-chan/tsconfig": "workspace:^1.0.0", diff --git a/libraries/struct/package.json b/libraries/struct/package.json index 6ae09f89..bd08866a 100644 --- a/libraries/struct/package.json +++ b/libraries/struct/package.json @@ -29,7 +29,6 @@ "sideEffects": false, "scripts": { "build": "tsc -b tsconfig.build.json", - "build:watch": "tsc -b tsconfig.build.json", "lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4", "prepublishOnly": "npm run build", "test": "run-test" @@ -38,7 +37,7 @@ "@yume-chan/no-data-view": "workspace:^0.0.24" }, "devDependencies": { - "@types/node": "^20.14.11", + "@types/node": "^20.14.12", "@yume-chan/eslint-config": "workspace:^1.0.0", "@yume-chan/test-runner": "workspace:^1.0.0", "@yume-chan/tsconfig": "workspace:^1.0.0", diff --git a/package.json b/package.json index 52b96b88..32dc9a57 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "test": "pnpm recursive run test", "lint": "pnpm recursive run lint" }, - "dependencies": { + "devDependencies": { "@changesets/cli": "^2.27.7" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 604f47e7..0a0eb2ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,7 +7,7 @@ settings: importers: .: - dependencies: + devDependencies: '@changesets/cli': specifier: ^2.27.7 version: 2.27.7 @@ -34,8 +34,8 @@ importers: version: 0.5.21 devDependencies: '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: ^20.14.12 + version: 20.14.12 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -68,8 +68,8 @@ importers: version: link:../struct devDependencies: '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: ^20.14.12 + version: 20.14.12 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -121,8 +121,8 @@ importers: version: link:../struct devDependencies: '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: ^20.14.12 + version: 20.14.12 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -186,8 +186,8 @@ importers: version: link:../struct devDependencies: '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: ^20.14.12 + version: 20.14.12 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -214,8 +214,8 @@ importers: version: link:../struct devDependencies: '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: ^20.14.12 + version: 20.14.12 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -258,8 +258,8 @@ importers: version: 2.2.0 devDependencies: '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: ^20.14.12 + version: 20.14.12 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -283,14 +283,14 @@ importers: version: 4.0.3 devDependencies: '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: ^20.14.12 + version: 20.14.12 libraries/no-data-view: devDependencies: '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: ^20.14.12 + version: 20.14.12 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -344,8 +344,8 @@ importers: version: link:../struct devDependencies: '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: ^20.14.12 + version: 20.14.12 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -440,8 +440,8 @@ importers: version: link:../struct devDependencies: '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: ^20.14.12 + version: 20.14.12 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -465,8 +465,8 @@ importers: version: link:../no-data-view devDependencies: '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: ^20.14.12 + version: 20.14.12 '@yume-chan/eslint-config': specifier: workspace:^1.0.0 version: link:../../toolchain/eslint-config @@ -489,8 +489,8 @@ importers: specifier: ^9.7.0 version: 9.7.0 '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: ^20.14.12 + version: 20.14.12 eslint: specifier: ^9.7.0 version: 9.7.0 @@ -511,8 +511,8 @@ importers: toolchain/package-lint: dependencies: '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: ^20.14.12 + version: 20.14.12 json5: specifier: ^2.2.3 version: 2.2.3 @@ -520,8 +520,8 @@ importers: toolchain/test-runner: devDependencies: '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: ^20.14.12 + version: 20.14.12 typescript: specifier: ^5.5.4 version: 5.5.4 @@ -665,8 +665,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.14.11': - resolution: {integrity: sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==} + '@types/node@20.14.12': + resolution: {integrity: sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==} '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -1533,11 +1533,6 @@ packages: resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} hasBin: true - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} - engines: {node: '>=10'} - hasBin: true - semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} @@ -1771,7 +1766,7 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.6.2 + semver: 7.6.3 '@changesets/assemble-release-plan@6.0.3': dependencies: @@ -1781,7 +1776,7 @@ snapshots: '@changesets/should-skip-package': 0.1.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - semver: 7.6.2 + semver: 7.6.3 '@changesets/changelog-git@0.2.0': dependencies: @@ -1818,7 +1813,7 @@ snapshots: p-limit: 2.3.0 preferred-pm: 3.1.4 resolve-from: 5.0.0 - semver: 7.6.2 + semver: 7.6.3 spawndamnit: 2.0.0 term-size: 2.2.1 @@ -1842,7 +1837,7 @@ snapshots: '@manypkg/get-packages': 1.1.3 chalk: 2.4.2 fs-extra: 7.0.1 - semver: 7.6.2 + semver: 7.6.3 '@changesets/get-release-plan@4.0.3': dependencies: @@ -1991,7 +1986,7 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@20.14.11': + '@types/node@20.14.12': dependencies: undici-types: 5.26.5 @@ -2520,7 +2515,7 @@ snapshots: dependencies: '@xhmikosr/downloader': 13.0.1 node-fetch: 3.3.2 - semver: 7.6.2 + semver: 7.6.3 glob-parent@5.1.2: dependencies: @@ -2685,7 +2680,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.6.2 + semver: 7.6.3 merge-options@3.0.4: dependencies: @@ -2873,8 +2868,6 @@ snapshots: dependencies: commander: 2.20.3 - semver@7.6.2: {} - semver@7.6.3: {} shebang-command@1.2.0: diff --git a/toolchain/eslint-config/package.json b/toolchain/eslint-config/package.json index 6cd13303..9b2ab7d4 100644 --- a/toolchain/eslint-config/package.json +++ b/toolchain/eslint-config/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "@eslint/js": "^9.7.0", - "@types/node": "^20.14.11", + "@types/node": "^20.14.12", "eslint": "^9.7.0", "eslint-plugin-import-x": "^3.1.0", "typescript": "^5.5.4", diff --git a/toolchain/package-lint/package.json b/toolchain/package-lint/package.json index 5284cd22..9b8676ad 100644 --- a/toolchain/package-lint/package.json +++ b/toolchain/package-lint/package.json @@ -7,7 +7,7 @@ "scripts": {}, "keywords": [], "dependencies": { - "@types/node": "^20.14.11", + "@types/node": "^20.14.12", "json5": "^2.2.3" }, "author": "", diff --git a/toolchain/test-runner/package.json b/toolchain/test-runner/package.json index 6298a29a..3e67e55f 100644 --- a/toolchain/test-runner/package.json +++ b/toolchain/test-runner/package.json @@ -6,7 +6,7 @@ "run-test": "wrapper.js" }, "devDependencies": { - "@types/node": "^20.14.11", + "@types/node": "^20.14.12", "typescript": "^5.5.4" } }