UNPKG

patternplate-server

Version:

Programmatically serve atomic patterns via a REST API

208 lines (154 loc) 6.94 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"); } }; }(); let getPatternDemo = (() => { var _ref = _asyncToGenerator(function* (application, id, filters, environment) { const getFile = (0, _getPatternSource2.default)(application); filters.outFormats = ['html']; var _ref2 = yield (0, _getPatternRetriever2.default)(application)(id, filters, environment, ['read']); var _ref3 = _slicedToArray(_ref2, 1); const pattern = _ref3[0]; if (!pattern) { return null; } const order = ['demo', 'index']; const path = Object.values(pattern.files).sort(function (a, b) { return order.indexOf(a.basename) - order.indexOf(b.basename); }).map(function (file) { return file.path; })[0]; if (!path) { return null; } const content = yield getFile(path, 'transformed', environment); const formats = application.configuration.patterns.formats; const automount = selectAutoMount(application, pattern); if (automount) { yield (0, _getComponent2.default)(application, pattern.id, environment); } const render = getRenderer(formats, automount); const resources = (application.resources || []).filter(function (_ref4) { let p = _ref4.pattern; return p === null || p === pattern.id; }); return render(content.body, pattern, resources); }); return function getPatternDemo(_x, _x2, _x3, _x4) { return _ref.apply(this, arguments); }; })(); var _lodash = require('lodash'); var _getPatternRetriever = require('./utilities/get-pattern-retriever'); var _getPatternRetriever2 = _interopRequireDefault(_getPatternRetriever); var _getPatternSource = require('./get-pattern-source'); var _getPatternSource2 = _interopRequireDefault(_getPatternSource); var _getComponent = require('./get-component'); var _getComponent2 = _interopRequireDefault(_getComponent); var _layouts = require('../application/layouts'); var _layouts2 = _interopRequireDefault(_layouts); 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"); }); }; } exports.default = getPatternDemo; function selectAutoMount(a, p) { const transform = a.configuration.transforms['react-to-markup'] || {}; const pattern = selectReactToMarkup(selectManifestOptions(p)); const settings = (0, _lodash.merge)({}, transform.opts, pattern.opts); return settings.automount || false; } function selectReactToMarkup(o) { return o['react-to-markup'] || {}; } function selectManifestOptions(p) { return p.manifest.options || {}; } function getRenderer(formats) { let component = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; return (content, result, resources) => { const transforms = result.config.transforms; const styleFormat = getFormat(formats, transforms, 'style'); const scriptFormat = getFormat(formats, transforms, 'script'); const styleReference = getUriByFormat(result, styleFormat); const markupContent = [{ content: content }]; const styleContent = resources.filter(r => r.type === 'css' && !r.reference); const scriptContent = resources.filter(r => r.type === 'js' && !r.reference); const scripts = component ? [] : [{ uri: getUriByFormat(result, scriptFormat) }]; const styles = [{ id: styleReference }].filter(i => i.id); const markupReferences = (0, _lodash.uniqBy)(resources.filter(r => r.type === 'html' && r.reference), 'id'); const styleReferences = (0, _lodash.uniqBy)([].concat(_toConsumableArray(styles), _toConsumableArray(resources.filter(r => r.type === 'css' && r.reference))), 'id'); const scriptReferences = (0, _lodash.uniqBy)([].concat(_toConsumableArray(resources.filter(r => r.type === 'js' && r.reference)), scripts), 'id'); return (0, _layouts2.default)({ title: result.id, content: { markup: markupContent, style: styleContent, script: scriptContent }, reference: { markup: markupReferences, style: styleReferences, script: scriptReferences } }); }; } const formatNames = { markup: 'html', style: 'css', script: 'js' }; function getUriByFormat(pattern) { let format = arguments.length <= 1 || arguments[1] === undefined ? '' : arguments[1]; if (!format) { return null; } const outFormats = pattern.outFormats || []; const type = format.toLowerCase(); const match = outFormats.find(o => o.type === type); if (match) { return `./index.${match.extension}`; } return null; } function getFormat(formats, transforms, type) { const entries = Object.entries(formats); // try to get a format with matching outFormat // markup => html // style => css // script => js const formatName = formatNames[type]; const found = entries.find(findByOutFormat(formatName, transforms)); if (found) { return (found[1] || {}).name || found[0]; } // Legacy get format by name // {name: 'Format'} const legacy = entries.find(findByName(type)); if (legacy) { return (legacy[0] || {}).name || legacy[0]; } return null; } function findByName(name) { return entry => entry[1].name.toLowerCase() === name; } function findByOutFormat(name, transforms) { return entry => { const outFormat = getOutFormat(entry, transforms); return name === outFormat; }; } function getOutFormat(entry, transforms) { const entryTransforms = entry[1].transforms || []; // If no transforms are configured // use the inbound transform extension as outFormat if (!entryTransforms.length) { return entry[0]; } const transformName = entryTransforms[entryTransforms.length - 1]; const transformConfig = transforms[transformName]; return transformConfig.outFormat; } module.exports = exports['default'];