@lwrjs/core 0.5.11-alpha.1 → 0.6.0-alpha.10
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/env-config.cjs +31 -3
- package/build/cjs/index.cjs +41 -10
- package/build/cjs/middlewares/api-middleware.cjs +8 -7
- package/build/cjs/middlewares/ui-middleware.cjs +26 -21
- package/build/cjs/middlewares/utils.cjs +1 -1
- package/build/cjs/tools/static-generation.cjs +259 -114
- package/build/cjs/tools/utils/network-dispatcher.cjs +22 -2
- package/build/cjs/tools/utils/stream.cjs +9 -1
- package/build/cjs/validation/app-config-context.cjs +5 -2
- package/build/cjs/validation/app-config.cjs +1 -0
- package/build/es/env-config.js +32 -3
- package/build/es/index.js +48 -11
- package/build/es/middlewares/api-middleware.js +10 -7
- package/build/es/middlewares/ui-middleware.js +29 -22
- package/build/es/middlewares/utils.d.ts +2 -5
- package/build/es/middlewares/utils.js +3 -3
- package/build/es/tools/static-generation.d.ts +95 -6
- package/build/es/tools/static-generation.js +399 -166
- package/build/es/tools/types.d.ts +22 -2
- package/build/es/tools/utils/network-dispatcher.d.ts +3 -0
- package/build/es/tools/utils/network-dispatcher.js +26 -2
- package/build/es/tools/utils/stream.d.ts +5 -0
- package/build/es/tools/utils/stream.js +13 -1
- package/build/es/validation/app-config-context.d.ts +2 -2
- package/build/es/validation/app-config-context.js +3 -0
- package/build/es/validation/app-config.js +1 -0
- package/package.json +29 -25
|
@@ -24,122 +24,15 @@ var __toModule = (module2) => {
|
|
|
24
24
|
// packages/@lwrjs/core/src/tools/static-generation.ts
|
|
25
25
|
__markAsModule(exports);
|
|
26
26
|
__export(exports, {
|
|
27
|
+
ViewImportMetadataImpl: () => ViewImportMetadataImpl,
|
|
27
28
|
default: () => static_generation_default
|
|
28
29
|
});
|
|
30
|
+
var import_shared_utils = __toModule(require("@lwrjs/shared-utils"));
|
|
29
31
|
var import_path = __toModule(require("path"));
|
|
30
32
|
var import_fs_extra = __toModule(require("fs-extra"));
|
|
31
33
|
var import_stream = __toModule(require("./utils/stream.cjs"));
|
|
32
34
|
var import_dir = __toModule(require("./utils/dir.cjs"));
|
|
33
35
|
var SiteGenerator = class {
|
|
34
|
-
async dispatchResourceRecursive(url, dispatcher, resourceOpts, siteConfig) {
|
|
35
|
-
const {outputDir, visitedUrls} = siteConfig;
|
|
36
|
-
if (!visitedUrls.has(url)) {
|
|
37
|
-
visitedUrls.add(url);
|
|
38
|
-
if (url.indexOf("/:") !== -1) {
|
|
39
|
-
console.error("Skipped url with variable path segment: " + url);
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
const context = await dispatcher.dispatchUrl(url, "GET", siteConfig.locale);
|
|
43
|
-
const {resourceType} = resourceOpts;
|
|
44
|
-
if (resourceType === "route") {
|
|
45
|
-
const dir = (0, import_dir.createResourceDir)(url, outputDir);
|
|
46
|
-
const localeDir = (0, import_dir.createResourceDir)(url, (0, import_path.join)(outputDir, siteConfig.locale));
|
|
47
|
-
const filePath = (0, import_path.join)(dir, "index.html");
|
|
48
|
-
const fileLocalePath = (0, import_path.join)(localeDir, "index.html");
|
|
49
|
-
if (siteConfig.locale.toLowerCase().startsWith("en")) {
|
|
50
|
-
await (0, import_stream.writeResponse)(context, filePath);
|
|
51
|
-
}
|
|
52
|
-
(0, import_dir.createDir)(localeDir);
|
|
53
|
-
await (0, import_stream.writeResponse)(context, fileLocalePath);
|
|
54
|
-
const viewDefinition = context.fs?.metadata?.viewDefinition;
|
|
55
|
-
if (viewDefinition) {
|
|
56
|
-
const assets = viewDefinition.viewRecord.assetReferences || [];
|
|
57
|
-
for (const asset of assets) {
|
|
58
|
-
const assetUrl = asset.override?.uri || asset.url;
|
|
59
|
-
if (assetUrl && !assetUrl.startsWith("data:")) {
|
|
60
|
-
await this.dispatchResourceRecursive(assetUrl, dispatcher, {resourceType: "asset", asset}, siteConfig);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
const customElements = viewDefinition.viewRecord.customElements || [];
|
|
64
|
-
for (const customElement of customElements) {
|
|
65
|
-
const jsUris = Object.values(customElement.flatGraph.uriMap);
|
|
66
|
-
for (const jsUri of jsUris) {
|
|
67
|
-
await this.dispatchResourceRecursive(jsUri, dispatcher, {resourceType: "js"}, siteConfig);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
if (viewDefinition.viewRecord.bootstrapModule) {
|
|
71
|
-
const boot = viewDefinition.viewRecord.bootstrapModule;
|
|
72
|
-
const jsUris = Object.values(boot.flatGraph.uriMap);
|
|
73
|
-
for (const jsUri of jsUris) {
|
|
74
|
-
await this.dispatchResourceRecursive(jsUri, dispatcher, {resourceType: "js"}, siteConfig);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
const bootstrapResources = viewDefinition.viewRecord.bootstrapModule?.resources || [];
|
|
78
|
-
for (const resource of bootstrapResources) {
|
|
79
|
-
if (!resource.inline) {
|
|
80
|
-
const resourceUri = resource.src || resource.specifier;
|
|
81
|
-
if (resourceUri) {
|
|
82
|
-
await this.dispatchResourceRecursive(resourceUri, dispatcher, {resourceType: "resource"}, siteConfig);
|
|
83
|
-
} else {
|
|
84
|
-
console.warn("Skipped inline bootstrap resource: %j", resource);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
const resources = viewDefinition.viewRecord.resources || [];
|
|
89
|
-
for (const resource of resources) {
|
|
90
|
-
const resourceUri = resource.src || resource.specifier || "";
|
|
91
|
-
if (resourceUri.startsWith("/")) {
|
|
92
|
-
await this.dispatchResourceRecursive(resourceUri, dispatcher, {resourceType: "resource"}, siteConfig);
|
|
93
|
-
} else {
|
|
94
|
-
console.warn("Skipped resource: %j", resource);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
} else if (resourceType === "asset" || resourceType === "resource") {
|
|
99
|
-
const normalizedUrl = decodeURIComponent(url);
|
|
100
|
-
(0, import_dir.createResourceDir)((0, import_path.dirname)(normalizedUrl), outputDir);
|
|
101
|
-
const fullPath = (0, import_path.join)(outputDir, normalizedUrl);
|
|
102
|
-
await (0, import_stream.writeResponse)(context, fullPath);
|
|
103
|
-
} else if (resourceType === "js") {
|
|
104
|
-
const normalizedUrl = decodeURIComponent(url);
|
|
105
|
-
(0, import_dir.createResourceDir)((0, import_path.dirname)(normalizedUrl), outputDir);
|
|
106
|
-
const ext = (0, import_path.extname)(normalizedUrl);
|
|
107
|
-
const fullPath = (0, import_path.join)(outputDir, `${normalizedUrl}${ext ? "" : ".js"}`);
|
|
108
|
-
await (0, import_stream.writeResponse)(context, fullPath);
|
|
109
|
-
if (normalizedUrl.indexOf("/s/") !== -1) {
|
|
110
|
-
const rewriteUrl = normalizedUrl.substring(0, normalizedUrl.indexOf("/s/"));
|
|
111
|
-
siteConfig.urlRewriteMap.set(rewriteUrl, normalizedUrl);
|
|
112
|
-
siteConfig.urlRewriteMap.set(url.substring(0, url.indexOf("/s/")), normalizedUrl);
|
|
113
|
-
}
|
|
114
|
-
const moduleDefinition = context.fs?.metadata.moduleDefinition;
|
|
115
|
-
if (moduleDefinition) {
|
|
116
|
-
const imports = moduleDefinition.linkedModuleRecord?.imports || moduleDefinition.bundleRecord?.imports || [];
|
|
117
|
-
for (const importModule of imports) {
|
|
118
|
-
const jsUri = importModule.specifier;
|
|
119
|
-
if (jsUri.startsWith("/")) {
|
|
120
|
-
await this.dispatchResourceRecursive(jsUri, dispatcher, {resourceType: "js"}, siteConfig);
|
|
121
|
-
} else {
|
|
122
|
-
if (jsUri !== "lwc")
|
|
123
|
-
console.warn("Skipped import: " + jsUri);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
const dynamicImports = moduleDefinition.linkedModuleRecord?.dynamicImports || moduleDefinition.bundleRecord?.dynamicImports || [];
|
|
127
|
-
for (const importModule of dynamicImports) {
|
|
128
|
-
const jsUri = importModule.specifier;
|
|
129
|
-
if (jsUri.startsWith("/")) {
|
|
130
|
-
await this.dispatchResourceRecursive(jsUri, dispatcher, {resourceType: "js"}, siteConfig);
|
|
131
|
-
} else {
|
|
132
|
-
console.warn("Skipped dynamic import: " + jsUri);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
const uris = context.fs?.metadata.resolvedUris || [];
|
|
137
|
-
for (const jsUri of uris) {
|
|
138
|
-
await this.dispatchResourceRecursive(jsUri, dispatcher, {resourceType: "js"}, siteConfig);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
36
|
async buildStaticApplication(config, dispatcher) {
|
|
144
37
|
console.log("[Static Generation] starting");
|
|
145
38
|
const {routes, staticSiteGenerator, rootDir, assets} = config;
|
|
@@ -147,9 +40,11 @@ var SiteGenerator = class {
|
|
|
147
40
|
staticSiteGenerator.outputDir = "__generated_site__";
|
|
148
41
|
}
|
|
149
42
|
const outputDir = (0, import_path.join)(rootDir, staticSiteGenerator.outputDir);
|
|
43
|
+
console.log(`[INFO] Clear Output Location: ${outputDir}`);
|
|
44
|
+
import_fs_extra.default.rmSync(outputDir, {recursive: true, force: true});
|
|
150
45
|
const urlRewriteMap = new Map();
|
|
151
46
|
await this.generateRoutes(staticSiteGenerator, routes, dispatcher, outputDir, urlRewriteMap);
|
|
152
|
-
this.
|
|
47
|
+
this.writeNetlifyRedirectConfig(outputDir, urlRewriteMap);
|
|
153
48
|
this.copyAssets(assets, outputDir);
|
|
154
49
|
console.log("[Static Generation] complete");
|
|
155
50
|
}
|
|
@@ -157,19 +52,203 @@ var SiteGenerator = class {
|
|
|
157
52
|
if (!staticSiteGenerator.locales) {
|
|
158
53
|
staticSiteGenerator.locales = ["en-US"];
|
|
159
54
|
}
|
|
55
|
+
const dispatchRequests = [];
|
|
56
|
+
const generateUrl = this.createGenerateURLFunction(dispatcher);
|
|
160
57
|
for (const locale of staticSiteGenerator.locales) {
|
|
161
|
-
const visitedUrls = new Set();
|
|
162
58
|
for (const route of routes) {
|
|
163
|
-
|
|
59
|
+
const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap);
|
|
60
|
+
dispatchRequests.push(generateUrl(route.path, siteConfig));
|
|
164
61
|
}
|
|
165
62
|
if (staticSiteGenerator._additionalRoutePaths) {
|
|
166
63
|
for (const uri of staticSiteGenerator._additionalRoutePaths) {
|
|
167
|
-
|
|
64
|
+
const siteConfig = this.createSiteConfig(outputDir, locale, urlRewriteMap);
|
|
65
|
+
dispatchRequests.push(generateUrl(uri, siteConfig));
|
|
168
66
|
}
|
|
169
67
|
}
|
|
170
68
|
}
|
|
69
|
+
await Promise.all(dispatchRequests);
|
|
70
|
+
}
|
|
71
|
+
createGenerateURLFunction(dispatcher) {
|
|
72
|
+
const generateRoute = async (uri, siteConfig) => {
|
|
73
|
+
const locale = siteConfig.locale;
|
|
74
|
+
console.log(`[INFO] Start Generate: ${locale} ${uri}`);
|
|
75
|
+
await this.dispatchResourceRecursive(uri, dispatcher, {resourceType: "route"}, siteConfig);
|
|
76
|
+
this.addAdditionalImportMetadataToViewConfig(siteConfig);
|
|
77
|
+
console.log(`[INFO] End Generate ${locale} ${uri}`);
|
|
78
|
+
};
|
|
79
|
+
return generateRoute.bind(this);
|
|
171
80
|
}
|
|
172
|
-
|
|
81
|
+
async dispatchResourceRecursive(url, dispatcher, resourceOpts, siteConfig) {
|
|
82
|
+
const {visitedUrls} = siteConfig;
|
|
83
|
+
if (!visitedUrls.has(url)) {
|
|
84
|
+
visitedUrls.add(url);
|
|
85
|
+
if (url.indexOf("/:") !== -1) {
|
|
86
|
+
console.error("Skipped url with variable path segment: " + url);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const context = await dispatcher.dispatchUrl(url, "GET", siteConfig.locale);
|
|
90
|
+
const {resourceType} = resourceOpts;
|
|
91
|
+
if (resourceType === "route") {
|
|
92
|
+
await this.handleHtmlResource(url, context, siteConfig, dispatcher);
|
|
93
|
+
} else if (resourceType === "asset" || resourceType === "resource") {
|
|
94
|
+
await this.handleAssetOrResource(url, context, siteConfig);
|
|
95
|
+
} else if (resourceType == "mapping") {
|
|
96
|
+
await this.handleMappingResource(url, context, siteConfig, dispatcher);
|
|
97
|
+
} else if (resourceType === "js") {
|
|
98
|
+
await this.handleJavascriptResource(url, context, siteConfig, dispatcher);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async handleJavascriptResource(url, context, siteConfig, dispatcher) {
|
|
103
|
+
const {outputDir} = siteConfig;
|
|
104
|
+
const normalizedUrl = decodeURIComponent(url);
|
|
105
|
+
(0, import_dir.createResourceDir)((0, import_path.dirname)(normalizedUrl), outputDir);
|
|
106
|
+
const ext = (0, import_path.extname)(normalizedUrl);
|
|
107
|
+
const fullPath = (0, import_path.join)(outputDir, `${normalizedUrl}${ext ? "" : ".js"}`);
|
|
108
|
+
await (0, import_stream.writeResponse)(context, fullPath);
|
|
109
|
+
const dispatchRequests = [];
|
|
110
|
+
if (normalizedUrl.indexOf("/s/") !== -1) {
|
|
111
|
+
const rewriteUrl = normalizedUrl.substring(0, normalizedUrl.indexOf("/s/"));
|
|
112
|
+
siteConfig.urlRewriteMap.set(rewriteUrl, normalizedUrl);
|
|
113
|
+
siteConfig.urlRewriteMap.set(url.substring(0, url.indexOf("/s/")), normalizedUrl);
|
|
114
|
+
}
|
|
115
|
+
const moduleDefinition = context.fs?.metadata?.moduleDefinition;
|
|
116
|
+
if (moduleDefinition) {
|
|
117
|
+
const imports = moduleDefinition.linkedModuleRecord?.imports || moduleDefinition.bundleRecord?.imports || [];
|
|
118
|
+
for (const importModule of imports) {
|
|
119
|
+
const jsUri = (0, import_shared_utils.getSpecifier)(importModule);
|
|
120
|
+
dispatchRequests.push(this.dispatchJSResourceRecursive(jsUri, dispatcher, siteConfig));
|
|
121
|
+
}
|
|
122
|
+
const dynamicImports = moduleDefinition.linkedModuleRecord?.dynamicImports || moduleDefinition.bundleRecord?.dynamicImports || [];
|
|
123
|
+
for (const importModule of dynamicImports) {
|
|
124
|
+
const jsUri = (0, import_shared_utils.getSpecifier)(importModule);
|
|
125
|
+
dispatchRequests.push(this.dispatchJSResourceRecursive(jsUri, dispatcher, siteConfig));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const uris = context.fs?.metadata?.resolvedUris || [];
|
|
129
|
+
for (const jsUri of uris) {
|
|
130
|
+
dispatchRequests.push(this.dispatchJSResourceRecursive(jsUri, dispatcher, siteConfig));
|
|
131
|
+
}
|
|
132
|
+
await Promise.all(dispatchRequests);
|
|
133
|
+
}
|
|
134
|
+
async handleMappingResource(url, context, siteConfig, dispatcher) {
|
|
135
|
+
const {importMetadata: importMetatdata} = siteConfig;
|
|
136
|
+
const statusCode = context.response?.status;
|
|
137
|
+
if (statusCode === 200) {
|
|
138
|
+
const newImportMetadata = context.fs?.body;
|
|
139
|
+
if (!importMetatdata) {
|
|
140
|
+
console.warn("[WARN] Import metadata collector was never initialized");
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const filteredImportMetadata = importMetatdata.addAdditionalMetadata(newImportMetadata);
|
|
144
|
+
const dispatchRequests = [];
|
|
145
|
+
for (const uri of Object.keys(filteredImportMetadata.imports)) {
|
|
146
|
+
dispatchRequests.push(this.dispatchResourceRecursive(uri, dispatcher, {resourceType: "js"}, siteConfig));
|
|
147
|
+
}
|
|
148
|
+
await Promise.all(dispatchRequests);
|
|
149
|
+
} else {
|
|
150
|
+
const body = context.fs?.body;
|
|
151
|
+
console.warn(`[WARN] Failed to fetch ${url}: (${statusCode}) ${body}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async handleHtmlResource(url, context, siteConfig, dispatcher) {
|
|
155
|
+
const {outputDir} = siteConfig;
|
|
156
|
+
const dir = (0, import_dir.createResourceDir)(url, outputDir);
|
|
157
|
+
const localeDir = (0, import_dir.createResourceDir)(url, (0, import_path.join)(outputDir, siteConfig.locale));
|
|
158
|
+
const filePath = (0, import_path.join)(dir, "index.html");
|
|
159
|
+
const fileLocalePath = (0, import_path.join)(localeDir, "index.html");
|
|
160
|
+
if (siteConfig.locale.toLowerCase().startsWith("en")) {
|
|
161
|
+
await (0, import_stream.writeResponse)(context, filePath);
|
|
162
|
+
}
|
|
163
|
+
(0, import_dir.createDir)(localeDir);
|
|
164
|
+
await (0, import_stream.writeResponse)(context, fileLocalePath);
|
|
165
|
+
const viewDefinition = context.fs?.metadata?.viewDefinition;
|
|
166
|
+
if (viewDefinition) {
|
|
167
|
+
await this.handleViewDefinition(viewDefinition, siteConfig, dispatcher);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async handleViewDefinition(viewDefinition, siteConfig, dispatcher) {
|
|
171
|
+
siteConfig.endpoints = viewDefinition.viewRecord.endpoints;
|
|
172
|
+
if (viewDefinition.viewRecord.importMetadata) {
|
|
173
|
+
siteConfig.importMetadata = new ViewImportMetadataImpl(viewDefinition.viewRecord.importMetadata);
|
|
174
|
+
}
|
|
175
|
+
const dispatchRequests = [];
|
|
176
|
+
const assets = viewDefinition.viewRecord.assetReferences || [];
|
|
177
|
+
for (const asset of assets) {
|
|
178
|
+
const assetUrl = asset.override?.uri || asset.url;
|
|
179
|
+
if (assetUrl && !assetUrl.startsWith("data:")) {
|
|
180
|
+
dispatchRequests.push(this.dispatchResourceRecursive(assetUrl, dispatcher, {resourceType: "asset", asset}, siteConfig));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const customElements = viewDefinition.viewRecord.customElements || [];
|
|
184
|
+
for (const customElement of customElements) {
|
|
185
|
+
const jsUris = Object.values(customElement.flatGraph.uriMap);
|
|
186
|
+
for (const jsUri of jsUris) {
|
|
187
|
+
dispatchRequests.push(this.dispatchJSResourceRecursive(jsUri, dispatcher, siteConfig));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (viewDefinition.viewRecord.bootstrapModule) {
|
|
191
|
+
const boot = viewDefinition.viewRecord.bootstrapModule;
|
|
192
|
+
const jsUris = Object.values(boot.flatGraph.uriMap);
|
|
193
|
+
for (const jsUri of jsUris) {
|
|
194
|
+
dispatchRequests.push(this.dispatchJSResourceRecursive(jsUri, dispatcher, siteConfig));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const bootstrapResources = viewDefinition.viewRecord.bootstrapModule?.resources || [];
|
|
198
|
+
for (const resource of bootstrapResources) {
|
|
199
|
+
if (!resource.inline) {
|
|
200
|
+
const resourceUri = resource.src || resource.specifier;
|
|
201
|
+
if (resourceUri) {
|
|
202
|
+
dispatchRequests.push(this.dispatchResourceRecursive(resourceUri, dispatcher, {resourceType: "resource"}, siteConfig));
|
|
203
|
+
if (resourceUri.match(/\/application\/.*\/ai\/.*\/configuration/)) {
|
|
204
|
+
siteConfig.viewConfigPath = this.getResourcePathFromUrl(siteConfig, resourceUri);
|
|
205
|
+
}
|
|
206
|
+
} else {
|
|
207
|
+
console.warn("Skipped inline bootstrap resource: %j", resource);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const resources = viewDefinition.viewRecord.resources || [];
|
|
212
|
+
for (const resource of resources) {
|
|
213
|
+
const resourceUri = resource.src || resource.specifier || "";
|
|
214
|
+
if (resourceUri.startsWith("/")) {
|
|
215
|
+
dispatchRequests.push(this.dispatchResourceRecursive(resourceUri, dispatcher, {resourceType: "resource"}, siteConfig));
|
|
216
|
+
} else {
|
|
217
|
+
console.warn("Skipped resource: %j", resource);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
await Promise.all(dispatchRequests);
|
|
221
|
+
}
|
|
222
|
+
async dispatchJSResourceRecursive(jsUri, dispatcher, siteConfig) {
|
|
223
|
+
if (jsUri.startsWith("/")) {
|
|
224
|
+
await this.dispatchResourceRecursive(jsUri, dispatcher, {resourceType: "js"}, siteConfig);
|
|
225
|
+
} else {
|
|
226
|
+
const supportsFingerprints = siteConfig.experimentalFeatures?.ENABLE_FINGERPRINTS;
|
|
227
|
+
if (supportsFingerprints) {
|
|
228
|
+
const mappingEndpoint = siteConfig.endpoints?.uris?.mapping;
|
|
229
|
+
if (mappingEndpoint) {
|
|
230
|
+
const mappingURL = siteConfig.endpoints?.uris?.mapping + encodeURIComponent(jsUri);
|
|
231
|
+
await this.dispatchResourceRecursive(mappingURL, dispatcher, {resourceType: "mapping"}, siteConfig);
|
|
232
|
+
} else {
|
|
233
|
+
console.warn('[WARN] Unable to fetch mapping for bare specifier or variable dynamic import: "' + jsUri + '"');
|
|
234
|
+
}
|
|
235
|
+
} else {
|
|
236
|
+
console.warn('[WARN] Unable to resolve bare specifier or variable dynamic import: "' + jsUri + '"');
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
async handleAssetOrResource(url, context, siteConfig) {
|
|
241
|
+
const fullPath = this.getResourcePathFromUrl(siteConfig, url);
|
|
242
|
+
await (0, import_stream.writeResponse)(context, fullPath);
|
|
243
|
+
}
|
|
244
|
+
getResourcePathFromUrl(siteConfig, url) {
|
|
245
|
+
const {outputDir} = siteConfig;
|
|
246
|
+
const normalizedUrl = decodeURIComponent(url);
|
|
247
|
+
(0, import_dir.createResourceDir)((0, import_path.dirname)(normalizedUrl), outputDir);
|
|
248
|
+
const fullPath = (0, import_path.join)(outputDir, normalizedUrl);
|
|
249
|
+
return fullPath;
|
|
250
|
+
}
|
|
251
|
+
writeNetlifyRedirectConfig(outputDir, urlRewriteMap) {
|
|
173
252
|
const serveJsonPath = (0, import_path.join)(outputDir, "serve.json");
|
|
174
253
|
const _redirectsPath = (0, import_path.join)(outputDir, "_redirects");
|
|
175
254
|
if (import_fs_extra.default.existsSync(_redirectsPath)) {
|
|
@@ -202,5 +281,71 @@ var SiteGenerator = class {
|
|
|
202
281
|
}
|
|
203
282
|
}
|
|
204
283
|
}
|
|
284
|
+
createSiteConfig(outputDir, locale, urlRewriteMap) {
|
|
285
|
+
const experimentalFeatures = this.filterExperimentalFeatures();
|
|
286
|
+
return {
|
|
287
|
+
outputDir,
|
|
288
|
+
visitedUrls: new Set(),
|
|
289
|
+
locale,
|
|
290
|
+
urlRewriteMap,
|
|
291
|
+
...experimentalFeatures
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
filterExperimentalFeatures() {
|
|
295
|
+
if ((0, import_shared_utils.getExperimentalFeatures)().ENABLE_FINGERPRINTS) {
|
|
296
|
+
return {experimentalFeatures: {ENABLE_FINGERPRINTS: true}};
|
|
297
|
+
} else {
|
|
298
|
+
return void 0;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
addAdditionalImportMetadataToViewConfig(siteConfig) {
|
|
302
|
+
const supportsFingerprints = siteConfig.experimentalFeatures?.ENABLE_FINGERPRINTS;
|
|
303
|
+
const additionalImportMetadata = siteConfig?.importMetadata?.getAdditionalImportMetadata();
|
|
304
|
+
if (supportsFingerprints && siteConfig.viewConfigPath && additionalImportMetadata?.imports && Object.keys(additionalImportMetadata.imports).length > 0) {
|
|
305
|
+
const imports = additionalImportMetadata.imports ? JSON.stringify(additionalImportMetadata.imports) : "{}";
|
|
306
|
+
const initImports = `if (!globalThis.LWR.imports) { globalThis.LWR.imports = {}; }`;
|
|
307
|
+
const mergeImports = `Object.assign(globalThis.LWR.imports, ${imports})`;
|
|
308
|
+
const index = additionalImportMetadata.index ? JSON.stringify(additionalImportMetadata.index) : "{}";
|
|
309
|
+
const initIndex = `if (!globalThis.LWR.index) { globalThis.LWR.index = {}; }`;
|
|
310
|
+
const mergeIndex = `Object.assign(globalThis.LWR.index, ${index})`;
|
|
311
|
+
import_fs_extra.default.appendFileSync(siteConfig.viewConfigPath, `
|
|
312
|
+
// Appended by Static Site Generator
|
|
313
|
+
${initImports}
|
|
314
|
+
${mergeImports}
|
|
315
|
+
${initIndex}
|
|
316
|
+
${mergeIndex}
|
|
317
|
+
`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
205
320
|
};
|
|
206
321
|
var static_generation_default = SiteGenerator;
|
|
322
|
+
var ViewImportMetadataImpl = class {
|
|
323
|
+
constructor(existingImportMetadata, additionalImportMetadata) {
|
|
324
|
+
this.existing = existingImportMetadata;
|
|
325
|
+
this.additional = additionalImportMetadata || {imports: {}, index: {}};
|
|
326
|
+
}
|
|
327
|
+
getAdditionalImportMetadata() {
|
|
328
|
+
return this.additional;
|
|
329
|
+
}
|
|
330
|
+
addAdditionalMetadata(newMetadata) {
|
|
331
|
+
const filteredImports = this.filterMetadata(newMetadata);
|
|
332
|
+
this.mergeImportMetadata(this.additional, filteredImports);
|
|
333
|
+
return filteredImports;
|
|
334
|
+
}
|
|
335
|
+
filterMetadata(newMetadata) {
|
|
336
|
+
const importsArray = Object.entries(newMetadata.imports);
|
|
337
|
+
const filteredImports = importsArray.filter(([key]) => !this.existing.imports[key]);
|
|
338
|
+
const imports = Object.fromEntries(filteredImports);
|
|
339
|
+
const indexArray = Object.entries(newMetadata.index || {});
|
|
340
|
+
const filteredIndex = indexArray.filter(([key]) => !this.existing.index || !this.existing.index[key]);
|
|
341
|
+
const index = Object.fromEntries(filteredIndex);
|
|
342
|
+
return {
|
|
343
|
+
imports,
|
|
344
|
+
index
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
mergeImportMetadata(targetImportMetdadata, newImportMetadata) {
|
|
348
|
+
Object.assign(targetImportMetdadata.imports, newImportMetadata.imports);
|
|
349
|
+
Object.assign(targetImportMetdadata.index, newImportMetadata.index);
|
|
350
|
+
}
|
|
351
|
+
};
|
|
@@ -28,9 +28,14 @@ __export(exports, {
|
|
|
28
28
|
});
|
|
29
29
|
var import_http = __toModule(require("http"));
|
|
30
30
|
var import_https = __toModule(require("https"));
|
|
31
|
+
var import_diagnostics = __toModule(require("@lwrjs/diagnostics"));
|
|
31
32
|
var NetworkDispatcher = class {
|
|
32
33
|
constructor(port, internalRequestKey) {
|
|
33
34
|
this.port = port || 3e3;
|
|
35
|
+
const httpClient = this.port == 443 ? import_https.default : import_http.default;
|
|
36
|
+
this.pool = new httpClient.Agent({
|
|
37
|
+
maxSockets: 25
|
|
38
|
+
});
|
|
34
39
|
this.internalRequestKey = internalRequestKey || "";
|
|
35
40
|
}
|
|
36
41
|
dispatchUrl(url, method, lang) {
|
|
@@ -39,6 +44,7 @@ var NetworkDispatcher = class {
|
|
|
39
44
|
host: "localhost",
|
|
40
45
|
port: this.port,
|
|
41
46
|
path: url,
|
|
47
|
+
agent: this.pool,
|
|
42
48
|
headers: {
|
|
43
49
|
"Accept-Language": lang,
|
|
44
50
|
"lwr-metadata-request": this.internalRequestKey
|
|
@@ -57,13 +63,27 @@ var NetworkDispatcher = class {
|
|
|
57
63
|
const jsonResponse = JSON.parse(body);
|
|
58
64
|
resolve(jsonResponse);
|
|
59
65
|
} catch (e) {
|
|
60
|
-
console.error(`[NetworkDispatcher] unexpected response body: '${body}'
|
|
66
|
+
console.error(`[ERROR][NetworkDispatcher] unexpected response body: [${method}][${lang}] ${url}: '${body}'`);
|
|
67
|
+
if (e instanceof import_diagnostics.DiagnosticsError) {
|
|
68
|
+
console.log("LWR Diagnostic Error: ");
|
|
69
|
+
console.log(e.diagnostics);
|
|
70
|
+
console.log(e.stack);
|
|
71
|
+
} else {
|
|
72
|
+
console.error(e);
|
|
73
|
+
}
|
|
61
74
|
resolve({});
|
|
62
75
|
}
|
|
63
76
|
});
|
|
64
77
|
});
|
|
65
78
|
req.on("error", (err) => {
|
|
66
|
-
console.error(
|
|
79
|
+
console.error(`[ERROR][NetworkDispatcher] Request: [${method}][${lang}] ${url}`);
|
|
80
|
+
if (err instanceof import_diagnostics.DiagnosticsError) {
|
|
81
|
+
console.log("LWR Diagnostic Error: ");
|
|
82
|
+
console.log(err.diagnostics);
|
|
83
|
+
console.log(err.stack);
|
|
84
|
+
} else {
|
|
85
|
+
console.error(err);
|
|
86
|
+
}
|
|
67
87
|
reject(err);
|
|
68
88
|
});
|
|
69
89
|
req.end();
|
|
@@ -24,6 +24,7 @@ var __toModule = (module2) => {
|
|
|
24
24
|
// packages/@lwrjs/core/src/tools/utils/stream.ts
|
|
25
25
|
__markAsModule(exports);
|
|
26
26
|
__export(exports, {
|
|
27
|
+
isObject: () => isObject,
|
|
27
28
|
writeResponse: () => writeResponse,
|
|
28
29
|
writeStream: () => writeStream
|
|
29
30
|
});
|
|
@@ -42,6 +43,13 @@ async function writeResponse(context, fullPath) {
|
|
|
42
43
|
await writeStream(stream, fullPath);
|
|
43
44
|
} else if (context.fs?.body) {
|
|
44
45
|
const body = context.fs?.body;
|
|
45
|
-
|
|
46
|
+
if (isObject(body)) {
|
|
47
|
+
import_fs.default.writeFileSync(fullPath, JSON.stringify(body), "utf-8");
|
|
48
|
+
} else {
|
|
49
|
+
import_fs.default.writeFileSync(fullPath, body, "utf-8");
|
|
50
|
+
}
|
|
46
51
|
}
|
|
47
52
|
}
|
|
53
|
+
function isObject(o) {
|
|
54
|
+
return typeof o === "object" && o !== null && !Array.isArray(o);
|
|
55
|
+
}
|
|
@@ -44,6 +44,7 @@ var ROOT_ATTRIBUTE_KEYS = createKeys("root", [
|
|
|
44
44
|
"apiVersion",
|
|
45
45
|
"assets",
|
|
46
46
|
"assetProviders",
|
|
47
|
+
"assetTransformers",
|
|
47
48
|
"bundleConfig",
|
|
48
49
|
"cacheDir",
|
|
49
50
|
"contentDir",
|
|
@@ -68,7 +69,8 @@ var ROOT_ATTRIBUTE_KEYS = createKeys("root", [
|
|
|
68
69
|
"serverMode",
|
|
69
70
|
"serverType",
|
|
70
71
|
"templateEngine",
|
|
71
|
-
"viewProviders"
|
|
72
|
+
"viewProviders",
|
|
73
|
+
"viewTransformers"
|
|
72
74
|
]);
|
|
73
75
|
var ASSET_DIR_ATTRIBUTE_KEYS = createKeys("assetDir", ["alias", "dir", "urlPath"]);
|
|
74
76
|
var ASSET_FILE_ATTRIBUTE_KEYS = createKeys("assetFile", ["alias", "file", "urlPath"]);
|
|
@@ -101,7 +103,8 @@ var BOOTSTRAP_ATTRIBUTE_KEYS = createKeys("bootstrap", [
|
|
|
101
103
|
"syntheticShadow",
|
|
102
104
|
"workers",
|
|
103
105
|
"services",
|
|
104
|
-
"configAsSrc"
|
|
106
|
+
"configAsSrc",
|
|
107
|
+
"experimentalSSR"
|
|
105
108
|
]);
|
|
106
109
|
var SPECIFIER_REGEX = /^@?[\w-]+(\/[\w-]+)*$/;
|
|
107
110
|
function isNotEmptyString(node) {
|
|
@@ -42,6 +42,7 @@ function validateBootstrap(node, validationContext, propPrefix) {
|
|
|
42
42
|
validationContext.assertValidKeys(node, "bootstrap", import_app_config_context.BOOTSTRAP_ATTRIBUTE_KEYS);
|
|
43
43
|
validationContext.assertArrayOfSpecifiers((0, import_jsonc_parser.findNodeAtLocation)(node, ["services"]), `${propPrefix}.services`);
|
|
44
44
|
validationContext.assertIsBoolean((0, import_jsonc_parser.findNodeAtLocation)(node, ["autoBoot"]), `${propPrefix}.autoBoot`);
|
|
45
|
+
validationContext.assertIsBoolean((0, import_jsonc_parser.findNodeAtLocation)(node, ["experimentalSSR"]), `${propPrefix}.experimentalSSR`);
|
|
45
46
|
validationContext.assertIsBoolean((0, import_jsonc_parser.findNodeAtLocation)(node, ["configAsSrc"]), `${propPrefix}.configAsSrc`);
|
|
46
47
|
validationContext.assertIsBoolean((0, import_jsonc_parser.findNodeAtLocation)(node, ["syntheticShadow"]), `${propPrefix}.syntheticShadow`);
|
|
47
48
|
const workers = (0, import_jsonc_parser.findNodeAtLocation)(node, ["workers"]);
|
package/build/es/env-config.js
CHANGED
|
@@ -26,6 +26,7 @@ const DEFAULT_DATA_DIR = '$rootDir/src/data';
|
|
|
26
26
|
// Providers
|
|
27
27
|
const DEFAULT_MODULE_PROVIDERS = [
|
|
28
28
|
'@lwrjs/app-service/moduleProvider',
|
|
29
|
+
'@lwrjs/lwc-ssr/moduleProvider',
|
|
29
30
|
'@lwrjs/lwc-module-provider',
|
|
30
31
|
'@lwrjs/npm-module-provider',
|
|
31
32
|
];
|
|
@@ -36,7 +37,9 @@ const DEFAULT_VIEW_PROVIDERS = [
|
|
|
36
37
|
'@lwrjs/markdown-view-provider',
|
|
37
38
|
'@lwrjs/base-view-provider',
|
|
38
39
|
];
|
|
40
|
+
const DEFAULT_VIEW_TRANFORM_PLUGINS = ['@lwrjs/base-view-transformer', '@lwrjs/lwc-ssr/viewTransformer'];
|
|
39
41
|
const DEFAULT_ASSET_PROVIDERS = ['@lwrjs/fs-asset-provider'];
|
|
42
|
+
const DEFAULT_ASSET_TRANFORM_PLUGINS = ['@lwrjs/asset-transformer'];
|
|
40
43
|
// Packages/modules
|
|
41
44
|
const DEFAULT_TEMPLATE_ENGINE = '@lwrjs/base-template-engine';
|
|
42
45
|
const DEFAULT_AMD_LOADER = 'lwr/loader';
|
|
@@ -47,9 +50,11 @@ const DEFAULT_LWR_MODULES = [
|
|
|
47
50
|
{ npm: getLWCEngineSpecifier() },
|
|
48
51
|
{ npm: '@lwrjs/client-modules' },
|
|
49
52
|
{ npm: '@lwrjs/loader' },
|
|
53
|
+
{ npm: '@lwrjs/o11y' },
|
|
50
54
|
{ npm: '@lwrjs/router' },
|
|
51
55
|
{ npm: '@lwc/synthetic-shadow' },
|
|
52
56
|
];
|
|
57
|
+
const DEFAULT_BUNDLE_EXCLUSIONS = ['lwc', '@lwc/synthetic-shadow', 'lwr/navigation', 'lwr/esmLoader'];
|
|
53
58
|
// Default config objects
|
|
54
59
|
const DEFAULT_LWR_CONFIG = {
|
|
55
60
|
port: PORT,
|
|
@@ -60,6 +65,8 @@ const DEFAULT_LWR_CONFIG = {
|
|
|
60
65
|
serverMode: MODE,
|
|
61
66
|
apiVersion: DEFAULT_API_VERSION,
|
|
62
67
|
assets: DEFAULT_ASSETS_DIR,
|
|
68
|
+
assetProviders: DEFAULT_ASSET_PROVIDERS,
|
|
69
|
+
assetTransformers: DEFAULT_ASSET_TRANFORM_PLUGINS,
|
|
63
70
|
contentDir: DEFAULT_CONTENT_DIR,
|
|
64
71
|
layoutsDir: DEFAULT_LAYOUTS_DIR,
|
|
65
72
|
staticSiteGenerator: DEFAULT_GENERATOR_CONFIG,
|
|
@@ -69,12 +76,13 @@ const DEFAULT_LWR_CONFIG = {
|
|
|
69
76
|
moduleProviders: DEFAULT_MODULE_PROVIDERS,
|
|
70
77
|
resourceProviders: DEFAULT_RESOURCE_PROVIDERS,
|
|
71
78
|
viewProviders: DEFAULT_VIEW_PROVIDERS,
|
|
79
|
+
viewTransformers: DEFAULT_VIEW_TRANFORM_PLUGINS,
|
|
72
80
|
templateEngine: DEFAULT_TEMPLATE_ENGINE,
|
|
73
81
|
environment: {},
|
|
74
82
|
lwc: { modules: [] },
|
|
75
83
|
routes: [],
|
|
76
84
|
errorRoutes: [],
|
|
77
|
-
bundleConfig: {},
|
|
85
|
+
bundleConfig: { exclude: DEFAULT_BUNDLE_EXCLUSIONS },
|
|
78
86
|
serverType: DEFAULT_SERVER_TYPE,
|
|
79
87
|
locker: DEFAULT_LWR_LOCKER_CONFIG,
|
|
80
88
|
};
|
|
@@ -192,6 +200,16 @@ function mergeLWCConfigs(config1, config2) {
|
|
|
192
200
|
: undefined,
|
|
193
201
|
};
|
|
194
202
|
}
|
|
203
|
+
// merge default bundle exclusions with any bundle exclusions specified in config
|
|
204
|
+
function mergeBundleConfig(jsonConfig, config) {
|
|
205
|
+
const defaultExclusions = DEFAULT_BUNDLE_EXCLUSIONS;
|
|
206
|
+
const configExclusions = config?.bundleConfig?.exclude || jsonConfig?.bundleConfig?.exclude || [];
|
|
207
|
+
return {
|
|
208
|
+
...jsonConfig?.bundleConfig,
|
|
209
|
+
...config?.bundleConfig,
|
|
210
|
+
exclude: [...new Set([...defaultExclusions, ...configExclusions])],
|
|
211
|
+
};
|
|
212
|
+
}
|
|
195
213
|
// merge default locker trusted namespaces/cmps with any trusted namespaces/cmps specified in config
|
|
196
214
|
function mergeLockerConfig(jsonConfig, config) {
|
|
197
215
|
const defaultNamespaces = DEFAULT_LOCKER_TRUSTED_CMP;
|
|
@@ -222,6 +240,13 @@ function normalizeLwcConfig(config) {
|
|
|
222
240
|
: undefined,
|
|
223
241
|
};
|
|
224
242
|
}
|
|
243
|
+
function trimLwrConfig(config) {
|
|
244
|
+
Object.keys(config).forEach((k) => {
|
|
245
|
+
if (config[k] === undefined)
|
|
246
|
+
delete config[k];
|
|
247
|
+
});
|
|
248
|
+
return config;
|
|
249
|
+
}
|
|
225
250
|
/**
|
|
226
251
|
* Merge and normalize all LWR configurations.
|
|
227
252
|
*
|
|
@@ -233,7 +258,8 @@ function normalizeLwcConfig(config) {
|
|
|
233
258
|
* @returns the merged and normalized LWR configuration
|
|
234
259
|
*/
|
|
235
260
|
export function normalizeConfig(config) {
|
|
236
|
-
if (config) {
|
|
261
|
+
if (config !== undefined) {
|
|
262
|
+
config = trimLwrConfig(config);
|
|
237
263
|
validateLwrAppConfig(JSON.stringify(config), 'pre');
|
|
238
264
|
}
|
|
239
265
|
// Merge all configurations together, and return
|
|
@@ -246,6 +272,7 @@ export function normalizeConfig(config) {
|
|
|
246
272
|
...lwrJsonConfig,
|
|
247
273
|
...config,
|
|
248
274
|
lwc: normalizeLwcConfig(mergeLWCConfigs(lwrJsonConfig, config)),
|
|
275
|
+
bundleConfig: mergeBundleConfig(lwrJsonConfig, config),
|
|
249
276
|
locker: mergeLockerConfig(lwrJsonConfig, config),
|
|
250
277
|
rootDir,
|
|
251
278
|
};
|
|
@@ -270,9 +297,11 @@ export function normalizeConfig(config) {
|
|
|
270
297
|
interchangeableModulesMap: mergedLwrGlobalConfig.lwc.interchangeableModulesMap,
|
|
271
298
|
},
|
|
272
299
|
moduleProviders: normalizeServices(mergedLwrGlobalConfig.moduleProviders, rootDir),
|
|
273
|
-
assetProviders: normalizeServices(
|
|
300
|
+
assetProviders: normalizeServices(mergedLwrGlobalConfig.assetProviders, rootDir),
|
|
301
|
+
assetTransformers: normalizeServices(mergedLwrGlobalConfig.assetTransformers, rootDir),
|
|
274
302
|
resourceProviders: normalizeServices(mergedLwrGlobalConfig.resourceProviders, rootDir),
|
|
275
303
|
viewProviders: normalizeServices(mergedLwrGlobalConfig.viewProviders, rootDir),
|
|
304
|
+
viewTransformers: normalizeServices(mergedLwrGlobalConfig.viewTransformers, rootDir),
|
|
276
305
|
routes: normalizeRoutes(mergedLwrGlobalConfig.routes, { rootDir, assets, contentDir, layoutsDir }),
|
|
277
306
|
errorRoutes: normalizeRoutes(mergedLwrGlobalConfig.errorRoutes, {
|
|
278
307
|
rootDir,
|