Skip to content

fix: keep route module ids ending in a real extension so ecosystem plugins match - #2249

Merged
birkskyum merged 3 commits into
solidjs:mainfrom
birkskyum:keep-route-module-ids-ending-in-a-real-extension-so-ecosystem-plugins-match
Jul 26, 2026
Merged

fix: keep route module ids ending in a real extension so ecosystem plugins match#2249
birkskyum merged 3 commits into
solidjs:mainfrom
birkskyum:keep-route-module-ids-ending-in-a-real-extension-so-ecosystem-plugins-match

Conversation

@birkskyum

@birkskyum birkskyum commented Jul 26, 2026

Copy link
Copy Markdown
Member

Route files are imported through an id carrying the picked exports in the query (routes/api.ts?pick=GET). That leaves the id ending in GET, so any plugin whose filter is anchored on the file extension silently skips route files. unplugin-macros is one example: its default include is /\.[cm]?[jt]sx?$/, so macros in route files are never expanded and evaluate at runtime instead of build time.

toPickId() now appends a lang.<ext> marker (routes/api.ts?pick=GET&lang.ts), the same convention Vue SFCs use for ?vue&type=script&lang.ts. The id ends in a real extension again and those filters match.

The old id shape produced short chunk names only by accident, since extname() swallowed the entire query. Exposing the query turned index-<hash>.js into index.tsx_pick_default_pick__css_lang-<hash>.js, and client chunk filenames are public URLs. sanitizeChunkFileName strips the pick tail before applying rolldown's own rules, so names and hashes are unchanged from before.

Verifying

With a stock Macros() and no user filter config, a macro import in a route file:

before after
server chunk function getRandom() { return Math.random() } random: .2652779648920326
GET /macro x3 three different values same value three times

Dev and production both serve routes at 200 with CSS links, modulepreloads and manifest keys intact. Adds unit tests for toPickId and sanitizeChunkFileName; the existing treeshake and server-secret-leak tests in apps/tests still pass.

@changeset-bot

changeset-bot Bot commented Jul 26, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: d3b4268

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@netlify

netlify Bot commented Jul 26, 2026

Copy link
Copy Markdown

Deploy Preview for solid-start-landing-page ready!

Name Link
🔨 Latest commit d3b4268
🔍 Latest deploy log https://app.netlify.com/projects/solid-start-landing-page/deploys/6a664be34eafce0008b7a05e
😎 Deploy Preview https://deploy-preview-2249--solid-start-landing-page.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@pkg-pr-new

pkg-pr-new Bot commented Jul 26, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@solidjs/start@2249

commit: d3b4268

@birkskyum birkskyum added the Start 2.x targeting SolidStart 2.x versions label Jul 26, 2026
@birkskyum
birkskyum merged commit cd7f0da into solidjs:main Jul 26, 2026
11 checks passed
brenelz added a commit that referenced this pull request Jul 29, 2026
Brings the v2 rc line (through 2.0.0-rc.6) into the Solid 2 branch.

Ported main features onto the Solid 2 architecture:
- Server-function error handler (#2262): wired through
  handleServerFunctionRequest's transformResult hook and the
  solid-start:server-fn-error-handler virtual module.
- Custom seroval plugins (#2250): serialization.plugins now feeds the
  @solidjs/web codec on both the client transport and the server handler.
- ~ alias fix for workspace packages (#2239): adopted appRootAlias in
  place of the global resolve.alias entry.
- Dev toolbar (#2049, replaces the dev overlay): ported to Solid 2
  (Errored/Loading, onSettled, two-arg createEffect, draft-mutation
  stores, terracotta 2 subpath imports, @solidjs/web Portal/Dynamic/JSX,
  createMemo(async) instead of createResource). Protocol-specific pieces
  (SerovalChunkReader, body-format markers) moved local to the toolbar.
- Deferred stream response via h3 iterable() (#2231), StartHandler type
  (#2234), routerLoad restore (#2228), nonce on streaming redirect
  script (#2252), ResizeObserver-loop filter (#2240) all kept.

Kept deleted (superseded by vite-plugin-solid / @solidjs/web /
@solidjs/router server-function integration): fs-routes tree-shake,
manifest.ts, directives, fns serialization/registration/shared and their
specs. Fixes main landed in those files (#2249, #2238, #2243, #2245,
#2241, #2261) live upstream now and are tracked for porting there.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Start 2.x targeting SolidStart 2.x versions

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug?]: unplugin-macros doesn't work [Bug?]: unplugin-icons + unplugin-auto-import don't work within filesystem routes

2 participants