You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
3.2 KiB
96 lines
3.2 KiB
2 years ago
|
const querystring = require('querystring');
|
||
|
|
||
|
/**
|
||
|
* @typedef {Object} AdditionalEntries
|
||
|
* @property {string[]} prependEntries
|
||
|
* @property {string[]} overlayEntries
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Creates an object that contains two entry arrays: the prependEntries and overlayEntries
|
||
|
* @param {Object} optionsContainer This is the container for the options to this function
|
||
|
* @param {import('../types').NormalizedPluginOptions} optionsContainer.options Configuration options for this plugin.
|
||
|
* @param {import('webpack').Compiler["options"]["devServer"]} [optionsContainer.devServer] The webpack devServer config
|
||
|
* @returns {AdditionalEntries} An object that contains the Webpack entries for prepending and the overlay feature
|
||
|
*/
|
||
|
function getAdditionalEntries({ devServer, options }) {
|
||
|
/** @type {Record<string, string | number>} */
|
||
|
let resourceQuery = {};
|
||
|
|
||
|
if (devServer) {
|
||
|
const { client, https, http2, sockHost, sockPath, sockPort } = devServer;
|
||
|
let { host, path, port } = devServer;
|
||
|
|
||
|
let protocol = https || http2 ? 'https' : 'http';
|
||
|
if (sockHost) host = sockHost;
|
||
|
if (sockPath) path = sockPath;
|
||
|
if (sockPort) port = sockPort;
|
||
|
|
||
|
if (client && client.webSocketURL != null) {
|
||
|
let parsedUrl = client.webSocketURL;
|
||
|
if (typeof parsedUrl === 'string') parsedUrl = new URL(parsedUrl);
|
||
|
|
||
|
let auth;
|
||
|
if (parsedUrl.username) {
|
||
|
auth = parsedUrl.username;
|
||
|
if (parsedUrl.password) {
|
||
|
auth += ':' + parsedUrl.password;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (parsedUrl.hostname != null) {
|
||
|
host = [auth != null && auth, parsedUrl.hostname].filter(Boolean).join('@');
|
||
|
}
|
||
|
if (parsedUrl.pathname != null) {
|
||
|
path = parsedUrl.pathname;
|
||
|
}
|
||
|
if (parsedUrl.port != null) {
|
||
|
port = !['0', 'auto'].includes(String(parsedUrl.port)) ? parsedUrl.port : undefined;
|
||
|
}
|
||
|
if (parsedUrl.protocol != null) {
|
||
|
protocol = parsedUrl.protocol !== 'auto' ? parsedUrl.protocol.replace(':', '') : 'ws';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (host) resourceQuery.sockHost = host;
|
||
|
if (path) resourceQuery.sockPath = path;
|
||
|
if (port) resourceQuery.sockPort = port;
|
||
|
resourceQuery.sockProtocol = protocol;
|
||
|
}
|
||
|
|
||
|
if (options.overlay) {
|
||
|
const { sockHost, sockPath, sockPort, sockProtocol } = options.overlay;
|
||
|
if (sockHost) resourceQuery.sockHost = sockHost;
|
||
|
if (sockPath) resourceQuery.sockPath = sockPath;
|
||
|
if (sockPort) resourceQuery.sockPort = sockPort;
|
||
|
if (sockProtocol) resourceQuery.sockProtocol = sockProtocol;
|
||
|
}
|
||
|
|
||
|
// We don't need to URI encode the resourceQuery as it will be parsed by Webpack
|
||
|
const queryString = querystring.stringify(resourceQuery, undefined, undefined, {
|
||
|
/**
|
||
|
* @param {string} string
|
||
|
* @returns {string}
|
||
|
*/
|
||
|
encodeURIComponent(string) {
|
||
|
return string;
|
||
|
},
|
||
|
});
|
||
|
|
||
|
const prependEntries = [
|
||
|
// React-refresh runtime
|
||
|
require.resolve('../../client/ReactRefreshEntry'),
|
||
|
];
|
||
|
|
||
|
const overlayEntries = [
|
||
|
// Error overlay runtime
|
||
|
options.overlay &&
|
||
|
options.overlay.entry &&
|
||
|
`${require.resolve(options.overlay.entry)}${queryString ? `?${queryString}` : ''}`,
|
||
|
].filter(Boolean);
|
||
|
|
||
|
return { prependEntries, overlayEntries };
|
||
|
}
|
||
|
|
||
|
module.exports = getAdditionalEntries;
|