@tanstack/start-server-core 1.121.16 → 1.121.18

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 (79) hide show
  1. package/package.json +4 -4
  2. package/dist/cjs/createRequestHandler.cjs +0 -50
  3. package/dist/cjs/createRequestHandler.cjs.map +0 -1
  4. package/dist/cjs/createRequestHandler.d.cts +0 -8
  5. package/dist/cjs/createStartHandler.cjs +0 -313
  6. package/dist/cjs/createStartHandler.cjs.map +0 -1
  7. package/dist/cjs/createStartHandler.d.cts +0 -7
  8. package/dist/cjs/h3.cjs +0 -355
  9. package/dist/cjs/h3.cjs.map +0 -1
  10. package/dist/cjs/h3.d.cts +0 -109
  11. package/dist/cjs/handlerCallback.cjs +0 -7
  12. package/dist/cjs/handlerCallback.cjs.map +0 -1
  13. package/dist/cjs/handlerCallback.d.cts +0 -9
  14. package/dist/cjs/index.cjs +0 -244
  15. package/dist/cjs/index.cjs.map +0 -1
  16. package/dist/cjs/index.d.cts +0 -12
  17. package/dist/cjs/loadVirtualModule.cjs +0 -39
  18. package/dist/cjs/loadVirtualModule.cjs.map +0 -1
  19. package/dist/cjs/loadVirtualModule.d.cts +0 -6
  20. package/dist/cjs/router-manifest.cjs +0 -49
  21. package/dist/cjs/router-manifest.cjs.map +0 -1
  22. package/dist/cjs/router-manifest.d.cts +0 -16
  23. package/dist/cjs/server-functions-handler.cjs +0 -148
  24. package/dist/cjs/server-functions-handler.cjs.map +0 -1
  25. package/dist/cjs/server-functions-handler.d.cts +0 -3
  26. package/dist/cjs/serverRoute.cjs +0 -102
  27. package/dist/cjs/serverRoute.cjs.map +0 -1
  28. package/dist/cjs/serverRoute.d.cts +0 -120
  29. package/dist/cjs/ssr-server.cjs +0 -247
  30. package/dist/cjs/ssr-server.cjs.map +0 -1
  31. package/dist/cjs/ssr-server.d.cts +0 -29
  32. package/dist/cjs/transformStreamWithRouter.cjs +0 -183
  33. package/dist/cjs/transformStreamWithRouter.cjs.map +0 -1
  34. package/dist/cjs/transformStreamWithRouter.d.cts +0 -6
  35. package/dist/cjs/tsrScript.cjs +0 -4
  36. package/dist/cjs/tsrScript.cjs.map +0 -1
  37. package/dist/cjs/tsrScript.d.cts +0 -1
  38. package/dist/cjs/virtual-modules.cjs +0 -9
  39. package/dist/cjs/virtual-modules.cjs.map +0 -1
  40. package/dist/cjs/virtual-modules.d.cts +0 -10
  41. package/dist/esm/createRequestHandler.d.ts +0 -8
  42. package/dist/esm/createRequestHandler.js +0 -50
  43. package/dist/esm/createRequestHandler.js.map +0 -1
  44. package/dist/esm/createStartHandler.d.ts +0 -7
  45. package/dist/esm/createStartHandler.js +0 -313
  46. package/dist/esm/createStartHandler.js.map +0 -1
  47. package/dist/esm/h3.d.ts +0 -109
  48. package/dist/esm/h3.js +0 -248
  49. package/dist/esm/h3.js.map +0 -1
  50. package/dist/esm/handlerCallback.d.ts +0 -9
  51. package/dist/esm/handlerCallback.js +0 -7
  52. package/dist/esm/handlerCallback.js.map +0 -1
  53. package/dist/esm/index.d.ts +0 -12
  54. package/dist/esm/index.js +0 -136
  55. package/dist/esm/index.js.map +0 -1
  56. package/dist/esm/loadVirtualModule.d.ts +0 -6
  57. package/dist/esm/loadVirtualModule.js +0 -17
  58. package/dist/esm/loadVirtualModule.js.map +0 -1
  59. package/dist/esm/router-manifest.d.ts +0 -16
  60. package/dist/esm/router-manifest.js +0 -49
  61. package/dist/esm/router-manifest.js.map +0 -1
  62. package/dist/esm/server-functions-handler.d.ts +0 -3
  63. package/dist/esm/server-functions-handler.js +0 -148
  64. package/dist/esm/server-functions-handler.js.map +0 -1
  65. package/dist/esm/serverRoute.d.ts +0 -120
  66. package/dist/esm/serverRoute.js +0 -102
  67. package/dist/esm/serverRoute.js.map +0 -1
  68. package/dist/esm/ssr-server.d.ts +0 -29
  69. package/dist/esm/ssr-server.js +0 -247
  70. package/dist/esm/ssr-server.js.map +0 -1
  71. package/dist/esm/transformStreamWithRouter.d.ts +0 -6
  72. package/dist/esm/transformStreamWithRouter.js +0 -183
  73. package/dist/esm/transformStreamWithRouter.js.map +0 -1
  74. package/dist/esm/tsrScript.d.ts +0 -1
  75. package/dist/esm/tsrScript.js +0 -5
  76. package/dist/esm/tsrScript.js.map +0 -1
  77. package/dist/esm/virtual-modules.d.ts +0 -10
  78. package/dist/esm/virtual-modules.js +0 -9
  79. package/dist/esm/virtual-modules.js.map +0 -1
@@ -1,183 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const web = require("node:stream/web");
4
- const node_stream = require("node:stream");
5
- const routerCore = require("@tanstack/router-core");
6
- function transformReadableStreamWithRouter(router, routerStream) {
7
- return transformStreamWithRouter(router, routerStream);
8
- }
9
- function transformPipeableStreamWithRouter(router, routerStream) {
10
- return node_stream.Readable.fromWeb(
11
- transformStreamWithRouter(router, node_stream.Readable.toWeb(routerStream))
12
- );
13
- }
14
- const patternBodyStart = /(<body)/;
15
- const patternBodyEnd = /(<\/body>)/;
16
- const patternHtmlEnd = /(<\/html>)/;
17
- const patternHeadStart = /(<head.*?>)/;
18
- const patternClosingTag = /(<\/[a-zA-Z][\w:.-]*?>)/g;
19
- const textDecoder = new TextDecoder();
20
- function createPassthrough() {
21
- let controller;
22
- const encoder = new TextEncoder();
23
- const stream = new web.ReadableStream({
24
- start(c) {
25
- controller = c;
26
- }
27
- });
28
- const res = {
29
- stream,
30
- write: (chunk) => {
31
- controller.enqueue(encoder.encode(chunk));
32
- },
33
- end: (chunk) => {
34
- if (chunk) {
35
- controller.enqueue(encoder.encode(chunk));
36
- }
37
- controller.close();
38
- res.destroyed = true;
39
- },
40
- destroy: (error) => {
41
- controller.error(error);
42
- },
43
- destroyed: false
44
- };
45
- return res;
46
- }
47
- async function readStream(stream, opts) {
48
- var _a, _b, _c;
49
- try {
50
- const reader = stream.getReader();
51
- let chunk;
52
- while (!(chunk = await reader.read()).done) {
53
- (_a = opts.onData) == null ? void 0 : _a.call(opts, chunk);
54
- }
55
- (_b = opts.onEnd) == null ? void 0 : _b.call(opts);
56
- } catch (error) {
57
- (_c = opts.onError) == null ? void 0 : _c.call(opts, error);
58
- }
59
- }
60
- function transformStreamWithRouter(router, appStream) {
61
- const finalPassThrough = createPassthrough();
62
- let isAppRendering = true;
63
- let routerStreamBuffer = "";
64
- let pendingClosingTags = "";
65
- let bodyStarted = false;
66
- let headStarted = false;
67
- let leftover = "";
68
- let leftoverHtml = "";
69
- function getBufferedRouterStream() {
70
- const html = routerStreamBuffer;
71
- routerStreamBuffer = "";
72
- return html;
73
- }
74
- function decodeChunk(chunk) {
75
- if (chunk instanceof Uint8Array) {
76
- return textDecoder.decode(chunk);
77
- }
78
- return String(chunk);
79
- }
80
- const injectedHtmlDonePromise = routerCore.createControlledPromise();
81
- let processingCount = 0;
82
- router.serverSsr.injectedHtml.forEach((promise) => {
83
- handleInjectedHtml(promise);
84
- });
85
- const stopListeningToInjectedHtml = router.subscribe(
86
- "onInjectedHtml",
87
- (e) => {
88
- handleInjectedHtml(e.promise);
89
- }
90
- );
91
- function handleInjectedHtml(promise) {
92
- processingCount++;
93
- promise.then((html) => {
94
- if (!bodyStarted) {
95
- routerStreamBuffer += html;
96
- } else {
97
- finalPassThrough.write(html);
98
- }
99
- }).catch(injectedHtmlDonePromise.reject).finally(() => {
100
- processingCount--;
101
- if (!isAppRendering && processingCount === 0) {
102
- stopListeningToInjectedHtml();
103
- injectedHtmlDonePromise.resolve();
104
- }
105
- });
106
- }
107
- injectedHtmlDonePromise.then(() => {
108
- const finalHtml = leftoverHtml + getBufferedRouterStream() + pendingClosingTags;
109
- finalPassThrough.end(finalHtml);
110
- }).catch((err) => {
111
- console.error("Error reading routerStream:", err);
112
- finalPassThrough.destroy(err);
113
- });
114
- readStream(appStream, {
115
- onData: (chunk) => {
116
- const text = decodeChunk(chunk.value);
117
- let chunkString = leftover + text;
118
- const bodyEndMatch = chunkString.match(patternBodyEnd);
119
- const htmlEndMatch = chunkString.match(patternHtmlEnd);
120
- if (!bodyStarted) {
121
- const bodyStartMatch = chunkString.match(patternBodyStart);
122
- if (bodyStartMatch) {
123
- bodyStarted = true;
124
- }
125
- }
126
- if (!headStarted) {
127
- const headStartMatch = chunkString.match(patternHeadStart);
128
- if (headStartMatch) {
129
- headStarted = true;
130
- const index = headStartMatch.index;
131
- const headTag = headStartMatch[0];
132
- const remaining = chunkString.slice(index + headTag.length);
133
- finalPassThrough.write(
134
- chunkString.slice(0, index) + headTag + getBufferedRouterStream()
135
- );
136
- chunkString = remaining;
137
- }
138
- }
139
- if (!bodyStarted) {
140
- finalPassThrough.write(chunkString);
141
- leftover = "";
142
- return;
143
- }
144
- if (bodyEndMatch && htmlEndMatch && bodyEndMatch.index < htmlEndMatch.index) {
145
- const bodyEndIndex = bodyEndMatch.index;
146
- pendingClosingTags = chunkString.slice(bodyEndIndex);
147
- finalPassThrough.write(
148
- chunkString.slice(0, bodyEndIndex) + getBufferedRouterStream()
149
- );
150
- leftover = "";
151
- return;
152
- }
153
- let result;
154
- let lastIndex = 0;
155
- while ((result = patternClosingTag.exec(chunkString)) !== null) {
156
- lastIndex = result.index + result[0].length;
157
- }
158
- if (lastIndex > 0) {
159
- const processed = chunkString.slice(0, lastIndex) + getBufferedRouterStream() + leftoverHtml;
160
- finalPassThrough.write(processed);
161
- leftover = chunkString.slice(lastIndex);
162
- } else {
163
- leftover = chunkString;
164
- leftoverHtml += getBufferedRouterStream();
165
- }
166
- },
167
- onEnd: () => {
168
- isAppRendering = false;
169
- if (processingCount === 0) {
170
- injectedHtmlDonePromise.resolve();
171
- }
172
- },
173
- onError: (error) => {
174
- console.error("Error reading appStream:", error);
175
- finalPassThrough.destroy(error);
176
- }
177
- });
178
- return finalPassThrough.stream;
179
- }
180
- exports.transformPipeableStreamWithRouter = transformPipeableStreamWithRouter;
181
- exports.transformReadableStreamWithRouter = transformReadableStreamWithRouter;
182
- exports.transformStreamWithRouter = transformStreamWithRouter;
183
- //# sourceMappingURL=transformStreamWithRouter.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transformStreamWithRouter.cjs","sources":["../../src/transformStreamWithRouter.ts"],"sourcesContent":["import { ReadableStream } from 'node:stream/web'\nimport { Readable } from 'node:stream'\nimport { createControlledPromise } from '@tanstack/router-core'\nimport type { AnyRouter } from '@tanstack/router-core'\n\nexport function transformReadableStreamWithRouter(\n router: AnyRouter,\n routerStream: ReadableStream,\n) {\n return transformStreamWithRouter(router, routerStream)\n}\n\nexport function transformPipeableStreamWithRouter(\n router: AnyRouter,\n routerStream: Readable,\n) {\n return Readable.fromWeb(\n transformStreamWithRouter(router, Readable.toWeb(routerStream)),\n )\n}\n\n// regex pattern for matching closing body and html tags\nconst patternBodyStart = /(<body)/\nconst patternBodyEnd = /(<\\/body>)/\nconst patternHtmlEnd = /(<\\/html>)/\nconst patternHeadStart = /(<head.*?>)/\n// regex pattern for matching closing tags\nconst patternClosingTag = /(<\\/[a-zA-Z][\\w:.-]*?>)/g\n\nconst textDecoder = new TextDecoder()\n\ntype ReadablePassthrough = {\n stream: ReadableStream\n write: (chunk: string) => void\n end: (chunk?: string) => void\n destroy: (error: unknown) => void\n destroyed: boolean\n}\n\nfunction createPassthrough() {\n let controller: ReadableStreamDefaultController<any>\n const encoder = new TextEncoder()\n const stream = new ReadableStream({\n start(c) {\n controller = c\n },\n })\n\n const res: ReadablePassthrough = {\n stream,\n write: (chunk) => {\n controller.enqueue(encoder.encode(chunk))\n },\n end: (chunk) => {\n if (chunk) {\n controller.enqueue(encoder.encode(chunk))\n }\n controller.close()\n res.destroyed = true\n },\n destroy: (error) => {\n controller.error(error)\n },\n destroyed: false,\n }\n\n return res\n}\n\nasync function readStream(\n stream: ReadableStream,\n opts: {\n onData?: (chunk: ReadableStreamReadValueResult<any>) => void\n onEnd?: () => void\n onError?: (error: unknown) => void\n },\n) {\n try {\n const reader = stream.getReader()\n let chunk\n while (!(chunk = await reader.read()).done) {\n opts.onData?.(chunk)\n }\n opts.onEnd?.()\n } catch (error) {\n opts.onError?.(error)\n }\n}\n\nexport function transformStreamWithRouter(\n router: AnyRouter,\n appStream: ReadableStream,\n) {\n const finalPassThrough = createPassthrough()\n\n let isAppRendering = true as boolean\n let routerStreamBuffer = ''\n let pendingClosingTags = ''\n let bodyStarted = false as boolean\n let headStarted = false as boolean\n let leftover = ''\n let leftoverHtml = ''\n\n function getBufferedRouterStream() {\n const html = routerStreamBuffer\n routerStreamBuffer = ''\n return html\n }\n\n function decodeChunk(chunk: unknown): string {\n if (chunk instanceof Uint8Array) {\n return textDecoder.decode(chunk)\n }\n return String(chunk)\n }\n\n const injectedHtmlDonePromise = createControlledPromise<void>()\n\n let processingCount = 0\n\n // Process any already-injected HTML\n router.serverSsr!.injectedHtml.forEach((promise) => {\n handleInjectedHtml(promise)\n })\n\n // Listen for any new injected HTML\n const stopListeningToInjectedHtml = router.subscribe(\n 'onInjectedHtml',\n (e) => {\n handleInjectedHtml(e.promise)\n },\n )\n\n function handleInjectedHtml(promise: Promise<string>) {\n processingCount++\n\n promise\n .then((html) => {\n if (!bodyStarted) {\n routerStreamBuffer += html\n } else {\n finalPassThrough.write(html)\n }\n })\n .catch(injectedHtmlDonePromise.reject)\n .finally(() => {\n processingCount--\n\n if (!isAppRendering && processingCount === 0) {\n stopListeningToInjectedHtml()\n injectedHtmlDonePromise.resolve()\n }\n })\n }\n\n injectedHtmlDonePromise\n .then(() => {\n const finalHtml =\n leftoverHtml + getBufferedRouterStream() + pendingClosingTags\n\n finalPassThrough.end(finalHtml)\n })\n .catch((err) => {\n console.error('Error reading routerStream:', err)\n finalPassThrough.destroy(err)\n })\n\n // Transform the appStream\n readStream(appStream, {\n onData: (chunk) => {\n const text = decodeChunk(chunk.value)\n\n let chunkString = leftover + text\n const bodyEndMatch = chunkString.match(patternBodyEnd)\n const htmlEndMatch = chunkString.match(patternHtmlEnd)\n\n if (!bodyStarted) {\n const bodyStartMatch = chunkString.match(patternBodyStart)\n if (bodyStartMatch) {\n bodyStarted = true\n }\n }\n\n if (!headStarted) {\n const headStartMatch = chunkString.match(patternHeadStart)\n if (headStartMatch) {\n headStarted = true\n const index = headStartMatch.index!\n const headTag = headStartMatch[0]\n const remaining = chunkString.slice(index + headTag.length)\n finalPassThrough.write(\n chunkString.slice(0, index) + headTag + getBufferedRouterStream(),\n )\n // make sure to only write `remaining` until the next closing tag\n chunkString = remaining\n }\n }\n\n if (!bodyStarted) {\n finalPassThrough.write(chunkString)\n leftover = ''\n return\n }\n\n // If either the body end or html end is in the chunk,\n // We need to get all of our data in asap\n if (\n bodyEndMatch &&\n htmlEndMatch &&\n bodyEndMatch.index! < htmlEndMatch.index!\n ) {\n const bodyEndIndex = bodyEndMatch.index!\n pendingClosingTags = chunkString.slice(bodyEndIndex)\n\n finalPassThrough.write(\n chunkString.slice(0, bodyEndIndex) + getBufferedRouterStream(),\n )\n\n leftover = ''\n return\n }\n\n let result: RegExpExecArray | null\n let lastIndex = 0\n while ((result = patternClosingTag.exec(chunkString)) !== null) {\n lastIndex = result.index + result[0].length\n }\n\n if (lastIndex > 0) {\n const processed =\n chunkString.slice(0, lastIndex) +\n getBufferedRouterStream() +\n leftoverHtml\n\n finalPassThrough.write(processed)\n leftover = chunkString.slice(lastIndex)\n } else {\n leftover = chunkString\n leftoverHtml += getBufferedRouterStream()\n }\n },\n onEnd: () => {\n // Mark the app as done rendering\n isAppRendering = false\n\n // If there are no pending promises, resolve the injectedHtmlDonePromise\n if (processingCount === 0) {\n injectedHtmlDonePromise.resolve()\n }\n },\n onError: (error) => {\n console.error('Error reading appStream:', error)\n finalPassThrough.destroy(error)\n },\n })\n\n return finalPassThrough.stream\n}\n"],"names":["Readable","ReadableStream","createControlledPromise"],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import { ReadableStream } from 'node:stream/web';
2
- import { Readable } from 'node:stream';
3
- import { AnyRouter } from '@tanstack/router-core';
4
- export declare function transformReadableStreamWithRouter(router: AnyRouter, routerStream: ReadableStream): ReadableStream<any>;
5
- export declare function transformPipeableStreamWithRouter(router: AnyRouter, routerStream: Readable): Readable;
6
- export declare function transformStreamWithRouter(router: AnyRouter, appStream: ReadableStream): ReadableStream<any>;
@@ -1,4 +0,0 @@
1
- "use strict";
2
- const minifiedTsrBootStrapScript = 'const __TSR_SSR__={matches:[],streamedValues:{},initMatch:o=>(__TSR_SSR__.matches.push(o),o.extracted?.forEach(l=>{if(l.type==="stream"){let r;l.value=new ReadableStream({start(e){r={enqueue:t=>{try{e.enqueue(t)}catch{}},close:()=>{try{e.close()}catch{}}}}}),l.value.controller=r}else{let r,e;l.value=new Promise((t,a)=>{e=a,r=t}),l.value.reject=e,l.value.resolve=r}}),!0),resolvePromise:({matchId:o,id:l,promiseState:r})=>{const e=__TSR_SSR__.matches.find(t=>t.id===o);if(e){const t=e.extracted?.[l];if(t&&t.type==="promise"&&t.value&&r.status==="success")return t.value.resolve(r.data),!0}return!1},injectChunk:({matchId:o,id:l,chunk:r})=>{const e=__TSR_SSR__.matches.find(t=>t.id===o);if(e){const t=e.extracted?.[l];if(t&&t.type==="stream"&&t.value?.controller)return t.value.controller.enqueue(new TextEncoder().encode(r.toString())),!0}return!1},closeStream:({matchId:o,id:l})=>{const r=__TSR_SSR__.matches.find(e=>e.id===o);if(r){const e=r.extracted?.[l];if(e&&e.type==="stream"&&e.value?.controller)return e.value.controller.close(),!0}return!1},cleanScripts:()=>{document.querySelectorAll(".tsr-once").forEach(o=>{o.remove()})}};window.__TSR_SSR__=__TSR_SSR__;\n';
3
- module.exports = minifiedTsrBootStrapScript;
4
- //# sourceMappingURL=tsrScript.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tsrScript.cjs","sources":["../../src/tsrScript.ts?script-string"],"sourcesContent":["import type { ControllablePromise } from '@tanstack/router-core'\nimport type { StartSsrGlobal } from '@tanstack/start-client-core'\n\nconst __TSR_SSR__: StartSsrGlobal = {\n matches: [],\n streamedValues: {},\n initMatch: (match) => {\n __TSR_SSR__.matches.push(match)\n\n match.extracted?.forEach((ex) => {\n if (ex.type === 'stream') {\n let controller\n ex.value = new ReadableStream({\n start(c) {\n controller = {\n enqueue: (chunk: unknown) => {\n try {\n c.enqueue(chunk)\n } catch {}\n },\n close: () => {\n try {\n c.close()\n } catch {}\n },\n }\n },\n })\n ex.value.controller = controller\n } else {\n let resolve: ControllablePromise['reject'] | undefined\n let reject: ControllablePromise['reject'] | undefined\n\n ex.value = new Promise((_resolve, _reject) => {\n reject = _reject\n resolve = _resolve\n }) as ControllablePromise\n ex.value.reject = reject!\n ex.value.resolve = resolve!\n }\n })\n\n return true\n },\n resolvePromise: ({ matchId, id, promiseState }) => {\n const match = __TSR_SSR__.matches.find((m) => m.id === matchId)\n if (match) {\n const ex = match.extracted?.[id]\n if (\n ex &&\n ex.type === 'promise' &&\n ex.value &&\n promiseState.status === 'success'\n ) {\n ex.value.resolve(promiseState.data)\n return true\n }\n }\n return false\n },\n injectChunk: ({ matchId, id, chunk }) => {\n const match = __TSR_SSR__.matches.find((m) => m.id === matchId)\n\n if (match) {\n const ex = match.extracted?.[id]\n if (ex && ex.type === 'stream' && ex.value?.controller) {\n ex.value.controller.enqueue(new TextEncoder().encode(chunk.toString()))\n return true\n }\n }\n return false\n },\n closeStream: ({ matchId, id }) => {\n const match = __TSR_SSR__.matches.find((m) => m.id === matchId)\n if (match) {\n const ex = match.extracted?.[id]\n if (ex && ex.type === 'stream' && ex.value?.controller) {\n ex.value.controller.close()\n return true\n }\n }\n return false\n },\n cleanScripts: () => {\n document.querySelectorAll('.tsr-once').forEach((el) => {\n el.remove()\n })\n },\n}\n\nwindow.__TSR_SSR__ = __TSR_SSR__\n"],"names":[],"mappings":";AAAA,MAAA,6BAAe;;"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const VIRTUAL_MODULES = {
4
- routeTree: "tanstack-start-route-tree:v",
5
- startManifest: "tanstack-start-manifest:v",
6
- serverFnManifest: "tanstack-start-server-fn-manifest:v"
7
- };
8
- exports.VIRTUAL_MODULES = VIRTUAL_MODULES;
9
- //# sourceMappingURL=virtual-modules.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"virtual-modules.cjs","sources":["../../src/virtual-modules.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/consistent-type-imports */\n\nexport const VIRTUAL_MODULES = {\n routeTree: 'tanstack-start-route-tree:v',\n startManifest: 'tanstack-start-manifest:v',\n serverFnManifest: 'tanstack-start-server-fn-manifest:v',\n} as const\n\nexport type VirtualModules = {\n [VIRTUAL_MODULES.routeTree]: typeof import('tanstack-start-route-tree:v')\n [VIRTUAL_MODULES.startManifest]: typeof import('tanstack-start-manifest:v')\n [VIRTUAL_MODULES.serverFnManifest]: typeof import('tanstack-start-server-fn-manifest:v')\n}\n"],"names":[],"mappings":";;AAEO,MAAM,kBAAkB;AAAA,EAC7B,WAAW;AAAA,EACX,eAAe;AAAA,EACf,kBAAkB;AACpB;;"}
@@ -1,10 +0,0 @@
1
- export declare const VIRTUAL_MODULES: {
2
- readonly routeTree: "tanstack-start-route-tree:v";
3
- readonly startManifest: "tanstack-start-manifest:v";
4
- readonly serverFnManifest: "tanstack-start-server-fn-manifest:v";
5
- };
6
- export type VirtualModules = {
7
- [VIRTUAL_MODULES.routeTree]: typeof import('tanstack-start-route-tree:v');
8
- [VIRTUAL_MODULES.startManifest]: typeof import('tanstack-start-manifest:v');
9
- [VIRTUAL_MODULES.serverFnManifest]: typeof import('tanstack-start-server-fn-manifest:v');
10
- };
@@ -1,8 +0,0 @@
1
- import { HandlerCallback } from './handlerCallback.js';
2
- import { AnyRouter, Manifest } from '@tanstack/router-core';
3
- export type RequestHandler<TRouter extends AnyRouter> = (cb: HandlerCallback<TRouter>) => Promise<Response>;
4
- export declare function createRequestHandler<TRouter extends AnyRouter>({ createRouter, request, getRouterManifest, }: {
5
- createRouter: () => TRouter;
6
- request: Request;
7
- getRouterManifest?: () => Manifest | Promise<Manifest>;
8
- }): RequestHandler<TRouter>;
@@ -1,50 +0,0 @@
1
- import { createMemoryHistory } from "@tanstack/history";
2
- import { mergeHeaders } from "@tanstack/start-client-core";
3
- import { attachRouterServerSsrUtils, dehydrateRouter } from "./ssr-server.js";
4
- function createRequestHandler({
5
- createRouter,
6
- request,
7
- getRouterManifest
8
- }) {
9
- return async (cb) => {
10
- const router = createRouter();
11
- attachRouterServerSsrUtils(router, await (getRouterManifest == null ? void 0 : getRouterManifest()));
12
- const url = new URL(request.url, "http://localhost");
13
- const href = url.href.replace(url.origin, "");
14
- const history = createMemoryHistory({
15
- initialEntries: [href]
16
- });
17
- router.update({
18
- history
19
- });
20
- await router.load();
21
- dehydrateRouter(router);
22
- const responseHeaders = getRequestHeaders({
23
- router
24
- });
25
- return cb({
26
- request,
27
- router,
28
- responseHeaders
29
- });
30
- };
31
- }
32
- function getRequestHeaders(opts) {
33
- let headers = mergeHeaders(
34
- {
35
- "Content-Type": "text/html; charset=UTF-8"
36
- },
37
- ...opts.router.state.matches.map((match) => {
38
- return match.headers;
39
- })
40
- );
41
- const { redirect } = opts.router.state;
42
- if (redirect) {
43
- headers = mergeHeaders(headers, redirect.headers);
44
- }
45
- return headers;
46
- }
47
- export {
48
- createRequestHandler
49
- };
50
- //# sourceMappingURL=createRequestHandler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createRequestHandler.js","sources":["../../src/createRequestHandler.ts"],"sourcesContent":["import { createMemoryHistory } from '@tanstack/history'\nimport { mergeHeaders } from '@tanstack/start-client-core'\nimport { attachRouterServerSsrUtils, dehydrateRouter } from './ssr-server'\nimport type { HandlerCallback } from './handlerCallback'\nimport type { AnyRouter, Manifest } from '@tanstack/router-core'\n\nexport type RequestHandler<TRouter extends AnyRouter> = (\n cb: HandlerCallback<TRouter>,\n) => Promise<Response>\n\nexport function createRequestHandler<TRouter extends AnyRouter>({\n createRouter,\n request,\n getRouterManifest,\n}: {\n createRouter: () => TRouter\n request: Request\n getRouterManifest?: () => Manifest | Promise<Manifest>\n}): RequestHandler<TRouter> {\n return async (cb) => {\n const router = createRouter()\n\n attachRouterServerSsrUtils(router, await getRouterManifest?.())\n\n const url = new URL(request.url, 'http://localhost')\n\n const href = url.href.replace(url.origin, '')\n\n // Create a history for the router\n const history = createMemoryHistory({\n initialEntries: [href],\n })\n\n // Update the router with the history and context\n router.update({\n history,\n })\n\n await router.load()\n\n dehydrateRouter(router)\n\n const responseHeaders = getRequestHeaders({\n router,\n })\n\n return cb({\n request,\n router,\n responseHeaders,\n } as any)\n }\n}\n\nfunction getRequestHeaders(opts: { router: AnyRouter }): Headers {\n let headers = mergeHeaders(\n {\n 'Content-Type': 'text/html; charset=UTF-8',\n },\n ...opts.router.state.matches.map((match) => {\n return match.headers\n }),\n )\n\n // Handle Redirects\n const { redirect } = opts.router.state\n\n if (redirect) {\n headers = mergeHeaders(headers, redirect.headers)\n }\n\n return headers\n}\n"],"names":[],"mappings":";;;AAUO,SAAS,qBAAgD;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AACF,GAI4B;AAC1B,SAAO,OAAO,OAAO;AACnB,UAAM,SAAS,aAAa;AAED,+BAAA,QAAQ,OAAM,yDAAqB;AAE9D,UAAM,MAAM,IAAI,IAAI,QAAQ,KAAK,kBAAkB;AAEnD,UAAM,OAAO,IAAI,KAAK,QAAQ,IAAI,QAAQ,EAAE;AAG5C,UAAM,UAAU,oBAAoB;AAAA,MAClC,gBAAgB,CAAC,IAAI;AAAA,IAAA,CACtB;AAGD,WAAO,OAAO;AAAA,MACZ;AAAA,IAAA,CACD;AAED,UAAM,OAAO,KAAK;AAElB,oBAAgB,MAAM;AAEtB,UAAM,kBAAkB,kBAAkB;AAAA,MACxC;AAAA,IAAA,CACD;AAED,WAAO,GAAG;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACM;AAAA,EACV;AACF;AAEA,SAAS,kBAAkB,MAAsC;AAC/D,MAAI,UAAU;AAAA,IACZ;AAAA,MACE,gBAAgB;AAAA,IAClB;AAAA,IACA,GAAG,KAAK,OAAO,MAAM,QAAQ,IAAI,CAAC,UAAU;AAC1C,aAAO,MAAM;AAAA,IACd,CAAA;AAAA,EACH;AAGA,QAAM,EAAE,SAAA,IAAa,KAAK,OAAO;AAEjC,MAAI,UAAU;AACF,cAAA,aAAa,SAAS,SAAS,OAAO;AAAA,EAAA;AAG3C,SAAA;AACT;"}
@@ -1,7 +0,0 @@
1
- import { RequestHandler } from './h3.js';
2
- import { AnyRouter } from '@tanstack/router-core';
3
- import { HandlerCallback } from './handlerCallback.js';
4
- export type CustomizeStartHandler<TRouter extends AnyRouter> = (cb: HandlerCallback<TRouter>) => RequestHandler;
5
- export declare function createStartHandler<TRouter extends AnyRouter>({ createRouter, }: {
6
- createRouter: () => TRouter;
7
- }): CustomizeStartHandler<TRouter>;
@@ -1,313 +0,0 @@
1
- import { createMemoryHistory } from "@tanstack/history";
2
- import { json, mergeHeaders, flattenMiddlewares } from "@tanstack/start-client-core";
3
- import { joinPaths, trimPath, processRouteTree, isRedirect, isResolvedRedirect, getMatchedRoutes } from "@tanstack/router-core";
4
- import { requestHandler, getResponseHeaders } from "./h3.js";
5
- import { attachRouterServerSsrUtils, dehydrateRouter } from "./ssr-server.js";
6
- import { getStartManifest } from "./router-manifest.js";
7
- import { handleServerAction } from "./server-functions-handler.js";
8
- import { VIRTUAL_MODULES } from "./virtual-modules.js";
9
- import { loadVirtualModule } from "./loadVirtualModule.js";
10
- function getStartResponseHeaders(opts) {
11
- const headers = mergeHeaders(
12
- getResponseHeaders(),
13
- {
14
- "Content-Type": "text/html; charset=UTF-8"
15
- },
16
- ...opts.router.state.matches.map((match) => {
17
- return match.headers;
18
- })
19
- );
20
- return headers;
21
- }
22
- function createStartHandler({
23
- createRouter
24
- }) {
25
- let routeTreeModule = null;
26
- let startRoutesManifest = null;
27
- let processedServerRouteTree = void 0;
28
- return (cb) => {
29
- const originalFetch = globalThis.fetch;
30
- const startRequestResolver = async ({ request }) => {
31
- globalThis.fetch = async function(input, init) {
32
- function resolve(url2, requestOptions) {
33
- const fetchRequest = new Request(url2, requestOptions);
34
- return startRequestResolver({ request: fetchRequest });
35
- }
36
- function getOrigin() {
37
- return request.headers.get("Origin") || request.headers.get("Referer") || "http://localhost";
38
- }
39
- if (typeof input === "string" && input.startsWith("/")) {
40
- const url2 = new URL(input, getOrigin());
41
- return resolve(url2, init);
42
- } else if (typeof input === "object" && "url" in input && typeof input.url === "string" && input.url.startsWith("/")) {
43
- const url2 = new URL(input.url, getOrigin());
44
- return resolve(url2, init);
45
- }
46
- return originalFetch(input, init);
47
- };
48
- const url = new URL(request.url);
49
- const href = url.href.replace(url.origin, "");
50
- const APP_BASE = process.env.TSS_APP_BASE || "/";
51
- const router = createRouter();
52
- const history = createMemoryHistory({
53
- initialEntries: [href]
54
- });
55
- router.update({
56
- history
57
- });
58
- const response = await (async () => {
59
- try {
60
- if (!process.env.TSS_SERVER_FN_BASE) {
61
- throw new Error(
62
- "tanstack/start-server-core: TSS_SERVER_FN_BASE must be defined in your environment for createStartHandler()"
63
- );
64
- }
65
- const serverFnBase = joinPaths([
66
- APP_BASE,
67
- trimPath(process.env.TSS_SERVER_FN_BASE),
68
- "/"
69
- ]);
70
- if (href.startsWith(serverFnBase)) {
71
- return await handleServerAction({ request });
72
- }
73
- if (routeTreeModule === null) {
74
- try {
75
- routeTreeModule = await loadVirtualModule(
76
- VIRTUAL_MODULES.routeTree
77
- );
78
- if (routeTreeModule.serverRouteTree) {
79
- processedServerRouteTree = processRouteTree({
80
- routeTree: routeTreeModule.serverRouteTree,
81
- initRoute: (route, i) => {
82
- route.init({
83
- originalIndex: i
84
- });
85
- }
86
- });
87
- }
88
- } catch (e) {
89
- console.log(e);
90
- }
91
- }
92
- async function executeRouter() {
93
- const requestAcceptHeader = request.headers.get("Accept") || "*/*";
94
- const splitRequestAcceptHeader = requestAcceptHeader.split(",");
95
- const supportedMimeTypes = ["*/*", "text/html"];
96
- const isRouterAcceptSupported = supportedMimeTypes.some(
97
- (mimeType) => splitRequestAcceptHeader.some(
98
- (acceptedMimeType) => acceptedMimeType.trim().startsWith(mimeType)
99
- )
100
- );
101
- if (!isRouterAcceptSupported) {
102
- return json(
103
- {
104
- error: "Only HTML requests are supported here"
105
- },
106
- {
107
- status: 500
108
- }
109
- );
110
- }
111
- if (startRoutesManifest === null) {
112
- startRoutesManifest = await getStartManifest({
113
- basePath: APP_BASE
114
- });
115
- }
116
- attachRouterServerSsrUtils(router, startRoutesManifest);
117
- await router.load();
118
- if (router.state.redirect) {
119
- return router.state.redirect;
120
- }
121
- dehydrateRouter(router);
122
- const responseHeaders = getStartResponseHeaders({ router });
123
- const response2 = await cb({
124
- request,
125
- router,
126
- responseHeaders
127
- });
128
- return response2;
129
- }
130
- if (processedServerRouteTree) {
131
- const [_matchedRoutes, response2] = await handleServerRoutes({
132
- processedServerRouteTree,
133
- router,
134
- request,
135
- basePath: APP_BASE,
136
- executeRouter
137
- });
138
- if (response2) return response2;
139
- }
140
- const routerResponse = await executeRouter();
141
- return routerResponse;
142
- } catch (err) {
143
- if (err instanceof Response) {
144
- return err;
145
- }
146
- throw err;
147
- }
148
- })();
149
- if (isRedirect(response)) {
150
- if (isResolvedRedirect(response)) {
151
- if (request.headers.get("x-tsr-redirect") === "manual") {
152
- return json(
153
- {
154
- ...response.options,
155
- isSerializedRedirect: true
156
- },
157
- {
158
- headers: response.headers
159
- }
160
- );
161
- }
162
- return response;
163
- }
164
- if (response.options.to && typeof response.options.to === "string" && !response.options.to.startsWith("/")) {
165
- throw new Error(
166
- `Server side redirects must use absolute paths via the 'href' or 'to' options. Received: ${JSON.stringify(response.options)}`
167
- );
168
- }
169
- if (["params", "search", "hash"].some(
170
- (d) => typeof response.options[d] === "function"
171
- )) {
172
- throw new Error(
173
- `Server side redirects must use static search, params, and hash values and do not support functional values. Received functional values for: ${Object.keys(
174
- response.options
175
- ).filter((d) => typeof response.options[d] === "function").map((d) => `"${d}"`).join(", ")}`
176
- );
177
- }
178
- const redirect = router.resolveRedirect(response);
179
- if (request.headers.get("x-tsr-redirect") === "manual") {
180
- return json(
181
- {
182
- ...response.options,
183
- isSerializedRedirect: true
184
- },
185
- {
186
- headers: response.headers
187
- }
188
- );
189
- }
190
- return redirect;
191
- }
192
- return response;
193
- };
194
- return requestHandler(startRequestResolver);
195
- };
196
- }
197
- async function handleServerRoutes(opts) {
198
- var _a, _b;
199
- const url = new URL(opts.request.url);
200
- const pathname = url.pathname;
201
- const serverTreeResult = getMatchedRoutes({
202
- pathname,
203
- basepath: opts.basePath,
204
- caseSensitive: true,
205
- routesByPath: opts.processedServerRouteTree.routesByPath,
206
- routesById: opts.processedServerRouteTree.routesById,
207
- flatRoutes: opts.processedServerRouteTree.flatRoutes
208
- });
209
- const routeTreeResult = opts.router.getMatchedRoutes(pathname, void 0);
210
- let response;
211
- let matchedRoutes = [];
212
- matchedRoutes = serverTreeResult.matchedRoutes;
213
- if (routeTreeResult.foundRoute) {
214
- if (serverTreeResult.matchedRoutes.length < routeTreeResult.matchedRoutes.length) {
215
- const closestCommon = [...routeTreeResult.matchedRoutes].reverse().find((r) => {
216
- return opts.processedServerRouteTree.routesById[r.id] !== void 0;
217
- });
218
- if (closestCommon) {
219
- let routeId = closestCommon.id;
220
- matchedRoutes = [];
221
- do {
222
- const route = opts.processedServerRouteTree.routesById[routeId];
223
- if (!route) {
224
- break;
225
- }
226
- matchedRoutes.push(route);
227
- routeId = (_a = route.parentRoute) == null ? void 0 : _a.id;
228
- } while (routeId);
229
- matchedRoutes.reverse();
230
- }
231
- }
232
- }
233
- if (matchedRoutes.length) {
234
- const middlewares = flattenMiddlewares(
235
- matchedRoutes.flatMap((r) => r.options.middleware).filter(Boolean)
236
- ).map((d) => d.options.server);
237
- if ((_b = serverTreeResult.foundRoute) == null ? void 0 : _b.options.methods) {
238
- const method = Object.keys(
239
- serverTreeResult.foundRoute.options.methods
240
- ).find(
241
- (method2) => method2.toLowerCase() === opts.request.method.toLowerCase()
242
- );
243
- if (method) {
244
- const handler = serverTreeResult.foundRoute.options.methods[method];
245
- if (handler) {
246
- middlewares.push(handlerToMiddleware(handler));
247
- }
248
- }
249
- }
250
- middlewares.push(handlerToMiddleware(opts.executeRouter));
251
- const ctx = await executeMiddleware(middlewares, {
252
- request: opts.request,
253
- context: {},
254
- params: serverTreeResult.routeParams,
255
- pathname
256
- });
257
- response = ctx.response;
258
- }
259
- return [matchedRoutes, response];
260
- }
261
- function handlerToMiddleware(handler) {
262
- return async ({ next: _next, ...rest }) => {
263
- const response = await handler(rest);
264
- if (response) {
265
- return { response };
266
- }
267
- return _next(rest);
268
- };
269
- }
270
- function executeMiddleware(middlewares, ctx) {
271
- let index = -1;
272
- const next = async (ctx2) => {
273
- index++;
274
- const middleware = middlewares[index];
275
- if (!middleware) return ctx2;
276
- const result = await middleware({
277
- ...ctx2,
278
- // Allow the middleware to call the next middleware in the chain
279
- next: async (nextCtx) => {
280
- const nextResult = await next({ ...ctx2, ...nextCtx });
281
- return Object.assign(ctx2, handleCtxResult(nextResult));
282
- }
283
- // Allow the middleware result to extend the return context
284
- }).catch((err) => {
285
- if (isSpecialResponse(err)) {
286
- return {
287
- response: err
288
- };
289
- }
290
- throw err;
291
- });
292
- return Object.assign(ctx2, handleCtxResult(result));
293
- };
294
- return handleCtxResult(next(ctx));
295
- }
296
- function handleCtxResult(result) {
297
- if (isSpecialResponse(result)) {
298
- return {
299
- response: result
300
- };
301
- }
302
- return result;
303
- }
304
- function isSpecialResponse(err) {
305
- return isResponse(err) || isRedirect(err);
306
- }
307
- function isResponse(response) {
308
- return response instanceof Response;
309
- }
310
- export {
311
- createStartHandler
312
- };
313
- //# sourceMappingURL=createStartHandler.js.map