diff --git a/packages/tanstackstart/docs/hosting-provider-esm-hooks.md b/packages/tanstackstart/docs/hosting-provider-esm-hooks.md new file mode 100644 index 000000000000..cf2df38e753c --- /dev/null +++ b/packages/tanstackstart/docs/hosting-provider-esm-hooks.md @@ -0,0 +1,30 @@ +> NOTE: These are docs for the maintainers of the TanStack Start SDK and not for users of the package. + +# Hosting Provider ESM Loader Hooks + +This file contains the code for ESM loader hooks that can be base64 encoded and passed to the `NODE_OPTIONS` environment variable as `--import "data:text/javascript;base64,1234BASE64HERE1324"`. + +Before encoding the snippets below and pasting them in docs or whatever, make sure to minify them as much as possible. + +In their current state the hooks are as minimal as possible. Do not remove things from them because you think they can be smaller - unless thoroughly testing them beforehand! + +## Vercel + +```mjs +import { register, createRequire } from 'module'; +if (!process.env.CI) { + try { + const moduleResolutionContext = `file://${process.cwd()}/index.js`; + const req = createRequire(moduleResolutionContext); + const { createAddHookMessageChannel } = req('import-in-the-middle'); + const { addHookMessagePort } = createAddHookMessageChannel(); + register('import-in-the-middle/hook.mjs', moduleResolutionContext, { + data: { addHookMessagePort, include: [] }, + transferList: [addHookMessagePort], + }); + globalThis._sentryEsmLoaderHookRegistered = true; + } catch (e) { + globalThis._sentryEsmLoaderHookError = `${e}`; + } +} +``` diff --git a/packages/tanstackstart/package.json b/packages/tanstackstart/package.json index 63a7916ff3dd..454cc1020966 100644 --- a/packages/tanstackstart/package.json +++ b/packages/tanstackstart/package.json @@ -54,7 +54,8 @@ "@sentry/core": "9.2.0", "@sentry/node": "9.2.0", "@sentry/opentelemetry": "9.2.0", - "@sentry/react": "9.2.0" + "@sentry/react": "9.2.0", + "import-in-the-middle": "^1.13.0" }, "scripts": { "build": "run-p build:transpile build:types", diff --git a/packages/tanstackstart/rollup.npm.config.mjs b/packages/tanstackstart/rollup.npm.config.mjs index 9b334bdbae41..86db6e7e013b 100644 --- a/packages/tanstackstart/rollup.npm.config.mjs +++ b/packages/tanstackstart/rollup.npm.config.mjs @@ -10,6 +10,9 @@ export default [ 'src/server/index.ts', 'src/config/index.ts', ], + packageSpecificConfig: { + external: ['import-in-the-middle/hook.mjs'], + }, }), ), ...makeOtelLoaders('./build', 'sentry-node'), diff --git a/packages/tanstackstart/src/server/index.ts b/packages/tanstackstart/src/server/index.ts index d61c75b7bfb4..b636eb94e2af 100644 --- a/packages/tanstackstart/src/server/index.ts +++ b/packages/tanstackstart/src/server/index.ts @@ -1 +1,5 @@ export * from '@sentry/node'; + +// We're importing this hook to explicitly tell tools like Vercel's `nft` not to throw the file away because it seems unused, because it is actually used by ESM loader hooks the user defines via node CLI arguments. +import 'import-in-the-middle/hook.mjs'; +import 'import-in-the-middle';