Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 12x 183x 3x 183x 183x 183x 3x 6x 3x 18x 3x 159x 3x 3x 3x 6x 18x 3x 159x 159x 159x 159x 159x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 4x 3x 3x 3x 3x 3x 3x | // Copyright (c) 2015-present, salesforce.com, inc. All rights reserved
// Licensed under BSD 3-Clause - see LICENSE.txt or git.io/sfdc-license
const Task = require('../../shared/utils/task');
const gulp = require('gulp');
const gulpFile = require('gulp-file');
const path = require('path');
const paths = require('../helpers/paths');
const fs = require('fs');
const I = require('immutable-ext');
const Either = require('../../shared/utils/either');
const { Right, Left } = Either;
const createParser = require('@salesforce-ux/design-system-parser');
const { mapTree, toList } = require('../../shared/utils/tree');
const getComments = require('./comments');
const getShowcase = require('./showcase');
const isVariant = x => x.getIn(['annotations', 'variant']);
const isUtil = x => x.getIn(['annotations', 'utility']);
const variants = c => toList(c).filter(isVariant);
const toMap = f => (ac, c) => ac.set(c.get('id'), f(c.get('id')).get());
const exists = p => (fs.existsSync(p) ? Right(p) : Left(null));
const pathIfExists = filepath =>
exists(path.resolve(paths.root, filepath))
.map(() => filepath)
.getOrElse(null);
const utilityExamplePath = utilId =>
pathIfExists(`./ui/utilities/${utilId}/example.jsx`);
const componentExamplePath = (componentId, variantId) =>
pathIfExists(`./ui/components/${componentId}/${variantId}/example.jsx`);
const docPath = (type, componentId) =>
pathIfExists(`./ui/${type}/${componentId}/docs.mdx`);
const createUI = parser =>
I.Map({
components: parser.components().reduce(toMap(parser.component), I.Map()),
utilities: parser.utilities().reduce(toMap(parser.utility), I.Map())
});
const showcasePath = (componentId, item) =>
isVariant(item) || isUtil(item)
? isUtil(item) // skips util's children since they aren't utils...
? utilityExamplePath(componentId)
: componentExamplePath(componentId, item.get('id'))
: null;
const addShowcaseAndDocPaths = (type, componentId, item) => {
const docs = docPath(type, item.get('id'));
const showcase = showcasePath(componentId, item);
return item
.set('docPath', docs)
.set('showcasePath', showcase)
.set('showcase', getShowcase(showcase));
};
const uiFromComments = () =>
getComments()
.map(createParser)
.map(createUI);
const buildUI = () =>
uiFromComments().map(u =>
u.map((group, type) =>
group.map((item, componentId) =>
mapTree(item, itm => addShowcaseAndDocPaths(type, componentId, itm))
)
)
);
// Parsing every component's annotations takes ~1.5s and `dist` asks for it
// several times (sanitized, writeUI, and twice in writeLibrary). The sources
// don't change during a build process, so cache the first successful result.
// Return values are passed through because `uiJson` reads fork()'s result.
let cachedUI = null;
const ui = () =>
new Task((reject, resolve) => {
Eif (cachedUI) return resolve(cachedUI);
return buildUI().fork(reject, result => {
cachedUI = result;
return resolve(result);
});
});
/**
* Get json from parsed comments
* uiJson : Task -> string
*/
const uiJson = () =>
ui()
.map(x => JSON.stringify(x, null, 2))
.chain(json => new Task((rej, res) => json))
.fork(y => y);
/**
* Basic UIJson Data - sans showcase and doc paths
*/
const uiJsonBasic = () =>
uiFromComments()
.map(x => JSON.stringify(x, null, 2))
.chain(json => new Task((rej, res) => json))
.fork(y => y);
const writeToDist = () =>
ui()
.map(x => JSON.stringify(x, null, 2))
.chain(
json =>
new Task((reject, resolve) =>
gulpFile('ui.json', json, { src: true })
.pipe(gulp.dest(paths.dist))
.on('finish', resolve)
.on('error', reject)
)
);
module.exports = {
ui,
uiJson,
uiJsonBasic,
isVariant,
variants,
writeToDist,
componentExamplePath,
utilityExamplePath
};
|