@ereo/client 0.1.13 → 0.1.20
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/dist/await.d.ts +94 -0
- package/dist/await.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +71 -0
- package/package.json +1 -1
package/dist/await.d.ts
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ereo/client - Await Component for Streaming SSR
|
|
3
|
+
*
|
|
4
|
+
* Used with React Suspense to render deferred data from loaders.
|
|
5
|
+
* Works with the `defer()` function from @ereo/data.
|
|
6
|
+
*/
|
|
7
|
+
import { type ReactNode, type ReactElement } from 'react';
|
|
8
|
+
/**
|
|
9
|
+
* Deferred data structure from @ereo/data defer() function.
|
|
10
|
+
*/
|
|
11
|
+
export interface DeferredData<T> {
|
|
12
|
+
promise: Promise<T>;
|
|
13
|
+
status: 'pending' | 'resolved' | 'rejected';
|
|
14
|
+
value?: T;
|
|
15
|
+
error?: Error;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Props for the Await component.
|
|
19
|
+
*/
|
|
20
|
+
export interface AwaitProps<T> {
|
|
21
|
+
/**
|
|
22
|
+
* The deferred data promise to resolve.
|
|
23
|
+
* Usually comes from a loader using `defer()`.
|
|
24
|
+
*/
|
|
25
|
+
resolve: DeferredData<T> | Promise<T>;
|
|
26
|
+
/**
|
|
27
|
+
* Render function called with resolved data.
|
|
28
|
+
* Also accepts a React element directly.
|
|
29
|
+
*/
|
|
30
|
+
children: ((data: T) => ReactNode) | ReactNode;
|
|
31
|
+
/**
|
|
32
|
+
* Optional fallback UI to show when the promise rejects.
|
|
33
|
+
* If not provided, the error will propagate to the nearest error boundary.
|
|
34
|
+
*/
|
|
35
|
+
errorElement?: ReactNode;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Await component for rendering deferred data in streaming SSR.
|
|
39
|
+
*
|
|
40
|
+
* Must be used inside a `<Suspense>` boundary.
|
|
41
|
+
* Works with deferred data from `@ereo/data`'s `defer()` function.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```tsx
|
|
45
|
+
* import { Suspense } from 'react';
|
|
46
|
+
* import { Await } from '@ereo/client';
|
|
47
|
+
* import { defer, createLoader } from '@ereo/data';
|
|
48
|
+
*
|
|
49
|
+
* export const loader = createLoader({
|
|
50
|
+
* load: async () => ({
|
|
51
|
+
* // Critical data loaded immediately
|
|
52
|
+
* post: await db.posts.find(id),
|
|
53
|
+
* // Non-critical data deferred
|
|
54
|
+
* comments: defer(db.comments.findByPost(id)),
|
|
55
|
+
* })
|
|
56
|
+
* });
|
|
57
|
+
*
|
|
58
|
+
* export default function Post({ loaderData }) {
|
|
59
|
+
* return (
|
|
60
|
+
* <article>
|
|
61
|
+
* <h1>{loaderData.post.title}</h1>
|
|
62
|
+
*
|
|
63
|
+
* <Suspense fallback={<CommentsSkeleton />}>
|
|
64
|
+
* <Await resolve={loaderData.comments}>
|
|
65
|
+
* {(comments) => <CommentList comments={comments} />}
|
|
66
|
+
* </Await>
|
|
67
|
+
* </Suspense>
|
|
68
|
+
* </article>
|
|
69
|
+
* );
|
|
70
|
+
* }
|
|
71
|
+
* ```
|
|
72
|
+
*
|
|
73
|
+
* @example With error handling
|
|
74
|
+
* ```tsx
|
|
75
|
+
* <Suspense fallback={<Loading />}>
|
|
76
|
+
* <Await
|
|
77
|
+
* resolve={loaderData.comments}
|
|
78
|
+
* errorElement={<div>Failed to load comments</div>}
|
|
79
|
+
* >
|
|
80
|
+
* {(comments) => <CommentList comments={comments} />}
|
|
81
|
+
* </Await>
|
|
82
|
+
* </Suspense>
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export declare function Await<T>({ resolve, children, errorElement, }: AwaitProps<T>): ReactElement;
|
|
86
|
+
/**
|
|
87
|
+
* Helper to resolve deferred data.
|
|
88
|
+
* Can be used in loaders or components to wait for deferred data.
|
|
89
|
+
*
|
|
90
|
+
* @param deferred - The deferred data to resolve
|
|
91
|
+
* @returns Promise that resolves to the data
|
|
92
|
+
*/
|
|
93
|
+
export declare function resolveAwait<T>(deferred: DeferredData<T>): Promise<T>;
|
|
94
|
+
//# sourceMappingURL=await.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"await.d.ts","sourceRoot":"","sources":["../src/await.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAc,EACZ,KAAK,SAAS,EACd,KAAK,YAAY,EAGlB,MAAM,OAAO,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;IAC5C,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B;;;OAGG;IACH,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEtC;;;OAGG;IACH,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IAE/C;;;OAGG;IACH,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AA0FD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,EACvB,OAAO,EACP,QAAQ,EACR,YAAY,GACb,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,YAAY,CAS9B;AAcD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAE3E"}
|
package/dist/index.d.ts
CHANGED
|
@@ -24,6 +24,8 @@ export { Form, FormProvider, useFormContext, useSubmit, useFetcher, useActionDat
|
|
|
24
24
|
export type { FormProps, ActionResult, SubmissionState, SubmitOptions, FetcherState, Fetcher, FormContextValue, FormNavigationState, } from './form';
|
|
25
25
|
export { ErrorBoundary, RouteErrorBoundary, useErrorBoundary, useRouteError, isRouteErrorResponse, createRouteErrorResponse, withErrorBoundary, RouteError, } from './error-boundary';
|
|
26
26
|
export type { ErrorBoundaryProps, RouteErrorResponse, RouteErrorBoundaryProps, UseErrorBoundaryReturn, } from './error-boundary';
|
|
27
|
+
export { Await, resolveAwait } from './await';
|
|
28
|
+
export type { AwaitProps, DeferredData } from './await';
|
|
27
29
|
/**
|
|
28
30
|
* Initialize the client runtime.
|
|
29
31
|
* Call this in your entry point.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,OAAO,EAEL,aAAa,EACb,aAAa,EACb,aAAa,EACb,QAAQ,EAER,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EAEf,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EAEZ,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,YAAY,GACb,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,cAAc,EACd,cAAc,EACd,uBAAuB,EACvB,kBAAkB,EAClB,wBAAwB,EACxB,YAAY,EACZ,iBAAiB,EACjB,cAAc,GACf,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGpD,OAAO,EACL,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,sBAAsB,GACvB,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGzF,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGrE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAEpD,YAAY,EACV,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,QAAQ,GACT,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,kBAAkB,IAAI,uBAAuB,GAC9C,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,QAAQ,EACR,aAAa,EACb,sBAAsB,EACtB,oBAAoB,EACpB,MAAM,IAAI,WAAW,EACrB,SAAS,IAAI,cAAc,EAC3B,EAAE,EACF,aAAa,EACb,YAAY,GACb,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,IAAI,EACJ,YAAY,EACZ,cAAc,EACd,SAAS,EACT,UAAU,EACV,aAAa,IAAI,iBAAiB,EAClC,aAAa,IAAI,iBAAiB,EAClC,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,QAAQ,CAAC;AAEhB,YAAY,EACV,SAAS,EACT,YAAY,EACZ,eAAe,EACf,aAAa,EACb,YAAY,EACZ,OAAO,EACP,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,EACjB,UAAU,GACX,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1985,6 +1985,75 @@ class RouteError extends Error {
|
|
|
1985
1985
|
};
|
|
1986
1986
|
}
|
|
1987
1987
|
}
|
|
1988
|
+
// src/await.tsx
|
|
1989
|
+
import { jsxDEV as jsxDEV3, Fragment } from "react/jsx-dev-runtime";
|
|
1990
|
+
var promiseCache = new WeakMap;
|
|
1991
|
+
function trackPromise(promise) {
|
|
1992
|
+
let tracked = promiseCache.get(promise);
|
|
1993
|
+
if (!tracked) {
|
|
1994
|
+
tracked = { status: "pending" };
|
|
1995
|
+
promiseCache.set(promise, tracked);
|
|
1996
|
+
promise.then((value) => {
|
|
1997
|
+
tracked.status = "fulfilled";
|
|
1998
|
+
tracked.value = value;
|
|
1999
|
+
}, (reason) => {
|
|
2000
|
+
tracked.status = "rejected";
|
|
2001
|
+
tracked.reason = reason;
|
|
2002
|
+
});
|
|
2003
|
+
}
|
|
2004
|
+
if (tracked.status === "pending") {
|
|
2005
|
+
throw promise;
|
|
2006
|
+
}
|
|
2007
|
+
if (tracked.status === "rejected") {
|
|
2008
|
+
throw tracked.reason;
|
|
2009
|
+
}
|
|
2010
|
+
return tracked.value;
|
|
2011
|
+
}
|
|
2012
|
+
function AwaitInner({
|
|
2013
|
+
promise,
|
|
2014
|
+
children,
|
|
2015
|
+
errorElement
|
|
2016
|
+
}) {
|
|
2017
|
+
try {
|
|
2018
|
+
const data = trackPromise(promise);
|
|
2019
|
+
if (typeof children === "function") {
|
|
2020
|
+
return /* @__PURE__ */ jsxDEV3(Fragment, {
|
|
2021
|
+
children: children(data)
|
|
2022
|
+
}, undefined, false, undefined, this);
|
|
2023
|
+
}
|
|
2024
|
+
return /* @__PURE__ */ jsxDEV3(Fragment, {
|
|
2025
|
+
children
|
|
2026
|
+
}, undefined, false, undefined, this);
|
|
2027
|
+
} catch (error) {
|
|
2028
|
+
if (error instanceof Promise) {
|
|
2029
|
+
throw error;
|
|
2030
|
+
}
|
|
2031
|
+
if (errorElement !== undefined) {
|
|
2032
|
+
return /* @__PURE__ */ jsxDEV3(Fragment, {
|
|
2033
|
+
children: errorElement
|
|
2034
|
+
}, undefined, false, undefined, this);
|
|
2035
|
+
}
|
|
2036
|
+
throw error;
|
|
2037
|
+
}
|
|
2038
|
+
}
|
|
2039
|
+
function Await({
|
|
2040
|
+
resolve,
|
|
2041
|
+
children,
|
|
2042
|
+
errorElement
|
|
2043
|
+
}) {
|
|
2044
|
+
const promise = isDeferredData(resolve) ? resolve.promise : resolve;
|
|
2045
|
+
return /* @__PURE__ */ jsxDEV3(AwaitInner, {
|
|
2046
|
+
promise,
|
|
2047
|
+
errorElement,
|
|
2048
|
+
children
|
|
2049
|
+
}, undefined, false, undefined, this);
|
|
2050
|
+
}
|
|
2051
|
+
function isDeferredData(value) {
|
|
2052
|
+
return typeof value === "object" && value !== null && "promise" in value && "status" in value;
|
|
2053
|
+
}
|
|
2054
|
+
async function resolveAwait(deferred) {
|
|
2055
|
+
return deferred.promise;
|
|
2056
|
+
}
|
|
1988
2057
|
|
|
1989
2058
|
// src/index.ts
|
|
1990
2059
|
function initClient() {
|
|
@@ -2024,6 +2093,7 @@ export {
|
|
|
2024
2093
|
setupAutoPrefetch,
|
|
2025
2094
|
serializeFormData,
|
|
2026
2095
|
router,
|
|
2096
|
+
resolveAwait,
|
|
2027
2097
|
resetIslandCounter,
|
|
2028
2098
|
registerIslandComponents,
|
|
2029
2099
|
registerIslandComponent,
|
|
@@ -2079,6 +2149,7 @@ export {
|
|
|
2079
2149
|
ErrorContext,
|
|
2080
2150
|
ErrorBoundary,
|
|
2081
2151
|
EreoProvider,
|
|
2152
|
+
Await,
|
|
2082
2153
|
ActionDataProvider,
|
|
2083
2154
|
ActionDataContext
|
|
2084
2155
|
};
|