Skip to content

chore: read options from one module instead of threading it through the server runtime - #16871

Merged
elliott-with-the-longest-name-on-github merged 1 commit into
version-3from
options-singleton
Aug 20, 2026
Merged

chore: read options from one module instead of threading it through the server runtime#16871
elliott-with-the-longest-name-on-github merged 1 commit into
version-3from
options-singleton

Conversation

@Nic-Polumeyv

@Nic-Polumeyv Nic-Polumeyv commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

options is already a single module-level object: runtime/server/index.js imports it from <sveltekit:generated>/server.js and Server.init writes hooks onto it, so every Server in a process shares it. It was also passed through 17 parameter positions, from internal_respond down to static_error_page, plus the RemoteInternals.run callback.

It now sits in runtime/server/internal.js next to manifest and read_implementation, and hooks gets its own set_hooks() there, so options is immutable build data once set_options has run. set_options is called at module scope rather than in the constructor, so it lands before prerendering evaluates the user's remote modules, which happens before any Server is constructed.

fetch.js renames its destructured set-cookie options to cookie_options, which would otherwise shadow the import.

Follow-up to #16605 (comment). Part of #16519.

@pkg-svelte-dev

pkg-svelte-dev Bot commented Aug 20, 2026

Copy link
Copy Markdown

Install the latest version of @sveltejs/kit from ecbc666:

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

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

@changeset-bot

changeset-bot Bot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: ecbc666

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

@svelte-docs-bot

Copy link
Copy Markdown

@elliott-with-the-longest-name-on-github

Copy link
Copy Markdown
Contributor

I do wonder if this is the direction we really want to go in the long run. I think it looks better now, but it really means we just have more mocking to do in the future if we want to unit test this stuff -- i.e. instead of being able to pass options into a function and assert on the results of the function, we would have to mock the options object from the module, which is just... worse. But I think this is something we can worry about down the line in a refactor.

@Nic-Polumeyv

Copy link
Copy Markdown
Contributor Author

options is already a single module-level object: runtime/server/index.js imports it from <sveltekit:generated>/server.js and Server.init writes hooks onto it, so every Server in a process shares it. This moves the object from an import to a setter. The new server tests in #16872 only go through Server.init/respond, so they don't need it injected either. I'm splitting hooks into its own set_hooks() here so that after set_options the options object is immutable build data.

Comment thread packages/kit/src/runtime/server/page/load_data.spec.js
@elliott-with-the-longest-name-on-github
elliott-with-the-longest-name-on-github merged commit e325d7d into version-3 Aug 20, 2026
40 checks passed
@elliott-with-the-longest-name-on-github
elliott-with-the-longest-name-on-github deleted the options-singleton branch August 20, 2026 23:08
Rich-Harris added a commit that referenced this pull request Aug 21, 2026
)

Several `SSROptions` fields are build-time constants that already exist
as defines for the client, `__SVELTEKIT_EMBEDDED__` and
`__SVELTEKIT_HASH_ROUTING__`. The server took a second route to the same
values through `options`, though `app/paths/internal/server.js` already
reads `__SVELTEKIT_APP_DIR__`. This moves the server onto those two and
adds defines for `csrf_check_origin`, `link_header_preload`,
`paths_origin` and `service_worker`.

The app's global name was derived in five places:
`exports/vite/index.js` twice, `core/env.js` twice, and
`runtime/server/utils.js` in `get_global_name`, which read it back out
of `SSROptions.version_hash`. Two of them called
`hash(config.version.name)` separately. `get_global_name(version_name,
dev)` in `core/utils.js` is now the only derivation, and the server
reads the result through `__SVELTEKIT_GLOBAL_NAME__`.
`SSROptions.version` had no readers at all.

`csp`, `csrf_trusted_origins`, `service_worker_options` and `templates`
stay put: a define is a textual substitution, so a structured value gets
re-inlined at every read.

Stacked on #16871.
@Nic-Polumeyv Nic-Polumeyv mentioned this pull request Aug 21, 2026
5 tasks
Rich-Harris pushed a commit that referenced this pull request Aug 21, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to version-3, this PR
will be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`version-3` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `version-3`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @sveltejs/adapter-bun@1.0.0-next.1

### Minor Changes

- feat: add a Bun-native adapter with static file serving and
single-executable support
([#16695](#16695))

### Patch Changes

- Updated dependencies
[[`9b3d195`](9b3d195),
[`385d378`](385d378),
[`3782448`](3782448),
[`d0d3a33`](d0d3a33),
[`4b7a483`](4b7a483),
[`e325d7d`](e325d7d),
[`4f63c79`](4f63c79)]:
  - @sveltejs/kit@3.0.0-next.25
## @sveltejs/kit@3.0.0-next.25

### Minor Changes

- feat: add an `applyReroute` helper for adapters that support split
serverless function deployments
([#16665](#16665))

### Patch Changes

- chore: build streamed responses from async generators
([#16847](#16847))

- fix: tweak response logging for remote requests
([#16865](#16865))

- fix: discard invalidation results when a navigation completes while
they load ([#16852](#16852))

- fix: route dev-server response logging through Vite's logger so it
respects `logLevel` and `customLogger`
([#16858](#16858))

- chore: read build-time config from defines on the server instead of
carrying it in `options`
([#16873](#16873))

- chore: read `options` from a single module instead of passing it
through the server runtime
([#16871](#16871))
## @sveltejs/adapter-netlify@7.0.0-next.10

### Patch Changes

- fix: correctly apply `reroute` results for apps configured with split
serverless functions
([#16665](#16665))
- Updated dependencies
[[`9b3d195`](9b3d195),
[`385d378`](385d378),
[`3782448`](3782448),
[`d0d3a33`](d0d3a33),
[`4b7a483`](4b7a483),
[`e325d7d`](e325d7d),
[`4f63c79`](4f63c79)]:
  - @sveltejs/kit@3.0.0-next.25
## @sveltejs/adapter-vercel@7.0.0-next.8

### Patch Changes

- fix: omit ISR data endpoints for server-only routes
([#16731](#16731))

- fix: correctly apply `reroute` results for apps configured with split
serverless functions
([#16665](#16665))
- Updated dependencies
[[`9b3d195`](9b3d195),
[`385d378`](385d378),
[`3782448`](3782448),
[`d0d3a33`](d0d3a33),
[`4b7a483`](4b7a483),
[`e325d7d`](e325d7d),
[`4f63c79`](4f63c79)]:
  - @sveltejs/kit@3.0.0-next.25

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
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