UNPKG

electron-compile

Version:

Electron supporting package to compile JS and CSS in Electron applications

996 lines (794 loc) 82.4 kB
'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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