electron-compile
Version:
Electron supporting package to compile JS and CSS in Electron applications
996 lines (794 loc) • 82.4 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _map = require('babel-runtime/core-js/map');
var _map2 = _interopRequireDefault(_map);
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _mimeTypes = require('mime-types');
var _mimeTypes2 = _interopRequireDefault(_mimeTypes);
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _zlib = require('zlib');
var _zlib2 = _interopRequireDefault(_zlib);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _promise = require('./promise');
var _forAllFiles = require('./for-all-files');
var _compileCache = require('./compile-cache');
var _compileCache2 = _interopRequireDefault(_compileCache);
var _fileChangeCache = require('./file-change-cache');
var _fileChangeCache2 = _interopRequireDefault(_fileChangeCache);
var _readOnlyCompiler = require('./read-only-compiler');
var _readOnlyCompiler2 = _interopRequireDefault(_readOnlyCompiler);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var d = require('debug')('electron-compile:compiler-host');
// This isn't even my
var finalForms = {
'text/javascript': true,
'application/javascript': true,
'text/html': true,
'text/css': true,
'image/svg+xml': true,
'application/json': true
};
/**
* This class is the top-level class that encapsulates all of the logic of
* compiling and caching application code. If you're looking for a "Main class",
* this is it.
*
* This class can be created directly but it is usually created via the methods
* in config-parser, which will among other things, set up the compiler options
* given a project root.
*
* CompilerHost is also the top-level class that knows how to serialize all of the
* information necessary to recreate itself, either as a development host (i.e.
* will allow cache misses and actual compilation), or as a read-only version of
* itself for production.
*/
var CompilerHost = function () {
/**
* Creates an instance of CompilerHost. You probably want to use the methods
* in config-parser for development, or {@link createReadonlyFromConfiguration}
* for production instead.
*
* @param {string} rootCacheDir The root directory to use for the cache
*
* @param {Object} compilers an Object whose keys are input MIME types and
* whose values are instances of CompilerBase. Create
* this via the {@link createCompilers} method in
* config-parser.
*
* @param {FileChangedCache} fileChangeCache A file-change cache that is
* optionally pre-loaded.
*
* @param {boolean} readOnlyMode If True, cache misses will fail and
* compilation will not be attempted.
*
* @param {CompilerBase} fallbackCompiler (optional) When a file is compiled
* which doesn't have a matching compiler,
* this compiler will be used instead. If
* null, will fail compilation. A good
* alternate fallback is the compiler for
* 'text/plain', which is guaranteed to be
* present.
*/
function CompilerHost(rootCacheDir, compilers, fileChangeCache, readOnlyMode) {
var fallbackCompiler = arguments.length <= 4 || arguments[4] === undefined ? null : arguments[4];
(0, _classCallCheck3.default)(this, CompilerHost);
var compilersByMimeType = _lodash2.default.assign({}, compilers);
_lodash2.default.assign(this, { rootCacheDir: rootCacheDir, compilersByMimeType: compilersByMimeType, fileChangeCache: fileChangeCache, readOnlyMode: readOnlyMode, fallbackCompiler: fallbackCompiler });
this.appRoot = this.fileChangeCache.appRoot;
this.cachesForCompilers = _lodash2.default.reduce((0, _keys2.default)(compilersByMimeType), function (acc, x) {
var compiler = compilersByMimeType[x];
if (acc.has(compiler)) return acc;
acc.set(compiler, _compileCache2.default.createFromCompiler(rootCacheDir, compiler, fileChangeCache, readOnlyMode));
return acc;
}, new _map2.default());
}
/**
* Creates a production-mode CompilerHost from the previously saved
* configuration
*
* @param {string} rootCacheDir The root directory to use for the cache. This
* cache must have cache information saved via
* {@link saveConfiguration}
*
* @param {string} appRoot The top-level directory for your application (i.e.
* the one which has your package.json).
*
* @param {CompilerBase} fallbackCompiler (optional) When a file is compiled
* which doesn't have a matching compiler,
* this compiler will be used instead. If
* null, will fail compilation. A good
* alternate fallback is the compiler for
* 'text/plain', which is guaranteed to be
* present.
*
* @return {Promise<CompilerHost>} A read-only CompilerHost
*/
(0, _createClass3.default)(CompilerHost, [{
key: 'saveConfiguration',
/**
* Saves the current compiler configuration to a file that
* {@link createReadonlyFromConfiguration} can use to recreate the current
* compiler environment
*
* @return {Promise} Completion
*/
value: function () {
var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee() {
var _this = this;
var serializedCompilerOpts, info, target, buf;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
serializedCompilerOpts = _lodash2.default.reduce((0, _keys2.default)(this.compilersByMimeType), function (acc, x) {
var compiler = _this.compilersByMimeType[x];
var Klass = (0, _getPrototypeOf2.default)(compiler).constructor;
var val = {
name: Klass.name,
inputMimeTypes: Klass.getInputMimeTypes(),
compilerOptions: compiler.compilerOptions,
compilerVersion: compiler.getCompilerVersion()
};
acc[x] = val;
return acc;
}, {});
info = {
fileChangeCache: this.fileChangeCache.getSavedData(),
compilers: serializedCompilerOpts
};
target = _path2.default.join(this.rootCacheDir, 'compiler-info.json.gz');
_context.next = 5;
return _promise.pzlib.gzip(new Buffer((0, _stringify2.default)(info)));
case 5:
buf = _context.sent;
_context.next = 8;
return _promise.pfs.writeFile(target, buf);
case 8:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
return function saveConfiguration() {
return ref.apply(this, arguments);
};
}()
/**
* Compiles a file and returns the compiled result.
*
* @param {string} filePath The path to the file to compile
*
* @return {Promise<object>} An Object with the compiled result
*
* @property {Object} hashInfo The hash information returned from getHashForPath
* @property {string} code The source code if the file was a text file
* @property {Buffer} binaryData The file if it was a binary file
* @property {string} mimeType The MIME type saved in the cache.
* @property {string[]} dependentFiles The dependent files returned from
* compiling the file, if any.
*/
}, {
key: 'compile',
value: function compile(filePath) {
return this.readOnlyMode ? this.compileReadOnly(filePath) : this.fullCompile(filePath);
}
/**
* Handles compilation in read-only mode
*
* @private
*/
}, {
key: 'compileReadOnly',
value: function () {
var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2(filePath) {
var type, hashInfo, compiler, _ref, _code, _binaryData, _mimeType, cache, _ref2, code, binaryData, mimeType;
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
// We guarantee that node_modules are always shipped directly
type = _mimeTypes2.default.lookup(filePath);
if (!_fileChangeCache2.default.isInNodeModules(filePath)) {
_context2.next = 7;
break;
}
_context2.t0 = type || 'application/javascript';
_context2.next = 5;
return _promise.pfs.readFile(filePath, 'utf8');
case 5:
_context2.t1 = _context2.sent;
return _context2.abrupt('return', {
mimeType: _context2.t0,
code: _context2.t1
});
case 7:
_context2.next = 9;
return this.fileChangeCache.getHashForPath(filePath);
case 9:
hashInfo = _context2.sent;
// NB: Here, we're basically only using the compiler here to find
// the appropriate CompileCache
compiler = CompilerHost.shouldPassthrough(hashInfo) ? this.getPassthroughCompiler() : this.compilersByMimeType[type || '__lolnothere'];
if (compiler) {
_context2.next = 20;
break;
}
compiler = this.fallbackCompiler;
_context2.next = 15;
return compiler.get(filePath);
case 15:
_ref = _context2.sent;
_code = _ref.code;
_binaryData = _ref.binaryData;
_mimeType = _ref.mimeType;
return _context2.abrupt('return', { code: _code || _binaryData, mimeType: _mimeType });
case 20:
cache = this.cachesForCompilers.get(compiler);
_context2.next = 23;
return cache.get(filePath);
case 23:
_ref2 = _context2.sent;
code = _ref2.code;
binaryData = _ref2.binaryData;
mimeType = _ref2.mimeType;
code = code || binaryData;
if (!(!code || !mimeType)) {
_context2.next = 30;
break;
}
throw new Error('Asked to compile ' + filePath + ' in production, is this file not precompiled?');
case 30:
return _context2.abrupt('return', { code: code, mimeType: mimeType });
case 31:
case 'end':
return _context2.stop();
}
}
}, _callee2, this);
}));
return function compileReadOnly(_x2) {
return ref.apply(this, arguments);
};
}()
/**
* Handles compilation in read-write mode
*
* @private
*/
}, {
key: 'fullCompile',
value: function () {
var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee3(filePath) {
var _this2 = this;
var hashInfo, type, code, compiler, cache;
return _regenerator2.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
d('Compiling ' + filePath);
_context3.next = 3;
return this.fileChangeCache.getHashForPath(filePath);
case 3:
hashInfo = _context3.sent;
type = _mimeTypes2.default.lookup(filePath);
if (!hashInfo.isInNodeModules) {
_context3.next = 13;
break;
}
_context3.t0 = hashInfo.sourceCode;
if (_context3.t0) {
_context3.next = 11;
break;
}
_context3.next = 10;
return _promise.pfs.readFile(filePath, 'utf8');
case 10:
_context3.t0 = _context3.sent;
case 11:
code = _context3.t0;
return _context3.abrupt('return', { code: code, mimeType: type });
case 13:
compiler = CompilerHost.shouldPassthrough(hashInfo) ? this.getPassthroughCompiler() : this.compilersByMimeType[type || '__lolnothere'];
if (!compiler) {
d('Falling back to passthrough compiler for ' + filePath);
compiler = this.fallbackCompiler;
}
if (compiler) {
_context3.next = 17;
break;
}
throw new Error('Couldn\'t find a compiler for ' + filePath);
case 17:
cache = this.cachesForCompilers.get(compiler);
_context3.next = 20;
return cache.getOrFetch(filePath, function (filePath, hashInfo) {
return _this2.compileUncached(filePath, hashInfo, compiler);
});
case 20:
return _context3.abrupt('return', _context3.sent);
case 21:
case 'end':
return _context3.stop();
}
}
}, _callee3, this);
}));
return function fullCompile(_x3) {
return ref.apply(this, arguments);
};
}()
/**
* Handles invoking compilers independent of caching
*
* @private
*/
}, {
key: 'compileUncached',
value: function () {
var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee4(filePath, hashInfo, compiler) {
var inputMimeType, ctx, code, dependentFiles, result, shouldInlineHtmlify, isPassthrough;
return _regenerator2.default.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
inputMimeType = _mimeTypes2.default.lookup(filePath);
if (!hashInfo.isFileBinary) {
_context4.next = 11;
break;
}
_context4.t0 = hashInfo.binaryData;
if (_context4.t0) {
_context4.next = 7;
break;
}
_context4.next = 6;
return _promise.pfs.readFile(filePath);
case 6:
_context4.t0 = _context4.sent;
case 7:
_context4.t1 = _context4.t0;
_context4.t2 = inputMimeType;
_context4.t3 = [];
return _context4.abrupt('return', {
binaryData: _context4.t1,
mimeType: _context4.t2,
dependentFiles: _context4.t3
});
case 11:
ctx = {};
_context4.t4 = hashInfo.sourceCode;
if (_context4.t4) {
_context4.next = 17;
break;
}
_context4.next = 16;
return _promise.pfs.readFile(filePath, 'utf8');
case 16:
_context4.t4 = _context4.sent;
case 17:
code = _context4.t4;
_context4.next = 20;
return compiler.shouldCompileFile(code, ctx);
case 20:
if (_context4.sent) {
_context4.next = 23;
break;
}
d('Compiler returned false for shouldCompileFile: ' + filePath);
return _context4.abrupt('return', { code: code, mimeType: _mimeTypes2.default.lookup(filePath), dependentFiles: [] });
case 23:
_context4.next = 25;
return compiler.determineDependentFiles(code, filePath, ctx);
case 25:
dependentFiles = _context4.sent;
d('Using compiler options: ' + (0, _stringify2.default)(compiler.compilerOptions));
_context4.next = 29;
return compiler.compile(code, filePath, ctx);
case 29:
result = _context4.sent;
shouldInlineHtmlify = inputMimeType !== 'text/html' && result.mimeType === 'text/html';
isPassthrough = result.mimeType === 'text/plain' || !result.mimeType || CompilerHost.shouldPassthrough(hashInfo);
if (!(finalForms[result.mimeType] && !shouldInlineHtmlify || isPassthrough)) {
_context4.next = 36;
break;
}
return _context4.abrupt('return', _lodash2.default.assign(result, { dependentFiles: dependentFiles }));
case 36:
d('Recursively compiling result of ' + filePath + ' with non-final MIME type ' + result.mimeType + ', input was ' + inputMimeType);
hashInfo = _lodash2.default.assign({ sourceCode: result.code, mimeType: result.mimeType }, hashInfo);
compiler = this.compilersByMimeType[result.mimeType || '__lolnothere'];
if (compiler) {
_context4.next = 42;
break;
}
d('Recursive compile failed - intermediate result: ' + (0, _stringify2.default)(result));
throw new Error('Compiling ' + filePath + ' resulted in a MIME type of ' + result.mimeType + ', which we don\'t know how to handle');
case 42:
_context4.next = 44;
return this.compileUncached(filePath + '.' + _mimeTypes2.default.extension(result.mimeType || 'txt'), hashInfo, compiler);
case 44:
return _context4.abrupt('return', _context4.sent);
case 45:
case 'end':
return _context4.stop();
}
}
}, _callee4, this);
}));
return function compileUncached(_x4, _x5, _x6) {
return ref.apply(this, arguments);
};
}()
/**
* Pre-caches an entire directory of files recursively. Usually used for
* building custom compiler tooling.
*
* @param {string} rootDirectory The top-level directory to compile
*
* @param {Function} shouldCompile (optional) A Function which allows the
* caller to disable compiling certain files.
* It takes a fully-qualified path to a file,
* and should return a Boolean.
*
* @return {Promise} Completion.
*/
}, {
key: 'compileAll',
value: function () {
var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee5(rootDirectory) {
var _this3 = this;
var shouldCompile = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
var should;
return _regenerator2.default.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
should = shouldCompile || function () {
return true;
};
_context5.next = 3;
return (0, _forAllFiles.forAllFiles)(rootDirectory, function (f) {
if (!should(f)) return;
d('Compiling ' + f);
return _this3.compile(f, _this3.compilersByMimeType);
});
case 3:
case 'end':
return _context5.stop();
}
}
}, _callee5, this);
}));
return function compileAll(_x8) {
return ref.apply(this, arguments);
};
}()
/*
* Sync Methods
*/
}, {
key: 'compileSync',
value: function compileSync(filePath) {
return this.readOnlyMode ? this.compileReadOnlySync(filePath) : this.fullCompileSync(filePath);
}
}, {
key: 'saveConfigurationSync',
value: function saveConfigurationSync() {
var _this4 = this;
var serializedCompilerOpts = _lodash2.default.reduce((0, _keys2.default)(this.compilersByMimeType), function (acc, x) {
var compiler = _this4.compilersByMimeType[x];
var Klass = (0, _getPrototypeOf2.default)(compiler).constructor;
var val = {
name: Klass.name,
inputMimeTypes: Klass.getInputMimeTypes(),
compilerOptions: compiler.compilerOptions,
compilerVersion: compiler.getCompilerVersion()
};
acc[x] = val;
return acc;
}, {});
var info = {
fileChangeCache: this.fileChangeCache.getSavedData(),
compilers: serializedCompilerOpts
};
var target = _path2.default.join(this.rootCacheDir, 'compiler-info.json.gz');
var buf = _zlib2.default.gzipSync(new Buffer((0, _stringify2.default)(info)));
_fs2.default.writeFileSync(target, buf);
}
}, {
key: 'compileReadOnlySync',
value: function compileReadOnlySync(filePath) {
// We guarantee that node_modules are always shipped directly
var type = _mimeTypes2.default.lookup(filePath);
if (_fileChangeCache2.default.isInNodeModules(filePath)) {
return {
mimeType: type || 'application/javascript',
code: _fs2.default.readFileSync(filePath, 'utf8')
};
}
var hashInfo = this.fileChangeCache.getHashForPathSync(filePath);
// We guarantee that node_modules are always shipped directly
if (hashInfo.isInNodeModules) {
return {
mimeType: type,
code: hashInfo.sourceCode || _fs2.default.readFileSync(filePath, 'utf8')
};
}
// NB: Here, we're basically only using the compiler here to find
// the appropriate CompileCache
var compiler = CompilerHost.shouldPassthrough(hashInfo) ? this.getPassthroughCompiler() : this.compilersByMimeType[type || '__lolnothere'];
if (!compiler) {
compiler = this.fallbackCompiler;
var _compiler$getSync = compiler.getSync(filePath);
var _code2 = _compiler$getSync.code;
var _binaryData2 = _compiler$getSync.binaryData;
var _mimeType2 = _compiler$getSync.mimeType;
return { code: _code2 || _binaryData2, mimeType: _mimeType2 };
}
var cache = this.cachesForCompilers.get(compiler);
var _cache$getSync = cache.getSync(filePath);
var code = _cache$getSync.code;
var binaryData = _cache$getSync.binaryData;
var mimeType = _cache$getSync.mimeType;
code = code || binaryData;
if (!code || !mimeType) {
throw new Error('Asked to compile ' + filePath + ' in production, is this file not precompiled?');
}
return { code: code, mimeType: mimeType };
}
}, {
key: 'fullCompileSync',
value: function fullCompileSync(filePath) {
var _this5 = this;
d('Compiling ' + filePath);
var hashInfo = this.fileChangeCache.getHashForPathSync(filePath);
var type = _mimeTypes2.default.lookup(filePath);
if (hashInfo.isInNodeModules) {
var _code3 = hashInfo.sourceCode || _fs2.default.readFileSync(filePath, 'utf8');
return { code: _code3, mimeType: type };
}
var compiler = CompilerHost.shouldPassthrough(hashInfo) ? this.getPassthroughCompiler() : this.compilersByMimeType[type || '__lolnothere'];
if (!compiler) {
d('Falling back to passthrough compiler for ' + filePath);
compiler = this.fallbackCompiler;
}
if (!compiler) {
throw new Error('Couldn\'t find a compiler for ' + filePath);
}
var cache = this.cachesForCompilers.get(compiler);
return cache.getOrFetchSync(filePath, function (filePath, hashInfo) {
return _this5.compileUncachedSync(filePath, hashInfo, compiler);
});
}
}, {
key: 'compileUncachedSync',
value: function compileUncachedSync(filePath, hashInfo, compiler) {
var inputMimeType = _mimeTypes2.default.lookup(filePath);
if (hashInfo.isFileBinary) {
return {
binaryData: hashInfo.binaryData || _fs2.default.readFileSync(filePath),
mimeType: inputMimeType,
dependentFiles: []
};
}
var ctx = {};
var code = hashInfo.sourceCode || _fs2.default.readFileSync(filePath, 'utf8');
if (!compiler.shouldCompileFileSync(code, ctx)) {
d('Compiler returned false for shouldCompileFile: ' + filePath);
return { code: code, mimeType: _mimeTypes2.default.lookup(filePath), dependentFiles: [] };
}
var dependentFiles = compiler.determineDependentFilesSync(code, filePath, ctx);
var result = compiler.compileSync(code, filePath, ctx);
var shouldInlineHtmlify = inputMimeType !== 'text/html' && result.mimeType === 'text/html';
var isPassthrough = result.mimeType === 'text/plain' || !result.mimeType || CompilerHost.shouldPassthrough(hashInfo);
if (finalForms[result.mimeType] && !shouldInlineHtmlify || isPassthrough) {
// Got something we can use in-browser, let's return it
return _lodash2.default.assign(result, { dependentFiles: dependentFiles });
} else {
d('Recursively compiling result of ' + filePath + ' with non-final MIME type ' + result.mimeType + ', input was ' + inputMimeType);
hashInfo = _lodash2.default.assign({ sourceCode: result.code, mimeType: result.mimeType }, hashInfo);
compiler = this.compilersByMimeType[result.mimeType || '__lolnothere'];
if (!compiler) {
d('Recursive compile failed - intermediate result: ' + (0, _stringify2.default)(result));
throw new Error('Compiling ' + filePath + ' resulted in a MIME type of ' + result.mimeType + ', which we don\'t know how to handle');
}
return this.compileUncachedSync(filePath + '.' + _mimeTypes2.default.extension(result.mimeType || 'txt'), hashInfo, compiler);
}
}
}, {
key: 'compileAllSync',
value: function compileAllSync(rootDirectory) {
var _this6 = this;
var shouldCompile = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
var should = shouldCompile || function () {
return true;
};
(0, _forAllFiles.forAllFilesSync)(rootDirectory, function (f) {
if (!should(f)) return;
return _this6.compileSync(f, _this6.compilersByMimeType);
});
}
/*
* Other stuff
*/
/**
* Returns the passthrough compiler
*
* @private
*/
}, {
key: 'getPassthroughCompiler',
value: function getPassthroughCompiler() {
return this.compilersByMimeType['text/plain'];
}
/**
* Determines whether we should even try to compile the content. Note that in
* some cases, content will still be in cache even if this returns true, and
* in other cases (isInNodeModules), we'll know explicitly to not even bother
* looking in the cache.
*
* @private
*/
}], [{
key: 'createReadonlyFromConfiguration',
value: function () {
var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee6(rootCacheDir, appRoot) {
var fallbackCompiler = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];
var target, buf, info, fileChangeCache, compilers;
return _regenerator2.default.wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
target = _path2.default.join(rootCacheDir, 'compiler-info.json.gz');
_context6.next = 3;
return _promise.pfs.readFile(target);
case 3:
buf = _context6.sent;
_context6.t0 = JSON;
_context6.next = 7;
return _promise.pzlib.gunzip(buf);
case 7:
_context6.t1 = _context6.sent;
info = _context6.t0.parse.call(_context6.t0, _context6.t1);
fileChangeCache = _fileChangeCache2.default.loadFromData(info.fileChangeCache, appRoot, true);
compilers = _lodash2.default.reduce((0, _keys2.default)(info.compilers), function (acc, x) {
var cur = info.compilers[x];
acc[x] = new _readOnlyCompiler2.default(cur.name, cur.compilerVersion, cur.compilerOptions, cur.inputMimeTypes);
return acc;
}, {});
return _context6.abrupt('return', new CompilerHost(rootCacheDir, compilers, fileChangeCache, true, fallbackCompiler));
case 12:
case 'end':
return _context6.stop();
}
}
}, _callee6, this);
}));
return function createReadonlyFromConfiguration(_x11, _x12) {
return ref.apply(this, arguments);
};
}()
/**
* Creates a development-mode CompilerHost from the previously saved
* configuration.
*
* @param {string} rootCacheDir The root directory to use for the cache. This
* cache must have cache information saved via
* {@link saveConfiguration}
*
* @param {string} appRoot The top-level directory for your application (i.e.
* the one which has your package.json).
*
* @param {Object} compilersByMimeType an Object whose keys are input MIME
* types and whose values are instances
* of CompilerBase. Create this via the
* {@link createCompilers} method in
* config-parser.
*
* @param {CompilerBase} fallbackCompiler (optional) When a file is compiled
* which doesn't have a matching compiler,
* this compiler will be used instead. If
* null, will fail compilation. A good
* alternate fallback is the compiler for
* 'text/plain', which is guaranteed to be
* present.
*
* @return {Promise<CompilerHost>} A read-only CompilerHost
*/
}, {
key: 'createFromConfiguration',
value: function () {
var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee7(rootCacheDir, appRoot, compilersByMimeType) {
var fallbackCompiler = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3];
var target, buf, info, fileChangeCache;
return _regenerator2.default.wrap(function _callee7$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
target = _path2.default.join(rootCacheDir, 'compiler-info.json.gz');
_context7.next = 3;
return _promise.pfs.readFile(target);
case 3:
buf = _context7.sent;
_context7.t0 = JSON;
_context7.next = 7;
return _promise.pzlib.gunzip(buf);
case 7:
_context7.t1 = _context7.sent;
info = _context7.t0.parse.call(_context7.t0, _context7.t1);
fileChangeCache = _fileChangeCache2.default.loadFromData(info.fileChangeCache, appRoot, false);
_lodash2.default.each((0, _keys2.default)(info.compilers), function (x) {
var cur = info.compilers[x];
compilersByMimeType[x].compilerOptions = cur.compilerOptions;
});
return _context7.abrupt('return', new CompilerHost(rootCacheDir, compilersByMimeType, fileChangeCache, false, fallbackCompiler));
case 12:
case 'end':
return _context7.stop();
}
}
}, _callee7, this);
}));
return function createFromConfiguration(_x14, _x15, _x16) {
return ref.apply(this, arguments);
};
}()
}, {
key: 'createReadonlyFromConfigurationSync',
value: function createReadonlyFromConfigurationSync(rootCacheDir, appRoot) {
var fallbackCompiler = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];
var target = _path2.default.join(rootCacheDir, 'compiler-info.json.gz');
var buf = _fs2.default.readFileSync(target);
var info = JSON.parse(_zlib2.default.gunzipSync(buf));
var fileChangeCache = _fileChangeCache2.default.loadFromData(info.fileChangeCache, appRoot, true);
var compilers = _lodash2.default.reduce((0, _keys2.default)(info.compilers), function (acc, x) {
var cur = info.compilers[x];
acc[x] = new _readOnlyCompiler2.default(cur.name, cur.compilerVersion, cur.compilerOptions, cur.inputMimeTypes);
return acc;
}, {});
return new CompilerHost(rootCacheDir, compilers, fileChangeCache, true, fallbackCompiler);
}
}, {
key: 'createFromConfigurationSync',
value: function createFromConfigurationSync(rootCacheDir, appRoot, compilersByMimeType) {
var fallbackCompiler = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3];
var target = _path2.default.join(rootCacheDir, 'compiler-info.json.gz');
var buf = _fs2.default.readFileSync(target);
var info = JSON.parse(_zlib2.default.gunzipSync(buf));
var fileChangeCache = _fileChangeCache2.default.loadFromData(info.fileChangeCache, appRoot, false);
_lodash2.default.each((0, _keys2.default)(info.compilers), function (x) {
var cur = info.compilers[x];
compilersByMimeType[x].compilerOptions = cur.compilerOptions;
});
return new CompilerHost(rootCacheDir, compilersByMimeType, fileChangeCache, false, fallbackCompiler);
}
}, {
key: 'shouldPassthrough',
value: function shouldPassthrough(hashInfo) {
return hashInfo.isMinified || hashInfo.isInNodeModules || hashInfo.hasSourceMap || hashInfo.isFileBinary;
}
}]);
return CompilerHost;
}();
exports.default = CompilerHost;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21waWxlci1ob3N0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFZQSxJQUFNLElBQUksUUFBUSxPQUFSLEVBQWlCLGdDQUFqQixDQUFKOzs7QUFHTixJQUFNLGFBQWE7QUFDakIscUJBQW1CLElBQW5CO0FBQ0EsNEJBQTBCLElBQTFCO0FBQ0EsZUFBYSxJQUFiO0FBQ0EsY0FBWSxJQUFaO0FBQ0EsbUJBQWlCLElBQWpCO0FBQ0Esc0JBQW9CLElBQXBCO0NBTkk7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBdUJlOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkJuQixXQTNCbUIsWUEyQm5CLENBQVksWUFBWixFQUEwQixTQUExQixFQUFxQyxlQUFyQyxFQUFzRCxZQUF0RCxFQUE2RjtRQUF6Qix5RUFBbUIsb0JBQU07d0NBM0IxRSxjQTJCMEU7O0FBQzNGLFFBQUksc0JBQXNCLGlCQUFFLE1BQUYsQ0FBUyxFQUFULEVBQWEsU0FBYixDQUF0QixDQUR1RjtBQUUzRixxQkFBRSxNQUFGLENBQVMsSUFBVCxFQUFlLEVBQUMsMEJBQUQsRUFBZSx3Q0FBZixFQUFvQyxnQ0FBcEMsRUFBcUQsMEJBQXJELEVBQW1FLGtDQUFuRSxFQUFmLEVBRjJGO0FBRzNGLFNBQUssT0FBTCxHQUFlLEtBQUssZUFBTCxDQUFxQixPQUFyQixDQUg0RTs7QUFLM0YsU0FBSyxrQkFBTCxHQUEwQixpQkFBRSxNQUFGLENBQVMsb0JBQVksbUJBQVosQ0FBVCxFQUEyQyxVQUFDLEdBQUQsRUFBTSxDQUFOLEVBQVk7QUFDL0UsVUFBSSxXQUFXLG9CQUFvQixDQUFwQixDQUFYLENBRDJFO0FBRS9FLFVBQUksSUFBSSxHQUFKLENBQVEsUUFBUixDQUFKLEVBQXVCLE9BQU8sR0FBUCxDQUF2Qjs7QUFFQSxVQUFJLEdBQUosQ0FDRSxRQURG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