electron-compile
Version:
Electron supporting package to compile JS and CSS in Electron applications
1,018 lines (802 loc) • 84.9 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 _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _mimeTypes = require('@paulcbetts/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')('electron-compile:compiler-host');
require('./rig-mime-types').init();
// 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 ? arguments[4] : null;
(0, _classCallCheck3.default)(this, CompilerHost);
var compilersByMimeType = (0, _assign2.default)({}, compilers);
(0, _assign2.default)(this, { rootCacheDir: rootCacheDir, compilersByMimeType: compilersByMimeType, fileChangeCache: fileChangeCache, readOnlyMode: readOnlyMode, fallbackCompiler: fallbackCompiler });
this.appRoot = this.fileChangeCache.appRoot;
this.cachesForCompilers = (0, _keys2.default)(compilersByMimeType).reduce(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 = (0, _keys2.default)(this.compilersByMimeType).reduce(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);
}));
function saveConfiguration() {
return _ref.apply(this, arguments);
}
return saveConfiguration;
}()
/**
* 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 _ref2 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2(filePath) {
var type, hashInfo, compiler, _ref3, _code, _binaryData, _mimeType, cache, _ref4, 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:
_ref3 = _context2.sent;
_code = _ref3.code;
_binaryData = _ref3.binaryData;
_mimeType = _ref3.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:
_ref4 = _context2.sent;
code = _ref4.code;
binaryData = _ref4.binaryData;
mimeType = _ref4.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);
}));
function compileReadOnly(_x2) {
return _ref2.apply(this, arguments);
}
return compileReadOnly;
}()
/**
* Handles compilation in read-write mode
*
* @private
*/
}, {
key: 'fullCompile',
value: function () {
var _ref5 = (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);
}));
function fullCompile(_x3) {
return _ref5.apply(this, arguments);
}
return fullCompile;
}()
/**
* Handles invoking compilers independent of caching
*
* @private
*/
}, {
key: 'compileUncached',
value: function () {
var _ref6 = (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', (0, _assign2.default)(result, { dependentFiles: dependentFiles }));
case 36:
d('Recursively compiling result of ' + filePath + ' with non-final MIME type ' + result.mimeType + ', input was ' + inputMimeType);
hashInfo = (0, _assign2.default)({ 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);
}));
function compileUncached(_x4, _x5, _x6) {
return _ref6.apply(this, arguments);
}
return compileUncached;
}()
/**
* 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 _ref7 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee5(rootDirectory) {
var _this3 = this;
var shouldCompile = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
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);
}));
function compileAll(_x8) {
return _ref7.apply(this, arguments);
}
return compileAll;
}()
/*
* 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 = (0, _keys2.default)(this.compilersByMimeType).reduce(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 code = hashInfo.sourceCode || _fs2.default.readFileSync(filePath, 'utf8');
return { code: code, 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 (0, _assign2.default)(result, { dependentFiles: dependentFiles });
} else {
d('Recursively compiling result of ' + filePath + ' with non-final MIME type ' + result.mimeType + ', input was ' + inputMimeType);
hashInfo = (0, _assign2.default)({ 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 ? arguments[1] : null;
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 _ref8 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee6(rootCacheDir, appRoot) {
var fallbackCompiler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
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 = (0, _keys2.default)(info.compilers).reduce(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);
}));
function createReadonlyFromConfiguration(_x11, _x12) {
return _ref8.apply(this, arguments);
}
return createReadonlyFromConfiguration;
}()
/**
* 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 _ref9 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee7(rootCacheDir, appRoot, compilersByMimeType) {
var fallbackCompiler = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
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);
(0, _keys2.default)(info.compilers).forEach(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);
}));
function createFromConfiguration(_x14, _x15, _x16) {
return _ref9.apply(this, arguments);
}
return createFromConfiguration;
}()
}, {
key: 'createReadonlyFromConfigurationSync',
value: function createReadonlyFromConfigurationSync(rootCacheDir, appRoot) {
var fallbackCompiler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
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 = (0, _keys2.default)(info.compilers).reduce(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 ? arguments[3] : null;
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);
(0, _keys2.default)(info.compilers).forEach(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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21waWxlci1ob3N0LmpzIl0sIm5hbWVzIjpbImQiLCJyZXF1aXJlIiwiaW5pdCIsImZpbmFsRm9ybXMiLCJDb21waWxlckhvc3QiLCJyb290Q2FjaGVEaXIiLCJjb21waWxlcnMiLCJmaWxlQ2hhbmdlQ2FjaGUiLCJyZWFkT25seU1vZGUiLCJmYWxsYmFja0NvbXBpbGVyIiwiY29tcGlsZXJzQnlNaW1lVHlwZSIsImFwcFJvb3QiLCJjYWNoZXNGb3JDb21waWxlcnMiLCJyZWR1Y2UiLCJhY2MiLCJ4IiwiY29tcGlsZXIiLCJoYXMiLCJzZXQiLCJjcmVhdGVGcm9tQ29tcGlsZXIiLCJzZXJpYWxpemVkQ29tcGlsZXJPcHRzIiwiS2xhc3MiLCJjb25zdHJ1Y3RvciIsInZhbCIsIm5hbWUiLCJpbnB1dE1pbWVUeXBlcyIsImdldElucHV0TWltZVR5cGVzIiwiY29tcGlsZXJPcHRpb25zIiwiY29tcGlsZXJWZXJzaW9uIiwiZ2V0Q29tcGlsZXJWZXJzaW9uIiwiaW5mbyIsImdldFNhdmVkRGF0YSIsInRhcmdldCIsImpvaW4iLCJnemlwIiwiQnVmZmVyIiwiYnVmIiwid3JpdGVGaWxlIiwiZmlsZVBhdGgiLCJjb21waWxlUmVhZE9ubHkiLCJmdWxsQ29tcGlsZSIsInR5cGUiLCJsb29rdXAiLCJpc0luTm9kZU1vZHVsZXMiLCJyZWFkRmlsZSIsIm1pbWVUeXBlIiwiY29kZSIsImdldEhhc2hGb3JQYXRoIiwiaGFzaEluZm8iLCJzaG91bGRQYXNzdGhyb3VnaCIsImdldFBhc3N0aHJvdWdoQ29tcGlsZXIiLCJnZXQiLCJiaW5hcnlEYXRhIiwiY2FjaGUiLCJFcnJvciIsInNvdXJjZUNvZGUiLCJnZXRPckZldGNoIiwiY29tcGlsZVVuY2FjaGVkIiwiaW5wdXRNaW1lVHlwZSIsImlzRmlsZUJpbmFyeSIsImRlcGVuZGVudEZpbGVzIiwiY3R4Iiwic2hvdWxkQ29tcGlsZUZpbGUiLCJkZXRlcm1pbmVEZXBlbmRlbnRGaWxlcyIsImNvbXBpbGUiLCJyZXN1bHQiLCJzaG91bGRJbmxpbmVIdG1saWZ5IiwiaXNQYXNzdGhyb3VnaCIsImV4dGVuc2lvbiIsInJvb3REaXJlY3RvcnkiLCJzaG91bGRDb21waWxlIiwic2hvdWxkIiwiZiIsImNvbXBpbGVSZWFkT25seVN5bmMiLCJmdWxsQ29tcGlsZVN5bmMiLCJnemlwU3luYyIsIndyaXRlRmlsZVN5bmMiLCJyZWFkRmlsZVN5bmMiLCJnZXRIYXNoRm9yUGF0aFN5bmMiLCJnZXRTeW5jIiwiZ2V0T3JGZXRjaFN5bmMiLCJjb21waWxlVW5jYWNoZWRTeW5jIiwic2hvdWxkQ29tcGlsZUZpbGVTeW5jIiwiZGV0ZXJtaW5lRGVwZW5kZW50RmlsZXNTeW5jIiwiY29tcGlsZVN5bmMiLCJKU09OIiwiZ3VuemlwIiwicGFyc2UiLCJsb2FkRnJvbURhdGEiLCJjdXIiLCJmb3JFYWNoIiwiZ3VuemlwU3luYyIsImlzTWluaWZpZWQiLCJoYXNTb3VyY2VNYXAiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7QUFFQSxJQUFNQSxJQUFJQyxRQUFRLGdCQUFSLEVBQTBCLGdDQUExQixDQUFWOztBQUVBQSxRQUFRLGtCQUFSLEVBQTRCQyxJQUE1Qjs7QUFFQTtBQUNBLElBQU1DLGFBQWE7QUFDakIscUJBQW1CLElBREY7QUFFakIsNEJBQTBCLElBRlQ7QUFHakIsZUFBYSxJQUhJO0FBSWpCLGNBQVksSUFKSztBQUtqQixtQkFBaUIsSUFMQTtBQU1qQixzQkFBb0I7QUFOSCxDQUFuQjs7QUFTQTs7Ozs7Ozs7Ozs7Ozs7O0lBY3FCQyxZO0FBQ25COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBCQSx3QkFBWUMsWUFBWixFQUEwQkMsU0FBMUIsRUFBcUNDLGVBQXJDLEVBQXNEQyxZQUF0RCxFQUE2RjtBQUFBLFFBQXpCQyxnQkFBeUIsdUVBQU4s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