Skip to content

fix: atomically publish generated route types - #17695

Draft
svelte-triage-bot[bot] wants to merge 1 commit into
mainfrom
triage/kit-17694-atomic-route-types
Draft

svelte-triage-bot[bot] wants to merge 1 commit into
mainfrom
triage/kit-17694-atomic-route-types

Conversation

@svelte-triage-bot

Copy link
Copy Markdown
Contributor

Fixes #17694

Route declarations and their generated proxies are written directly to their live paths. A reader can open them after truncation but before the new text is written, turning otherwise valid $types imports into error types.

Publish completed text through UUID-named temporary files under outDir, then rename it over the destination. Staging outside types matters: another sync can classify a sibling temporary as a stale route output and delete it before publication. Proxy publication now lives in update_types, alongside declaration publication, using the proxy objects already returned by process_node. The same writer covers the module's metadata output. Failed publication propagates the error and removes the temporary rather than falling back to another truncating write.

This preserves the unconditional-write behavior introduced in #5063, including regeneration timestamps and recreation after cleanup. Switching to write_if_changed would neither provide atomic publication on current main nor preserve those semantics. The final merged #17310 retained disk-content comparison but not atomic publication; #17682 addresses that shared writer separately. Keeping this change local also avoids changing adapter/prerender writer behavior.

#17096 previously staged metadata outside the cleanup tree, but was reverted by #17281 because preserving metadata exposed a cache-invalidation regression. This reuses the safe staging location without restoring metadata preservation or changing invalidation. Stale-file and empty-directory cleanup from #17472 remain intact. The separate root-output deletion issue (#17465) is not addressed here: publication is atomic per file, not a transaction over cleanup and all route outputs.

The scope includes full sync and incremental updates, page and layout declarations, both server and universal proxies, and the adjacent metadata write.

@pkg-svelte-dev

pkg-svelte-dev Bot commented Nov 9, 2026

Copy link
Copy Markdown

Install the latest version of @sveltejs/kit from 44d2f2e:

pnpm add https://pkg.svelte.dev/@sveltejs/kit/c/44d2f2e9d698ad57ab7289fd0bf3a88bc6d640cb

Open in pkg.svelte.dev: https://pkg.svelte.dev/repos/kit/pr/17695

Note

This PR is from a fork. A maintainer must approve approve each commit before it can be built and installed.

@changeset-bot

changeset-bot Bot commented Nov 9, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 44d2f2e

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@sveltejs/kit Patch

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

This branch has not been deployed

No deployments
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.

sync: concurrent readers can see an empty $types.d.ts (non-atomic write)

0 participants