@happy-dom/server-renderer
Version:
Use Happy DOM for server-side rendering (SSR) or as a static site generator (SSG).
343 lines • 17.4 kB
JavaScript
import DefaultServerRendererConfiguration from '../config/DefaultServerRendererConfiguration.js';
import Path from 'path';
import { BrowserNavigationCrossOriginPolicyEnum } from 'happy-dom';
import ServerRendererLogLevelEnum from '../enums/ServerRendererLogLevelEnum.js';
/**
* CLI process arguments parser.
*/
export default class ProcessArgumentsParser {
/**
* Returns configuration from process arguments.
*
* @param args Arguments.
*/
static async getConfiguration(args) {
let config = JSON.parse(JSON.stringify(DefaultServerRendererConfiguration));
for (const arg of args) {
if (arg[0] === '-') {
if (arg.startsWith('--config=') || arg.startsWith('-c=')) {
config = (await import(Path.resolve(this.stripQuotes(arg.split('=')[1])))).default;
if (config.urls) {
const newUrls = [];
for (const urlItem of config.urls) {
const isString = typeof urlItem === 'string';
const url = new URL(isString ? urlItem : urlItem.url);
newUrls.push({
url: url.href,
outputFile: this.getOutputFile(url),
headers: isString ? null : urlItem.headers || null
});
}
config.urls = newUrls;
}
}
else if (arg === '--help' || arg === '-h') {
config.help = true;
}
else if (arg === '--browser.disableJavaScriptEvaluation') {
config.browser.enableJavaScriptEvaluation = false;
}
else if (arg === '--browser.suppressInsecureJavaScriptEnvironmentWarning') {
config.browser.suppressInsecureJavaScriptEnvironmentWarning = true;
}
else if (arg === '--browser.disableJavaScriptFileLoading') {
config.browser.disableJavaScriptFileLoading = true;
}
else if (arg === '--browser.disableCSSFileLoading') {
config.browser.disableCSSFileLoading = true;
}
else if (arg === '--browser.disableComputedStyleRendering') {
config.browser.disableComputedStyleRendering = true;
}
else if (arg === '--browser.handleDisabledFileLoadingAsSuccess') {
config.browser.handleDisabledFileLoadingAsSuccess = true;
}
else if (arg.startsWith('--browser.timer.maxTimeout=')) {
config.browser.timer.maxTimeout = Number(arg.split('=')[1]);
if (isNaN(config.browser.timer.maxTimeout)) {
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
}
}
else if (arg.startsWith('--browser.timer.maxIntervalTime=')) {
config.browser.timer.maxIntervalTime = Number(arg.split('=')[1]);
if (isNaN(config.browser.timer.maxIntervalTime)) {
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
}
}
else if (arg.startsWith('--browser.timer.maxIntervalIterations=')) {
config.browser.timer.maxIntervalIterations = Number(arg.split('=')[1]);
if (isNaN(config.browser.timer.maxIntervalIterations)) {
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
}
}
else if (arg === '--browser.timer.preventTimerLoops') {
config.browser.timer.preventTimerLoops = true;
}
else if (arg === '--browser.fetch.disableSameOriginPolicy') {
config.browser.fetch.disableSameOriginPolicy = true;
}
else if (arg === '--browser.fetch.disableStrictSSL') {
config.browser.fetch.disableStrictSSL = true;
}
else if (arg.startsWith('--browser.fetch.interceptor=')) {
throw new Error('The setting "browser.fetch.interceptor" can\'t be set via command line.');
}
else if (arg.startsWith('--browser.fetch.requestHeader=') ||
arg.startsWith('--browser.fetch.requestHeaders=') ||
arg.startsWith('-rh=')) {
const parts = this.stripQuotes(arg.split('=')[1]).split('|');
const url = parts.length === 2 ? parts[0].trim() : null;
const header = parts.length === 2 ? parts[1] : parts[0];
const [key, value] = header.split(':');
let hasRequestHeaders = false;
if (!config.browser.fetch.requestHeaders) {
config.browser.fetch.requestHeaders = [];
}
for (const requestHeaders of config.browser.fetch.requestHeaders) {
if ((!url && !requestHeaders.url) ||
(url && requestHeaders.url instanceof RegExp && requestHeaders.url.test(url))) {
hasRequestHeaders = true;
requestHeaders.headers[key.trim()] = (value || '').trim();
break;
}
}
if (!hasRequestHeaders) {
config.browser.fetch.requestHeaders.push({
url: url ? new RegExp(url) : null,
headers: {
[key.trim()]: (value || '').trim()
}
});
}
}
else if (arg.startsWith('--browser.fetch.virtualServer=') ||
arg.startsWith('--browser.fetch.virtualServers=') ||
arg.startsWith('-vs=')) {
const parts = this.stripQuotes(arg.split('=')[1]).split('|');
if (parts.length !== 2) {
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
}
if (!config.browser.fetch.virtualServers) {
config.browser.fetch.virtualServers = [];
}
config.browser.fetch.virtualServers.push({
url: new RegExp(parts[0].trim()),
directory: parts[1].trim()
});
}
else if (arg === '--browser.navigation.disableMainFrameNavigation') {
config.browser.navigation.disableMainFrameNavigation = true;
}
else if (arg === '--browser.navigation.disableChildFrameNavigation') {
config.browser.navigation.disableChildFrameNavigation = true;
}
else if (arg === '--browser.navigation.disableChildPageNavigation') {
config.browser.navigation.disableChildPageNavigation = true;
}
else if (arg === '--browser.navigation.disableFallbackToSetURL') {
config.browser.navigation.disableFallbackToSetURL = true;
}
else if (arg.startsWith('--browser.navigation.crossOriginPolicy=')) {
const value = arg.split('=')[1];
if (BrowserNavigationCrossOriginPolicyEnum[value] === undefined) {
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
}
config.browser.navigation.crossOriginPolicy = (value);
}
else if (arg.startsWith('--browser.navigation.beforeContentCallback=')) {
throw new Error('The setting "browser.navigation.beforeContentCallback" can\'t be set via command line.');
}
else if (arg.startsWith('--browser.navigator.userAgent=')) {
config.browser.navigator.userAgent = arg.split('=')[1];
}
else if (arg.startsWith('--browser.navigator.maxTouchPoints=')) {
const value = Number(arg.split('=')[1]);
if (isNaN(value)) {
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
}
config.browser.navigator.maxTouchPoints = value;
}
else if (arg.startsWith('--browser.device.prefersColorScheme=')) {
config.browser.device.prefersColorScheme = arg.split('=')[1];
}
else if (arg.startsWith('--browser.device.prefersReducedMotion=')) {
config.browser.device.prefersReducedMotion = arg.split('=')[1];
}
else if (arg.startsWith('--browser.device.mediaType=')) {
config.browser.device.mediaType = arg.split('=')[1];
}
else if (arg.startsWith('--browser.device.forcedColors=')) {
config.browser.device.forcedColors = arg.split('=')[1];
}
else if (arg.startsWith('--browser.debug.traceWaitUntilComplete=')) {
const value = Number(arg.split('=')[1]);
if (isNaN(value)) {
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
}
config.browser.debug.traceWaitUntilComplete = value;
}
else if (arg.startsWith('--browser.viewport.width=') || arg.startsWith('-vw=')) {
const value = Number(arg.split('=')[1]);
if (isNaN(value)) {
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
}
config.browser.viewport.width = value;
}
else if (arg.startsWith('--browser.viewport.height=') || arg.startsWith('-vh=')) {
const value = Number(arg.split('=')[1]);
if (isNaN(value)) {
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
}
config.browser.viewport.height = value;
}
else if (arg.startsWith('--browser.viewport.devicePixelRatio=')) {
const value = Number(arg.split('=')[1]);
if (isNaN(value)) {
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
}
config.browser.viewport.devicePixelRatio = value;
}
else if (arg === '--cache.disable') {
config.cache.disable = true;
}
else if (arg.startsWith('--cache.directory=') || arg.startsWith('-cd=')) {
config.cache.directory = this.stripQuotes(arg.split('=')[1]);
}
else if (arg === '--cache.warmup') {
config.cache.warmup = true;
}
else if (arg.startsWith('--logLevel=') || arg.startsWith('-l=')) {
const value = Number(arg.split('=')[1]);
if (isNaN(value) || ServerRendererLogLevelEnum[value] === undefined) {
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
}
config.logLevel = value;
}
else if (arg === '--worker.disable') {
config.worker.disable = true;
}
else if (arg.startsWith('--worker.maxConcurrency=')) {
const value = Number(arg.split('=')[1]);
if (isNaN(value)) {
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
}
config.worker.maxConcurrency = value;
}
else if (arg.startsWith('--render.maxConcurrency=')) {
const value = Number(arg.split('=')[1]);
if (isNaN(value)) {
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
}
config.render.maxConcurrency = value;
}
else if (arg.startsWith('--render.timeout=') || arg.startsWith('-rt=')) {
const value = Number(arg.split('=')[1]);
if (isNaN(value)) {
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
}
config.render.timeout = value;
}
else if (arg === '--render.incognitoContext') {
config.render.incognitoContext = true;
}
else if (arg === '--render.serializableShadowRoots') {
config.render.serializableShadowRoots = true;
}
else if (arg === '--render.allShadowRoots') {
config.render.allShadowRoots = true;
}
else if (arg.startsWith('--render.excludeShadowRootTags=')) {
const value = arg.split('=')[1];
config.render.excludeShadowRootTags = value.split(',');
}
else if (arg === '--render.disablePolyfills') {
config.render.disablePolyfills = true;
}
else if (arg === '--debug' || arg === '-d') {
config.debug = true;
}
else if (arg === '--inspect' || arg === '-i') {
config.inspect = true;
}
else if (arg.startsWith('--outputDirectory=') || arg.startsWith('-o=')) {
config.outputDirectory = this.stripQuotes(arg.split('=')[1]);
}
else if (arg.startsWith('--server.serverURL=') || arg.startsWith('-su=')) {
config.server.serverURL = this.stripQuotes(arg.split('=')[1]);
}
else if (arg.startsWith('--server.targetOrigin=') || arg.startsWith('-st=')) {
config.server.targetOrigin = this.stripQuotes(arg.split('=')[1]);
}
else if (arg === '--server.disableCache' || arg === '-sdc') {
config.server.disableCache = true;
}
else if (arg === '--server.disableCacheQueue' || arg === '-sdq') {
config.server.disableCacheQueue = true;
}
else if (arg.startsWith('--server.cacheTime=') || arg.startsWith('-sct=')) {
const value = Number(arg.split('=')[1]);
if (isNaN(value)) {
throw new Error(`Invalid value for ${arg.split('=')[0]}`);
}
config.server.cacheTime = value;
}
else if (arg === '--server.start' || arg === '--server' || arg === '-s') {
config.server.start = true;
}
else if (arg.startsWith('--urls=')) {
throw new Error('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"');
}
}
else if (arg) {
const urlString = arg[0] === '"' && arg[arg.length - 1] === '"' ? arg.substring(1, arg.length - 1) : arg;
let url = null;
try {
url = new URL(urlString);
}
catch (e) {
// Ignore
}
if (url) {
// We need to replace the first slash to make the path relative to the current directory
const item = {
url: url.href,
outputFile: this.getOutputFile(url)
};
if (!config.urls) {
config.urls = [];
}
config.urls.push(item);
}
}
}
return config;
}
/**
*
* @param url
*/
static getOutputFile(url) {
let outputFile = url.pathname.replace('/', '');
const parts = outputFile.split('/');
if (!parts[parts.length - 1].includes('.')) {
if (parts[parts.length - 1]) {
outputFile += '/';
}
outputFile += 'index.html';
}
return outputFile;
}
/**
* Strips quotes from value.
*
* @param value Value.
* @returns Stripped value.
*/
static stripQuotes(value) {
if (value[0] === '"' && value[value.length - 1] === '"') {
return value.substring(1, value.length - 1);
}
return value;
}
}
//# sourceMappingURL=ProcessArgumentsParser.js.map