diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0817683..38c9469 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: ["20", "lts/*"] + node-version: ["22"] steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/compat.yml b/.github/workflows/compat.yml index 3aa81ed..bd32829 100644 --- a/.github/workflows/compat.yml +++ b/.github/workflows/compat.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: lts/* + node-version: "22" cache: pnpm - run: pnpm install --frozen-lockfile @@ -35,7 +35,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: lts/* + node-version: "22" cache: pnpm - run: pnpm install --frozen-lockfile diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index f9f3879..c4b72a0 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -29,7 +29,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: lts/* + node-version: "22" cache: pnpm - run: pnpm install --frozen-lockfile diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index e7bc5c2..abba4a7 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -20,7 +20,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: lts/* + node-version: "22" registry-url: https://registry.npmjs.org cache: pnpm @@ -51,7 +51,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: lts/* + node-version: "22" registry-url: https://npm.pkg.github.com cache: pnpm diff --git a/.github/workflows/snyk.yml b/.github/workflows/snyk.yml index b9777a6..f3db317 100644 --- a/.github/workflows/snyk.yml +++ b/.github/workflows/snyk.yml @@ -22,7 +22,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: lts/* + node-version: "22" cache: pnpm - name: Install dependencies diff --git a/CHANGELOG.md b/CHANGELOG.md index c6c11ce..dbe86fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- **BREAKING**: minimum Node version raised from 20 to 22 (`engines.node >=22.0.0`). Driven by upstream pnpm 11.x dropping Node 20 support (uses `node:sqlite`, available in Node 22.13+ only). `@types/node` bumped to `^24` (LTS line). +- Upgraded CLI framework `commander` 12→14. No user-facing behaviour change expected; `--help`, `--version`, and subcommand signatures (`generate `, `locales`, `describe`) are unchanged. If `--help` output formatting shifts (whitespace), it is upstream cosmetic. - Dev: bumped typescript 5.9→6 (added tsconfig flags for tsup DTS compatibility). vitest stays at 3.x; vitest 4 deferred across the workspace pending vitepress 2 stable (vitepress 1 pins vite 5; vitest 4 requires vite 6+). No user-facing behaviour change. - Dev: bumped eslint to 10; removed unused zod dependency. No user-facing behaviour change. diff --git a/package.json b/package.json index 0bf233d..a0ea0f7 100644 --- a/package.json +++ b/package.json @@ -71,10 +71,10 @@ "prepublishOnly": "pnpm build && pnpm typecheck && pnpm test" }, "dependencies": { - "commander": "^12.1.0" + "commander": "^14.0.3" }, "devDependencies": { - "@types/node": "^20.19.41", + "@types/node": "^24.12.4", "@typescript-eslint/eslint-plugin": "^8.59.4", "@typescript-eslint/parser": "^8.59.4", "@vitest/coverage-v8": "^3.2.4", @@ -90,8 +90,8 @@ }, "packageManager": "pnpm@10.32.1", "engines": { - "node": ">=20.0.0", - "pnpm": ">=9.0.0" + "node": ">=22.0.0", + "pnpm": ">=10.0.0" }, "pnpm": { "onlyBuiltDependencies": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7500e44..6402093 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,12 +9,12 @@ importers: .: dependencies: commander: - specifier: ^12.1.0 - version: 12.1.0 + specifier: ^14.0.3 + version: 14.0.3 devDependencies: '@types/node': - specifier: ^20.19.41 - version: 20.19.41 + specifier: ^24.12.4 + version: 24.12.4 '@typescript-eslint/eslint-plugin': specifier: ^8.59.4 version: 8.59.4(@typescript-eslint/parser@8.59.4(eslint@10.4.0)(typescript@6.0.3))(eslint@10.4.0)(typescript@6.0.3) @@ -23,7 +23,7 @@ importers: version: 8.59.4(eslint@10.4.0)(typescript@6.0.3) '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@20.19.41)(tsx@4.22.3)) + version: 3.2.4(vitest@3.2.4(@types/node@24.12.4)(tsx@4.22.3)) eslint: specifier: ^10.4.0 version: 10.4.0 @@ -47,10 +47,10 @@ importers: version: 8.59.4(eslint@10.4.0)(typescript@6.0.3) vitepress: specifier: ^1.6.4 - version: 1.6.4(@algolia/client-search@5.52.1)(@types/node@20.19.41)(postcss@8.5.15)(search-insights@2.17.3)(typescript@6.0.3) + version: 1.6.4(@algolia/client-search@5.52.1)(@types/node@24.12.4)(postcss@8.5.15)(search-insights@2.17.3)(typescript@6.0.3) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@20.19.41)(tsx@4.22.3) + version: 3.2.4(@types/node@24.12.4)(tsx@4.22.3) packages: @@ -904,8 +904,8 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - '@types/node@20.19.41': - resolution: {integrity: sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==} + '@types/node@24.12.4': + resolution: {integrity: sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -1209,9 +1209,9 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} @@ -1894,8 +1894,8 @@ packages: ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} @@ -2684,9 +2684,9 @@ snapshots: '@types/mdurl@2.0.0': {} - '@types/node@20.19.41': + '@types/node@24.12.4': dependencies: - undici-types: 6.21.0 + undici-types: 7.16.0 '@types/unist@3.0.3': {} @@ -2785,12 +2785,12 @@ snapshots: '@ungap/structured-clone@1.3.1': {} - '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@20.19.41))(vue@3.5.34(typescript@6.0.3))': + '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@24.12.4))(vue@3.5.34(typescript@6.0.3))': dependencies: - vite: 5.4.21(@types/node@20.19.41) + vite: 5.4.21(@types/node@24.12.4) vue: 3.5.34(typescript@6.0.3) - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.19.41)(tsx@4.22.3))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@24.12.4)(tsx@4.22.3))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -2805,7 +2805,7 @@ snapshots: std-env: 3.10.0 test-exclude: 7.0.2 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@20.19.41)(tsx@4.22.3) + vitest: 3.2.4(@types/node@24.12.4)(tsx@4.22.3) transitivePeerDependencies: - supports-color @@ -2817,13 +2817,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.3.3(@types/node@20.19.41)(tsx@4.22.3))': + '@vitest/mocker@3.2.4(vite@7.3.3(@types/node@24.12.4)(tsx@4.22.3))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.3(@types/node@20.19.41)(tsx@4.22.3) + vite: 7.3.3(@types/node@24.12.4)(tsx@4.22.3) '@vitest/pretty-format@3.2.4': dependencies: @@ -3049,7 +3049,7 @@ snapshots: comma-separated-tokens@2.0.3: {} - commander@12.1.0: {} + commander@14.0.3: {} commander@4.1.1: {} @@ -3800,7 +3800,7 @@ snapshots: ufo@1.6.4: {} - undici-types@6.21.0: {} + undici-types@7.16.0: {} unist-util-is@6.0.1: dependencies: @@ -3839,13 +3839,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@3.2.4(@types/node@20.19.41)(tsx@4.22.3): + vite-node@3.2.4(@types/node@24.12.4)(tsx@4.22.3): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.3(@types/node@20.19.41)(tsx@4.22.3) + vite: 7.3.3(@types/node@24.12.4)(tsx@4.22.3) transitivePeerDependencies: - '@types/node' - jiti @@ -3860,16 +3860,16 @@ snapshots: - tsx - yaml - vite@5.4.21(@types/node@20.19.41): + vite@5.4.21(@types/node@24.12.4): dependencies: esbuild: 0.21.5 postcss: 8.5.15 rollup: 4.60.4 optionalDependencies: - '@types/node': 20.19.41 + '@types/node': 24.12.4 fsevents: 2.3.3 - vite@7.3.3(@types/node@20.19.41)(tsx@4.22.3): + vite@7.3.3(@types/node@24.12.4)(tsx@4.22.3): dependencies: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.4) @@ -3878,11 +3878,11 @@ snapshots: rollup: 4.60.4 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 20.19.41 + '@types/node': 24.12.4 fsevents: 2.3.3 tsx: 4.22.3 - vitepress@1.6.4(@algolia/client-search@5.52.1)(@types/node@20.19.41)(postcss@8.5.15)(search-insights@2.17.3)(typescript@6.0.3): + vitepress@1.6.4(@algolia/client-search@5.52.1)(@types/node@24.12.4)(postcss@8.5.15)(search-insights@2.17.3)(typescript@6.0.3): dependencies: '@docsearch/css': 3.8.2 '@docsearch/js': 3.8.2(@algolia/client-search@5.52.1)(search-insights@2.17.3) @@ -3891,7 +3891,7 @@ snapshots: '@shikijs/transformers': 2.5.0 '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@20.19.41))(vue@3.5.34(typescript@6.0.3)) + '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@24.12.4))(vue@3.5.34(typescript@6.0.3)) '@vue/devtools-api': 7.7.9 '@vue/shared': 3.5.34 '@vueuse/core': 12.8.2(typescript@6.0.3) @@ -3900,7 +3900,7 @@ snapshots: mark.js: 8.11.1 minisearch: 7.2.0 shiki: 2.5.0 - vite: 5.4.21(@types/node@20.19.41) + vite: 5.4.21(@types/node@24.12.4) vue: 3.5.34(typescript@6.0.3) optionalDependencies: postcss: 8.5.15 @@ -3931,11 +3931,11 @@ snapshots: - typescript - universal-cookie - vitest@3.2.4(@types/node@20.19.41)(tsx@4.22.3): + vitest@3.2.4(@types/node@24.12.4)(tsx@4.22.3): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.3(@types/node@20.19.41)(tsx@4.22.3)) + '@vitest/mocker': 3.2.4(vite@7.3.3(@types/node@24.12.4)(tsx@4.22.3)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -3953,11 +3953,11 @@ snapshots: tinyglobby: 0.2.16 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.3.3(@types/node@20.19.41)(tsx@4.22.3) - vite-node: 3.2.4(@types/node@20.19.41)(tsx@4.22.3) + vite: 7.3.3(@types/node@24.12.4)(tsx@4.22.3) + vite-node: 3.2.4(@types/node@24.12.4)(tsx@4.22.3) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.19.41 + '@types/node': 24.12.4 transitivePeerDependencies: - jiti - less