@lwrjs/core 0.9.0-alpha.2 → 0.9.0-alpha.21
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 +84 -0
- package/build/cjs/context/server.cjs +75 -0
- package/build/cjs/index.cjs +69 -153
- package/build/cjs/middleware/asset-middleware.cjs +56 -0
- package/build/cjs/middleware/bundle-middleware.cjs +113 -0
- package/build/cjs/{middlewares → middleware}/hmr-middleware.cjs +4 -4
- package/build/cjs/{middlewares → middleware}/locale-middleware.cjs +2 -2
- package/build/cjs/middleware/mapping-middleware.cjs +61 -0
- package/build/cjs/middleware/module-middleware.cjs +88 -0
- package/build/cjs/middleware/redirects/unsigned-module-redirect.cjs +37 -0
- package/build/cjs/middleware/resource-middleware.cjs +64 -0
- package/build/cjs/{context/services.cjs → middleware/utils/error-handling.cjs} +28 -15
- package/build/cjs/middleware/utils/identity.cjs +93 -0
- package/build/cjs/{context/hooks.cjs → middleware/utils/metadata.cjs} +17 -26
- package/build/cjs/{middlewares/utils.cjs → middleware/utils/request.cjs} +17 -16
- package/build/cjs/middleware/view-middleware.cjs +151 -0
- package/build/cjs/middleware.cjs +43 -0
- package/build/cjs/tools/server-warmup.cjs +2 -9
- package/build/cjs/tools/static-generation.cjs +127 -49
- package/build/es/context/provider.d.ts +3 -0
- package/build/es/context/provider.js +39 -0
- package/build/es/context/server.d.ts +3 -0
- package/build/es/context/server.js +49 -0
- package/build/es/index.d.ts +4 -2
- package/build/es/index.js +89 -150
- package/build/es/middleware/asset-middleware.d.ts +3 -0
- package/build/es/middleware/asset-middleware.js +26 -0
- package/build/es/middleware/bundle-middleware.d.ts +3 -0
- package/build/es/middleware/bundle-middleware.js +88 -0
- package/build/es/middleware/hmr-middleware.d.ts +5 -0
- package/build/es/{middlewares → middleware}/hmr-middleware.js +2 -2
- package/build/es/middleware/locale-middleware.d.ts +3 -0
- package/build/es/{middlewares → middleware}/locale-middleware.js +2 -1
- package/build/es/middleware/mapping-middleware.d.ts +3 -0
- package/build/es/middleware/mapping-middleware.js +34 -0
- package/build/es/middleware/module-middleware.d.ts +3 -0
- package/build/es/middleware/module-middleware.js +64 -0
- package/build/es/middleware/redirects/unsigned-module-redirect.d.ts +6 -0
- package/build/es/middleware/redirects/unsigned-module-redirect.js +25 -0
- package/build/es/middleware/resource-middleware.d.ts +3 -0
- package/build/es/middleware/resource-middleware.js +37 -0
- package/build/es/middleware/utils/error-handling.d.ts +3 -0
- package/build/es/middleware/utils/error-handling.js +32 -0
- package/build/es/middleware/utils/identity.d.ts +6 -0
- package/build/es/middleware/utils/identity.js +64 -0
- package/build/es/middleware/utils/metadata.d.ts +3 -0
- package/build/es/middleware/utils/metadata.js +24 -0
- package/build/es/middleware/utils/request.d.ts +15 -0
- package/build/es/{middlewares/utils.js → middleware/utils/request.js} +15 -23
- package/build/es/middleware/view-middleware.d.ts +3 -0
- package/build/es/middleware/view-middleware.js +136 -0
- package/build/es/middleware.d.ts +9 -0
- package/build/es/middleware.js +13 -0
- package/build/es/tools/server-warmup.js +3 -10
- package/build/es/tools/static-generation.d.ts +8 -1
- package/build/es/tools/static-generation.js +155 -62
- package/build/es/tools/types.d.ts +3 -2
- package/package.json +36 -32
- package/build/cjs/context/global-data.cjs +0 -54
- package/build/cjs/middlewares/api-middleware.cjs +0 -359
- package/build/cjs/middlewares/base-middleware.cjs +0 -15
- package/build/cjs/middlewares/ui-middleware.cjs +0 -183
- package/build/es/context/global-data.d.ts +0 -3
- package/build/es/context/global-data.js +0 -29
- package/build/es/context/hooks.d.ts +0 -9
- package/build/es/context/hooks.js +0 -36
- package/build/es/context/services.d.ts +0 -8
- package/build/es/context/services.js +0 -17
- package/build/es/middlewares/api-middleware.d.ts +0 -3
- package/build/es/middlewares/api-middleware.js +0 -410
- package/build/es/middlewares/base-middleware.d.ts +0 -3
- package/build/es/middlewares/base-middleware.js +0 -4
- package/build/es/middlewares/hmr-middleware.d.ts +0 -5
- package/build/es/middlewares/locale-middleware.d.ts +0 -3
- package/build/es/middlewares/ui-middleware.d.ts +0 -3
- package/build/es/middlewares/ui-middleware.js +0 -186
- package/build/es/middlewares/utils.d.ts +0 -22
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { performance } from 'perf_hooks';
|
|
2
|
-
import { getSpecifier, getFeatureFlags, hashContent, isSelfUrl, getModuleUriPrefix, getMappingUriPrefix, logger, WARN, INFO, } from '@lwrjs/shared-utils';
|
|
2
|
+
import { getSpecifier, getFeatureFlags, hashContent, isSelfUrl, getModuleUriPrefix, getMappingUriPrefix, logger, WARN, INFO, SiteMetadataImpl, isExternalUrl, } from '@lwrjs/shared-utils';
|
|
3
3
|
import { join, dirname, extname } from 'path';
|
|
4
4
|
import fs from 'fs-extra';
|
|
5
5
|
import { writeResponse } from './utils/stream.js';
|
|
6
6
|
import { createDir, createResourceDir } from './utils/dir.js';
|
|
7
|
-
import {
|
|
7
|
+
import { getRuntimeEnvironment } from '@lwrjs/config';
|
|
8
8
|
export default class SiteGenerator {
|
|
9
9
|
/**
|
|
10
10
|
* Build a static site in the configured directory
|
|
@@ -16,7 +16,7 @@ export default class SiteGenerator {
|
|
|
16
16
|
*/
|
|
17
17
|
async buildStaticApplication(config, dispatcher) {
|
|
18
18
|
const startTime = performance.now();
|
|
19
|
-
logger.info('[Static Generation
|
|
19
|
+
logger.info('[SSG] Static Site Generation');
|
|
20
20
|
// De-duplicate warming messages if log level is warn or info
|
|
21
21
|
if (!logger.currentLevel || logger.currentLevel == WARN || logger.currentLevel == INFO) {
|
|
22
22
|
logger.setOptions({ dedupe: new Set([WARN]) });
|
|
@@ -26,18 +26,16 @@ export default class SiteGenerator {
|
|
|
26
26
|
staticSiteGenerator.outputDir = '__generated_site__';
|
|
27
27
|
}
|
|
28
28
|
const outputDir = join(rootDir, staticSiteGenerator.outputDir);
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
if (!staticSiteGenerator.skipCleanOutputDir) {
|
|
30
|
+
logger.info(`[SSG] Clearing output directory: ${outputDir}`);
|
|
31
|
+
fs.rmSync(outputDir, { recursive: true, force: true });
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
logger.info(`[SSG] Reusing existing output directory: ${outputDir}`);
|
|
35
|
+
}
|
|
31
36
|
const urlRewriteMap = new Map();
|
|
32
|
-
const {
|
|
33
|
-
const runtimeEnvironment =
|
|
34
|
-
...explodeMode(serverMode),
|
|
35
|
-
apiVersion,
|
|
36
|
-
basePath,
|
|
37
|
-
lwrVersion,
|
|
38
|
-
debug: false,
|
|
39
|
-
serverMode,
|
|
40
|
-
};
|
|
37
|
+
const { basePath } = config;
|
|
38
|
+
const runtimeEnvironment = getRuntimeEnvironment(config);
|
|
41
39
|
// For each locale, generate all the modules
|
|
42
40
|
await this.generateRoutes(runtimeEnvironment, staticSiteGenerator, routes, basePath, dispatcher, outputDir, urlRewriteMap);
|
|
43
41
|
// Write redirect files
|
|
@@ -46,7 +44,7 @@ export default class SiteGenerator {
|
|
|
46
44
|
this.copyAssets(assets, outputDir, basePath);
|
|
47
45
|
const endTime = performance.now();
|
|
48
46
|
const timeDiff = (endTime - startTime) / 1000;
|
|
49
|
-
logger.info(`[Static Generation
|
|
47
|
+
logger.info(`[SSG] Static Site Generation complete in ${Math.round(timeDiff)} seconds`);
|
|
50
48
|
}
|
|
51
49
|
/**
|
|
52
50
|
* Crawl all view routes for a site
|
|
@@ -57,17 +55,18 @@ export default class SiteGenerator {
|
|
|
57
55
|
}
|
|
58
56
|
const generateUrl = this.createGenerateURLFunction(dispatcher);
|
|
59
57
|
// Note: generateUrl can consume a lot of memory so we need to do this sequentially
|
|
58
|
+
const { skipBaseDocumentGeneration = false } = staticSiteGenerator;
|
|
60
59
|
for (const locale of staticSiteGenerator.locales) {
|
|
61
60
|
// Generate all the routes
|
|
62
61
|
for (const route of routes) {
|
|
63
|
-
const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap, runtimeEnvironment);
|
|
62
|
+
const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap, skipBaseDocumentGeneration, runtimeEnvironment);
|
|
64
63
|
// eslint-disable-next-line no-await-in-loop
|
|
65
64
|
await generateUrl(basePath + route.path, siteConfig);
|
|
66
65
|
}
|
|
67
66
|
// Generate any additional urls
|
|
68
67
|
if (staticSiteGenerator._additionalRoutePaths) {
|
|
69
68
|
for (const uri of staticSiteGenerator._additionalRoutePaths) {
|
|
70
|
-
const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap, runtimeEnvironment);
|
|
69
|
+
const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap, skipBaseDocumentGeneration, runtimeEnvironment);
|
|
71
70
|
// eslint-disable-next-line no-await-in-loop
|
|
72
71
|
await generateUrl(uri, siteConfig);
|
|
73
72
|
}
|
|
@@ -76,9 +75,17 @@ export default class SiteGenerator {
|
|
|
76
75
|
const { _additionalModules } = staticSiteGenerator;
|
|
77
76
|
if (_additionalModules) {
|
|
78
77
|
for (const specifier of _additionalModules) {
|
|
79
|
-
|
|
78
|
+
logger.debug(`[SSG] Additional Module: ${locale} ${specifier}`);
|
|
79
|
+
const startTime = performance.now();
|
|
80
|
+
const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap, skipBaseDocumentGeneration, runtimeEnvironment);
|
|
80
81
|
// eslint-disable-next-line no-await-in-loop
|
|
81
82
|
await this.dispatchJSResourceRecursive(specifier, dispatcher, siteConfig, true);
|
|
83
|
+
// Capture any additional collected metadata
|
|
84
|
+
// eslint-disable-next-line no-await-in-loop
|
|
85
|
+
await this.captureAdditionalRouteMetadata(siteConfig);
|
|
86
|
+
const endTime = performance.now();
|
|
87
|
+
const timeDiff = endTime - startTime;
|
|
88
|
+
logger.info(`[SSG] Additional Module ${locale} ${specifier} in ${Math.round(timeDiff)} ms`);
|
|
82
89
|
}
|
|
83
90
|
}
|
|
84
91
|
}
|
|
@@ -89,12 +96,15 @@ export default class SiteGenerator {
|
|
|
89
96
|
createGenerateURLFunction(dispatcher) {
|
|
90
97
|
const generateRoute = async (uri, siteConfig) => {
|
|
91
98
|
const locale = siteConfig.locale;
|
|
92
|
-
logger.
|
|
99
|
+
logger.debug(`[SSG] Start Generate: ${locale} ${uri}`);
|
|
100
|
+
const startTime = performance.now();
|
|
93
101
|
// Kick off site generation for the current route
|
|
94
102
|
await this.dispatchResourceRecursive(uri, dispatcher, { resourceType: 'route' }, siteConfig);
|
|
95
|
-
//
|
|
96
|
-
this.
|
|
97
|
-
|
|
103
|
+
// Capture any additional route metadata
|
|
104
|
+
await this.captureAdditionalRouteMetadata(siteConfig);
|
|
105
|
+
const endTime = performance.now();
|
|
106
|
+
const timeDiff = endTime - startTime;
|
|
107
|
+
logger.info(`[SSG] ${locale} ${uri} in ${Math.round(timeDiff)} ms`);
|
|
98
108
|
};
|
|
99
109
|
return generateRoute.bind(this);
|
|
100
110
|
}
|
|
@@ -110,10 +120,15 @@ export default class SiteGenerator {
|
|
|
110
120
|
const { visitedUrls } = siteConfig;
|
|
111
121
|
if (!visitedUrls.has(url)) {
|
|
112
122
|
visitedUrls.add(url); // Maintain a list of visited urls here to avoid potential infinite loops
|
|
123
|
+
// Skip remote urls (i.e. http://) the static view would call the remote url at runtime
|
|
124
|
+
if (isExternalUrl(url)) {
|
|
125
|
+
logger.warn('[SSG] Skipped generation of external url: ' + url);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
113
128
|
// Skip urls with path segment variables (i.e. '/custom/:bar')
|
|
114
129
|
// Users can specify specific urls via the '_additionalRoutePaths' config property
|
|
115
130
|
if (url.indexOf('/:') !== -1 || url.indexOf('*') !== -1) {
|
|
116
|
-
logger.warn('Skipped generation of url with variable path segment: ' + url);
|
|
131
|
+
logger.warn('[SSG] Skipped generation of url with variable path segment: ' + url);
|
|
117
132
|
return;
|
|
118
133
|
}
|
|
119
134
|
// Generate resource
|
|
@@ -200,6 +215,10 @@ export default class SiteGenerator {
|
|
|
200
215
|
: getSpecifier(importModule);
|
|
201
216
|
dispatchRequests.push(this.dispatchJSResourceRecursive(jsUri, dispatcher, siteConfig));
|
|
202
217
|
}
|
|
218
|
+
// If this is a bundle add it to the bundle metadata
|
|
219
|
+
if (moduleDefinition.bundleRecord) {
|
|
220
|
+
this.addBundleToSiteMetadata(moduleDefinition, url, siteConfig);
|
|
221
|
+
}
|
|
203
222
|
}
|
|
204
223
|
// Bundles with unresolved module uris
|
|
205
224
|
const uris = context.fs?.metadata?.resolvedUris || [];
|
|
@@ -209,6 +228,52 @@ export default class SiteGenerator {
|
|
|
209
228
|
// -- Dispatch dependencies
|
|
210
229
|
await Promise.all(dispatchRequests);
|
|
211
230
|
}
|
|
231
|
+
addBundleToSiteMetadata(bundleDefinition, url, siteConfig) {
|
|
232
|
+
if (siteConfig.siteMetadata) {
|
|
233
|
+
const specifier = bundleDefinition.specifier;
|
|
234
|
+
const imports = bundleDefinition.bundleRecord.imports?.map((moduleRef) => moduleRef.specifier) || [];
|
|
235
|
+
const bundleMetadata = {
|
|
236
|
+
version: bundleDefinition.version,
|
|
237
|
+
path: decodeURIComponent(url),
|
|
238
|
+
includedModules: bundleDefinition.bundleRecord.includedModules || [],
|
|
239
|
+
imports,
|
|
240
|
+
};
|
|
241
|
+
const siteBundles = siteConfig.siteMetadata.getSiteBundles().bundles;
|
|
242
|
+
siteBundles[specifier] = bundleMetadata;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
addResourceToSiteMetadata(resourceDefinition, url, siteConfig) {
|
|
246
|
+
if (siteConfig.siteMetadata) {
|
|
247
|
+
if (!resourceDefinition.specifier) {
|
|
248
|
+
logger.warn('[SSG] Could not save resource metadata. There was no specifier.', resourceDefinition);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
const specifier = resourceDefinition.specifier;
|
|
252
|
+
const resourceMetadata = {
|
|
253
|
+
path: decodeURIComponent(url),
|
|
254
|
+
mimeType: resourceDefinition.type,
|
|
255
|
+
};
|
|
256
|
+
const siteResources = siteConfig.siteMetadata.getSiteResources();
|
|
257
|
+
siteResources.resources[specifier] = resourceMetadata;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
addAssetToSiteMetadata(assetDefinition, url, siteConfig) {
|
|
262
|
+
if (siteConfig.siteMetadata) {
|
|
263
|
+
if (!assetDefinition.uri) {
|
|
264
|
+
logger.warn('[SSG] Could not save asset metadata. There was no uri.', assetDefinition);
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
const specifier = assetDefinition.uri;
|
|
268
|
+
const resourceMetadata = {
|
|
269
|
+
path: decodeURIComponent(url),
|
|
270
|
+
mimeType: String(assetDefinition.mime),
|
|
271
|
+
};
|
|
272
|
+
const siteAssets = siteConfig.siteMetadata.getSiteAssets();
|
|
273
|
+
siteAssets.assets[specifier] = resourceMetadata;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
212
277
|
/**
|
|
213
278
|
* Handle processing a returned module URI mapping resource and follow all returned references
|
|
214
279
|
* @param url - URL of the request mapping resource
|
|
@@ -244,7 +309,7 @@ export default class SiteGenerator {
|
|
|
244
309
|
}
|
|
245
310
|
else {
|
|
246
311
|
const body = context.fs?.body;
|
|
247
|
-
logger.warn(`Failed to fetch ${url}: (${statusCode}) ${body}`);
|
|
312
|
+
logger.warn(`[SSG] Failed to fetch ${url}: (${statusCode}) ${body}`);
|
|
248
313
|
}
|
|
249
314
|
}
|
|
250
315
|
/**
|
|
@@ -256,35 +321,37 @@ export default class SiteGenerator {
|
|
|
256
321
|
* @param dispatcher - Network Dispatcher
|
|
257
322
|
*/
|
|
258
323
|
async handleHtmlResource(url, context, siteConfig, dispatcher) {
|
|
259
|
-
const { outputDir } = siteConfig;
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
siteConfig.
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
324
|
+
const { outputDir, skipBaseDocumentGeneration } = siteConfig;
|
|
325
|
+
if (!skipBaseDocumentGeneration) {
|
|
326
|
+
let fileName = 'index.html';
|
|
327
|
+
let directoryPath = url;
|
|
328
|
+
// If we have a route path that ends with a html or xml file extension,
|
|
329
|
+
// use that last path segment for the file name
|
|
330
|
+
if (url.endsWith('.html') || url.endsWith('.xml')) {
|
|
331
|
+
const lastPathIndex = url.lastIndexOf('/') + 1;
|
|
332
|
+
fileName = url.substring(lastPathIndex, url.length);
|
|
333
|
+
directoryPath = url.substring(0, lastPathIndex);
|
|
334
|
+
}
|
|
335
|
+
const dir = createResourceDir(directoryPath, outputDir);
|
|
336
|
+
const localeDir = createResourceDir(directoryPath, join(outputDir, siteConfig.locale));
|
|
337
|
+
// TODO: Should we handle routes with non-html extensions differently?
|
|
338
|
+
// Example Route: "path": "/mixed_templates.md" (not sure why you would do this)
|
|
339
|
+
// "contentTemplate": "$contentDir/composed_markdown.md"
|
|
340
|
+
// Today this will get written to /mixed_templates.md/index.html
|
|
341
|
+
// Which we workaround by setting "renderSingle": true in serve.json
|
|
342
|
+
const filePath = join(dir, fileName);
|
|
343
|
+
const fileLocalePath = join(localeDir, fileName);
|
|
344
|
+
// Default Path (only write once)
|
|
345
|
+
// The default locale is english
|
|
346
|
+
if (siteConfig.locale.toLowerCase().startsWith('en')) {
|
|
347
|
+
siteConfig.viewPaths.add(filePath);
|
|
348
|
+
await writeResponse(context, filePath);
|
|
349
|
+
}
|
|
350
|
+
// Language path (always write out)
|
|
351
|
+
createDir(localeDir);
|
|
352
|
+
siteConfig.viewPaths.add(fileLocalePath);
|
|
353
|
+
await writeResponse(context, fileLocalePath);
|
|
354
|
+
}
|
|
288
355
|
// Get the metadata
|
|
289
356
|
const viewDefinition = context.fs?.metadata?.viewDefinition;
|
|
290
357
|
if (viewDefinition) {
|
|
@@ -345,7 +412,7 @@ export default class SiteGenerator {
|
|
|
345
412
|
}
|
|
346
413
|
}
|
|
347
414
|
else {
|
|
348
|
-
logger.warn('Skipped inline bootstrap resource: %j', resource);
|
|
415
|
+
logger.warn('[SSG] Skipped inline bootstrap resource: %j', resource);
|
|
349
416
|
}
|
|
350
417
|
}
|
|
351
418
|
}
|
|
@@ -357,7 +424,7 @@ export default class SiteGenerator {
|
|
|
357
424
|
dispatchRequests.push(this.dispatchResourceRecursive(resourceUri, dispatcher, { resourceType: 'resource' }, siteConfig));
|
|
358
425
|
}
|
|
359
426
|
else {
|
|
360
|
-
logger.warn('Skipped resource: %j', resource);
|
|
427
|
+
logger.warn('[SSG] Skipped resource: %j', resource);
|
|
361
428
|
}
|
|
362
429
|
}
|
|
363
430
|
// -- Dispatch dependencies
|
|
@@ -377,7 +444,7 @@ export default class SiteGenerator {
|
|
|
377
444
|
await this.dispatchResourceRecursive(mappingURL, dispatcher, { resourceType: 'mapping' }, siteConfig);
|
|
378
445
|
}
|
|
379
446
|
else {
|
|
380
|
-
logger.warn('Unable to fetch mapping for bare specifier or variable dynamic import: "' +
|
|
447
|
+
logger.warn('[SSG] Unable to fetch mapping for bare specifier or variable dynamic import: "' +
|
|
381
448
|
jsUri +
|
|
382
449
|
'"');
|
|
383
450
|
}
|
|
@@ -402,6 +469,14 @@ export default class SiteGenerator {
|
|
|
402
469
|
const metadata = context.fs?.metadata;
|
|
403
470
|
const fullPath = this.getResourcePathFromUrl(siteConfig, url);
|
|
404
471
|
await writeResponse(context, fullPath);
|
|
472
|
+
// Save Metadata
|
|
473
|
+
// If resource add to resource metadata
|
|
474
|
+
if (metadata?.resource) {
|
|
475
|
+
this.addResourceToSiteMetadata(metadata?.resource, url, siteConfig);
|
|
476
|
+
}
|
|
477
|
+
else if (metadata?.asset) {
|
|
478
|
+
this.addAssetToSiteMetadata(metadata?.asset, url, siteConfig);
|
|
479
|
+
}
|
|
405
480
|
// Call and referenced assets...
|
|
406
481
|
const assetReferences = metadata?.asset?.metadata?.assetReferences || [];
|
|
407
482
|
const dispatchRequests = [];
|
|
@@ -409,7 +484,7 @@ export default class SiteGenerator {
|
|
|
409
484
|
const refUrl = ref.override?.uri || ref.url;
|
|
410
485
|
dispatchRequests.push(this.dispatchResourceRecursive(refUrl, dispatcher, { resourceType: 'asset', asset: metadata?.asset }, siteConfig).catch((err) => {
|
|
411
486
|
// Warn the user that the we failed to fetch a referenced asset
|
|
412
|
-
logger.warn(`Failed to fetch asset reference => ${refUrl} from ${url}`, err);
|
|
487
|
+
logger.warn(`[SSG] Failed to fetch asset reference => ${refUrl} from ${url}`, err);
|
|
413
488
|
}));
|
|
414
489
|
}
|
|
415
490
|
return Promise.all(dispatchRequests);
|
|
@@ -467,18 +542,18 @@ export default class SiteGenerator {
|
|
|
467
542
|
fs.copySync(assetSrcDir, assetOutputDir);
|
|
468
543
|
}
|
|
469
544
|
else {
|
|
470
|
-
logger.warn('Could not find assets to copy at path: ' + assetSrcDir);
|
|
545
|
+
logger.warn('[SSG] Could not find assets to copy at path: ' + assetSrcDir);
|
|
471
546
|
}
|
|
472
547
|
}
|
|
473
548
|
catch (e) {
|
|
474
|
-
logger.error('Error occurred processing asset config: ' + JSON.stringify(asset), e);
|
|
549
|
+
logger.error('[SSG] Error occurred processing asset config: ' + JSON.stringify(asset), e);
|
|
475
550
|
}
|
|
476
551
|
}
|
|
477
552
|
}
|
|
478
553
|
/**
|
|
479
554
|
* Create a new site config for the current view
|
|
480
555
|
*/
|
|
481
|
-
createSiteConfig(outputDir, locale, urlRewriteMap, runtimeEnvironment) {
|
|
556
|
+
createSiteConfig(outputDir, locale, urlRewriteMap, skipBaseDocumentGeneration, runtimeEnvironment) {
|
|
482
557
|
const featureFlags = this.filterFeatureFlags();
|
|
483
558
|
const endpoints = {
|
|
484
559
|
uris: {
|
|
@@ -494,13 +569,22 @@ export default class SiteGenerator {
|
|
|
494
569
|
locale,
|
|
495
570
|
urlRewriteMap,
|
|
496
571
|
endpoints,
|
|
572
|
+
skipBaseDocumentGeneration,
|
|
497
573
|
// Only include LEGACY_LOADER if true
|
|
498
574
|
...featureFlags,
|
|
575
|
+
siteMetadata: new SiteMetadataImpl({ rootDir: outputDir }),
|
|
499
576
|
};
|
|
500
577
|
}
|
|
501
578
|
filterFeatureFlags() {
|
|
502
|
-
|
|
503
|
-
|
|
579
|
+
const ffs = getFeatureFlags();
|
|
580
|
+
if (ffs && Object.keys(ffs).length) {
|
|
581
|
+
const accumlator = {};
|
|
582
|
+
for (const [key, value] of Object.entries(ffs)) {
|
|
583
|
+
if (value) {
|
|
584
|
+
accumlator[key] = true;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
return { featureFlags: accumlator };
|
|
504
588
|
}
|
|
505
589
|
else {
|
|
506
590
|
return undefined;
|
|
@@ -546,6 +630,15 @@ export default class SiteGenerator {
|
|
|
546
630
|
});
|
|
547
631
|
}
|
|
548
632
|
}
|
|
633
|
+
/**
|
|
634
|
+
* Capure additional metadata collected during the processing of a route or additional module
|
|
635
|
+
*/
|
|
636
|
+
async captureAdditionalRouteMetadata(siteConfig) {
|
|
637
|
+
// If there is a view config add any extra collected import metadata to the config
|
|
638
|
+
this.addAdditionalImportMetadataToViewConfig(siteConfig);
|
|
639
|
+
// Save site meta data
|
|
640
|
+
await siteConfig.siteMetadata?.persistSiteMetadata();
|
|
641
|
+
}
|
|
549
642
|
}
|
|
550
643
|
// Class used to track import metadata for a view
|
|
551
644
|
export class ViewImportMetadataImpl {
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { Endpoints, FeatureFlags, ImportMetadata } from '@lwrjs/types';
|
|
2
|
-
import { RenderedAssetReference } from '@lwrjs/types';
|
|
1
|
+
import type { Endpoints, FeatureFlags, ImportMetadata, RenderedAssetReference, SiteMetadata } from '@lwrjs/types';
|
|
3
2
|
export interface BaseResourceContextOpts {
|
|
4
3
|
resourceType: 'route' | 'asset' | 'js' | 'resource' | 'mapping';
|
|
5
4
|
}
|
|
@@ -43,5 +42,7 @@ export interface SiteConfig {
|
|
|
43
42
|
viewConfigPath?: string;
|
|
44
43
|
featureFlags?: FeatureFlags;
|
|
45
44
|
legacyDefaultMappingEndpoint?: string;
|
|
45
|
+
skipBaseDocumentGeneration?: boolean;
|
|
46
|
+
siteMetadata?: SiteMetadata;
|
|
46
47
|
}
|
|
47
48
|
//# sourceMappingURL=types.d.ts.map
|
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.21",
|
|
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",
|
|
@@ -23,6 +23,10 @@
|
|
|
23
23
|
"import": "./build/es/index.js",
|
|
24
24
|
"require": "./build/cjs/index.cjs"
|
|
25
25
|
},
|
|
26
|
+
"./middleware": {
|
|
27
|
+
"import": "./build/es/middleware.js",
|
|
28
|
+
"require": "./build/cjs/middleware.cjs"
|
|
29
|
+
},
|
|
26
30
|
"./package": "./package.cjs"
|
|
27
31
|
},
|
|
28
32
|
"files": [
|
|
@@ -32,40 +36,40 @@
|
|
|
32
36
|
"package.cjs"
|
|
33
37
|
],
|
|
34
38
|
"dependencies": {
|
|
35
|
-
"@
|
|
36
|
-
"@lwrjs/
|
|
37
|
-
"@lwrjs/asset-
|
|
38
|
-
"@lwrjs/
|
|
39
|
-
"@lwrjs/base-view-provider": "0.9.0-alpha.
|
|
40
|
-
"@lwrjs/base-view-transformer": "0.9.0-alpha.
|
|
41
|
-
"@lwrjs/client-modules": "0.9.0-alpha.
|
|
42
|
-
"@lwrjs/
|
|
43
|
-
"@lwrjs/
|
|
44
|
-
"@lwrjs/
|
|
45
|
-
"@lwrjs/
|
|
46
|
-
"@lwrjs/
|
|
47
|
-
"@lwrjs/
|
|
48
|
-
"@lwrjs/
|
|
49
|
-
"@lwrjs/
|
|
50
|
-
"@lwrjs/
|
|
51
|
-
"@lwrjs/module-
|
|
52
|
-
"@lwrjs/
|
|
53
|
-
"@lwrjs/
|
|
54
|
-
"@lwrjs/
|
|
55
|
-
"@lwrjs/
|
|
56
|
-
"@lwrjs/
|
|
57
|
-
"@lwrjs/
|
|
58
|
-
"@lwrjs/
|
|
59
|
-
"
|
|
60
|
-
"
|
|
39
|
+
"@locker/compiler": "0.18.9",
|
|
40
|
+
"@lwrjs/app-service": "0.9.0-alpha.21",
|
|
41
|
+
"@lwrjs/asset-registry": "0.9.0-alpha.21",
|
|
42
|
+
"@lwrjs/asset-transformer": "0.9.0-alpha.21",
|
|
43
|
+
"@lwrjs/base-view-provider": "0.9.0-alpha.21",
|
|
44
|
+
"@lwrjs/base-view-transformer": "0.9.0-alpha.21",
|
|
45
|
+
"@lwrjs/client-modules": "0.9.0-alpha.21",
|
|
46
|
+
"@lwrjs/config": "0.9.0-alpha.21",
|
|
47
|
+
"@lwrjs/diagnostics": "0.9.0-alpha.21",
|
|
48
|
+
"@lwrjs/fs-asset-provider": "0.9.0-alpha.21",
|
|
49
|
+
"@lwrjs/html-view-provider": "0.9.0-alpha.21",
|
|
50
|
+
"@lwrjs/loader": "0.9.0-alpha.21",
|
|
51
|
+
"@lwrjs/lwc-module-provider": "0.9.0-alpha.21",
|
|
52
|
+
"@lwrjs/markdown-view-provider": "0.9.0-alpha.21",
|
|
53
|
+
"@lwrjs/module-bundler": "0.9.0-alpha.21",
|
|
54
|
+
"@lwrjs/module-registry": "0.9.0-alpha.21",
|
|
55
|
+
"@lwrjs/npm-module-provider": "0.9.0-alpha.21",
|
|
56
|
+
"@lwrjs/nunjucks-view-provider": "0.9.0-alpha.21",
|
|
57
|
+
"@lwrjs/o11y": "0.9.0-alpha.21",
|
|
58
|
+
"@lwrjs/resource-registry": "0.9.0-alpha.21",
|
|
59
|
+
"@lwrjs/router": "0.9.0-alpha.21",
|
|
60
|
+
"@lwrjs/server": "0.9.0-alpha.21",
|
|
61
|
+
"@lwrjs/shared-utils": "0.9.0-alpha.21",
|
|
62
|
+
"@lwrjs/view-registry": "0.9.0-alpha.21",
|
|
63
|
+
"chokidar": "^3.5.3",
|
|
64
|
+
"esbuild": "^0.9.7",
|
|
61
65
|
"fs-extra": "^10.1.0",
|
|
62
|
-
"ms": "^2.1.3",
|
|
63
66
|
"path-to-regexp": "^6.2.0",
|
|
64
67
|
"qs": "^6.9.4",
|
|
68
|
+
"rollup": "~2.45.2",
|
|
65
69
|
"ws": "^8.8.1"
|
|
66
70
|
},
|
|
67
71
|
"devDependencies": {
|
|
68
|
-
"@lwrjs/types": "0.9.0-alpha.
|
|
72
|
+
"@lwrjs/types": "0.9.0-alpha.21",
|
|
69
73
|
"@types/ws": "^8.5.3"
|
|
70
74
|
},
|
|
71
75
|
"peerDependencies": {
|
|
@@ -74,5 +78,5 @@
|
|
|
74
78
|
"engines": {
|
|
75
79
|
"node": ">=14.15.4 <19"
|
|
76
80
|
},
|
|
77
|
-
"gitHead": "
|
|
81
|
+
"gitHead": "a89adcac80601f657becd6fd734c765e6b2a2745"
|
|
78
82
|
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
var __create = Object.create;
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
7
|
-
var __markAsModule = (target) => __defProp(target, "__esModule", {value: true});
|
|
8
|
-
var __export = (target, all) => {
|
|
9
|
-
for (var name in all)
|
|
10
|
-
__defProp(target, name, {get: all[name], enumerable: true});
|
|
11
|
-
};
|
|
12
|
-
var __exportStar = (target, module2, desc) => {
|
|
13
|
-
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
|
14
|
-
for (let key of __getOwnPropNames(module2))
|
|
15
|
-
if (!__hasOwnProp.call(target, key) && key !== "default")
|
|
16
|
-
__defProp(target, key, {get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable});
|
|
17
|
-
}
|
|
18
|
-
return target;
|
|
19
|
-
};
|
|
20
|
-
var __toModule = (module2) => {
|
|
21
|
-
return __exportStar(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2);
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
// packages/@lwrjs/core/src/context/global-data.ts
|
|
25
|
-
__markAsModule(exports);
|
|
26
|
-
__export(exports, {
|
|
27
|
-
getGlobalData: () => getGlobalData
|
|
28
|
-
});
|
|
29
|
-
var import_fs = __toModule(require("fs"));
|
|
30
|
-
var import_path = __toModule(require("path"));
|
|
31
|
-
function recursiveJsonCollector(resources, currentPath, collector) {
|
|
32
|
-
for (const resource of resources) {
|
|
33
|
-
const resourcePath = import_path.default.join(currentPath, resource);
|
|
34
|
-
if (resource.endsWith(".json")) {
|
|
35
|
-
const resourceName = import_path.default.basename(resource, ".json");
|
|
36
|
-
const jsonSource = JSON.parse(import_fs.default.readFileSync(resourcePath, "utf-8"));
|
|
37
|
-
collector[resourceName] = jsonSource;
|
|
38
|
-
} else if (import_fs.default.statSync(resourcePath).isDirectory()) {
|
|
39
|
-
const dirContentList = import_fs.default.readdirSync(resourcePath);
|
|
40
|
-
collector[resource] = recursiveJsonCollector(dirContentList, resourcePath, {});
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return collector;
|
|
44
|
-
}
|
|
45
|
-
function getGlobalData(globalDataDir, defaultData = {}) {
|
|
46
|
-
if (!import_fs.default.existsSync(globalDataDir) || !import_fs.default.statSync(globalDataDir).isDirectory()) {
|
|
47
|
-
return defaultData;
|
|
48
|
-
}
|
|
49
|
-
const dirContentList = import_fs.default.readdirSync(globalDataDir);
|
|
50
|
-
return {
|
|
51
|
-
...recursiveJsonCollector(dirContentList, globalDataDir, {}),
|
|
52
|
-
...defaultData
|
|
53
|
-
};
|
|
54
|
-
}
|