@happy-dom/server-renderer 19.0.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.
- package/LICENSE +21 -0
- package/README.md +70 -0
- package/bin/lib/happy-dom-sr.d.ts +3 -0
- package/bin/lib/happy-dom-sr.d.ts.map +1 -0
- package/bin/lib/happy-dom-sr.js +25 -0
- package/bin/lib/happy-dom-sr.js.map +1 -0
- package/bin/src/happy-dom-sr.ts +30 -0
- package/lib/ServerRenderer.d.ts +36 -0
- package/lib/ServerRenderer.d.ts.map +1 -0
- package/lib/ServerRenderer.js +270 -0
- package/lib/ServerRenderer.js.map +1 -0
- package/lib/ServerRendererBrowser.d.ts +26 -0
- package/lib/ServerRendererBrowser.d.ts.map +1 -0
- package/lib/ServerRendererBrowser.js +244 -0
- package/lib/ServerRendererBrowser.js.map +1 -0
- package/lib/ServerRendererServer.d.ts +22 -0
- package/lib/ServerRendererServer.d.ts.map +1 -0
- package/lib/ServerRendererServer.js +263 -0
- package/lib/ServerRendererServer.js.map +1 -0
- package/lib/ServerRendererWorker.d.ts +10 -0
- package/lib/ServerRendererWorker.d.ts.map +1 -0
- package/lib/ServerRendererWorker.js +25 -0
- package/lib/ServerRendererWorker.js.map +1 -0
- package/lib/config/DefaultServerRendererConfiguration.d.ts +4 -0
- package/lib/config/DefaultServerRendererConfiguration.d.ts.map +1 -0
- package/lib/config/DefaultServerRendererConfiguration.js +40 -0
- package/lib/config/DefaultServerRendererConfiguration.js.map +1 -0
- package/lib/enums/ServerRendererLogLevelEnum.d.ts +9 -0
- package/lib/enums/ServerRendererLogLevelEnum.d.ts.map +1 -0
- package/lib/enums/ServerRendererLogLevelEnum.js +10 -0
- package/lib/enums/ServerRendererLogLevelEnum.js.map +1 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +5 -0
- package/lib/index.js.map +1 -0
- package/lib/types/IOptionalServerRendererConfiguration.d.ts +108 -0
- package/lib/types/IOptionalServerRendererConfiguration.d.ts.map +1 -0
- package/lib/types/IOptionalServerRendererConfiguration.js +2 -0
- package/lib/types/IOptionalServerRendererConfiguration.js.map +1 -0
- package/lib/types/IServerRendererConfiguration.d.ts +108 -0
- package/lib/types/IServerRendererConfiguration.d.ts.map +1 -0
- package/lib/types/IServerRendererConfiguration.js +2 -0
- package/lib/types/IServerRendererConfiguration.js.map +1 -0
- package/lib/types/IServerRendererItem.d.ts +8 -0
- package/lib/types/IServerRendererItem.d.ts.map +1 -0
- package/lib/types/IServerRendererItem.js +2 -0
- package/lib/types/IServerRendererItem.js.map +1 -0
- package/lib/types/IServerRendererResult.d.ts +14 -0
- package/lib/types/IServerRendererResult.d.ts.map +1 -0
- package/lib/types/IServerRendererResult.js +2 -0
- package/lib/types/IServerRendererResult.js.map +1 -0
- package/lib/utilities/BrowserWindowPolyfill.d.ts +13 -0
- package/lib/utilities/BrowserWindowPolyfill.d.ts.map +1 -0
- package/lib/utilities/BrowserWindowPolyfill.js +92 -0
- package/lib/utilities/BrowserWindowPolyfill.js.map +1 -0
- package/lib/utilities/HelpPrinter.d.ts +10 -0
- package/lib/utilities/HelpPrinter.d.ts.map +1 -0
- package/lib/utilities/HelpPrinter.js +32 -0
- package/lib/utilities/HelpPrinter.js.map +1 -0
- package/lib/utilities/HelpPrinterRows.d.ts +3 -0
- package/lib/utilities/HelpPrinterRows.d.ts.map +1 -0
- package/lib/utilities/HelpPrinterRows.js +261 -0
- package/lib/utilities/HelpPrinterRows.js.map +1 -0
- package/lib/utilities/PackageVersion.d.ts +10 -0
- package/lib/utilities/PackageVersion.d.ts.map +1 -0
- package/lib/utilities/PackageVersion.js +13 -0
- package/lib/utilities/PackageVersion.js.map +1 -0
- package/lib/utilities/ProcessArgumentsParser.d.ts +20 -0
- package/lib/utilities/ProcessArgumentsParser.d.ts.map +1 -0
- package/lib/utilities/ProcessArgumentsParser.js +319 -0
- package/lib/utilities/ProcessArgumentsParser.js.map +1 -0
- package/lib/utilities/ServerRendererConfigurationFactory.d.ts +23 -0
- package/lib/utilities/ServerRendererConfigurationFactory.d.ts.map +1 -0
- package/lib/utilities/ServerRendererConfigurationFactory.js +82 -0
- package/lib/utilities/ServerRendererConfigurationFactory.js.map +1 -0
- package/package.json +61 -0
- package/src/ServerRenderer.ts +345 -0
- package/src/ServerRendererBrowser.ts +286 -0
- package/src/ServerRendererServer.ts +337 -0
- package/src/ServerRendererWorker.ts +29 -0
- package/src/config/DefaultServerRendererConfiguration.ts +41 -0
- package/src/enums/ServerRendererLogLevelEnum.ts +9 -0
- package/src/index.ts +17 -0
- package/src/types/IOptionalServerRendererConfiguration.ts +108 -0
- package/src/types/IServerRendererConfiguration.ts +108 -0
- package/src/types/IServerRendererItem.ts +5 -0
- package/src/types/IServerRendererResult.ts +11 -0
- package/src/utilities/BrowserWindowPolyfill.ts +93 -0
- package/src/utilities/HelpPrinter.ts +36 -0
- package/src/utilities/HelpPrinterRows.ts +260 -0
- package/src/utilities/PackageVersion.ts +12 -0
- package/src/utilities/ProcessArgumentsParser.ts +294 -0
- package/src/utilities/ServerRendererConfigurationFactory.ts +91 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import DefaultServerRendererConfiguration from '../config/DefaultServerRendererConfiguration.js';
|
|
2
|
+
import IServerRendererConfiguration from '../types/IServerRendererConfiguration.js';
|
|
3
|
+
import IServerRendererItem from '../types/IServerRendererItem.js';
|
|
4
|
+
import Path from 'path';
|
|
5
|
+
import { BrowserNavigationCrossOriginPolicyEnum } from 'happy-dom';
|
|
6
|
+
import ServerRendererLogLevelEnum from '../enums/ServerRendererLogLevelEnum.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* CLI process arguments parser.
|
|
10
|
+
*/
|
|
11
|
+
export default class ProcessArgumentsParser {
|
|
12
|
+
/**
|
|
13
|
+
* Returns configuration from process arguments.
|
|
14
|
+
*
|
|
15
|
+
* @param args Arguments.
|
|
16
|
+
*/
|
|
17
|
+
public static async getConfiguration(args: string[]): Promise<IServerRendererConfiguration> {
|
|
18
|
+
let config: IServerRendererConfiguration = JSON.parse(
|
|
19
|
+
JSON.stringify(DefaultServerRendererConfiguration)
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
for (const arg of args) {
|
|
23
|
+
if (arg[0] === '-') {
|
|
24
|
+
if (arg.startsWith('--config=') || arg.startsWith('-c=')) {
|
|
25
|
+
config = (await import(Path.resolve(this.stripQuotes(arg.split('=')[1])))).default;
|
|
26
|
+
} else if (arg === '--help' || arg === '-h') {
|
|
27
|
+
config.help = true;
|
|
28
|
+
} else if (arg === '--browser.disableJavaScriptEvaluation') {
|
|
29
|
+
config.browser.disableJavaScriptEvaluation = true;
|
|
30
|
+
} else if (arg === '--browser.disableJavaScriptFileLoading') {
|
|
31
|
+
config.browser.disableJavaScriptFileLoading = true;
|
|
32
|
+
} else if (arg === '--browser.disableCSSFileLoading') {
|
|
33
|
+
config.browser.disableCSSFileLoading = true;
|
|
34
|
+
} else if (arg === '--browser.disableComputedStyleRendering') {
|
|
35
|
+
config.browser.disableComputedStyleRendering = true;
|
|
36
|
+
} else if (arg === '--browser.handleDisabledFileLoadingAsSuccess') {
|
|
37
|
+
config.browser.handleDisabledFileLoadingAsSuccess = true;
|
|
38
|
+
} else if (arg.startsWith('--browser.timer.maxTimeout=')) {
|
|
39
|
+
config.browser.timer.maxTimeout = Number(arg.split('=')[1]);
|
|
40
|
+
if (isNaN(config.browser.timer.maxTimeout)) {
|
|
41
|
+
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
|
|
42
|
+
}
|
|
43
|
+
} else if (arg.startsWith('--browser.timer.maxIntervalTime=')) {
|
|
44
|
+
config.browser.timer.maxIntervalTime = Number(arg.split('=')[1]);
|
|
45
|
+
if (isNaN(config.browser.timer.maxIntervalTime)) {
|
|
46
|
+
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
|
|
47
|
+
}
|
|
48
|
+
} else if (arg.startsWith('--browser.timer.maxIntervalIterations=')) {
|
|
49
|
+
config.browser.timer.maxIntervalIterations = Number(arg.split('=')[1]);
|
|
50
|
+
if (isNaN(config.browser.timer.maxIntervalIterations)) {
|
|
51
|
+
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
|
|
52
|
+
}
|
|
53
|
+
} else if (arg === '--browser.timer.preventTimerLoops') {
|
|
54
|
+
config.browser.timer.preventTimerLoops = true;
|
|
55
|
+
} else if (arg === '--browser.fetch.disableSameOriginPolicy') {
|
|
56
|
+
config.browser.fetch.disableSameOriginPolicy = true;
|
|
57
|
+
} else if (arg === '--browser.fetch.disableStrictSSL') {
|
|
58
|
+
config.browser.fetch.disableStrictSSL = true;
|
|
59
|
+
} else if (arg.startsWith('--browser.fetch.interceptor=')) {
|
|
60
|
+
throw new Error(
|
|
61
|
+
'The setting "browser.fetch.interceptor" can\'t be set via command line.'
|
|
62
|
+
);
|
|
63
|
+
} else if (
|
|
64
|
+
arg.startsWith('--browser.fetch.requestHeader=') ||
|
|
65
|
+
arg.startsWith('--browser.fetch.requestHeaders=') ||
|
|
66
|
+
arg.startsWith('-rh=')
|
|
67
|
+
) {
|
|
68
|
+
const parts = this.stripQuotes(arg.split('=')[1]).split('|');
|
|
69
|
+
const url = parts.length === 2 ? parts[0].trim() : null;
|
|
70
|
+
const header = parts.length === 2 ? parts[1] : parts[0];
|
|
71
|
+
const [key, value] = header.split(':');
|
|
72
|
+
let hasRequestHeaders = false;
|
|
73
|
+
|
|
74
|
+
if (!config.browser.fetch.requestHeaders) {
|
|
75
|
+
config.browser.fetch.requestHeaders = [];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
for (const requestHeaders of config.browser.fetch.requestHeaders) {
|
|
79
|
+
if (
|
|
80
|
+
(!url && !requestHeaders.url) ||
|
|
81
|
+
(url && requestHeaders.url instanceof RegExp && requestHeaders.url.test(url))
|
|
82
|
+
) {
|
|
83
|
+
hasRequestHeaders = true;
|
|
84
|
+
requestHeaders.headers[key.trim()] = (value || '').trim();
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (!hasRequestHeaders) {
|
|
90
|
+
config.browser.fetch.requestHeaders.push({
|
|
91
|
+
url: url ? new RegExp(url) : null,
|
|
92
|
+
headers: {
|
|
93
|
+
[key.trim()]: (value || '').trim()
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
} else if (
|
|
98
|
+
arg.startsWith('--browser.fetch.virtualServer=') ||
|
|
99
|
+
arg.startsWith('--browser.fetch.virtualServers=') ||
|
|
100
|
+
arg.startsWith('-vs=')
|
|
101
|
+
) {
|
|
102
|
+
const parts = this.stripQuotes(arg.split('=')[1]).split('|');
|
|
103
|
+
if (parts.length !== 2) {
|
|
104
|
+
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
|
|
105
|
+
}
|
|
106
|
+
if (!config.browser.fetch.virtualServers) {
|
|
107
|
+
config.browser.fetch.virtualServers = [];
|
|
108
|
+
}
|
|
109
|
+
config.browser.fetch.virtualServers.push({
|
|
110
|
+
url: new RegExp(parts[0].trim()),
|
|
111
|
+
directory: parts[1].trim()
|
|
112
|
+
});
|
|
113
|
+
} else if (arg === '--browser.navigation.disableMainFrameNavigation') {
|
|
114
|
+
config.browser.navigation.disableMainFrameNavigation = true;
|
|
115
|
+
} else if (arg === '--browser.navigation.disableChildFrameNavigation') {
|
|
116
|
+
config.browser.navigation.disableChildFrameNavigation = true;
|
|
117
|
+
} else if (arg === '--browser.navigation.disableChildPageNavigation') {
|
|
118
|
+
config.browser.navigation.disableChildPageNavigation = true;
|
|
119
|
+
} else if (arg === '--browser.navigation.disableFallbackToSetURL') {
|
|
120
|
+
config.browser.navigation.disableFallbackToSetURL = true;
|
|
121
|
+
} else if (arg.startsWith('--browser.navigation.crossOriginPolicy=')) {
|
|
122
|
+
const value = arg.split('=')[1];
|
|
123
|
+
if ((<any>BrowserNavigationCrossOriginPolicyEnum)[value] === undefined) {
|
|
124
|
+
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
|
|
125
|
+
}
|
|
126
|
+
config.browser.navigation.crossOriginPolicy = <BrowserNavigationCrossOriginPolicyEnum>(
|
|
127
|
+
value
|
|
128
|
+
);
|
|
129
|
+
} else if (arg.startsWith('--browser.navigation.beforeContentCallback=')) {
|
|
130
|
+
throw new Error(
|
|
131
|
+
'The setting "browser.navigation.beforeContentCallback" can\'t be set via command line.'
|
|
132
|
+
);
|
|
133
|
+
} else if (arg.startsWith('--browser.navigator.userAgent=')) {
|
|
134
|
+
config.browser.navigator.userAgent = arg.split('=')[1];
|
|
135
|
+
} else if (arg.startsWith('--browser.navigator.maxTouchPoints=')) {
|
|
136
|
+
const value = Number(arg.split('=')[1]);
|
|
137
|
+
if (isNaN(value)) {
|
|
138
|
+
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
|
|
139
|
+
}
|
|
140
|
+
config.browser.navigator.maxTouchPoints = value;
|
|
141
|
+
} else if (arg.startsWith('--browser.device.prefersColorScheme=')) {
|
|
142
|
+
config.browser.device.prefersColorScheme = arg.split('=')[1];
|
|
143
|
+
} else if (arg.startsWith('--browser.device.prefersReducedMotion=')) {
|
|
144
|
+
config.browser.device.prefersReducedMotion = arg.split('=')[1];
|
|
145
|
+
} else if (arg.startsWith('--browser.device.mediaType=')) {
|
|
146
|
+
config.browser.device.mediaType = arg.split('=')[1];
|
|
147
|
+
} else if (arg.startsWith('--browser.device.forcedColors=')) {
|
|
148
|
+
config.browser.device.forcedColors = arg.split('=')[1];
|
|
149
|
+
} else if (arg.startsWith('--browser.debug.traceWaitUntilComplete=')) {
|
|
150
|
+
const value = Number(arg.split('=')[1]);
|
|
151
|
+
if (isNaN(value)) {
|
|
152
|
+
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
|
|
153
|
+
}
|
|
154
|
+
config.browser.debug.traceWaitUntilComplete = value;
|
|
155
|
+
} else if (arg.startsWith('--browser.viewport.width=') || arg.startsWith('-vw=')) {
|
|
156
|
+
const value = Number(arg.split('=')[1]);
|
|
157
|
+
if (isNaN(value)) {
|
|
158
|
+
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
|
|
159
|
+
}
|
|
160
|
+
config.browser.viewport.width = value;
|
|
161
|
+
} else if (arg.startsWith('--browser.viewport.height=') || arg.startsWith('-vh=')) {
|
|
162
|
+
const value = Number(arg.split('=')[1]);
|
|
163
|
+
if (isNaN(value)) {
|
|
164
|
+
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
|
|
165
|
+
}
|
|
166
|
+
config.browser.viewport.height = value;
|
|
167
|
+
} else if (arg.startsWith('--browser.viewport.devicePixelRatio=')) {
|
|
168
|
+
const value = Number(arg.split('=')[1]);
|
|
169
|
+
if (isNaN(value)) {
|
|
170
|
+
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
|
|
171
|
+
}
|
|
172
|
+
config.browser.viewport.devicePixelRatio = value;
|
|
173
|
+
} else if (arg === '--cache.disable') {
|
|
174
|
+
config.cache.disable = true;
|
|
175
|
+
} else if (arg.startsWith('--cache.directory=') || arg.startsWith('-cd=')) {
|
|
176
|
+
config.cache.directory = this.stripQuotes(arg.split('=')[1]);
|
|
177
|
+
} else if (arg === '--cache.warmup') {
|
|
178
|
+
config.cache.warmup = true;
|
|
179
|
+
} else if (arg.startsWith('--logLevel=') || arg.startsWith('-l=')) {
|
|
180
|
+
const value = Number(arg.split('=')[1]);
|
|
181
|
+
if (isNaN(value) || ServerRendererLogLevelEnum[value] === undefined) {
|
|
182
|
+
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
|
|
183
|
+
}
|
|
184
|
+
config.logLevel = <ServerRendererLogLevelEnum>value;
|
|
185
|
+
} else if (arg === '--worker.disable') {
|
|
186
|
+
config.worker.disable = true;
|
|
187
|
+
} else if (arg.startsWith('--worker.maxConcurrency=')) {
|
|
188
|
+
const value = Number(arg.split('=')[1]);
|
|
189
|
+
if (isNaN(value)) {
|
|
190
|
+
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
|
|
191
|
+
}
|
|
192
|
+
config.worker.maxConcurrency = value;
|
|
193
|
+
} else if (arg.startsWith('--render.maxConcurrency=')) {
|
|
194
|
+
const value = Number(arg.split('=')[1]);
|
|
195
|
+
if (isNaN(value)) {
|
|
196
|
+
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
|
|
197
|
+
}
|
|
198
|
+
config.render.maxConcurrency = value;
|
|
199
|
+
} else if (arg.startsWith('--render.timeout=') || arg.startsWith('-rt=')) {
|
|
200
|
+
const value = Number(arg.split('=')[1]);
|
|
201
|
+
if (isNaN(value)) {
|
|
202
|
+
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
|
|
203
|
+
}
|
|
204
|
+
config.render.timeout = value;
|
|
205
|
+
} else if (arg === '--render.incognitoContext') {
|
|
206
|
+
config.render.incognitoContext = true;
|
|
207
|
+
} else if (arg === '--render.serializableShadowRoots') {
|
|
208
|
+
config.render.serializableShadowRoots = true;
|
|
209
|
+
} else if (arg === '--render.allShadowRoots') {
|
|
210
|
+
config.render.allShadowRoots = true;
|
|
211
|
+
} else if (arg.startsWith('--render.excludeShadowRootTags=')) {
|
|
212
|
+
const value = arg.split('=')[1];
|
|
213
|
+
config.render.excludeShadowRootTags = value.split(',');
|
|
214
|
+
} else if (arg === '--render.disablePolyfills') {
|
|
215
|
+
config.render.disablePolyfills = true;
|
|
216
|
+
} else if (arg === '--debug' || arg === '-d') {
|
|
217
|
+
config.debug = true;
|
|
218
|
+
} else if (arg === '--inspect' || arg === '-i') {
|
|
219
|
+
config.inspect = true;
|
|
220
|
+
} else if (arg.startsWith('--outputDirectory=') || arg.startsWith('-o=')) {
|
|
221
|
+
config.outputDirectory = this.stripQuotes(arg.split('=')[1]);
|
|
222
|
+
} else if (arg.startsWith('--server.serverURL=') || arg.startsWith('-su=')) {
|
|
223
|
+
config.server.serverURL = this.stripQuotes(arg.split('=')[1]);
|
|
224
|
+
} else if (arg.startsWith('--server.targetOrigin=') || arg.startsWith('-st=')) {
|
|
225
|
+
config.server.targetOrigin = this.stripQuotes(arg.split('=')[1]);
|
|
226
|
+
} else if (arg === '--server.disableCache' || arg === '-sdc') {
|
|
227
|
+
config.server.disableCache = true;
|
|
228
|
+
} else if (arg === '--server.disableCacheQueue' || arg === '-sdq') {
|
|
229
|
+
config.server.disableCacheQueue = true;
|
|
230
|
+
} else if (arg.startsWith('--server.cacheTime=') || arg.startsWith('-sct=')) {
|
|
231
|
+
const value = Number(arg.split('=')[1]);
|
|
232
|
+
if (isNaN(value)) {
|
|
233
|
+
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
|
|
234
|
+
}
|
|
235
|
+
config.server.cacheTime = value;
|
|
236
|
+
} else if (arg === '--server.start' || arg === '--server' || arg === '-s') {
|
|
237
|
+
config.server.start = true;
|
|
238
|
+
} else if (arg.startsWith('--urls=')) {
|
|
239
|
+
throw new Error(
|
|
240
|
+
'URLs shouldn\'t be set by "--urls=". Instead set them with quotes without an argument name. E.g. "https://example.com/page" "https://example.com/another/page"'
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
} else if (arg) {
|
|
244
|
+
const urlString =
|
|
245
|
+
arg[0] === '"' && arg[arg.length - 1] === '"' ? arg.substring(1, arg.length - 1) : arg;
|
|
246
|
+
|
|
247
|
+
let url: URL | null = null;
|
|
248
|
+
try {
|
|
249
|
+
url = new URL(urlString);
|
|
250
|
+
} catch (e) {
|
|
251
|
+
// Ignore
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if (url) {
|
|
255
|
+
// We need to replace the first slash to make the path relative to the current directory
|
|
256
|
+
const item: IServerRendererItem = {
|
|
257
|
+
url: url.href,
|
|
258
|
+
outputFile: url.pathname.replace('/', '')
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
const parts = item.outputFile!.split('/');
|
|
262
|
+
|
|
263
|
+
if (!parts[parts.length - 1].includes('.')) {
|
|
264
|
+
if (parts[parts.length - 1]) {
|
|
265
|
+
item.outputFile += '/';
|
|
266
|
+
}
|
|
267
|
+
item.outputFile += 'index.html';
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
if (!config.urls) {
|
|
271
|
+
config.urls = [];
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
config.urls.push(item);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return config;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Strips quotes from value.
|
|
284
|
+
*
|
|
285
|
+
* @param value Value.
|
|
286
|
+
* @returns Stripped value.
|
|
287
|
+
*/
|
|
288
|
+
private static stripQuotes(value: string): string {
|
|
289
|
+
if (value[0] === '"' && value[value.length - 1] === '"') {
|
|
290
|
+
return value.substring(1, value.length - 1);
|
|
291
|
+
}
|
|
292
|
+
return value;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import BrowserSettingsFactory from 'happy-dom/lib/browser/BrowserSettingsFactory.js';
|
|
2
|
+
import IOptionalServerRendererConfiguration from '../types/IOptionalServerRendererConfiguration.js';
|
|
3
|
+
import IServerRendererConfiguration from '../types/IServerRendererConfiguration.js';
|
|
4
|
+
import DefaultServerRendererConfiguration from '../config/DefaultServerRendererConfiguration.js';
|
|
5
|
+
import Path from 'path';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Server renderer configuration factory.
|
|
9
|
+
*/
|
|
10
|
+
export default class ServerRendererConfigurationFactory {
|
|
11
|
+
/**
|
|
12
|
+
* Returns server renderer configuration factory.
|
|
13
|
+
*
|
|
14
|
+
* @param [configuration] Configuration.
|
|
15
|
+
* @returns Configuration.
|
|
16
|
+
*/
|
|
17
|
+
public static createConfiguration(
|
|
18
|
+
configuration?: IOptionalServerRendererConfiguration
|
|
19
|
+
): IServerRendererConfiguration {
|
|
20
|
+
if (configuration) {
|
|
21
|
+
this.validate(DefaultServerRendererConfiguration, configuration);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const config = {
|
|
25
|
+
...DefaultServerRendererConfiguration,
|
|
26
|
+
...configuration,
|
|
27
|
+
browser: BrowserSettingsFactory.createSettings({
|
|
28
|
+
...DefaultServerRendererConfiguration.browser,
|
|
29
|
+
...configuration?.browser
|
|
30
|
+
}),
|
|
31
|
+
cache: {
|
|
32
|
+
...DefaultServerRendererConfiguration.cache,
|
|
33
|
+
...configuration?.cache
|
|
34
|
+
},
|
|
35
|
+
worker: {
|
|
36
|
+
...DefaultServerRendererConfiguration.worker,
|
|
37
|
+
...configuration?.worker
|
|
38
|
+
},
|
|
39
|
+
render: {
|
|
40
|
+
...DefaultServerRendererConfiguration.render,
|
|
41
|
+
...configuration?.render
|
|
42
|
+
},
|
|
43
|
+
urls: configuration?.urls || null,
|
|
44
|
+
server: {
|
|
45
|
+
...DefaultServerRendererConfiguration.server,
|
|
46
|
+
...configuration?.server
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
config.outputDirectory = Path.resolve(config.outputDirectory);
|
|
51
|
+
config.cache.directory = Path.resolve(config.cache.directory);
|
|
52
|
+
|
|
53
|
+
return config;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Validates configuration.
|
|
58
|
+
*
|
|
59
|
+
* @param target Target.
|
|
60
|
+
* @param source Source.
|
|
61
|
+
* @param [parentNamespace] Parent namespace.
|
|
62
|
+
*/
|
|
63
|
+
private static validate(target: any, source: any, parentNamespace?: string): void {
|
|
64
|
+
for (const key of Object.keys(source)) {
|
|
65
|
+
if (key === 'browser') {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (target[key] === undefined) {
|
|
69
|
+
const namespace = parentNamespace ? parentNamespace + '.' + key : key;
|
|
70
|
+
throw new Error(`Unknown configuration "${namespace}"`);
|
|
71
|
+
}
|
|
72
|
+
if (typeof target[key] === 'object' && !Array.isArray(target[key]) && target[key] !== null) {
|
|
73
|
+
const namespace = parentNamespace ? parentNamespace + '.' + key : key;
|
|
74
|
+
if (typeof source[key] !== 'object' || Array.isArray(source[key]) || source[key] === null) {
|
|
75
|
+
throw new Error(`Configuration "${namespace}" cannot be null`);
|
|
76
|
+
}
|
|
77
|
+
this.validate(target[key], source[key], namespace);
|
|
78
|
+
} else {
|
|
79
|
+
if (
|
|
80
|
+
(typeof target[key] === 'boolean' ||
|
|
81
|
+
typeof target[key] === 'number' ||
|
|
82
|
+
typeof target[key] === 'string') &&
|
|
83
|
+
typeof source[key] !== typeof target[key]
|
|
84
|
+
) {
|
|
85
|
+
const namespace = parentNamespace ? parentNamespace + '.' + key : key;
|
|
86
|
+
throw new Error(`Configuration "${namespace}" must be of type "${typeof target[key]}"`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|