Purpose: Capture discovery findings for the pinned package audit and upgrade initiative.
upgrade-fixed-packagescacheComponents caveatrequire(esm), unlocking ESM-only package upgrades for server codeescape-string-regexp can be replaced entirely by native RegExp.escape() (ES2026, Node.js 24)=5.3.2 due to modal header regression in v5.3.3.modal-header lost justify-content: space-between, causing content collapse=5.3.2 to ^5.3.4. Skip v5.3.3 entirely. Recommend ^5.3.4 or pin to latest =5.3.8.^0.2.1 due to reported type error in v0.3.0react ^16.8 || ^17 || ^18 || ^19cacheComponents feature — stale theme values when cached components reactivateuseSyncExternalStorecacheComponents, v0.4.6 works fine with Next.js 16cacheComponents is likely not relevant. Breaking API changes between v0.2 → v0.4 need review. Used in 12 files across apps/app.escape-string-regexp (^4.0.0):
require(esm) — ESM-only v5 would workRegExp.escape() is ES2026 Stage 4, natively available in Node.js 24 (V8 support)string-width (=4.2.2):
packages/editor/src/models/markdown-table.js@growi/editor has "type": "module" and builds with Vite (ESM context)sync-ydoc.ts, erased at compile)@keycloak/keycloak-admin-client (^18.0.0):
features/external-user-group/server/service/keycloak-user-group-sync.tsrequire(esm) in Node.js 24 should handle it, but API has significant breaking changes (v18 → v26)Higher risk upgrade — API surface changes expected
Implications: string-width is the easiest upgrade. escape-string-regexp should be replaced by native RegExp.escape(). @keycloak requires careful API migration and is higher risk.
@aws-sdk/credential-providers: ^3.186.0 as optional dependency — a different package3.454.0 to ^3.454.0 or update to latest. Low risk.RegExp.escape() — zero dependencies, future-proofRegExp.escape()RegExp.escape() natively (ES2026 Stage 4). Eliminates a dependency entirely.RegExp.escape() is available in the project's Node.js 24 target=5.3.2 to ^5.3.4^0.4.4 (or latest)3.454.0 to ^3.454.0pre:styles-commons and pre:styles-components builds to verifynext.config.ts defines getTranspilePackages() listing 60+ ESM-only packages to force Turbopack to bundle them instead of externalising. The original comment says: "listing ESM packages until experimental.esmExternals works correctly to avoid ERR_REQUIRE_ESM".transpilePackages and require(esm) solve different problems. transpilePackages prevents Turbopack from externalising packages during SSR; require(esm) allows Node.js to load ESM packages via require() at runtime. With Node.js 24's stable require(esm), externalised ESM packages should load correctly in SSR, meaning some transpilePackages entries may become unnecessary.esmExternals handling is still experimental; (2) removing entries shifts packages from bundled to externalised, which means they appear in .next/node_modules/ and must be classified as dependencies per the package-dependencies rule; (3) 60+ packages need individual verification. This is a separate investigation with a large blast radius.bail, ccount, zwitch) and checking whether SSR still works with Turbopack externalisation + Node.js 24 require(esm).| Package | Previous Version | New Version | Action | Rationale |
|---|---|---|---|---|
@aws-sdk/client-s3 |
3.454.0 |
^3.1014.0 |
Upgraded | Pinning comment was misleading; S3 client is independent of mongodb constraint |
@aws-sdk/s3-request-presigner |
3.454.0 |
^3.1014.0 |
Upgraded | Same as above |
bootstrap |
=5.3.2 |
^5.3.8 |
Upgraded | Bug #39798 fixed in v5.3.4; SCSS compilation verified |
escape-string-regexp |
^4.0.0 |
Removed | Replaced | Native RegExp.escape() (ES2026, Node.js 24) eliminates the dependency |
string-width |
=4.2.2 |
^7.0.0 |
Upgraded | Used only in @growi/editor (ESM context, Vite-bundled) |
next-themes |
^0.2.1 |
^0.4.6 |
Upgraded | Original issue #122 was misattributed; only change needed: type import path |
@keycloak/keycloak-admin-client |
^18.0.0 |
Unchanged | Deferred | API breaking changes (v18→v26) require separate migration effort |
handsontable |
=6.2.2 |
Unchanged | Kept | v7.0.0+ is proprietary (non-MIT license) |
@handsontable/react |
=2.1.0 |
Unchanged | Kept | Requires handsontable >= 7.0.0 |
RegExp.escape() TypeScript type declarations in apps/app/src/@types/, packages/core/src/@types/, and packages/remark-lsx/src/@types/ (awaiting TypeScript built-in support)tsconfig.build.client.json to include src/@types/**/*.d.ts for Next.js build compatibilitygenerate-children-regexp.spec.ts test expectations for RegExp.escape() output (escapes spaces as \x20)escape-string-regexp from transpilePackages in next.config.tsbootstrap version across 5 packages: apps/app, packages/editor, packages/core-styles, packages/preset-themes, apps/slackbot-proxy// comments for dependencies to retain only @keycloak entry with updated reason