aboutsummaryrefslogtreecommitdiff
path: root/node_modules/webpack-dev-middleware/lib/util.js
diff options
context:
space:
mode:
authorruki <waruqi@gmail.com>2018-11-08 00:38:48 +0800
committerruki <waruqi@gmail.com>2018-11-07 21:53:09 +0800
commit26105034da4fcce7ac883c899d781f016559310d (patch)
treec459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/webpack-dev-middleware/lib/util.js
parent2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff)
downloadxmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz
xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip
switch to vuepress
Diffstat (limited to 'node_modules/webpack-dev-middleware/lib/util.js')
-rw-r--r--node_modules/webpack-dev-middleware/lib/util.js173
1 files changed, 173 insertions, 0 deletions
diff --git a/node_modules/webpack-dev-middleware/lib/util.js b/node_modules/webpack-dev-middleware/lib/util.js
new file mode 100644
index 00000000..e8a70bef
--- /dev/null
+++ b/node_modules/webpack-dev-middleware/lib/util.js
@@ -0,0 +1,173 @@
+'use strict';
+
+const path = require('path');
+const { parse } = require('url');
+const querystring = require('querystring');
+const parseRange = require('range-parser');
+
+const HASH_REGEXP = /[0-9a-f]{10,}/;
+
+// support for multi-compiler configuration
+// see: https://github.com/webpack/webpack-dev-server/issues/641
+function getPaths(publicPath, compiler, url) {
+ const compilers = compiler && compiler.compilers;
+ if (Array.isArray(compilers)) {
+ let compilerPublicPath;
+
+ // the path portion of compilerPublicPath
+ let compilerPublicPathBase;
+
+ for (let i = 0; i < compilers.length; i++) {
+ compilerPublicPath = compilers[i].options
+ && compilers[i].options.output
+ && compilers[i].options.output.publicPath;
+
+ if (compilerPublicPath) {
+ if (compilerPublicPath.indexOf('/') === 0) {
+ compilerPublicPathBase = compilerPublicPath;
+ } else {
+ // handle the case where compilerPublicPath is a URL with hostname
+ compilerPublicPathBase = parse(compilerPublicPath).pathname;
+ }
+
+ // check the url vs the path part of the compilerPublicPath
+ if (url.indexOf(compilerPublicPathBase) === 0) {
+ return {
+ publicPath: compilerPublicPath,
+ outputPath: compilers[i].outputPath
+ };
+ }
+ }
+ }
+ }
+ return {
+ publicPath,
+ outputPath: compiler.outputPath
+ };
+}
+
+function ready(context, fn, req) {
+ if (context.state) {
+ return fn(context.webpackStats);
+ }
+
+ context.log.info(`wait until bundle finished: ${req.url || fn.name}`);
+ context.callbacks.push(fn);
+}
+
+module.exports = {
+ getFilenameFromUrl(pubPath, compiler, url) {
+ const { outputPath, publicPath } = getPaths(pubPath, compiler, url);
+ // localPrefix is the folder our bundle should be in
+ const localPrefix = parse(publicPath || '/', false, true);
+ const urlObject = parse(url);
+ let filename;
+
+ // publicPath has the hostname that is not the same as request url's, should fail
+ if (localPrefix.hostname !== null && urlObject.hostname !== null &&
+ localPrefix.hostname !== urlObject.hostname) {
+ return false;
+ }
+
+ // publicPath is not in url, so it should fail
+ if (publicPath && localPrefix.hostname === urlObject.hostname &&
+ url.indexOf(publicPath) !== 0) {
+ return false;
+ }
+
+ // strip localPrefix from the start of url
+ if (urlObject.pathname.indexOf(localPrefix.pathname) === 0) {
+ filename = urlObject.pathname.substr(localPrefix.pathname.length);
+ }
+
+ if (!urlObject.hostname && localPrefix.hostname &&
+ url.indexOf(localPrefix.path) !== 0) {
+ return false;
+ }
+
+ let uri = outputPath;
+
+ /* istanbul ignore if */
+ if (process.platform === 'win32') {
+ // Path Handling for Microsoft Windows
+ if (filename) {
+ uri = path.posix.join((outputPath || ''), querystring.unescape(filename));
+
+ if (!path.win32.isAbsolute(uri)) {
+ uri = `/${uri}`;
+ }
+ }
+
+ return uri;
+ }
+
+ // Path Handling for all other operating systems
+ if (filename) {
+ uri = path.posix.join((outputPath || ''), filename);
+
+ if (!path.posix.isAbsolute(uri)) {
+ uri = `/${uri}`;
+ }
+ }
+
+ // if no matches, use outputPath as filename
+ return querystring.unescape(uri);
+ },
+
+ handleRangeHeaders(content, req, res) {
+ // assumes express API. For other servers, need to add logic to access
+ // alternative header APIs
+ res.setHeader('Accept-Ranges', 'bytes');
+
+ if (req.headers.range) {
+ const ranges = parseRange(content.length, req.headers.range);
+
+ // unsatisfiable
+ if (ranges === -1) {
+ res.setHeader('Content-Range', `bytes */${content.length}`);
+ res.statusCode = 416;
+ }
+
+ // valid (syntactically invalid/multiple ranges are treated as a
+ // regular response)
+ if (ranges !== -2 && ranges.length === 1) {
+ const { length } = content;
+
+ // Content-Range
+ res.statusCode = 206;
+ res.setHeader(
+ 'Content-Range',
+ `bytes ${ranges[0].start}-${ranges[0].end}/${length}`
+ );
+
+ content = content.slice(ranges[0].start, ranges[0].end + 1);
+ }
+ }
+
+ return content;
+ },
+
+ handleRequest(context, filename, processRequest, req) {
+ // in lazy mode, rebuild on bundle request
+ if (context.options.lazy && (!context.options.filename || context.options.filename.test(filename))) {
+ context.rebuild();
+ }
+
+ if (HASH_REGEXP.test(filename)) {
+ try {
+ if (context.fs.statSync(filename).isFile()) {
+ processRequest();
+ return;
+ }
+ } catch (e) {
+ // eslint-disable-line
+ }
+ }
+
+ ready(context, processRequest, req);
+ },
+
+ noop: () => {},
+
+ ready
+};