@alepha/react 0.7.0 → 0.7.2

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 (37) hide show
  1. package/README.md +1 -1
  2. package/dist/index.browser.cjs +59 -22
  3. package/dist/index.browser.js +42 -6
  4. package/dist/index.cjs +152 -85
  5. package/dist/index.d.ts +317 -206
  6. package/dist/index.js +130 -64
  7. package/dist/{useActive-DjpZBEuB.cjs → useRouterState-C2uo0jXu.cjs} +319 -140
  8. package/dist/{useActive-BX41CqY8.js → useRouterState-D5__ZcUV.js} +321 -143
  9. package/package.json +11 -10
  10. package/src/components/ClientOnly.tsx +35 -0
  11. package/src/components/ErrorBoundary.tsx +1 -1
  12. package/src/components/ErrorViewer.tsx +161 -0
  13. package/src/components/Link.tsx +9 -3
  14. package/src/components/NestedView.tsx +18 -3
  15. package/src/components/NotFound.tsx +30 -0
  16. package/src/descriptors/$page.ts +141 -30
  17. package/src/errors/RedirectionError.ts +4 -1
  18. package/src/hooks/RouterHookApi.ts +42 -24
  19. package/src/hooks/useAlepha.ts +12 -0
  20. package/src/hooks/useClient.ts +8 -6
  21. package/src/hooks/useInject.ts +2 -2
  22. package/src/hooks/useQueryParams.ts +1 -1
  23. package/src/hooks/useRouter.ts +6 -0
  24. package/src/index.browser.ts +4 -2
  25. package/src/index.shared.ts +11 -5
  26. package/src/index.ts +3 -4
  27. package/src/providers/BrowserRouterProvider.ts +4 -3
  28. package/src/providers/PageDescriptorProvider.ts +91 -20
  29. package/src/providers/ReactBrowserProvider.ts +6 -59
  30. package/src/providers/ReactBrowserRenderer.ts +72 -0
  31. package/src/providers/ReactServerProvider.ts +200 -81
  32. package/dist/index.browser.cjs.map +0 -1
  33. package/dist/index.browser.js.map +0 -1
  34. package/dist/index.cjs.map +0 -1
  35. package/dist/index.js.map +0 -1
  36. package/dist/useActive-BX41CqY8.js.map +0 -1
  37. package/dist/useActive-DjpZBEuB.cjs.map +0 -1
package/README.md CHANGED
@@ -1 +1 @@
1
- # @alepha/react
1
+ # alepha/react
@@ -1,37 +1,74 @@
1
1
  'use strict';
2
2
 
3
3
  var core = require('@alepha/core');
4
- var useActive = require('./useActive-DjpZBEuB.cjs');
4
+ var useRouterState = require('./useRouterState-C2uo0jXu.cjs');
5
+ var client = require('react-dom/client');
5
6
  require('react/jsx-runtime');
6
7
  require('react');
7
8
  require('@alepha/server');
8
- require('react-dom/client');
9
9
  require('@alepha/router');
10
10
 
11
+ const envSchema = core.t.object({
12
+ REACT_ROOT_ID: core.t.string({ default: "root" })
13
+ });
14
+ class ReactBrowserRenderer {
15
+ browserProvider = core.$inject(useRouterState.ReactBrowserProvider);
16
+ browserRouterProvider = core.$inject(useRouterState.BrowserRouterProvider);
17
+ env = core.$inject(envSchema);
18
+ log = core.$logger();
19
+ root;
20
+ getRootElement() {
21
+ const root = this.browserProvider.document.getElementById(
22
+ this.env.REACT_ROOT_ID
23
+ );
24
+ if (root) {
25
+ return root;
26
+ }
27
+ const div = this.browserProvider.document.createElement("div");
28
+ div.id = this.env.REACT_ROOT_ID;
29
+ this.browserProvider.document.body.prepend(div);
30
+ return div;
31
+ }
32
+ ready = core.$hook({
33
+ name: "react:browser:render",
34
+ handler: async ({ state, context, hydration }) => {
35
+ const element = this.browserRouterProvider.root(state, context);
36
+ if (hydration?.layers) {
37
+ this.root = client.hydrateRoot(this.getRootElement(), element);
38
+ this.log.info("Hydrated root element");
39
+ } else {
40
+ this.root ??= client.createRoot(this.getRootElement());
41
+ this.root.render(element);
42
+ this.log.info("Created root element");
43
+ }
44
+ }
45
+ });
46
+ }
47
+
11
48
  class ReactModule {
12
49
  alepha = core.$inject(core.Alepha);
13
50
  constructor() {
14
- this.alepha.with(useActive.PageDescriptorProvider).with(useActive.ReactBrowserProvider).with(useActive.BrowserRouterProvider);
51
+ this.alepha.with(useRouterState.PageDescriptorProvider).with(useRouterState.ReactBrowserProvider).with(useRouterState.BrowserRouterProvider).with(ReactBrowserRenderer);
15
52
  }
16
53
  }
17
- core.__bind(useActive.$page, ReactModule);
54
+ core.__bind(useRouterState.$page, ReactModule);
18
55
 
19
- exports.$page = useActive.$page;
20
- exports.ErrorBoundary = useActive.ErrorBoundary;
21
- exports.Link = useActive.Link;
22
- exports.NestedView = useActive.NestedView;
23
- exports.ReactBrowserProvider = useActive.ReactBrowserProvider;
24
- exports.RedirectionError = useActive.RedirectionError;
25
- exports.RouterContext = useActive.RouterContext;
26
- exports.RouterHookApi = useActive.RouterHookApi;
27
- exports.RouterLayerContext = useActive.RouterLayerContext;
28
- exports.useActive = useActive.useActive;
29
- exports.useApi = useActive.useApi;
30
- exports.useClient = useActive.useClient;
31
- exports.useInject = useActive.useInject;
32
- exports.useQueryParams = useActive.useQueryParams;
33
- exports.useRouter = useActive.useRouter;
34
- exports.useRouterEvents = useActive.useRouterEvents;
35
- exports.useRouterState = useActive.useRouterState;
56
+ exports.$page = useRouterState.$page;
57
+ exports.ClientOnly = useRouterState.ClientOnly;
58
+ exports.ErrorBoundary = useRouterState.ErrorBoundary;
59
+ exports.Link = useRouterState.Link;
60
+ exports.NestedView = useRouterState.NestedView;
61
+ exports.ReactBrowserProvider = useRouterState.ReactBrowserProvider;
62
+ exports.RedirectionError = useRouterState.RedirectionError;
63
+ exports.RouterContext = useRouterState.RouterContext;
64
+ exports.RouterHookApi = useRouterState.RouterHookApi;
65
+ exports.RouterLayerContext = useRouterState.RouterLayerContext;
66
+ exports.useActive = useRouterState.useActive;
67
+ exports.useAlepha = useRouterState.useAlepha;
68
+ exports.useClient = useRouterState.useClient;
69
+ exports.useInject = useRouterState.useInject;
70
+ exports.useQueryParams = useRouterState.useQueryParams;
71
+ exports.useRouter = useRouterState.useRouter;
72
+ exports.useRouterEvents = useRouterState.useRouterEvents;
73
+ exports.useRouterState = useRouterState.useRouterState;
36
74
  exports.ReactModule = ReactModule;
37
- //# sourceMappingURL=index.browser.cjs.map
@@ -1,19 +1,55 @@
1
- import { __bind, $inject, Alepha } from '@alepha/core';
2
- import { $ as $page, P as PageDescriptorProvider, l as ReactBrowserProvider, B as BrowserRouterProvider } from './useActive-BX41CqY8.js';
3
- export { E as ErrorBoundary, L as Link, N as NestedView, j as RedirectionError, R as RouterContext, b as RouterHookApi, a as RouterLayerContext, i as useActive, d as useApi, c as useClient, u as useInject, e as useQueryParams, f as useRouter, g as useRouterEvents, h as useRouterState } from './useActive-BX41CqY8.js';
1
+ import { t, $inject, $logger, $hook, __bind, Alepha } from '@alepha/core';
2
+ import { l as ReactBrowserProvider, B as BrowserRouterProvider, $ as $page, P as PageDescriptorProvider } from './useRouterState-D5__ZcUV.js';
3
+ export { C as ClientOnly, E as ErrorBoundary, L as Link, N as NestedView, R as RedirectionError, a as RouterContext, c as RouterHookApi, b as RouterLayerContext, u as useActive, d as useAlepha, e as useClient, f as useInject, g as useQueryParams, h as useRouter, i as useRouterEvents, j as useRouterState } from './useRouterState-D5__ZcUV.js';
4
+ import { hydrateRoot, createRoot } from 'react-dom/client';
4
5
  import 'react/jsx-runtime';
5
6
  import 'react';
6
7
  import '@alepha/server';
7
- import 'react-dom/client';
8
8
  import '@alepha/router';
9
9
 
10
+ const envSchema = t.object({
11
+ REACT_ROOT_ID: t.string({ default: "root" })
12
+ });
13
+ class ReactBrowserRenderer {
14
+ browserProvider = $inject(ReactBrowserProvider);
15
+ browserRouterProvider = $inject(BrowserRouterProvider);
16
+ env = $inject(envSchema);
17
+ log = $logger();
18
+ root;
19
+ getRootElement() {
20
+ const root = this.browserProvider.document.getElementById(
21
+ this.env.REACT_ROOT_ID
22
+ );
23
+ if (root) {
24
+ return root;
25
+ }
26
+ const div = this.browserProvider.document.createElement("div");
27
+ div.id = this.env.REACT_ROOT_ID;
28
+ this.browserProvider.document.body.prepend(div);
29
+ return div;
30
+ }
31
+ ready = $hook({
32
+ name: "react:browser:render",
33
+ handler: async ({ state, context, hydration }) => {
34
+ const element = this.browserRouterProvider.root(state, context);
35
+ if (hydration?.layers) {
36
+ this.root = hydrateRoot(this.getRootElement(), element);
37
+ this.log.info("Hydrated root element");
38
+ } else {
39
+ this.root ??= createRoot(this.getRootElement());
40
+ this.root.render(element);
41
+ this.log.info("Created root element");
42
+ }
43
+ }
44
+ });
45
+ }
46
+
10
47
  class ReactModule {
11
48
  alepha = $inject(Alepha);
12
49
  constructor() {
13
- this.alepha.with(PageDescriptorProvider).with(ReactBrowserProvider).with(BrowserRouterProvider);
50
+ this.alepha.with(PageDescriptorProvider).with(ReactBrowserProvider).with(BrowserRouterProvider).with(ReactBrowserRenderer);
14
51
  }
15
52
  }
16
53
  __bind($page, ReactModule);
17
54
 
18
55
  export { $page, ReactBrowserProvider, ReactModule };
19
- //# sourceMappingURL=index.browser.js.map
package/dist/index.cjs CHANGED
@@ -2,15 +2,13 @@
2
2
 
3
3
  var core = require('@alepha/core');
4
4
  var server = require('@alepha/server');
5
- var useActive = require('./useActive-DjpZBEuB.cjs');
5
+ var useRouterState = require('./useRouterState-C2uo0jXu.cjs');
6
6
  var node_fs = require('node:fs');
7
- var promises = require('node:fs/promises');
8
7
  var node_path = require('node:path');
9
8
  var serverStatic = require('@alepha/server-static');
10
9
  var server$1 = require('react-dom/server');
11
10
  require('react/jsx-runtime');
12
11
  require('react');
13
- require('react-dom/client');
14
12
  require('@alepha/router');
15
13
 
16
14
  class ServerHeadProvider {
@@ -76,58 +74,87 @@ class ServerHeadProvider {
76
74
  }
77
75
 
78
76
  const envSchema = core.t.object({
79
- REACT_SERVER_DIST: core.t.string({ default: "client" }),
77
+ REACT_SERVER_DIST: core.t.string({ default: "public" }),
80
78
  REACT_SERVER_PREFIX: core.t.string({ default: "" }),
81
- REACT_SSR_ENABLED: core.t.boolean({ default: false }),
79
+ REACT_SSR_ENABLED: core.t.optional(core.t.boolean()),
82
80
  REACT_ROOT_ID: core.t.string({ default: "root" })
83
81
  });
84
82
  class ReactServerProvider {
85
83
  log = core.$logger();
86
84
  alepha = core.$inject(core.Alepha);
87
- pageDescriptorProvider = core.$inject(useActive.PageDescriptorProvider);
85
+ pageDescriptorProvider = core.$inject(useRouterState.PageDescriptorProvider);
88
86
  serverStaticProvider = core.$inject(serverStatic.ServerStaticProvider);
89
87
  serverRouterProvider = core.$inject(server.ServerRouterProvider);
90
88
  headProvider = core.$inject(ServerHeadProvider);
89
+ serverTimingProvider = core.$inject(server.ServerTimingProvider);
91
90
  env = core.$inject(envSchema);
92
91
  ROOT_DIV_REGEX = new RegExp(
93
92
  `<div([^>]*)\\s+id=["']${this.env.REACT_ROOT_ID}["']([^>]*)>(.*?)<\\/div>`,
94
93
  "is"
95
94
  );
96
- configure = core.$hook({
95
+ onConfigure = core.$hook({
97
96
  name: "configure",
98
97
  handler: async () => {
99
- const pages = this.alepha.getDescriptorValues(useActive.$page);
100
- if (pages.length === 0) {
101
- return;
102
- }
98
+ const pages = this.alepha.getDescriptorValues(useRouterState.$page);
99
+ const ssrEnabled = pages.length > 0 && this.env.REACT_SSR_ENABLED !== false;
100
+ this.alepha.state("ReactServerProvider.ssr", ssrEnabled);
103
101
  for (const { key, instance, value } of pages) {
104
102
  const name = value[core.OPTIONS].name ?? key;
103
+ instance[key].prerender = this.createRenderFunction(name, true);
105
104
  if (this.alepha.isTest()) {
106
105
  instance[key].render = this.createRenderFunction(name);
107
106
  }
108
107
  }
109
108
  if (this.alepha.isServerless() === "vite") {
110
- await this.configureVite();
109
+ await this.configureVite(ssrEnabled);
111
110
  return;
112
111
  }
113
112
  let root = "";
114
113
  if (!this.alepha.isServerless()) {
115
114
  root = this.getPublicDirectory();
116
115
  if (!root) {
117
- this.log.warn("Missing static files, SSR will be disabled");
118
- return;
116
+ this.log.warn(
117
+ "Missing static files, static file server will be disabled"
118
+ );
119
+ } else {
120
+ this.log.debug(`Using static files from: ${root}`);
121
+ await this.configureStaticServer(root);
119
122
  }
120
- await this.configureStaticServer(root);
121
123
  }
122
- const template = this.alepha.state("ReactServerProvider.template") ?? await promises.readFile(node_path.join(root, "index.html"), "utf-8");
123
- await this.registerPages(async () => template);
124
- this.alepha.state("ReactServerProvider.ssr", true);
124
+ if (ssrEnabled) {
125
+ await this.registerPages(async () => this.template);
126
+ this.log.info("SSR OK");
127
+ return;
128
+ }
129
+ this.log.info("SSR is disabled, use History API fallback");
130
+ await this.serverRouterProvider.route({
131
+ path: "*",
132
+ handler: async ({ url, reply }) => {
133
+ if (url.pathname.includes(".")) {
134
+ reply.headers["content-type"] = "text/plain";
135
+ reply.body = "Not Found";
136
+ reply.status = 404;
137
+ return;
138
+ }
139
+ reply.headers["content-type"] = "text/html";
140
+ return this.template;
141
+ }
142
+ });
125
143
  }
126
144
  });
145
+ get template() {
146
+ return this.alepha.state("ReactServerProvider.template");
147
+ }
127
148
  async registerPages(templateLoader) {
128
149
  for (const page of this.pageDescriptorProvider.getPages()) {
150
+ if (page.children?.length) {
151
+ continue;
152
+ }
129
153
  this.log.debug(`+ ${page.match} -> ${page.name}`);
130
154
  await this.serverRouterProvider.route({
155
+ ...page,
156
+ schema: void 0,
157
+ // schema is handled by the page descriptor provider for now (shared by browser and server)
131
158
  method: "GET",
132
159
  path: page.match,
133
160
  handler: this.createHandler(page, templateLoader)
@@ -136,8 +163,8 @@ class ReactServerProvider {
136
163
  }
137
164
  getPublicDirectory() {
138
165
  const maybe = [
139
- node_path.join(process.cwd(), this.env.REACT_SERVER_DIST),
140
- node_path.join(process.cwd(), "..", this.env.REACT_SERVER_DIST)
166
+ node_path.join(process.cwd(), `dist/${this.env.REACT_SERVER_DIST}`),
167
+ node_path.join(process.cwd(), this.env.REACT_SERVER_DIST)
141
168
  ];
142
169
  for (const it of maybe) {
143
170
  if (node_fs.existsSync(it)) {
@@ -152,23 +179,25 @@ class ReactServerProvider {
152
179
  path: this.env.REACT_SERVER_PREFIX
153
180
  });
154
181
  }
155
- async configureVite() {
156
- const url = `http://${process.env.SERVER_HOST}:${process.env.SERVER_PORT}`;
182
+ async configureVite(ssrEnabled) {
183
+ if (!ssrEnabled) {
184
+ return;
185
+ }
157
186
  this.log.info("SSR (vite) OK");
158
- this.alepha.state("ReactServerProvider.ssr", true);
159
- const templateUrl = `${url}/index.html`;
187
+ const url = `http://${process.env.SERVER_HOST}:${process.env.SERVER_PORT}`;
160
188
  await this.registerPages(
161
- () => fetch(templateUrl).then((it) => it.text()).catch(() => void 0)
189
+ () => fetch(`${url}/index.html`).then((it) => it.text()).catch(() => void 0)
162
190
  );
163
191
  }
164
192
  /**
165
193
  * For testing purposes, creates a render function that can be used.
166
194
  */
167
- createRenderFunction(name) {
195
+ createRenderFunction(name, withIndex = false) {
168
196
  return async (options = {}) => {
169
197
  const page = this.pageDescriptorProvider.page(name);
198
+ const url = new URL(this.pageDescriptorProvider.url(name, options));
170
199
  const context = {
171
- url: new URL("http://localhost"),
200
+ url,
172
201
  params: options.params ?? {},
173
202
  query: options.query ?? {},
174
203
  head: {},
@@ -178,7 +207,18 @@ class ReactServerProvider {
178
207
  page,
179
208
  context
180
209
  );
181
- return server$1.renderToString(this.pageDescriptorProvider.root(state, context));
210
+ if (!withIndex) {
211
+ return {
212
+ context,
213
+ html: server$1.renderToString(
214
+ this.pageDescriptorProvider.root(state, context)
215
+ )
216
+ };
217
+ }
218
+ return {
219
+ context,
220
+ html: this.renderToHtml(this.template ?? "", state, context)
221
+ };
182
222
  };
183
223
  }
184
224
  createHandler(page, templateLoader) {
@@ -198,11 +238,24 @@ class ReactServerProvider {
198
238
  };
199
239
  if (this.alepha.has(server.ServerLinksProvider)) {
200
240
  const srv = this.alepha.get(server.ServerLinksProvider);
201
- context.links = await srv.getLinks({
202
- user: serverRequest.user,
203
- authorization: serverRequest.headers.authorization
204
- });
205
- this.alepha.als.set("links", context.links);
241
+ const schema = server.apiLinksResponseSchema;
242
+ context.links = this.alepha.parse(
243
+ schema,
244
+ await srv.getLinks({
245
+ user: serverRequest.user,
246
+ authorization: serverRequest.headers.authorization
247
+ })
248
+ );
249
+ this.alepha.context.set("links", context.links);
250
+ }
251
+ let target = page;
252
+ while (target) {
253
+ if (page.can && !page.can()) {
254
+ reply.status = 403;
255
+ reply.headers["content-type"] = "text/plain";
256
+ return "Forbidden";
257
+ }
258
+ target = target.parent;
206
259
  }
207
260
  await this.alepha.emit(
208
261
  "react:server:render",
@@ -214,49 +267,63 @@ class ReactServerProvider {
214
267
  log: false
215
268
  }
216
269
  );
270
+ this.serverTimingProvider.beginTiming("createLayers");
217
271
  const state = await this.pageDescriptorProvider.createLayers(
218
272
  page,
219
273
  context
220
274
  );
275
+ this.serverTimingProvider.endTiming("createLayers");
221
276
  if (state.redirect) {
222
277
  return reply.redirect(state.redirect);
223
278
  }
224
- const element = this.pageDescriptorProvider.root(state, context);
225
- const app = server$1.renderToString(element);
226
- const hydrationData = {
227
- links: context.links,
228
- layers: state.layers.map((it) => ({
229
- ...it,
230
- error: it.error ? {
231
- ...it.error,
232
- name: it.error.name,
233
- message: it.error.message,
234
- stack: it.error.stack
235
- // TODO: Hide stack in production ?
236
- } : void 0,
237
- index: void 0,
238
- path: void 0,
239
- element: void 0
240
- }))
241
- };
242
- const script = `<script>window.__ssr=${JSON.stringify(hydrationData)}<\/script>`;
243
- const response = {
244
- html: template
245
- };
246
- reply.status = 200;
247
279
  reply.headers["content-type"] = "text/html";
248
280
  reply.headers["cache-control"] = "no-store, no-cache, must-revalidate, proxy-revalidate";
249
281
  reply.headers.pragma = "no-cache";
250
282
  reply.headers.expires = "0";
251
- this.fillTemplate(response, app, script);
252
- if (context.head) {
253
- response.html = this.headProvider.renderHead(
254
- response.html,
255
- context.head
256
- );
283
+ if (page.cache && serverRequest.user) {
284
+ delete context.links;
257
285
  }
258
- return response.html;
286
+ const html = this.renderToHtml(template, state, context);
287
+ page.afterHandler?.(serverRequest);
288
+ return html;
289
+ };
290
+ }
291
+ renderToHtml(template, state, context) {
292
+ const element = this.pageDescriptorProvider.root(state, context);
293
+ this.serverTimingProvider.beginTiming("renderToString");
294
+ let app = "";
295
+ try {
296
+ app = server$1.renderToString(element);
297
+ } catch (error) {
298
+ this.log.error("Error during SSR", error);
299
+ app = server$1.renderToString(context.onError(error));
300
+ }
301
+ this.serverTimingProvider.endTiming("renderToString");
302
+ const hydrationData = {
303
+ links: context.links,
304
+ layers: state.layers.map((it) => ({
305
+ ...it,
306
+ error: it.error ? {
307
+ ...it.error,
308
+ name: it.error.name,
309
+ message: it.error.message,
310
+ stack: it.error.stack
311
+ // TODO: Hide stack in production ?
312
+ } : void 0,
313
+ index: void 0,
314
+ path: void 0,
315
+ element: void 0
316
+ }))
317
+ };
318
+ const script = `<script>window.__ssr=${JSON.stringify(hydrationData)}<\/script>`;
319
+ const response = {
320
+ html: template
259
321
  };
322
+ this.fillTemplate(response, app, script);
323
+ if (context.head) {
324
+ response.html = this.headProvider.renderHead(response.html, context.head);
325
+ }
326
+ return response.html;
260
327
  }
261
328
  fillTemplate(response, app, script) {
262
329
  if (this.ROOT_DIV_REGEX.test(response.html)) {
@@ -289,31 +356,31 @@ class ReactServerProvider {
289
356
  class ReactModule {
290
357
  alepha = core.$inject(core.Alepha);
291
358
  constructor() {
292
- this.alepha.with(server.ServerModule).with(server.ServerLinksProvider).with(useActive.PageDescriptorProvider).with(ReactServerProvider);
359
+ this.alepha.with(server.ServerModule).with(server.ServerLinksProvider).with(useRouterState.PageDescriptorProvider).with(ReactServerProvider);
293
360
  }
294
361
  }
295
- core.__bind(useActive.$page, ReactModule);
362
+ core.__bind(useRouterState.$page, ReactModule);
296
363
 
297
- exports.$page = useActive.$page;
298
- exports.ErrorBoundary = useActive.ErrorBoundary;
299
- exports.Link = useActive.Link;
300
- exports.NestedView = useActive.NestedView;
301
- exports.PageDescriptorProvider = useActive.PageDescriptorProvider;
302
- exports.ReactBrowserProvider = useActive.ReactBrowserProvider;
303
- exports.RedirectionError = useActive.RedirectionError;
304
- exports.RouterContext = useActive.RouterContext;
305
- exports.RouterHookApi = useActive.RouterHookApi;
306
- exports.RouterLayerContext = useActive.RouterLayerContext;
307
- exports.isPageRoute = useActive.isPageRoute;
308
- exports.useActive = useActive.useActive;
309
- exports.useApi = useActive.useApi;
310
- exports.useClient = useActive.useClient;
311
- exports.useInject = useActive.useInject;
312
- exports.useQueryParams = useActive.useQueryParams;
313
- exports.useRouter = useActive.useRouter;
314
- exports.useRouterEvents = useActive.useRouterEvents;
315
- exports.useRouterState = useActive.useRouterState;
364
+ exports.$page = useRouterState.$page;
365
+ exports.ClientOnly = useRouterState.ClientOnly;
366
+ exports.ErrorBoundary = useRouterState.ErrorBoundary;
367
+ exports.Link = useRouterState.Link;
368
+ exports.NestedView = useRouterState.NestedView;
369
+ exports.PageDescriptorProvider = useRouterState.PageDescriptorProvider;
370
+ exports.ReactBrowserProvider = useRouterState.ReactBrowserProvider;
371
+ exports.RedirectionError = useRouterState.RedirectionError;
372
+ exports.RouterContext = useRouterState.RouterContext;
373
+ exports.RouterHookApi = useRouterState.RouterHookApi;
374
+ exports.RouterLayerContext = useRouterState.RouterLayerContext;
375
+ exports.isPageRoute = useRouterState.isPageRoute;
376
+ exports.useActive = useRouterState.useActive;
377
+ exports.useAlepha = useRouterState.useAlepha;
378
+ exports.useClient = useRouterState.useClient;
379
+ exports.useInject = useRouterState.useInject;
380
+ exports.useQueryParams = useRouterState.useQueryParams;
381
+ exports.useRouter = useRouterState.useRouter;
382
+ exports.useRouterEvents = useRouterState.useRouterEvents;
383
+ exports.useRouterState = useRouterState.useRouterState;
316
384
  exports.ReactModule = ReactModule;
317
385
  exports.ReactServerProvider = ReactServerProvider;
318
386
  exports.envSchema = envSchema;
319
- //# sourceMappingURL=index.cjs.map