All files / packages/design-system/scripts/ui index.js

0% Statements 0/66
0% Branches 0/8
0% Functions 0/33
0% Lines 0/57

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                                                                                                                                                                                                                                                 
// 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('data.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('data.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 ui = () =>
  uiFromComments().map(u =>
    u.map((group, type) =>
      group.map((item, componentId) =>
        mapTree(item, itm => addShowcaseAndDocPaths(type, componentId, itm))
      )
    )
  );
 
/**
 * 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
};