@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.
Files changed (77) hide show
  1. package/build/cjs/context/provider.cjs +84 -0
  2. package/build/cjs/context/server.cjs +75 -0
  3. package/build/cjs/index.cjs +69 -153
  4. package/build/cjs/middleware/asset-middleware.cjs +56 -0
  5. package/build/cjs/middleware/bundle-middleware.cjs +113 -0
  6. package/build/cjs/{middlewares → middleware}/hmr-middleware.cjs +4 -4
  7. package/build/cjs/{middlewares → middleware}/locale-middleware.cjs +2 -2
  8. package/build/cjs/middleware/mapping-middleware.cjs +61 -0
  9. package/build/cjs/middleware/module-middleware.cjs +88 -0
  10. package/build/cjs/middleware/redirects/unsigned-module-redirect.cjs +37 -0
  11. package/build/cjs/middleware/resource-middleware.cjs +64 -0
  12. package/build/cjs/{context/services.cjs → middleware/utils/error-handling.cjs} +28 -15
  13. package/build/cjs/middleware/utils/identity.cjs +93 -0
  14. package/build/cjs/{context/hooks.cjs → middleware/utils/metadata.cjs} +17 -26
  15. package/build/cjs/{middlewares/utils.cjs → middleware/utils/request.cjs} +17 -16
  16. package/build/cjs/middleware/view-middleware.cjs +151 -0
  17. package/build/cjs/middleware.cjs +43 -0
  18. package/build/cjs/tools/server-warmup.cjs +2 -9
  19. package/build/cjs/tools/static-generation.cjs +127 -49
  20. package/build/es/context/provider.d.ts +3 -0
  21. package/build/es/context/provider.js +39 -0
  22. package/build/es/context/server.d.ts +3 -0
  23. package/build/es/context/server.js +49 -0
  24. package/build/es/index.d.ts +4 -2
  25. package/build/es/index.js +89 -150
  26. package/build/es/middleware/asset-middleware.d.ts +3 -0
  27. package/build/es/middleware/asset-middleware.js +26 -0
  28. package/build/es/middleware/bundle-middleware.d.ts +3 -0
  29. package/build/es/middleware/bundle-middleware.js +88 -0
  30. package/build/es/middleware/hmr-middleware.d.ts +5 -0
  31. package/build/es/{middlewares → middleware}/hmr-middleware.js +2 -2
  32. package/build/es/middleware/locale-middleware.d.ts +3 -0
  33. package/build/es/{middlewares → middleware}/locale-middleware.js +2 -1
  34. package/build/es/middleware/mapping-middleware.d.ts +3 -0
  35. package/build/es/middleware/mapping-middleware.js +34 -0
  36. package/build/es/middleware/module-middleware.d.ts +3 -0
  37. package/build/es/middleware/module-middleware.js +64 -0
  38. package/build/es/middleware/redirects/unsigned-module-redirect.d.ts +6 -0
  39. package/build/es/middleware/redirects/unsigned-module-redirect.js +25 -0
  40. package/build/es/middleware/resource-middleware.d.ts +3 -0
  41. package/build/es/middleware/resource-middleware.js +37 -0
  42. package/build/es/middleware/utils/error-handling.d.ts +3 -0
  43. package/build/es/middleware/utils/error-handling.js +32 -0
  44. package/build/es/middleware/utils/identity.d.ts +6 -0
  45. package/build/es/middleware/utils/identity.js +64 -0
  46. package/build/es/middleware/utils/metadata.d.ts +3 -0
  47. package/build/es/middleware/utils/metadata.js +24 -0
  48. package/build/es/middleware/utils/request.d.ts +15 -0
  49. package/build/es/{middlewares/utils.js → middleware/utils/request.js} +15 -23
  50. package/build/es/middleware/view-middleware.d.ts +3 -0
  51. package/build/es/middleware/view-middleware.js +136 -0
  52. package/build/es/middleware.d.ts +9 -0
  53. package/build/es/middleware.js +13 -0
  54. package/build/es/tools/server-warmup.js +3 -10
  55. package/build/es/tools/static-generation.d.ts +8 -1
  56. package/build/es/tools/static-generation.js +155 -62
  57. package/build/es/tools/types.d.ts +3 -2
  58. package/package.json +36 -32
  59. package/build/cjs/context/global-data.cjs +0 -54
  60. package/build/cjs/middlewares/api-middleware.cjs +0 -359
  61. package/build/cjs/middlewares/base-middleware.cjs +0 -15
  62. package/build/cjs/middlewares/ui-middleware.cjs +0 -183
  63. package/build/es/context/global-data.d.ts +0 -3
  64. package/build/es/context/global-data.js +0 -29
  65. package/build/es/context/hooks.d.ts +0 -9
  66. package/build/es/context/hooks.js +0 -36
  67. package/build/es/context/services.d.ts +0 -8
  68. package/build/es/context/services.js +0 -17
  69. package/build/es/middlewares/api-middleware.d.ts +0 -3
  70. package/build/es/middlewares/api-middleware.js +0 -410
  71. package/build/es/middlewares/base-middleware.d.ts +0 -3
  72. package/build/es/middlewares/base-middleware.js +0 -4
  73. package/build/es/middlewares/hmr-middleware.d.ts +0 -5
  74. package/build/es/middlewares/locale-middleware.d.ts +0 -3
  75. package/build/es/middlewares/ui-middleware.d.ts +0 -3
  76. package/build/es/middlewares/ui-middleware.js +0 -186
  77. 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 { explodeMode } from '@lwrjs/config';
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] starting');
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
- logger.info(`Clear Output Location: ${outputDir}`);
30
- fs.rmSync(outputDir, { recursive: true, force: true });
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 { apiVersion, basePath, lwrVersion, serverMode } = config;
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] complete in ${Math.round(timeDiff)} seconds`);
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
- const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap, runtimeEnvironment);
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.info(`Start Generate: ${locale} ${uri}`);
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
- // If there is a view config add any extra collected import metadata to the config
96
- this.addAdditionalImportMetadataToViewConfig(siteConfig);
97
- logger.info(`End Generate ${locale} ${uri}`);
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
- let fileName = 'index.html';
261
- let directoryPath = url;
262
- // If we have a route path that ends with a html or xml file extension,
263
- // use that last path segment for the file name
264
- if (url.endsWith('.html') || url.endsWith('.xml')) {
265
- const lastPathIndex = url.lastIndexOf('/') + 1;
266
- fileName = url.substring(lastPathIndex, url.length);
267
- directoryPath = url.substring(0, lastPathIndex);
268
- }
269
- const dir = createResourceDir(directoryPath, outputDir);
270
- const localeDir = createResourceDir(directoryPath, join(outputDir, siteConfig.locale));
271
- // TODO: Should we handle routes with non-html extensions differently?
272
- // Example Route: "path": "/mixed_templates.md" (not sure why you would do this)
273
- // "contentTemplate": "$contentDir/composed_markdown.md"
274
- // Today this will get written to /mixed_templates.md/index.html
275
- // Which we workaround by setting "renderSingle": true in serve.json
276
- const filePath = join(dir, fileName);
277
- const fileLocalePath = join(localeDir, fileName);
278
- // Default Path (only write once)
279
- // The default locale is english
280
- if (siteConfig.locale.toLowerCase().startsWith('en')) {
281
- siteConfig.viewPaths.add(filePath);
282
- await writeResponse(context, filePath);
283
- }
284
- // Language path (always write out)
285
- createDir(localeDir);
286
- siteConfig.viewPaths.add(fileLocalePath);
287
- await writeResponse(context, fileLocalePath);
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
- if (getFeatureFlags().LEGACY_LOADER) {
503
- return { featureFlags: { LEGACY_LOADER: true } };
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.2",
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
- "@lwrjs/app-service": "0.9.0-alpha.2",
36
- "@lwrjs/asset-registry": "0.9.0-alpha.2",
37
- "@lwrjs/asset-transformer": "0.9.0-alpha.2",
38
- "@lwrjs/base-template-engine": "0.9.0-alpha.2",
39
- "@lwrjs/base-view-provider": "0.9.0-alpha.2",
40
- "@lwrjs/base-view-transformer": "0.9.0-alpha.2",
41
- "@lwrjs/client-modules": "0.9.0-alpha.2",
42
- "@lwrjs/compiler": "0.9.0-alpha.2",
43
- "@lwrjs/config": "0.9.0-alpha.2",
44
- "@lwrjs/diagnostics": "0.9.0-alpha.2",
45
- "@lwrjs/fs-asset-provider": "0.9.0-alpha.2",
46
- "@lwrjs/html-view-provider": "0.9.0-alpha.2",
47
- "@lwrjs/loader": "0.9.0-alpha.2",
48
- "@lwrjs/lwc-module-provider": "0.9.0-alpha.2",
49
- "@lwrjs/lwc-ssr": "0.9.0-alpha.2",
50
- "@lwrjs/markdown-view-provider": "0.9.0-alpha.2",
51
- "@lwrjs/module-bundler": "0.9.0-alpha.2",
52
- "@lwrjs/module-registry": "0.9.0-alpha.2",
53
- "@lwrjs/npm-module-provider": "0.9.0-alpha.2",
54
- "@lwrjs/nunjucks-view-provider": "0.9.0-alpha.2",
55
- "@lwrjs/o11y": "0.9.0-alpha.2",
56
- "@lwrjs/resource-registry": "0.9.0-alpha.2",
57
- "@lwrjs/router": "0.9.0-alpha.2",
58
- "@lwrjs/server": "0.9.0-alpha.2",
59
- "@lwrjs/shared-utils": "0.9.0-alpha.2",
60
- "@lwrjs/view-registry": "0.9.0-alpha.2",
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.2",
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": "bcf63de23d1a2a53fb0e961dba4396e8753710dd"
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
- }