Files
misskey-v1/upgrade_status.md
2026-08-19 13:55:59 +09:00

60 lines
4.2 KiB
Markdown

# Node.js 22 upgrade status
Target: Node.js 22.x
## Progress
- [x] Replace the NAN/OpenSSL addon with `node:crypto`.
- [x] Replace native `diskusage` with `fs.statfsSync`.
- [x] Replace `node-sass` with Dart Sass.
- [x] Convert Gulp 3 task composition to Gulp 4.
- [x] Make documentation generation wait for all output writes.
- [x] Generate and track `package-lock.json`.
- [x] Pass `npm ci` from a clean dependency tree.
- [x] Pass lint and build on Node.js 22.
- [x] Add the Docker Compose environment and validate its configuration.
- [x] Pass the database-backed automated tests on Node.js 22.
- [x] Verify application startup and HTTP/API/image smoke tests.
## Selected compatibility versions
- Node.js: 22.x
- Gulp: 4.0.2
- Webpack: 4.47.0
- webpack-cli: 3.3.12
- TypeScript: 3.9.10
- Sass: 1.77.8
- sass-loader: 10.5.2
- gulp-imagemin: 7.1.0
- chai-http: 4.4.0
## Findings
- The original project had no lockfile and targeted Node.js 9.8.0.
- `node-sass@4`, `[email protected]`, and the NAN-based `crypto_key` addon cannot be retained as a reproducible Node.js 22 toolchain.
- The existing test task had an empty source glob; it has been reconnected to `test/**/*.ts`.
- Wildcard transitive `@types` dependencies now resolve to declarations too new for the legacy compiler. TypeScript was minimally raised to 3.9 and the Koa/Webpack-era transitive declarations were pinned with npm overrides.
- Webpack 4 finishes compilation but its CLI retains handles on Node.js 22. `webpack/build.js` uses the Webpack API and returns an explicit exit status after all assets are written.
- The dependency tree intentionally retains deprecated application libraries to avoid an unrelated application/framework migration.
- The API suite did not initialize Chai's `should` interface and still targeted the removed `posts` API and old nested `account` fixture schema. It now initializes `should`, targets `notes`, and uses the current user/note field names.
- `object-assign-deep` cloned BSON ObjectID buffers into plain objects on modern Node.js. Flat drive-folder fixtures now use a shallow merge so ObjectIDs remain valid.
- Dropping `noteReactions` between tests also removed its unique index. Test cleanup now removes documents while preserving the `(userId, noteId)` index.
- Docker configuration now explicitly disables Elasticsearch; omitting the section caused an asynchronous messaging error after successful responses.
- The client boot loader previously trusted a persisted regional language tag such as `ja-JP`, while Webpack emits base-tag bundles such as `ja`. Stored/browser language tags are now normalized, and the asset route provides a compatibility fallback for already-cached boot loaders.
## Verification log
- `npm install --no-audit --no-fund` — passed on Node.js 22.23.2 / npm 12.0.1; package-lock generated. Deprecation warnings remain for preserved legacy dependencies.
- `npm ci --no-audit --no-fund` — passed from a clean `node_modules` tree in 48 seconds.
- `npm run lint` — passed.
- `npm run build` — passed in 93 seconds. Webpack 4 and preserved plugins emit deprecation/localization warnings.
- `npx mocha --require ts-node/register test/modern-node.ts test/text.ts` — 16 passing, including RSA and disk-usage regressions.
- `docker compose config --quiet` — passed.
- `npm start -- --only-server` — initialization and HTTP server creation succeeded; workers then exited because Redis is not installed locally.
- `docker compose run --rm app npm test` — passed on Node.js 22.23.2: 107 passing, including 91 MongoDB-backed API tests, RSA/disk regressions, text parsing, signup, and image upload.
- `docker compose up -d --build app` — passed; the image repeated `npm ci` from the lockfile and completed the production build.
- `docker compose ps` — app, MongoDB, and Redis all healthy.
- `Invoke-WebRequest http://localhost:3000/` — HTTP 200 with a 10,443-byte response.
- `Invoke-WebRequest http://localhost:3000/assets/desktop.1.0.0.ja-JP.min.js` — HTTP 200 via the regional-tag compatibility fallback; content length matches the generated `ja` bundle.
- Browser startup smoke test — document reached `complete`, the normalized `desktop.1.0.0.ja.min.js` loaded, the Misskey welcome UI rendered, and no console errors were reported.