Skip to content

fix: Preserve source dependencies when adding workspace deps in turbo-gen#11935

Merged
anthonyshew merged 8 commits intovercel:mainfrom
sleitor:fix/gen-copy-deps
Mar 23, 2026
Merged

fix: Preserve source dependencies when adding workspace deps in turbo-gen#11935
anthonyshew merged 8 commits intovercel:mainfrom
sleitor:fix/gen-copy-deps

Conversation

@sleitor
Copy link
Copy Markdown
Contributor

@sleitor sleitor commented Feb 20, 2026

Closes #11505

Summary

Fix turbo gen workspace --copy to preserve the source package's existing dependencies when the user chooses to add workspace dependencies.

Problem

When copying a workspace and selecting "Add workspace dependencies", the copied package's original dependencies, devDependencies, etc. are completely replaced by only the selected workspace packages. All original deps from the source are lost.

Root Cause

In packages/turbo-gen/src/generators/copy.ts, the dependency update logic uses direct assignment:

packageJson[group] = deps;

This overwrites the entire dependency group instead of merging.

Fix

Merge the workspace dependencies with the existing ones:

packageJson[group] = { ...packageJson[group], ...deps };

Workspace deps take precedence (override) if there's a conflict, which is the expected behavior when explicitly adding them.

@sleitor sleitor requested a review from a team as a code owner February 20, 2026 19:07
@sleitor sleitor requested review from tknickman and removed request for a team February 20, 2026 19:07
@ghost ghost added the pkg: turbo-gen label Feb 20, 2026
@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented Feb 20, 2026

Someone is attempting to deploy a commit to the Vercel Team on Vercel.

A member of the Team first needs to authorize it.

@sleitor sleitor changed the title fix(gen): preserve source dependencies when adding workspace deps fix: preserve source dependencies when adding workspace deps in turbo-gen Feb 20, 2026
@sleitor sleitor changed the title fix: preserve source dependencies when adding workspace deps in turbo-gen fix: Preserve source dependencies when adding workspace deps in turbo-gen Feb 20, 2026
@sleitor
Copy link
Copy Markdown
Contributor Author

sleitor commented Feb 20, 2026

cc @anthonyshew — would appreciate a review when you get a chance!

Copy link
Copy Markdown
Contributor

@anthonyshew anthonyshew left a comment

Choose a reason for hiding this comment

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

Thanks!

anthonyshew and others added 2 commits March 23, 2026 13:07
The empty generator had the same replacement bug as the copy generator.
Adds regression tests verifying dependency merge behavior for both
generators: preservation of existing deps, user override precedence,
and handling of missing dependency groups.
@anthonyshew anthonyshew changed the title fix: Preserve source dependencies when adding workspace deps in turbo-gen fix: Preserve source dependencies when adding workspace deps in turbo-gen Mar 23, 2026
anthonyshew and others added 2 commits March 23, 2026 13:31
Use local MockFn type alias instead of importing from jest-mock,
which isn't resolvable by the package's tsconfig.
@anthonyshew anthonyshew enabled auto-merge (squash) March 23, 2026 20:23
@anthonyshew anthonyshew merged commit 01c56cc into vercel:main Mar 23, 2026
34 of 44 checks passed
@sleitor sleitor deleted the fix/gen-copy-deps branch March 23, 2026 21:05
github-actions Bot added a commit that referenced this pull request Mar 23, 2026
## Release v2.8.21-canary.8

Versioned docs: https://v2-8-21-canary-8.turborepo.dev

### Changes

- release(turborepo): 2.8.21-canary.7 (#12425) (`7155a67`)
- fix: Preserve source dependencies when adding workspace deps in
`turbo-gen` (#11935) (`01c56cc`)
- docs: Add Git history requirements to `turbo query affected` docs
(#12426) (`edc16d5`)
- fix: Prevent horizontal overflow from long inline code on narrow
viewports (#12428) (`a5d641b`)

Co-authored-by: Turbobot <turbobot@vercel.com>
github-actions Bot added a commit that referenced this pull request Mar 28, 2026
## Release v2.8.21

Versioned docs: https://v2-8-21.turborepo.dev

### Changes

- release(turborepo): 2.8.20 (#12396) (`45230ec`)
- fix: Disable husky hooks in `update-examples` workflow (#12397)
(`56b79ff`)
- docs: Add link to Docker guide in prune --docker flag section (#12401)
(`e7f0db7`)
- feat: Add `global` configuration key behind
`futureFlags.globalConfiguration` (#12399) (`5f190cf`)
- chore: Update CODEOWNERS to remove /docs owner (#12402) (`3233d3a`)
- fix: Strip JSX components from heading anchors and TOC entries
(#12404) (`3abe553`)
- fix: Move docs app icons into app/ directory (#12403) (`ddf3918`)
- feat: Add experimental structured logging with `--json` and
`--log-file` flags (#12405) (`7ca0601`)
- release(turborepo): 2.8.21-canary.1 (#12407) (`adebb95`)
- docs: Downgrade Next.js (#12408) (`281e89b`)
- chore: Deprecate the `turbo scan` command (#12406) (`4a12c26`)
- release(turborepo): 2.8.21-canary.2 (#12409) (`b9ef212`)
- fix(eslint-plugin-turbo): Guard against missing tasks/pipeline in
forEachTaskDef (#12411) (`6c107c2`)
- release(turborepo): 2.8.21-canary.3 (#12413) (`a2e6635`)
- chore: Upgrade Next.js (#12415) (`b9e6174`)
- Revert "fix: Flush stale mouse tracking events from stdin during TUI
cleanup" (#12416) (`646b06e`)
- fix: Add NixOS environment variables to default passthroughs (#12417)
(`4f12c69`)
- release(turborepo): 2.8.21-canary.4 (#12419) (`19cb539`)
- fix: Resolve security vulnerabilities in `tar` and `rustls-webpki`
(#12418) (`f09b138`)
- release(turborepo): 2.8.21-canary.5 (#12420) (`8aca047`)
- docs: Promote `turbo query` from experimental to stable (#12421)
(`0692aba`)
- docs: Clarify `turbo-ignore`'s future (#12422) (`c5a8235`)
- release(turborepo): 2.8.21-canary.6 (#12423) (`3ebf536`)
- feat: Rework turbo ls to use query internals and add turbo query ls
shorthand (#12424) (`84fd6e3`)
- docs: Clarify environment variables across packages dependency
behavior (#12390) (`e44b0d8`)
- docs: Expand subpath imports example (#12412) (`a7fec57`)
- fix(examples): Update of `with-svelte` example (#11952) (`41d1b2e`)
- release(turborepo): 2.8.21-canary.7 (#12425) (`7155a67`)
- fix: Preserve source dependencies when adding workspace deps in
`turbo-gen` (#11935) (`01c56cc`)
- docs: Add Git history requirements to `turbo query affected` docs
(#12426) (`edc16d5`)
- fix: Prevent horizontal overflow from long inline code on narrow
viewports (#12428) (`a5d641b`)
- release(turborepo): 2.8.21-canary.8 (#12429) (`46814d0`)
- feat: Send git SHA and dirty hash to remote cache (#12427) (`192034a`)
- fix: Upgrade tokio to 1.47.1+ to fix pidfd_reaper panic (#12431)
(`8c25d47`)
- release(turborepo): 2.8.21-canary.9 (#12432) (`2e2f8c3`)
- fix: Use script-shell=bash for cross-platform with-shell-commands
example (#12436) (`d5c2192`)
- docs: Add AI guide to sidebar navigation (#12438) (`021d288`)
- docs: Move `experimentalObservability` into `futureFlags` section
(#12439) (`85812cc`)
- fix: Skip Unix domain sockets and other special files during file
hashing (#12445) (`eb8f75e`)
- fix: Preserve dedupePeers and unknown pnpm lockfile settings (#12443)
(`1529b92`)
- release(turborepo): 2.8.21-canary.10 (#12446) (`014111c`)
- fix: Align dry run cache status with normal run by checking caching
guards (#12448) (`48aa171`)
- release(turborepo): 2.8.21-canary.11 (#12450) (`b14aa0b`)
- fix: Resolve turbo watch hang with mixed interruptible persistent
tasks (#12449) (`326532d`)
- release(turborepo): 2.8.21-canary.12 (#12451) (`379d47b`)
- fix: Avoid `setsid()` in PTY spawn to prevent macOS Gatekeeper CPU
spikes (#12452) (`dcc9f6a`)
- release(turborepo): 2.8.21-canary.13 (#12453) (`19f46e6`)
- feat: Add `packagesFromLockfile()` NAPI binding to `@turbo/repository`
(#12454) (`c58ee79`)
- release(library): 0.0.1-canary.21 (#12455) (`3637185`)
- release(turborepo): 2.8.21-canary.14 (#12456) (`3f87769`)
- refactor: Move cache hit SHA context to verbose logging (#12435)
(`23c15b4`)
- release(turborepo): 2.8.21-canary.15 (#12457) (`6353482`)
- docs: Add missing --force flag documentation (#12440) (`e3b89b0`)
- fix: Prevent panic in turbo watch with persistent tasks (#12459)
(`337b2e8`)
- release(turborepo): 2.8.21-canary.16 (#12461) (`e79a56b`)
- fix: Support `turbo watch` in single-package workspaces (#12460)
(`ae78ce1`)
- release(turborepo): 2.8.21-canary.17 (#12463) (`0bafae2`)
- fix: Missing deps after npm lockfile parsing (#12464) (`fe5a86e`)
- release(turborepo): 2.8.21-canary.18 (#12465) (`c014134`)
- docs: Add AI agent detection and automatic markdown rewrites (#12462)
(`50bd872`)
- fix: Resolve generator name conflicts across workspaces (#12467)
(`d5d37a8`)
- release(turborepo): 2.8.21-canary.19 (#12468) (`7552e93`)
- fix: Remove root package.json from `--affected` global triggers
(#12469) (`91ebb97`)
- release(turborepo): 2.8.21-canary.20 (#12470) (`c5a4690`)
- fix: Show run summary after TUI exits (#12471) (`ffa47d1`)

---------

Co-authored-by: Turbobot <turbobot@vercel.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

turbo gen workspace --copy does not keep the dependencies of the source if "Add workspace dependencies" is chosen

2 participants