hadars 0.1.40 → 0.2.1

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 (42) hide show
  1. package/README.md +85 -70
  2. package/cli-lib.ts +89 -12
  3. package/dist/chunk-HWOLYLPF.js +332 -0
  4. package/dist/{chunk-2ENP7IAW.js → chunk-LY5MTHFV.js} +360 -203
  5. package/dist/cli.js +506 -274
  6. package/dist/cloudflare.cjs +1394 -0
  7. package/dist/cloudflare.d.cts +64 -0
  8. package/dist/cloudflare.d.ts +64 -0
  9. package/dist/cloudflare.js +68 -0
  10. package/dist/{hadars-Bh-V5YXg.d.cts → hadars-DEBSYAQl.d.cts} +1 -36
  11. package/dist/{hadars-Bh-V5YXg.d.ts → hadars-DEBSYAQl.d.ts} +1 -36
  12. package/dist/index.cjs +129 -156
  13. package/dist/index.d.cts +5 -11
  14. package/dist/index.d.ts +5 -11
  15. package/dist/index.js +129 -155
  16. package/dist/lambda.cjs +391 -229
  17. package/dist/lambda.d.cts +1 -2
  18. package/dist/lambda.d.ts +1 -2
  19. package/dist/lambda.js +18 -307
  20. package/dist/slim-react/index.cjs +361 -203
  21. package/dist/slim-react/index.d.cts +24 -8
  22. package/dist/slim-react/index.d.ts +24 -8
  23. package/dist/slim-react/index.js +3 -1
  24. package/dist/ssr-render-worker.js +352 -221
  25. package/dist/utils/Head.tsx +132 -187
  26. package/package.json +7 -2
  27. package/src/build.ts +7 -6
  28. package/src/cloudflare.ts +139 -0
  29. package/src/index.tsx +0 -3
  30. package/src/lambda.ts +6 -2
  31. package/src/slim-react/context.ts +2 -1
  32. package/src/slim-react/index.ts +21 -18
  33. package/src/slim-react/render.ts +379 -240
  34. package/src/slim-react/renderContext.ts +105 -45
  35. package/src/ssr-render-worker.ts +14 -44
  36. package/src/types/hadars.ts +0 -1
  37. package/src/utils/Head.tsx +132 -187
  38. package/src/utils/cookies.ts +1 -1
  39. package/src/utils/response.tsx +68 -33
  40. package/src/utils/serve.ts +29 -27
  41. package/src/utils/ssrHandler.ts +54 -25
  42. package/src/utils/staticFile.ts +2 -7
@@ -96,9 +96,26 @@ interface RenderOptions {
96
96
  */
97
97
  declare function renderToStream(element: SlimNode, options?: RenderOptions): ReadableStream<Uint8Array>;
98
98
  /**
99
- * Convenience: render to a complete HTML string.
100
- * Retries the full tree when a component throws a Promise (Suspense protocol),
101
- * so useServerData and similar hooks work without requiring explicit <Suspense>.
99
+ * Pass-1 preflight render.
100
+ *
101
+ * Walks the component tree with a NullWriter (discards all HTML output) so
102
+ * that all `useServerData` promises are resolved into the `__hadarsUnsuspend`
103
+ * cache and all `context.head` mutations are applied.
104
+ *
105
+ * Components self-retry on suspension at the component level (see
106
+ * `renderComponent` catch block), so a single tree walk is sufficient.
107
+ *
108
+ * Call this before `renderToString` / `renderToStream` to guarantee a
109
+ * suspension-free, fully-synchronous second pass.
110
+ */
111
+ declare function renderPreflight(element: SlimNode, options?: RenderOptions): Promise<void>;
112
+ /**
113
+ * Render a component tree to a complete HTML string.
114
+ *
115
+ * Components self-retry on suspension at the component level (see
116
+ * `renderComponent` catch block), so a single tree walk is sufficient
117
+ * even when `useServerData` or similar hooks are used without an explicit
118
+ * `<Suspense>` wrapper.
102
119
  */
103
120
  declare function renderToString(element: SlimNode, options?: RenderOptions): Promise<string>;
104
121
 
@@ -115,10 +132,8 @@ declare const Suspense: symbol;
115
132
 
116
133
  declare function isValidElement(obj: unknown): obj is SlimElement;
117
134
  declare function cloneElement(element: SlimElement, overrideProps?: Record<string, any>, ...children: SlimNode[]): SlimElement;
118
- declare function forwardRef<P = any>(render: (props: P, ref: any) => SlimNode): (props: P & {
119
- ref?: any;
120
- }) => SlimNode;
121
- declare function memo<P = any>(component: (props: P) => SlimNode): (props: P) => SlimNode;
135
+ declare function forwardRef<P = any>(render: (props: P, ref: any) => SlimNode): any;
136
+ declare function memo<P = any>(component: (props: P) => SlimNode, compare?: (prevProps: P, nextProps: P) => boolean): any;
122
137
  declare function lazy<P = any>(factory: () => Promise<{
123
138
  default: (props: P) => SlimNode;
124
139
  }>): (props: P) => SlimNode;
@@ -184,7 +199,8 @@ declare const React: {
184
199
  renderToStream: typeof renderToStream;
185
200
  renderToString: typeof renderToString;
186
201
  renderToReadableStream: typeof renderToStream;
202
+ renderPreflight: typeof renderPreflight;
187
203
  version: string;
188
204
  };
189
205
 
190
- export { Children, Component, type Context, PureComponent, type RenderOptions, SlimElement, SlimNode, Suspense, cloneElement, createContext, createElement, React as default, forwardRef, isValidElement, lazy, memo, renderToStream as renderToReadableStream, renderToStream, renderToString, startTransition, use, useActionState, useCallback, useContext, useDebugValue, useDeferredValue, useEffect, useFormStatus, useId, useImperativeHandle, useInsertionEffect, useLayoutEffect, useMemo, useOptimistic, useReducer, useRef, useState, useSyncExternalStore, useTransition, version };
206
+ export { Children, Component, type Context, PureComponent, type RenderOptions, SlimElement, SlimNode, Suspense, cloneElement, createContext, createElement, React as default, forwardRef, isValidElement, lazy, memo, renderPreflight, renderToStream as renderToReadableStream, renderToStream, renderToString, startTransition, use, useActionState, useCallback, useContext, useDebugValue, useDeferredValue, useEffect, useFormStatus, useId, useImperativeHandle, useInsertionEffect, useLayoutEffect, useMemo, useOptimistic, useReducer, useRef, useState, useSyncExternalStore, useTransition, version };
@@ -96,9 +96,26 @@ interface RenderOptions {
96
96
  */
97
97
  declare function renderToStream(element: SlimNode, options?: RenderOptions): ReadableStream<Uint8Array>;
98
98
  /**
99
- * Convenience: render to a complete HTML string.
100
- * Retries the full tree when a component throws a Promise (Suspense protocol),
101
- * so useServerData and similar hooks work without requiring explicit <Suspense>.
99
+ * Pass-1 preflight render.
100
+ *
101
+ * Walks the component tree with a NullWriter (discards all HTML output) so
102
+ * that all `useServerData` promises are resolved into the `__hadarsUnsuspend`
103
+ * cache and all `context.head` mutations are applied.
104
+ *
105
+ * Components self-retry on suspension at the component level (see
106
+ * `renderComponent` catch block), so a single tree walk is sufficient.
107
+ *
108
+ * Call this before `renderToString` / `renderToStream` to guarantee a
109
+ * suspension-free, fully-synchronous second pass.
110
+ */
111
+ declare function renderPreflight(element: SlimNode, options?: RenderOptions): Promise<void>;
112
+ /**
113
+ * Render a component tree to a complete HTML string.
114
+ *
115
+ * Components self-retry on suspension at the component level (see
116
+ * `renderComponent` catch block), so a single tree walk is sufficient
117
+ * even when `useServerData` or similar hooks are used without an explicit
118
+ * `<Suspense>` wrapper.
102
119
  */
103
120
  declare function renderToString(element: SlimNode, options?: RenderOptions): Promise<string>;
104
121
 
@@ -115,10 +132,8 @@ declare const Suspense: symbol;
115
132
 
116
133
  declare function isValidElement(obj: unknown): obj is SlimElement;
117
134
  declare function cloneElement(element: SlimElement, overrideProps?: Record<string, any>, ...children: SlimNode[]): SlimElement;
118
- declare function forwardRef<P = any>(render: (props: P, ref: any) => SlimNode): (props: P & {
119
- ref?: any;
120
- }) => SlimNode;
121
- declare function memo<P = any>(component: (props: P) => SlimNode): (props: P) => SlimNode;
135
+ declare function forwardRef<P = any>(render: (props: P, ref: any) => SlimNode): any;
136
+ declare function memo<P = any>(component: (props: P) => SlimNode, compare?: (prevProps: P, nextProps: P) => boolean): any;
122
137
  declare function lazy<P = any>(factory: () => Promise<{
123
138
  default: (props: P) => SlimNode;
124
139
  }>): (props: P) => SlimNode;
@@ -184,7 +199,8 @@ declare const React: {
184
199
  renderToStream: typeof renderToStream;
185
200
  renderToString: typeof renderToString;
186
201
  renderToReadableStream: typeof renderToStream;
202
+ renderPreflight: typeof renderPreflight;
187
203
  version: string;
188
204
  };
189
205
 
190
- export { Children, Component, type Context, PureComponent, type RenderOptions, SlimElement, SlimNode, Suspense, cloneElement, createContext, createElement, React as default, forwardRef, isValidElement, lazy, memo, renderToStream as renderToReadableStream, renderToStream, renderToString, startTransition, use, useActionState, useCallback, useContext, useDebugValue, useDeferredValue, useEffect, useFormStatus, useId, useImperativeHandle, useInsertionEffect, useLayoutEffect, useMemo, useOptimistic, useReducer, useRef, useState, useSyncExternalStore, useTransition, version };
206
+ export { Children, Component, type Context, PureComponent, type RenderOptions, SlimElement, SlimNode, Suspense, cloneElement, createContext, createElement, React as default, forwardRef, isValidElement, lazy, memo, renderPreflight, renderToStream as renderToReadableStream, renderToStream, renderToString, startTransition, use, useActionState, useCallback, useContext, useDebugValue, useDeferredValue, useEffect, useFormStatus, useId, useImperativeHandle, useInsertionEffect, useLayoutEffect, useMemo, useOptimistic, useReducer, useRef, useState, useSyncExternalStore, useTransition, version };
@@ -9,6 +9,7 @@ import {
9
9
  isValidElement,
10
10
  lazy,
11
11
  memo,
12
+ renderPreflight,
12
13
  renderToStream,
13
14
  renderToString,
14
15
  slim_react_default,
@@ -33,7 +34,7 @@ import {
33
34
  useSyncExternalStore,
34
35
  useTransition,
35
36
  version
36
- } from "../chunk-2ENP7IAW.js";
37
+ } from "../chunk-LY5MTHFV.js";
37
38
  import {
38
39
  FRAGMENT_TYPE,
39
40
  Fragment,
@@ -62,6 +63,7 @@ export {
62
63
  jsx as jsxs,
63
64
  lazy,
64
65
  memo,
66
+ renderPreflight,
65
67
  renderToStream as renderToReadableStream,
66
68
  renderToStream,
67
69
  renderToString,