Skip to content

fix(cloudflare): auto-instrument when wrangler main is a package - #25343

Open
isaacs wants to merge 2 commits into
developfrom
isaacschlueter/js-3725-sentrycloudflarevite-auto-instrumentation-skips-the-worker
Open

isaacs wants to merge 2 commits into
developfrom
isaacschlueter/js-3725-sentrycloudflarevite-auto-instrumentation-skips-the-worker

Conversation

@isaacs

@isaacs isaacs commented Oct 14, 2026

Copy link
Copy Markdown
Member

When wrangler main is a package export, such as "main": "vinext/server/fetch-handler" or "main": "@astrojs/cloudflare/entrypoints/server", the Vite plugin did not wrap the Worker. The build passed, but the bundle had no Sentry code, and the plugin gave no warning.

unstable_readConfig() resolved every main as a path relative to the wrangler config, so no module matched the entry. The plugin now reads main the way @cloudflare/vite-plugin does. A value with a JS or TS extension is a file path. Any other value is resolved with Vite, once per environment, from the wrangler config. If it does not resolve, the plugin warns that auto-instrumentation is off. For a package entry, instrument.server.* is read from beside the wrangler config.

The resolve uses createIdResolver from vite, so vite is now an optional peer dependency. this.resolve() in transform does not work: Rollup's commonjs resolver loads each module it resolves, so a resolve of the entry from the entry's own transform never finishes. A resolveId hook does not work either, because vite:resolve resolves bare specifiers before user plugins see them. createIdResolver uses each environment's own conditions (for example workerd), so it picks the same file that the Cloudflare plugin bundles.

Bundled package entries often end in export { handler as default }. The transform only wrapped export default <expr>, so it now also wraps a default export in that form.

The new cloudflare-autoinstrument-package-entry e2e app installs a local package as the Worker entry. @sentry/astro still needs changes before astro-6-cf-workers can use a package main, so that app stays as it is, and will be fixed in a subsequent PR.

Fixes #24522
Fixes JS-3725

@linear-code

linear-code Bot commented Oct 14, 2026

Copy link
Copy Markdown

JS-3725

@isaacs

isaacs commented Oct 14, 2026

Copy link
Copy Markdown
Member Author

Bugbot run

When wrangler `main` is a package export, such as
`"main": "vinext/server/fetch-handler"` or
`"main": "@astrojs/cloudflare/entrypoints/server"`, the Vite plugin did
not wrap the Worker. The build passed, but the bundle had no Sentry
code, and the plugin gave no warning.

`unstable_readConfig()` resolved every `main` as a path relative to the
wrangler config, so no module matched the entry. The plugin now reads
`main` the way `@cloudflare/vite-plugin` does. A value with a JS or TS
extension is a file path. Any other value is resolved with Vite, once
per environment, from the wrangler config. If it does not resolve, the
plugin warns that auto-instrumentation is off. For a package entry,
`instrument.server.*` is read from beside the wrangler config.

The resolve uses `createIdResolver` from `vite`, so `vite` is now an
optional peer dependency. `this.resolve()` in `transform` does not
work: Rollup's commonjs resolver loads each module it resolves, so a
resolve of the entry from the entry's own transform never finishes.
A `resolveId` hook does not work either, because `vite:resolve`
resolves bare specifiers before user plugins see them.
`createIdResolver` uses each environment's own conditions (for example
`workerd`), so it picks the same file that the Cloudflare plugin
bundles.

Bundled package entries often end in `export { handler as default }`.
The transform only wrapped `export default <expr>`, so it now also
wraps a default export in that form.

The new `cloudflare-autoinstrument-package-entry` e2e app installs a
local package as the Worker entry. `@sentry/astro` still needs changes
before `astro-6-cf-workers` can use a package `main`, so that app stays
as it is, and will be fixed in a subsequent PR.

Fixes #24522
Fixes JS-3725

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@isaacs
isaacs force-pushed the isaacschlueter/js-3725-sentrycloudflarevite-auto-instrumentation-skips-the-worker branch from 90a6ab1 to 86fcec8 Compare October 14, 2026 02:49

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 86fcec8. Configure here.

Comment thread packages/cloudflare/src/vite/autoInstrument.ts
@isaacs
isaacs added this pull request to stack #25346 October 14, 2026 03:02
@isaacs
isaacs marked this pull request as ready for review October 14, 2026 04:03
@isaacs
isaacs requested a review from a team as a code owner October 14, 2026 04:03
@isaacs
isaacs requested review from andreiborza and mydea and removed request for a team October 14, 2026 04:03

@JPeer264 JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for taking this. That's quite an important one

},
"dependencies": {
"@sentry/cloudflare": "file:../../packed/sentry-cloudflare-packed.tgz",
"worker-entry": "file:../../test-applications/cloudflare-autoinstrument-package-entry/worker-entry"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

l: Instead of creating a new E2E test for this scenario we could rewrite existing E2E tests with frameworks that have this pattern already. E.g. in Astro we could just remove this file and change back the wrangler config to the main entrypoint of astro: @astrojs/cloudflare/entrypoints/server

wdyt?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

scratch that found this: #25347

But then I wonder if this e2e test has any additional value.

}

/**
* `export { handler as default }`, the form bundlers emit for a default export. The wrapper is

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

That is a good catch. Not sure why I haven't thought about that possibility yet

return `${wrappedName} as default`;
}

state.ms.append(`\nconst __SENTRY_DEFAULT_EXPORT__ = __SENTRY__.withSentry(${state.optionsFn}, ${localName});\n`);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

l: We recently had an issue with constructor names when we re-exported durable objects (we changed the name), which got fixed with #24700. I asked my clanker to get couple of export forms that could potentially be an issue with this. It came up with this table:

Image

It doesn't seems to be a big issue since I haven't seen any example in the wild with anonymous exports, but it is still changing the name - so maybe worth fixing (but could be in a follow up too, since the chance of hitting this is close to 0)

}

// Same rule as `@cloudflare/vite-plugin`: only these extensions mark `main` as a file path.
const ENTRY_FILE_REGEX = /\.(?:m?[jt]s|[jt]sx)$/;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

relevant xkcd: https://xkcd.com/208/

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.

@sentry/cloudflare/vite: Auto-instrumentation skips the Worker when wrangler main is a package specifier

2 participants