UNPKG

patternplate-server

Version:

Programmatically serve atomic patterns via a REST API

231 lines (170 loc) 9.06 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); 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 getPatterns = (() => { var _ref = _asyncToGenerator(function* (options, cache) { let cmds = arguments.length <= 2 || arguments[2] === undefined ? ['read', 'transform'] : arguments[2]; const settings = _extends({}, defaults, options); const id = settings.id; const base = settings.base; const config = settings.config; const factory = settings.factory; const transforms = settings.transforms; const filters = settings.filters; const log = settings.log; const isEnvironment = settings.isEnvironment; const path = (0, _path.resolve)(base, id); const staticCacheRoot = (0, _path.resolve)(process.cwd(), '.cache'); config.log = log; // No patterns to find here if (!(yield (0, _pathExists2.default)(path))) { debug(`Expected path ${path} for pattern ${id} does not exist.`); return []; } const search = (yield (0, _pathExists2.default)((0, _path.resolve)(path, 'pattern.json'))) ? (0, _path.resolve)(path, 'pattern.json') : path; // Get all pattern ids const paths = yield (0, _readTree2.default)(search, options.cache); const patternIDs = paths.filter(function (item) { return (0, _path.basename)(item) === 'pattern.json'; }).filter(function (item) { return isEnvironment ? true : !item.includes('@environments'); }).map(function (item) { return (0, _path.dirname)(item); }).map(function (item) { return (0, _path.relative)(options.base, item); }); // read and transform patterns at a concurrency of 5 return yield Promise.all(patternIDs.map((0, _throat2.default)(5, (() => { var _ref2 = _asyncToGenerator(function* (patternID) { // try to use the static cache const cached = cache.config.static ? yield (0, _getStaticCacheItem2.default)({ id: patternID, base: staticCacheRoot, filters: filters, cache: cache }) : null; if (cached) { return cached; } // load user environments const userEnvironments = yield (0, _getEnvironments2.default)(base, { cache: cache, log: log }); const free = typeof filters.environments === 'undefined' || filters.environments.length === 0; // get environments that match this pattern const matchingEnvironments = free ? (0, _getMatchingEnvironments2.default)(patternID, userEnvironments) : userEnvironments.filter(function (_ref3) { let name = _ref3.name; return filters.environments.includes(name); }); // get the available environment names for this pattern const environmentNames = matchingEnvironments.map(function (env) { return env.name; }); if (environmentNames.length > 0) { log.debug(`Applying environments ${_chalk2.default.bold(environmentNames.join(', '))} to ${_chalk2.default.bold(patternID)}`); } // merge environment configs // fall back to default environment if none is matching const environmentsConfig = matchingEnvironments.reduce(function (results, environmentConfig) { const environment = environmentConfig.environment; const misplacedKeys = (0, _lodash.omit)(environment, Object.keys(config)); const misplacedKeyNames = Object.keys(misplacedKeys); if (misplacedKeys.length > 0) { log.warn([`${_chalk2.default.yellow('[⚠ Deprecation ⚠ ]')} Found unexpected keys ${misplacedKeyNames} in environment`, `${environmentConfig.name}.environment. Placing keys other than ${Object.keys(config)} in`, `${environmentConfig.name}.environment is deprecated, move the keys to`, `${environmentConfig.name}.environment.transforms`].join(' ')); } // directly stuff mismatching keys into transforms config to retain previous behaviour return (0, _lodash.omit)((0, _lodash.merge)({}, results, (0, _lodash.omit)(environment, misplacedKeyNames), { transforms: misplacedKeys }), Object.keys(misplacedKeys).concat(Object.keys(_getEnvironments.defaultEnvironment))); }, _getEnvironments.defaultEnvironment); envDebug('applying env config to pattern %s', patternID); envDebug('%s', (0, _util.inspect)(environmentsConfig, { depth: null })); // merge the determined environments config onto the pattern config const patternConfiguration = (0, _lodash.merge)({}, config, environmentsConfig, { environments: environmentNames }); // Initialize the pattern object const initStart = new Date(); const filterString = JSON.stringify(filters); const filterStamp = _chalk2.default.grey(`[${filterString}]`); log.debug(`Initializing pattern "${patternID}" with filters: ${filterStamp}`); const pattern = yield factory(patternID, base, patternConfiguration, transforms, filters); log.debug(`Initialized pattern "${patternID}" ${_chalk2.default.grey(`[${new Date() - initStart}ms]`)}`); // Inject information about available environments const availableEnvironments = userEnvironments.map(function (env) { return (0, _lodash.pick)(env, ['name', 'displayName']); }); // Select environments that should be displayed const demoEnvironments = userEnvironments.filter(function (env) { return env.display; }).map(function (env) { return (0, _lodash.pick)(env, ['name', 'displayName']); }); pattern.manifest.availableEnvironments = availableEnvironments.length ? availableEnvironments : [(0, _lodash.pick)(_getEnvironments.defaultEnvironment, ['name', 'displayName'])]; pattern.manifest.demoEnvironments = demoEnvironments.length ? demoEnvironments : [(0, _lodash.pick)(_getEnvironments.defaultEnvironment, ['name', 'displayName'])]; // Determine dependening patterns const gettingDepending = yield (0, _getDependentPatterns2.default)(patternID, base, { cache: cache }); // Exit if we do not have to read if (!cmds.includes('read')) { // Inject depending pattern information pattern.manifest.dependentPatterns = yield gettingDepending; return pattern; } // Read the pattern files const readStart = new Date(); log.debug(`Reading pattern "${patternID}"`); yield pattern.read(); // Inject depending pattern information pattern.manifest.dependentPatterns = yield gettingDepending; log.debug(`Read pattern "${patternID}" ${_chalk2.default.grey(`[${new Date() - readStart}ms]`)}`); // Exit if we do not have to transform if (!cmds.includes('transform')) { return pattern; } // Transform pattern sources const transformStart = new Date(); log.debug(`Transforming pattern "${patternID}"`); const transformed = yield pattern.transform(!isEnvironment, isEnvironment); log.debug(`Transformed pattern "${patternID}" ${_chalk2.default.grey(`[${new Date() - transformStart}ms]`)}`); return transformed; }); return function (_x4) { return _ref2.apply(this, arguments); }; })()))); }); return function getPatterns(_x, _x2) { return _ref.apply(this, arguments); }; })(); var _path = require('path'); var _util = require('util'); var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk); var _pathExists = require('path-exists'); var _pathExists2 = _interopRequireDefault(_pathExists); var _lodash = require('lodash'); var _throat = require('throat'); var _throat2 = _interopRequireDefault(_throat); var _getEnvironments = require('./get-environments'); var _getEnvironments2 = _interopRequireDefault(_getEnvironments); var _getDependentPatterns = require('./get-dependent-patterns'); var _getDependentPatterns2 = _interopRequireDefault(_getDependentPatterns); var _getStaticCacheItem = require('./get-static-cache-item.js'); var _getStaticCacheItem2 = _interopRequireDefault(_getStaticCacheItem); var _getMatchingEnvironments = require('./get-matching-environments'); var _getMatchingEnvironments2 = _interopRequireDefault(_getMatchingEnvironments); var _readTree = require('../filesystem/read-tree'); var _readTree2 = _interopRequireDefault(_readTree); 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) { 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"); }); }; } const envDebug = (0, _util.debuglog)('environments'); const debug = (0, _util.debuglog)('get-patterns'); const defaults = { isEnvironment: false, filters: {}, log: function log() {} }; exports.default = getPatterns; module.exports = exports['default'];