@alepha/react 0.7.6 → 0.7.7

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.
@@ -1,17 +1,18 @@
1
+ import * as _alepha_core1 from "@alepha/core";
2
+ import * as _alepha_core5 from "@alepha/core";
1
3
  import * as _alepha_core7 from "@alepha/core";
2
- import * as _alepha_core0 from "@alepha/core";
3
- import * as _alepha_core2 from "@alepha/core";
4
4
  import { Alepha, Async, KIND, Module, OPTIONS, Service, Static, TObject, TSchema } from "@alepha/core";
5
5
  import { Route, RouterProvider } from "@alepha/router";
6
- import * as react14 from "react";
7
- import * as react15 from "react";
6
+ import * as react12 from "react";
7
+ import * as react13 from "react";
8
8
  import React, { AnchorHTMLAttributes, ErrorInfo, FC, PropsWithChildren, ReactNode } from "react";
9
- import * as react_jsx_runtime12 from "react/jsx-runtime";
10
- import * as react_jsx_runtime13 from "react/jsx-runtime";
11
- import { ApiLinksResponse, ClientScope, HttpClient, HttpVirtualClient, ServerRequest } from "@alepha/server";
9
+ import * as react_jsx_runtime10 from "react/jsx-runtime";
10
+ import * as react_jsx_runtime11 from "react/jsx-runtime";
11
+ import { ClientScope, HttpVirtualClient, LinkProvider } from "@alepha/server-links";
12
12
  import { Root } from "react-dom/client";
13
+ import { ApiLinksResponse, ServerRequest } from "@alepha/server";
13
14
  import { ServerRouteCache } from "@alepha/server-cache";
14
- import * as _sinclair_typebox6 from "@sinclair/typebox";
15
+ import * as _sinclair_typebox0 from "@sinclair/typebox";
15
16
 
16
17
  //#region src/components/ClientOnly.d.ts
17
18
  interface ClientOnlyProps {
@@ -71,14 +72,14 @@ declare class ErrorBoundary extends React.Component<PropsWithChildren<ErrorBound
71
72
  }
72
73
  //#endregion
73
74
  //#region src/providers/PageDescriptorProvider.d.ts
74
- declare const envSchema: _alepha_core7.TObject<{
75
- REACT_STRICT_MODE: _sinclair_typebox6.TBoolean;
75
+ declare const envSchema: _alepha_core1.TObject<{
76
+ REACT_STRICT_MODE: _sinclair_typebox0.TBoolean;
76
77
  }>;
77
78
  declare module "@alepha/core" {
78
79
  interface Env extends Partial<Static<typeof envSchema>> {}
79
80
  }
80
81
  declare class PageDescriptorProvider {
81
- protected readonly log: _alepha_core7.Logger;
82
+ protected readonly log: _alepha_core1.Logger;
82
83
  protected readonly env: {
83
84
  REACT_STRICT_MODE: boolean;
84
85
  };
@@ -94,7 +95,6 @@ declare class PageDescriptorProvider {
94
95
  createLayers(route: PageRoute, request: PageRequest): Promise<CreateLayersResult>;
95
96
  protected getErrorHandler(route: PageRoute): ((error: Error) => ReactNode) | undefined;
96
97
  protected createElement(page: PageRoute, props: Record<string, any>): Promise<ReactNode>;
97
- protected fillHead(page: PageRoute, ctx: PageRequest, props: Record<string, any>): void;
98
98
  renderError(error: Error): ReactNode;
99
99
  renderEmptyView(): ReactNode;
100
100
  href(page: {
@@ -104,7 +104,7 @@ declare class PageDescriptorProvider {
104
104
  }, params?: Record<string, any>): string;
105
105
  compile(path: string, params?: Record<string, string>): string;
106
106
  protected renderView(index: number, path: string, view: ReactNode | undefined, page: PageRoute): ReactNode;
107
- protected readonly configure: _alepha_core7.HookDescriptor<"configure">;
107
+ protected readonly configure: _alepha_core1.HookDescriptor<"configure">;
108
108
  protected map(pages: Array<{
109
109
  value: {
110
110
  [OPTIONS]: PageDescriptorOptions;
@@ -140,6 +140,7 @@ interface Layer {
140
140
  element: ReactNode;
141
141
  index: number;
142
142
  path: string;
143
+ route?: PageRoute;
143
144
  }
144
145
  type PreviousLayerData = Omit<Layer, "element" | "index" | "path">;
145
146
  interface AnchorProps {
@@ -181,7 +182,6 @@ interface CreateLayersResult extends RouterState {
181
182
  */
182
183
  interface PageReactContext {
183
184
  url: URL;
184
- head: Head;
185
185
  onError: (error: Error) => ReactNode;
186
186
  links?: ApiLinksResponse;
187
187
  }
@@ -264,7 +264,6 @@ interface PageDescriptorOptions<TConfig extends PageConfigSchema = PageConfigSch
264
264
  [OPTIONS]: PageDescriptorOptions<PageConfigSchema, TPropsParent>;
265
265
  };
266
266
  can?: () => boolean;
267
- head?: Head | ((props: TProps, previous?: Head) => Head);
268
267
  errorHandler?: (error: Error) => ReactNode;
269
268
  prerender?: boolean | {
270
269
  entries?: Array<Partial<PageRequestConfig<TConfig>>>;
@@ -295,49 +294,13 @@ declare const $page: {
295
294
  interface PageDescriptorRenderOptions {
296
295
  params?: Record<string, string>;
297
296
  query?: Record<string, string>;
298
- withLayout?: boolean;
297
+ html?: boolean;
298
+ hydration?: boolean;
299
299
  }
300
300
  interface PageDescriptorRenderResult {
301
301
  html: string;
302
302
  context: PageReactContext;
303
303
  }
304
- interface Head {
305
- title?: string;
306
- description?: string;
307
- titleSeparator?: string;
308
- htmlAttributes?: Record<string, string>;
309
- bodyAttributes?: Record<string, string>;
310
- meta?: Array<{
311
- name: string;
312
- content: string;
313
- }>;
314
- keywords?: string[];
315
- author?: string;
316
- robots?: string;
317
- themeColor?: string;
318
- viewport?: string | {
319
- width?: string;
320
- height?: string;
321
- initialScale?: string;
322
- maximumScale?: string;
323
- userScalable?: "no" | "yes" | "0" | "1";
324
- interactiveWidget?: "resizes-visual" | "resizes-content" | "overlays-content";
325
- };
326
- og?: {
327
- title?: string;
328
- description?: string;
329
- image?: string;
330
- url?: string;
331
- type?: string;
332
- };
333
- twitter?: {
334
- card?: string;
335
- title?: string;
336
- description?: string;
337
- image?: string;
338
- site?: string;
339
- };
340
- }
341
304
  interface PageRequestConfig<TConfig extends PageConfigSchema = PageConfigSchema> {
342
305
  params: TConfig["params"] extends TSchema ? Static<TConfig["params"]> : Record<string, string>;
343
306
  query: TConfig["query"] extends TSchema ? Static<TConfig["query"]> : Record<string, string>;
@@ -349,7 +312,7 @@ interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
349
312
  to: string | PageDescriptor;
350
313
  children?: React.ReactNode;
351
314
  }
352
- declare const Link: (props: LinkProps) => react_jsx_runtime12.JSX.Element | null;
315
+ declare const Link: (props: LinkProps) => react_jsx_runtime10.JSX.Element | null;
353
316
  //#endregion
354
317
  //#region src/components/NestedView.d.ts
355
318
  interface NestedViewProps {
@@ -376,7 +339,7 @@ interface NestedViewProps {
376
339
  * }
377
340
  * ```
378
341
  */
379
- declare const NestedView: (props: NestedViewProps) => react_jsx_runtime13.JSX.Element;
342
+ declare const NestedView: (props: NestedViewProps) => react_jsx_runtime11.JSX.Element;
380
343
  //#endregion
381
344
  //#region src/contexts/RouterContext.d.ts
382
345
  interface RouterContextValue {
@@ -384,52 +347,35 @@ interface RouterContextValue {
384
347
  state: RouterState;
385
348
  context: PageReactContext;
386
349
  }
387
- declare const RouterContext: react14.Context<RouterContextValue | undefined>;
350
+ declare const RouterContext: react12.Context<RouterContextValue | undefined>;
388
351
  //#endregion
389
352
  //#region src/contexts/RouterLayerContext.d.ts
390
353
  interface RouterLayerContextValue {
391
354
  index: number;
392
355
  path: string;
393
356
  }
394
- declare const RouterLayerContext: react15.Context<RouterLayerContextValue | undefined>;
395
- //#endregion
396
- //#region src/providers/ServerHeadProvider.d.ts
397
- interface Head$1 {
398
- title?: string;
399
- htmlAttributes?: Record<string, string>;
400
- bodyAttributes?: Record<string, string>;
401
- meta?: Array<{
402
- name: string;
403
- content: string;
404
- }>;
405
- }
406
- //#endregion
407
- //#region src/providers/BrowserHeadProvider.d.ts
408
- declare class BrowserHeadProvider {
409
- renderHead(document: Document, head: Head$1): void;
410
- }
357
+ declare const RouterLayerContext: react13.Context<RouterLayerContextValue | undefined>;
411
358
  //#endregion
412
359
  //#region src/providers/BrowserRouterProvider.d.ts
413
360
  interface BrowserRoute extends Route {
414
361
  page: PageRoute;
415
362
  }
416
363
  declare class BrowserRouterProvider extends RouterProvider<BrowserRoute> {
417
- protected readonly log: _alepha_core0.Logger;
364
+ protected readonly log: _alepha_core5.Logger;
418
365
  protected readonly alepha: Alepha;
419
366
  protected readonly pageDescriptorProvider: PageDescriptorProvider;
420
367
  add(entry: PageRouteEntry): void;
421
- protected readonly configure: _alepha_core0.HookDescriptor<"configure">;
368
+ protected readonly configure: _alepha_core5.HookDescriptor<"configure">;
422
369
  transition(url: URL, options?: TransitionOptions): Promise<RouterRenderResult>;
423
370
  root(state: RouterState, context: PageReactContext): ReactNode;
424
371
  }
425
372
  //#endregion
426
373
  //#region src/providers/ReactBrowserProvider.d.ts
427
374
  declare class ReactBrowserProvider {
428
- protected readonly log: _alepha_core2.Logger;
429
- protected readonly client: HttpClient;
375
+ protected readonly log: _alepha_core7.Logger;
376
+ protected readonly client: LinkProvider;
430
377
  protected readonly alepha: Alepha;
431
378
  protected readonly router: BrowserRouterProvider;
432
- protected readonly headProvider: BrowserHeadProvider;
433
379
  protected root: Root;
434
380
  transitioning?: {
435
381
  to: string;
@@ -448,8 +394,7 @@ declare class ReactBrowserProvider {
448
394
  * Get embedded layers from the server.
449
395
  */
450
396
  protected getHydrationState(): ReactHydrationState | undefined;
451
- readonly ready: _alepha_core2.HookDescriptor<"ready">;
452
- readonly onTransitionEnd: _alepha_core2.HookDescriptor<keyof _alepha_core2.Hooks>;
397
+ readonly ready: _alepha_core7.HookDescriptor<"ready">;
453
398
  }
454
399
  interface RouterGoOptions {
455
400
  replace?: boolean;
@@ -574,5 +519,5 @@ declare class AlephaReact implements Module {
574
519
  readonly $services: (alepha: Alepha) => Alepha;
575
520
  }
576
521
  //#endregion
577
- export { $page, AlephaReact, AnchorProps, BrowserRoute, BrowserRouterProvider, ClientOnly, CreateLayersResult, ErrorBoundary, Head, HrefLike, Layer, Link, NestedView, PageConfigSchema, PageDescriptor, PageDescriptorOptions, PageDescriptorProvider, PageDescriptorRenderOptions, PageDescriptorRenderResult, PageReactContext, PageRequest, PageRequestConfig, PageResolve, PageRoute, PageRouteEntry, PreviousLayerData, ReactBrowserProvider, ReactHydrationState, RedirectionError, RouterContext, RouterContextValue, RouterGoOptions, RouterHookApi, RouterLayerContext, RouterLayerContextValue, RouterRenderResult, RouterStackItem, RouterState, TPropsDefault, TPropsParentDefault, TransitionOptions, UseActiveHook, UseQueryParamsHookOptions, VirtualRouter, isPageRoute, useActive, useAlepha, useClient, useInject, useQueryParams, useRouter, useRouterEvents, useRouterState };
522
+ export { $page, AlephaReact, AnchorProps, BrowserRoute, BrowserRouterProvider, ClientOnly, CreateLayersResult, ErrorBoundary, HrefLike, Layer, Link, NestedView, PageConfigSchema, PageDescriptor, PageDescriptorOptions, PageDescriptorProvider, PageDescriptorRenderOptions, PageDescriptorRenderResult, PageReactContext, PageRequest, PageRequestConfig, PageResolve, PageRoute, PageRouteEntry, PreviousLayerData, ReactBrowserProvider, ReactHydrationState, RedirectionError, RouterContext, RouterContextValue, RouterGoOptions, RouterHookApi, RouterLayerContext, RouterLayerContextValue, RouterRenderResult, RouterStackItem, RouterState, TPropsDefault, TPropsParentDefault, TransitionOptions, UseActiveHook, UseQueryParamsHookOptions, VirtualRouter, isPageRoute, useActive, useAlepha, useClient, useInject, useQueryParams, useRouter, useRouterEvents, useRouterState };
578
523
  //# sourceMappingURL=index.browser.d.ts.map
@@ -2,7 +2,7 @@ import { $hook, $inject, $logger, Alepha, KIND, NotImplementedError, OPTIONS, __
2
2
  import { RouterProvider } from "@alepha/router";
3
3
  import React, { StrictMode, createContext, createElement, useContext, useEffect, useMemo, useState } from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
- import { HttpClient } from "@alepha/server";
5
+ import { LinkProvider } from "@alepha/server-links";
6
6
  import { createRoot, hydrateRoot } from "react-dom/client";
7
7
 
8
8
  //#region src/descriptors/$page.ts
@@ -453,10 +453,6 @@ var PageDescriptorProvider = class {
453
453
  const props = it.props ?? {};
454
454
  const params = { ...it.config?.params };
455
455
  for (const key of Object.keys(params)) params[key] = String(params[key]);
456
- if (it.route.head && !it.error) this.fillHead(it.route, request, {
457
- ...props,
458
- ...context
459
- });
460
456
  acc += "/";
461
457
  acc += it.route.path ? this.compile(it.route.path, params) : "";
462
458
  const path = acc.replace(/\/+/, "/");
@@ -473,7 +469,8 @@ var PageDescriptorProvider = class {
473
469
  config: it.config,
474
470
  element: this.renderView(i + 1, path, element$1, it.route),
475
471
  index: i + 1,
476
- path
472
+ path,
473
+ route
477
474
  });
478
475
  break;
479
476
  }
@@ -488,7 +485,8 @@ var PageDescriptorProvider = class {
488
485
  config: it.config,
489
486
  element: this.renderView(i + 1, path, element, it.route),
490
487
  index: i + 1,
491
- path
488
+ path,
489
+ route
492
490
  });
493
491
  }
494
492
  return {
@@ -513,26 +511,6 @@ var PageDescriptorProvider = class {
513
511
  if (page.component) return createElement(page.component, props);
514
512
  return void 0;
515
513
  }
516
- fillHead(page, ctx, props) {
517
- if (!page.head) return;
518
- ctx.head ??= {};
519
- const head = typeof page.head === "function" ? page.head(props, ctx.head) : page.head;
520
- if (head.title) {
521
- ctx.head ??= {};
522
- if (ctx.head.titleSeparator) ctx.head.title = `${head.title}${ctx.head.titleSeparator}${ctx.head.title}`;
523
- else ctx.head.title = head.title;
524
- ctx.head.titleSeparator = head.titleSeparator;
525
- }
526
- if (head.htmlAttributes) ctx.head.htmlAttributes = {
527
- ...ctx.head.htmlAttributes,
528
- ...head.htmlAttributes
529
- };
530
- if (head.bodyAttributes) ctx.head.bodyAttributes = {
531
- ...ctx.head.bodyAttributes,
532
- ...head.bodyAttributes
533
- };
534
- if (head.meta) ctx.head.meta = [...ctx.head.meta ?? [], ...head.meta ?? []];
535
- }
536
514
  renderError(error) {
537
515
  return createElement(ErrorViewer_default, { error });
538
516
  }
@@ -654,7 +632,6 @@ var BrowserRouterProvider = class extends RouterProvider {
654
632
  url,
655
633
  query: {},
656
634
  params: {},
657
- head: {},
658
635
  onError: () => null,
659
636
  ...options.context ?? {}
660
637
  };
@@ -685,7 +662,10 @@ var BrowserRouterProvider = class extends RouterProvider {
685
662
  index: 0,
686
663
  path: "/"
687
664
  });
688
- await this.alepha.emit("react:transition:success", { state });
665
+ await this.alepha.emit("react:transition:success", {
666
+ state,
667
+ context
668
+ });
689
669
  } catch (e) {
690
670
  this.log.error(e);
691
671
  state.layers = [{
@@ -719,36 +699,13 @@ var BrowserRouterProvider = class extends RouterProvider {
719
699
  }
720
700
  };
721
701
 
722
- //#endregion
723
- //#region src/providers/BrowserHeadProvider.ts
724
- var BrowserHeadProvider = class {
725
- renderHead(document, head) {
726
- if (head.title) document.title = head.title;
727
- if (head.bodyAttributes) for (const [key, value] of Object.entries(head.bodyAttributes)) if (value) document.body.setAttribute(key, value);
728
- else document.body.removeAttribute(key);
729
- if (head.htmlAttributes) for (const [key, value] of Object.entries(head.htmlAttributes)) if (value) document.documentElement.setAttribute(key, value);
730
- else document.documentElement.removeAttribute(key);
731
- if (head.meta) for (const [key, value] of Object.entries(head.meta)) {
732
- const meta = document.querySelector(`meta[name="${key}"]`);
733
- if (meta) meta.setAttribute("content", value.content);
734
- else {
735
- const newMeta = document.createElement("meta");
736
- newMeta.setAttribute("name", key);
737
- newMeta.setAttribute("content", value.content);
738
- document.head.appendChild(newMeta);
739
- }
740
- }
741
- }
742
- };
743
-
744
702
  //#endregion
745
703
  //#region src/providers/ReactBrowserProvider.ts
746
704
  var ReactBrowserProvider = class {
747
705
  log = $logger();
748
- client = $inject(HttpClient);
706
+ client = $inject(LinkProvider);
749
707
  alepha = $inject(Alepha);
750
708
  router = $inject(BrowserRouterProvider);
751
- headProvider = $inject(BrowserHeadProvider);
752
709
  root;
753
710
  transitioning;
754
711
  state = {
@@ -827,7 +784,6 @@ var ReactBrowserProvider = class {
827
784
  const previous = hydration?.layers ?? [];
828
785
  if (hydration?.links) for (const link of hydration.links.links) this.client.pushLink(link);
829
786
  const { context } = await this.render({ previous });
830
- if (context.head) this.headProvider.renderHead(this.document, context.head);
831
787
  await this.alepha.emit("react:browser:render", {
832
788
  state: this.state,
833
789
  context,
@@ -838,12 +794,6 @@ var ReactBrowserProvider = class {
838
794
  });
839
795
  }
840
796
  });
841
- onTransitionEnd = $hook({
842
- name: "react:transition:end",
843
- handler: async ({ context }) => {
844
- this.headProvider.renderHead(this.document, context.head);
845
- }
846
- });
847
797
  };
848
798
 
849
799
  //#endregion
@@ -1035,7 +985,7 @@ const useInject = (clazz) => {
1035
985
  //#endregion
1036
986
  //#region src/hooks/useClient.ts
1037
987
  const useClient = (_scope) => {
1038
- return useInject(HttpClient).of();
988
+ return useInject(LinkProvider).client();
1039
989
  };
1040
990
 
1041
991
  //#endregion