UNPKG

patternplate-server

Version:

Programmatically serve atomic patterns via a REST API

189 lines (141 loc) 6.2 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.getModifiedFiles = undefined; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; let readManifest = (() => { var _ref = _asyncToGenerator(function* (path) { return yield (0, _sander.readFile)((0, _path.resolve)(path, 'pattern.json')).then(function (content) { return JSON.parse(content.toString('utf-8')); }); }); return function readManifest(_x) { return _ref.apply(this, arguments); }; })(); let getPatternFilesMtime = (() => { var _ref2 = _asyncToGenerator(function* (files) { const tasks = files.map((() => { var _ref3 = _asyncToGenerator(function* (file) { var _ref4 = yield (0, _sander.stat)(file); const mtime = _ref4.mtime; return mtime; }); return function (_x3) { return _ref3.apply(this, arguments); }; })()); return yield Promise.all(tasks); }); return function getPatternFilesMtime(_x2) { return _ref2.apply(this, arguments); }; })(); let getModifiedFiles = (() => { var _ref5 = _asyncToGenerator(function* (mtime, files) { const mtimes = yield getPatternFilesMtime(files); return files.filter(function (file, index) { return mtimes[index].getTime() > mtime; }); }); return function getModifiedFiles(_x4, _x5) { return _ref5.apply(this, arguments); }; })(); let getPatternMtimes = (() => { var _ref6 = _asyncToGenerator(function* (search, options) { const paths = yield (0, _readTree2.default)(search); const settings = _extends({}, defaults, options); const filter = getFilter(settings.filters); const items = paths.filter(function (item) { return (0, _path.basename)(item) === 'pattern.json'; }).filter(function (item) { return !item.includes('@environments'); }).map(function (item) { const id = (0, _patternplateTransformsCore.pathToId)(search, item); const path = (0, _path.dirname)(item); const files = (0, _readTree2.default)(path); const manifest = readManifest(path); return { id: id, path: path, files: files, manifest: manifest }; }); const readTasks = items.map((0, _throat2.default)(5, (() => { var _ref7 = _asyncToGenerator(function* (item) { const mtimes = yield getPatternFilesMtime((yield item.files)); const mtime = yield getLatestMtime(mtimes); const files = (yield item.files).filter(filter); return _extends({}, item, { files: files, mtime: mtime, mtimes: mtimes }); }); return function (_x9) { return _ref7.apply(this, arguments); }; })())); const readPatterns = yield Promise.all(readTasks); const measurePatterns = readPatterns.filter(function (readPattern) { return readPattern.files.length > 1; }).map((() => { var _ref8 = _asyncToGenerator(function* (readPattern) { readPattern.manifest = yield readPattern.manifest; const dependencyMtimes = settings.resolveDependencies ? getDependencyMtimes(readPattern, readPatterns) : []; const mtime = getLatestMtime([readPattern.mtime].concat(_toConsumableArray(dependencyMtimes))); readPattern.mtime = mtime; return readPattern; }); return function (_x10) { return _ref8.apply(this, arguments); }; })()); return yield Promise.all(measurePatterns); }); return function getPatternMtimes(_x7, _x8) { return _ref6.apply(this, arguments); }; })(); var _path = require('path'); var _sander = require('sander'); var _lodash = require('lodash'); var _patternplateTransformsCore = require('patternplate-transforms-core'); var _throat = require('throat'); var _throat2 = _interopRequireDefault(_throat); var _readTree = require('../filesystem/read-tree'); var _readTree2 = _interopRequireDefault(_readTree); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } } function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { 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 { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } function getLatestMtime(mtimes) { const times = mtimes.map(mtime => { return { stamp: mtime.getTime(), date: mtime }; }); const latest = times.sort((a, b) => b.stamp - a.stamp)[0]; return latest.date; } function getDependencyMtimes(pattern, patterns) { const manifest = pattern.manifest; const dependencyIds = Object.values(manifest.patterns || {}); return dependencyIds.map(id => (0, _lodash.find)(patterns, { id: id })).reduce((mtimes, dependency) => { if (!dependency) { return mtimes; } return [].concat(_toConsumableArray(mtimes), [dependency.mtime], _toConsumableArray(getDependencyMtimes(dependency))); }, []); } function isPatternJson(filePath) { return (0, _path.basename)(filePath) === 'pattern.json'; } function getFilter() { let filters = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; const inFormats = Array.isArray(filters.inFormats) ? filters.inFormats : []; const baseNames = Array.isArray(filters.baseNames) ? filters.baseNames : []; const filterByInFormat = inFormats.length ? filePath => inFormats.includes((0, _path.extname)(filePath).slice(1)) : filePath => filePath; const filterByBasename = baseNames.length ? filePath => inFormats.includes((0, _path.extname)(filePath).slice(1)) : filePath => filePath; return filePath => isPatternJson(filePath) || filterByBasename(filePath) && filterByInFormat(filePath); } const defaults = { resolveDependencies: false }; exports.default = getPatternMtimes; exports.getModifiedFiles = getModifiedFiles;