UNPKG

motion

Version:

motion - moving development forward

323 lines (252 loc) 7.83 kB
exports.__esModule = true; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { var callNext = step.bind(null, 'next'); var callThrow = step.bind(null, 'throw'); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(callNext, callThrow); } } callNext(); }); }; } var _disk = require('./disk'); var _disk2 = _interopRequireDefault(_disk); var _libHandleError = require('./lib/handleError'); var _libHandleError2 = _interopRequireDefault(_libHandleError); var _opts = require('./opts'); var _opts2 = _interopRequireDefault(_opts); var _libFns = require('./lib/fns'); var _util = require('util'); var _util2 = _interopRequireDefault(_util); var relative = function relative(f) { return _libFns.path.relative(_baseDir, f).replace('.motion/.internal/out/', ''); }; var meta = {}; var previousCache = undefined; var cache = { files: {}, imports: [], fileMeta: {} }; var _baseDir = ''; var deleteFileCbs = []; var deleteViewCbs = []; var addViewCbs = []; function onSetExported(file, val) { // debugger // TODO: remove from either out or add to out } function onDeleteFile(_ref) { var name = _ref.name; var file = _ref.file; var state = _ref.state; deleteFileCbs.forEach(function (cb) { return cb({ name: name, file: file, state: state }); }); } function onDeleteViews(views) { views.forEach(function (view) { return deleteViewCbs.forEach(function (cb) { return cb(view); }); }); } function onAddViews(views) { views.forEach(function (view) { return addViewCbs.forEach(function (cb) { return cb(view); }); }); } var files = function files(file) { return cache.files[relative(file)]; }; var Cache = { relative: relative, init: _asyncToGenerator(function* () { if (!_opts2['default']('reset')) { try { // read in previous cache var state = yield _disk2['default'].state.read(); previousCache = state.cache; Cache.setBaseDir(_opts2['default']('appDir')); } catch (e) { _libHandleError2['default'](e); } } previousCache = previousCache || { files: {} }; }), setBaseDir: function setBaseDir(dir) { _baseDir = _libFns.path.resolve(dir); _libFns.log.cache('baseDir', _baseDir); }, baseDir: function baseDir() { return _baseDir; }, name: function name(file) { return relative(file); }, add: function add(file) { if (!file) return; var n = relative(file); cache.files[n] = cache.files[n] || {}; cache.files[n].added = Date.now(); return cache.files[n]; }, update: function update(file) { Cache.setWritten(file, Date.now()); Cache.removeError(file); }, get: function get(file) { return files(file); }, getAll: function getAll() { return cache.files; }, getPrevious: function getPrevious(file) { return previousCache.files[relative(file)]; }, restorePrevious: function restorePrevious(file) { var n = relative(file); cache.files[n] = previousCache.files[n]; }, onDeleteFile: function onDeleteFile(cb) { deleteFileCbs.push(cb); }, onDeleteView: function onDeleteView(cb) { deleteViewCbs.push(cb); }, onAddView: function onAddView(cb) { addViewCbs.push(cb); }, remove: function remove(file) { var name = relative(file); var state = cache.files[name]; _libFns.log.cache('remove', name); delete cache.files[name]; onDeleteFile({ file: file, name: name, state: state }); }, setViews: function setViews(file, views) { if (!file) return; var cFile = files(file); onDeleteViews(_libFns._.difference(cFile.views, views)); // onAddViews(_.difference(views, cFile.views)) cFile.views = views; _libFns.log.cache('setViews', views); }, setFileMeta: function setFileMeta(file, fileMeta) { meta[relative(file)] = fileMeta; }, getFileMeta: function getFileMeta(file) { return meta[relative(file)]; }, setFileSrc: function setFileSrc(file, src) { files(file).src = src; }, isInternal: function isInternal(file) { var f = files(file); return f && f.isInternal; }, setFileInternal: function setFileInternal(file, val) { var name = relative(file); var f = cache.files[name]; if (!f) return; var isInternal = f.isInternal; cache.files[name].isInternal = val; if (isInternal != val) onSetExported(name, val); }, getExported: function getExported() { _libFns.log.cache('cache', 'getExported', cache.files); return Object.keys(cache.files).map(function (name) { return cache.files[name].isInternal ? name : null; }).filter(function (f) { return f != null; }); }, setFileImports: function setFileImports(file, imports) { var cacheFile = Cache.get(file) || Cache.add(file); var externals = imports; var internals = _libFns._.remove(externals, function (n) { return n && n.charAt(0) == '.'; }); cacheFile.externals = externals; cacheFile.internals = internals; }, getFile: function getFile(file) { return files(file); }, getViews: function getViews(file) { return files(file).views; }, _getFileKeys: function _getFileKeys(key) { var result = _libFns._.flatten(Object.keys(cache.files).map(function (file) { return cache.files[file][key]; })).filter(function (x) { return !!x; }); return result; }, // npm getExternals: function getExternals(file) { if (!file) return Cache._getFileKeys('externals'); return files(file).externals; }, // ./local getInternals: function getInternals(file) { if (!file) return Cache._getFileKeys('internals'); return files(file).internals; }, // npm + local getImports: function getImports(file) { return [].concat(cache.getInterals(file), cache.getExternals(file)); }, getInternalImporters: function getInternalImporters() { return Object.keys(cache.files).map(function (file) { var data = cache.files[file]; return data.internals && data.internals.length && file; }).filter(function (x) { return !!x; }); }, addError: function addError(file, error) { if (!n) return; var n = relative(file); if (!cache.files[n]) Cache.add(n); cache.files[n].error = error; }, removeError: function removeError(file) { if (files(file)) files(file).error = null; }, getLastError: function getLastError() { var paths = Object.keys(cache.files); var errors = paths.map(function (p) { return cache.files[p].error; }).filter(function (e) { return !!e; }); if (errors.length) { var _ret = (function () { var latest = errors[0]; errors.forEach(function (err) { if (err.timestamp > latest.timestamp) latest = err; }); return { v: latest }; })(); if (typeof _ret === 'object') return _ret.v; } return null; }, setWritten: function setWritten(file, time) { var f = files(file); _libFns.log.cache('setWritten', time); if (f) f.writtenAt = time; }, serialize: function serialize() { _libFns.log.cache('serialize'); _disk2['default'].state.write(function (state, write) { state.cache = cache; _libFns.log.cache('writing cache'); write(state); }); }, debug: function debug() { print(_util2['default'].inspect(cache, false, 10)); } }; exports['default'] = Cache; module.exports = exports['default'];