@tanstack/solid-start-client 1.120.4-alpha.17 → 1.120.4
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.
- package/README.md +28 -4
- package/dist/cjs/index.d.cts +11 -2
- package/dist/cjs/renderRSC.cjs.map +1 -1
- package/dist/cjs/routesManifest.d.cts +0 -0
- package/dist/cjs/useServerFn.cjs +5 -2
- package/dist/cjs/useServerFn.cjs.map +1 -1
- package/dist/esm/index.d.ts +11 -2
- package/dist/esm/renderRSC.js.map +1 -1
- package/dist/esm/routesManifest.d.ts +0 -0
- package/dist/esm/useServerFn.js +5 -2
- package/dist/esm/useServerFn.js.map +1 -1
- package/package.json +5 -4
- package/src/index.tsx +40 -33
- package/src/renderRSC.tsx +1 -1
- package/src/routesManifest.ts +0 -0
- package/src/useServerFn.ts +6 -2
package/README.md
CHANGED
|
@@ -1,9 +1,33 @@
|
|
|
1
|
+
> 🤫 we're cooking up something special!
|
|
2
|
+
|
|
1
3
|
<img src="https://static.scarf.sh/a.png?x-pxid=d988eb79-b0fc-4a2b-8514-6a1ab932d188" />
|
|
2
4
|
|
|
3
|
-
# TanStack
|
|
5
|
+
# TanStack Start
|
|
6
|
+
|
|
7
|
+

|
|
8
|
+
|
|
9
|
+
🤖 Type-safe router w/ built-in caching & URL state management for React!
|
|
4
10
|
|
|
5
|
-
|
|
11
|
+
<a href="https://twitter.com/intent/tweet?button_hashtag=TanStack" target="\_parent">
|
|
12
|
+
<img alt="#TanStack" src="https://img.shields.io/twitter/url?color=%2308a0e9&label=%23TanStack&style=social&url=https%3A%2F%2Ftwitter.com%2Fintent%2Ftweet%3Fbutton_hashtag%3DTanStack">
|
|
13
|
+
</a><a href="https://discord.com/invite/WrRKjPJ" target="\_parent">
|
|
14
|
+
<img alt="" src="https://img.shields.io/badge/Discord-TanStack-%235865F2" />
|
|
15
|
+
</a><a href="https://npmjs.com/package/@tanstack/solid-router" target="\_parent">
|
|
16
|
+
<img alt="" src="https://img.shields.io/npm/dm/@tanstack/router.svg" />
|
|
17
|
+
</a><a href="https://bundlephobia.com/result?p=@tanstack/solid-router" target="\_parent">
|
|
18
|
+
<img alt="" src="https://badgen.net/bundlephobia/minzip/@tanstack/solid-router" />
|
|
19
|
+
</a><a href="#badge">
|
|
20
|
+
<img alt="semantic-release" src="https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg">
|
|
21
|
+
</a><a href="https://github.com/tanstack/router/discussions">
|
|
22
|
+
<img alt="Join the discussion on Github" src="https://img.shields.io/badge/Github%20Discussions%20%26%20Support-Chat%20now!-blue" />
|
|
23
|
+
</a><a href="https://bestofjs.org/projects/router"><img alt="Best of JS" src="https://img.shields.io/endpoint?url=https://bestofjs-serverless.now.sh/api/project-badge?fullName=tanstack%2Frouter%26since=daily" /></a><a href="https://github.com/tanstack/router" target="\_parent">
|
|
24
|
+
<img alt="" src="https://img.shields.io/github/stars/tanstack/router.svg?style=social&label=Star" />
|
|
25
|
+
</a><a href="https://twitter.com/tan_stack" target="\_parent">
|
|
26
|
+
<img alt="" src="https://img.shields.io/twitter/follow/tan_stack.svg?style=social&label=Follow @TanStack" />
|
|
27
|
+
</a><a href="https://twitter.com/tannerlinsley" target="\_parent">
|
|
28
|
+
<img alt="" src="https://img.shields.io/twitter/follow/tannerlinsley.svg?style=social&label=Follow @TannerLinsley" />
|
|
29
|
+
</a>
|
|
6
30
|
|
|
7
|
-
|
|
31
|
+
Enjoy this library? Try the entire [TanStack](https://tanstack.com)! [React Query](https://github.com/tannerlinsley/react-query), [React Table](https://github.com/tanstack/react-table), [React Charts](https://github.com/tannerlinsley/react-charts), [React Virtual](https://github.com/tannerlinsley/react-virtual)
|
|
8
32
|
|
|
9
|
-
|
|
33
|
+
## Visit [tanstack.com/router](https://tanstack.com/router) for docs, guides, API and more!
|
package/dist/cjs/index.d.cts
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
|
-
export { mergeHeaders
|
|
2
|
-
export {
|
|
1
|
+
export { mergeHeaders } from '@tanstack/start-client-core';
|
|
2
|
+
export { startSerializer } from '@tanstack/start-client-core';
|
|
3
|
+
export { type DehydratedRouter, type ClientExtractedBaseEntry, type StartSsrGlobal, type ClientExtractedEntry, type SsrMatch, type ClientExtractedPromise, type ClientExtractedStream, type ResolvePromiseState, } from '@tanstack/start-client-core';
|
|
4
|
+
export { createIsomorphicFn, type IsomorphicFn, type ServerOnlyFn, type ClientOnlyFn, type IsomorphicFnBase, } from '@tanstack/start-client-core';
|
|
5
|
+
export { createServerFn } from '@tanstack/start-client-core';
|
|
6
|
+
export { type ServerFn as FetchFn, type ServerFnCtx as FetchFnCtx, type CompiledFetcherFnOptions, type CompiledFetcherFn, type Fetcher, type RscStream, type FetcherData, type FetcherBaseOptions, type ServerFn, type ServerFnCtx, type ServerFnResponseType, } from '@tanstack/start-client-core';
|
|
7
|
+
export { type JsonResponse } from '@tanstack/start-client-core';
|
|
8
|
+
export { createMiddleware, type IntersectAllValidatorInputs, type IntersectAllValidatorOutputs, type MiddlewareServerFn, type AnyMiddleware, type MiddlewareOptions, type MiddlewareWithTypes, type MiddlewareValidator, type MiddlewareServer, type MiddlewareAfterClient, type MiddlewareAfterMiddleware, type MiddlewareAfterServer, type Middleware, type MiddlewareClientFnOptions, type MiddlewareClientFnResult, type MiddlewareClientNextFn, type ClientResultWithContext, type AssignAllClientContextBeforeNext, type AssignAllMiddleware, type AssignAllServerContext, type MiddlewareAfterValidator, type MiddlewareClientFn, type MiddlewareServerFnResult, type MiddlewareClient, type MiddlewareServerFnOptions, type MiddlewareServerNextFn, type ServerResultWithContext, } from '@tanstack/start-client-core';
|
|
9
|
+
export { registerGlobalMiddleware, globalMiddleware, } from '@tanstack/start-client-core';
|
|
10
|
+
export { serverOnly, clientOnly } from '@tanstack/start-client-core';
|
|
11
|
+
export { json } from '@tanstack/start-client-core';
|
|
3
12
|
export { Meta } from './Meta.cjs';
|
|
4
13
|
export { Scripts } from './Scripts.cjs';
|
|
5
14
|
export { StartClient } from './StartClient.cjs';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderRSC.cjs","sources":["../../src/renderRSC.tsx"],"sourcesContent":["// TODO: RSCs\n// // @ts-expect-error\n// import * as reactDom from 'react-server-dom/client'\n// import { isValidElement } from 'solid-js'\nimport invariant from 'tiny-invariant'\nimport type * as Solid from 'solid-js'\n\nexport function renderRsc(input: any): Solid.JSX.Element {\n // TODO: isValidElement\n // if (isValidElement(input)) {\n // return input\n // }\n\n if (typeof input === 'object' && !input.state) {\n input.state = {\n status: 'pending',\n promise: Promise.resolve()\n .then(() => {\n let element\n\n // We're in node\n // TODO: RSCs\n // if (reactDom.createFromNodeStream) {\n // const stream = await import('node:stream')\n\n // let body: any = input\n\n // // Unwrap the response\n // if (input instanceof Response) {\n // body = input.body\n // }\n\n // // Convert ReadableStream to NodeJS stream.Readable\n // if (body instanceof ReadableStream) {\n // body = stream.Readable.fromWeb(body as any)\n // }\n\n // if (stream.Readable.isReadable(body)) {\n // // body = copyStreamToRaw(body)\n // } else if (input.text) {\n // // create a readable stream by awaiting the text method\n // body = new stream.Readable({\n // async read() {\n // input.text().then((value: any) => {\n // this.push(value)\n // this.push(null)\n // })\n // },\n // })\n // } else {\n // console.error('input', input)\n // throw new Error('Unexpected rsc input type 👆')\n // }\n\n // element = await reactDom.createFromNodeStream(body)\n // } else {\n // // We're in the browser\n // if (input.body instanceof ReadableStream) {\n // input = input.body\n // }\n\n // if (input instanceof ReadableStream) {\n // element = await reactDom.createFromReadableStream(input)\n // }\n\n // if (input instanceof Response) {\n // // copy to the response body to cache the raw data\n // element = await reactDom.createFromFetch(input)\n // }\n // }\n\n // return element\n\n invariant(false, 'renderRSC() is coming soon!')\n })\n .then((element) => {\n input.state.value = element\n input.state.status = 'success'\n })\n .catch((err) => {\n input.state.status = 'error'\n input.state.error = err\n }),\n }\n }\n\n if (input.state.status === 'pending') {\n throw input.state.promise\n }\n\n return input.state.value\n}\n"],"names":["renderRsc","input","state","status","promise","Promise","resolve","then","invariant","element","value","catch","err","error"],"mappings":";;;AAOO,SAASA,UAAUC,OAA+B;AAMvD,MAAI,OAAOA,UAAU,YAAY,CAACA,MAAMC,OAAO;AAC7CD,UAAMC,QAAQ;AAAA,MACZC,QAAQ;AAAA,MACRC,SAASC,QAAQC,QAAQ,EACtBC,KAAK,MAAM;AAwDVC,kBAAU,OAAO,6BAA6B;AAAA,MAAA,CAC/C,EACAD,KAAME,CAAY,YAAA;AACjBR,cAAMC,MAAMQ,QAAQD;AACpBR,cAAMC,MAAMC,SAAS;AAAA,MAAA,CACtB,EACAQ,MAAOC,CAAQ,QAAA;AACdX,cAAMC,MAAMC,SAAS;AACrBF,cAAMC,MAAMW,QAAQD;AAAAA,MACrB,CAAA;AAAA,IACL;AAAA,EAAA;AAGEX,MAAAA,MAAMC,MAAMC,WAAW,WAAW;AACpC,UAAMF,MAAMC,MAAME;AAAAA,EAAAA;AAGpB,SAAOH,MAAMC,MAAMQ;AACrB;;"}
|
|
1
|
+
{"version":3,"file":"renderRSC.cjs","sources":["../../src/renderRSC.tsx"],"sourcesContent":["// TODO: RSCs\n// // @ts-expect-error\n// import * as reactDom from '@vinxi/react-server-dom/client'\n// import { isValidElement } from 'solid-js'\nimport invariant from 'tiny-invariant'\nimport type * as Solid from 'solid-js'\n\nexport function renderRsc(input: any): Solid.JSX.Element {\n // TODO: isValidElement\n // if (isValidElement(input)) {\n // return input\n // }\n\n if (typeof input === 'object' && !input.state) {\n input.state = {\n status: 'pending',\n promise: Promise.resolve()\n .then(() => {\n let element\n\n // We're in node\n // TODO: RSCs\n // if (reactDom.createFromNodeStream) {\n // const stream = await import('node:stream')\n\n // let body: any = input\n\n // // Unwrap the response\n // if (input instanceof Response) {\n // body = input.body\n // }\n\n // // Convert ReadableStream to NodeJS stream.Readable\n // if (body instanceof ReadableStream) {\n // body = stream.Readable.fromWeb(body as any)\n // }\n\n // if (stream.Readable.isReadable(body)) {\n // // body = copyStreamToRaw(body)\n // } else if (input.text) {\n // // create a readable stream by awaiting the text method\n // body = new stream.Readable({\n // async read() {\n // input.text().then((value: any) => {\n // this.push(value)\n // this.push(null)\n // })\n // },\n // })\n // } else {\n // console.error('input', input)\n // throw new Error('Unexpected rsc input type 👆')\n // }\n\n // element = await reactDom.createFromNodeStream(body)\n // } else {\n // // We're in the browser\n // if (input.body instanceof ReadableStream) {\n // input = input.body\n // }\n\n // if (input instanceof ReadableStream) {\n // element = await reactDom.createFromReadableStream(input)\n // }\n\n // if (input instanceof Response) {\n // // copy to the response body to cache the raw data\n // element = await reactDom.createFromFetch(input)\n // }\n // }\n\n // return element\n\n invariant(false, 'renderRSC() is coming soon!')\n })\n .then((element) => {\n input.state.value = element\n input.state.status = 'success'\n })\n .catch((err) => {\n input.state.status = 'error'\n input.state.error = err\n }),\n }\n }\n\n if (input.state.status === 'pending') {\n throw input.state.promise\n }\n\n return input.state.value\n}\n"],"names":["renderRsc","input","state","status","promise","Promise","resolve","then","invariant","element","value","catch","err","error"],"mappings":";;;AAOO,SAASA,UAAUC,OAA+B;AAMvD,MAAI,OAAOA,UAAU,YAAY,CAACA,MAAMC,OAAO;AAC7CD,UAAMC,QAAQ;AAAA,MACZC,QAAQ;AAAA,MACRC,SAASC,QAAQC,QAAQ,EACtBC,KAAK,MAAM;AAwDVC,kBAAU,OAAO,6BAA6B;AAAA,MAAA,CAC/C,EACAD,KAAME,CAAY,YAAA;AACjBR,cAAMC,MAAMQ,QAAQD;AACpBR,cAAMC,MAAMC,SAAS;AAAA,MAAA,CACtB,EACAQ,MAAOC,CAAQ,QAAA;AACdX,cAAMC,MAAMC,SAAS;AACrBF,cAAMC,MAAMW,QAAQD;AAAAA,MACrB,CAAA;AAAA,IACL;AAAA,EAAA;AAGEX,MAAAA,MAAMC,MAAMC,WAAW,WAAW;AACpC,UAAMF,MAAMC,MAAME;AAAAA,EAAAA;AAGpB,SAAOH,MAAMC,MAAMQ;AACrB;;"}
|
|
File without changes
|
package/dist/cjs/useServerFn.cjs
CHANGED
|
@@ -13,8 +13,11 @@ function useServerFn(serverFn) {
|
|
|
13
13
|
return res;
|
|
14
14
|
} catch (err) {
|
|
15
15
|
if (routerCore.isRedirect(err)) {
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
const resolvedRedirect = router.resolveRedirect({
|
|
17
|
+
...err,
|
|
18
|
+
_fromLocation: router.state.location
|
|
19
|
+
});
|
|
20
|
+
return router.navigate(resolvedRedirect);
|
|
18
21
|
}
|
|
19
22
|
throw err;
|
|
20
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useServerFn.cjs","sources":["../../src/useServerFn.ts"],"sourcesContent":["import { isRedirect } from '@tanstack/router-core'\nimport { useRouter } from '@tanstack/solid-router'\n\nexport function useServerFn<T extends (...deps: Array<any>) => Promise<any>>(\n serverFn: T,\n): (...args: Parameters<T>) => ReturnType<T> {\n const router = useRouter()\n\n return (async (...args: Array<any>) => {\n try {\n const res = await serverFn(...args)\n\n if (isRedirect(res)) {\n throw res\n }\n\n return res\n } catch (err) {\n if (isRedirect(err)) {\n
|
|
1
|
+
{"version":3,"file":"useServerFn.cjs","sources":["../../src/useServerFn.ts"],"sourcesContent":["import { isRedirect } from '@tanstack/router-core'\nimport { useRouter } from '@tanstack/solid-router'\n\nexport function useServerFn<T extends (...deps: Array<any>) => Promise<any>>(\n serverFn: T,\n): (...args: Parameters<T>) => ReturnType<T> {\n const router = useRouter()\n\n return (async (...args: Array<any>) => {\n try {\n const res = await serverFn(...args)\n\n if (isRedirect(res)) {\n throw res\n }\n\n return res\n } catch (err) {\n if (isRedirect(err)) {\n const resolvedRedirect = router.resolveRedirect({\n ...err,\n _fromLocation: router.state.location,\n })\n\n return router.navigate(resolvedRedirect)\n }\n\n throw err\n }\n }) as any\n}\n"],"names":["useRouter","isRedirect"],"mappings":";;;;AAGO,SAAS,YACd,UAC2C;AAC3C,QAAM,SAASA,YAAAA,UAAU;AAEzB,SAAQ,UAAU,SAAqB;AACjC,QAAA;AACF,YAAM,MAAM,MAAM,SAAS,GAAG,IAAI;AAE9B,UAAAC,WAAAA,WAAW,GAAG,GAAG;AACb,cAAA;AAAA,MAAA;AAGD,aAAA;AAAA,aACA,KAAK;AACR,UAAAA,WAAAA,WAAW,GAAG,GAAG;AACb,cAAA,mBAAmB,OAAO,gBAAgB;AAAA,UAC9C,GAAG;AAAA,UACH,eAAe,OAAO,MAAM;AAAA,QAAA,CAC7B;AAEM,eAAA,OAAO,SAAS,gBAAgB;AAAA,MAAA;AAGnC,YAAA;AAAA,IAAA;AAAA,EAEV;AACF;;"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
|
-
export { mergeHeaders
|
|
2
|
-
export {
|
|
1
|
+
export { mergeHeaders } from '@tanstack/start-client-core';
|
|
2
|
+
export { startSerializer } from '@tanstack/start-client-core';
|
|
3
|
+
export { type DehydratedRouter, type ClientExtractedBaseEntry, type StartSsrGlobal, type ClientExtractedEntry, type SsrMatch, type ClientExtractedPromise, type ClientExtractedStream, type ResolvePromiseState, } from '@tanstack/start-client-core';
|
|
4
|
+
export { createIsomorphicFn, type IsomorphicFn, type ServerOnlyFn, type ClientOnlyFn, type IsomorphicFnBase, } from '@tanstack/start-client-core';
|
|
5
|
+
export { createServerFn } from '@tanstack/start-client-core';
|
|
6
|
+
export { type ServerFn as FetchFn, type ServerFnCtx as FetchFnCtx, type CompiledFetcherFnOptions, type CompiledFetcherFn, type Fetcher, type RscStream, type FetcherData, type FetcherBaseOptions, type ServerFn, type ServerFnCtx, type ServerFnResponseType, } from '@tanstack/start-client-core';
|
|
7
|
+
export { type JsonResponse } from '@tanstack/start-client-core';
|
|
8
|
+
export { createMiddleware, type IntersectAllValidatorInputs, type IntersectAllValidatorOutputs, type MiddlewareServerFn, type AnyMiddleware, type MiddlewareOptions, type MiddlewareWithTypes, type MiddlewareValidator, type MiddlewareServer, type MiddlewareAfterClient, type MiddlewareAfterMiddleware, type MiddlewareAfterServer, type Middleware, type MiddlewareClientFnOptions, type MiddlewareClientFnResult, type MiddlewareClientNextFn, type ClientResultWithContext, type AssignAllClientContextBeforeNext, type AssignAllMiddleware, type AssignAllServerContext, type MiddlewareAfterValidator, type MiddlewareClientFn, type MiddlewareServerFnResult, type MiddlewareClient, type MiddlewareServerFnOptions, type MiddlewareServerNextFn, type ServerResultWithContext, } from '@tanstack/start-client-core';
|
|
9
|
+
export { registerGlobalMiddleware, globalMiddleware, } from '@tanstack/start-client-core';
|
|
10
|
+
export { serverOnly, clientOnly } from '@tanstack/start-client-core';
|
|
11
|
+
export { json } from '@tanstack/start-client-core';
|
|
3
12
|
export { Meta } from './Meta.js';
|
|
4
13
|
export { Scripts } from './Scripts.js';
|
|
5
14
|
export { StartClient } from './StartClient.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderRSC.js","sources":["../../src/renderRSC.tsx"],"sourcesContent":["// TODO: RSCs\n// // @ts-expect-error\n// import * as reactDom from 'react-server-dom/client'\n// import { isValidElement } from 'solid-js'\nimport invariant from 'tiny-invariant'\nimport type * as Solid from 'solid-js'\n\nexport function renderRsc(input: any): Solid.JSX.Element {\n // TODO: isValidElement\n // if (isValidElement(input)) {\n // return input\n // }\n\n if (typeof input === 'object' && !input.state) {\n input.state = {\n status: 'pending',\n promise: Promise.resolve()\n .then(() => {\n let element\n\n // We're in node\n // TODO: RSCs\n // if (reactDom.createFromNodeStream) {\n // const stream = await import('node:stream')\n\n // let body: any = input\n\n // // Unwrap the response\n // if (input instanceof Response) {\n // body = input.body\n // }\n\n // // Convert ReadableStream to NodeJS stream.Readable\n // if (body instanceof ReadableStream) {\n // body = stream.Readable.fromWeb(body as any)\n // }\n\n // if (stream.Readable.isReadable(body)) {\n // // body = copyStreamToRaw(body)\n // } else if (input.text) {\n // // create a readable stream by awaiting the text method\n // body = new stream.Readable({\n // async read() {\n // input.text().then((value: any) => {\n // this.push(value)\n // this.push(null)\n // })\n // },\n // })\n // } else {\n // console.error('input', input)\n // throw new Error('Unexpected rsc input type 👆')\n // }\n\n // element = await reactDom.createFromNodeStream(body)\n // } else {\n // // We're in the browser\n // if (input.body instanceof ReadableStream) {\n // input = input.body\n // }\n\n // if (input instanceof ReadableStream) {\n // element = await reactDom.createFromReadableStream(input)\n // }\n\n // if (input instanceof Response) {\n // // copy to the response body to cache the raw data\n // element = await reactDom.createFromFetch(input)\n // }\n // }\n\n // return element\n\n invariant(false, 'renderRSC() is coming soon!')\n })\n .then((element) => {\n input.state.value = element\n input.state.status = 'success'\n })\n .catch((err) => {\n input.state.status = 'error'\n input.state.error = err\n }),\n }\n }\n\n if (input.state.status === 'pending') {\n throw input.state.promise\n }\n\n return input.state.value\n}\n"],"names":["renderRsc","input","state","status","promise","Promise","resolve","then","invariant","element","value","catch","err","error"],"mappings":";AAOO,SAASA,UAAUC,OAA+B;AAMvD,MAAI,OAAOA,UAAU,YAAY,CAACA,MAAMC,OAAO;AAC7CD,UAAMC,QAAQ;AAAA,MACZC,QAAQ;AAAA,MACRC,SAASC,QAAQC,QAAQ,EACtBC,KAAK,MAAM;AAwDVC,kBAAU,OAAO,6BAA6B;AAAA,MAAA,CAC/C,EACAD,KAAME,CAAY,YAAA;AACjBR,cAAMC,MAAMQ,QAAQD;AACpBR,cAAMC,MAAMC,SAAS;AAAA,MAAA,CACtB,EACAQ,MAAOC,CAAQ,QAAA;AACdX,cAAMC,MAAMC,SAAS;AACrBF,cAAMC,MAAMW,QAAQD;AAAAA,MACrB,CAAA;AAAA,IACL;AAAA,EAAA;AAGEX,MAAAA,MAAMC,MAAMC,WAAW,WAAW;AACpC,UAAMF,MAAMC,MAAME;AAAAA,EAAAA;AAGpB,SAAOH,MAAMC,MAAMQ;AACrB;"}
|
|
1
|
+
{"version":3,"file":"renderRSC.js","sources":["../../src/renderRSC.tsx"],"sourcesContent":["// TODO: RSCs\n// // @ts-expect-error\n// import * as reactDom from '@vinxi/react-server-dom/client'\n// import { isValidElement } from 'solid-js'\nimport invariant from 'tiny-invariant'\nimport type * as Solid from 'solid-js'\n\nexport function renderRsc(input: any): Solid.JSX.Element {\n // TODO: isValidElement\n // if (isValidElement(input)) {\n // return input\n // }\n\n if (typeof input === 'object' && !input.state) {\n input.state = {\n status: 'pending',\n promise: Promise.resolve()\n .then(() => {\n let element\n\n // We're in node\n // TODO: RSCs\n // if (reactDom.createFromNodeStream) {\n // const stream = await import('node:stream')\n\n // let body: any = input\n\n // // Unwrap the response\n // if (input instanceof Response) {\n // body = input.body\n // }\n\n // // Convert ReadableStream to NodeJS stream.Readable\n // if (body instanceof ReadableStream) {\n // body = stream.Readable.fromWeb(body as any)\n // }\n\n // if (stream.Readable.isReadable(body)) {\n // // body = copyStreamToRaw(body)\n // } else if (input.text) {\n // // create a readable stream by awaiting the text method\n // body = new stream.Readable({\n // async read() {\n // input.text().then((value: any) => {\n // this.push(value)\n // this.push(null)\n // })\n // },\n // })\n // } else {\n // console.error('input', input)\n // throw new Error('Unexpected rsc input type 👆')\n // }\n\n // element = await reactDom.createFromNodeStream(body)\n // } else {\n // // We're in the browser\n // if (input.body instanceof ReadableStream) {\n // input = input.body\n // }\n\n // if (input instanceof ReadableStream) {\n // element = await reactDom.createFromReadableStream(input)\n // }\n\n // if (input instanceof Response) {\n // // copy to the response body to cache the raw data\n // element = await reactDom.createFromFetch(input)\n // }\n // }\n\n // return element\n\n invariant(false, 'renderRSC() is coming soon!')\n })\n .then((element) => {\n input.state.value = element\n input.state.status = 'success'\n })\n .catch((err) => {\n input.state.status = 'error'\n input.state.error = err\n }),\n }\n }\n\n if (input.state.status === 'pending') {\n throw input.state.promise\n }\n\n return input.state.value\n}\n"],"names":["renderRsc","input","state","status","promise","Promise","resolve","then","invariant","element","value","catch","err","error"],"mappings":";AAOO,SAASA,UAAUC,OAA+B;AAMvD,MAAI,OAAOA,UAAU,YAAY,CAACA,MAAMC,OAAO;AAC7CD,UAAMC,QAAQ;AAAA,MACZC,QAAQ;AAAA,MACRC,SAASC,QAAQC,QAAQ,EACtBC,KAAK,MAAM;AAwDVC,kBAAU,OAAO,6BAA6B;AAAA,MAAA,CAC/C,EACAD,KAAME,CAAY,YAAA;AACjBR,cAAMC,MAAMQ,QAAQD;AACpBR,cAAMC,MAAMC,SAAS;AAAA,MAAA,CACtB,EACAQ,MAAOC,CAAQ,QAAA;AACdX,cAAMC,MAAMC,SAAS;AACrBF,cAAMC,MAAMW,QAAQD;AAAAA,MACrB,CAAA;AAAA,IACL;AAAA,EAAA;AAGEX,MAAAA,MAAMC,MAAMC,WAAW,WAAW;AACpC,UAAMF,MAAMC,MAAME;AAAAA,EAAAA;AAGpB,SAAOH,MAAMC,MAAMQ;AACrB;"}
|
|
File without changes
|
package/dist/esm/useServerFn.js
CHANGED
|
@@ -11,8 +11,11 @@ function useServerFn(serverFn) {
|
|
|
11
11
|
return res;
|
|
12
12
|
} catch (err) {
|
|
13
13
|
if (isRedirect(err)) {
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
const resolvedRedirect = router.resolveRedirect({
|
|
15
|
+
...err,
|
|
16
|
+
_fromLocation: router.state.location
|
|
17
|
+
});
|
|
18
|
+
return router.navigate(resolvedRedirect);
|
|
16
19
|
}
|
|
17
20
|
throw err;
|
|
18
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useServerFn.js","sources":["../../src/useServerFn.ts"],"sourcesContent":["import { isRedirect } from '@tanstack/router-core'\nimport { useRouter } from '@tanstack/solid-router'\n\nexport function useServerFn<T extends (...deps: Array<any>) => Promise<any>>(\n serverFn: T,\n): (...args: Parameters<T>) => ReturnType<T> {\n const router = useRouter()\n\n return (async (...args: Array<any>) => {\n try {\n const res = await serverFn(...args)\n\n if (isRedirect(res)) {\n throw res\n }\n\n return res\n } catch (err) {\n if (isRedirect(err)) {\n
|
|
1
|
+
{"version":3,"file":"useServerFn.js","sources":["../../src/useServerFn.ts"],"sourcesContent":["import { isRedirect } from '@tanstack/router-core'\nimport { useRouter } from '@tanstack/solid-router'\n\nexport function useServerFn<T extends (...deps: Array<any>) => Promise<any>>(\n serverFn: T,\n): (...args: Parameters<T>) => ReturnType<T> {\n const router = useRouter()\n\n return (async (...args: Array<any>) => {\n try {\n const res = await serverFn(...args)\n\n if (isRedirect(res)) {\n throw res\n }\n\n return res\n } catch (err) {\n if (isRedirect(err)) {\n const resolvedRedirect = router.resolveRedirect({\n ...err,\n _fromLocation: router.state.location,\n })\n\n return router.navigate(resolvedRedirect)\n }\n\n throw err\n }\n }) as any\n}\n"],"names":[],"mappings":";;AAGO,SAAS,YACd,UAC2C;AAC3C,QAAM,SAAS,UAAU;AAEzB,SAAQ,UAAU,SAAqB;AACjC,QAAA;AACF,YAAM,MAAM,MAAM,SAAS,GAAG,IAAI;AAE9B,UAAA,WAAW,GAAG,GAAG;AACb,cAAA;AAAA,MAAA;AAGD,aAAA;AAAA,aACA,KAAK;AACR,UAAA,WAAW,GAAG,GAAG;AACb,cAAA,mBAAmB,OAAO,gBAAgB;AAAA,UAC9C,GAAG;AAAA,UACH,eAAe,OAAO,MAAM;AAAA,QAAA,CAC7B;AAEM,eAAA,OAAO,SAAS,gBAAgB;AAAA,MAAA;AAGnC,YAAA;AAAA,IAAA;AAAA,EAEV;AACF;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/solid-start-client",
|
|
3
|
-
"version": "1.120.4
|
|
3
|
+
"version": "1.120.4",
|
|
4
4
|
"description": "Modern and scalable routing for Solid applications",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -51,9 +51,10 @@
|
|
|
51
51
|
"jsesc": "^3.1.0",
|
|
52
52
|
"tiny-invariant": "^1.3.3",
|
|
53
53
|
"tiny-warning": "^1.0.3",
|
|
54
|
-
"
|
|
55
|
-
"@tanstack/router
|
|
56
|
-
"@tanstack/
|
|
54
|
+
"vinxi": "^0.5.3",
|
|
55
|
+
"@tanstack/solid-router": "^1.120.4",
|
|
56
|
+
"@tanstack/router-core": "^1.120.4",
|
|
57
|
+
"@tanstack/start-client-core": "^1.120.4"
|
|
57
58
|
},
|
|
58
59
|
"devDependencies": {
|
|
59
60
|
"@solidjs/testing-library": "^0.8.10",
|
package/src/index.tsx
CHANGED
|
@@ -1,15 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
createIsomorphicFn,
|
|
5
|
-
createServerFn,
|
|
6
|
-
createMiddleware,
|
|
7
|
-
registerGlobalMiddleware,
|
|
8
|
-
globalMiddleware,
|
|
9
|
-
serverOnly,
|
|
10
|
-
clientOnly,
|
|
11
|
-
json,
|
|
12
|
-
} from '@tanstack/start-client-core'
|
|
1
|
+
/// <reference types="vinxi/types/client" />
|
|
2
|
+
export { mergeHeaders } from '@tanstack/start-client-core'
|
|
3
|
+
export { startSerializer } from '@tanstack/start-client-core'
|
|
13
4
|
export {
|
|
14
5
|
type DehydratedRouter,
|
|
15
6
|
type ClientExtractedBaseEntry,
|
|
@@ -19,10 +10,16 @@ export {
|
|
|
19
10
|
type ClientExtractedPromise,
|
|
20
11
|
type ClientExtractedStream,
|
|
21
12
|
type ResolvePromiseState,
|
|
13
|
+
} from '@tanstack/start-client-core'
|
|
14
|
+
export {
|
|
15
|
+
createIsomorphicFn,
|
|
22
16
|
type IsomorphicFn,
|
|
23
17
|
type ServerOnlyFn,
|
|
24
18
|
type ClientOnlyFn,
|
|
25
19
|
type IsomorphicFnBase,
|
|
20
|
+
} from '@tanstack/start-client-core'
|
|
21
|
+
export { createServerFn } from '@tanstack/start-client-core'
|
|
22
|
+
export {
|
|
26
23
|
type ServerFn as FetchFn,
|
|
27
24
|
type ServerFnCtx as FetchFnCtx,
|
|
28
25
|
type CompiledFetcherFnOptions,
|
|
@@ -34,33 +31,43 @@ export {
|
|
|
34
31
|
type ServerFn,
|
|
35
32
|
type ServerFnCtx,
|
|
36
33
|
type ServerFnResponseType,
|
|
37
|
-
|
|
34
|
+
} from '@tanstack/start-client-core'
|
|
35
|
+
export { type JsonResponse } from '@tanstack/start-client-core'
|
|
36
|
+
export {
|
|
37
|
+
createMiddleware,
|
|
38
38
|
type IntersectAllValidatorInputs,
|
|
39
39
|
type IntersectAllValidatorOutputs,
|
|
40
|
-
type
|
|
41
|
-
type
|
|
42
|
-
type
|
|
43
|
-
type
|
|
44
|
-
type
|
|
45
|
-
type
|
|
46
|
-
type
|
|
47
|
-
type
|
|
48
|
-
type
|
|
49
|
-
type
|
|
50
|
-
type
|
|
51
|
-
type
|
|
52
|
-
type
|
|
40
|
+
type MiddlewareServerFn,
|
|
41
|
+
type AnyMiddleware,
|
|
42
|
+
type MiddlewareOptions,
|
|
43
|
+
type MiddlewareWithTypes,
|
|
44
|
+
type MiddlewareValidator,
|
|
45
|
+
type MiddlewareServer,
|
|
46
|
+
type MiddlewareAfterClient,
|
|
47
|
+
type MiddlewareAfterMiddleware,
|
|
48
|
+
type MiddlewareAfterServer,
|
|
49
|
+
type Middleware,
|
|
50
|
+
type MiddlewareClientFnOptions,
|
|
51
|
+
type MiddlewareClientFnResult,
|
|
52
|
+
type MiddlewareClientNextFn,
|
|
53
|
+
type ClientResultWithContext,
|
|
53
54
|
type AssignAllClientContextBeforeNext,
|
|
54
55
|
type AssignAllMiddleware,
|
|
55
56
|
type AssignAllServerContext,
|
|
56
|
-
type
|
|
57
|
-
type
|
|
58
|
-
type
|
|
59
|
-
type
|
|
60
|
-
type
|
|
61
|
-
type
|
|
62
|
-
type
|
|
57
|
+
type MiddlewareAfterValidator,
|
|
58
|
+
type MiddlewareClientFn,
|
|
59
|
+
type MiddlewareServerFnResult,
|
|
60
|
+
type MiddlewareClient,
|
|
61
|
+
type MiddlewareServerFnOptions,
|
|
62
|
+
type MiddlewareServerNextFn,
|
|
63
|
+
type ServerResultWithContext,
|
|
64
|
+
} from '@tanstack/start-client-core'
|
|
65
|
+
export {
|
|
66
|
+
registerGlobalMiddleware,
|
|
67
|
+
globalMiddleware,
|
|
63
68
|
} from '@tanstack/start-client-core'
|
|
69
|
+
export { serverOnly, clientOnly } from '@tanstack/start-client-core'
|
|
70
|
+
export { json } from '@tanstack/start-client-core'
|
|
64
71
|
export { Meta } from './Meta'
|
|
65
72
|
export { Scripts } from './Scripts'
|
|
66
73
|
export { StartClient } from './StartClient'
|
package/src/renderRSC.tsx
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// TODO: RSCs
|
|
2
2
|
// // @ts-expect-error
|
|
3
|
-
// import * as reactDom from 'react-server-dom/client'
|
|
3
|
+
// import * as reactDom from '@vinxi/react-server-dom/client'
|
|
4
4
|
// import { isValidElement } from 'solid-js'
|
|
5
5
|
import invariant from 'tiny-invariant'
|
|
6
6
|
import type * as Solid from 'solid-js'
|
|
File without changes
|
package/src/useServerFn.ts
CHANGED
|
@@ -17,8 +17,12 @@ export function useServerFn<T extends (...deps: Array<any>) => Promise<any>>(
|
|
|
17
17
|
return res
|
|
18
18
|
} catch (err) {
|
|
19
19
|
if (isRedirect(err)) {
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
const resolvedRedirect = router.resolveRedirect({
|
|
21
|
+
...err,
|
|
22
|
+
_fromLocation: router.state.location,
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
return router.navigate(resolvedRedirect)
|
|
22
26
|
}
|
|
23
27
|
|
|
24
28
|
throw err
|