@ereo/client 0.1.13 → 0.1.19

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.
@@ -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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
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
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ereo/client",
3
- "version": "0.1.13",
3
+ "version": "0.1.19",
4
4
  "license": "MIT",
5
5
  "author": "Ereo Team",
6
6
  "homepage": "https://ereo.dev",