@tanstack/start-plugin-core 1.166.11 → 1.166.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/dist/esm/build-sitemap.js +94 -123
  2. package/dist/esm/build-sitemap.js.map +1 -1
  3. package/dist/esm/constants.js +15 -20
  4. package/dist/esm/constants.js.map +1 -1
  5. package/dist/esm/dev-server-plugin/dev-styles.js +137 -150
  6. package/dist/esm/dev-server-plugin/dev-styles.js.map +1 -1
  7. package/dist/esm/dev-server-plugin/extract-html-scripts.js +16 -15
  8. package/dist/esm/dev-server-plugin/extract-html-scripts.js.map +1 -1
  9. package/dist/esm/dev-server-plugin/plugin.js +125 -195
  10. package/dist/esm/dev-server-plugin/plugin.js.map +1 -1
  11. package/dist/esm/import-protection-plugin/ast.js +6 -5
  12. package/dist/esm/import-protection-plugin/ast.js.map +1 -1
  13. package/dist/esm/import-protection-plugin/constants.js +20 -22
  14. package/dist/esm/import-protection-plugin/constants.js.map +1 -1
  15. package/dist/esm/import-protection-plugin/defaults.js +35 -25
  16. package/dist/esm/import-protection-plugin/defaults.js.map +1 -1
  17. package/dist/esm/import-protection-plugin/extensionlessAbsoluteIdResolver.js +93 -92
  18. package/dist/esm/import-protection-plugin/extensionlessAbsoluteIdResolver.js.map +1 -1
  19. package/dist/esm/import-protection-plugin/matchers.js +23 -24
  20. package/dist/esm/import-protection-plugin/matchers.js.map +1 -1
  21. package/dist/esm/import-protection-plugin/plugin.js +1045 -1361
  22. package/dist/esm/import-protection-plugin/plugin.js.map +1 -1
  23. package/dist/esm/import-protection-plugin/postCompileUsage.js +58 -55
  24. package/dist/esm/import-protection-plugin/postCompileUsage.js.map +1 -1
  25. package/dist/esm/import-protection-plugin/rewriteDeniedImports.js +187 -259
  26. package/dist/esm/import-protection-plugin/rewriteDeniedImports.js.map +1 -1
  27. package/dist/esm/import-protection-plugin/sourceLocation.js +238 -248
  28. package/dist/esm/import-protection-plugin/sourceLocation.js.map +1 -1
  29. package/dist/esm/import-protection-plugin/trace.js +173 -184
  30. package/dist/esm/import-protection-plugin/trace.js.map +1 -1
  31. package/dist/esm/import-protection-plugin/utils.js +132 -111
  32. package/dist/esm/import-protection-plugin/utils.js.map +1 -1
  33. package/dist/esm/import-protection-plugin/virtualModules.js +214 -194
  34. package/dist/esm/import-protection-plugin/virtualModules.js.map +1 -1
  35. package/dist/esm/index.js +2 -7
  36. package/dist/esm/load-env-plugin/plugin.js +12 -11
  37. package/dist/esm/load-env-plugin/plugin.js.map +1 -1
  38. package/dist/esm/output-directory.js +10 -10
  39. package/dist/esm/output-directory.js.map +1 -1
  40. package/dist/esm/plugin.js +275 -355
  41. package/dist/esm/plugin.js.map +1 -1
  42. package/dist/esm/post-server-build.js +39 -53
  43. package/dist/esm/post-server-build.js.map +1 -1
  44. package/dist/esm/prerender.js +177 -239
  45. package/dist/esm/prerender.js.map +1 -1
  46. package/dist/esm/preview-server-plugin/plugin.js +41 -44
  47. package/dist/esm/preview-server-plugin/plugin.js.map +1 -1
  48. package/dist/esm/queue.js +115 -126
  49. package/dist/esm/queue.js.map +1 -1
  50. package/dist/esm/resolve-entries.js +31 -32
  51. package/dist/esm/resolve-entries.js.map +1 -1
  52. package/dist/esm/schema.js +156 -179
  53. package/dist/esm/schema.js.map +1 -1
  54. package/dist/esm/start-compiler-plugin/compiler.js +655 -812
  55. package/dist/esm/start-compiler-plugin/compiler.js.map +1 -1
  56. package/dist/esm/start-compiler-plugin/handleClientOnlyJSX.js +25 -8
  57. package/dist/esm/start-compiler-plugin/handleClientOnlyJSX.js.map +1 -1
  58. package/dist/esm/start-compiler-plugin/handleCreateIsomorphicFn.js +22 -19
  59. package/dist/esm/start-compiler-plugin/handleCreateIsomorphicFn.js.map +1 -1
  60. package/dist/esm/start-compiler-plugin/handleCreateMiddleware.js +20 -22
  61. package/dist/esm/start-compiler-plugin/handleCreateMiddleware.js.map +1 -1
  62. package/dist/esm/start-compiler-plugin/handleCreateServerFn.js +187 -255
  63. package/dist/esm/start-compiler-plugin/handleCreateServerFn.js.map +1 -1
  64. package/dist/esm/start-compiler-plugin/handleEnvOnly.js +23 -33
  65. package/dist/esm/start-compiler-plugin/handleEnvOnly.js.map +1 -1
  66. package/dist/esm/start-compiler-plugin/plugin.js +247 -291
  67. package/dist/esm/start-compiler-plugin/plugin.js.map +1 -1
  68. package/dist/esm/start-compiler-plugin/utils.js +27 -27
  69. package/dist/esm/start-compiler-plugin/utils.js.map +1 -1
  70. package/dist/esm/start-manifest-plugin/manifestBuilder.js +272 -378
  71. package/dist/esm/start-manifest-plugin/manifestBuilder.js.map +1 -1
  72. package/dist/esm/start-manifest-plugin/plugin.js +35 -44
  73. package/dist/esm/start-manifest-plugin/plugin.js.map +1 -1
  74. package/dist/esm/start-router-plugin/constants.js +6 -5
  75. package/dist/esm/start-router-plugin/constants.js.map +1 -1
  76. package/dist/esm/start-router-plugin/generator-plugins/prerender-routes-plugin.js +24 -19
  77. package/dist/esm/start-router-plugin/generator-plugins/prerender-routes-plugin.js.map +1 -1
  78. package/dist/esm/start-router-plugin/generator-plugins/routes-manifest-plugin.js +28 -29
  79. package/dist/esm/start-router-plugin/generator-plugins/routes-manifest-plugin.js.map +1 -1
  80. package/dist/esm/start-router-plugin/plugin.js +146 -199
  81. package/dist/esm/start-router-plugin/plugin.js.map +1 -1
  82. package/dist/esm/start-router-plugin/pruneServerOnlySubtrees.js +32 -31
  83. package/dist/esm/start-router-plugin/pruneServerOnlySubtrees.js.map +1 -1
  84. package/dist/esm/utils.js +14 -14
  85. package/dist/esm/utils.js.map +1 -1
  86. package/package.json +7 -7
  87. package/dist/esm/index.js.map +0 -1
@@ -1,152 +1,90 @@
1
- import { isRunnableDevEnvironment } from "vite";
2
- import { VIRTUAL_MODULES } from "@tanstack/start-server-core";
3
- import { NodeRequest, sendNodeResponse } from "srvx/node";
4
- import { VITE_ENVIRONMENT_NAMES, ENTRY_POINTS } from "../constants.js";
5
1
  import { resolveViteId } from "../utils.js";
2
+ import { ENTRY_POINTS, VITE_ENVIRONMENT_NAMES } from "../constants.js";
6
3
  import { extractHtmlScripts } from "./extract-html-scripts.js";
7
4
  import { CSS_MODULES_REGEX, collectDevStyles, normalizeCssModuleCacheKey } from "./dev-styles.js";
8
- function devServerPlugin({
9
- getConfig,
10
- devSsrStylesEnabled
11
- }) {
12
- let isTest = false;
13
- let injectedHeadScripts;
14
- const cssModulesCache = {};
15
- return [
16
- {
17
- name: "tanstack-start-core:dev-server",
18
- config(_userConfig, { mode }) {
19
- isTest = isTest ? isTest : mode === "test";
20
- },
21
- // Capture CSS modules content during transform
22
- transform: {
23
- filter: {
24
- id: CSS_MODULES_REGEX
25
- },
26
- handler(code, id) {
27
- cssModulesCache[normalizeCssModuleCacheKey(id)] = code;
28
- }
29
- },
30
- async configureServer(viteDevServer) {
31
- if (isTest) {
32
- return;
33
- }
34
- const templateHtml = `<html><head></head><body></body></html>`;
35
- const transformedHtml = await viteDevServer.transformIndexHtml(
36
- "/",
37
- templateHtml
38
- );
39
- const scripts = extractHtmlScripts(transformedHtml);
40
- injectedHeadScripts = scripts.flatMap((script) => script.content ?? []).join(";");
41
- if (devSsrStylesEnabled) {
42
- viteDevServer.middlewares.use(async (req, res, next) => {
43
- const url = req.url ?? "";
44
- const pathname = url.split("?")[0];
45
- if (!pathname?.endsWith("/@tanstack-start/styles.css")) {
46
- return next();
47
- }
48
- try {
49
- const urlObj = new URL(url, "http://localhost");
50
- const routesParam = urlObj.searchParams.get("routes");
51
- const routeIds = routesParam ? routesParam.split(",") : [];
52
- const entries = [];
53
- const routesManifest = globalThis.TSS_ROUTES_MANIFEST;
54
- if (routesManifest && routeIds.length > 0) {
55
- for (const routeId of routeIds) {
56
- const route = routesManifest[routeId];
57
- if (route?.filePath) {
58
- entries.push(route.filePath);
59
- }
60
- }
61
- }
62
- const css = entries.length > 0 ? await collectDevStyles({
63
- viteDevServer,
64
- entries,
65
- cssModulesCache
66
- }) : void 0;
67
- res.setHeader("Content-Type", "text/css");
68
- res.setHeader("Cache-Control", "no-store");
69
- res.end(css ?? "");
70
- } catch (e) {
71
- console.error("[tanstack-start] Error collecting dev styles:", e);
72
- res.setHeader("Content-Type", "text/css");
73
- res.setHeader("Cache-Control", "no-store");
74
- res.end(
75
- `/* Error collecting styles: ${e instanceof Error ? e.message : String(e)} */`
76
- );
77
- }
78
- });
79
- }
80
- return () => {
81
- const serverEnv = viteDevServer.environments[VITE_ENVIRONMENT_NAMES.server];
82
- if (!serverEnv) {
83
- throw new Error(
84
- `Server environment ${VITE_ENVIRONMENT_NAMES.server} not found`
85
- );
86
- }
87
- const { startConfig } = getConfig();
88
- const installMiddleware = startConfig.vite?.installDevServerMiddleware;
89
- if (installMiddleware === false) {
90
- return;
91
- }
92
- if (installMiddleware == void 0) {
93
- if (viteDevServer.config.server.middlewareMode) {
94
- return;
95
- }
96
- if (!isRunnableDevEnvironment(serverEnv) || // do not check via `isFetchableDevEnvironment` since nitro does implement the `FetchableDevEnvironment` interface but not via inheritance (which this helper checks)
97
- "dispatchFetch" in serverEnv) {
98
- return;
99
- }
100
- }
101
- if (!isRunnableDevEnvironment(serverEnv)) {
102
- throw new Error(
103
- "cannot install vite dev server middleware for TanStack Start since the SSR environment is not a RunnableDevEnvironment"
104
- );
105
- }
106
- viteDevServer.middlewares.use(async (req, res) => {
107
- if (req.originalUrl) {
108
- req.url = req.originalUrl;
109
- }
110
- const webReq = new NodeRequest({ req, res });
111
- try {
112
- const serverEntry = await serverEnv.runner.import(
113
- ENTRY_POINTS.server
114
- );
115
- const webRes = await serverEntry["default"].fetch(webReq);
116
- return sendNodeResponse(res, webRes);
117
- } catch (e) {
118
- console.error(e);
119
- try {
120
- viteDevServer.ssrFixStacktrace(e);
121
- } catch {
122
- }
123
- if (webReq.headers.get("content-type")?.includes("application/json")) {
124
- return sendNodeResponse(
125
- res,
126
- new Response(
127
- JSON.stringify(
128
- {
129
- status: 500,
130
- error: "Internal Server Error",
131
- message: "An unexpected error occurred. Please try again later.",
132
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
133
- },
134
- null,
135
- 2
136
- ),
137
- {
138
- status: 500,
139
- headers: {
140
- "Content-Type": "application/json"
141
- }
142
- }
143
- )
144
- );
145
- }
146
- return sendNodeResponse(
147
- res,
148
- new Response(
149
- `
5
+ import { isRunnableDevEnvironment } from "vite";
6
+ import { VIRTUAL_MODULES } from "@tanstack/start-server-core";
7
+ import { NodeRequest, sendNodeResponse } from "srvx/node";
8
+ //#region src/dev-server-plugin/plugin.ts
9
+ function devServerPlugin({ getConfig, devSsrStylesEnabled }) {
10
+ let isTest = false;
11
+ let injectedHeadScripts;
12
+ const cssModulesCache = {};
13
+ return [{
14
+ name: "tanstack-start-core:dev-server",
15
+ config(_userConfig, { mode }) {
16
+ isTest = isTest ? isTest : mode === "test";
17
+ },
18
+ transform: {
19
+ filter: { id: CSS_MODULES_REGEX },
20
+ handler(code, id) {
21
+ cssModulesCache[normalizeCssModuleCacheKey(id)] = code;
22
+ }
23
+ },
24
+ async configureServer(viteDevServer) {
25
+ if (isTest) return;
26
+ injectedHeadScripts = extractHtmlScripts(await viteDevServer.transformIndexHtml("/", `<html><head></head><body></body></html>`)).flatMap((script) => script.content ?? []).join(";");
27
+ if (devSsrStylesEnabled) viteDevServer.middlewares.use(async (req, res, next) => {
28
+ const url = req.url ?? "";
29
+ if (!url.split("?")[0]?.endsWith("/@tanstack-start/styles.css")) return next();
30
+ try {
31
+ const routesParam = new URL(url, "http://localhost").searchParams.get("routes");
32
+ const routeIds = routesParam ? routesParam.split(",") : [];
33
+ const entries = [];
34
+ const routesManifest = globalThis.TSS_ROUTES_MANIFEST;
35
+ if (routesManifest && routeIds.length > 0) for (const routeId of routeIds) {
36
+ const route = routesManifest[routeId];
37
+ if (route?.filePath) entries.push(route.filePath);
38
+ }
39
+ const css = entries.length > 0 ? await collectDevStyles({
40
+ viteDevServer,
41
+ entries,
42
+ cssModulesCache
43
+ }) : void 0;
44
+ res.setHeader("Content-Type", "text/css");
45
+ res.setHeader("Cache-Control", "no-store");
46
+ res.end(css ?? "");
47
+ } catch (e) {
48
+ console.error("[tanstack-start] Error collecting dev styles:", e);
49
+ res.setHeader("Content-Type", "text/css");
50
+ res.setHeader("Cache-Control", "no-store");
51
+ res.end(`/* Error collecting styles: ${e instanceof Error ? e.message : String(e)} */`);
52
+ }
53
+ });
54
+ return () => {
55
+ const serverEnv = viteDevServer.environments[VITE_ENVIRONMENT_NAMES.server];
56
+ if (!serverEnv) throw new Error(`Server environment ${VITE_ENVIRONMENT_NAMES.server} not found`);
57
+ const { startConfig } = getConfig();
58
+ const installMiddleware = startConfig.vite?.installDevServerMiddleware;
59
+ if (installMiddleware === false) return;
60
+ if (installMiddleware == void 0) {
61
+ if (viteDevServer.config.server.middlewareMode) return;
62
+ if (!isRunnableDevEnvironment(serverEnv) || "dispatchFetch" in serverEnv) return;
63
+ }
64
+ if (!isRunnableDevEnvironment(serverEnv)) throw new Error("cannot install vite dev server middleware for TanStack Start since the SSR environment is not a RunnableDevEnvironment");
65
+ viteDevServer.middlewares.use(async (req, res) => {
66
+ if (req.originalUrl) req.url = req.originalUrl;
67
+ const webReq = new NodeRequest({
68
+ req,
69
+ res
70
+ });
71
+ try {
72
+ return sendNodeResponse(res, await (await serverEnv.runner.import(ENTRY_POINTS.server))["default"].fetch(webReq));
73
+ } catch (e) {
74
+ console.error(e);
75
+ try {
76
+ viteDevServer.ssrFixStacktrace(e);
77
+ } catch {}
78
+ if (webReq.headers.get("content-type")?.includes("application/json")) return sendNodeResponse(res, new Response(JSON.stringify({
79
+ status: 500,
80
+ error: "Internal Server Error",
81
+ message: "An unexpected error occurred. Please try again later.",
82
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
83
+ }, null, 2), {
84
+ status: 500,
85
+ headers: { "Content-Type": "application/json" }
86
+ }));
87
+ return sendNodeResponse(res, new Response(`
150
88
  <!DOCTYPE html>
151
89
  <html lang="en">
152
90
  <head>
@@ -154,61 +92,53 @@ function devServerPlugin({
154
92
  <title>Error</title>
155
93
  <script type="module">
156
94
  import { ErrorOverlay } from '/@vite/client'
157
- document.body.appendChild(new ErrorOverlay(${JSON.stringify(
158
- prepareError(req, e)
159
- ).replace(/</g, "\\u003c")}))
95
+ document.body.appendChild(new ErrorOverlay(${JSON.stringify(prepareError(req, e)).replace(/</g, "\\u003c")}))
160
96
  <\/script>
161
97
  </head>
162
98
  <body>
163
99
  </body>
164
100
  </html>
165
- `,
166
- {
167
- status: 500,
168
- headers: {
169
- "Content-Type": "text/html"
170
- }
171
- }
172
- )
173
- );
174
- }
175
- });
176
- };
177
- }
178
- },
179
- {
180
- name: "tanstack-start-core:dev-server:injected-head-scripts",
181
- sharedDuringBuild: true,
182
- applyToEnvironment: (env) => env.config.consumer === "server",
183
- resolveId: {
184
- filter: { id: new RegExp(VIRTUAL_MODULES.injectedHeadScripts) },
185
- handler(_id) {
186
- return resolveViteId(VIRTUAL_MODULES.injectedHeadScripts);
187
- }
188
- },
189
- load: {
190
- filter: {
191
- id: new RegExp(resolveViteId(VIRTUAL_MODULES.injectedHeadScripts))
192
- },
193
- handler() {
194
- const mod = `
101
+ `, {
102
+ status: 500,
103
+ headers: { "Content-Type": "text/html" }
104
+ }));
105
+ }
106
+ });
107
+ };
108
+ }
109
+ }, {
110
+ name: "tanstack-start-core:dev-server:injected-head-scripts",
111
+ sharedDuringBuild: true,
112
+ applyToEnvironment: (env) => env.config.consumer === "server",
113
+ resolveId: {
114
+ filter: { id: new RegExp(VIRTUAL_MODULES.injectedHeadScripts) },
115
+ handler(_id) {
116
+ return resolveViteId(VIRTUAL_MODULES.injectedHeadScripts);
117
+ }
118
+ },
119
+ load: {
120
+ filter: { id: new RegExp(resolveViteId(VIRTUAL_MODULES.injectedHeadScripts)) },
121
+ handler() {
122
+ return `
195
123
  export const injectedHeadScripts = ${JSON.stringify(injectedHeadScripts) || "undefined"}`;
196
- return mod;
197
- }
198
- }
199
- }
200
- ];
124
+ }
125
+ }
126
+ }];
201
127
  }
128
+ /**
129
+ * Formats error for SSR message in error overlay
130
+ * @param req
131
+ * @param error
132
+ * @returns
133
+ */
202
134
  function prepareError(req, error) {
203
- const e = error;
204
- return {
205
- message: `An error occurred while server rendering ${req.url}:
206
-
207
- ${typeof e === "string" ? e : e.message} `,
208
- stack: typeof e === "string" ? "" : e.stack
209
- };
135
+ const e = error;
136
+ return {
137
+ message: `An error occurred while server rendering ${req.url}:\n\n\t${typeof e === "string" ? e : e.message} `,
138
+ stack: typeof e === "string" ? "" : e.stack
139
+ };
210
140
  }
211
- export {
212
- devServerPlugin
213
- };
214
- //# sourceMappingURL=plugin.js.map
141
+ //#endregion
142
+ export { devServerPlugin };
143
+
144
+ //# sourceMappingURL=plugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sources":["../../../src/dev-server-plugin/plugin.ts"],"sourcesContent":["import { isRunnableDevEnvironment } from 'vite'\nimport { VIRTUAL_MODULES } from '@tanstack/start-server-core'\nimport { NodeRequest, sendNodeResponse } from 'srvx/node'\nimport { ENTRY_POINTS, VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { resolveViteId } from '../utils'\nimport { extractHtmlScripts } from './extract-html-scripts'\nimport {\n CSS_MODULES_REGEX,\n collectDevStyles,\n normalizeCssModuleCacheKey,\n} from './dev-styles'\nimport type { Connect, DevEnvironment, PluginOption } from 'vite'\nimport type { GetConfigFn } from '../types'\n\nexport function devServerPlugin({\n getConfig,\n devSsrStylesEnabled,\n}: {\n getConfig: GetConfigFn\n devSsrStylesEnabled: boolean\n}): PluginOption {\n let isTest = false\n\n let injectedHeadScripts: string | undefined\n\n // Cache CSS modules content during transform hook.\n // For CSS modules, the transform hook receives the raw CSS content before\n // Vite wraps it in JS. We capture this to use during SSR style collection.\n const cssModulesCache: Record<string, string> = {}\n\n return [\n {\n name: 'tanstack-start-core:dev-server',\n config(_userConfig, { mode }) {\n isTest = isTest ? isTest : mode === 'test'\n },\n // Capture CSS modules content during transform\n transform: {\n filter: {\n id: CSS_MODULES_REGEX,\n },\n handler(code, id) {\n cssModulesCache[normalizeCssModuleCacheKey(id)] = code\n },\n },\n async configureServer(viteDevServer) {\n if (isTest) {\n return\n }\n\n // Extract the scripts that Vite plugins would inject into the initial HTML\n const templateHtml = `<html><head></head><body></body></html>`\n const transformedHtml = await viteDevServer.transformIndexHtml(\n '/',\n templateHtml,\n )\n const scripts = extractHtmlScripts(transformedHtml)\n injectedHeadScripts = scripts\n .flatMap((script) => script.content ?? [])\n .join(';')\n\n // CSS middleware registered in PRE-PHASE (before Vite's internal middlewares)\n // This ensures it handles /@tanstack-start/styles.css before any catch-all middleware\n // from other plugins (like nitro) that may be registered in the post-phase.\n // This makes the CSS endpoint work regardless of plugin order in the Vite config.\n // We check pathname.endsWith() to handle basepaths (e.g., /my-app/@tanstack-start/styles.css)\n // since pre-phase runs before Vite's base middleware strips the basepath.\n if (devSsrStylesEnabled) {\n viteDevServer.middlewares.use(async (req, res, next) => {\n const url = req.url ?? ''\n const pathname = url.split('?')[0]\n if (!pathname?.endsWith('/@tanstack-start/styles.css')) {\n return next()\n }\n\n try {\n // Parse route IDs from query param\n const urlObj = new URL(url, 'http://localhost')\n const routesParam = urlObj.searchParams.get('routes')\n const routeIds = routesParam ? routesParam.split(',') : []\n\n // Build entries list from route file paths\n const entries: Array<string> = []\n\n // Look up route file paths from manifest\n // Only routes registered in the manifest are used - this prevents path injection\n const routesManifest = (globalThis as any).TSS_ROUTES_MANIFEST as\n | Record<string, { filePath: string; children?: Array<string> }>\n | undefined\n\n if (routesManifest && routeIds.length > 0) {\n for (const routeId of routeIds) {\n const route = routesManifest[routeId]\n if (route?.filePath) {\n entries.push(route.filePath)\n }\n }\n }\n\n const css =\n entries.length > 0\n ? await collectDevStyles({\n viteDevServer,\n entries,\n cssModulesCache,\n })\n : undefined\n\n res.setHeader('Content-Type', 'text/css')\n res.setHeader('Cache-Control', 'no-store')\n res.end(css ?? '')\n } catch (e) {\n // Log error but still return valid CSS response to avoid MIME type issues\n console.error('[tanstack-start] Error collecting dev styles:', e)\n res.setHeader('Content-Type', 'text/css')\n res.setHeader('Cache-Control', 'no-store')\n res.end(\n `/* Error collecting styles: ${e instanceof Error ? e.message : String(e)} */`,\n )\n }\n })\n }\n\n return () => {\n const serverEnv = viteDevServer.environments[\n VITE_ENVIRONMENT_NAMES.server\n ] as DevEnvironment | undefined\n\n if (!serverEnv) {\n throw new Error(\n `Server environment ${VITE_ENVIRONMENT_NAMES.server} not found`,\n )\n }\n\n const { startConfig } = getConfig()\n const installMiddleware = startConfig.vite?.installDevServerMiddleware\n if (installMiddleware === false) {\n return\n }\n if (installMiddleware == undefined) {\n // do not install middleware in middlewareMode by default\n if (viteDevServer.config.server.middlewareMode) {\n return\n }\n\n // do not install middleware if SSR env in case another plugin already did\n if (\n !isRunnableDevEnvironment(serverEnv) ||\n // do not check via `isFetchableDevEnvironment` since nitro does implement the `FetchableDevEnvironment` interface but not via inheritance (which this helper checks)\n 'dispatchFetch' in serverEnv\n ) {\n return\n }\n }\n\n if (!isRunnableDevEnvironment(serverEnv)) {\n throw new Error(\n 'cannot install vite dev server middleware for TanStack Start since the SSR environment is not a RunnableDevEnvironment',\n )\n }\n\n viteDevServer.middlewares.use(async (req, res) => {\n // fix the request URL to match the original URL\n // otherwise, the request URL will '/index.html'\n if (req.originalUrl) {\n req.url = req.originalUrl\n }\n const webReq = new NodeRequest({ req, res })\n\n try {\n // Import and resolve the request by running the server request entry point\n // this request entry point must implement the `fetch` API as follows:\n /**\n * export default {\n * fetch(req: Request): Promise<Response>\n * }\n */\n const serverEntry = await serverEnv.runner.import(\n ENTRY_POINTS.server,\n )\n const webRes = await serverEntry['default'].fetch(webReq)\n\n return sendNodeResponse(res, webRes)\n } catch (e) {\n console.error(e)\n try {\n viteDevServer.ssrFixStacktrace(e as Error)\n } catch {}\n\n if (\n webReq.headers.get('content-type')?.includes('application/json')\n ) {\n return sendNodeResponse(\n res,\n new Response(\n JSON.stringify(\n {\n status: 500,\n error: 'Internal Server Error',\n message:\n 'An unexpected error occurred. Please try again later.',\n timestamp: new Date().toISOString(),\n },\n null,\n 2,\n ),\n {\n status: 500,\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ),\n )\n }\n\n return sendNodeResponse(\n res,\n new Response(\n `\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <title>Error</title>\n <script type=\"module\">\n import { ErrorOverlay } from '/@vite/client'\n document.body.appendChild(new ErrorOverlay(${JSON.stringify(\n prepareError(req, e),\n ).replace(/</g, '\\\\u003c')}))\n </script>\n </head>\n <body>\n </body>\n </html>\n `,\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n },\n ),\n )\n }\n })\n }\n },\n },\n {\n name: 'tanstack-start-core:dev-server:injected-head-scripts',\n sharedDuringBuild: true,\n applyToEnvironment: (env) => env.config.consumer === 'server',\n resolveId: {\n filter: { id: new RegExp(VIRTUAL_MODULES.injectedHeadScripts) },\n handler(_id) {\n return resolveViteId(VIRTUAL_MODULES.injectedHeadScripts)\n },\n },\n load: {\n filter: {\n id: new RegExp(resolveViteId(VIRTUAL_MODULES.injectedHeadScripts)),\n },\n handler() {\n const mod = `\n export const injectedHeadScripts = ${JSON.stringify(injectedHeadScripts) || 'undefined'}`\n return mod\n },\n },\n },\n ]\n}\n\n/**\n * Formats error for SSR message in error overlay\n * @param req\n * @param error\n * @returns\n */\nfunction prepareError(req: Connect.IncomingMessage, error: unknown) {\n const e = error as Error\n return {\n message: `An error occurred while server rendering ${req.url}:\\n\\n\\t${\n typeof e === 'string' ? e : e.message\n } `,\n stack: typeof e === 'string' ? '' : e.stack,\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","names":[],"sources":["../../../src/dev-server-plugin/plugin.ts"],"sourcesContent":["import { isRunnableDevEnvironment } from 'vite'\nimport { VIRTUAL_MODULES } from '@tanstack/start-server-core'\nimport { NodeRequest, sendNodeResponse } from 'srvx/node'\nimport { ENTRY_POINTS, VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { resolveViteId } from '../utils'\nimport { extractHtmlScripts } from './extract-html-scripts'\nimport {\n CSS_MODULES_REGEX,\n collectDevStyles,\n normalizeCssModuleCacheKey,\n} from './dev-styles'\nimport type { Connect, DevEnvironment, PluginOption } from 'vite'\nimport type { GetConfigFn } from '../types'\n\nexport function devServerPlugin({\n getConfig,\n devSsrStylesEnabled,\n}: {\n getConfig: GetConfigFn\n devSsrStylesEnabled: boolean\n}): PluginOption {\n let isTest = false\n\n let injectedHeadScripts: string | undefined\n\n // Cache CSS modules content during transform hook.\n // For CSS modules, the transform hook receives the raw CSS content before\n // Vite wraps it in JS. We capture this to use during SSR style collection.\n const cssModulesCache: Record<string, string> = {}\n\n return [\n {\n name: 'tanstack-start-core:dev-server',\n config(_userConfig, { mode }) {\n isTest = isTest ? isTest : mode === 'test'\n },\n // Capture CSS modules content during transform\n transform: {\n filter: {\n id: CSS_MODULES_REGEX,\n },\n handler(code, id) {\n cssModulesCache[normalizeCssModuleCacheKey(id)] = code\n },\n },\n async configureServer(viteDevServer) {\n if (isTest) {\n return\n }\n\n // Extract the scripts that Vite plugins would inject into the initial HTML\n const templateHtml = `<html><head></head><body></body></html>`\n const transformedHtml = await viteDevServer.transformIndexHtml(\n '/',\n templateHtml,\n )\n const scripts = extractHtmlScripts(transformedHtml)\n injectedHeadScripts = scripts\n .flatMap((script) => script.content ?? [])\n .join(';')\n\n // CSS middleware registered in PRE-PHASE (before Vite's internal middlewares)\n // This ensures it handles /@tanstack-start/styles.css before any catch-all middleware\n // from other plugins (like nitro) that may be registered in the post-phase.\n // This makes the CSS endpoint work regardless of plugin order in the Vite config.\n // We check pathname.endsWith() to handle basepaths (e.g., /my-app/@tanstack-start/styles.css)\n // since pre-phase runs before Vite's base middleware strips the basepath.\n if (devSsrStylesEnabled) {\n viteDevServer.middlewares.use(async (req, res, next) => {\n const url = req.url ?? ''\n const pathname = url.split('?')[0]\n if (!pathname?.endsWith('/@tanstack-start/styles.css')) {\n return next()\n }\n\n try {\n // Parse route IDs from query param\n const urlObj = new URL(url, 'http://localhost')\n const routesParam = urlObj.searchParams.get('routes')\n const routeIds = routesParam ? routesParam.split(',') : []\n\n // Build entries list from route file paths\n const entries: Array<string> = []\n\n // Look up route file paths from manifest\n // Only routes registered in the manifest are used - this prevents path injection\n const routesManifest = (globalThis as any).TSS_ROUTES_MANIFEST as\n | Record<string, { filePath: string; children?: Array<string> }>\n | undefined\n\n if (routesManifest && routeIds.length > 0) {\n for (const routeId of routeIds) {\n const route = routesManifest[routeId]\n if (route?.filePath) {\n entries.push(route.filePath)\n }\n }\n }\n\n const css =\n entries.length > 0\n ? await collectDevStyles({\n viteDevServer,\n entries,\n cssModulesCache,\n })\n : undefined\n\n res.setHeader('Content-Type', 'text/css')\n res.setHeader('Cache-Control', 'no-store')\n res.end(css ?? '')\n } catch (e) {\n // Log error but still return valid CSS response to avoid MIME type issues\n console.error('[tanstack-start] Error collecting dev styles:', e)\n res.setHeader('Content-Type', 'text/css')\n res.setHeader('Cache-Control', 'no-store')\n res.end(\n `/* Error collecting styles: ${e instanceof Error ? e.message : String(e)} */`,\n )\n }\n })\n }\n\n return () => {\n const serverEnv = viteDevServer.environments[\n VITE_ENVIRONMENT_NAMES.server\n ] as DevEnvironment | undefined\n\n if (!serverEnv) {\n throw new Error(\n `Server environment ${VITE_ENVIRONMENT_NAMES.server} not found`,\n )\n }\n\n const { startConfig } = getConfig()\n const installMiddleware = startConfig.vite?.installDevServerMiddleware\n if (installMiddleware === false) {\n return\n }\n if (installMiddleware == undefined) {\n // do not install middleware in middlewareMode by default\n if (viteDevServer.config.server.middlewareMode) {\n return\n }\n\n // do not install middleware if SSR env in case another plugin already did\n if (\n !isRunnableDevEnvironment(serverEnv) ||\n // do not check via `isFetchableDevEnvironment` since nitro does implement the `FetchableDevEnvironment` interface but not via inheritance (which this helper checks)\n 'dispatchFetch' in serverEnv\n ) {\n return\n }\n }\n\n if (!isRunnableDevEnvironment(serverEnv)) {\n throw new Error(\n 'cannot install vite dev server middleware for TanStack Start since the SSR environment is not a RunnableDevEnvironment',\n )\n }\n\n viteDevServer.middlewares.use(async (req, res) => {\n // fix the request URL to match the original URL\n // otherwise, the request URL will '/index.html'\n if (req.originalUrl) {\n req.url = req.originalUrl\n }\n const webReq = new NodeRequest({ req, res })\n\n try {\n // Import and resolve the request by running the server request entry point\n // this request entry point must implement the `fetch` API as follows:\n /**\n * export default {\n * fetch(req: Request): Promise<Response>\n * }\n */\n const serverEntry = await serverEnv.runner.import(\n ENTRY_POINTS.server,\n )\n const webRes = await serverEntry['default'].fetch(webReq)\n\n return sendNodeResponse(res, webRes)\n } catch (e) {\n console.error(e)\n try {\n viteDevServer.ssrFixStacktrace(e as Error)\n } catch {}\n\n if (\n webReq.headers.get('content-type')?.includes('application/json')\n ) {\n return sendNodeResponse(\n res,\n new Response(\n JSON.stringify(\n {\n status: 500,\n error: 'Internal Server Error',\n message:\n 'An unexpected error occurred. Please try again later.',\n timestamp: new Date().toISOString(),\n },\n null,\n 2,\n ),\n {\n status: 500,\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n ),\n )\n }\n\n return sendNodeResponse(\n res,\n new Response(\n `\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <title>Error</title>\n <script type=\"module\">\n import { ErrorOverlay } from '/@vite/client'\n document.body.appendChild(new ErrorOverlay(${JSON.stringify(\n prepareError(req, e),\n ).replace(/</g, '\\\\u003c')}))\n </script>\n </head>\n <body>\n </body>\n </html>\n `,\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n },\n ),\n )\n }\n })\n }\n },\n },\n {\n name: 'tanstack-start-core:dev-server:injected-head-scripts',\n sharedDuringBuild: true,\n applyToEnvironment: (env) => env.config.consumer === 'server',\n resolveId: {\n filter: { id: new RegExp(VIRTUAL_MODULES.injectedHeadScripts) },\n handler(_id) {\n return resolveViteId(VIRTUAL_MODULES.injectedHeadScripts)\n },\n },\n load: {\n filter: {\n id: new RegExp(resolveViteId(VIRTUAL_MODULES.injectedHeadScripts)),\n },\n handler() {\n const mod = `\n export const injectedHeadScripts = ${JSON.stringify(injectedHeadScripts) || 'undefined'}`\n return mod\n },\n },\n },\n ]\n}\n\n/**\n * Formats error for SSR message in error overlay\n * @param req\n * @param error\n * @returns\n */\nfunction prepareError(req: Connect.IncomingMessage, error: unknown) {\n const e = error as Error\n return {\n message: `An error occurred while server rendering ${req.url}:\\n\\n\\t${\n typeof e === 'string' ? e : e.message\n } `,\n stack: typeof e === 'string' ? '' : e.stack,\n }\n}\n"],"mappings":";;;;;;;;AAcA,SAAgB,gBAAgB,EAC9B,WACA,uBAIe;CACf,IAAI,SAAS;CAEb,IAAI;CAKJ,MAAM,kBAA0C,EAAE;AAElD,QAAO,CACL;EACE,MAAM;EACN,OAAO,aAAa,EAAE,QAAQ;AAC5B,YAAS,SAAS,SAAS,SAAS;;EAGtC,WAAW;GACT,QAAQ,EACN,IAAI,mBACL;GACD,QAAQ,MAAM,IAAI;AAChB,oBAAgB,2BAA2B,GAAG,IAAI;;GAErD;EACD,MAAM,gBAAgB,eAAe;AACnC,OAAI,OACF;AAUF,yBADgB,mBAJQ,MAAM,cAAc,mBAC1C,KAFmB,0CAIpB,CACkD,CAEhD,SAAS,WAAW,OAAO,WAAW,EAAE,CAAC,CACzC,KAAK,IAAI;AAQZ,OAAI,oBACF,eAAc,YAAY,IAAI,OAAO,KAAK,KAAK,SAAS;IACtD,MAAM,MAAM,IAAI,OAAO;AAEvB,QAAI,CADa,IAAI,MAAM,IAAI,CAAC,IACjB,SAAS,8BAA8B,CACpD,QAAO,MAAM;AAGf,QAAI;KAGF,MAAM,cADS,IAAI,IAAI,KAAK,mBAAmB,CACpB,aAAa,IAAI,SAAS;KACrD,MAAM,WAAW,cAAc,YAAY,MAAM,IAAI,GAAG,EAAE;KAG1D,MAAM,UAAyB,EAAE;KAIjC,MAAM,iBAAkB,WAAmB;AAI3C,SAAI,kBAAkB,SAAS,SAAS,EACtC,MAAK,MAAM,WAAW,UAAU;MAC9B,MAAM,QAAQ,eAAe;AAC7B,UAAI,OAAO,SACT,SAAQ,KAAK,MAAM,SAAS;;KAKlC,MAAM,MACJ,QAAQ,SAAS,IACb,MAAM,iBAAiB;MACrB;MACA;MACA;MACD,CAAC,GACF,KAAA;AAEN,SAAI,UAAU,gBAAgB,WAAW;AACzC,SAAI,UAAU,iBAAiB,WAAW;AAC1C,SAAI,IAAI,OAAO,GAAG;aACX,GAAG;AAEV,aAAQ,MAAM,iDAAiD,EAAE;AACjE,SAAI,UAAU,gBAAgB,WAAW;AACzC,SAAI,UAAU,iBAAiB,WAAW;AAC1C,SAAI,IACF,+BAA+B,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAAC,KAC3E;;KAEH;AAGJ,gBAAa;IACX,MAAM,YAAY,cAAc,aAC9B,uBAAuB;AAGzB,QAAI,CAAC,UACH,OAAM,IAAI,MACR,sBAAsB,uBAAuB,OAAO,YACrD;IAGH,MAAM,EAAE,gBAAgB,WAAW;IACnC,MAAM,oBAAoB,YAAY,MAAM;AAC5C,QAAI,sBAAsB,MACxB;AAEF,QAAI,qBAAqB,KAAA,GAAW;AAElC,SAAI,cAAc,OAAO,OAAO,eAC9B;AAIF,SACE,CAAC,yBAAyB,UAAU,IAEpC,mBAAmB,UAEnB;;AAIJ,QAAI,CAAC,yBAAyB,UAAU,CACtC,OAAM,IAAI,MACR,yHACD;AAGH,kBAAc,YAAY,IAAI,OAAO,KAAK,QAAQ;AAGhD,SAAI,IAAI,YACN,KAAI,MAAM,IAAI;KAEhB,MAAM,SAAS,IAAI,YAAY;MAAE;MAAK;MAAK,CAAC;AAE5C,SAAI;AAaF,aAAO,iBAAiB,KAFT,OAHK,MAAM,UAAU,OAAO,OACzC,aAAa,OACd,EACgC,WAAW,MAAM,OAAO,CAErB;cAC7B,GAAG;AACV,cAAQ,MAAM,EAAE;AAChB,UAAI;AACF,qBAAc,iBAAiB,EAAW;cACpC;AAER,UACE,OAAO,QAAQ,IAAI,eAAe,EAAE,SAAS,mBAAmB,CAEhE,QAAO,iBACL,KACA,IAAI,SACF,KAAK,UACH;OACE,QAAQ;OACR,OAAO;OACP,SACE;OACF,4BAAW,IAAI,MAAM,EAAC,aAAa;OACpC,EACD,MACA,EACD,EACD;OACE,QAAQ;OACR,SAAS,EACP,gBAAgB,oBACjB;OACF,CACF,CACF;AAGH,aAAO,iBACL,KACA,IAAI,SACF;;;;;;;;iEAQ+C,KAAK,UAChD,aAAa,KAAK,EAAE,CACrB,CAAC,QAAQ,MAAM,UAAU,CAAC;;;;;;eAO7B;OACE,QAAQ;OACR,SAAS,EACP,gBAAgB,aACjB;OACF,CACF,CACF;;MAEH;;;EAGP,EACD;EACE,MAAM;EACN,mBAAmB;EACnB,qBAAqB,QAAQ,IAAI,OAAO,aAAa;EACrD,WAAW;GACT,QAAQ,EAAE,IAAI,IAAI,OAAO,gBAAgB,oBAAoB,EAAE;GAC/D,QAAQ,KAAK;AACX,WAAO,cAAc,gBAAgB,oBAAoB;;GAE5D;EACD,MAAM;GACJ,QAAQ,EACN,IAAI,IAAI,OAAO,cAAc,gBAAgB,oBAAoB,CAAC,EACnE;GACD,UAAU;AAGR,WAFY;6CACuB,KAAK,UAAU,oBAAoB,IAAI;;GAG7E;EACF,CACF;;;;;;;;AASH,SAAS,aAAa,KAA8B,OAAgB;CAClE,MAAM,IAAI;AACV,QAAO;EACL,SAAS,4CAA4C,IAAI,IAAI,SAC3D,OAAO,MAAM,WAAW,IAAI,EAAE,QAC/B;EACD,OAAO,OAAO,MAAM,WAAW,KAAK,EAAE;EACvC"}
@@ -1,8 +1,9 @@
1
1
  import { parseAst } from "@tanstack/router-utils";
2
+ //#region src/import-protection-plugin/ast.ts
2
3
  function parseImportProtectionAst(code) {
3
- return parseAst({ code });
4
+ return parseAst({ code });
4
5
  }
5
- export {
6
- parseImportProtectionAst
7
- };
8
- //# sourceMappingURL=ast.js.map
6
+ //#endregion
7
+ export { parseImportProtectionAst };
8
+
9
+ //# sourceMappingURL=ast.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ast.js","sources":["../../../src/import-protection-plugin/ast.ts"],"sourcesContent":["import { parseAst } from '@tanstack/router-utils'\n\nexport type ParsedAst = ReturnType<typeof parseAst>\n\nexport function parseImportProtectionAst(code: string): ParsedAst {\n return parseAst({ code })\n}\n"],"names":[],"mappings":";AAIO,SAAS,yBAAyB,MAAyB;AAChE,SAAO,SAAS,EAAE,MAAM;AAC1B;"}
1
+ {"version":3,"file":"ast.js","names":[],"sources":["../../../src/import-protection-plugin/ast.ts"],"sourcesContent":["import { parseAst } from '@tanstack/router-utils'\n\nexport type ParsedAst = ReturnType<typeof parseAst>\n\nexport function parseImportProtectionAst(code: string): ParsedAst {\n return parseAst({ code })\n}\n"],"mappings":";;AAIA,SAAgB,yBAAyB,MAAyB;AAChE,QAAO,SAAS,EAAE,MAAM,CAAC"}
@@ -1,24 +1,22 @@
1
1
  import { SERVER_FN_LOOKUP } from "../constants.js";
2
- const SERVER_FN_LOOKUP_QUERY = `?${SERVER_FN_LOOKUP}`;
3
- const IMPORT_PROTECTION_DEBUG = process.env.TSR_IMPORT_PROTECTION_DEBUG === "1" || process.env.TSR_IMPORT_PROTECTION_DEBUG === "true";
4
- const IMPORT_PROTECTION_DEBUG_FILTER = process.env.TSR_IMPORT_PROTECTION_DEBUG_FILTER;
5
- const KNOWN_SOURCE_EXTENSIONS = /* @__PURE__ */ new Set([
6
- ".ts",
7
- ".tsx",
8
- ".mts",
9
- ".cts",
10
- ".js",
11
- ".jsx",
12
- ".mjs",
13
- ".cjs",
14
- ".json"
2
+ //#region src/import-protection-plugin/constants.ts
3
+ var SERVER_FN_LOOKUP_QUERY = `?${SERVER_FN_LOOKUP}`;
4
+ var IMPORT_PROTECTION_DEBUG = process.env.TSR_IMPORT_PROTECTION_DEBUG === "1" || process.env.TSR_IMPORT_PROTECTION_DEBUG === "true";
5
+ var IMPORT_PROTECTION_DEBUG_FILTER = process.env.TSR_IMPORT_PROTECTION_DEBUG_FILTER;
6
+ var KNOWN_SOURCE_EXTENSIONS = new Set([
7
+ ".ts",
8
+ ".tsx",
9
+ ".mts",
10
+ ".cts",
11
+ ".js",
12
+ ".jsx",
13
+ ".mjs",
14
+ ".cjs",
15
+ ".json"
15
16
  ]);
16
- const VITE_BROWSER_VIRTUAL_PREFIX = "/@id/__x00__";
17
- export {
18
- IMPORT_PROTECTION_DEBUG,
19
- IMPORT_PROTECTION_DEBUG_FILTER,
20
- KNOWN_SOURCE_EXTENSIONS,
21
- SERVER_FN_LOOKUP_QUERY,
22
- VITE_BROWSER_VIRTUAL_PREFIX
23
- };
24
- //# sourceMappingURL=constants.js.map
17
+ /** Vite's browser-visible prefix for virtual modules (replaces `\0`). */
18
+ var VITE_BROWSER_VIRTUAL_PREFIX = "/@id/__x00__";
19
+ //#endregion
20
+ export { IMPORT_PROTECTION_DEBUG, IMPORT_PROTECTION_DEBUG_FILTER, KNOWN_SOURCE_EXTENSIONS, SERVER_FN_LOOKUP_QUERY, VITE_BROWSER_VIRTUAL_PREFIX };
21
+
22
+ //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../../../src/import-protection-plugin/constants.ts"],"sourcesContent":["import { SERVER_FN_LOOKUP } from '../constants'\n\nexport const SERVER_FN_LOOKUP_QUERY = `?${SERVER_FN_LOOKUP}`\n\nexport const IMPORT_PROTECTION_DEBUG =\n process.env.TSR_IMPORT_PROTECTION_DEBUG === '1' ||\n process.env.TSR_IMPORT_PROTECTION_DEBUG === 'true'\n\nexport const IMPORT_PROTECTION_DEBUG_FILTER =\n process.env.TSR_IMPORT_PROTECTION_DEBUG_FILTER\n\nexport const KNOWN_SOURCE_EXTENSIONS = new Set([\n '.ts',\n '.tsx',\n '.mts',\n '.cts',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs',\n '.json',\n])\n\n/** Vite's browser-visible prefix for virtual modules (replaces `\\0`). */\nexport const VITE_BROWSER_VIRTUAL_PREFIX = '/@id/__x00__'\n"],"names":[],"mappings":";AAEO,MAAM,yBAAyB,IAAI,gBAAgB;AAEnD,MAAM,0BACX,QAAQ,IAAI,gCAAgC,OAC5C,QAAQ,IAAI,gCAAgC;AAEvC,MAAM,iCACX,QAAQ,IAAI;AAEP,MAAM,8CAA8B,IAAI;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,MAAM,8BAA8B;"}
1
+ {"version":3,"file":"constants.js","names":[],"sources":["../../../src/import-protection-plugin/constants.ts"],"sourcesContent":["import { SERVER_FN_LOOKUP } from '../constants'\n\nexport const SERVER_FN_LOOKUP_QUERY = `?${SERVER_FN_LOOKUP}`\n\nexport const IMPORT_PROTECTION_DEBUG =\n process.env.TSR_IMPORT_PROTECTION_DEBUG === '1' ||\n process.env.TSR_IMPORT_PROTECTION_DEBUG === 'true'\n\nexport const IMPORT_PROTECTION_DEBUG_FILTER =\n process.env.TSR_IMPORT_PROTECTION_DEBUG_FILTER\n\nexport const KNOWN_SOURCE_EXTENSIONS = new Set([\n '.ts',\n '.tsx',\n '.mts',\n '.cts',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs',\n '.json',\n])\n\n/** Vite's browser-visible prefix for virtual modules (replaces `\\0`). */\nexport const VITE_BROWSER_VIRTUAL_PREFIX = '/@id/__x00__'\n"],"mappings":";;AAEA,IAAa,yBAAyB,IAAI;AAE1C,IAAa,0BACX,QAAQ,IAAI,gCAAgC,OAC5C,QAAQ,IAAI,gCAAgC;AAE9C,IAAa,iCACX,QAAQ,IAAI;AAEd,IAAa,0BAA0B,IAAI,IAAI;CAC7C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;AAGF,IAAa,8BAA8B"}
@@ -1,29 +1,39 @@
1
- const frameworks = ["react", "solid", "vue"];
1
+ //#region src/import-protection-plugin/defaults.ts
2
+ var frameworks = [
3
+ "react",
4
+ "solid",
5
+ "vue"
6
+ ];
7
+ /**
8
+ * Returns the default import protection rules.
9
+ *
10
+ * All three framework variants are always included so that, e.g., a React
11
+ * project also denies `@tanstack/solid-start/server` imports.
12
+ */
2
13
  function getDefaultImportProtectionRules() {
3
- const clientSpecifiers = frameworks.map(
4
- (fw) => `@tanstack/${fw}-start/server`
5
- );
6
- return {
7
- client: {
8
- specifiers: clientSpecifiers,
9
- files: ["**/*.server.*"],
10
- excludeFiles: ["**/node_modules/**"]
11
- },
12
- server: {
13
- specifiers: [],
14
- files: ["**/*.client.*"],
15
- excludeFiles: ["**/node_modules/**"]
16
- }
17
- };
14
+ return {
15
+ client: {
16
+ specifiers: frameworks.map((fw) => `@tanstack/${fw}-start/server`),
17
+ files: ["**/*.server.*"],
18
+ excludeFiles: ["**/node_modules/**"]
19
+ },
20
+ server: {
21
+ specifiers: [],
22
+ files: ["**/*.client.*"],
23
+ excludeFiles: ["**/node_modules/**"]
24
+ }
25
+ };
18
26
  }
27
+ /**
28
+ * Marker module specifiers that restrict a file to a specific environment.
29
+ */
19
30
  function getMarkerSpecifiers() {
20
- return {
21
- serverOnly: frameworks.map((fw) => `@tanstack/${fw}-start/server-only`),
22
- clientOnly: frameworks.map((fw) => `@tanstack/${fw}-start/client-only`)
23
- };
31
+ return {
32
+ serverOnly: frameworks.map((fw) => `@tanstack/${fw}-start/server-only`),
33
+ clientOnly: frameworks.map((fw) => `@tanstack/${fw}-start/client-only`)
34
+ };
24
35
  }
25
- export {
26
- getDefaultImportProtectionRules,
27
- getMarkerSpecifiers
28
- };
29
- //# sourceMappingURL=defaults.js.map
36
+ //#endregion
37
+ export { getDefaultImportProtectionRules, getMarkerSpecifiers };
38
+
39
+ //# sourceMappingURL=defaults.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sources":["../../../src/import-protection-plugin/defaults.ts"],"sourcesContent":["import type { ImportProtectionEnvRules } from '../schema'\nimport type { Pattern } from './utils'\n\nexport interface DefaultImportProtectionRules {\n client: Required<ImportProtectionEnvRules>\n server: Required<ImportProtectionEnvRules>\n}\n\nconst frameworks = ['react', 'solid', 'vue'] as const\n\n/**\n * Returns the default import protection rules.\n *\n * All three framework variants are always included so that, e.g., a React\n * project also denies `@tanstack/solid-start/server` imports.\n */\nexport function getDefaultImportProtectionRules(): DefaultImportProtectionRules {\n const clientSpecifiers: Array<Pattern> = frameworks.map(\n (fw) => `@tanstack/${fw}-start/server`,\n )\n\n return {\n client: {\n specifiers: clientSpecifiers,\n files: ['**/*.server.*'],\n excludeFiles: ['**/node_modules/**'],\n },\n server: {\n specifiers: [],\n files: ['**/*.client.*'],\n excludeFiles: ['**/node_modules/**'],\n },\n }\n}\n\n/**\n * Marker module specifiers that restrict a file to a specific environment.\n */\nexport function getMarkerSpecifiers(): {\n serverOnly: Array<string>\n clientOnly: Array<string>\n} {\n return {\n serverOnly: frameworks.map((fw) => `@tanstack/${fw}-start/server-only`),\n clientOnly: frameworks.map((fw) => `@tanstack/${fw}-start/client-only`),\n }\n}\n"],"names":[],"mappings":"AAQA,MAAM,aAAa,CAAC,SAAS,SAAS,KAAK;AAQpC,SAAS,kCAAgE;AAC9E,QAAM,mBAAmC,WAAW;AAAA,IAClD,CAAC,OAAO,aAAa,EAAE;AAAA,EAAA;AAGzB,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,YAAY;AAAA,MACZ,OAAO,CAAC,eAAe;AAAA,MACvB,cAAc,CAAC,oBAAoB;AAAA,IAAA;AAAA,IAErC,QAAQ;AAAA,MACN,YAAY,CAAA;AAAA,MACZ,OAAO,CAAC,eAAe;AAAA,MACvB,cAAc,CAAC,oBAAoB;AAAA,IAAA;AAAA,EACrC;AAEJ;AAKO,SAAS,sBAGd;AACA,SAAO;AAAA,IACL,YAAY,WAAW,IAAI,CAAC,OAAO,aAAa,EAAE,oBAAoB;AAAA,IACtE,YAAY,WAAW,IAAI,CAAC,OAAO,aAAa,EAAE,oBAAoB;AAAA,EAAA;AAE1E;"}
1
+ {"version":3,"file":"defaults.js","names":[],"sources":["../../../src/import-protection-plugin/defaults.ts"],"sourcesContent":["import type { ImportProtectionEnvRules } from '../schema'\nimport type { Pattern } from './utils'\n\nexport interface DefaultImportProtectionRules {\n client: Required<ImportProtectionEnvRules>\n server: Required<ImportProtectionEnvRules>\n}\n\nconst frameworks = ['react', 'solid', 'vue'] as const\n\n/**\n * Returns the default import protection rules.\n *\n * All three framework variants are always included so that, e.g., a React\n * project also denies `@tanstack/solid-start/server` imports.\n */\nexport function getDefaultImportProtectionRules(): DefaultImportProtectionRules {\n const clientSpecifiers: Array<Pattern> = frameworks.map(\n (fw) => `@tanstack/${fw}-start/server`,\n )\n\n return {\n client: {\n specifiers: clientSpecifiers,\n files: ['**/*.server.*'],\n excludeFiles: ['**/node_modules/**'],\n },\n server: {\n specifiers: [],\n files: ['**/*.client.*'],\n excludeFiles: ['**/node_modules/**'],\n },\n }\n}\n\n/**\n * Marker module specifiers that restrict a file to a specific environment.\n */\nexport function getMarkerSpecifiers(): {\n serverOnly: Array<string>\n clientOnly: Array<string>\n} {\n return {\n serverOnly: frameworks.map((fw) => `@tanstack/${fw}-start/server-only`),\n clientOnly: frameworks.map((fw) => `@tanstack/${fw}-start/client-only`),\n }\n}\n"],"mappings":";AAQA,IAAM,aAAa;CAAC;CAAS;CAAS;CAAM;;;;;;;AAQ5C,SAAgB,kCAAgE;AAK9E,QAAO;EACL,QAAQ;GACN,YANqC,WAAW,KACjD,OAAO,aAAa,GAAG,eACzB;GAKG,OAAO,CAAC,gBAAgB;GACxB,cAAc,CAAC,qBAAqB;GACrC;EACD,QAAQ;GACN,YAAY,EAAE;GACd,OAAO,CAAC,gBAAgB;GACxB,cAAc,CAAC,qBAAqB;GACrC;EACF;;;;;AAMH,SAAgB,sBAGd;AACA,QAAO;EACL,YAAY,WAAW,KAAK,OAAO,aAAa,GAAG,oBAAoB;EACvE,YAAY,WAAW,KAAK,OAAO,aAAa,GAAG,oBAAoB;EACxE"}