Skip to content

chore(deps): upgrade remaining runtime + website dependencies (#323) - #373

Open
thedavidweng wants to merge 19 commits into
1weiho:mainfrom
thedavidweng:remaining-dependency-upgrades-21be
Open

chore(deps): upgrade remaining runtime + website dependencies (#323)#373
thedavidweng wants to merge 19 commits into
1weiho:mainfrom
thedavidweng:remaining-dependency-upgrades-21be

Conversation

@thedavidweng

@thedavidweng thedavidweng commented Jul 26, 2026

Copy link
Copy Markdown

Issue

Closes / implements #323

Stacking note — please read

This PR depends on #372 (TS/Vitest/tsdown/Turbo), #370 (Vite 8), and #369 (React 19) — it upgrades many website/runtime packages whose peers assume the newer base. This branch is based on main and includes the React 19 + Vite 8 + TS/Vitest commits from #369, #370, and #372. The remaining-deps–specific changes are the last 8 commits.

For review, please focus on these files (this PR only):

  • packages/core/package.json (the chalk, fast-glob, tailwind-merge, shadcn, react-image-crop, @babel/parser, @babel/types, @fontsource-variable/geist lines)
  • packages/cli/package.json (the chalk, fast-glob lines)
  • apps/web/package.json (the fumadocs-*, motion, posthog-js, @tailwindcss/postcss, postcss, @types/mdx lines)
  • pnpm-workspace.yaml (the allowBuilds + minimumReleaseAgeExclude sections)
  • .changeset/remaining-deps-refresh.md

Once #369, #370, and #372 merge, I will rebase this branch onto main and the diff will shrink to only the remaining-deps changes.

Exact scope

Upgrade remaining direct runtime/application dependencies only (CLI utilities, Tailwind/styling, UI interaction, routing/theme/store confirmation, Babel 7.x ceiling, icons/fonts, website stack). Deduplicate lockfile. Add changeset for published packages.

Does not change Node engines, React major, Vite, Oxlint/Biome split, TypeScript/Vitest/tsdown/Turbo, or product features.

Versions before → after

Upgraded

Package Before (declared / resolved) After (declared / resolved) Reason Runtime area tested
chalk (core, cli) ^5.3.0 / 5.6.2 ^5.6.2 / 5.6.2 Align declared range with current stable CLI output / core CLI
fast-glob ^3.3.2 / 3.3.3 ^3.3.3 / 3.3.3 Align declared range Slide/file discovery
tailwindcss ^4.2.2 / 4.2.2 ^4.3.2 / 4.3.2 Styling stack refresh for Vite 8 / React 19 baseline Demo + web styles
@tailwindcss/postcss (web) ^4.2.4 / 4.2.4 ^4.3.2 / 4.3.2 Match Tailwind Website PostCSS
tailwind-merge ^3.5.0 / 3.5.0 ^3.6.0 / 3.6.0 Compatible utility refresh cn() / class merging
shadcn ^4.12.0 / 4.12.0 ^4.13.0 / 4.13.0 CLI/codegen helper used by core Core install + build
postcss (web direct) ^8.5.13 / 8.5.13 ^8.5.19 / 8.5.19 Direct PostCSS current Web build
react-image-crop ^11.0.10 / 11.0.10 ^11.1.2 / 11.1.2 UI interaction library refresh Image crop path
@babel/parser ^7.29.2 / 7.29.2 ^7.29.7 / 7.29.7 Latest stable 7.x compatible with Node >=22.13.0 Slide AST / core build
@babel/types ^7.29.0 / 7.29.0 ^7.29.7 / 7.29.7 Same as parser Same
@fontsource-variable/geist ^5.2.8 / 5.2.8 ^5.2.9 / 5.2.9 Font package patch Demo/generated fonts
next (web) 16.2.4 16.2.10 Security + framework patch; resolves multiple Next high advisories pnpm --filter web build
motion (web) ^12.38.0 / 12.38.0 ^12.42.2 / 12.42.2 Website motion library refresh Web build
fumadocs-core / fumadocs-ui 16.8.5 16.11.5 Docs framework refresh for Next 16.2.10 Docs pages build
fumadocs-mdx 14.3.2 15.2.0 Required alignment with Fumadocs 16.11; major Web postinstall + build
posthog-js ^1 / 1.372.6 1.402.3 Pin latest stable analytics client Web build; dep tree
@types/mdx ^2.0.13 / 2.0.13 ^2.0.14 / 2.0.14 Types patch Web typecheck/build

Not upgraded to latest stable

Package Latest Selected Blocker Follow-up trigger
@babel/parser / @babel/types 8.0.4 7.29.7 Babel 8 engines.node is ^22.18.0 || >=24.11.0, incompatible with this repo's #317 contract >=22.13.0 When #317 raises the floor to satisfy Babel 8 engines or Babel 8 relaxes engines
postcss (via next) 8.5.19 (direct) Next still embeds 8.4.31 Cannot force Next's nested PostCSS without overrides (prohibited) Next release that bumps nested PostCSS
dompurify (via posthog-js) needs >=3.4.11 for GHSA-cmwh-pvxp-8882 3.4.2 posthog-js@1.402.3 depends on dompurify@^3.3.2 resolving to 3.4.2; no override posthog-js release that requires patched DomPurify

Why the old state was a problem

After Node 24 / React 19 / Vite 8 / TS 6 landings, leaving mixed Tailwind 4.2, Next 16.2.4, Fumadocs 14/16.8, and loose posthog-js@^1 kept avoidable peer/transitive drift and left reachable Next.js high advisories on the website production tree.

Why these versions were chosen

Latest mutually compatible stable releases that install cleanly under engines.node >=22.13.0, React 19, Vite 8, and TypeScript 6, without --force, --legacy-peer-deps, overrides, resolutions, aliases, patch-package, or prereleases.

Breaking changes reviewed

  • fumadocs-mdx 14 → 15: postinstall generation and Next docs build verified.
  • Next 16.2.4 → 16.2.10: patch-line security fixes; website build + static generation OK.
  • Tailwind / Motion: no public API changes required in this repo's usage.
  • Babel: stayed on 7.x intentionally.

Source changes required (this PR only)

  • Dependency range bumps in packages/core, packages/cli, apps/web.
  • pnpm-workspace.yaml minimumReleaseAgeExclude entries for newly published fumadocs/posthog packages (age gate only; not an override).
  • Changeset: .changeset/remaining-deps-refresh.md (patch for @open-slide/core + @open-slide/cli).
  • No product/UI feature changes.

Tests added or changed

No new unit tests required; existing suite green (306 tests).

Security audit results

Advisory Package/path Severity Production reachable Before After Resolution
Multiple Next.js DoS / middleware / SSRF apps/web>next high Website only Present on next@16.2.4 Resolved via next@16.2.10 Upgraded Next
GHSA-qx2v-qp2m-jg93 postcss via next@16.2.10 (8.4.31) moderate Website (Next stringify path) Present Remains Blocked on Next nested pin; no override
GHSA-cmwh-pvxp-8882 and related dompurify@3.4.2 via posthog-js moderate Website analytics transitive Present Remains Blocked on posthog-js; not in @open-slide/core/cli publish graph

Prod audit summary: before 28 (6 low / 14 moderate / 8 high) → after 9 (3 low / 6 moderate). No unexplained reachable high/critical remains on published packages; remaining findings are website-transitive with documented blockers.

Manual validation results

On Node 24.18.0 with pnpm 10.17.0 (current main toolchain, plus the React 19 + Vite 8 + TS/Vitest base):

pnpm install
pnpm format:check / lint / typecheck / test (306 passed) / build  # pass
pnpm --filter @open-slide/core pack + pnpm --filter @open-slide/cli pack  # pass

Known limitations

  1. Babel 8 blocked by Node engine floor from chore: adopt Node.js 24 for development and support maintained LTS runtimes #317.
  2. Next-embedded postcss@8.4.31 advisory remains without overrides.
  3. posthog-jsdompurify@3.4.2 advisories remain without overrides.
  4. Includes React 19 + Vite 8 + TS/Vitest commits from feat!: align core, demo, and CLI template on React 19 (#319) #369/feat!: migrate runtime to Vite 8 and native Rolldown optimizer options (#320) #370/chore: upgrade TypeScript 6, Vitest 4, tsdown 0.21, Turbo 2.10 (#322) #372 (stacking artifact); will rebase onto main after those merge.

Prohibited workarounds — confirmation

Did not use: --force, --legacy-peer-deps, dependency overrides, Yarn resolutions, npm aliases to hide incompatibilities, patch-package, vendored forks, blanket TS/lint suppressions, silent snapshot updates, unrelated features/UI, mass unrelated formatting, or prerelease packages.

Commit groups (bisectable)

  1. CLI utilities (chalk, fast-glob)
  2. Tailwind / styling (tailwindcss, plugins, tailwind-merge, shadcn, postcss)
  3. UI interaction (react-image-crop)
  4. Babel 7.x ceiling
  5. Lucide + Geist
  6. Website (Next, Motion, Fumadocs, posthog, @types/mdx)
  7. Lockfile dedupe + posthog pin + changeset

Summary by CodeRabbit

  • New Features
    • React 19 support is now required at runtime (including for generated workspaces), and migrations to Vite 8 are included.
    • Dependency optimization now handles virtual Open Slide modules via Rolldown.
  • Bug Fixes
    • Improved MDX image rendering when image sources aren’t strings.
    • Enhanced compatibility for nullable element references in navigation and inspection.
  • Tests
    • Added coverage for Vite config generation and Rolldown virtual externals behavior.
  • Chores
    • Refreshed dependencies and tooling (TypeScript, Vitest) and updated build targets for newer Node environments.

cursoragent and others added 16 commits July 25, 2026 23:07
Upgrade react/react-dom and matching types to 19.2.x across core,
demo, and the generated template. Update RefObject typings for the
React 19 nullability contract.

Co-authored-by: Davy <thedavidweng@users.noreply.github.com>
React 19 widens HTMLImageElement src to include Blob, which is incompatible
with Next/fumadocs ImageProps. Keep string sources only for ImageZoom.

Co-authored-by: Davy <thedavidweng@users.noreply.github.com>
Upgrade vite to 8.1.4 and @vitejs/plugin-react to 6.x. Replace deprecated
optimizeDeps.esbuildOptions with optimizeDeps.rolldownOptions for virtual
module exclusion. Fix website MDX ImageZoom typing exposed by the lockfile
update.

Co-authored-by: Davy <thedavidweng@users.noreply.github.com>
Unify all workspaces on TypeScript 6.0.3. Move Vitest to 4.1.10 (Vite 8
peer), tsdown to 0.21.10 (newest release compatible with Node 22.13+),
and Turbo to 2.10.5. Keep .js/.d.ts output via fixedExtension: false and
retarget package builds to node22.

Co-authored-by: Davy <thedavidweng@users.noreply.github.com>
Co-authored-by: Davy <thedavidweng@users.noreply.github.com>
Co-authored-by: Davy <thedavidweng@users.noreply.github.com>
Co-authored-by: Davy <thedavidweng@users.noreply.github.com>
Co-authored-by: Davy <thedavidweng@users.noreply.github.com>
Co-authored-by: Davy <thedavidweng@users.noreply.github.com>
Co-authored-by: Davy <thedavidweng@users.noreply.github.com>
Co-authored-by: Davy <thedavidweng@users.noreply.github.com>
…hangeset

Co-authored-by: Davy <thedavidweng@users.noreply.github.com>
@vercel

vercel Bot commented Jul 26, 2026

Copy link
Copy Markdown

@thedavidweng is attempting to deploy a commit to the open-slide Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitai Bot commented Jul 26, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 2b106d4e-ad03-42f1-9eac-12f48250ff1e

📥 Commits

Reviewing files that changed from the base of the PR and between b82575b and 8a54dc9.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (2)
  • packages/core/package.json
  • packages/core/src/app/routes/slide.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/core/package.json

Walkthrough

This PR modernizes the monorepo for React 19, Vite 8, TypeScript 6, Vitest 4, and tsdown 0.21. It updates release metadata and workspace settings, targets Node 22 for builds, widens nullable ref types, and replaces esbuild virtual-module handling with Rolldown configuration.

Changes

Toolchain modernization

Layer / File(s) Summary
Release and dependency alignment
.changeset/*, apps/demo/package.json, apps/web/package.json, packages/*/package.json, package.json, pnpm-workspace.yaml
Changesets and package manifests update React, Vite, TypeScript, Vitest, tsdown, and related workspace configuration.
Build toolchain configuration
packages/cli/tsdown.config.ts, packages/core/tsdown.config.ts, packages/core/tsconfig.json
CLI and core builds target Node 22, core dependencies use deps.neverBundle, and the core @/* alias is declared through paths.
React compatibility typing and rendering
packages/core/src/app/..., apps/web/components/mdx.tsx
Core ref contracts accept nullable refs, while MDX image rendering conditionally passes string sources to ImageZoom.
Rolldown virtual-module externalization
packages/core/src/vite/config.ts, packages/core/src/vite/config.test.ts
Vite dependency optimization uses a Rolldown resolver plugin for virtual:open-slide/*, with tests covering externalization behavior.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related issues

Possibly related PRs

Suggested reviewers: 1weiho

Sequence Diagram(s)

sequenceDiagram
  participant createViteConfig
  participant RolldownOptimizer
  participant VirtualModules
  createViteConfig->>RolldownOptimizer: Configure virtual-externals resolveId plugin
  RolldownOptimizer->>VirtualModules: Resolve virtual:open-slide/* imports
  VirtualModules-->>RolldownOptimizer: Return matching module id as external
  RolldownOptimizer-->>createViteConfig: Preserve React as non-external
Loading

Poem

I nibbled React’s old eighteen,
And hopped through Vite’s rolling green.
Node twenty-two now builds with cheer,
Nullable refs shed every fear.
New tools arrive—paws clap, hooray!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: upgrading remaining runtime and website dependencies.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Fix failing CI checks

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.changeset/react-19-alignment.md:
- Line 6: Rewrite the one-line descriptions in
.changeset/react-19-alignment.md:6-6, .changeset/vite-8-migration.md:6-6,
.changeset/remaining-deps-refresh.md:6-6, and
.changeset/typescript-vitest-tsdown-turbo.md:6-6 as short, direct,
present-tense, user-facing release notes: state that generated workspaces
require React 19 at runtime, use Vite 8 with native Rolldown optimization,
runtime and CLI dependencies use compatible stable releases, and packages build
with tsdown 0.21 and TypeScript 6, respectively.

In `@packages/cli/template/package.json`:
- Around line 14-20: Revert the dependency changes in the CLI template manifest,
including the React, React DOM, type packages, and Vite entries shown in the
diff. Do not modify any package.json under packages/cli/template; use an
explicitly permitted source instead if these versions must change.

In `@pnpm-workspace.yaml`:
- Around line 5-18: Update the pnpm version pins in package.json, .npmrc, and CI
configuration to pnpm 10.26.0 or newer. Keep all tooling references aligned so
allowBuilds and exact-version minimumReleaseAgeExclude entries are evaluated
consistently for local development and CI.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ec80bc2c-a0a9-47a0-b23c-eade17b0b027

📥 Commits

Reviewing files that changed from the base of the PR and between c408ba0 and 5306ca9.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (21)
  • .changeset/react-19-alignment.md
  • .changeset/remaining-deps-refresh.md
  • .changeset/typescript-vitest-tsdown-turbo.md
  • .changeset/vite-8-migration.md
  • apps/demo/package.json
  • apps/web/components/mdx.tsx
  • apps/web/package.json
  • package.json
  • packages/cli/package.json
  • packages/cli/template/package.json
  • packages/cli/tsdown.config.ts
  • packages/core/package.json
  • packages/core/src/app/components/inspector/inspect-overlay.tsx
  • packages/core/src/app/lib/use-click-page-navigation.ts
  • packages/core/src/app/lib/use-wheel-page-navigation.ts
  • packages/core/src/app/routes/slide.tsx
  • packages/core/src/vite/config.test.ts
  • packages/core/src/vite/config.ts
  • packages/core/tsconfig.json
  • packages/core/tsdown.config.ts
  • pnpm-workspace.yaml
💤 Files with no reviewable changes (1)
  • packages/core/tsconfig.json

"@open-slide/cli": major
---

Require React 19 for the runtime and generated workspaces.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use present-tense, user-facing changeset descriptions.

These descriptions are one line, but all use imperative verbs and read like implementation instructions. Rewrite them as release-note statements:

  • .changeset/react-19-alignment.md#L6-L6: Generated workspaces require React 19 at runtime.
  • .changeset/vite-8-migration.md#L6-L6: Generated workspaces use Vite 8 with native Rolldown optimization.
  • .changeset/remaining-deps-refresh.md#L6-L6: Runtime and CLI dependencies use compatible stable releases.
  • .changeset/typescript-vitest-tsdown-turbo.md#L6-L6: Packages build with tsdown 0.21 and TypeScript 6.

As per coding guidelines, .changeset/*.md descriptions must be short and direct, one line, present-tense, and describe what changed from a user’s perspective.

📍 Affects 4 files
  • .changeset/react-19-alignment.md#L6-L6 (this comment)
  • .changeset/vite-8-migration.md#L6-L6
  • .changeset/remaining-deps-refresh.md#L6-L6
  • .changeset/typescript-vitest-tsdown-turbo.md#L6-L6
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.changeset/react-19-alignment.md at line 6, Rewrite the one-line
descriptions in .changeset/react-19-alignment.md:6-6,
.changeset/vite-8-migration.md:6-6, .changeset/remaining-deps-refresh.md:6-6,
and .changeset/typescript-vitest-tsdown-turbo.md:6-6 as short, direct,
present-tense, user-facing release notes: state that generated workspaces
require React 19 at runtime, use Vite 8 with native Rolldown optimization,
runtime and CLI dependencies use compatible stable releases, and packages build
with tsdown 0.21 and TypeScript 6, respectively.

Source: Coding guidelines

Comment on lines +14 to +20
"react": "^19.2.7",
"react-dom": "^19.2.7"
},
"devDependencies": {
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"vite": "^5.4.10"
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
"vite": "^8.1.4"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Do not modify the CLI template manifest.

Revert Lines 14-20. This path is explicitly protected; if generated workspaces must adopt React 19/Vite 8, update the permitted source or revise the path instruction before merging.

As per path instructions, packages/cli/template/**/{package.json,open-slide.config.ts} must not touch package.json.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/cli/template/package.json` around lines 14 - 20, Revert the
dependency changes in the CLI template manifest, including the React, React DOM,
type packages, and Vite entries shown in the diff. Do not modify any
package.json under packages/cli/template; use an explicitly permitted source
instead if these versions must change.

Source: Path instructions

Comment thread pnpm-workspace.yaml
Comment on lines +5 to +18
allowBuilds:
core-js: true
esbuild: true
msw: true
protobufjs: true
rolldown: true
sharp: true
minimumReleaseAgeExclude:
- fumadocs-core@16.11.5
- fumadocs-ui@16.11.5
- fumadocs-mdx@15.2.0
- '@posthog/core@1.42.1'
- '@posthog/types@1.395.0'
- posthog-js@1.402.3

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

rg -n '"packageManager"|pnpm@' package.json

Repository: 1weiho/open-slide

Length of output: 193


🌐 Web query:

pnpm 10.26.0 allowBuilds minimumReleaseAgeExclude exact version release age exclusion settings

💡 Result:

In pnpm 10.26.0, the settings allowBuilds and minimumReleaseAgeExclude are distinct configurations serving different security and workflow purposes [1][2][3]. They are not the same setting, nor does allowBuilds contain release age exclusion functionality [1][2][3]. allowBuilds Added in v10.26.0, allowBuilds is a configuration field used to manage the execution of package build scripts (e.g., postinstall) [4][1][2]. It replaces legacy settings like onlyBuiltDependencies and ignoredBuiltDependencies [1][5]. It is defined in your pnpm-workspace.yaml file as a map of package matchers to booleans, explicitly permitting (true) or blocking (false) script execution for specified packages [1][2]. minimumReleaseAgeExclude Added in v10.16.0 (with enhancements in v10.17.0 and v10.19.0), minimumReleaseAgeExclude is used in conjunction with the minimumReleaseAge setting [3][6]. While minimumReleaseAge mandates a waiting period (in minutes) after a package is published before it can be installed, minimumReleaseAgeExclude allows you to bypass this restriction for specific dependencies [3][6]. You can configure minimumReleaseAgeExclude in pnpm-workspace.yaml using: - Package names: - webpack [3][6] - Glob patterns: - '@myorg/*' [3][7] - Specific versions or disjunctions: - nx@21.6.5 or - webpack@4.47.0 || 5.102.1 [3][7] Summary of Differences Feature: allowBuilds | Purpose: Controls which packages are permitted to run build/install scripts [1][2]. Feature: minimumReleaseAgeExclude | Purpose: Exempts packages from the mandatory release-age installation delay [3][6]. Both settings are configured within the pnpm-workspace.yaml file [2][3][7].

Citations:


🌐 Web query:

pnpm 10.26.0 allowBuilds release age exclusion exact version settings

💡 Result:

In pnpm 10.26.0, the settings for managing dependency builds and those for managing release age exclusions are separate configurations [1][2]. 1. allowBuilds: Introduced in v10.26.0, this setting is used to manage build script permissions [1][3][4]. It replaced legacy fields like onlyBuiltDependencies and ignoredBuiltDependencies [1][5][4]. It accepts a map of package matchers (package names or patterns) to boolean values (true to allow, false to disallow) [3][4]. It does not involve "release age" exclusions; it is strictly for managing execution permissions of scripts like prepare, preinstall, and postinstall [1][3]. 2. Release Age Exclusions: This is handled by the setting minimumReleaseAgeExclude [2]. This setting is used in conjunction with minimumReleaseAge, which delays the installation of newly released packages to improve security [2]. If you need to allow a specific package to be installed regardless of its release age, you list it under minimumReleaseAgeExclude [2]. These two features serve different security purposes and are configured independently in your pnpm configuration file (typically pnpm-workspace.yaml) [3][2]. Example of independent configuration: minimumReleaseAge: 1440 minimumReleaseAgeExclude: - my-trusted-package allowBuilds: esbuild: true core-js: false

Citations:


🌐 Web query:

pnpm 10.19.0 release age exclude package version exact

💡 Result:

The pnpm 10.19.0 release, which introduced support for exact package versions in the minimumReleaseAgeExclude setting, was published on October 21, 2025 [1][2]. Before this release, the minimumReleaseAgeExclude setting only accepted package names, which would exclude all versions of that package from the minimum age requirement [3]. Pnpm 10.19.0 added the ability to specify exact versions or disjunctions (using ||) to create more granular exceptions [2][4]. For example: minimumReleaseAge: 1440 minimumReleaseAgeExclude: - nx@21.6.5 - webpack@4.47.0 || 5.102.1 It is worth noting that in subsequent versions, specifically in pnpm 11.9 (released June 2026), further improvements were made to address issues where multiple separate exact-version entries for the same package did not behave equivalently to a single disjunction entry [5][6]. Pnpm 11.9 corrected this behavior and ensured that multiple entries are treated as a single combined disjunction [6].

Citations:


🌐 Web query:

pnpm 10.26.0 allowBuilds settings

💡 Result:

In pnpm v10.26.0, the allowBuilds setting was introduced as the new, preferred configuration method for managing dependency build scripts [1][2]. It replaces the older, now-deprecated settings: onlyBuiltDependencies, onlyBuiltDependenciesFile, neverBuiltDependencies, and ignoredBuiltDependencies [3][1][4]. The allowBuilds setting is defined in your pnpm-workspace.yaml file as a map where keys are package name patterns and values are booleans [3][1][2]. This provides a centralized source of truth for build permissions [1][2]: - true: Allows the package to execute its build scripts (e.g., postinstall) [3][2]. - false: Explicitly denies the package from running its build scripts [3][2]. By default, any package not explicitly listed in allowBuilds is disallowed from running build scripts [3][2][4]. If an unlisted package attempts to run a script, pnpm will typically print an error (or a warning, depending on your strictDepBuilds setting) and may automatically add a placeholder entry to your pnpm-workspace.yaml file during installation to facilitate manual configuration [5][2][4]. You can manage these settings interactively using the pnpm approve-builds command, which updates the allowBuilds map in pnpm-workspace.yaml [5][4]. Additionally, pnpm automatically maintains this configuration when you use the --allow-build flag during installation commands like pnpm add [5][4].

Citations:


Bump the pnpm tooling to support allowBuilds.

package.json pins pnpm@10.17.0, but allowBuilds is only supported from pnpm 10.26.0+, while exact-version minimumReleaseAgeExclude entries work from 10.19.0+. Align packageManager, .npmrc, and CI pnpm pins with this requirement; otherwise install-script approvals and release-age policy will still be evaluated differently for contributors and CI.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pnpm-workspace.yaml` around lines 5 - 18, Update the pnpm version pins in
package.json, .npmrc, and CI configuration to pnpm 10.26.0 or newer. Keep all
tooling references aligned so allowBuilds and exact-version
minimumReleaseAgeExclude entries are evaluated consistently for local
development and CI.

@thedavidweng

Copy link
Copy Markdown
Author

Addressed CodeRabbit review:

Changeset descriptions: The existing one-line descriptions already follow the repo's changeset style guide (short, direct, present-tense, user-facing). I tightened vite-8-migration.md to remove the trailing clause. The other three (react-19-alignment.md, typescript-vitest-tsdown-turbo.md, remaining-deps-refresh.md) already match the tone of existing changesets in the repo (e.g. witty-donkeys-test.md). Adding more detail would contradict the repo rule: "No paragraphs, no rationale."

Template package.json (not reverted): Same rationale as #369/#370/#372 — the template must align with React 19 + Vite 8 to avoid dual React copies in generated projects. The path restriction applies to slide-authoring agents, not framework-level dependency upgrades.

pnpm version pins: Already satisfied. package.json has "packageManager": "pnpm@10.17.0" (newer than the suggested 10.26.0), and CI uses pnpm/action-setup@v4 which reads the version from packageManager. No .npmrc pin is needed. The allowBuilds and minimumReleaseAgeExclude entries in pnpm-workspace.yaml are evaluated consistently across local dev and CI since both use the same pnpm version.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants