@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.
- package/README.md +1 -1
- package/dist/index.browser.cjs +59 -22
- package/dist/index.browser.js +42 -6
- package/dist/index.cjs +152 -85
- package/dist/index.d.ts +317 -206
- package/dist/index.js +130 -64
- package/dist/{useActive-DjpZBEuB.cjs → useRouterState-C2uo0jXu.cjs} +319 -140
- package/dist/{useActive-BX41CqY8.js → useRouterState-D5__ZcUV.js} +321 -143
- package/package.json +11 -10
- package/src/components/ClientOnly.tsx +35 -0
- package/src/components/ErrorBoundary.tsx +1 -1
- package/src/components/ErrorViewer.tsx +161 -0
- package/src/components/Link.tsx +9 -3
- package/src/components/NestedView.tsx +18 -3
- package/src/components/NotFound.tsx +30 -0
- package/src/descriptors/$page.ts +141 -30
- package/src/errors/RedirectionError.ts +4 -1
- package/src/hooks/RouterHookApi.ts +42 -24
- package/src/hooks/useAlepha.ts +12 -0
- package/src/hooks/useClient.ts +8 -6
- package/src/hooks/useInject.ts +2 -2
- package/src/hooks/useQueryParams.ts +1 -1
- package/src/hooks/useRouter.ts +6 -0
- package/src/index.browser.ts +4 -2
- package/src/index.shared.ts +11 -5
- package/src/index.ts +3 -4
- package/src/providers/BrowserRouterProvider.ts +4 -3
- package/src/providers/PageDescriptorProvider.ts +91 -20
- package/src/providers/ReactBrowserProvider.ts +6 -59
- package/src/providers/ReactBrowserRenderer.ts +72 -0
- package/src/providers/ReactServerProvider.ts +200 -81
- package/dist/index.browser.cjs.map +0 -1
- package/dist/index.browser.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/useActive-BX41CqY8.js.map +0 -1
- package/dist/useActive-DjpZBEuB.cjs.map +0 -1
package/README.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
#
|
|
1
|
+
# alepha/react
|
package/dist/index.browser.cjs
CHANGED
|
@@ -1,37 +1,74 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var core = require('@alepha/core');
|
|
4
|
-
var
|
|
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(
|
|
51
|
+
this.alepha.with(useRouterState.PageDescriptorProvider).with(useRouterState.ReactBrowserProvider).with(useRouterState.BrowserRouterProvider).with(ReactBrowserRenderer);
|
|
15
52
|
}
|
|
16
53
|
}
|
|
17
|
-
core.__bind(
|
|
54
|
+
core.__bind(useRouterState.$page, ReactModule);
|
|
18
55
|
|
|
19
|
-
exports.$page =
|
|
20
|
-
exports.
|
|
21
|
-
exports.
|
|
22
|
-
exports.
|
|
23
|
-
exports.
|
|
24
|
-
exports.
|
|
25
|
-
exports.
|
|
26
|
-
exports.
|
|
27
|
-
exports.
|
|
28
|
-
exports.
|
|
29
|
-
exports.
|
|
30
|
-
exports.
|
|
31
|
-
exports.
|
|
32
|
-
exports.
|
|
33
|
-
exports.
|
|
34
|
-
exports.
|
|
35
|
-
exports.
|
|
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
|
package/dist/index.browser.js
CHANGED
|
@@ -1,19 +1,55 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
export { E as ErrorBoundary, L as Link, N as NestedView,
|
|
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
|
|
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: "
|
|
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(
|
|
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(
|
|
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
|
-
|
|
95
|
+
onConfigure = core.$hook({
|
|
97
96
|
name: "configure",
|
|
98
97
|
handler: async () => {
|
|
99
|
-
const pages = this.alepha.getDescriptorValues(
|
|
100
|
-
|
|
101
|
-
|
|
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(
|
|
118
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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(),
|
|
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
|
-
|
|
182
|
+
async configureVite(ssrEnabled) {
|
|
183
|
+
if (!ssrEnabled) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
157
186
|
this.log.info("SSR (vite) OK");
|
|
158
|
-
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
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
|
-
|
|
252
|
-
|
|
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
|
-
|
|
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(
|
|
359
|
+
this.alepha.with(server.ServerModule).with(server.ServerLinksProvider).with(useRouterState.PageDescriptorProvider).with(ReactServerProvider);
|
|
293
360
|
}
|
|
294
361
|
}
|
|
295
|
-
core.__bind(
|
|
362
|
+
core.__bind(useRouterState.$page, ReactModule);
|
|
296
363
|
|
|
297
|
-
exports.$page =
|
|
298
|
-
exports.
|
|
299
|
-
exports.
|
|
300
|
-
exports.
|
|
301
|
-
exports.
|
|
302
|
-
exports.
|
|
303
|
-
exports.
|
|
304
|
-
exports.
|
|
305
|
-
exports.
|
|
306
|
-
exports.
|
|
307
|
-
exports.
|
|
308
|
-
exports.
|
|
309
|
-
exports.
|
|
310
|
-
exports.
|
|
311
|
-
exports.
|
|
312
|
-
exports.
|
|
313
|
-
exports.
|
|
314
|
-
exports.
|
|
315
|
-
exports.
|
|
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
|