UNPKG

5.87 kBJavaScriptView Raw
1#!/usr/bin/env node
2
3/*
4Copyright (c) 2018-2020 Uber Technologies, Inc.
5
6This source code is licensed under the MIT license found in the
7LICENSE file in the root directory of this source tree.
8*/
9
10/* eslint-disable flowtype/require-valid-file-annotation */
11
12/* eslint-env node*/
13"use strict";
14
15var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
16
17function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
19function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
20
21function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
22
23function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
24
25var fs = require('fs');
26
27var path = require('path');
28
29var prettier = require('prettier');
30
31function capitalize(str) {
32 return str.charAt(0).toUpperCase() + str.slice(1);
33}
34
35function pascalCase(str) {
36 return str.split('-').map(capitalize).join('');
37}
38
39function titleCase(str) {
40 return str.split('-').map(capitalize).join(' ');
41} // handle the exception from Chevrons, where we do not want the word Chevron in the title
42
43
44function removeChevronFromTitle(str) {
45 return str.replace('Chevron ', '');
46} // transform svg string to properly styled jsx
47
48
49function reactify(svgString) {
50 return svgString.replace(/<!--.*-->\n/gm, '').replace(/<\/?svg[^>]*>/gm, '').replace(/^\s*\n/gm, '').replace(/\n$/, '').replace(/\t/g, ' ').replace(/fill-rule/g, 'fillRule').replace(/clip-rule/g, 'clipRule').replace(/fill-opacity/g, 'fillOpacity').trim();
51}
52
53function cleanOldIcons() {
54 var allJsFiles = fs.readdirSync(path.resolve(__dirname)).filter(function (f) {
55 return f.endsWith('.js');
56 });
57 allJsFiles.forEach(function (f) {
58 if (fs.readFileSync(path.resolve(__dirname, f), 'utf8').match(/^\/\/ BASEUI-GENERATED-REACT-ICON/m)) {
59 fs.unlinkSync(path.resolve(__dirname, f));
60 }
61 });
62}
63
64function generateNewIcons() {
65 var iconTemplate, svgs, prettierOptions, iconExports;
66 return _regenerator.default.async(function generateNewIcons$(_context2) {
67 while (1) {
68 switch (_context2.prev = _context2.next) {
69 case 0:
70 iconTemplate = fs.readFileSync(path.resolve(__dirname, './icon-template.txt'), 'utf8');
71 svgs = fs.readdirSync(path.resolve(__dirname, './svg')).filter(function (f) {
72 return f.endsWith('.svg');
73 });
74 _context2.next = 4;
75 return _regenerator.default.awrap(prettier.resolveConfig(__dirname));
76
77 case 4:
78 _context2.t0 = _context2.sent;
79
80 if (_context2.t0) {
81 _context2.next = 7;
82 break;
83 }
84
85 _context2.t0 = {};
86
87 case 7:
88 prettierOptions = _context2.t0;
89 iconExports = [];
90 svgs.forEach(function _callee(svgFilename) {
91 var svgFile, componentName, svgFileContents, title, viewboxRegex, viewBox, result;
92 return _regenerator.default.async(function _callee$(_context) {
93 while (1) {
94 switch (_context.prev = _context.next) {
95 case 0:
96 svgFile = svgFilename.split('.')[0];
97 componentName = pascalCase(svgFile);
98 iconExports.push("export {default as ".concat(componentName, "} from './").concat(svgFile, ".js';"));
99 svgFileContents = fs.readFileSync(path.resolve(__dirname, "./svg/".concat(svgFilename)), 'utf8');
100 title = removeChevronFromTitle(titleCase(svgFile));
101 viewboxRegex = svgFileContents.match(/viewBox="([^"]+)"/);
102 viewBox = null;
103
104 if (viewboxRegex && viewboxRegex[1]) {
105 viewBox = viewboxRegex[1];
106 }
107
108 result = iconTemplate.replace('%%ICON_PATH%%', reactify(svgFileContents)).replace(new RegExp('%%ICON_NAME%%', 'g'), componentName).replace(new RegExp('%%SVG_TITLE%%', 'g'), title).replace(new RegExp('%%SVG_VIEWBOX%%', 'g'), viewBox && viewboxRegex[1] ? "viewBox=\"".concat(viewBox, "\"") : '');
109 fs.writeFileSync(path.resolve(__dirname, "./".concat(svgFile, ".js")), prettier.format(result, _objectSpread({
110 parser: 'flow'
111 }, prettierOptions)));
112
113 case 10:
114 case "end":
115 return _context.stop();
116 }
117 }
118 });
119 });
120 fs.writeFileSync(path.resolve(__dirname, "./icon-exports.js"), "/*\nCopyright (c) 2018-2020 Uber Technologies, Inc.\n\nThis source code is licensed under the MIT license found in the\nLICENSE file in the root directory of this source tree.\n*/\n// @flow\n".concat(iconExports.join('\n'), "\n")); // eslint-disable-next-line no-console
121
122 console.log("Wrote ".concat(svgs.length, " icon(s)"));
123
124 case 12:
125 case "end":
126 return _context2.stop();
127 }
128 }
129 });
130}
131
132cleanOldIcons();
133generateNewIcons();
\No newline at end of file