@lwrjs/core 0.9.0-alpha.14 → 0.9.0-alpha.16

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.
@@ -59,7 +59,7 @@ function createProviderContext(serverContext) {
59
59
  notifyAssetSourceChanged: (payload) => notifyAssetSourceChanged.call(serverContext.appEmitter, payload)
60
60
  },
61
61
  moduleRegistry: serverContext.moduleRegistry.getPublicApi(),
62
- moduleBundler: serverContext.moduleBundler,
62
+ moduleBundler: serverContext.moduleBundler.getPublicApi(),
63
63
  resourceRegistry: serverContext.resourceRegistry.getPublicApi(),
64
64
  viewRegistry: serverContext.viewRegistry.getPublicApi(),
65
65
  assetRegistry: serverContext.assetRegistry.getPublicApi(),
@@ -67,8 +67,10 @@ function createServerContext(appConfig, runtimeEnvironment, globalData) {
67
67
  resourceRegistry,
68
68
  assetRegistry,
69
69
  viewRegistry,
70
+ watcherFactory,
70
71
  appConfig,
71
72
  runtimeEnvironment,
72
- watcherFactory
73
+ routes: [],
74
+ errorRoutes: []
73
75
  };
74
76
  }
@@ -32,6 +32,7 @@ var import_shared_utils = __toModule(require("@lwrjs/shared-utils"));
32
32
  var import_server = __toModule(require("@lwrjs/server"));
33
33
  var import_diagnostics = __toModule(require("@lwrjs/diagnostics"));
34
34
  var import_config = __toModule(require("@lwrjs/config"));
35
+ var import_modules = __toModule(require("@lwrjs/config/modules"));
35
36
  var import_static_generation = __toModule(require("./tools/static-generation.cjs"));
36
37
  var import_server_warmup = __toModule(require("./tools/server-warmup.cjs"));
37
38
  var import_server2 = __toModule(require("./context/server.cjs"));
@@ -44,9 +45,7 @@ var import_asset_middleware = __toModule(require("./middleware/asset-middleware.
44
45
  var import_view_middleware = __toModule(require("./middleware/view-middleware.cjs"));
45
46
  var import_resource_middleware = __toModule(require("./middleware/resource-middleware.cjs"));
46
47
  var import_hmr_middleware = __toModule(require("./middleware/hmr-middleware.cjs"));
47
- var import_amd_bundle_provider = __toModule(require("@lwrjs/module-bundler/amd-bundle-provider"));
48
- var import_esm_bundle_provider = __toModule(require("@lwrjs/module-bundler/esm-bundle-provider"));
49
- function initMiddleware(app, server, serverContext, routes, errorRoutes) {
48
+ function initMiddleware(app, server, serverContext) {
50
49
  app.useCompression();
51
50
  (0, import_locale_middleware.localeMiddleware)(app, serverContext);
52
51
  (0, import_module_middleware.moduleMiddleware)(app, serverContext);
@@ -54,7 +53,7 @@ function initMiddleware(app, server, serverContext, routes, errorRoutes) {
54
53
  (0, import_mapping_middleware.mappingMiddleware)(app, serverContext);
55
54
  (0, import_asset_middleware.assetMiddleware)(app, serverContext);
56
55
  (0, import_resource_middleware.resourceMiddleware)(app, serverContext);
57
- (0, import_view_middleware.viewMiddleware)(app, serverContext, routes, errorRoutes);
56
+ (0, import_view_middleware.viewMiddleware)(app, serverContext);
58
57
  app.initRoutes();
59
58
  if (serverContext.runtimeEnvironment.hmrEnabled) {
60
59
  (0, import_hmr_middleware.hmrMiddleware)(server, serverContext);
@@ -63,39 +62,52 @@ function initMiddleware(app, server, serverContext, routes, errorRoutes) {
63
62
  function createServices(entries, providerContext) {
64
63
  return entries.map(([ctor, providerConfig = {}]) => new ctor(providerConfig, providerContext));
65
64
  }
66
- async function initContext(appConfig, runtimeEnvironment, globalData, services) {
65
+ async function initContext(appConfig, runtimeEnvironment, globalData) {
66
+ const hooks = await (0, import_modules.loadHooks)(appConfig);
67
+ if (hooks.length) {
68
+ await (0, import_config.executeConfigHooks)(hooks, appConfig, runtimeEnvironment, globalData);
69
+ (0, import_config.executeStartHooks)(hooks, appConfig);
70
+ }
71
+ const services = await (0, import_modules.loadServices)(appConfig);
67
72
  const serverContext = (0, import_server2.createServerContext)(appConfig, runtimeEnvironment, globalData);
68
73
  const providerContext = (0, import_provider.createProviderContext)(serverContext);
69
- const {moduleRegistry, resourceRegistry, viewRegistry, assetRegistry, moduleBundler} = serverContext;
74
+ const {moduleRegistry, assetRegistry, resourceRegistry, viewRegistry, moduleBundler} = serverContext;
70
75
  const moduleProviders = createServices(services.moduleProviders, providerContext);
71
- moduleRegistry.addModuleProviders(moduleProviders);
72
- moduleBundler.addBundleProviders([
73
- new import_amd_bundle_provider.default({}, {...providerContext, moduleRegistry}),
74
- new import_esm_bundle_provider.default({}, {...providerContext, moduleRegistry})
75
- ]);
76
+ const assetProviders = createServices(services.assetProviders, providerContext);
77
+ const assetTransformers = createServices(services.assetTransformers, providerContext);
76
78
  const resourceProviders = createServices(services.resourceProviders, providerContext);
77
- resourceRegistry.addResourceProviders(resourceProviders);
78
79
  const viewProviders = createServices(services.viewProviders, providerContext);
79
80
  const viewTransformers = createServices(services.viewTransformers, providerContext);
80
- viewRegistry.addViewProviders(viewProviders);
81
- viewRegistry.addViewTransformers(viewTransformers);
82
- await viewRegistry.initializeViewProviders();
83
- const assetProviders = createServices(services.assetProviders, providerContext);
84
- const assetTransformers = createServices(services.assetTransformers, providerContext);
81
+ const bundleProviders = createServices(services.bundleProviders, providerContext);
82
+ moduleRegistry.addModuleProviders(moduleProviders);
85
83
  assetRegistry.addAssetProviders(assetProviders);
86
84
  assetRegistry.addAssetTransformers(assetTransformers);
85
+ resourceRegistry.addResourceProviders(resourceProviders);
86
+ viewRegistry.addViewProviders(viewProviders);
87
+ viewRegistry.addViewTransformers(viewTransformers);
88
+ moduleBundler.addBundleProviders(bundleProviders);
89
+ await serverContext.viewRegistry.initializeViewProviders();
90
+ const {routes, errorRoutes} = await (0, import_modules.loadRoutes)(appConfig);
91
+ serverContext.routes = routes;
92
+ serverContext.errorRoutes = errorRoutes;
87
93
  return serverContext;
88
94
  }
89
95
  var LwrApp = class {
90
- constructor(config) {
96
+ constructor(config = {}) {
91
97
  this.initialized = false;
92
- this.config = (0, import_config.normalizeConfig)(config);
98
+ const {appConfig, runtimeEnvironment, globalData} = (0, import_config.loadConfig)(config);
99
+ this.config = appConfig;
100
+ this.runtimeEnvironment = runtimeEnvironment;
101
+ this.globalData = globalData;
93
102
  const {basePath} = this.config;
94
103
  this.app = (0, import_server.createInternalServer)(this.config.serverType, {basePath});
95
104
  this.server = this.app.createHttpServer();
96
105
  }
97
106
  setConfig(config) {
98
- this.config = (0, import_config.normalizeConfig)(config);
107
+ const {appConfig, runtimeEnvironment, globalData} = (0, import_config.loadConfig)(config);
108
+ this.config = appConfig;
109
+ this.runtimeEnvironment = runtimeEnvironment;
110
+ this.globalData = globalData;
99
111
  }
100
112
  getConfig() {
101
113
  return this.config;
@@ -106,12 +118,8 @@ var LwrApp = class {
106
118
  }
107
119
  this.initialized = true;
108
120
  try {
109
- const {appConfig, runtimeEnvironment, globalData} = await (0, import_config.loadConfig)(this.config);
110
- const services = await (0, import_config.loadServices)(appConfig);
111
- const {routes, errorRoutes} = await (0, import_config.loadRoutes)(appConfig);
112
- const context = await initContext(appConfig, runtimeEnvironment, globalData, services);
113
- initMiddleware(this.app, this.server, context, routes, errorRoutes);
114
- this.config = appConfig;
121
+ const context = await initContext(this.config, this.runtimeEnvironment, this.globalData);
122
+ initMiddleware(this.app, this.server, context);
115
123
  } catch (e) {
116
124
  this.initialized = false;
117
125
  throw e;
@@ -35,7 +35,7 @@ var import_unsigned_module_redirect = __toModule(require("./redirects/unsigned-m
35
35
  var import_error_handling = __toModule(require("./utils/error-handling.cjs"));
36
36
  function createBundleMiddleware(context) {
37
37
  const {moduleRegistry, moduleBundler} = context;
38
- const unsignedRedirect = (0, import_unsigned_module_redirect.createUnsignedModuleRedirect)(moduleRegistry, moduleBundler);
38
+ const unsignedBundleRedirect = (0, import_unsigned_module_redirect.createUnsignedBundleRedirect)(moduleBundler);
39
39
  return async (req, res) => {
40
40
  if (!req.validateEnvironmentRequest(context.appConfig)) {
41
41
  res.status(400);
@@ -51,7 +51,7 @@ function createBundleMiddleware(context) {
51
51
  const importer = req.query.importer ? await (0, import_request.getRequestImporter)(req, moduleRegistry) : void 0;
52
52
  const {moduleId, signature} = (0, import_identity.getModuleIdentity)(req, importer);
53
53
  if (moduleId.importer || !signature) {
54
- await unsignedRedirect(req, res, moduleId, runtimeEnvironment, runtimeParams);
54
+ await unsignedBundleRedirect(req, res, moduleId, runtimeEnvironment, runtimeParams);
55
55
  return;
56
56
  }
57
57
  const sourceMapUrl = req.path.replace("/bundle/", "/sourcemaps/bundle/");
@@ -34,7 +34,7 @@ var import_unsigned_module_redirect = __toModule(require("./redirects/unsigned-m
34
34
  var import_error_handling = __toModule(require("./utils/error-handling.cjs"));
35
35
  function createModuleMiddleware(context) {
36
36
  const {moduleRegistry} = context;
37
- const unsignedRedirect = (0, import_unsigned_module_redirect.createUnsignedModuleRedirect)(moduleRegistry, moduleRegistry);
37
+ const unsignedRedirect = (0, import_unsigned_module_redirect.createUnsignedModuleRedirect)(moduleRegistry);
38
38
  return async (req, res) => {
39
39
  if (!req.validateEnvironmentRequest(context.appConfig)) {
40
40
  res.status(400);
@@ -8,14 +8,30 @@ var __export = (target, all) => {
8
8
  // packages/@lwrjs/core/src/middleware/redirects/unsigned-module-redirect.ts
9
9
  __markAsModule(exports);
10
10
  __export(exports, {
11
+ createUnsignedBundleRedirect: () => createUnsignedBundleRedirect,
11
12
  createUnsignedModuleRedirect: () => createUnsignedModuleRedirect
12
13
  });
13
- function createUnsignedModuleRedirect(moduleRegistry, defRegistry) {
14
+ var HEADER_LOCATION = "Location";
15
+ var STATUS_FOUND = 302;
16
+ function createUnsignedModuleRedirect(moduleRegistry) {
14
17
  return async (req, res, moduleId, runtimeEnvironment, runtimeParams) => {
15
- const jsonQuery = req.isJsonRequest() ? `${runtimeEnvironment.debug ? "&" : "?"}json` : "";
18
+ const jsonQuery = getJsonQualifier(req, runtimeEnvironment);
16
19
  const {moduleEntry, ownHash} = await moduleRegistry.getModule(moduleId);
17
- const uri = defRegistry.resolveModuleUri({...moduleId, version: moduleEntry.version}, runtimeEnvironment, runtimeParams, ownHash);
18
- res.setHeader("Location", `${uri}${jsonQuery}`);
19
- res.sendStatus(302);
20
+ const uri = await moduleRegistry.resolveModuleUri({...moduleId, version: moduleEntry.version}, runtimeEnvironment, runtimeParams, ownHash);
21
+ sendRedirect(res, `${uri}${jsonQuery}`);
20
22
  };
21
23
  }
24
+ function createUnsignedBundleRedirect(moduleBundler) {
25
+ return async (req, res, moduleId, runtimeEnvironment, runtimeParams) => {
26
+ const jsonQuery = getJsonQualifier(req, runtimeEnvironment);
27
+ const uri = await moduleBundler.resolveModuleUri(moduleId, runtimeEnvironment, runtimeParams);
28
+ sendRedirect(res, `${uri}${jsonQuery}`);
29
+ };
30
+ }
31
+ function getJsonQualifier(req, runtimeEnvironment) {
32
+ return req.isJsonRequest() ? `${runtimeEnvironment.debug ? "&" : "?"}json` : "";
33
+ }
34
+ function sendRedirect(res, url) {
35
+ res.setHeader(HEADER_LOCATION, url);
36
+ res.sendStatus(STATUS_FOUND);
37
+ }
@@ -48,7 +48,7 @@ function createResourceMiddleware(context) {
48
48
  return;
49
49
  }
50
50
  if (resource && resource.stream) {
51
- res.status(200).type(resource.type).stream(resource.stream);
51
+ res.status(200).type(resource.type).stream(resource.stream());
52
52
  return;
53
53
  }
54
54
  res.status(404).send(import_diagnostics.descriptions.UNRESOLVABLE.RESOURCE(resourceId.specifier).message);
@@ -56,9 +56,9 @@ function createResourceMiddleware(context) {
56
56
  }
57
57
  function resourceMiddleware(app, context) {
58
58
  app.get([
59
- `/:apiVersion/resource/:format/l/:locale/e/:environment/:specifier`,
60
- `/:apiVersion/resource/:format/l/:locale/:specifier`,
61
- `/:apiVersion/resource/:format/e/:environment/:specifier`,
62
- `/:apiVersion/resource/:format/:specifier`
59
+ `/:apiVersion/resource/:format/l/:locale/e/:environment/:specifier/:prettyUrl?`,
60
+ `/:apiVersion/resource/:format/l/:locale/:specifier/:prettyUrl?`,
61
+ `/:apiVersion/resource/:format/e/:environment/:specifier/:prettyUrl?`,
62
+ `/:apiVersion/resource/:format/:specifier/:prettyUrl?`
63
63
  ], (0, import_error_handling.handleErrors)(createResourceMiddleware(context)));
64
64
  }
@@ -132,8 +132,8 @@ function createNotFoundMiddleware(errorRoutes, context, viewHandler) {
132
132
  res.status(404).send(import_diagnostics.descriptions.UNRESOLVABLE.VIEW(req.originalUrl).message);
133
133
  };
134
134
  }
135
- function viewMiddleware(app, context, routes, errorRoutes) {
136
- const {appConfig, viewRegistry, moduleRegistry} = context;
135
+ function viewMiddleware(app, context) {
136
+ const {appConfig, routes, errorRoutes, viewRegistry, moduleRegistry} = context;
137
137
  const viewHandler = new import_view_registry.LwrViewHandler({viewRegistry, moduleRegistry}, appConfig);
138
138
  for (const route of routes) {
139
139
  const paths = [route.path];
@@ -93,17 +93,6 @@ var SiteGenerator = class {
93
93
  }
94
94
  }
95
95
  }
96
- const willSSR = routes.some((r) => r.bootstrap?.ssr);
97
- if (willSSR) {
98
- import_shared_utils.logger.debug(`[SSG] Fetch SSR Placeholder`);
99
- const startTime = import_perf_hooks.performance.now();
100
- const siteConfig = this.createSiteConfig(outputDir, staticSiteGenerator.locales[0], urlRewriteMap, skipBaseDocumentGeneration, runtimeEnvironment);
101
- await this.dispatchJSResourceRecursive("@lwrjs/lwc-ssr/lwc_ssr_placeholder", dispatcher, siteConfig, true);
102
- await this.captureAdditionalRouteMetadata(siteConfig);
103
- const endTime = import_perf_hooks.performance.now();
104
- const timeDiff = endTime - startTime;
105
- import_shared_utils.logger.info(`[SSG] SSR Placeholder in ${Math.round(timeDiff)} ms`);
106
- }
107
96
  }
108
97
  createGenerateURLFunction(dispatcher) {
109
98
  const generateRoute = async (uri, siteConfig) => {
@@ -13,7 +13,7 @@ export function createProviderContext(serverContext) {
13
13
  notifyAssetSourceChanged: (payload) => notifyAssetSourceChanged.call(serverContext.appEmitter, payload),
14
14
  },
15
15
  moduleRegistry: serverContext.moduleRegistry.getPublicApi(),
16
- moduleBundler: serverContext.moduleBundler,
16
+ moduleBundler: serverContext.moduleBundler.getPublicApi(),
17
17
  resourceRegistry: serverContext.resourceRegistry.getPublicApi(),
18
18
  viewRegistry: serverContext.viewRegistry.getPublicApi(),
19
19
  assetRegistry: serverContext.assetRegistry.getPublicApi(),
@@ -40,9 +40,11 @@ export function createServerContext(appConfig, runtimeEnvironment, globalData) {
40
40
  resourceRegistry,
41
41
  assetRegistry,
42
42
  viewRegistry,
43
+ watcherFactory,
43
44
  appConfig,
44
45
  runtimeEnvironment,
45
- watcherFactory,
46
+ routes: [],
47
+ errorRoutes: [],
46
48
  };
47
49
  }
48
50
  //# sourceMappingURL=server.js.map
@@ -4,6 +4,8 @@ export declare class LwrApp {
4
4
  private server;
5
5
  private initialized;
6
6
  private config;
7
+ private runtimeEnvironment;
8
+ private globalData;
7
9
  constructor(config?: LwrGlobalConfig);
8
10
  setConfig(config: LwrGlobalConfig): void;
9
11
  getConfig(): NormalizedLwrGlobalConfig;
package/build/es/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import { getFeatureFlags, DEFAULT_LWR_BOOTSTRAP_CONFIG, logger } from '@lwrjs/shared-utils';
2
2
  import { createInternalServer } from '@lwrjs/server';
3
3
  import { LwrServerError, createSingleDiagnosticError, descriptions } from '@lwrjs/diagnostics';
4
- import { loadConfig, normalizeConfig, loadServices, loadRoutes } from '@lwrjs/config';
4
+ import { loadConfig, executeConfigHooks, executeStartHooks } from '@lwrjs/config';
5
+ import { loadHooks, loadServices, loadRoutes } from '@lwrjs/config/modules';
5
6
  import SiteGenerator from './tools/static-generation.js';
6
7
  import { warmupServer } from './tools/server-warmup.js';
7
8
  import { createServerContext } from './context/server.js';
@@ -14,10 +15,7 @@ import { assetMiddleware } from './middleware/asset-middleware.js';
14
15
  import { viewMiddleware } from './middleware/view-middleware.js';
15
16
  import { resourceMiddleware } from './middleware/resource-middleware.js';
16
17
  import { hmrMiddleware } from './middleware/hmr-middleware.js';
17
- import AmdBundlerProvider from '@lwrjs/module-bundler/amd-bundle-provider';
18
- // dependency esbuild in this package.json is to satisfy the optional dependency in module-bundler for ESM bundle minification
19
- import EsmBundlerProvider from '@lwrjs/module-bundler/esm-bundle-provider';
20
- function initMiddleware(app, server, serverContext, routes, errorRoutes) {
18
+ function initMiddleware(app, server, serverContext) {
21
19
  // all middleware attached AFTER compression will have compressed responses
22
20
  app.useCompression();
23
21
  localeMiddleware(app, serverContext);
@@ -28,7 +26,7 @@ function initMiddleware(app, server, serverContext, routes, errorRoutes) {
28
26
  resourceMiddleware(app, serverContext);
29
27
  // view middleware MUST be attached last because it contains a greedy middleware
30
28
  // to handle unsupported routes
31
- viewMiddleware(app, serverContext, routes, errorRoutes);
29
+ viewMiddleware(app, serverContext);
32
30
  // initialize routes MUST be called when using koa
33
31
  app.initRoutes();
34
32
  // hmr uses web sockets, so it doesn't matter when this is attached
@@ -39,46 +37,61 @@ function initMiddleware(app, server, serverContext, routes, errorRoutes) {
39
37
  function createServices(entries, providerContext) {
40
38
  return entries.map(([ctor, providerConfig = {}]) => new ctor(providerConfig, providerContext));
41
39
  }
42
- async function initContext(appConfig, runtimeEnvironment, globalData, services) {
43
- // Initialized PRIVATE server-side context, passed to middleware
40
+ async function initContext(appConfig, runtimeEnvironment, globalData) {
41
+ // load all hooks
42
+ const hooks = await loadHooks(appConfig);
43
+ // apply both config and on start hooks
44
+ if (hooks.length) {
45
+ await executeConfigHooks(hooks, appConfig, runtimeEnvironment, globalData);
46
+ executeStartHooks(hooks, appConfig);
47
+ }
48
+ // load all configurable modules
49
+ const services = await loadServices(appConfig);
50
+ // create all framework components(ie. registries)
44
51
  const serverContext = createServerContext(appConfig, runtimeEnvironment, globalData);
52
+ // create public subset of configurations
45
53
  const providerContext = createProviderContext(serverContext);
46
- const { moduleRegistry, resourceRegistry, viewRegistry, assetRegistry, moduleBundler } = serverContext;
47
- // Module Providers
54
+ const { moduleRegistry, assetRegistry, resourceRegistry, viewRegistry, moduleBundler } = serverContext;
55
+ // instantiate each service
48
56
  const moduleProviders = createServices(services.moduleProviders, providerContext);
49
- moduleRegistry.addModuleProviders(moduleProviders);
50
- // Bundle Providers
51
- moduleBundler.addBundleProviders([
52
- new AmdBundlerProvider({}, { ...providerContext, moduleRegistry }),
53
- new EsmBundlerProvider({}, { ...providerContext, moduleRegistry }),
54
- ]);
55
- // Resource Providers
57
+ const assetProviders = createServices(services.assetProviders, providerContext);
58
+ const assetTransformers = createServices(services.assetTransformers, providerContext);
56
59
  const resourceProviders = createServices(services.resourceProviders, providerContext);
57
- resourceRegistry.addResourceProviders(resourceProviders);
58
- // View Providers
59
60
  const viewProviders = createServices(services.viewProviders, providerContext);
60
- // View Transformers
61
61
  const viewTransformers = createServices(services.viewTransformers, providerContext);
62
- viewRegistry.addViewProviders(viewProviders);
63
- viewRegistry.addViewTransformers(viewTransformers);
64
- await viewRegistry.initializeViewProviders();
65
- // Asset Providers
66
- const assetProviders = createServices(services.assetProviders, providerContext);
67
- const assetTransformers = createServices(services.assetTransformers, providerContext);
62
+ const bundleProviders = createServices(services.bundleProviders, providerContext);
63
+ // add services to their corresponding registry
64
+ moduleRegistry.addModuleProviders(moduleProviders);
68
65
  assetRegistry.addAssetProviders(assetProviders);
69
66
  assetRegistry.addAssetTransformers(assetTransformers);
67
+ resourceRegistry.addResourceProviders(resourceProviders);
68
+ viewRegistry.addViewProviders(viewProviders);
69
+ viewRegistry.addViewTransformers(viewTransformers);
70
+ moduleBundler.addBundleProviders(bundleProviders);
71
+ // invoke async initialization
72
+ await serverContext.viewRegistry.initializeViewProviders();
73
+ // set routes on server context
74
+ const { routes, errorRoutes } = await loadRoutes(appConfig);
75
+ serverContext.routes = routes;
76
+ serverContext.errorRoutes = errorRoutes;
70
77
  return serverContext;
71
78
  }
72
79
  export class LwrApp {
73
- constructor(config) {
80
+ constructor(config = {}) {
74
81
  this.initialized = false;
75
- this.config = normalizeConfig(config);
82
+ const { appConfig, runtimeEnvironment, globalData } = loadConfig(config);
83
+ this.config = appConfig;
84
+ this.runtimeEnvironment = runtimeEnvironment;
85
+ this.globalData = globalData;
76
86
  const { basePath } = this.config;
77
87
  this.app = createInternalServer(this.config.serverType, { basePath });
78
88
  this.server = this.app.createHttpServer();
79
89
  }
80
90
  setConfig(config) {
81
- this.config = normalizeConfig(config);
91
+ const { appConfig, runtimeEnvironment, globalData } = loadConfig(config);
92
+ this.config = appConfig;
93
+ this.runtimeEnvironment = runtimeEnvironment;
94
+ this.globalData = globalData;
82
95
  }
83
96
  getConfig() {
84
97
  return this.config;
@@ -90,16 +103,10 @@ export class LwrApp {
90
103
  // preemptively mark the server as initialized
91
104
  this.initialized = true;
92
105
  try {
93
- // load and process all application configurations, services, and routes
94
- const { appConfig, runtimeEnvironment, globalData } = await loadConfig(this.config);
95
- const services = await loadServices(appConfig);
96
- const { routes, errorRoutes } = await loadRoutes(appConfig);
97
106
  // create the application server context
98
- const context = await initContext(appConfig, runtimeEnvironment, globalData, services);
107
+ const context = await initContext(this.config, this.runtimeEnvironment, this.globalData);
99
108
  // attach framework middleware to the server
100
- initMiddleware(this.app, this.server, context, routes, errorRoutes);
101
- // expose the normalized config after config hooks are applied
102
- this.config = appConfig;
109
+ initMiddleware(this.app, this.server, context);
103
110
  }
104
111
  catch (e) {
105
112
  // reset the initialized property if the server fails to initialize
@@ -166,7 +173,7 @@ export async function generateStaticSite(config) {
166
173
  const { serverMode } = config;
167
174
  if (serverMode === 'dev' || serverMode === 'compat') {
168
175
  // TODO: dynamic imports are not generated in dev mode
169
- // https://github.com/salesforce/lwr/issues/1111
176
+ // https://github.com/salesforce-experience-platform-emu/lwr/issues/1111
170
177
  logger.warn('static generation in `dev` or `compat` mode is currently not fully supported');
171
178
  }
172
179
  const lwrApp = createServer(config);
@@ -3,11 +3,11 @@ import { descriptions } from '@lwrjs/diagnostics';
3
3
  import { getRequestImporter } from './utils/request.js';
4
4
  import { getModuleIdentity } from './utils/identity.js';
5
5
  import { normalizeResolvedUris } from './utils/metadata.js';
6
- import { createUnsignedModuleRedirect } from './redirects/unsigned-module-redirect.js';
6
+ import { createUnsignedBundleRedirect } from './redirects/unsigned-module-redirect.js';
7
7
  import { handleErrors } from './utils/error-handling.js';
8
8
  function createBundleMiddleware(context) {
9
9
  const { moduleRegistry, moduleBundler } = context;
10
- const unsignedRedirect = createUnsignedModuleRedirect(moduleRegistry, moduleBundler);
10
+ const unsignedBundleRedirect = createUnsignedBundleRedirect(moduleBundler);
11
11
  return async (req, res) => {
12
12
  if (!req.validateEnvironmentRequest(context.appConfig)) {
13
13
  res.status(400);
@@ -23,7 +23,7 @@ function createBundleMiddleware(context) {
23
23
  const importer = req.query.importer ? await getRequestImporter(req, moduleRegistry) : undefined;
24
24
  const { moduleId, signature } = getModuleIdentity(req, importer);
25
25
  if (moduleId.importer || !signature) {
26
- await unsignedRedirect(req, res, moduleId, runtimeEnvironment, runtimeParams);
26
+ await unsignedBundleRedirect(req, res, moduleId, runtimeEnvironment, runtimeParams);
27
27
  return;
28
28
  }
29
29
  const sourceMapUrl = req.path.replace('/bundle/', '/sourcemaps/bundle/');
@@ -6,7 +6,7 @@ import { createUnsignedModuleRedirect } from './redirects/unsigned-module-redire
6
6
  import { handleErrors } from './utils/error-handling.js';
7
7
  function createModuleMiddleware(context) {
8
8
  const { moduleRegistry } = context;
9
- const unsignedRedirect = createUnsignedModuleRedirect(moduleRegistry, moduleRegistry);
9
+ const unsignedRedirect = createUnsignedModuleRedirect(moduleRegistry);
10
10
  return async (req, res) => {
11
11
  if (!req.validateEnvironmentRequest(context.appConfig)) {
12
12
  res.status(400);
@@ -1,5 +1,6 @@
1
1
  import type { AbstractModuleId, MiddlewareRequest, MiddlewareResponse, ModuleBundler, ModuleRegistry, RuntimeEnvironment, RuntimeParams } from '@lwrjs/types';
2
2
  declare type UnsignedRedirect = (req: MiddlewareRequest, res: MiddlewareResponse, moduleId: AbstractModuleId, runtimeEnvironment: RuntimeEnvironment, runtimeParams: RuntimeParams) => Promise<void>;
3
- export declare function createUnsignedModuleRedirect(moduleRegistry: ModuleRegistry, defRegistry: ModuleRegistry | ModuleBundler): UnsignedRedirect;
3
+ export declare function createUnsignedModuleRedirect(moduleRegistry: ModuleRegistry): UnsignedRedirect;
4
+ export declare function createUnsignedBundleRedirect(moduleBundler: ModuleBundler): UnsignedRedirect;
4
5
  export {};
5
6
  //# sourceMappingURL=unsigned-module-redirect.d.ts.map
@@ -1,10 +1,25 @@
1
- export function createUnsignedModuleRedirect(moduleRegistry, defRegistry) {
1
+ const HEADER_LOCATION = 'Location';
2
+ const STATUS_FOUND = 302;
3
+ export function createUnsignedModuleRedirect(moduleRegistry) {
2
4
  return async (req, res, moduleId, runtimeEnvironment, runtimeParams) => {
3
- const jsonQuery = req.isJsonRequest() ? `${runtimeEnvironment.debug ? '&' : '?'}json` : '';
5
+ const jsonQuery = getJsonQualifier(req, runtimeEnvironment);
4
6
  const { moduleEntry, ownHash } = await moduleRegistry.getModule(moduleId);
5
- const uri = defRegistry.resolveModuleUri({ ...moduleId, version: moduleEntry.version }, runtimeEnvironment, runtimeParams, ownHash);
6
- res.setHeader('Location', `${uri}${jsonQuery}`);
7
- res.sendStatus(302);
7
+ const uri = await moduleRegistry.resolveModuleUri({ ...moduleId, version: moduleEntry.version }, runtimeEnvironment, runtimeParams, ownHash);
8
+ sendRedirect(res, `${uri}${jsonQuery}`);
8
9
  };
9
10
  }
11
+ export function createUnsignedBundleRedirect(moduleBundler) {
12
+ return async (req, res, moduleId, runtimeEnvironment, runtimeParams) => {
13
+ const jsonQuery = getJsonQualifier(req, runtimeEnvironment);
14
+ const uri = await moduleBundler.resolveModuleUri(moduleId, runtimeEnvironment, runtimeParams);
15
+ sendRedirect(res, `${uri}${jsonQuery}`);
16
+ };
17
+ }
18
+ function getJsonQualifier(req, runtimeEnvironment) {
19
+ return req.isJsonRequest() ? `${runtimeEnvironment.debug ? '&' : '?'}json` : '';
20
+ }
21
+ function sendRedirect(res, url) {
22
+ res.setHeader(HEADER_LOCATION, url);
23
+ res.sendStatus(STATUS_FOUND);
24
+ }
10
25
  //# sourceMappingURL=unsigned-module-redirect.js.map
@@ -20,7 +20,7 @@ function createResourceMiddleware(context) {
20
20
  return;
21
21
  }
22
22
  if (resource && resource.stream) {
23
- res.status(200).type(resource.type).stream(resource.stream);
23
+ res.status(200).type(resource.type).stream(resource.stream());
24
24
  return;
25
25
  }
26
26
  res.status(404).send(descriptions.UNRESOLVABLE.RESOURCE(resourceId.specifier).message);
@@ -28,10 +28,10 @@ function createResourceMiddleware(context) {
28
28
  }
29
29
  export function resourceMiddleware(app, context) {
30
30
  app.get([
31
- `/:apiVersion/resource/:format/l/:locale/e/:environment/:specifier`,
32
- `/:apiVersion/resource/:format/l/:locale/:specifier`,
33
- `/:apiVersion/resource/:format/e/:environment/:specifier`,
34
- `/:apiVersion/resource/:format/:specifier`,
31
+ `/:apiVersion/resource/:format/l/:locale/e/:environment/:specifier/:prettyUrl?`,
32
+ `/:apiVersion/resource/:format/l/:locale/:specifier/:prettyUrl?`,
33
+ `/:apiVersion/resource/:format/e/:environment/:specifier/:prettyUrl?`,
34
+ `/:apiVersion/resource/:format/:specifier/:prettyUrl?`,
35
35
  ], handleErrors(createResourceMiddleware(context)));
36
36
  }
37
37
  //# sourceMappingURL=resource-middleware.js.map
@@ -1,3 +1,3 @@
1
- import type { InternalAppServer, LwrErrorRoute, LwrRoute, Route, ServerContext, ServerTypes } from '@lwrjs/types';
2
- export declare function viewMiddleware<T extends ServerTypes>(app: InternalAppServer<T>, context: ServerContext, routes: Route<LwrRoute>[], errorRoutes: Route<LwrErrorRoute>[]): void;
1
+ import type { InternalAppServer, ServerContext, ServerTypes } from '@lwrjs/types';
2
+ export declare function viewMiddleware<T extends ServerTypes>(app: InternalAppServer<T>, context: ServerContext): void;
3
3
  //# sourceMappingURL=view-middleware.d.ts.map
@@ -112,8 +112,8 @@ function createNotFoundMiddleware(errorRoutes, context, viewHandler) {
112
112
  res.status(404).send(descriptions.UNRESOLVABLE.VIEW(req.originalUrl).message);
113
113
  };
114
114
  }
115
- export function viewMiddleware(app, context, routes, errorRoutes) {
116
- const { appConfig, viewRegistry, moduleRegistry } = context;
115
+ export function viewMiddleware(app, context) {
116
+ const { appConfig, routes, errorRoutes, viewRegistry, moduleRegistry } = context;
117
117
  const viewHandler = new LwrViewHandler({ viewRegistry, moduleRegistry }, appConfig);
118
118
  // create and attach middleware for each route
119
119
  for (const route of routes) {
@@ -89,24 +89,6 @@ export default class SiteGenerator {
89
89
  }
90
90
  }
91
91
  }
92
- // Generate a generic SSR bundle if there are any routes with bootstrap.ssr = true
93
- // This bundle will be used by the lwc-ssr view transformer, it includes definitions for:
94
- // - "@lwrjs/lwc-ssr/lwc_ssr_placeholder"
95
- // - "@lwc/engine-server"
96
- // The lwc_ssr_placeholder will be replaced with a root component specifier at SSR time
97
- const willSSR = routes.some((r) => r.bootstrap?.ssr);
98
- if (willSSR) {
99
- logger.debug(`[SSG] Fetch SSR Placeholder`);
100
- const startTime = performance.now();
101
- const siteConfig = this.createSiteConfig(outputDir, staticSiteGenerator.locales[0], // locale is unused in this bundle
102
- urlRewriteMap, skipBaseDocumentGeneration, runtimeEnvironment);
103
- await this.dispatchJSResourceRecursive('@lwrjs/lwc-ssr/lwc_ssr_placeholder', dispatcher, siteConfig, true);
104
- // Capture any additional collected metadata
105
- await this.captureAdditionalRouteMetadata(siteConfig);
106
- const endTime = performance.now();
107
- const timeDiff = endTime - startTime;
108
- logger.info(`[SSG] SSR Placeholder in ${Math.round(timeDiff)} ms`);
109
- }
110
92
  }
111
93
  /**
112
94
  * Creates a function to dispatch the root requests for a given view url
package/package.json CHANGED
@@ -4,15 +4,15 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "0.9.0-alpha.14",
7
+ "version": "0.9.0-alpha.16",
8
8
  "homepage": "https://developer.salesforce.com/docs/platform/lwr/overview",
9
9
  "repository": {
10
10
  "type": "git",
11
- "url": "https://github.com/salesforce/lwr.git",
11
+ "url": "https://github.com/salesforce-experience-platform-emu/lwr.git",
12
12
  "directory": "packages/@lwrjs/core"
13
13
  },
14
14
  "bugs": {
15
- "url": "https://github.com/salesforce/lwr/issues"
15
+ "url": "https://github.com/salesforce-experience-platform-emu/lwr/issues"
16
16
  },
17
17
  "type": "module",
18
18
  "types": "build/es/index.d.ts",
@@ -37,29 +37,29 @@
37
37
  ],
38
38
  "dependencies": {
39
39
  "@locker/compiler": "0.18.2",
40
- "@lwrjs/app-service": "0.9.0-alpha.14",
41
- "@lwrjs/asset-registry": "0.9.0-alpha.14",
42
- "@lwrjs/asset-transformer": "0.9.0-alpha.14",
43
- "@lwrjs/base-view-provider": "0.9.0-alpha.14",
44
- "@lwrjs/base-view-transformer": "0.9.0-alpha.14",
45
- "@lwrjs/client-modules": "0.9.0-alpha.14",
46
- "@lwrjs/config": "0.9.0-alpha.14",
47
- "@lwrjs/diagnostics": "0.9.0-alpha.14",
48
- "@lwrjs/fs-asset-provider": "0.9.0-alpha.14",
49
- "@lwrjs/html-view-provider": "0.9.0-alpha.14",
50
- "@lwrjs/loader": "0.9.0-alpha.14",
51
- "@lwrjs/lwc-module-provider": "0.9.0-alpha.14",
52
- "@lwrjs/markdown-view-provider": "0.9.0-alpha.14",
53
- "@lwrjs/module-bundler": "0.9.0-alpha.14",
54
- "@lwrjs/module-registry": "0.9.0-alpha.14",
55
- "@lwrjs/npm-module-provider": "0.9.0-alpha.14",
56
- "@lwrjs/nunjucks-view-provider": "0.9.0-alpha.14",
57
- "@lwrjs/o11y": "0.9.0-alpha.14",
58
- "@lwrjs/resource-registry": "0.9.0-alpha.14",
59
- "@lwrjs/router": "0.9.0-alpha.14",
60
- "@lwrjs/server": "0.9.0-alpha.14",
61
- "@lwrjs/shared-utils": "0.9.0-alpha.14",
62
- "@lwrjs/view-registry": "0.9.0-alpha.14",
40
+ "@lwrjs/app-service": "0.9.0-alpha.16",
41
+ "@lwrjs/asset-registry": "0.9.0-alpha.16",
42
+ "@lwrjs/asset-transformer": "0.9.0-alpha.16",
43
+ "@lwrjs/base-view-provider": "0.9.0-alpha.16",
44
+ "@lwrjs/base-view-transformer": "0.9.0-alpha.16",
45
+ "@lwrjs/client-modules": "0.9.0-alpha.16",
46
+ "@lwrjs/config": "0.9.0-alpha.16",
47
+ "@lwrjs/diagnostics": "0.9.0-alpha.16",
48
+ "@lwrjs/fs-asset-provider": "0.9.0-alpha.16",
49
+ "@lwrjs/html-view-provider": "0.9.0-alpha.16",
50
+ "@lwrjs/loader": "0.9.0-alpha.16",
51
+ "@lwrjs/lwc-module-provider": "0.9.0-alpha.16",
52
+ "@lwrjs/markdown-view-provider": "0.9.0-alpha.16",
53
+ "@lwrjs/module-bundler": "0.9.0-alpha.16",
54
+ "@lwrjs/module-registry": "0.9.0-alpha.16",
55
+ "@lwrjs/npm-module-provider": "0.9.0-alpha.16",
56
+ "@lwrjs/nunjucks-view-provider": "0.9.0-alpha.16",
57
+ "@lwrjs/o11y": "0.9.0-alpha.16",
58
+ "@lwrjs/resource-registry": "0.9.0-alpha.16",
59
+ "@lwrjs/router": "0.9.0-alpha.16",
60
+ "@lwrjs/server": "0.9.0-alpha.16",
61
+ "@lwrjs/shared-utils": "0.9.0-alpha.16",
62
+ "@lwrjs/view-registry": "0.9.0-alpha.16",
63
63
  "chokidar": "^3.5.3",
64
64
  "esbuild": "^0.9.7",
65
65
  "fs-extra": "^10.1.0",
@@ -69,7 +69,7 @@
69
69
  "ws": "^8.8.1"
70
70
  },
71
71
  "devDependencies": {
72
- "@lwrjs/types": "0.9.0-alpha.14",
72
+ "@lwrjs/types": "0.9.0-alpha.16",
73
73
  "@types/ws": "^8.5.3"
74
74
  },
75
75
  "peerDependencies": {
@@ -78,5 +78,5 @@
78
78
  "engines": {
79
79
  "node": ">=14.15.4 <19"
80
80
  },
81
- "gitHead": "64e0ba617151429da6e09f1a9686628f64183d25"
81
+ "gitHead": "03fe3982780e7c63b96ef0733b58529057db61fa"
82
82
  }