@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.
- package/build/cjs/context/provider.cjs +1 -1
- package/build/cjs/context/server.cjs +3 -1
- package/build/cjs/index.cjs +34 -26
- package/build/cjs/middleware/bundle-middleware.cjs +2 -2
- package/build/cjs/middleware/module-middleware.cjs +1 -1
- package/build/cjs/middleware/redirects/unsigned-module-redirect.cjs +21 -5
- package/build/cjs/middleware/resource-middleware.cjs +5 -5
- package/build/cjs/middleware/view-middleware.cjs +2 -2
- package/build/cjs/tools/static-generation.cjs +0 -11
- package/build/es/context/provider.js +1 -1
- package/build/es/context/server.js +3 -1
- package/build/es/index.d.ts +2 -0
- package/build/es/index.js +45 -38
- package/build/es/middleware/bundle-middleware.js +3 -3
- package/build/es/middleware/module-middleware.js +1 -1
- package/build/es/middleware/redirects/unsigned-module-redirect.d.ts +2 -1
- package/build/es/middleware/redirects/unsigned-module-redirect.js +20 -5
- package/build/es/middleware/resource-middleware.js +5 -5
- package/build/es/middleware/view-middleware.d.ts +2 -2
- package/build/es/middleware/view-middleware.js +2 -2
- package/build/es/tools/static-generation.js +0 -18
- package/package.json +28 -28
|
@@ -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(),
|
package/build/cjs/index.cjs
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
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,
|
|
74
|
+
const {moduleRegistry, assetRegistry, resourceRegistry, viewRegistry, moduleBundler} = serverContext;
|
|
70
75
|
const moduleProviders = createServices(services.moduleProviders, providerContext);
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
81
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
110
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
18
|
+
const jsonQuery = getJsonQualifier(req, runtimeEnvironment);
|
|
16
19
|
const {moduleEntry, ownHash} = await moduleRegistry.getModule(moduleId);
|
|
17
|
-
const uri =
|
|
18
|
-
res
|
|
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
|
|
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
|
-
|
|
46
|
+
routes: [],
|
|
47
|
+
errorRoutes: [],
|
|
46
48
|
};
|
|
47
49
|
}
|
|
48
50
|
//# sourceMappingURL=server.js.map
|
package/build/es/index.d.ts
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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
|
|
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
|
|
43
|
-
//
|
|
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,
|
|
47
|
-
//
|
|
54
|
+
const { moduleRegistry, assetRegistry, resourceRegistry, viewRegistry, moduleBundler } = serverContext;
|
|
55
|
+
// instantiate each service
|
|
48
56
|
const moduleProviders = createServices(services.moduleProviders, providerContext);
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
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 {
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
5
|
+
const jsonQuery = getJsonQualifier(req, runtimeEnvironment);
|
|
4
6
|
const { moduleEntry, ownHash } = await moduleRegistry.getModule(moduleId);
|
|
5
|
-
const uri =
|
|
6
|
-
res
|
|
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,
|
|
2
|
-
export declare function viewMiddleware<T extends ServerTypes>(app: InternalAppServer<T>, context: ServerContext
|
|
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
|
|
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.
|
|
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.
|
|
41
|
-
"@lwrjs/asset-registry": "0.9.0-alpha.
|
|
42
|
-
"@lwrjs/asset-transformer": "0.9.0-alpha.
|
|
43
|
-
"@lwrjs/base-view-provider": "0.9.0-alpha.
|
|
44
|
-
"@lwrjs/base-view-transformer": "0.9.0-alpha.
|
|
45
|
-
"@lwrjs/client-modules": "0.9.0-alpha.
|
|
46
|
-
"@lwrjs/config": "0.9.0-alpha.
|
|
47
|
-
"@lwrjs/diagnostics": "0.9.0-alpha.
|
|
48
|
-
"@lwrjs/fs-asset-provider": "0.9.0-alpha.
|
|
49
|
-
"@lwrjs/html-view-provider": "0.9.0-alpha.
|
|
50
|
-
"@lwrjs/loader": "0.9.0-alpha.
|
|
51
|
-
"@lwrjs/lwc-module-provider": "0.9.0-alpha.
|
|
52
|
-
"@lwrjs/markdown-view-provider": "0.9.0-alpha.
|
|
53
|
-
"@lwrjs/module-bundler": "0.9.0-alpha.
|
|
54
|
-
"@lwrjs/module-registry": "0.9.0-alpha.
|
|
55
|
-
"@lwrjs/npm-module-provider": "0.9.0-alpha.
|
|
56
|
-
"@lwrjs/nunjucks-view-provider": "0.9.0-alpha.
|
|
57
|
-
"@lwrjs/o11y": "0.9.0-alpha.
|
|
58
|
-
"@lwrjs/resource-registry": "0.9.0-alpha.
|
|
59
|
-
"@lwrjs/router": "0.9.0-alpha.
|
|
60
|
-
"@lwrjs/server": "0.9.0-alpha.
|
|
61
|
-
"@lwrjs/shared-utils": "0.9.0-alpha.
|
|
62
|
-
"@lwrjs/view-registry": "0.9.0-alpha.
|
|
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.
|
|
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": "
|
|
81
|
+
"gitHead": "03fe3982780e7c63b96ef0733b58529057db61fa"
|
|
82
82
|
}
|