@lwrjs/core 0.9.0-alpha.3 → 0.9.0-alpha.31
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/build/cjs/context/provider.cjs +86 -0
- package/build/cjs/context/server.cjs +75 -0
- package/build/cjs/index.cjs +69 -153
- package/build/cjs/middleware/asset-middleware.cjs +70 -0
- package/build/cjs/middleware/bundle-middleware.cjs +113 -0
- package/build/cjs/{middlewares → middleware}/hmr-middleware.cjs +6 -6
- package/build/cjs/{middlewares → middleware}/locale-middleware.cjs +2 -2
- package/build/cjs/middleware/mapping-middleware.cjs +61 -0
- package/build/cjs/middleware/module-middleware.cjs +88 -0
- package/build/cjs/middleware/redirects/unsigned-module-redirect.cjs +37 -0
- package/build/cjs/middleware/resource-middleware.cjs +64 -0
- package/build/cjs/{context/services.cjs → middleware/utils/error-handling.cjs} +28 -15
- package/build/cjs/middleware/utils/identity.cjs +92 -0
- package/build/cjs/{context/hooks.cjs → middleware/utils/metadata.cjs} +17 -26
- package/build/cjs/{middlewares/utils.cjs → middleware/utils/request.cjs} +17 -16
- package/build/cjs/middleware/view-middleware.cjs +151 -0
- package/build/cjs/middleware.cjs +43 -0
- package/build/cjs/tools/server-warmup.cjs +2 -9
- package/build/cjs/tools/static-generation.cjs +189 -62
- package/build/es/context/provider.d.ts +3 -0
- package/build/es/context/provider.js +40 -0
- package/build/es/context/server.d.ts +3 -0
- package/build/es/context/server.js +49 -0
- package/build/es/index.d.ts +3 -1
- package/build/es/index.js +89 -150
- package/build/es/middleware/asset-middleware.d.ts +3 -0
- package/build/es/middleware/asset-middleware.js +42 -0
- package/build/es/middleware/bundle-middleware.d.ts +3 -0
- package/build/es/middleware/bundle-middleware.js +88 -0
- package/build/es/middleware/hmr-middleware.d.ts +5 -0
- package/build/es/{middlewares → middleware}/hmr-middleware.js +4 -4
- package/build/es/middleware/locale-middleware.d.ts +3 -0
- package/build/es/{middlewares → middleware}/locale-middleware.js +2 -1
- package/build/es/middleware/mapping-middleware.d.ts +3 -0
- package/build/es/middleware/mapping-middleware.js +34 -0
- package/build/es/middleware/module-middleware.d.ts +3 -0
- package/build/es/middleware/module-middleware.js +64 -0
- package/build/es/middleware/redirects/unsigned-module-redirect.d.ts +6 -0
- package/build/es/middleware/redirects/unsigned-module-redirect.js +25 -0
- package/build/es/middleware/resource-middleware.d.ts +3 -0
- package/build/es/middleware/resource-middleware.js +37 -0
- package/build/es/middleware/utils/error-handling.d.ts +3 -0
- package/build/es/middleware/utils/error-handling.js +32 -0
- package/build/es/middleware/utils/identity.d.ts +6 -0
- package/build/es/middleware/utils/identity.js +62 -0
- package/build/es/middleware/utils/metadata.d.ts +3 -0
- package/build/es/middleware/utils/metadata.js +24 -0
- package/build/es/middleware/utils/request.d.ts +15 -0
- package/build/es/{middlewares/utils.js → middleware/utils/request.js} +15 -23
- package/build/es/middleware/view-middleware.d.ts +3 -0
- package/build/es/middleware/view-middleware.js +136 -0
- package/build/es/middleware.d.ts +9 -0
- package/build/es/middleware.js +13 -0
- package/build/es/tools/server-warmup.js +3 -10
- package/build/es/tools/static-generation.d.ts +11 -1
- package/build/es/tools/static-generation.js +229 -79
- package/build/es/tools/types.d.ts +3 -2
- package/package.json +38 -34
- package/build/cjs/context/global-data.cjs +0 -54
- package/build/cjs/middlewares/api-middleware.cjs +0 -359
- package/build/cjs/middlewares/base-middleware.cjs +0 -15
- package/build/cjs/middlewares/ui-middleware.cjs +0 -183
- package/build/es/context/global-data.d.ts +0 -3
- package/build/es/context/global-data.js +0 -29
- package/build/es/context/hooks.d.ts +0 -9
- package/build/es/context/hooks.js +0 -36
- package/build/es/context/services.d.ts +0 -8
- package/build/es/context/services.js +0 -17
- package/build/es/middlewares/api-middleware.d.ts +0 -3
- package/build/es/middlewares/api-middleware.js +0 -410
- package/build/es/middlewares/base-middleware.d.ts +0 -3
- package/build/es/middlewares/base-middleware.js +0 -4
- package/build/es/middlewares/hmr-middleware.d.ts +0 -5
- package/build/es/middlewares/locale-middleware.d.ts +0 -3
- package/build/es/middlewares/ui-middleware.d.ts +0 -3
- package/build/es/middlewares/ui-middleware.js +0 -186
- package/build/es/middlewares/utils.d.ts +0 -22
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import ms from 'ms';
|
|
2
|
-
import { DiagnosticsError } from '@lwrjs/diagnostics';
|
|
3
|
-
import { LwrViewHandler } from '@lwrjs/view-registry';
|
|
4
|
-
import { isSupportedEnvironment } from './utils.js';
|
|
5
|
-
import { decodeViewPath, getClientBootstrapConfigurationRoutes, extractRequestParams, } from '@lwrjs/shared-utils';
|
|
6
|
-
import { getClientRoutes } from '@lwrjs/router';
|
|
7
|
-
export default function uiMiddleware(app, context) {
|
|
8
|
-
const { viewRegistry, moduleRegistry, runtimeEnvironment: defaultRuntimeEnvironment } = context;
|
|
9
|
-
const { environment: environmentConfig, routes, errorRoutes } = context.appConfig;
|
|
10
|
-
const route404 = errorRoutes.find((r) => r.status === 404);
|
|
11
|
-
const route500 = errorRoutes.find((r) => r.status === 500);
|
|
12
|
-
const viewHandler = new LwrViewHandler({ viewRegistry, moduleRegistry }, context.appConfig);
|
|
13
|
-
async function sendViewResponse(req, res, route, defaultStatus = 200) {
|
|
14
|
-
if (!req.validateJsonRequest()) {
|
|
15
|
-
res.status(400).send({ error: 'Accept header and json query parameter are incompatible' });
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
// UI URIs do not contain bundle IDs, so always use the environment default
|
|
19
|
-
req.params.bundleSpecifier = defaultRuntimeEnvironment.bundle ? '0' : undefined;
|
|
20
|
-
const { runtimeEnvironment, runtimeParams } = req.getRuntimeContext(defaultRuntimeEnvironment);
|
|
21
|
-
const targetEnvironment = runtimeParams.environment;
|
|
22
|
-
if (!isSupportedEnvironment(environmentConfig, targetEnvironment)) {
|
|
23
|
-
res.status(400).send({ error: `Environment "${targetEnvironment}" is not supported` });
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
if (!targetEnvironment && environmentConfig?.default) {
|
|
27
|
-
runtimeParams.environment = environmentConfig.default;
|
|
28
|
-
}
|
|
29
|
-
try {
|
|
30
|
-
// HTML document
|
|
31
|
-
const viewRequest = {
|
|
32
|
-
url: req.originalUrl,
|
|
33
|
-
params: req.params,
|
|
34
|
-
query: req.query,
|
|
35
|
-
requestPath: req.path, // Runtime resolved version vs. the original route path
|
|
36
|
-
};
|
|
37
|
-
const response = req.isJsonRequest()
|
|
38
|
-
? await viewHandler.getViewJson(viewRequest, route, runtimeEnvironment, runtimeParams)
|
|
39
|
-
: await viewHandler.getViewContent(viewRequest, route, runtimeEnvironment, runtimeParams);
|
|
40
|
-
const cacheTtl = response.cache?.ttl || route.cache?.ttl;
|
|
41
|
-
let ttl;
|
|
42
|
-
if (cacheTtl) {
|
|
43
|
-
ttl = typeof cacheTtl === 'string' ? ms(cacheTtl) / 1000 : cacheTtl;
|
|
44
|
-
res.setHeader('Cache-control', `public, max-age=${ttl}`);
|
|
45
|
-
}
|
|
46
|
-
const headers = response.headers || {
|
|
47
|
-
'Content-Type': 'text/html',
|
|
48
|
-
...(cacheTtl && { 'Cache-control': `public, max-age=${ttl}` }),
|
|
49
|
-
};
|
|
50
|
-
res.set(headers);
|
|
51
|
-
res.setMetadata(response.metadata);
|
|
52
|
-
const status = response.status ? response.status : defaultStatus;
|
|
53
|
-
res.status(status).send(response.body);
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
if (error instanceof DiagnosticsError) {
|
|
57
|
-
console.error('LWR Diagnostic Error: ' + error.message);
|
|
58
|
-
console.error(error.diagnostics);
|
|
59
|
-
console.error(error.stack);
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
console.error(error);
|
|
63
|
-
}
|
|
64
|
-
if (route500 && defaultStatus !== 500) {
|
|
65
|
-
await sendViewResponse(req, res, route500, 500);
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
res.status(500).send(`500 - Error retrieving view for route "${route.id}"`);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
async function sendConfigurationResponse(req, res, defaultStatus = 200) {
|
|
73
|
-
// UI URIs do not contain bundle IDs, so always use the environment default
|
|
74
|
-
req.params.bundleSpecifier = defaultRuntimeEnvironment.bundle ? '0' : undefined;
|
|
75
|
-
const { runtimeEnvironment, runtimeParams } = req.getRuntimeContext(defaultRuntimeEnvironment);
|
|
76
|
-
const { appId, encodedViewPath } = req.params;
|
|
77
|
-
// Match the route id
|
|
78
|
-
const route = routes.find((route) => route.id === appId);
|
|
79
|
-
if (!route) {
|
|
80
|
-
res.status(404).send({ error: `LWR configuration for appId "${appId}" is not available` });
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
try {
|
|
84
|
-
// decode the resolved view path and extract any params.
|
|
85
|
-
const url = decodeViewPath(encodedViewPath);
|
|
86
|
-
const requestPath = route.path;
|
|
87
|
-
const params = extractRequestParams(requestPath, url, req.params);
|
|
88
|
-
// HTML document
|
|
89
|
-
const viewRequest = {
|
|
90
|
-
url,
|
|
91
|
-
params,
|
|
92
|
-
query: req.query,
|
|
93
|
-
requestPath, // Runtime resolved version vs. the original route path
|
|
94
|
-
};
|
|
95
|
-
const response = await viewHandler.getViewConfiguration(viewRequest, route, runtimeEnvironment, runtimeParams);
|
|
96
|
-
if (!response) {
|
|
97
|
-
res.status(404).send({ error: `LWR configuration for viewPath "${url}" is not available` });
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
// Same cache ttl as the Content response
|
|
101
|
-
const cacheTtl = response.cache?.ttl || route.cache?.ttl;
|
|
102
|
-
let ttl;
|
|
103
|
-
if (cacheTtl) {
|
|
104
|
-
ttl = typeof cacheTtl === 'string' ? ms(cacheTtl) / 1000 : cacheTtl;
|
|
105
|
-
}
|
|
106
|
-
res.set({
|
|
107
|
-
'Content-Type': 'application/javascript',
|
|
108
|
-
...(cacheTtl && { 'Cache-control': `public, max-age=${ttl}` }),
|
|
109
|
-
});
|
|
110
|
-
const status = response.status ? response.status : defaultStatus;
|
|
111
|
-
res.status(status).send(response.body);
|
|
112
|
-
}
|
|
113
|
-
catch (error) {
|
|
114
|
-
if (error instanceof DiagnosticsError) {
|
|
115
|
-
console.error('LWR Diagnostic Error: ' + error.message);
|
|
116
|
-
console.error(error.diagnostics);
|
|
117
|
-
console.error(error.stack);
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
console.error(error);
|
|
121
|
-
}
|
|
122
|
-
if (route500 && defaultStatus !== 500) {
|
|
123
|
-
await sendViewResponse(req, res, route500, 500);
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
res.status(500).send(`500 - Error retrieving route "${route.id}"`);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
// -- Register each view ------------------------------------------------------------
|
|
131
|
-
routes.forEach((route) => {
|
|
132
|
-
// Seems like we only support get or post
|
|
133
|
-
if (route.method === 'post') {
|
|
134
|
-
app.post(route.path, async (req, res) => {
|
|
135
|
-
await sendViewResponse(req, res, route);
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
// Get the client-side routes
|
|
140
|
-
const serverPath = route.path;
|
|
141
|
-
const paths = [serverPath];
|
|
142
|
-
const subRoutes = route.subRoutes ? getClientRoutes(route.subRoutes) : undefined;
|
|
143
|
-
if (subRoutes) {
|
|
144
|
-
// Concatenate each client uri to the server route.path, creating the full list of composite paths
|
|
145
|
-
const prefix = serverPath === '/' ? '' : serverPath;
|
|
146
|
-
subRoutes.routes.forEach((r) => paths.push(`${prefix}${r.uri}`));
|
|
147
|
-
}
|
|
148
|
-
// Register the server route.path and each composite client path, to enable full page refreshes of client pages
|
|
149
|
-
paths.forEach((path) => {
|
|
150
|
-
// vanity urls
|
|
151
|
-
app.get(path, async (req, res) => {
|
|
152
|
-
await sendViewResponse(req, res, route);
|
|
153
|
-
});
|
|
154
|
-
// canonical URL
|
|
155
|
-
app.get([
|
|
156
|
-
`/:apiVersion/application/:format/l/:locale/ai/:appId${path}`,
|
|
157
|
-
`/:apiVersion/application/:format/l/:locale/e/:environment/ai/:appId${path}`,
|
|
158
|
-
`/:apiVersion/application/:format/ai/:appId${path}`,
|
|
159
|
-
`/:apiVersion/application/:format/e/:environment/ai/:appId${path}`,
|
|
160
|
-
], async (req, res) => {
|
|
161
|
-
await sendViewResponse(req, res, route);
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
const clientBootstrapConfigurationRoutes = getClientBootstrapConfigurationRoutes();
|
|
167
|
-
app.get(clientBootstrapConfigurationRoutes, async (req, res) => {
|
|
168
|
-
await sendConfigurationResponse(req, res);
|
|
169
|
-
});
|
|
170
|
-
// TODO nrkruk - This needs to be more generalized and visible at the top level of our middleware code.
|
|
171
|
-
// This is the only time we call initRoutes() - which adds all the routing middleware that has been declared previously
|
|
172
|
-
// to the app (get()/post()/all()). Any routing middleware declared after this point will not be initialized
|
|
173
|
-
// (for KOA and other server types where routing is not included in the base package).
|
|
174
|
-
// NOTE: THIS MUST BE ALWAYS CALLED BEFORE THE DEFAULT 404 ROUTE BELOW
|
|
175
|
-
app.initRoutes();
|
|
176
|
-
// -- Default 404 route -------------------------------------------------------------
|
|
177
|
-
app.use(async (req, res) => {
|
|
178
|
-
if (route404) {
|
|
179
|
-
await sendViewResponse(req, res, route404, 404);
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
res.status(404).send('404 - This page does not exist');
|
|
183
|
-
}
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
//# sourceMappingURL=ui-middleware.js.map
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import http from 'http';
|
|
3
|
-
import { EnvironmentConfig } from '@lwrjs/types';
|
|
4
|
-
import qs from 'qs';
|
|
5
|
-
interface Params {
|
|
6
|
-
[key: string]: string;
|
|
7
|
-
}
|
|
8
|
-
export declare function getRequestProperties(pattern: string, req: http.IncomingMessage): {
|
|
9
|
-
url: string;
|
|
10
|
-
params: Params;
|
|
11
|
-
query: qs.ParsedQs;
|
|
12
|
-
} | undefined;
|
|
13
|
-
/**
|
|
14
|
-
* Check if the target environment is supported by the application
|
|
15
|
-
*
|
|
16
|
-
* @param environmentConfig - environment property from app config
|
|
17
|
-
* @param targetEnvironment - environment value from module uri
|
|
18
|
-
* @returns boolean
|
|
19
|
-
*/
|
|
20
|
-
export declare function isSupportedEnvironment(environmentConfig: EnvironmentConfig, targetEnvironment: string): boolean;
|
|
21
|
-
export {};
|
|
22
|
-
//# sourceMappingURL=utils.d.ts.map
|