UNPKG

patternplate-server

Version:

Programmatically serve atomic patterns via a REST API

299 lines (218 loc) 10.4 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _assert = require('assert'); var _assert2 = _interopRequireDefault(_assert); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _util = require('util'); var _boxen = require('boxen'); var _boxen2 = _interopRequireDefault(_boxen); var _lodash = require('lodash'); var _fp = require('lodash/fp'); var _minimatch = require('minimatch'); var _minimatch2 = _interopRequireDefault(_minimatch); var _ora = require('ora'); var _ora2 = _interopRequireDefault(_ora); var _throat = require('throat'); var _throat2 = _interopRequireDefault(_throat); var _transforms = require('../../../library/transforms'); var _pattern = require('../../../library/pattern'); var _copyStatic = require('../common/copy-static'); var _copyStatic2 = _interopRequireDefault(_copyStatic); var _getEnvironments = require('../../../library/utilities/get-environments'); var _getEnvironments2 = _interopRequireDefault(_getEnvironments); var _getPatternMtimes = require('../../../library/utilities/get-pattern-mtimes'); var _getPatternMtimes2 = _interopRequireDefault(_getPatternMtimes); var _getPatterns = require('../../../library/utilities/get-patterns'); var _getPatterns2 = _interopRequireDefault(_getPatterns); var _writeSafe = require('../../../library/filesystem/write-safe'); var _writeSafe2 = _interopRequireDefault(_writeSafe); 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 where = `Configure it at configuration/patternplate-server/tasks.js.`; exports.default = (() => { var _ref = _asyncToGenerator(function* (application, settings) { if (!settings) { throw new Error('build-bundles is not configured in .tasks'); } (0, _assert2.default)(typeof settings.patterns === 'object', `build-commonjs needs a valid patterns configuration. ${where} build-bundles.patterns`); (0, _assert2.default)(typeof settings.patterns.formats === 'object', `build-commonjs needs a valid patterns.formats configuration. ${where} build-bundles.patterns.formats`); (0, _assert2.default)(typeof settings.transforms === 'object', `build-commonjs needs a valid transforms configuration. ${where} build-bundles.transforms`); const filterEnvironments = settings.env ? function (env) { return settings.env.includes(env.name); } : function () { return true; }; const debug = (0, _util.debuglog)('bundles'); const spinner = (0, _ora2.default)().start(); debug('calling bundles with'); debug(settings); const cwd = process.cwd(); const base = _path2.default.resolve(cwd, 'patterns'); const buildBase = _path2.default.resolve(cwd, 'build', `build-bundles`); const cache = application.cache; const log = application.log; const transforms = application.transforms; const factory = application.pattern.factory; // Override pattern config settings.patterns.formats = (0, _pattern.normalizeFormats)(settings.patterns.formats); application.configuration.patterns = settings.patterns; // Reinitialize transforms application.configuration.transforms = settings.transforms || {}; application.transforms = (yield (0, _transforms.loadTransforms)(settings.transforms || {}))(application); const warnings = []; const warn = application.log.warn; application.log.warn = function () { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (args.some(function (arg) { return arg.includes('Deprecation'); })) { warnings.push(args); return; } warn.apply(undefined, args); }; // Get environments const loadedEnvironments = yield (0, _getEnvironments2.default)(base, { cache: cache, log: log }); // Environments have to apply on all patterns const environments = loadedEnvironments.filter(filterEnvironments).map(function (environment) { environment.applyTo = '**/*'; return environment; }); // Get available patterns const availablePatterns = yield (0, _getPatternMtimes2.default)(base, { resolveDependencies: true }); let envCount = 1; const envs = environments.filter(function (environment) { return environment.include && environment.include.length; }); spinner.stop(); const envMaxLength = envs.map(function (e) { return e.name.length; }).reduce(function (a, b) { return a > b ? a : b; }, 0); const envMaxPad = (0, _fp.padEnd)(envMaxLength + 1); const envCountPad = (0, _fp.padStart)(String(envs.length).length); // For each environment with an include key, build a bundle for each enabled format yield Promise.all(envs.map((0, _throat2.default)(1, (() => { var _ref2 = _asyncToGenerator(function* (environment) { const envConfig = environment.environment; const include = environment.include; const exclude = environment.exclude; const formats = environment.formats; const includePatterns = include || []; const excludePatterns = exclude || ['@']; const envSpinner = (0, _ora2.default)().start(); const envr = `${envMaxPad(environment.name)} [env: ${envCountPad(envCount)}/${envs.length}]`; // Get patterns matching the include config const includedPatterns = availablePatterns.filter(function (available) { const id = available.id; return includePatterns.some(function (pattern) { return (0, _minimatch2.default)(id, pattern); }) && !excludePatterns.concat('@environments/**/*').some(function (pattern) { return (0, _minimatch2.default)(id, pattern); }); }); if (!includedPatterns.length) { application.log.warn(`No patterns to read for environment ${environment.name}. Check the .includes key of the environment configuration.`); } // Merge environment config into transform config const config = (0, _lodash.merge)({}, { patterns: settings.patterns, transforms: settings.transforms }, envConfig, { environments: [environment.name] }); const filters = (0, _lodash.merge)({}, settings.filters, { inFormats: formats, environments: [environment.name] }); let read = 0; const readPad = (0, _fp.padStart)(String(includedPatterns.length).length); // build all patterns matching the include config const readPatterns = yield Promise.all(includedPatterns.map((0, _throat2.default)(1, (() => { var _ref3 = _asyncToGenerator(function* (pattern) { const id = pattern.id; envSpinner.text = `${envr}: read [patterns: ${readPad(read)}/${includedPatterns.length}] ${pattern.id}`; var _ref4 = yield (0, _getPatterns2.default)({ id: id, base: base, config: config, factory: factory, transforms: transforms, log: log, filters: filters, environment: environment }, cache, ['read']); var _ref5 = _slicedToArray(_ref4, 1); const result = _ref5[0]; read += 1; return result; }); return function (_x4) { return _ref3.apply(this, arguments); }; })()))); // construct a virtual pattern const bundlePattern = yield factory(environment.name, base, config, transforms, filters, cache); envSpinner.text = `${envr}: read ✔`; // add the built patterns as dependencies const env = { name: environment.name, version: environment.version }; envSpinner.text = `${envr}: read ✔ | transform`; bundlePattern.inject(env, readPatterns); // build the bundle const builtBundle = yield bundlePattern.transform(); envSpinner.text = `${envr}: read ✔ | transform ✔`; let writeCount = 0; const artifacts = Object.entries(builtBundle.results); // write the bundle const writing = artifacts.map((0, _throat2.default)(1, (() => { var _ref6 = _asyncToGenerator(function* (entry) { var _entry = _slicedToArray(entry, 2); const resultName = _entry[0]; const result = _entry[1]; const resultPath = _path2.default.resolve(buildBase, resultName.toLowerCase(), `${environment.name}.${result.out}`); envSpinner.text = `${envr}: read ✔ | transform ✔ | write [files: ${writeCount}/${artifacts.length}]`; const written = yield (0, _writeSafe2.default)(resultPath, result.buffer); writeCount += 1; return written; }); return function (_x5) { return _ref6.apply(this, arguments); }; })())); yield Promise.all(writing); envSpinner.text = `${envr}: read ✔ | transform ✔ | write ✔`; envSpinner.succeed(); envSpinner.stop(); envCount += 1; }); return function (_x3) { return _ref2.apply(this, arguments); }; })()))); const copySpinner = (0, _ora2.default)().start(); copySpinner.text = `copying static files`; yield (0, _copyStatic2.default)(cwd, buildBase); copySpinner.text = `copied static files`; copySpinner.succeed(); copySpinner.stop(); const messages = (0, _lodash.uniq)(warnings).map(function (warning) { return warning.join(' '); }); messages.forEach(function (message) { console.log((0, _boxen2.default)(message, { borderColor: 'yellow', padding: 1 })); }); }); return function (_x, _x2) { return _ref.apply(this, arguments); }; })(); module.exports = exports['default'];