Repository navigation
fix: atomically publish generated files during sync - #17682
svelte-triage-bot[bot] wants to merge 1 commit into
Conversation
|
Install the latest version of pnpm add https://pkg.svelte.dev/@sveltejs/kit/c/fcc745c67710619f91db351e9ad52c5b1b66e97fOpen in Note This PR is from a fork. A maintainer must approve approve each commit before it can be built and installed. |
🦋 Changeset detectedLatest commit: fcc745c The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
Is there anything this still needs to come out of draft? Happy to help test it. This is the half of #17310 that 8fec3b0 took out before the merge, since no failure had been captured behind it then. #17681 now captures one, with a reproduction, and this version also answers two of the three points in that commit message: the cleanup is a For context, we have carried an equivalent patch to |
Fixes #17681
Concurrent syncs share
node_modules/$appeven when theiroutDirs differ. Their generated tsconfigs can legitimately contain different bytes. SincewriteFileSynctruncates before writing, overlapping opens can let a shorter write land after a longer one and leave trailing content. Readers can also observe the truncation window.Publish through unique sibling temporary files, then rename only complete contents into place. Temporary basenames have a fixed length independent of the destination, so valid long filenames—including prerendered output paths—remain supported. Failed writes/publication clean up the temporary file and propagate the error rather than falling back to another non-atomic write.
The disk comparison introduced in #17310 remains intact: it still prevents needless generated-file rewrites and HMR reloads. Likewise, preserve the shared parent-config placement from #16458 and #16589, and the generated-type
rootDirsmapping protected by #17242. Making that mapping independent ofoutDirwould break custom-output type resolution while merely hiding one source of disagreement.Fixing the shared writer covers both parent tsconfigs, generated declarations/manifests/environment modules, and its existing builder/prerender consumers. This preserves last-complete-writer semantics; it does not introduce separate simultaneous TypeScript configurations for each process.