@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.
@@ -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.APPLICATION.INVALID_ENVIRONMENT(req.params.environment));
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.APPLICATION.INVALID_JSON());
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.APPLICATION.INVALID_API_VERSION(req.params.apiVersion, appConfig.apiVersion));
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.APPLICATION.INVALID_ENVIRONMENT(req.params.environment));
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.APPLICATION.INVALID_ENVIRONMENT(req.params.environment));
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.APPLICATION.INVALID_ENVIRONMENT(req.params.environment));
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.APPLICATION.INVALID_JSON());
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.APPLICATION.INVALID_API_VERSION(req.params.apiVersion, appConfig.apiVersion));
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.APPLICATION.INVALID_ENVIRONMENT(req.params.environment));
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
- function createReturnStatus(error, url) {
32
- if (error instanceof import_diagnostics.LwrApplicationError) {
33
- return {status: 400, message: error.message};
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 (error instanceof import_diagnostics.LwrUnresolvableError) {
36
- return {status: 404, message: error.message};
61
+ if (debug) {
62
+ body = `<div style="font-family:sans-serif;margin:50px;"><h1>${status}: Document generation failed</h1><p>${body.replace(/</g, "&lt;").replace(/>/g, "&gt;")}</p></div>`;
37
63
  }
38
- return {status: 500, message: `${import_diagnostics.descriptions.SERVER.SERVER_ERROR(url)}: ${error.message}`};
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, message} = createReturnStatus(err, req.originalUrl);
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(message);
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.LwrApplicationError(import_diagnostics.descriptions.APPLICATION.INVALID_SPECIFIER(specifier));
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.LwrApplicationError(import_diagnostics.descriptions.APPLICATION.INVALID_SPECIFIER(specifier));
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.LwrApplicationError(import_diagnostics.descriptions.APPLICATION.INVALID_SPECIFIER(specifier));
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.APPLICATION.INVALID_ENVIRONMENT(req.params.environment));
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.APPLICATION.INVALID_JSON());
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.APPLICATION.INVALID_ENVIRONMENT(req.params.environment));
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.APPLICATION.INVALID_JSON());
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.APPLICATION.INVALID_API_VERSION(req.params.apiVersion, appConfig.apiVersion));
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.APPLICATION.INVALID_ENVIRONMENT(req.params.environment));
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.APPLICATION.INVALID_ENVIRONMENT(req.params.environment));
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.APPLICATION.INVALID_ENVIRONMENT(req.params.environment));
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.APPLICATION.INVALID_JSON());
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.APPLICATION.INVALID_API_VERSION(req.params.apiVersion, appConfig.apiVersion));
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.APPLICATION.INVALID_ENVIRONMENT(req.params.environment));
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, LwrApplicationError, LwrUnresolvableError, } from '@lwrjs/diagnostics';
1
+ import { descriptions, DiagnosticsError, LwrError, LwrInvalidError, LwrStatusError, LwrUnresolvableError, } from '@lwrjs/diagnostics';
2
2
  import { logger } from '@lwrjs/diagnostics';
3
- function createReturnStatus(error, url) {
4
- if (error instanceof LwrApplicationError) {
5
- return { status: 400, message: error.message };
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 (error instanceof LwrUnresolvableError) {
8
- return { status: 404, message: error.message };
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, '&lt;').replace(/>/g, '&gt;')}</p></div>`;
9
47
  }
10
- // catchall: likely a LwrServerError
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, message } = createReturnStatus(err, req.originalUrl);
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(message);
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, LwrApplicationError } from '@lwrjs/diagnostics';
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 LwrApplicationError(descriptions.APPLICATION.INVALID_SPECIFIER(specifier));
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 LwrApplicationError(descriptions.APPLICATION.INVALID_SPECIFIER(specifier));
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 LwrApplicationError(descriptions.APPLICATION.INVALID_SPECIFIER(specifier));
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, isURL, parseRequestDepth, REQUEST_DEPTH_KEY, isLocalDev, shortestTtl, isLambdaEnv, } from '@lwrjs/shared-utils';
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.APPLICATION.INVALID_ENVIRONMENT(req.params.environment));
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.APPLICATION.INVALID_JSON());
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.3",
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.3",
47
- "@lwrjs/asset-registry": "0.17.2-alpha.3",
48
- "@lwrjs/asset-transformer": "0.17.2-alpha.3",
49
- "@lwrjs/base-view-provider": "0.17.2-alpha.3",
50
- "@lwrjs/base-view-transformer": "0.17.2-alpha.3",
51
- "@lwrjs/client-modules": "0.17.2-alpha.3",
52
- "@lwrjs/config": "0.17.2-alpha.3",
53
- "@lwrjs/diagnostics": "0.17.2-alpha.3",
54
- "@lwrjs/esbuild": "0.17.2-alpha.3",
55
- "@lwrjs/fs-asset-provider": "0.17.2-alpha.3",
56
- "@lwrjs/fs-watch": "0.17.2-alpha.3",
57
- "@lwrjs/html-view-provider": "0.17.2-alpha.3",
58
- "@lwrjs/instrumentation": "0.17.2-alpha.3",
59
- "@lwrjs/loader": "0.17.2-alpha.3",
60
- "@lwrjs/lwc-module-provider": "0.17.2-alpha.3",
61
- "@lwrjs/lwc-ssr": "0.17.2-alpha.3",
62
- "@lwrjs/markdown-view-provider": "0.17.2-alpha.3",
63
- "@lwrjs/module-bundler": "0.17.2-alpha.3",
64
- "@lwrjs/module-registry": "0.17.2-alpha.3",
65
- "@lwrjs/npm-module-provider": "0.17.2-alpha.3",
66
- "@lwrjs/nunjucks-view-provider": "0.17.2-alpha.3",
67
- "@lwrjs/o11y": "0.17.2-alpha.3",
68
- "@lwrjs/resource-registry": "0.17.2-alpha.3",
69
- "@lwrjs/router": "0.17.2-alpha.3",
70
- "@lwrjs/server": "0.17.2-alpha.3",
71
- "@lwrjs/shared-utils": "0.17.2-alpha.3",
72
- "@lwrjs/static": "0.17.2-alpha.3",
73
- "@lwrjs/view-registry": "0.17.2-alpha.3",
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.3",
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": "43757693dfca356cff105d4896a7a3cbf11ac017"
96
+ "gitHead": "b87daf19f22c54126ccaf01e0f899aabe6265885"
97
97
  }