@lwrjs/core 0.17.2-alpha.1 → 0.17.2-alpha.10

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.
@@ -157,10 +157,8 @@ var LwrApp = class {
157
157
  try {
158
158
  await (0, import_server_warmup.warmupServer)(config, app.getInternalRequestKey());
159
159
  } catch (err) {
160
- const diagnostic = (0, import_diagnostics.createSingleDiagnosticError)({
161
- description: import_diagnostics.descriptions.SERVER.WARMUP_ERROR(err.message)
162
- }, import_diagnostics.LwrServerError);
163
- return reject(diagnostic);
160
+ const e = new import_diagnostics.LwrServerError(import_diagnostics.descriptions.SERVER.WARMUP_ERROR(err.message));
161
+ return reject(e);
164
162
  }
165
163
  }
166
164
  const opts = {serverMode, port};
@@ -92,7 +92,7 @@ function createAssetMiddleware(context) {
92
92
  }
93
93
  res.status(200).stream(asset.stream());
94
94
  } catch (error) {
95
- if (import_path.default.dirname(assetId.specifier) === (basePath ? basePath : "/") && error instanceof import_diagnostics.DiagnosticsError && error?.diagnostics[0]?.description.category === "lwrUnresolvable/asset") {
95
+ if (import_path.default.dirname(assetId.specifier) === (basePath ? basePath : "/") && error instanceof import_diagnostics.LwrUnresolvableError && error?.type === "asset") {
96
96
  await next();
97
97
  return;
98
98
  }
@@ -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.UNRESOLVABLE.INVALID_ENVIRONMENT(req.params.environment).message);
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.UNRESOLVABLE.INVALID_JSON().message);
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.UNRESOLVABLE.INVALID_API_VERSION(req.params.apiVersion, appConfig.apiVersion).message);
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.UNRESOLVABLE.INVALID_ENVIRONMENT(req.params.environment).message);
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.UNRESOLVABLE.INVALID_ENVIRONMENT(req.params.environment).message);
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.UNRESOLVABLE.INVALID_ENVIRONMENT(req.params.environment).message);
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.UNRESOLVABLE.INVALID_JSON().message);
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.UNRESOLVABLE.INVALID_API_VERSION(req.params.apiVersion, appConfig.apiVersion).message);
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);
@@ -70,7 +70,7 @@ function createModuleMiddleware(context) {
70
70
  });
71
71
  const {ownHash, linkedSource} = moduleDefinition;
72
72
  if (signature !== import_shared_utils.LATEST_SIGNATURE && ownHash !== signature) {
73
- res.status(404).send(import_diagnostics.descriptions.UNRESOLVABLE.SIGNED_MODULE(moduleId.specifier, signature).message);
73
+ res.status(404).send(import_diagnostics.descriptions.UNRESOLVABLE.SIGNED_MODULE(moduleId.specifier, signature));
74
74
  return;
75
75
  }
76
76
  if (req.isSiteGeneration()) {
@@ -28,8 +28,8 @@ __export(exports, {
28
28
  });
29
29
  var import_diagnostics = __toModule(require("@lwrjs/diagnostics"));
30
30
  var import_shared_utils = __toModule(require("@lwrjs/shared-utils"));
31
- var MRT_REQUEST_CLASS = "X-Mobify-Request-Class";
32
- var MRT_REQUEST_CLASS_KEY = MRT_REQUEST_CLASS.toLowerCase();
31
+ var MRT_REQUEST_CLASS = "x-mobify-request-class";
32
+ var TRUE_CLIENT_IP = "true-client-ip";
33
33
  function requestProcessorMiddleware(app, context) {
34
34
  const {basePath} = context.runtimeEnvironment;
35
35
  app.use(async (req, res, next) => {
@@ -44,8 +44,9 @@ function requestProcessorMiddleware(app, context) {
44
44
  });
45
45
  }
46
46
  }
47
- requestClass = req.headers[MRT_REQUEST_CLASS_KEY];
47
+ requestClass = req.headers[MRT_REQUEST_CLASS];
48
48
  requestDepth = (0, import_shared_utils.parseRequestDepth)(req.headers, req.query);
49
+ const trueClientIP = req.headers[TRUE_CLIENT_IP];
49
50
  const forwarded = req.headers["forwarded"];
50
51
  const host = req.headers["host"];
51
52
  const forwardedProto = req.headers["x-forwarded-proto"];
@@ -53,7 +54,7 @@ function requestProcessorMiddleware(app, context) {
53
54
  if ((0, import_shared_utils.isLambdaEnv)()) {
54
55
  import_diagnostics.logger.info({
55
56
  label: `request-processor-middleware`,
56
- message: `Original Url: ${req.originalUrl}, Forwarded: ${forwarded}, X-Forwarded-Proto: ${forwardedProto}, Host: ${host}, Protocol: ${protocol}, ${MRT_REQUEST_CLASS}: ${requestClass}, ${import_shared_utils.REQUEST_DEPTH_HEADER}: ${requestDepth}`
57
+ message: `Original Url: ${req.originalUrl}, Forwarded: ${forwarded}, X-Forwarded-Proto: ${forwardedProto}, Host: ${host}, Protocol: ${protocol}, ${MRT_REQUEST_CLASS}: ${requestClass}, ${TRUE_CLIENT_IP}: ${trueClientIP}, ${import_shared_utils.REQUEST_DEPTH_HEADER}: ${requestDepth}`
57
58
  });
58
59
  }
59
60
  }
@@ -89,7 +90,7 @@ function requestProcessorMiddleware(app, context) {
89
90
  } else {
90
91
  import_diagnostics.logger.debug({
91
92
  label: `request-processor-middleware`,
92
- message: `${MRT_REQUEST_CLASS_KEY} ignored ${req.headers ? req.headers[MRT_REQUEST_CLASS_KEY] : "no-headers"}`
93
+ message: `${MRT_REQUEST_CLASS} ignored ${req.headers ? req.headers[MRT_REQUEST_CLASS] : "no-headers"}`
93
94
  });
94
95
  req.basePath = basePath;
95
96
  }
@@ -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.UNRESOLVABLE.INVALID_ENVIRONMENT(req.params.environment).message);
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);
@@ -51,7 +51,7 @@ function createResourceMiddleware(context) {
51
51
  res.status(200).type(resource.type).stream(resource.stream());
52
52
  return;
53
53
  }
54
- res.status(404).send(import_diagnostics.descriptions.UNRESOLVABLE.RESOURCE(resourceId.specifier, resourceId.version).message);
54
+ res.status(404).send(import_diagnostics.descriptions.UNRESOLVABLE.RESOURCE(resourceId.specifier, resourceId.version));
55
55
  };
56
56
  }
57
57
  function resourceMiddleware(app, context) {
@@ -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.LwrUnresolvableError && error.diagnostics[0].description.category === "lwrUnresolvable/invalid") {
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).message}: ${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,9 +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 (0, import_diagnostics.createSingleDiagnosticError)({
41
- description: import_diagnostics.descriptions.UNRESOLVABLE.INVALID_SPECIFIER(specifier)
42
- }, import_diagnostics.LwrUnresolvableError);
40
+ throw new import_diagnostics.LwrInvalidError(import_diagnostics.descriptions.INVALID.INVALID_SPECIFIER(specifier));
43
41
  }
44
42
  const moduleId = (0, import_shared_utils.explodeSpecifier)(specifier);
45
43
  return {
@@ -63,9 +61,7 @@ function getMappingIdentity(req) {
63
61
  function getResourceIdentity(req) {
64
62
  const {specifier, signature = import_shared_utils.LATEST_SIGNATURE} = req.params;
65
63
  if (validateSpecifier(specifier) === false) {
66
- throw (0, import_diagnostics.createSingleDiagnosticError)({
67
- description: import_diagnostics.descriptions.UNRESOLVABLE.INVALID_SPECIFIER(specifier)
68
- }, import_diagnostics.LwrUnresolvableError);
64
+ throw new import_diagnostics.LwrInvalidError(import_diagnostics.descriptions.INVALID.INVALID_SPECIFIER(specifier));
69
65
  }
70
66
  const resourceId = (0, import_shared_utils.explodeSpecifier)(specifier);
71
67
  return {
@@ -77,9 +73,7 @@ function getAssetIdentity(req) {
77
73
  const {signature, immutable, assetType: type} = req.params;
78
74
  const specifier = type ? process.platform === "win32" ? req.params[0] : "/" + req.params[0] : req.originalUrl.split("?")[0];
79
75
  if (validateSpecifier(specifier) === false) {
80
- throw (0, import_diagnostics.createSingleDiagnosticError)({
81
- description: import_diagnostics.descriptions.UNRESOLVABLE.INVALID_SPECIFIER(specifier)
82
- }, import_diagnostics.LwrUnresolvableError);
76
+ throw new import_diagnostics.LwrInvalidError(import_diagnostics.descriptions.INVALID.INVALID_SPECIFIER(specifier));
83
77
  }
84
78
  return {
85
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.UNRESOLVABLE.INVALID_ENVIRONMENT(req.params.environment).message);
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.UNRESOLVABLE.INVALID_JSON().message);
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;
@@ -187,7 +171,7 @@ function createConfigMiddleware(routes, context, viewHandler) {
187
171
  const {appId, encodedViewPath} = req.params;
188
172
  const route = routes.find((route2) => route2.id === appId);
189
173
  if (!route) {
190
- res.status(404).send(import_diagnostics.descriptions.UNRESOLVABLE.APP_CONFIG(appId).message);
174
+ res.status(404).send(import_diagnostics.descriptions.UNRESOLVABLE.APP_CONFIG(appId));
191
175
  return;
192
176
  }
193
177
  const url = (0, import_shared_utils.decodeViewPath)(encodedViewPath);
@@ -218,7 +202,7 @@ function createConfigMiddleware(routes, context, viewHandler) {
218
202
  };
219
203
  const viewResponse = await viewHandler.getViewConfiguration(viewRequest, route, runtimeEnvironment, runtimeParams);
220
204
  if (!viewResponse) {
221
- res.status(404).send(import_diagnostics.descriptions.UNRESOLVABLE.VIEW_CONFIG(url).message);
205
+ res.status(404).send(import_diagnostics.descriptions.UNRESOLVABLE.VIEW_CONFIG(url));
222
206
  return;
223
207
  }
224
208
  if (!res.hasHeader("cache-control")) {
@@ -238,7 +222,7 @@ function createNotFoundMiddleware(errorRoutes, context, viewHandler) {
238
222
  return createViewMiddleware(notFoundRoute, errorRoutes, context, viewHandler);
239
223
  }
240
224
  return (req, res) => {
241
- res.status(404).send(import_diagnostics.descriptions.UNRESOLVABLE.VIEW(req.originalUrl).message);
225
+ res.status(404).send(import_diagnostics.descriptions.UNRESOLVABLE.VIEW(req.originalUrl));
242
226
  };
243
227
  }
244
228
  function viewMiddleware(app, context) {
@@ -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;
package/build/es/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { getFeatureFlags } from '@lwrjs/shared-utils';
2
2
  import { createInternalServer } from '@lwrjs/server';
3
- import { LwrServerError, createSingleDiagnosticError, descriptions, logger } from '@lwrjs/diagnostics';
3
+ import { LwrServerError, descriptions, logger } from '@lwrjs/diagnostics';
4
4
  import { DEFAULT_LWR_BOOTSTRAP_CONFIG, loadConfig, executeConfigHooks, executeStartHooks, executeInstrumentationHooks, executeContextHooks, } from '@lwrjs/config';
5
5
  import { loadHooks, loadServices, loadRouteHandlers } from '@lwrjs/config/modules';
6
6
  import SiteGenerator from './tools/static-generation.js';
@@ -152,10 +152,8 @@ export class LwrApp {
152
152
  await warmupServer(config, app.getInternalRequestKey());
153
153
  }
154
154
  catch (err) {
155
- const diagnostic = createSingleDiagnosticError({
156
- description: descriptions.SERVER.WARMUP_ERROR(err.message),
157
- }, LwrServerError);
158
- return reject(diagnostic);
155
+ const e = new LwrServerError(descriptions.SERVER.WARMUP_ERROR(err.message));
156
+ return reject(e);
159
157
  }
160
158
  }
161
159
  const opts = { serverMode, port };
@@ -1,6 +1,6 @@
1
1
  import { getFeatureFlags } from '@lwrjs/shared-utils';
2
2
  import path from 'path';
3
- import { DiagnosticsError, logger } from '@lwrjs/diagnostics';
3
+ import { LwrUnresolvableError, logger } from '@lwrjs/diagnostics';
4
4
  import { RequestHandlerSpan, getTracer } from '@lwrjs/instrumentation';
5
5
  import { getAssetIdentity } from './utils/identity.js';
6
6
  import { handleErrors } from './utils/error-handling.js';
@@ -76,8 +76,8 @@ function createAssetMiddleware(context) {
76
76
  catch (error) {
77
77
  // Ignore asset not found for root asset requests
78
78
  if (path.dirname(assetId.specifier) === (basePath ? basePath : '/') &&
79
- error instanceof DiagnosticsError &&
80
- error?.diagnostics[0]?.description.category === 'lwrUnresolvable/asset') {
79
+ error instanceof LwrUnresolvableError &&
80
+ error?.type === 'asset') {
81
81
  // Must await other middleware or this can respond before expected.
82
82
  await next();
83
83
  return;
@@ -12,18 +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.UNRESOLVABLE.INVALID_ENVIRONMENT(req.params.environment).message);
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.UNRESOLVABLE.INVALID_JSON().message);
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.UNRESOLVABLE.INVALID_API_VERSION(req.params.apiVersion, appConfig.apiVersion)
26
- .message);
25
+ res.send(descriptions.INVALID.INVALID_API_VERSION(req.params.apiVersion, appConfig.apiVersion));
27
26
  return;
28
27
  }
29
28
  const { runtimeEnvironment, runtimeParams } = req.getRuntimeContext(defaultRuntimeEnvironment);
@@ -66,7 +65,7 @@ function createSourceMapMiddleware(context) {
66
65
  return async (req, res) => {
67
66
  if (!req.validateEnvironmentRequest(appConfig)) {
68
67
  res.status(400);
69
- res.send(descriptions.UNRESOLVABLE.INVALID_ENVIRONMENT(req.params.environment).message);
68
+ res.send(descriptions.INVALID.INVALID_ENVIRONMENT(req.params.environment));
70
69
  return;
71
70
  }
72
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.UNRESOLVABLE.INVALID_ENVIRONMENT(req.params.environment).message);
11
+ res.send(descriptions.INVALID.INVALID_ENVIRONMENT(req.params.environment));
12
12
  return;
13
13
  }
14
14
  const { runtimeEnvironment, runtimeParams } = req.getRuntimeContext(defaultRuntimeEnvironment);
@@ -11,18 +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.UNRESOLVABLE.INVALID_ENVIRONMENT(req.params.environment).message);
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.UNRESOLVABLE.INVALID_JSON().message);
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.UNRESOLVABLE.INVALID_API_VERSION(req.params.apiVersion, appConfig.apiVersion)
25
- .message);
24
+ res.send(descriptions.INVALID.INVALID_API_VERSION(req.params.apiVersion, appConfig.apiVersion));
26
25
  return;
27
26
  }
28
27
  const { runtimeEnvironment, runtimeParams } = req.getRuntimeContext(defaultRuntimeEnvironment);
@@ -48,7 +47,7 @@ function createModuleMiddleware(context) {
48
47
  const { ownHash, linkedSource } = moduleDefinition;
49
48
  // validate the requested instances exists
50
49
  if (signature !== LATEST_SIGNATURE && ownHash !== signature) {
51
- res.status(404).send(descriptions.UNRESOLVABLE.SIGNED_MODULE(moduleId.specifier, signature).message);
50
+ res.status(404).send(descriptions.UNRESOLVABLE.SIGNED_MODULE(moduleId.specifier, signature));
52
51
  return;
53
52
  }
54
53
  if (req.isSiteGeneration()) {
@@ -8,8 +8,8 @@
8
8
  */
9
9
  import { logger } from '@lwrjs/diagnostics';
10
10
  import { REQUEST_DEPTH_HEADER, isLambdaEnv, parseRequestDepth } from '@lwrjs/shared-utils';
11
- const MRT_REQUEST_CLASS = 'X-Mobify-Request-Class';
12
- const MRT_REQUEST_CLASS_KEY = MRT_REQUEST_CLASS.toLowerCase();
11
+ const MRT_REQUEST_CLASS = 'x-mobify-request-class';
12
+ const TRUE_CLIENT_IP = 'true-client-ip';
13
13
  export function requestProcessorMiddleware(app, context) {
14
14
  const { basePath } = context.runtimeEnvironment;
15
15
  app.use(async (req, res, next) => {
@@ -26,8 +26,9 @@ export function requestProcessorMiddleware(app, context) {
26
26
  });
27
27
  }
28
28
  }
29
- requestClass = req.headers[MRT_REQUEST_CLASS_KEY];
29
+ requestClass = req.headers[MRT_REQUEST_CLASS];
30
30
  requestDepth = parseRequestDepth(req.headers, req.query);
31
+ const trueClientIP = req.headers[TRUE_CLIENT_IP];
31
32
  const forwarded = req.headers['forwarded'];
32
33
  const host = req.headers['host'];
33
34
  const forwardedProto = req.headers['x-forwarded-proto'];
@@ -36,7 +37,7 @@ export function requestProcessorMiddleware(app, context) {
36
37
  if (isLambdaEnv()) {
37
38
  logger.info({
38
39
  label: `request-processor-middleware`,
39
- message: `Original Url: ${req.originalUrl}, Forwarded: ${forwarded}, X-Forwarded-Proto: ${forwardedProto}, Host: ${host}, Protocol: ${protocol}, ${MRT_REQUEST_CLASS}: ${requestClass}, ${REQUEST_DEPTH_HEADER}: ${requestDepth}`,
40
+ message: `Original Url: ${req.originalUrl}, Forwarded: ${forwarded}, X-Forwarded-Proto: ${forwardedProto}, Host: ${host}, Protocol: ${protocol}, ${MRT_REQUEST_CLASS}: ${requestClass}, ${TRUE_CLIENT_IP}: ${trueClientIP}, ${REQUEST_DEPTH_HEADER}: ${requestDepth}`,
40
41
  });
41
42
  }
42
43
  }
@@ -81,7 +82,7 @@ export function requestProcessorMiddleware(app, context) {
81
82
  else {
82
83
  logger.debug({
83
84
  label: `request-processor-middleware`,
84
- message: `${MRT_REQUEST_CLASS_KEY} ignored ${req.headers ? req.headers[MRT_REQUEST_CLASS_KEY] : 'no-headers'}`,
85
+ message: `${MRT_REQUEST_CLASS} ignored ${req.headers ? req.headers[MRT_REQUEST_CLASS] : 'no-headers'}`,
85
86
  });
86
87
  req.basePath = basePath;
87
88
  }
@@ -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.UNRESOLVABLE.INVALID_ENVIRONMENT(req.params.environment).message);
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);
@@ -23,7 +23,7 @@ function createResourceMiddleware(context) {
23
23
  res.status(200).type(resource.type).stream(resource.stream());
24
24
  return;
25
25
  }
26
- res.status(404).send(descriptions.UNRESOLVABLE.RESOURCE(resourceId.specifier, resourceId.version).message);
26
+ res.status(404).send(descriptions.UNRESOLVABLE.RESOURCE(resourceId.specifier, resourceId.version));
27
27
  };
28
28
  }
29
29
  export function resourceMiddleware(app, context) {
@@ -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, 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 LwrUnresolvableError &&
5
- error.diagnostics[0].description.category === 'lwrUnresolvable/invalid') {
6
- 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}`;
7
43
  }
8
- if (error instanceof LwrUnresolvableError) {
9
- 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>`;
10
47
  }
11
- return { status: 500, message: `${descriptions.SERVER.SERVER_ERROR(url).message}: ${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,14 +1,12 @@
1
1
  import { explodeSpecifier, explodeSpecifiers, LATEST_SIGNATURE } from '@lwrjs/shared-utils';
2
- import { createSingleDiagnosticError, descriptions, LwrUnresolvableError } 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 createSingleDiagnosticError({
10
- description: descriptions.UNRESOLVABLE.INVALID_SPECIFIER(specifier),
11
- }, LwrUnresolvableError);
9
+ throw new LwrInvalidError(descriptions.INVALID.INVALID_SPECIFIER(specifier));
12
10
  }
13
11
  const moduleId = explodeSpecifier(specifier);
14
12
  return {
@@ -32,9 +30,7 @@ export function getMappingIdentity(req) {
32
30
  export function getResourceIdentity(req) {
33
31
  const { specifier, signature = LATEST_SIGNATURE } = req.params;
34
32
  if (validateSpecifier(specifier) === false) {
35
- throw createSingleDiagnosticError({
36
- description: descriptions.UNRESOLVABLE.INVALID_SPECIFIER(specifier),
37
- }, LwrUnresolvableError);
33
+ throw new LwrInvalidError(descriptions.INVALID.INVALID_SPECIFIER(specifier));
38
34
  }
39
35
  const resourceId = explodeSpecifier(specifier);
40
36
  return {
@@ -50,9 +46,7 @@ export function getAssetIdentity(req) {
50
46
  : '/' + req.params[0]
51
47
  : req.originalUrl.split('?')[0];
52
48
  if (validateSpecifier(specifier) === false) {
53
- throw createSingleDiagnosticError({
54
- description: descriptions.UNRESOLVABLE.INVALID_SPECIFIER(specifier),
55
- }, LwrUnresolvableError);
49
+ throw new LwrInvalidError(descriptions.INVALID.INVALID_SPECIFIER(specifier));
56
50
  }
57
51
  return {
58
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.UNRESOLVABLE.INVALID_ENVIRONMENT(req.params.environment).message);
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.UNRESOLVABLE.INVALID_JSON().message);
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
@@ -181,7 +164,7 @@ function createConfigMiddleware(routes, context, viewHandler) {
181
164
  // match the app id to a route
182
165
  const route = routes.find((route) => route.id === appId);
183
166
  if (!route) {
184
- res.status(404).send(descriptions.UNRESOLVABLE.APP_CONFIG(appId).message);
167
+ res.status(404).send(descriptions.UNRESOLVABLE.APP_CONFIG(appId));
185
168
  return;
186
169
  }
187
170
  // decode the resolved view path and extract any params.
@@ -217,7 +200,7 @@ function createConfigMiddleware(routes, context, viewHandler) {
217
200
  };
218
201
  const viewResponse = await viewHandler.getViewConfiguration(viewRequest, route, runtimeEnvironment, runtimeParams);
219
202
  if (!viewResponse) {
220
- res.status(404).send(descriptions.UNRESOLVABLE.VIEW_CONFIG(url).message);
203
+ res.status(404).send(descriptions.UNRESOLVABLE.VIEW_CONFIG(url));
221
204
  return;
222
205
  }
223
206
  // Pick the shortest TTL between the view response and route object
@@ -238,7 +221,7 @@ function createNotFoundMiddleware(errorRoutes, context, viewHandler) {
238
221
  return createViewMiddleware(notFoundRoute, errorRoutes, context, viewHandler);
239
222
  }
240
223
  return (req, res) => {
241
- res.status(404).send(descriptions.UNRESOLVABLE.VIEW(req.originalUrl).message);
224
+ res.status(404).send(descriptions.UNRESOLVABLE.VIEW(req.originalUrl));
242
225
  };
243
226
  }
244
227
  export function viewMiddleware(app, context) {
@@ -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.1",
7
+ "version": "0.17.2-alpha.10",
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.1",
47
- "@lwrjs/asset-registry": "0.17.2-alpha.1",
48
- "@lwrjs/asset-transformer": "0.17.2-alpha.1",
49
- "@lwrjs/base-view-provider": "0.17.2-alpha.1",
50
- "@lwrjs/base-view-transformer": "0.17.2-alpha.1",
51
- "@lwrjs/client-modules": "0.17.2-alpha.1",
52
- "@lwrjs/config": "0.17.2-alpha.1",
53
- "@lwrjs/diagnostics": "0.17.2-alpha.1",
54
- "@lwrjs/esbuild": "0.17.2-alpha.1",
55
- "@lwrjs/fs-asset-provider": "0.17.2-alpha.1",
56
- "@lwrjs/fs-watch": "0.17.2-alpha.1",
57
- "@lwrjs/html-view-provider": "0.17.2-alpha.1",
58
- "@lwrjs/instrumentation": "0.17.2-alpha.1",
59
- "@lwrjs/loader": "0.17.2-alpha.1",
60
- "@lwrjs/lwc-module-provider": "0.17.2-alpha.1",
61
- "@lwrjs/lwc-ssr": "0.17.2-alpha.1",
62
- "@lwrjs/markdown-view-provider": "0.17.2-alpha.1",
63
- "@lwrjs/module-bundler": "0.17.2-alpha.1",
64
- "@lwrjs/module-registry": "0.17.2-alpha.1",
65
- "@lwrjs/npm-module-provider": "0.17.2-alpha.1",
66
- "@lwrjs/nunjucks-view-provider": "0.17.2-alpha.1",
67
- "@lwrjs/o11y": "0.17.2-alpha.1",
68
- "@lwrjs/resource-registry": "0.17.2-alpha.1",
69
- "@lwrjs/router": "0.17.2-alpha.1",
70
- "@lwrjs/server": "0.17.2-alpha.1",
71
- "@lwrjs/shared-utils": "0.17.2-alpha.1",
72
- "@lwrjs/static": "0.17.2-alpha.1",
73
- "@lwrjs/view-registry": "0.17.2-alpha.1",
46
+ "@lwrjs/app-service": "0.17.2-alpha.10",
47
+ "@lwrjs/asset-registry": "0.17.2-alpha.10",
48
+ "@lwrjs/asset-transformer": "0.17.2-alpha.10",
49
+ "@lwrjs/base-view-provider": "0.17.2-alpha.10",
50
+ "@lwrjs/base-view-transformer": "0.17.2-alpha.10",
51
+ "@lwrjs/client-modules": "0.17.2-alpha.10",
52
+ "@lwrjs/config": "0.17.2-alpha.10",
53
+ "@lwrjs/diagnostics": "0.17.2-alpha.10",
54
+ "@lwrjs/esbuild": "0.17.2-alpha.10",
55
+ "@lwrjs/fs-asset-provider": "0.17.2-alpha.10",
56
+ "@lwrjs/fs-watch": "0.17.2-alpha.10",
57
+ "@lwrjs/html-view-provider": "0.17.2-alpha.10",
58
+ "@lwrjs/instrumentation": "0.17.2-alpha.10",
59
+ "@lwrjs/loader": "0.17.2-alpha.10",
60
+ "@lwrjs/lwc-module-provider": "0.17.2-alpha.10",
61
+ "@lwrjs/lwc-ssr": "0.17.2-alpha.10",
62
+ "@lwrjs/markdown-view-provider": "0.17.2-alpha.10",
63
+ "@lwrjs/module-bundler": "0.17.2-alpha.10",
64
+ "@lwrjs/module-registry": "0.17.2-alpha.10",
65
+ "@lwrjs/npm-module-provider": "0.17.2-alpha.10",
66
+ "@lwrjs/nunjucks-view-provider": "0.17.2-alpha.10",
67
+ "@lwrjs/o11y": "0.17.2-alpha.10",
68
+ "@lwrjs/resource-registry": "0.17.2-alpha.10",
69
+ "@lwrjs/router": "0.17.2-alpha.10",
70
+ "@lwrjs/server": "0.17.2-alpha.10",
71
+ "@lwrjs/shared-utils": "0.17.2-alpha.10",
72
+ "@lwrjs/static": "0.17.2-alpha.10",
73
+ "@lwrjs/view-registry": "0.17.2-alpha.10",
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.1",
83
+ "@lwrjs/types": "0.17.2-alpha.10",
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": "bba15ca717a242b0375decaa378af06bdee813b5"
96
+ "gitHead": "3938f97f31973d7953bb61cff8388c71980c22c7"
97
97
  }