@lwrjs/core 0.9.0-alpha.9 → 0.9.0

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 (79) hide show
  1. package/build/cjs/context/provider.cjs +9 -5
  2. package/build/cjs/context/server.cjs +6 -6
  3. package/build/cjs/index.cjs +66 -41
  4. package/build/cjs/middleware/asset-middleware.cjs +70 -0
  5. package/build/cjs/middleware/bundle-middleware.cjs +113 -0
  6. package/build/cjs/{middlewares → middleware}/hmr-middleware.cjs +6 -6
  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/global-data.cjs → middleware/utils/error-handling.cjs} +26 -24
  13. package/build/cjs/middleware/utils/identity.cjs +92 -0
  14. package/build/cjs/{context/services.cjs → middleware/utils/metadata.cjs} +19 -20
  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 +16 -9
  18. package/build/cjs/tools/server-warmup.cjs +2 -9
  19. package/build/cjs/tools/static-generation.cjs +190 -62
  20. package/build/es/context/provider.js +5 -3
  21. package/build/es/context/server.d.ts +1 -1
  22. package/build/es/context/server.js +6 -5
  23. package/build/es/index.d.ts +3 -2
  24. package/build/es/index.js +85 -49
  25. package/build/es/middleware/asset-middleware.d.ts +3 -0
  26. package/build/es/middleware/asset-middleware.js +42 -0
  27. package/build/es/middleware/bundle-middleware.d.ts +3 -0
  28. package/build/es/middleware/bundle-middleware.js +88 -0
  29. package/build/es/middleware/hmr-middleware.d.ts +5 -0
  30. package/build/es/{middlewares → middleware}/hmr-middleware.js +4 -4
  31. package/build/es/middleware/locale-middleware.d.ts +3 -0
  32. package/build/es/{middlewares → middleware}/locale-middleware.js +2 -1
  33. package/build/es/middleware/mapping-middleware.d.ts +3 -0
  34. package/build/es/middleware/mapping-middleware.js +34 -0
  35. package/build/es/middleware/module-middleware.d.ts +3 -0
  36. package/build/es/middleware/module-middleware.js +64 -0
  37. package/build/es/middleware/redirects/unsigned-module-redirect.d.ts +6 -0
  38. package/build/es/middleware/redirects/unsigned-module-redirect.js +25 -0
  39. package/build/es/middleware/resource-middleware.d.ts +3 -0
  40. package/build/es/middleware/resource-middleware.js +37 -0
  41. package/build/es/middleware/utils/error-handling.d.ts +3 -0
  42. package/build/es/middleware/utils/error-handling.js +32 -0
  43. package/build/es/middleware/utils/identity.d.ts +6 -0
  44. package/build/es/middleware/utils/identity.js +62 -0
  45. package/build/es/middleware/utils/metadata.d.ts +3 -0
  46. package/build/es/middleware/utils/metadata.js +24 -0
  47. package/build/es/middleware/utils/request.d.ts +15 -0
  48. package/build/es/{middlewares/utils.js → middleware/utils/request.js} +15 -23
  49. package/build/es/middleware/view-middleware.d.ts +3 -0
  50. package/build/es/middleware/view-middleware.js +136 -0
  51. package/build/es/middleware.d.ts +8 -14
  52. package/build/es/middleware.js +12 -20
  53. package/build/es/tools/server-warmup.js +3 -10
  54. package/build/es/tools/static-generation.d.ts +11 -1
  55. package/build/es/tools/static-generation.js +230 -79
  56. package/build/es/tools/types.d.ts +3 -2
  57. package/package.json +33 -34
  58. package/build/cjs/context/configurations.cjs +0 -82
  59. package/build/cjs/middlewares/api-middleware.cjs +0 -359
  60. package/build/cjs/middlewares/base-middleware.cjs +0 -15
  61. package/build/cjs/middlewares/ui-middleware.cjs +0 -183
  62. package/build/cjs/tools/server-build.cjs +0 -182
  63. package/build/es/context/configurations.d.ts +0 -9
  64. package/build/es/context/configurations.js +0 -53
  65. package/build/es/context/global-data.d.ts +0 -3
  66. package/build/es/context/global-data.js +0 -29
  67. package/build/es/context/services.d.ts +0 -3
  68. package/build/es/context/services.js +0 -27
  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
  78. package/build/es/tools/server-build.d.ts +0 -14
  79. package/build/es/tools/server-build.js +0 -182
@@ -37,55 +37,60 @@ var import_config = __toModule(require("@lwrjs/config"));
37
37
  var SiteGenerator = class {
38
38
  async buildStaticApplication(config, dispatcher) {
39
39
  const startTime = import_perf_hooks.performance.now();
40
- import_shared_utils.logger.info("[Static Generation] starting");
40
+ import_shared_utils.logger.info("[SSG] Static Site Generation");
41
41
  if (!import_shared_utils.logger.currentLevel || import_shared_utils.logger.currentLevel == import_shared_utils.WARN || import_shared_utils.logger.currentLevel == import_shared_utils.INFO) {
42
42
  import_shared_utils.logger.setOptions({dedupe: new Set([import_shared_utils.WARN])});
43
43
  }
44
44
  const {routes, staticSiteGenerator, rootDir, assets} = config;
45
45
  if (!staticSiteGenerator.outputDir) {
46
- staticSiteGenerator.outputDir = "__generated_site__";
46
+ staticSiteGenerator.outputDir = "site";
47
47
  }
48
48
  const outputDir = (0, import_path.join)(rootDir, staticSiteGenerator.outputDir);
49
- import_shared_utils.logger.info(`Clear Output Location: ${outputDir}`);
50
- import_fs_extra.default.rmSync(outputDir, {recursive: true, force: true});
49
+ if (!staticSiteGenerator.skipCleanOutputDir) {
50
+ import_shared_utils.logger.info(`[SSG] Clearing output directory: ${outputDir}`);
51
+ import_fs_extra.default.rmSync(outputDir, {recursive: true, force: true});
52
+ } else if (import_fs_extra.default.existsSync(outputDir)) {
53
+ import_shared_utils.logger.info(`[SSG] Reusing existing output directory: ${outputDir}`);
54
+ }
51
55
  const urlRewriteMap = new Map();
52
- const {apiVersion, basePath, lwrVersion, serverMode} = config;
53
- const runtimeEnvironment = {
54
- ...(0, import_config.explodeMode)(serverMode),
55
- apiVersion,
56
- basePath,
57
- lwrVersion,
58
- debug: false,
59
- serverMode
60
- };
56
+ const {basePath} = config;
57
+ const runtimeEnvironment = (0, import_config.getRuntimeEnvironment)(config);
58
+ import_shared_utils.logger.info(`[SSG] Building routes (this may take some time to complete)`);
61
59
  await this.generateRoutes(runtimeEnvironment, staticSiteGenerator, routes, basePath, dispatcher, outputDir, urlRewriteMap);
62
60
  this.writeNetlifyRedirectConfig(outputDir, urlRewriteMap);
63
- this.copyAssets(assets, outputDir, basePath);
61
+ await this.copyAssets(assets, outputDir, config);
64
62
  const endTime = import_perf_hooks.performance.now();
65
63
  const timeDiff = (endTime - startTime) / 1e3;
66
- import_shared_utils.logger.info(`[Static Generation] complete in ${Math.round(timeDiff)} seconds`);
64
+ import_shared_utils.logger.info(`[SSG] Static Site Generation complete in ${Math.round(timeDiff)} seconds`);
67
65
  }
68
66
  async generateRoutes(runtimeEnvironment, staticSiteGenerator, routes, basePath, dispatcher, outputDir, urlRewriteMap = new Map()) {
69
67
  if (!staticSiteGenerator.locales) {
70
68
  staticSiteGenerator.locales = ["en-US"];
71
69
  }
72
70
  const generateUrl = this.createGenerateURLFunction(dispatcher);
71
+ const {skipBaseDocumentGeneration = false} = staticSiteGenerator;
73
72
  for (const locale of staticSiteGenerator.locales) {
74
73
  for (const route of routes) {
75
- const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap, runtimeEnvironment);
74
+ const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap, skipBaseDocumentGeneration, runtimeEnvironment);
76
75
  await generateUrl(basePath + route.path, siteConfig);
77
76
  }
78
77
  if (staticSiteGenerator._additionalRoutePaths) {
79
78
  for (const uri of staticSiteGenerator._additionalRoutePaths) {
80
- const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap, runtimeEnvironment);
79
+ const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap, skipBaseDocumentGeneration, runtimeEnvironment);
81
80
  await generateUrl(uri, siteConfig);
82
81
  }
83
82
  }
84
83
  const {_additionalModules} = staticSiteGenerator;
85
84
  if (_additionalModules) {
86
85
  for (const specifier of _additionalModules) {
87
- const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap, runtimeEnvironment);
86
+ import_shared_utils.logger.debug(`[SSG] Additional Module: ${locale} ${specifier}`);
87
+ const startTime = import_perf_hooks.performance.now();
88
+ const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap, skipBaseDocumentGeneration, runtimeEnvironment);
88
89
  await this.dispatchJSResourceRecursive(specifier, dispatcher, siteConfig, true);
90
+ await this.captureAdditionalRouteMetadata(siteConfig);
91
+ const endTime = import_perf_hooks.performance.now();
92
+ const timeDiff = endTime - startTime;
93
+ import_shared_utils.logger.info(`[SSG] Additional Module ${locale} ${specifier} in ${Math.round(timeDiff)} ms`);
89
94
  }
90
95
  }
91
96
  }
@@ -93,10 +98,13 @@ var SiteGenerator = class {
93
98
  createGenerateURLFunction(dispatcher) {
94
99
  const generateRoute = async (uri, siteConfig) => {
95
100
  const locale = siteConfig.locale;
96
- import_shared_utils.logger.info(`Start Generate: ${locale} ${uri}`);
101
+ import_shared_utils.logger.debug(`[SSG] Start Generate: ${locale} ${uri}`);
102
+ const startTime = import_perf_hooks.performance.now();
97
103
  await this.dispatchResourceRecursive(uri, dispatcher, {resourceType: "route"}, siteConfig);
98
- this.addAdditionalImportMetadataToViewConfig(siteConfig);
99
- import_shared_utils.logger.info(`End Generate ${locale} ${uri}`);
104
+ await this.captureAdditionalRouteMetadata(siteConfig);
105
+ const endTime = import_perf_hooks.performance.now();
106
+ const timeDiff = endTime - startTime;
107
+ import_shared_utils.logger.info(`[SSG] ${locale} ${uri} in ${Math.round(timeDiff)} ms`);
100
108
  };
101
109
  return generateRoute.bind(this);
102
110
  }
@@ -104,8 +112,12 @@ var SiteGenerator = class {
104
112
  const {visitedUrls} = siteConfig;
105
113
  if (!visitedUrls.has(url)) {
106
114
  visitedUrls.add(url);
115
+ if ((0, import_shared_utils.isExternalUrl)(url)) {
116
+ import_shared_utils.logger.warn("[SSG] Skipped generation of external url: " + url);
117
+ return;
118
+ }
107
119
  if (url.indexOf("/:") !== -1 || url.indexOf("*") !== -1) {
108
- import_shared_utils.logger.warn("Skipped generation of url with variable path segment: " + url);
120
+ import_shared_utils.logger.warn("[SSG] Skipped generation of url with variable path segment: " + url);
109
121
  return;
110
122
  }
111
123
  let context;
@@ -154,6 +166,9 @@ var SiteGenerator = class {
154
166
  const jsUri = importModule.specifier.startsWith("/") ? importModule.specifier : (0, import_shared_utils.getSpecifier)(importModule);
155
167
  dispatchRequests.push(this.dispatchJSResourceRecursive(jsUri, dispatcher, siteConfig));
156
168
  }
169
+ if (moduleDefinition.bundleRecord) {
170
+ this.addBundleToSiteMetadata(moduleDefinition, url, siteConfig);
171
+ }
157
172
  }
158
173
  const uris = context.fs?.metadata?.resolvedUris || [];
159
174
  for (const jsUri of uris) {
@@ -161,16 +176,64 @@ var SiteGenerator = class {
161
176
  }
162
177
  await Promise.all(dispatchRequests);
163
178
  }
179
+ addBundleToSiteMetadata(bundleDefinition, url, siteConfig) {
180
+ if (siteConfig.siteMetadata) {
181
+ const specifier = bundleDefinition.specifier;
182
+ const imports = bundleDefinition.bundleRecord.imports?.map((moduleRef) => (0, import_shared_utils.getSpecifier)(moduleRef)) || [];
183
+ const bundleMetadata = {
184
+ version: bundleDefinition.version,
185
+ path: decodeURIComponent(url),
186
+ includedModules: bundleDefinition.bundleRecord.includedModules || [],
187
+ imports
188
+ };
189
+ const siteBundles = siteConfig.siteMetadata.getSiteBundles().bundles;
190
+ siteBundles[specifier] = bundleMetadata;
191
+ }
192
+ }
193
+ addResourceToSiteMetadata(resourceDefinition, url, siteConfig) {
194
+ if (siteConfig.siteMetadata) {
195
+ if (!resourceDefinition.specifier) {
196
+ import_shared_utils.logger.warn("[SSG] Could not save resource metadata. There was no specifier.", resourceDefinition);
197
+ } else {
198
+ const specifier = resourceDefinition.specifier;
199
+ const resourceMetadata = {
200
+ path: decodeURIComponent(url),
201
+ mimeType: resourceDefinition.type
202
+ };
203
+ const siteResources = siteConfig.siteMetadata.getSiteResources();
204
+ siteResources.resources[specifier] = resourceMetadata;
205
+ }
206
+ }
207
+ }
208
+ addAssetToSiteMetadata(assetDefinition, url, siteConfig) {
209
+ if (siteConfig.siteMetadata) {
210
+ if (!assetDefinition.uri) {
211
+ import_shared_utils.logger.warn("[SSG] Could not save asset metadata. There was no uri.", assetDefinition);
212
+ } else {
213
+ const specifier = assetDefinition.uri;
214
+ const resourceMetadata = {
215
+ path: decodeURIComponent(url),
216
+ mimeType: String(assetDefinition.mime)
217
+ };
218
+ const siteAssets = siteConfig.siteMetadata.getSiteAssets();
219
+ if (!siteAssets.assets[specifier]) {
220
+ siteAssets.assets[specifier] = resourceMetadata;
221
+ } else {
222
+ import_shared_utils.logger.debug(`[SSG] Ignore asset redefinition ${specifier}`);
223
+ }
224
+ }
225
+ }
226
+ }
164
227
  async handleMappingResource(url, context, siteConfig, dispatcher) {
165
- const {importMetadata: importMetatdata} = siteConfig;
228
+ const {importMetadata} = siteConfig;
166
229
  const statusCode = context.response?.status;
167
230
  if (statusCode === 200) {
168
231
  const newImportMetadata = context.fs?.body;
169
232
  let filteredImportMetadata;
170
- if (!importMetatdata) {
233
+ if (!importMetadata) {
171
234
  filteredImportMetadata = newImportMetadata;
172
235
  } else {
173
- filteredImportMetadata = importMetatdata.addAdditionalMetadata(newImportMetadata);
236
+ filteredImportMetadata = importMetadata.addAdditionalMetadata(newImportMetadata);
174
237
  }
175
238
  const dispatchRequests = [];
176
239
  for (const uri of Object.keys(filteredImportMetadata.imports)) {
@@ -179,29 +242,31 @@ var SiteGenerator = class {
179
242
  await Promise.all(dispatchRequests);
180
243
  } else {
181
244
  const body = context.fs?.body;
182
- import_shared_utils.logger.warn(`Failed to fetch ${url}: (${statusCode}) ${body}`);
245
+ import_shared_utils.logger.warn(`[SSG] Failed to fetch ${url}: (${statusCode}) ${body}`);
183
246
  }
184
247
  }
185
248
  async handleHtmlResource(url, context, siteConfig, dispatcher) {
186
- const {outputDir} = siteConfig;
187
- let fileName = "index.html";
188
- let directoryPath = url;
189
- if (url.endsWith(".html") || url.endsWith(".xml")) {
190
- const lastPathIndex = url.lastIndexOf("/") + 1;
191
- fileName = url.substring(lastPathIndex, url.length);
192
- directoryPath = url.substring(0, lastPathIndex);
193
- }
194
- const dir = (0, import_dir.createResourceDir)(directoryPath, outputDir);
195
- const localeDir = (0, import_dir.createResourceDir)(directoryPath, (0, import_path.join)(outputDir, siteConfig.locale));
196
- const filePath = (0, import_path.join)(dir, fileName);
197
- const fileLocalePath = (0, import_path.join)(localeDir, fileName);
198
- if (siteConfig.locale.toLowerCase().startsWith("en")) {
199
- siteConfig.viewPaths.add(filePath);
200
- await (0, import_stream.writeResponse)(context, filePath);
249
+ const {outputDir, skipBaseDocumentGeneration} = siteConfig;
250
+ if (!skipBaseDocumentGeneration) {
251
+ let fileName = "index.html";
252
+ let directoryPath = url;
253
+ if (url.endsWith(".html") || url.endsWith(".xml")) {
254
+ const lastPathIndex = url.lastIndexOf("/") + 1;
255
+ fileName = url.substring(lastPathIndex, url.length);
256
+ directoryPath = url.substring(0, lastPathIndex);
257
+ }
258
+ const dir = (0, import_dir.createResourceDir)(directoryPath, outputDir);
259
+ const localeDir = (0, import_dir.createResourceDir)(directoryPath, (0, import_path.join)(outputDir, siteConfig.locale));
260
+ const filePath = (0, import_path.join)(dir, fileName);
261
+ const fileLocalePath = (0, import_path.join)(localeDir, fileName);
262
+ if (siteConfig.locale.toLowerCase().startsWith("en")) {
263
+ siteConfig.viewPaths.add(filePath);
264
+ await (0, import_stream.writeResponse)(context, filePath);
265
+ }
266
+ (0, import_dir.createDir)(localeDir);
267
+ siteConfig.viewPaths.add(fileLocalePath);
268
+ await (0, import_stream.writeResponse)(context, fileLocalePath);
201
269
  }
202
- (0, import_dir.createDir)(localeDir);
203
- siteConfig.viewPaths.add(fileLocalePath);
204
- await (0, import_stream.writeResponse)(context, fileLocalePath);
205
270
  const viewDefinition = context.fs?.metadata?.viewDefinition;
206
271
  if (viewDefinition) {
207
272
  await this.handleViewDefinition(viewDefinition, siteConfig, dispatcher);
@@ -243,7 +308,7 @@ var SiteGenerator = class {
243
308
  siteConfig.viewConfigPath = this.getResourcePathFromUrl(siteConfig, resourceUri);
244
309
  }
245
310
  } else {
246
- import_shared_utils.logger.warn("Skipped inline bootstrap resource: %j", resource);
311
+ import_shared_utils.logger.warn("[SSG] Skipped inline bootstrap resource: %j", resource);
247
312
  }
248
313
  }
249
314
  }
@@ -253,7 +318,7 @@ var SiteGenerator = class {
253
318
  if (resourceUri.startsWith("/")) {
254
319
  dispatchRequests.push(this.dispatchResourceRecursive(resourceUri, dispatcher, {resourceType: "resource"}, siteConfig));
255
320
  } else {
256
- import_shared_utils.logger.warn("Skipped resource: %j", resource);
321
+ import_shared_utils.logger.warn("[SSG] Skipped resource: %j", resource);
257
322
  }
258
323
  }
259
324
  await Promise.all(dispatchRequests);
@@ -269,7 +334,7 @@ var SiteGenerator = class {
269
334
  const mappingURL = siteConfig.endpoints?.uris?.mapping + encodeURIComponent(jsUri);
270
335
  await this.dispatchResourceRecursive(mappingURL, dispatcher, {resourceType: "mapping"}, siteConfig);
271
336
  } else {
272
- import_shared_utils.logger.warn('Unable to fetch mapping for bare specifier or variable dynamic import: "' + jsUri + '"');
337
+ import_shared_utils.logger.warn('[SSG] Unable to fetch mapping for bare specifier or variable dynamic import: "' + jsUri + '"');
273
338
  }
274
339
  } else if (isAdditionalModulesRequest) {
275
340
  const uri = `${siteConfig.endpoints?.uris.legacyDefault}${encodeURIComponent(jsUri)}`;
@@ -281,12 +346,17 @@ var SiteGenerator = class {
281
346
  const metadata = context.fs?.metadata;
282
347
  const fullPath = this.getResourcePathFromUrl(siteConfig, url);
283
348
  await (0, import_stream.writeResponse)(context, fullPath);
349
+ if (metadata?.resource) {
350
+ this.addResourceToSiteMetadata(metadata?.resource, url, siteConfig);
351
+ } else if (metadata?.asset) {
352
+ this.addAssetToSiteMetadata(metadata?.asset, url, siteConfig);
353
+ }
284
354
  const assetReferences = metadata?.asset?.metadata?.assetReferences || [];
285
355
  const dispatchRequests = [];
286
356
  for (const ref of assetReferences) {
287
357
  const refUrl = ref.override?.uri || ref.url;
288
358
  dispatchRequests.push(this.dispatchResourceRecursive(refUrl, dispatcher, {resourceType: "asset", asset: metadata?.asset}, siteConfig).catch((err) => {
289
- import_shared_utils.logger.warn(`Failed to fetch asset reference => ${refUrl} from ${url}`, err);
359
+ import_shared_utils.logger.warn(`[SSG] Failed to fetch asset reference => ${refUrl} from ${url}`, err);
290
360
  }));
291
361
  }
292
362
  return Promise.all(dispatchRequests);
@@ -315,22 +385,67 @@ var SiteGenerator = class {
315
385
  });
316
386
  import_fs_extra.default.writeFileSync(serveJsonPath, JSON.stringify({rewrites, directoryListing: false, renderSingle: true}, null, 1));
317
387
  }
318
- copyAssets(assets, outputDir, basePath) {
388
+ async copyAssets(assets, outputDir, config) {
389
+ const {basePath} = config;
390
+ const runtimeEnvironment = (0, import_config.getRuntimeEnvironment)(config);
391
+ const siteConfig = this.createSiteConfig(outputDir, "en-US", new Map(), true, runtimeEnvironment);
319
392
  for (const asset of assets) {
320
393
  try {
321
- const assetSrcDir = asset.dir || asset.file;
322
- const assetOutputDir = (0, import_path.join)(outputDir, basePath ? basePath + asset.urlPath : asset.urlPath);
394
+ const assetSrcFile = asset.file;
395
+ const assetSrcDir = asset.dir;
396
+ const assetsPath = (0, import_path.join)(outputDir, basePath ? basePath + asset.urlPath : asset.urlPath);
323
397
  if (assetSrcDir && import_fs_extra.default.existsSync(assetSrcDir)) {
324
- import_fs_extra.default.copySync(assetSrcDir, assetOutputDir);
398
+ import_fs_extra.default.copySync(assetSrcDir, assetsPath);
399
+ this.addAssetsToMetadata(assetsPath, siteConfig);
400
+ } else if (assetSrcFile && import_fs_extra.default.existsSync(assetSrcFile)) {
401
+ import_fs_extra.default.copySync(assetSrcFile, assetsPath);
402
+ this.addAssetToMetadata(assetsPath, siteConfig);
325
403
  } else {
326
- import_shared_utils.logger.warn("Could not find assets to copy at path: " + assetSrcDir);
404
+ import_shared_utils.logger.warn("[SSG] Could not find assets to copy at path: " + assetsPath);
327
405
  }
328
406
  } catch (e) {
329
- import_shared_utils.logger.error("Error occurred processing asset config: " + JSON.stringify(asset), e);
407
+ import_shared_utils.logger.error("[SSG] Error occurred processing asset config: " + JSON.stringify(asset), e);
408
+ }
409
+ }
410
+ await siteConfig.siteMetadata?.persistSiteMetadata();
411
+ }
412
+ addAssetsToMetadata(directoryPath, siteConfig) {
413
+ try {
414
+ const files = import_fs_extra.default.readdirSync(directoryPath);
415
+ for (const file of files) {
416
+ const filePath = (0, import_path.join)(directoryPath, file);
417
+ if (import_fs_extra.default.statSync(filePath).isDirectory()) {
418
+ this.addAssetsToMetadata(filePath, siteConfig);
419
+ } else {
420
+ this.addAssetToMetadata(filePath, siteConfig);
421
+ }
330
422
  }
423
+ } catch (err) {
424
+ import_shared_utils.logger.warn(`[SSG] Unexpected error collecting asset directory metadata for ${directoryPath}`, err);
425
+ }
426
+ }
427
+ addAssetToMetadata(filePath, siteConfig) {
428
+ try {
429
+ const uri = encodeURI((0, import_path.normalize)(filePath).replace(siteConfig.outputDir, ""));
430
+ this.addAssetToSiteMetadata({
431
+ uri,
432
+ type: "asset",
433
+ stream: function(encoding) {
434
+ throw new Error("Function not implemented.");
435
+ },
436
+ entry: filePath,
437
+ ext: (0, import_path.extname)(filePath),
438
+ mime: (0, import_shared_utils.mimeLookup)(filePath),
439
+ ownHash: "not-provided",
440
+ content: function(encoding) {
441
+ throw new Error("Function not implemented.");
442
+ }
443
+ }, uri, siteConfig);
444
+ } catch (err) {
445
+ import_shared_utils.logger.warn(`[SSG] Unexpected error collecting asset metadata for ${filePath}`, err);
331
446
  }
332
447
  }
333
- createSiteConfig(outputDir, locale, urlRewriteMap, runtimeEnvironment) {
448
+ createSiteConfig(outputDir, locale, urlRewriteMap, skipBaseDocumentGeneration, runtimeEnvironment) {
334
449
  const featureFlags = this.filterFeatureFlags();
335
450
  const endpoints = {
336
451
  uris: {
@@ -345,12 +460,21 @@ var SiteGenerator = class {
345
460
  locale,
346
461
  urlRewriteMap,
347
462
  endpoints,
348
- ...featureFlags
463
+ skipBaseDocumentGeneration,
464
+ ...featureFlags,
465
+ siteMetadata: new import_shared_utils.SiteMetadataImpl({rootDir: outputDir})
349
466
  };
350
467
  }
351
468
  filterFeatureFlags() {
352
- if ((0, import_shared_utils.getFeatureFlags)().LEGACY_LOADER) {
353
- return {featureFlags: {LEGACY_LOADER: true}};
469
+ const ffs = (0, import_shared_utils.getFeatureFlags)();
470
+ if (ffs && Object.keys(ffs).length) {
471
+ const accumulator = {};
472
+ for (const [key, value] of Object.entries(ffs)) {
473
+ if (value) {
474
+ accumulator[key] = true;
475
+ }
476
+ }
477
+ return {featureFlags: accumulator};
354
478
  } else {
355
479
  return void 0;
356
480
  }
@@ -387,6 +511,10 @@ ${mergeIndex}
387
511
  });
388
512
  }
389
513
  }
514
+ async captureAdditionalRouteMetadata(siteConfig) {
515
+ this.addAdditionalImportMetadataToViewConfig(siteConfig);
516
+ await siteConfig.siteMetadata?.persistSiteMetadata();
517
+ }
390
518
  };
391
519
  var static_generation_default = SiteGenerator;
392
520
  var ViewImportMetadataImpl = class {
@@ -414,10 +542,10 @@ var ViewImportMetadataImpl = class {
414
542
  index
415
543
  };
416
544
  }
417
- mergeImportMetadata(targetImportMetdadata, newImportMetadata) {
418
- Object.assign(targetImportMetdadata.imports, newImportMetadata.imports);
419
- if (targetImportMetdadata.index) {
420
- Object.assign(targetImportMetdadata.index, newImportMetadata.index || {});
545
+ mergeImportMetadata(targetImportMetadata, newImportMetadata) {
546
+ Object.assign(targetImportMetadata.imports, newImportMetadata.imports);
547
+ if (targetImportMetadata.index) {
548
+ Object.assign(targetImportMetadata.index, newImportMetadata.index || {});
421
549
  }
422
550
  }
423
551
  };
@@ -1,11 +1,10 @@
1
1
  import { deepFreeze } from '@lwrjs/shared-utils';
2
2
  export function createProviderContext(serverContext) {
3
3
  // This is a subset of config to user-land code
4
- const { cacheDir, lwc: { modules = [] }, routes, errorRoutes, rootDir, contentDir, layoutsDir, locker, amdLoader, esmLoader, environment, basePath, } = serverContext.appConfig;
4
+ const { assets, cacheDir, lwc: { modules = [] }, routes, errorRoutes, rootDir, contentDir, layoutsDir, locker, amdLoader, esmLoader, environment, basePath, bundleConfig, } = serverContext.appConfig;
5
5
  const { onModuleDefinitionChange, onModuleSourceChange } = serverContext.appObserver;
6
6
  const { notifyModuleDefinitionChanged, notifyModuleSourceChanged, notifyViewSourceChanged, notifyAssetSourceChanged, } = serverContext.appEmitter;
7
7
  return {
8
- compiler: serverContext.compiler,
9
8
  appObserver: deepFreeze({ onModuleDefinitionChange, onModuleSourceChange }),
10
9
  appEmitter: {
11
10
  notifyModuleDefinitionChanged: (payload) => notifyModuleDefinitionChanged.call(serverContext.appEmitter, payload),
@@ -14,11 +13,12 @@ export function createProviderContext(serverContext) {
14
13
  notifyAssetSourceChanged: (payload) => notifyAssetSourceChanged.call(serverContext.appEmitter, payload),
15
14
  },
16
15
  moduleRegistry: serverContext.moduleRegistry.getPublicApi(),
17
- moduleBundler: serverContext.moduleBundler,
16
+ moduleBundler: serverContext.moduleBundler.getPublicApi(),
18
17
  resourceRegistry: serverContext.resourceRegistry.getPublicApi(),
19
18
  viewRegistry: serverContext.viewRegistry.getPublicApi(),
20
19
  assetRegistry: serverContext.assetRegistry.getPublicApi(),
21
20
  config: deepFreeze({
21
+ assets,
22
22
  cacheDir,
23
23
  modules,
24
24
  routes,
@@ -31,8 +31,10 @@ export function createProviderContext(serverContext) {
31
31
  amdLoader,
32
32
  esmLoader,
33
33
  environment,
34
+ bundleConfig,
34
35
  }),
35
36
  runtimeEnvironment: deepFreeze(serverContext.runtimeEnvironment),
37
+ watcherFactory: serverContext.watcherFactory,
36
38
  };
37
39
  }
38
40
  //# sourceMappingURL=provider.js.map
@@ -1,3 +1,3 @@
1
- import { GlobalData, NormalizedLwrGlobalConfig, RuntimeEnvironment, ServerContext } from '@lwrjs/types';
1
+ import type { GlobalData, NormalizedLwrGlobalConfig, RuntimeEnvironment, ServerContext } from '@lwrjs/types';
2
2
  export declare function createServerContext(appConfig: NormalizedLwrGlobalConfig, runtimeEnvironment: RuntimeEnvironment, globalData: GlobalData): ServerContext;
3
3
  //# sourceMappingURL=server.d.ts.map
@@ -1,26 +1,25 @@
1
1
  import { LwrAssetRegistry } from '@lwrjs/asset-registry';
2
- import { LwrCompiler } from '@lwrjs/compiler';
3
2
  import { LwrModuleBundler } from '@lwrjs/module-bundler';
4
3
  import { LwrModuleRegistry } from '@lwrjs/module-registry';
5
4
  import { LwrResourceRegistry } from '@lwrjs/resource-registry';
6
5
  import { LwrApplicationObserver } from '@lwrjs/shared-utils';
7
6
  import { LwrViewRegistry } from '@lwrjs/view-registry';
7
+ // dependency chokidar in this package.json is to statisfy the optional dependency in shared-utils for fs-watch.
8
+ import { WatcherFactoryImpl } from '@lwrjs/shared-utils/fs-watch';
8
9
  export function createServerContext(appConfig, runtimeEnvironment, globalData) {
9
10
  const appObserver = new LwrApplicationObserver();
10
11
  const appEmitter = appObserver.createLwrEmitter();
11
- const compiler = new LwrCompiler();
12
12
  const assetRegistry = new LwrAssetRegistry({
13
13
  appObserver,
14
14
  appEmitter,
15
15
  runtimeEnvironment,
16
16
  }, appConfig);
17
17
  const moduleRegistry = new LwrModuleRegistry({
18
- compiler,
19
18
  appObserver,
20
19
  appEmitter,
21
20
  runtimeEnvironment,
22
21
  }, appConfig);
23
- const moduleBundler = new LwrModuleBundler({ compiler, moduleRegistry, appObserver }, appConfig);
22
+ const moduleBundler = new LwrModuleBundler({ moduleRegistry, appObserver }, appConfig);
24
23
  const resourceRegistry = new LwrResourceRegistry();
25
24
  const viewRegistry = new LwrViewRegistry({
26
25
  moduleRegistry,
@@ -32,8 +31,8 @@ export function createServerContext(appConfig, runtimeEnvironment, globalData) {
32
31
  globalData,
33
32
  runtimeEnvironment,
34
33
  }, appConfig);
34
+ const watcherFactory = new WatcherFactoryImpl();
35
35
  return {
36
- compiler,
37
36
  appObserver,
38
37
  appEmitter,
39
38
  moduleRegistry,
@@ -41,8 +40,10 @@ export function createServerContext(appConfig, runtimeEnvironment, globalData) {
41
40
  resourceRegistry,
42
41
  assetRegistry,
43
42
  viewRegistry,
43
+ watcherFactory,
44
44
  appConfig,
45
45
  runtimeEnvironment,
46
+ routeHandlers: {},
46
47
  };
47
48
  }
48
49
  //# sourceMappingURL=server.js.map
@@ -1,9 +1,11 @@
1
- import { LwrGlobalConfig, NormalizedLwrGlobalConfig, ServerTypeImpl, PublicAppServer, ServerTypes } from '@lwrjs/types';
1
+ import type { LwrGlobalConfig, NormalizedLwrGlobalConfig, ServerTypeImpl, PublicAppServer, ServerTypes } from '@lwrjs/types';
2
2
  export declare class LwrApp {
3
3
  private app;
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;
@@ -21,5 +23,4 @@ export declare class LwrApp {
21
23
  }
22
24
  export declare function createServer(config?: LwrGlobalConfig): LwrApp;
23
25
  export declare function generateStaticSite(config?: LwrGlobalConfig): Promise<NormalizedLwrGlobalConfig>;
24
- export { buildServer } from './tools/server-build.js';
25
26
  //# sourceMappingURL=index.d.ts.map