@alepha/react 0.14.4 → 0.15.0

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 CHANGED
@@ -10,3 +10,13 @@ This package is part of the Alepha framework and can be installed via the all-in
10
10
  npm install alepha
11
11
  ```
12
12
 
13
+ ## API Reference
14
+
15
+ ### Environment Variables
16
+
17
+ Environment variables used to configure this package.
18
+
19
+ | Variable | Type | Default | Description |
20
+ |----------|------|---------|-------------|
21
+ | `REACT_SSR_ENABLED` | boolean | - | |
22
+ | `REACT_STRICT_MODE` | boolean | true | |
@@ -41,10 +41,10 @@ declare class ReactAuth {
41
41
  protected readonly onBeginTransition: alepha2.HookPrimitive<"react:transition:begin">;
42
42
  protected readonly onFetchRequest: alepha2.HookPrimitive<"client:onRequest">;
43
43
  /**
44
- * Get the current authenticated user.
45
- *
46
- * Alias for `alepha.state.get("user")`
47
- */
44
+ * Get the current authenticated user.
45
+ *
46
+ * Alias for `alepha.state.get("user")`
47
+ */
48
48
  get user(): UserAccountToken | undefined;
49
49
  ping(): Promise<{
50
50
  name?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/auth/hooks/useAuth.ts","../../src/auth/services/ReactAuth.ts","../../src/auth/providers/ReactAuthProvider.ts","../../src/auth/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;cAIa;;;;;;;;IAAA,KAAA,CA2BZ,EAAA,MAAA,EAAA,GAAA,SAAA;IAjBqB,EAAA,EAAA,MAAA;EAOf,CAAA,GAAA,SAAA;EAK6B,MAAA,EAAA,GAAA,GAAA,IAAA;EAAlB,KAAA,EAAA,CAAA,QAAA,EAAA,MAZI,CAYJ,EAAA,OCfI,CDeJ,EAAA;IAAiB,QAAA,CAAA,EAAA,MAAA;;;;ICftB,CAAA,KAAA,EAAS,MAAA,CAAA,EAAA,GAAA;EAAA,CAAA,EAAA,GDUf,OCTiB,CAAA,IAAA,CAAA;EACG,GAAA,EAAA,CAAA,YAAA,MAAA,GAAA,GAAA,CAAA,CAAA,IAAA,EAAA,MDaT,iBCbS,CDaS,GCbT,CAAA,EAAA,GAAA,OAAA;CACI;;;;;;cAHlB,SAAA;EDPA,mBA2BZ,GAAA,ECpBqB,cAAA,CACE,MDmBvB;EAjBqB,mBAAA,MAAA,ECDK,MDCL;EAOf,mBAAA,UAAA,ECPwB,UDOxB;EAK6B,mBAAA,YAAA,ECXH,YDWG;EAAlB,mBAAA,iBAAA,ECXe,OAAA,CAEK,aDSpB,CAAA,wBAAA,CAAA;EAAiB,mBAAA,cAAA,ECTG,OAAA,CAWH,aDFA,CAAA,kBAAA,CAAA;;;;ACfnC;;EAE2B,IAAA,IAAA,CAAA,CAAA,EA8BN,gBA9BM,GAAA,SAAA;EACI,IAAA,CAAA,CAAA,EAiCZ,OAjCY,CAAA;IACE,IAAA,CAAA,EAAA,MAAA,GAAA,SAAA;IAAA,KAEK,CAAA,EAAA,MAAA,GAAA,SAAA;IAAA,QAWH,CAAA,EAAA,MAAA,GAAA,SAAA;IAed,OAAA,CAAA,EAAA,MAAA,GAAA,SAAA;IAIF,SAAA,CAAA,EAAA,MAAA,GAAA,SAAA;IA6BN,aAAA,CAAA,EAAA,MAAA,EAAA,GAAA,SAAA;IAAR,KAAA,CAAA,EAAA,MAAA,EAAA,GAAA,SAAA;IAAO,EAAA,EAAA,MAAA;;;;IC1EC,QAAA,CAAA,EAAA,MAAiB;;;;ICSmB,KAAA,CAAA,EAAA,MAAA;IAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EAAA,GAAA;MFiE5C,OE3DM,CF2DE,ME3DS,CAAA;EAAA,MAAA,CAAA,CAAA,EAAA,IAAA;;;;cDfT,iBAAA;6BACc;qBAAA,OAAA,CAED;;;;;;WCYf;;;;AHbX;;;;;AAsBmC,cGGtB,eHHsB,EGGP,OAAA,CAAA,OHHO,CGOjC,OAAA,CAJ0B,MAAA,CHHO"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/auth/hooks/useAuth.ts","../../src/auth/services/ReactAuth.ts","../../src/auth/providers/ReactAuthProvider.ts","../../src/auth/index.ts"],"mappings":";;;;;;;;;cAIa,OAAA;EAAA,IAAA;IAAA,IAAA;IAAA,KAAA;IAAA,QAAA;IAAA,OAAA;IAAA,SAAA;IAAA,aAAA;IAAA,KAAA;IAAA,EAAA;EAAA;EAAA,MAAA;EAAA,KAAA,GAAA,QAAA,QAUS,CAAA,EAAA,OAAA;IAAA,QAAA;IAAA,QAAA;IAAA,QAAA;IAAA,KAAA;IAAA,CAAA,KAAA;EAAA,MAOf,OAAA;EAAA,GAAA,6BAAA,IAAA,QAKW,iBAAA,CAAkB,GAAA;AAAA;;;;ACfpC;;cAAa,SAAA;EAAA,mBAAA,GAAA,EAAS,cAAA,CACE,MAAA;EAAA,mBAAA,MAAA,EACG,MAAA;EAAA,mBAAA,UAAA,EACI,UAAA;EAAA,mBAAA,YAAA,EACE,YAAA;EAAA,mBAAA,iBAAA,EAAA,OAAA,CAEK,aAAA;EAAA,mBAAA,cAAA,EAAA,OAAA,CAWH,aAAA;EAAA;;;;;EAAA,IAAA,KAAA,GAed,gBAAA;EAAA,KAAA,GAIF,OAAA;IAAA,IAAA;IAAA,KAAA;IAAA,QAAA;IAAA,OAAA;IAAA,SAAA;IAAA,aAAA;IAAA,KAAA;IAAA,EAAA;EAAA;EAAA,IAAA,MAAA;EAAA,MAAA,QAAA,UAAA,OAAA;IAAA,QAAA;IAAA,QAAA;IAAA,QAAA;IAAA,QAAA;IAAA,KAAA;IAAA,CAAA,KAAA;EAAA,IA6Bd,OAAA,CAAQ,MAAA;EAAA,OAAA;AAAA;;;cC1EA,iBAAA;EAAA,mBAAA,MAAA,EACc,MAAA;EAAA,SAAA,QAAA,EAAA,OAAA,CAED,aAAA;AAAA;;;;;WCYf,WAAA;EAAA;AAAA;AAAA;;;AAYX;;;AAZW,cAYE,eAAA,EAAe,OAAA,CAAA,OAAA,CAI1B,OAAA,CAJ0B,MAAA"}
@@ -1735,23 +1735,19 @@ var ReactServerTemplateProvider = class {
1735
1735
  */
1736
1736
  buildHydrationData(state) {
1737
1737
  const { request, context, ...store } = this.alepha.context.als?.getStore() ?? {};
1738
- return {
1739
- ...store,
1740
- "alepha.react.router.state": void 0,
1741
- layers: state.layers.map((layer) => ({
1742
- ...layer,
1743
- error: layer.error ? {
1744
- ...layer.error,
1745
- name: layer.error.name,
1746
- message: layer.error.message,
1747
- stack: !this.alepha.isProduction() ? layer.error.stack : void 0
1748
- } : void 0,
1749
- index: void 0,
1750
- path: void 0,
1751
- element: void 0,
1752
- route: void 0
1753
- }))
1754
- };
1738
+ const hydrationData = { layers: state.layers.map((layer) => ({
1739
+ name: layer.name,
1740
+ props: layer.props,
1741
+ config: layer.config,
1742
+ error: layer.error ? {
1743
+ ...layer.error,
1744
+ name: layer.error.name,
1745
+ message: layer.error.message,
1746
+ stack: !this.alepha.isProduction() ? layer.error.stack : void 0
1747
+ } : void 0
1748
+ })) };
1749
+ for (const [key, value] of Object.entries(store)) if (key.charAt(0) !== "_" && key !== "alepha.react.router.state" && key !== "registry") hydrationData[key] = value;
1750
+ return hydrationData;
1755
1751
  }
1756
1752
  /**
1757
1753
  * Encode a string to Uint8Array using the shared encoder.
@@ -1882,7 +1878,7 @@ var ReactServerTemplateProvider = class {
1882
1878
  * @param options - Streaming options
1883
1879
  */
1884
1880
  createEarlyHtmlStream(globalHead, asyncWork, options = {}) {
1885
- const { hydration = true, onError, onRedirect } = options;
1881
+ const { hydration = true, onError } = options;
1886
1882
  const slots = this.getSlots();
1887
1883
  const encoder = this.encoder;
1888
1884
  return new ReadableStream({ start: async (controller) => {
@@ -1894,7 +1890,11 @@ var ReactServerTemplateProvider = class {
1894
1890
  controller.enqueue(slots.headOpen);
1895
1891
  if (this.earlyHeadContent) controller.enqueue(encoder.encode(this.earlyHeadContent));
1896
1892
  const result = await asyncWork();
1897
- if (!result) {
1893
+ if (!result || "redirect" in result) {
1894
+ if (result && "redirect" in result) {
1895
+ this.log.debug("Loader redirect detected after streaming started, using meta refresh", { redirect: result.redirect });
1896
+ controller.enqueue(encoder.encode(`<meta http-equiv="refresh" content="0; url=${this.escapeHtml(result.redirect)}">\n`));
1897
+ }
1898
1898
  controller.enqueue(slots.headClose);
1899
1899
  controller.enqueue(encoder.encode("<body></body></html>"));
1900
1900
  controller.close();
@@ -2238,7 +2238,6 @@ var ReactServerProvider = class {
2238
2238
  handler: async () => {
2239
2239
  const ssrEnabled = this.alepha.primitives($page).length > 0 && this.env.REACT_SSR_ENABLED !== false;
2240
2240
  this.alepha.store.set("alepha.react.server.ssr", ssrEnabled);
2241
- if (ssrEnabled) this.log.info("SSR streaming enabled");
2242
2241
  if (this.alepha.isViteDev()) {
2243
2242
  await this.configureVite(ssrEnabled);
2244
2243
  return;
@@ -2399,10 +2398,7 @@ var ReactServerProvider = class {
2399
2398
  const globalHead = this.serverHeadProvider.resolveGlobalHead();
2400
2399
  const htmlStream = this.templateProvider.createEarlyHtmlStream(globalHead, async () => {
2401
2400
  const result = await this.renderPage(route, state);
2402
- if (result.redirect) {
2403
- reply.redirect(result.redirect);
2404
- return null;
2405
- }
2401
+ if (result.redirect) return { redirect: result.redirect };
2406
2402
  return {
2407
2403
  state,
2408
2404
  reactStream: result.reactStream
@@ -2434,9 +2430,7 @@ var ReactServerProvider = class {
2434
2430
  * @returns Render result with redirect or React stream
2435
2431
  */
2436
2432
  async renderPage(route, state) {
2437
- this.serverTimingProvider.beginTiming("createLayers");
2438
2433
  const { redirect } = await this.pageApi.createLayers(route, state);
2439
- this.serverTimingProvider.endTiming("createLayers");
2440
2434
  if (redirect) {
2441
2435
  this.log.debug("Resolver resulted in redirection", { redirect });
2442
2436
  return { redirect };
@@ -2447,15 +2441,12 @@ var ReactServerProvider = class {
2447
2441
  state.head ??= {};
2448
2442
  state.head.link = [...state.head.link ?? [], ...preloadLinks];
2449
2443
  }
2450
- this.serverTimingProvider.beginTiming("renderToStream");
2451
2444
  const element = this.pageApi.root(state);
2452
2445
  this.alepha.store.set("alepha.react.router.state", state);
2453
- const reactStream = await renderToReadableStream(element, { onError: (error) => {
2446
+ return { reactStream: await renderToReadableStream(element, { onError: (error) => {
2454
2447
  if (error instanceof Redirection) this.log.warn("Redirect during streaming ignored", { redirect: error.redirect });
2455
2448
  else this.log.error("Streaming render error", error);
2456
- } });
2457
- this.serverTimingProvider.endTiming("renderToStream");
2458
- return { reactStream };
2449
+ } }) };
2459
2450
  }
2460
2451
  /**
2461
2452
  * For testing purposes, renders a page to HTML string.