@lwrjs/core 0.17.2-alpha.3 → 0.17.2-alpha.5
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/middleware/bundle-middleware.cjs +4 -4
- package/build/cjs/middleware/mapping-middleware.cjs +1 -1
- package/build/cjs/middleware/module-middleware.cjs +3 -3
- package/build/cjs/middleware/resource-middleware.cjs +1 -1
- package/build/cjs/middleware/utils/error-handling.cjs +36 -9
- package/build/cjs/middleware/utils/identity.cjs +3 -3
- package/build/cjs/middleware/view-middleware.cjs +4 -26
- package/build/es/middleware/bundle-middleware.js +4 -4
- package/build/es/middleware/mapping-middleware.js +1 -1
- package/build/es/middleware/module-middleware.js +3 -3
- package/build/es/middleware/resource-middleware.js +1 -1
- package/build/es/middleware/utils/error-handling.d.ts +1 -1
- package/build/es/middleware/utils/error-handling.js +51 -11
- package/build/es/middleware/utils/identity.js +4 -4
- package/build/es/middleware/view-middleware.js +7 -32
- package/package.json +31 -31
|
@@ -45,17 +45,17 @@ function createBundleMiddleware(context) {
|
|
|
45
45
|
return async (req, res) => {
|
|
46
46
|
if (!req.validateEnvironmentRequest(appConfig)) {
|
|
47
47
|
res.status(400);
|
|
48
|
-
res.send(import_diagnostics.descriptions.
|
|
48
|
+
res.send(import_diagnostics.descriptions.INVALID.INVALID_ENVIRONMENT(req.params.environment));
|
|
49
49
|
return;
|
|
50
50
|
}
|
|
51
51
|
if (!req.validateJsonRequest()) {
|
|
52
52
|
res.status(400);
|
|
53
|
-
res.send(import_diagnostics.descriptions.
|
|
53
|
+
res.send(import_diagnostics.descriptions.INVALID.INVALID_JSON());
|
|
54
54
|
return;
|
|
55
55
|
}
|
|
56
56
|
if (!req.validateApiVersion(appConfig)) {
|
|
57
57
|
res.status(400);
|
|
58
|
-
res.send(import_diagnostics.descriptions.
|
|
58
|
+
res.send(import_diagnostics.descriptions.INVALID.INVALID_API_VERSION(req.params.apiVersion, appConfig.apiVersion));
|
|
59
59
|
return;
|
|
60
60
|
}
|
|
61
61
|
const {runtimeEnvironment, runtimeParams} = req.getRuntimeContext(defaultRuntimeEnvironment);
|
|
@@ -92,7 +92,7 @@ function createSourceMapMiddleware(context) {
|
|
|
92
92
|
return async (req, res) => {
|
|
93
93
|
if (!req.validateEnvironmentRequest(appConfig)) {
|
|
94
94
|
res.status(400);
|
|
95
|
-
res.send(import_diagnostics.descriptions.
|
|
95
|
+
res.send(import_diagnostics.descriptions.INVALID.INVALID_ENVIRONMENT(req.params.environment));
|
|
96
96
|
return;
|
|
97
97
|
}
|
|
98
98
|
const {runtimeEnvironment} = req.getRuntimeContext(defaultRuntimeEnvironment);
|
|
@@ -41,7 +41,7 @@ function createMappingMiddleware(context) {
|
|
|
41
41
|
return async (req, res) => {
|
|
42
42
|
if (!req.validateEnvironmentRequest(appConfig)) {
|
|
43
43
|
res.status(400);
|
|
44
|
-
res.send(import_diagnostics.descriptions.
|
|
44
|
+
res.send(import_diagnostics.descriptions.INVALID.INVALID_ENVIRONMENT(req.params.environment));
|
|
45
45
|
return;
|
|
46
46
|
}
|
|
47
47
|
const {runtimeEnvironment, runtimeParams} = req.getRuntimeContext(defaultRuntimeEnvironment);
|
|
@@ -39,17 +39,17 @@ function createModuleMiddleware(context) {
|
|
|
39
39
|
return async (req, res) => {
|
|
40
40
|
if (!req.validateEnvironmentRequest(appConfig)) {
|
|
41
41
|
res.status(400);
|
|
42
|
-
res.send(import_diagnostics.descriptions.
|
|
42
|
+
res.send(import_diagnostics.descriptions.INVALID.INVALID_ENVIRONMENT(req.params.environment));
|
|
43
43
|
return;
|
|
44
44
|
}
|
|
45
45
|
if (!req.validateJsonRequest()) {
|
|
46
46
|
res.status(400);
|
|
47
|
-
res.send(import_diagnostics.descriptions.
|
|
47
|
+
res.send(import_diagnostics.descriptions.INVALID.INVALID_JSON());
|
|
48
48
|
return;
|
|
49
49
|
}
|
|
50
50
|
if (!req.validateApiVersion(appConfig)) {
|
|
51
51
|
res.status(400);
|
|
52
|
-
res.send(import_diagnostics.descriptions.
|
|
52
|
+
res.send(import_diagnostics.descriptions.INVALID.INVALID_API_VERSION(req.params.apiVersion, appConfig.apiVersion));
|
|
53
53
|
return;
|
|
54
54
|
}
|
|
55
55
|
const {runtimeEnvironment, runtimeParams} = req.getRuntimeContext(defaultRuntimeEnvironment);
|
|
@@ -33,7 +33,7 @@ function createResourceMiddleware(context) {
|
|
|
33
33
|
const {appConfig, resourceRegistry, runtimeEnvironment: defaultRuntimeEnvironment} = context;
|
|
34
34
|
return async (req, res) => {
|
|
35
35
|
if (!req.validateEnvironmentRequest(appConfig)) {
|
|
36
|
-
res.status(400).send(import_diagnostics.descriptions.
|
|
36
|
+
res.status(400).send(import_diagnostics.descriptions.INVALID.INVALID_ENVIRONMENT(req.params.environment));
|
|
37
37
|
return;
|
|
38
38
|
}
|
|
39
39
|
const {runtimeEnvironment, runtimeParams} = req.getRuntimeContext(defaultRuntimeEnvironment);
|
|
@@ -28,16 +28,42 @@ __export(exports, {
|
|
|
28
28
|
});
|
|
29
29
|
var import_diagnostics = __toModule(require("@lwrjs/diagnostics"));
|
|
30
30
|
var import_diagnostics2 = __toModule(require("@lwrjs/diagnostics"));
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
var import_shared_utils = __toModule(require("@lwrjs/shared-utils"));
|
|
32
|
+
function addRedirectQueryParam(redirectUrl, depth) {
|
|
33
|
+
const fakeOrigin = "http://parse.com";
|
|
34
|
+
const url = (0, import_shared_utils.isURL)(redirectUrl) ? new URL(redirectUrl) : new URL(`${fakeOrigin}${redirectUrl}`);
|
|
35
|
+
url.searchParams.set(import_shared_utils.REQUEST_DEPTH_KEY, String(depth + 1));
|
|
36
|
+
return url.toString().replace(fakeOrigin, "");
|
|
37
|
+
}
|
|
38
|
+
function createReturnStatus(error, req, debug) {
|
|
39
|
+
let status = 500, body = error.message || "";
|
|
40
|
+
const headers = {};
|
|
41
|
+
if (error instanceof import_diagnostics.LwrStatusError) {
|
|
42
|
+
status = error.status;
|
|
43
|
+
const rawHeaders = error.headers || {};
|
|
44
|
+
Object.entries(rawHeaders).forEach(([key, value]) => headers[key.toLowerCase()] = value);
|
|
45
|
+
if (status === 301 || status === 302) {
|
|
46
|
+
const location = headers.location;
|
|
47
|
+
if (location && (0, import_shared_utils.isURL)(location) || location?.startsWith("/")) {
|
|
48
|
+
headers.location = addRedirectQueryParam(location, (0, import_shared_utils.parseRequestDepth)(req.headers, req.query));
|
|
49
|
+
} else {
|
|
50
|
+
import_diagnostics2.logger.warn(`[error-middleware] Invalid location header for HTTP status ${status}: "${location}"`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (error instanceof import_diagnostics.LwrInvalidError) {
|
|
55
|
+
status = 400;
|
|
56
|
+
} else if (error instanceof import_diagnostics.LwrUnresolvableError) {
|
|
57
|
+
status = 404;
|
|
58
|
+
} else {
|
|
59
|
+
body = error instanceof import_diagnostics.LwrError ? body : `${import_diagnostics.descriptions.SERVER.SERVER_ERROR(req.originalUrl)}: ${body}`;
|
|
34
60
|
}
|
|
35
|
-
if (
|
|
36
|
-
|
|
61
|
+
if (debug) {
|
|
62
|
+
body = `<div style="font-family:sans-serif;margin:50px;"><h1>${status}: Document generation failed</h1><p>${body.replace(/</g, "<").replace(/>/g, ">")}</p></div>`;
|
|
37
63
|
}
|
|
38
|
-
return {status
|
|
64
|
+
return {status, body, headers: Object.keys(headers).length > 0 ? headers : void 0};
|
|
39
65
|
}
|
|
40
|
-
function handleErrors(middleware) {
|
|
66
|
+
function handleErrors(middleware, isBaseDoc = false) {
|
|
41
67
|
return async (req, res, next) => {
|
|
42
68
|
try {
|
|
43
69
|
await middleware(req, res, next);
|
|
@@ -49,9 +75,10 @@ function handleErrors(middleware) {
|
|
|
49
75
|
} else {
|
|
50
76
|
import_diagnostics2.logger.error(err);
|
|
51
77
|
}
|
|
52
|
-
const {status,
|
|
78
|
+
const {status, body, headers} = createReturnStatus(err, req, req.query.debug !== void 0 && isBaseDoc);
|
|
79
|
+
headers && res.set(headers);
|
|
53
80
|
res.status(status);
|
|
54
|
-
res.send(
|
|
81
|
+
res.send(body);
|
|
55
82
|
}
|
|
56
83
|
};
|
|
57
84
|
}
|
|
@@ -37,7 +37,7 @@ function validateSpecifier(specifer) {
|
|
|
37
37
|
function getModuleIdentity(req, importer) {
|
|
38
38
|
const {specifier, signature} = req.params;
|
|
39
39
|
if (validateSpecifier(specifier) === false) {
|
|
40
|
-
throw new import_diagnostics.
|
|
40
|
+
throw new import_diagnostics.LwrInvalidError(import_diagnostics.descriptions.INVALID.INVALID_SPECIFIER(specifier));
|
|
41
41
|
}
|
|
42
42
|
const moduleId = (0, import_shared_utils.explodeSpecifier)(specifier);
|
|
43
43
|
return {
|
|
@@ -61,7 +61,7 @@ function getMappingIdentity(req) {
|
|
|
61
61
|
function getResourceIdentity(req) {
|
|
62
62
|
const {specifier, signature = import_shared_utils.LATEST_SIGNATURE} = req.params;
|
|
63
63
|
if (validateSpecifier(specifier) === false) {
|
|
64
|
-
throw new import_diagnostics.
|
|
64
|
+
throw new import_diagnostics.LwrInvalidError(import_diagnostics.descriptions.INVALID.INVALID_SPECIFIER(specifier));
|
|
65
65
|
}
|
|
66
66
|
const resourceId = (0, import_shared_utils.explodeSpecifier)(specifier);
|
|
67
67
|
return {
|
|
@@ -73,7 +73,7 @@ function getAssetIdentity(req) {
|
|
|
73
73
|
const {signature, immutable, assetType: type} = req.params;
|
|
74
74
|
const specifier = type ? process.platform === "win32" ? req.params[0] : "/" + req.params[0] : req.originalUrl.split("?")[0];
|
|
75
75
|
if (validateSpecifier(specifier) === false) {
|
|
76
|
-
throw new import_diagnostics.
|
|
76
|
+
throw new import_diagnostics.LwrInvalidError(import_diagnostics.descriptions.INVALID.INVALID_SPECIFIER(specifier));
|
|
77
77
|
}
|
|
78
78
|
return {
|
|
79
79
|
immutable,
|
|
@@ -45,12 +45,12 @@ function createViewMiddleware(route, errorRoutes, context, viewHandler) {
|
|
|
45
45
|
return async (req, res) => {
|
|
46
46
|
if (!req.validateEnvironmentRequest(appConfig)) {
|
|
47
47
|
res.status(400);
|
|
48
|
-
res.send(import_diagnostics.descriptions.
|
|
48
|
+
res.send(import_diagnostics.descriptions.INVALID.INVALID_ENVIRONMENT(req.params.environment));
|
|
49
49
|
return;
|
|
50
50
|
}
|
|
51
51
|
if (!req.validateJsonRequest()) {
|
|
52
52
|
res.status(400);
|
|
53
|
-
res.send(import_diagnostics.descriptions.
|
|
53
|
+
res.send(import_diagnostics.descriptions.INVALID.INVALID_JSON());
|
|
54
54
|
return;
|
|
55
55
|
}
|
|
56
56
|
const {runtimeEnvironment, runtimeParams: defaultRuntimeParams} = req.getRuntimeContext(context.runtimeEnvironment);
|
|
@@ -96,7 +96,7 @@ function createViewMiddleware(route, errorRoutes, context, viewHandler) {
|
|
|
96
96
|
});
|
|
97
97
|
resolvedRoute = route;
|
|
98
98
|
} catch (err) {
|
|
99
|
-
if (!errorRoute) {
|
|
99
|
+
if (!errorRoute || runtimeEnvironment.debug) {
|
|
100
100
|
throw err;
|
|
101
101
|
}
|
|
102
102
|
import_diagnostics.logger.error(`[view-middleware] Route Error ${req.originalUrl}`);
|
|
@@ -136,24 +136,8 @@ function createViewMiddleware(route, errorRoutes, context, viewHandler) {
|
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
let status = resolvedRoute.status || viewResponse.status || 200;
|
|
139
|
-
const viewDefinitionStatus = viewResponse.metadata?.viewDefinition?.status;
|
|
140
139
|
if (viewResponse.status === 301 || viewResponse.status === 302) {
|
|
141
140
|
status = viewResponse.status;
|
|
142
|
-
} else if (viewDefinitionStatus && viewDefinitionStatus.code) {
|
|
143
|
-
const origStatus = status;
|
|
144
|
-
const {code, location} = viewDefinitionStatus;
|
|
145
|
-
const isRedirect = code === 301 || code === 302;
|
|
146
|
-
status = code;
|
|
147
|
-
if (isRedirect) {
|
|
148
|
-
if (location && (0, import_shared_utils.isURL)(location) || location?.startsWith("/")) {
|
|
149
|
-
res.set({
|
|
150
|
-
location: addRedirectQueryParam(location, (0, import_shared_utils.parseRequestDepth)(req.headers, req.query))
|
|
151
|
-
});
|
|
152
|
-
} else {
|
|
153
|
-
status = origStatus;
|
|
154
|
-
import_diagnostics.logger.warn(`[view-middleware] Ignoring invalid location header: "${location}"`);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
141
|
}
|
|
158
142
|
res.status(status);
|
|
159
143
|
const viewResponseBody = viewResponse.body;
|
|
@@ -264,7 +248,7 @@ function viewMiddleware(app, context) {
|
|
|
264
248
|
}
|
|
265
249
|
}
|
|
266
250
|
import_diagnostics.logger.debug({label: `view-middleware`, message: `Add view paths ${paths}`});
|
|
267
|
-
app.get(paths, (0, import_error_handling.handleErrors)(createViewMiddleware(route, errorRoutes, context, viewHandler)));
|
|
251
|
+
app.get(paths, (0, import_error_handling.handleErrors)(createViewMiddleware(route, errorRoutes, context, viewHandler), true));
|
|
268
252
|
}
|
|
269
253
|
app.get((0, import_shared_utils.getClientBootstrapConfigurationRoutes)(), (0, import_error_handling.handleErrors)(createConfigMiddleware(routes, context, viewHandler)));
|
|
270
254
|
app.get("/" + app.getRegexWildcard(), (0, import_error_handling.handleErrors)(createNotFoundMiddleware(errorRoutes, context, viewHandler)));
|
|
@@ -299,12 +283,6 @@ function addDefaultLocaleRedirects(defaultLocale, defaultLocalePaths, defaultRed
|
|
|
299
283
|
return res.sendStatus(301);
|
|
300
284
|
});
|
|
301
285
|
}
|
|
302
|
-
function addRedirectQueryParam(redirectUrl, depth) {
|
|
303
|
-
const fakeOrigin = "http://parse.com";
|
|
304
|
-
const url = (0, import_shared_utils.isURL)(redirectUrl) ? new URL(redirectUrl) : new URL(`${fakeOrigin}${redirectUrl}`);
|
|
305
|
-
url.searchParams.set(import_shared_utils.REQUEST_DEPTH_KEY, String(depth + 1));
|
|
306
|
-
return url.toString().replace(fakeOrigin, "");
|
|
307
|
-
}
|
|
308
286
|
function byteSize(body) {
|
|
309
287
|
if (Buffer.isBuffer(body)) {
|
|
310
288
|
return body.length;
|
|
@@ -12,17 +12,17 @@ function createBundleMiddleware(context) {
|
|
|
12
12
|
return async (req, res) => {
|
|
13
13
|
if (!req.validateEnvironmentRequest(appConfig)) {
|
|
14
14
|
res.status(400);
|
|
15
|
-
res.send(descriptions.
|
|
15
|
+
res.send(descriptions.INVALID.INVALID_ENVIRONMENT(req.params.environment));
|
|
16
16
|
return;
|
|
17
17
|
}
|
|
18
18
|
if (!req.validateJsonRequest()) {
|
|
19
19
|
res.status(400);
|
|
20
|
-
res.send(descriptions.
|
|
20
|
+
res.send(descriptions.INVALID.INVALID_JSON());
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
23
23
|
if (!req.validateApiVersion(appConfig)) {
|
|
24
24
|
res.status(400);
|
|
25
|
-
res.send(descriptions.
|
|
25
|
+
res.send(descriptions.INVALID.INVALID_API_VERSION(req.params.apiVersion, appConfig.apiVersion));
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
28
|
const { runtimeEnvironment, runtimeParams } = req.getRuntimeContext(defaultRuntimeEnvironment);
|
|
@@ -65,7 +65,7 @@ function createSourceMapMiddleware(context) {
|
|
|
65
65
|
return async (req, res) => {
|
|
66
66
|
if (!req.validateEnvironmentRequest(appConfig)) {
|
|
67
67
|
res.status(400);
|
|
68
|
-
res.send(descriptions.
|
|
68
|
+
res.send(descriptions.INVALID.INVALID_ENVIRONMENT(req.params.environment));
|
|
69
69
|
return;
|
|
70
70
|
}
|
|
71
71
|
const { runtimeEnvironment } = req.getRuntimeContext(defaultRuntimeEnvironment);
|
|
@@ -8,7 +8,7 @@ function createMappingMiddleware(context) {
|
|
|
8
8
|
return async (req, res) => {
|
|
9
9
|
if (!req.validateEnvironmentRequest(appConfig)) {
|
|
10
10
|
res.status(400);
|
|
11
|
-
res.send(descriptions.
|
|
11
|
+
res.send(descriptions.INVALID.INVALID_ENVIRONMENT(req.params.environment));
|
|
12
12
|
return;
|
|
13
13
|
}
|
|
14
14
|
const { runtimeEnvironment, runtimeParams } = req.getRuntimeContext(defaultRuntimeEnvironment);
|
|
@@ -11,17 +11,17 @@ function createModuleMiddleware(context) {
|
|
|
11
11
|
return async (req, res) => {
|
|
12
12
|
if (!req.validateEnvironmentRequest(appConfig)) {
|
|
13
13
|
res.status(400);
|
|
14
|
-
res.send(descriptions.
|
|
14
|
+
res.send(descriptions.INVALID.INVALID_ENVIRONMENT(req.params.environment));
|
|
15
15
|
return;
|
|
16
16
|
}
|
|
17
17
|
if (!req.validateJsonRequest()) {
|
|
18
18
|
res.status(400);
|
|
19
|
-
res.send(descriptions.
|
|
19
|
+
res.send(descriptions.INVALID.INVALID_JSON());
|
|
20
20
|
return;
|
|
21
21
|
}
|
|
22
22
|
if (!req.validateApiVersion(appConfig)) {
|
|
23
23
|
res.status(400);
|
|
24
|
-
res.send(descriptions.
|
|
24
|
+
res.send(descriptions.INVALID.INVALID_API_VERSION(req.params.apiVersion, appConfig.apiVersion));
|
|
25
25
|
return;
|
|
26
26
|
}
|
|
27
27
|
const { runtimeEnvironment, runtimeParams } = req.getRuntimeContext(defaultRuntimeEnvironment);
|
|
@@ -5,7 +5,7 @@ function createResourceMiddleware(context) {
|
|
|
5
5
|
const { appConfig, resourceRegistry, runtimeEnvironment: defaultRuntimeEnvironment } = context;
|
|
6
6
|
return async (req, res) => {
|
|
7
7
|
if (!req.validateEnvironmentRequest(appConfig)) {
|
|
8
|
-
res.status(400).send(descriptions.
|
|
8
|
+
res.status(400).send(descriptions.INVALID.INVALID_ENVIRONMENT(req.params.environment));
|
|
9
9
|
return;
|
|
10
10
|
}
|
|
11
11
|
const { runtimeEnvironment, runtimeParams } = req.getRuntimeContext(defaultRuntimeEnvironment);
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { MiddlewareFunction } from '@lwrjs/types';
|
|
2
|
-
export declare function handleErrors(middleware: MiddlewareFunction): MiddlewareFunction;
|
|
2
|
+
export declare function handleErrors(middleware: MiddlewareFunction, isBaseDoc?: boolean): MiddlewareFunction;
|
|
3
3
|
//# sourceMappingURL=error-handling.d.ts.map
|
|
@@ -1,16 +1,53 @@
|
|
|
1
|
-
import { descriptions, DiagnosticsError,
|
|
1
|
+
import { descriptions, DiagnosticsError, LwrError, LwrInvalidError, LwrStatusError, LwrUnresolvableError, } from '@lwrjs/diagnostics';
|
|
2
2
|
import { logger } from '@lwrjs/diagnostics';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
import { isURL, parseRequestDepth, REQUEST_DEPTH_KEY } from '@lwrjs/shared-utils';
|
|
4
|
+
function addRedirectQueryParam(redirectUrl, depth) {
|
|
5
|
+
// add a request depth query param to the URL
|
|
6
|
+
// the depth header cannot be used since headers cannot be added to a redirect
|
|
7
|
+
const fakeOrigin = 'http://parse.com';
|
|
8
|
+
const url = isURL(redirectUrl) ? new URL(redirectUrl) : new URL(`${fakeOrigin}${redirectUrl}`);
|
|
9
|
+
url.searchParams.set(REQUEST_DEPTH_KEY, String(depth + 1));
|
|
10
|
+
return url.toString().replace(fakeOrigin, '');
|
|
11
|
+
}
|
|
12
|
+
function createReturnStatus(error, req, debug) {
|
|
13
|
+
let status = 500, body = error.message || '';
|
|
14
|
+
const headers = {};
|
|
15
|
+
if (error instanceof LwrStatusError) {
|
|
16
|
+
// handle special HTTP statuses, eg: 301, 302, 429, 503
|
|
17
|
+
status = error.status;
|
|
18
|
+
const rawHeaders = error.headers || {};
|
|
19
|
+
Object.entries(rawHeaders).forEach(([key, value]) => (headers[key.toLowerCase()] = value));
|
|
20
|
+
if (status === 301 || status === 302) {
|
|
21
|
+
// handle redirect
|
|
22
|
+
const location = headers.location;
|
|
23
|
+
if ((location && isURL(location)) || location?.startsWith('/')) {
|
|
24
|
+
headers.location = addRedirectQueryParam(location, parseRequestDepth(req.headers, req.query));
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
logger.warn(`[error-middleware] Invalid location header for HTTP status ${status}: "${location}"`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (error instanceof LwrInvalidError) {
|
|
32
|
+
status = 400;
|
|
33
|
+
}
|
|
34
|
+
else if (error instanceof LwrUnresolvableError) {
|
|
35
|
+
status = 404;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// catchall: likely a LwrServerError
|
|
39
|
+
body =
|
|
40
|
+
error instanceof LwrError
|
|
41
|
+
? body
|
|
42
|
+
: `${descriptions.SERVER.SERVER_ERROR(req.originalUrl)}: ${body}`;
|
|
6
43
|
}
|
|
7
|
-
if (
|
|
8
|
-
return
|
|
44
|
+
if (debug) {
|
|
45
|
+
// return a debug base doc if debug mode is on
|
|
46
|
+
body = `<div style="font-family:sans-serif;margin:50px;"><h1>${status}: Document generation failed</h1><p>${body.replace(/</g, '<').replace(/>/g, '>')}</p></div>`;
|
|
9
47
|
}
|
|
10
|
-
|
|
11
|
-
return { status: 500, message: `${descriptions.SERVER.SERVER_ERROR(url)}: ${error.message}` };
|
|
48
|
+
return { status, body, headers: Object.keys(headers).length > 0 ? headers : undefined };
|
|
12
49
|
}
|
|
13
|
-
export function handleErrors(middleware) {
|
|
50
|
+
export function handleErrors(middleware, isBaseDoc = false) {
|
|
14
51
|
return async (req, res, next) => {
|
|
15
52
|
try {
|
|
16
53
|
await middleware(req, res, next);
|
|
@@ -24,9 +61,12 @@ export function handleErrors(middleware) {
|
|
|
24
61
|
else {
|
|
25
62
|
logger.error(err);
|
|
26
63
|
}
|
|
27
|
-
const { status,
|
|
64
|
+
const { status, body, headers } = createReturnStatus(err, req,
|
|
65
|
+
// only return HTML error screen for base doc requests in debug mode
|
|
66
|
+
req.query.debug !== undefined && isBaseDoc);
|
|
67
|
+
headers && res.set(headers);
|
|
28
68
|
res.status(status);
|
|
29
|
-
res.send(
|
|
69
|
+
res.send(body);
|
|
30
70
|
}
|
|
31
71
|
};
|
|
32
72
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { explodeSpecifier, explodeSpecifiers, LATEST_SIGNATURE } from '@lwrjs/shared-utils';
|
|
2
|
-
import { descriptions,
|
|
2
|
+
import { descriptions, LwrInvalidError } from '@lwrjs/diagnostics';
|
|
3
3
|
function validateSpecifier(specifer) {
|
|
4
4
|
return specifer.indexOf('../') < 0;
|
|
5
5
|
}
|
|
6
6
|
export function getModuleIdentity(req, importer) {
|
|
7
7
|
const { specifier, signature } = req.params;
|
|
8
8
|
if (validateSpecifier(specifier) === false) {
|
|
9
|
-
throw new
|
|
9
|
+
throw new LwrInvalidError(descriptions.INVALID.INVALID_SPECIFIER(specifier));
|
|
10
10
|
}
|
|
11
11
|
const moduleId = explodeSpecifier(specifier);
|
|
12
12
|
return {
|
|
@@ -30,7 +30,7 @@ export function getMappingIdentity(req) {
|
|
|
30
30
|
export function getResourceIdentity(req) {
|
|
31
31
|
const { specifier, signature = LATEST_SIGNATURE } = req.params;
|
|
32
32
|
if (validateSpecifier(specifier) === false) {
|
|
33
|
-
throw new
|
|
33
|
+
throw new LwrInvalidError(descriptions.INVALID.INVALID_SPECIFIER(specifier));
|
|
34
34
|
}
|
|
35
35
|
const resourceId = explodeSpecifier(specifier);
|
|
36
36
|
return {
|
|
@@ -46,7 +46,7 @@ export function getAssetIdentity(req) {
|
|
|
46
46
|
: '/' + req.params[0]
|
|
47
47
|
: req.originalUrl.split('?')[0];
|
|
48
48
|
if (validateSpecifier(specifier) === false) {
|
|
49
|
-
throw new
|
|
49
|
+
throw new LwrInvalidError(descriptions.INVALID.INVALID_SPECIFIER(specifier));
|
|
50
50
|
}
|
|
51
51
|
return {
|
|
52
52
|
immutable,
|
|
@@ -2,7 +2,7 @@ import { TextEncoder } from 'util';
|
|
|
2
2
|
import { URLSearchParams } from 'url';
|
|
3
3
|
import { descriptions, logger } from '@lwrjs/diagnostics';
|
|
4
4
|
import { getClientRoutes } from '@lwrjs/router';
|
|
5
|
-
import { decodeViewPath, extractRequestParams, getClientBootstrapConfigurationRoutes,
|
|
5
|
+
import { decodeViewPath, extractRequestParams, getClientBootstrapConfigurationRoutes, isLocalDev, shortestTtl, isLambdaEnv, } from '@lwrjs/shared-utils';
|
|
6
6
|
import { RequestHandlerSpan, getTracer } from '@lwrjs/instrumentation';
|
|
7
7
|
import { handleErrors } from './utils/error-handling.js';
|
|
8
8
|
import { LwrViewHandler } from '@lwrjs/view-registry';
|
|
@@ -17,12 +17,12 @@ function createViewMiddleware(route, errorRoutes, context, viewHandler) {
|
|
|
17
17
|
return async (req, res) => {
|
|
18
18
|
if (!req.validateEnvironmentRequest(appConfig)) {
|
|
19
19
|
res.status(400);
|
|
20
|
-
res.send(descriptions.
|
|
20
|
+
res.send(descriptions.INVALID.INVALID_ENVIRONMENT(req.params.environment));
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
23
23
|
if (!req.validateJsonRequest()) {
|
|
24
24
|
res.status(400);
|
|
25
|
-
res.send(descriptions.
|
|
25
|
+
res.send(descriptions.INVALID.INVALID_JSON());
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
28
|
const { runtimeEnvironment, runtimeParams: defaultRuntimeParams } = req.getRuntimeContext(context.runtimeEnvironment);
|
|
@@ -72,7 +72,9 @@ function createViewMiddleware(route, errorRoutes, context, viewHandler) {
|
|
|
72
72
|
resolvedRoute = route;
|
|
73
73
|
}
|
|
74
74
|
catch (err) {
|
|
75
|
-
if (!errorRoute) {
|
|
75
|
+
if (!errorRoute || runtimeEnvironment.debug) {
|
|
76
|
+
// this is handled by the error middleware
|
|
77
|
+
// when debug mode is on, always show the error screen
|
|
76
78
|
throw err;
|
|
77
79
|
}
|
|
78
80
|
// Log Unexpected Routing Errors
|
|
@@ -119,29 +121,10 @@ function createViewMiddleware(route, errorRoutes, context, viewHandler) {
|
|
|
119
121
|
}
|
|
120
122
|
}
|
|
121
123
|
let status = resolvedRoute.status || viewResponse.status || 200;
|
|
122
|
-
const viewDefinitionStatus = viewResponse.metadata?.viewDefinition?.status;
|
|
123
124
|
if (viewResponse.status === 301 || viewResponse.status === 302) {
|
|
124
125
|
// route handle redirect status takes precedence
|
|
125
126
|
status = viewResponse.status;
|
|
126
127
|
}
|
|
127
|
-
else if (viewDefinitionStatus && viewDefinitionStatus.code) {
|
|
128
|
-
const origStatus = status;
|
|
129
|
-
const { code, location } = viewDefinitionStatus;
|
|
130
|
-
const isRedirect = code === 301 || code === 302;
|
|
131
|
-
status = code;
|
|
132
|
-
if (isRedirect) {
|
|
133
|
-
if ((location && isURL(location)) || location?.startsWith('/')) {
|
|
134
|
-
res.set({
|
|
135
|
-
location: addRedirectQueryParam(location, parseRequestDepth(req.headers, req.query)),
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
// reset the status in the event of an invalid location when redirecting
|
|
140
|
-
status = origStatus;
|
|
141
|
-
logger.warn(`[view-middleware] Ignoring invalid location header: "${location}"`);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
128
|
res.status(status);
|
|
146
129
|
// LWR@MRT 254 temporary safeguard for "dupe styles" issue causing huge base docs
|
|
147
130
|
// Re-evaluate for removal once we determine it is no longer needed: W-17201070
|
|
@@ -272,7 +255,7 @@ export function viewMiddleware(app, context) {
|
|
|
272
255
|
}
|
|
273
256
|
}
|
|
274
257
|
logger.debug({ label: `view-middleware`, message: `Add view paths ${paths}` });
|
|
275
|
-
app.get(paths, handleErrors(createViewMiddleware(route, errorRoutes, context, viewHandler)));
|
|
258
|
+
app.get(paths, handleErrors(createViewMiddleware(route, errorRoutes, context, viewHandler), true));
|
|
276
259
|
}
|
|
277
260
|
// create and attach middleware for bootstrap configurations
|
|
278
261
|
app.get(getClientBootstrapConfigurationRoutes(), handleErrors(createConfigMiddleware(routes, context, viewHandler)));
|
|
@@ -325,14 +308,6 @@ function addDefaultLocaleRedirects(defaultLocale, defaultLocalePaths, defaultRed
|
|
|
325
308
|
return res.sendStatus(301);
|
|
326
309
|
});
|
|
327
310
|
}
|
|
328
|
-
function addRedirectQueryParam(redirectUrl, depth) {
|
|
329
|
-
// add a request depth query param to the URL
|
|
330
|
-
// the depth header cannot be used since headers cannot be added to a redirect
|
|
331
|
-
const fakeOrigin = 'http://parse.com';
|
|
332
|
-
const url = isURL(redirectUrl) ? new URL(redirectUrl) : new URL(`${fakeOrigin}${redirectUrl}`);
|
|
333
|
-
url.searchParams.set(REQUEST_DEPTH_KEY, String(depth + 1));
|
|
334
|
-
return url.toString().replace(fakeOrigin, '');
|
|
335
|
-
}
|
|
336
311
|
// Get number of bytes from a string. Different char encodings can effect size per char.
|
|
337
312
|
function byteSize(body) {
|
|
338
313
|
if (Buffer.isBuffer(body)) {
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
|
-
"version": "0.17.2-alpha.
|
|
7
|
+
"version": "0.17.2-alpha.5",
|
|
8
8
|
"homepage": "https://developer.salesforce.com/docs/platform/lwr/overview",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
@@ -43,34 +43,34 @@
|
|
|
43
43
|
"build": "tsc -b"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@lwrjs/app-service": "0.17.2-alpha.
|
|
47
|
-
"@lwrjs/asset-registry": "0.17.2-alpha.
|
|
48
|
-
"@lwrjs/asset-transformer": "0.17.2-alpha.
|
|
49
|
-
"@lwrjs/base-view-provider": "0.17.2-alpha.
|
|
50
|
-
"@lwrjs/base-view-transformer": "0.17.2-alpha.
|
|
51
|
-
"@lwrjs/client-modules": "0.17.2-alpha.
|
|
52
|
-
"@lwrjs/config": "0.17.2-alpha.
|
|
53
|
-
"@lwrjs/diagnostics": "0.17.2-alpha.
|
|
54
|
-
"@lwrjs/esbuild": "0.17.2-alpha.
|
|
55
|
-
"@lwrjs/fs-asset-provider": "0.17.2-alpha.
|
|
56
|
-
"@lwrjs/fs-watch": "0.17.2-alpha.
|
|
57
|
-
"@lwrjs/html-view-provider": "0.17.2-alpha.
|
|
58
|
-
"@lwrjs/instrumentation": "0.17.2-alpha.
|
|
59
|
-
"@lwrjs/loader": "0.17.2-alpha.
|
|
60
|
-
"@lwrjs/lwc-module-provider": "0.17.2-alpha.
|
|
61
|
-
"@lwrjs/lwc-ssr": "0.17.2-alpha.
|
|
62
|
-
"@lwrjs/markdown-view-provider": "0.17.2-alpha.
|
|
63
|
-
"@lwrjs/module-bundler": "0.17.2-alpha.
|
|
64
|
-
"@lwrjs/module-registry": "0.17.2-alpha.
|
|
65
|
-
"@lwrjs/npm-module-provider": "0.17.2-alpha.
|
|
66
|
-
"@lwrjs/nunjucks-view-provider": "0.17.2-alpha.
|
|
67
|
-
"@lwrjs/o11y": "0.17.2-alpha.
|
|
68
|
-
"@lwrjs/resource-registry": "0.17.2-alpha.
|
|
69
|
-
"@lwrjs/router": "0.17.2-alpha.
|
|
70
|
-
"@lwrjs/server": "0.17.2-alpha.
|
|
71
|
-
"@lwrjs/shared-utils": "0.17.2-alpha.
|
|
72
|
-
"@lwrjs/static": "0.17.2-alpha.
|
|
73
|
-
"@lwrjs/view-registry": "0.17.2-alpha.
|
|
46
|
+
"@lwrjs/app-service": "0.17.2-alpha.5",
|
|
47
|
+
"@lwrjs/asset-registry": "0.17.2-alpha.5",
|
|
48
|
+
"@lwrjs/asset-transformer": "0.17.2-alpha.5",
|
|
49
|
+
"@lwrjs/base-view-provider": "0.17.2-alpha.5",
|
|
50
|
+
"@lwrjs/base-view-transformer": "0.17.2-alpha.5",
|
|
51
|
+
"@lwrjs/client-modules": "0.17.2-alpha.5",
|
|
52
|
+
"@lwrjs/config": "0.17.2-alpha.5",
|
|
53
|
+
"@lwrjs/diagnostics": "0.17.2-alpha.5",
|
|
54
|
+
"@lwrjs/esbuild": "0.17.2-alpha.5",
|
|
55
|
+
"@lwrjs/fs-asset-provider": "0.17.2-alpha.5",
|
|
56
|
+
"@lwrjs/fs-watch": "0.17.2-alpha.5",
|
|
57
|
+
"@lwrjs/html-view-provider": "0.17.2-alpha.5",
|
|
58
|
+
"@lwrjs/instrumentation": "0.17.2-alpha.5",
|
|
59
|
+
"@lwrjs/loader": "0.17.2-alpha.5",
|
|
60
|
+
"@lwrjs/lwc-module-provider": "0.17.2-alpha.5",
|
|
61
|
+
"@lwrjs/lwc-ssr": "0.17.2-alpha.5",
|
|
62
|
+
"@lwrjs/markdown-view-provider": "0.17.2-alpha.5",
|
|
63
|
+
"@lwrjs/module-bundler": "0.17.2-alpha.5",
|
|
64
|
+
"@lwrjs/module-registry": "0.17.2-alpha.5",
|
|
65
|
+
"@lwrjs/npm-module-provider": "0.17.2-alpha.5",
|
|
66
|
+
"@lwrjs/nunjucks-view-provider": "0.17.2-alpha.5",
|
|
67
|
+
"@lwrjs/o11y": "0.17.2-alpha.5",
|
|
68
|
+
"@lwrjs/resource-registry": "0.17.2-alpha.5",
|
|
69
|
+
"@lwrjs/router": "0.17.2-alpha.5",
|
|
70
|
+
"@lwrjs/server": "0.17.2-alpha.5",
|
|
71
|
+
"@lwrjs/shared-utils": "0.17.2-alpha.5",
|
|
72
|
+
"@lwrjs/static": "0.17.2-alpha.5",
|
|
73
|
+
"@lwrjs/view-registry": "0.17.2-alpha.5",
|
|
74
74
|
"chokidar": "^3.6.0",
|
|
75
75
|
"esbuild": "^0.9.7",
|
|
76
76
|
"fs-extra": "^11.2.0",
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
"ws": "^8.18.0"
|
|
81
81
|
},
|
|
82
82
|
"devDependencies": {
|
|
83
|
-
"@lwrjs/types": "0.17.2-alpha.
|
|
83
|
+
"@lwrjs/types": "0.17.2-alpha.5",
|
|
84
84
|
"@types/ws": "^8.5.12",
|
|
85
85
|
"memfs": "^4.13.0"
|
|
86
86
|
},
|
|
@@ -93,5 +93,5 @@
|
|
|
93
93
|
"volta": {
|
|
94
94
|
"extends": "../../../package.json"
|
|
95
95
|
},
|
|
96
|
-
"gitHead": "
|
|
96
|
+
"gitHead": "b87daf19f22c54126ccaf01e0f899aabe6265885"
|
|
97
97
|
}
|