draft: refactor project so it sits on top of a standalone app
This commit is contained in:
+108
@@ -0,0 +1,108 @@
|
||||
'use strict';
|
||||
|
||||
const mime = require('mime');
|
||||
|
||||
const createContext = require('./lib/context');
|
||||
const middleware = require('./lib/middleware');
|
||||
const reporter = require('./lib/reporter');
|
||||
const { setFs, toDisk } = require('./lib/fs');
|
||||
const { getFilenameFromUrl, noop, ready } = require('./lib/util');
|
||||
|
||||
const defaults = {
|
||||
logLevel: 'info',
|
||||
logTime: false,
|
||||
logger: null,
|
||||
mimeTypes: null,
|
||||
reporter,
|
||||
stats: {
|
||||
colors: true,
|
||||
context: process.cwd(),
|
||||
},
|
||||
watchOptions: {
|
||||
aggregateTimeout: 200,
|
||||
},
|
||||
writeToDisk: false,
|
||||
};
|
||||
|
||||
module.exports = function wdm(compiler, opts) {
|
||||
const options = Object.assign({}, defaults, opts);
|
||||
|
||||
// defining custom MIME type
|
||||
if (options.mimeTypes) {
|
||||
const typeMap = options.mimeTypes.typeMap || options.mimeTypes;
|
||||
const force = !!options.mimeTypes.force;
|
||||
mime.define(typeMap, force);
|
||||
}
|
||||
|
||||
const context = createContext(compiler, options);
|
||||
|
||||
// start watching
|
||||
if (!options.lazy) {
|
||||
context.watching = compiler.watch(options.watchOptions, (err) => {
|
||||
if (err) {
|
||||
context.log.error(err.stack || err);
|
||||
if (err.details) {
|
||||
context.log.error(err.details);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
if (typeof options.filename === 'string') {
|
||||
const filename = options.filename
|
||||
.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&') // eslint-disable-line no-useless-escape
|
||||
.replace(/\\\[[a-z]+\\\]/gi, '.+');
|
||||
|
||||
options.filename = new RegExp(`^[/]{0,1}${filename}$`);
|
||||
}
|
||||
|
||||
context.state = true;
|
||||
}
|
||||
|
||||
if (options.writeToDisk) {
|
||||
toDisk(context);
|
||||
}
|
||||
|
||||
setFs(context, compiler);
|
||||
|
||||
return Object.assign(middleware(context), {
|
||||
close(callback) {
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
callback = callback || noop;
|
||||
|
||||
if (context.watching) {
|
||||
context.watching.close(callback);
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
},
|
||||
|
||||
context,
|
||||
|
||||
fileSystem: context.fs,
|
||||
|
||||
getFilenameFromUrl: getFilenameFromUrl.bind(
|
||||
this,
|
||||
context.options.publicPath,
|
||||
context.compiler
|
||||
),
|
||||
|
||||
invalidate(callback) {
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
callback = callback || noop;
|
||||
|
||||
if (context.watching) {
|
||||
ready(context, callback, {});
|
||||
context.watching.invalidate();
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
},
|
||||
|
||||
waitUntilValid(callback) {
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
callback = callback || noop;
|
||||
|
||||
ready(context, callback, {});
|
||||
},
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user