diff --git a/build/configs/css/.csslintrc b/build/configs/css/.csslintrc index ee16358..ce5fb86 100644 --- a/build/configs/css/.csslintrc +++ b/build/configs/css/.csslintrc @@ -15,7 +15,7 @@ "rule-empty-line-before": [ "always", { "except": ["first-nested"], "ignore": ["after-comment"] - } ], - "unit-whitelist": ["px", "em", "rem", "%", "deg", "vmin", "vmax", "vw", "vh", "ex", "ch", "in", "pt", "s"] + }], + "unit-whitelist": ["px", "em", "rem", "%", "deg", "vmin", "vmax", "vw", "vh", "ex", "ch", "in", "pt", "s", "ms", "cm", "fr"] } } diff --git a/build/configs/css/css.config.js b/build/configs/css/css.config.js index fbb2467..dbfb5ff 100644 --- a/build/configs/css/css.config.js +++ b/build/configs/css/css.config.js @@ -42,6 +42,7 @@ module.exports = { }), new POSTCSSInOut({ preBuild: [ + Plugins.MetricsCSS(), // Captures hoisted up metrics to the Unslated guide tools and examples imports({ // Bring resolve context to @import / url() usage (see: build/config/alias.config.js) resolve: (id, basedir) => { return ResolverFactory.createResolver({ @@ -66,7 +67,6 @@ module.exports = { Plugins.media(), // Allows for custom media queries Plugins.roots(), // Cleans up leftover :root declarations. Plugins.comments(), // Cleans up comments. - Plugins.MetricsCSS(), (Package.optimize.css) // Minification of our final CSS results. ? Plugins.minify() : () => {} diff --git a/build/configs/css/css.config.plugins.js b/build/configs/css/css.config.plugins.js index 7e95082..e4baec1 100644 --- a/build/configs/css/css.config.plugins.js +++ b/build/configs/css/css.config.plugins.js @@ -583,11 +583,11 @@ const MetricsCSS = postcss.plugin('postcss-metrics', (options) => { } }; - return root => { - const __metrics = process.cssMetricsReset(); - - let metrics = {...__metrics}; + if (!process.cssMetrics) { + process.cssMetrics = {}; + } + return (root) => { let ids = []; let classes = []; let float = []; @@ -611,7 +611,11 @@ const MetricsCSS = postcss.plugin('postcss-metrics', (options) => { let marginLeft = []; let marginRight = []; - if (root.source.input.css.indexOf('.guide__menu') === -1) { + if (root.source.input.file.indexOf('guide') === -1) { + const fileName = path.basename(root.source.input.file).replace('.css', ''); + process.cssMetrics[fileName] = process.cssMetricsReset(); + const metrics = process.cssMetrics[fileName]; + const pseudoClasses = [ ':active', ':checked', @@ -655,37 +659,37 @@ const MetricsCSS = postcss.plugin('postcss-metrics', (options) => { ]; root.walkRules(rule => { - metrics.rules++; + process.cssMetrics[fileName].rules++; - if (rule.selector) { + if (rule.selector) { /* Selectors */ - metrics.selectors++; + process.cssMetrics[fileName].selectors++; /* Ids */ if (rule.selector.toString().indexOf('#') !== -1) { ids.push(rule.selector.toString()); } - metrics.ids = reduceDuplicates(ids).join(' ').split('#').length - 1; + process.cssMetrics[fileName].ids = reduceDuplicates(ids).join(' ').split('#').length - 1; /* Classes */ if (rule.selector.toString().indexOf('.') !== -1) { classes.push(rule.selector.toString()); } - metrics.classes = reduceDuplicates(classes).join(' ').split('.').length - 1; + process.cssMetrics[fileName].classes = reduceDuplicates(classes).join(' ').split('.').length - 1; /* Pseudo Classes and Elements */ Object.keys(pseudoClasses).map((i) => { if (rule.selector.toString().indexOf(pseudoClasses[i]) !== -1) { - metrics.pseudo.class++; + process.cssMetrics[fileName].pseudo.class++; } }); Object.keys(pseudoElements).map((i) => { if (rule.selector.toString().indexOf(pseudoElements[i]) !== -1) { - metrics.pseudo.element++; + process.cssMetrics[fileName].pseudo.element++; } }); } @@ -693,163 +697,161 @@ const MetricsCSS = postcss.plugin('postcss-metrics', (options) => { root.walkDecls(decl => { if (decl) { - metrics.declarations++; + process.cssMetrics[fileName].declarations++; } if (decl.prop) { - metrics.properties++; + process.cssMetrics[fileName].properties++; } const prop = decl.prop.toString(); const value = decl.value.toString(); /* Layout */ - if (prop === 'float') { metrics.layout.float++; float.push(value); } + if (prop === 'float') { process.cssMetrics[fileName].layout.float++; float.push(value); } - if (prop === 'width') { metrics.layout.width++; width.push(value); } + if (prop === 'width') { process.cssMetrics[fileName].layout.width++; width.push(value); } - if (prop === 'height') { metrics.layout.width++; height.push(value); } + if (prop === 'height') { process.cssMetrics[fileName].layout.width++; height.push(value); } - if (prop === 'display') { metrics.layout.display++; display.push(value); } + if (prop === 'display') { process.cssMetrics[fileName].layout.display++; display.push(value); } - if (prop === 'min-width') { metrics.layout.minWidth++; minWidth.push(value); } + if (prop === 'min-width') { process.cssMetrics[fileName].layout.minWidth++; minWidth.push(value); } - if (prop === 'max-width') { metrics.layout.maxWidth++; maxWidth.push(value); } + if (prop === 'max-width') { process.cssMetrics[fileName].layout.maxWidth++; maxWidth.push(value); } - if (prop === 'min-height') { metrics.layout.minHeight++; minHeight.push(value); } + if (prop === 'min-height') { process.cssMetrics[fileName].layout.minHeight++; minHeight.push(value); } - if (prop === 'max-height') { metrics.layout.maxHeight++; maxHeight.push(value); } + if (prop === 'max-height') { process.cssMetrics[fileName].layout.maxHeight++; maxHeight.push(value); } /* Skins */ - if (prop === 'color') { metrics.skin.color++; } + if (prop === 'color') { process.cssMetrics[fileName].skin.color++; } - if (prop === 'background-color') { metrics.skin.backgroundColor++; } + if (prop === 'background-color') { process.cssMetrics[fileName].skin.backgroundColor++; } - if (prop === 'border-color') { metrics.skin.borderColor++; } + if (prop === 'border-color') { process.cssMetrics[fileName].skin.borderColor++; } - if (prop === 'box-shadow') { metrics.skin.boxShadow++; } + if (prop === 'box-shadow') { process.cssMetrics[fileName].skin.boxShadow++; } /* Typography */ - if (prop === 'font-family') { metrics.typography.family++; } + if (prop === 'font-family') { process.cssMetrics[fileName].typography.family++; } - if (prop === 'font-size') { metrics.typography.size++; } + if (prop === 'font-size') { process.cssMetrics[fileName].typography.size++; } - if (prop === 'font-weight') { metrics.typography.weight++; } + if (prop === 'font-weight') { process.cssMetrics[fileName].typography.weight++; } - if (prop === 'text-align') { metrics.typography.alignment++; } + if (prop === 'text-align') { process.cssMetrics[fileName].typography.alignment++; } - if (prop === 'line-height') { metrics.typography.lineHeight++; } + if (prop === 'line-height') { process.cssMetrics[fileName].typography.lineHeight++; } - if (prop === 'letter-spacing') { metrics.typography.letterSpace++; } + if (prop === 'letter-spacing') { process.cssMetrics[fileName].typography.letterSpace++; } - if (prop === 'text-decoration') { metrics.typography.decoration++; } + if (prop === 'text-decoration') { process.cssMetrics[fileName].typography.decoration++; } - if (prop === 'text-transform') { metrics.typography.transform++; } + if (prop === 'text-transform') { process.cssMetrics[fileName].typography.transform++; } - if (prop === 'text-shadow') { metrics.typography.textShadow++; } + if (prop === 'text-shadow') { process.cssMetrics[fileName].typography.textShadow++; } /* Spacing */ if (prop === 'padding') { - metrics.spacing.padding.all++; - if (parseInt(value) === 0) { metrics.resets.padding.all++; padding.push(value); } + process.cssMetrics[fileName].spacing.padding.all++; + if (parseInt(value) === 0) { process.cssMetrics[fileName].resets.padding.all++; padding.push(value); } } if (prop === 'padding-top') { - metrics.spacing.padding.top++; - if (parseInt(value) === 0) { metrics.resets.padding.top++; paddingTop.push(value); } + process.cssMetrics[fileName].spacing.padding.top++; + if (parseInt(value) === 0) { process.cssMetrics[fileName].resets.padding.top++; paddingTop.push(value); } } if (prop === 'padding-right') { - metrics.spacing.padding.right++; - if (parseInt(value) === 0) { metrics.resets.padding.right++; paddingRight.push(value); } + process.cssMetrics[fileName].spacing.padding.right++; + if (parseInt(value) === 0) { process.cssMetrics[fileName].resets.padding.right++; paddingRight.push(value); } } if (prop === 'padding-bottom') { - metrics.spacing.padding.bottom++; - if (parseInt(value) === 0) { metrics.resets.padding.bottom++; paddingBottom.push(value); } + process.cssMetrics[fileName].spacing.padding.bottom++; + if (parseInt(value) === 0) { process.cssMetrics[fileName].resets.padding.bottom++; paddingBottom.push(value); } } if (prop === 'padding-left') { - metrics.spacing.padding.left++; - if (parseInt(value) === 0) { metrics.resets.padding.left++; paddingLeft.push(value); } + process.cssMetrics[fileName].spacing.padding.left++; + if (parseInt(value) === 0) { process.cssMetrics[fileName].resets.padding.left++; paddingLeft.push(value); } } if (prop === 'margin') { - metrics.spacing.margin.all++; - if (parseInt(value) === 0) { metrics.resets.margin.all++; margin.push(value); } + process.cssMetrics[fileName].spacing.margin.all++; + if (parseInt(value) === 0) { process.cssMetrics[fileName].resets.margin.all++; margin.push(value); } } if (prop === 'margin-top') { - metrics.spacing.margin.top++; - if (parseInt(value) === 0) { metrics.resets.margin.top++; marginTop.push(value); } + process.cssMetrics[fileName].spacing.margin.top++; + if (parseInt(value) === 0) { process.cssMetrics[fileName].resets.margin.top++; marginTop.push(value); } } if (prop === 'margin-right') { - metrics.spacing.margin.right++; - if (parseInt(value) === 0) { metrics.resets.margin.right++; marginRight.push(value); } + process.cssMetrics[fileName].spacing.margin.right++; + if (parseInt(value) === 0) { process.cssMetrics[fileName].resets.margin.right++; marginRight.push(value); } } if (prop === 'margin-bottom') { - metrics.spacing.margin.bottom++; - if (parseInt(value) === 0) { metrics.resets.margin.bottom++; marginBottom.push(value); } + process.cssMetrics[fileName].spacing.margin.bottom++; + if (parseInt(value) === 0) { process.cssMetrics[fileName].resets.margin.bottom++; marginBottom.push(value); } } if (prop === 'margin-left') { - metrics.spacing.margin.left++; - if (parseInt(value) === 0) { metrics.resets.margin.left++; marginLeft.push(value); } + process.cssMetrics[fileName].spacing.margin.left++; + if (parseInt(value) === 0) { process.cssMetrics[fileName].resets.margin.left++; marginLeft.push(value); } } }); /* Layout Compairson */ - metrics.comparison.layout.display.unique = reduceDuplicates(display).length; - metrics.comparison.layout.display.repeated = display.length; + process.cssMetrics[fileName].comparison.layout.display.unique = reduceDuplicates(display).length; + process.cssMetrics[fileName].comparison.layout.display.repeated = display.length; - metrics.comparison.layout.float.unique = reduceDuplicates(float).length; - metrics.comparison.layout.float.repeated = float.length; + process.cssMetrics[fileName].comparison.layout.float.unique = reduceDuplicates(float).length; + process.cssMetrics[fileName].comparison.layout.float.repeated = float.length; - metrics.comparison.layout.width.unique = reduceDuplicates(width).length; - metrics.comparison.layout.width.repeated = width.length; + process.cssMetrics[fileName].comparison.layout.width.unique = reduceDuplicates(width).length; + process.cssMetrics[fileName].comparison.layout.width.repeated = width.length; - metrics.comparison.layout.height.unique = reduceDuplicates(height).length; - metrics.comparison.layout.height.repeated = height.length; + process.cssMetrics[fileName].comparison.layout.height.unique = reduceDuplicates(height).length; + process.cssMetrics[fileName].comparison.layout.height.repeated = height.length; - metrics.comparison.layout.maxWidth.unique = reduceDuplicates(maxWidth).length; - metrics.comparison.layout.maxWidth.repeated = maxWidth.length; + process.cssMetrics[fileName].comparison.layout.maxWidth.unique = reduceDuplicates(maxWidth).length; + process.cssMetrics[fileName].comparison.layout.maxWidth.repeated = maxWidth.length; - metrics.comparison.layout.minWidth.unique = reduceDuplicates(minWidth).length; - metrics.comparison.layout.minWidth.repeated = minWidth.length; + process.cssMetrics[fileName].comparison.layout.minWidth.unique = reduceDuplicates(minWidth).length; + process.cssMetrics[fileName].comparison.layout.minWidth.repeated = minWidth.length; - metrics.comparison.layout.maxHeight.unique = reduceDuplicates(maxHeight).length; - metrics.comparison.layout.maxHeight.repeated = maxHeight.length; + process.cssMetrics[fileName].comparison.layout.maxHeight.unique = reduceDuplicates(maxHeight).length; + process.cssMetrics[fileName].comparison.layout.maxHeight.repeated = maxHeight.length; - metrics.comparison.layout.minHeight.unique = reduceDuplicates(minHeight).length; - metrics.comparison.layout.minHeight.repeated = minHeight.length; + process.cssMetrics[fileName].comparison.layout.minHeight.unique = reduceDuplicates(minHeight).length; + process.cssMetrics[fileName].comparison.layout.minHeight.repeated = minHeight.length; /* Padding Compairson */ - metrics.comparison.padding.all.unique = reduceDuplicates(padding).length; - metrics.comparison.padding.all.repeated = padding.length; + process.cssMetrics[fileName].comparison.padding.all.unique = reduceDuplicates(padding).length; + process.cssMetrics[fileName].comparison.padding.all.repeated = padding.length; - metrics.comparison.padding.top.unique = reduceDuplicates(paddingTop).length; - metrics.comparison.padding.top.repeated = paddingTop.length; + process.cssMetrics[fileName].comparison.padding.top.unique = reduceDuplicates(paddingTop).length; + process.cssMetrics[fileName].comparison.padding.top.repeated = paddingTop.length; - metrics.comparison.padding.right.unique = reduceDuplicates(paddingRight).length; - metrics.comparison.padding.right.repeated = paddingRight.length; + process.cssMetrics[fileName].comparison.padding.right.unique = reduceDuplicates(paddingRight).length; + process.cssMetrics[fileName].comparison.padding.right.repeated = paddingRight.length; - metrics.comparison.padding.bottom.unique = reduceDuplicates(paddingBottom).length; - metrics.comparison.padding.bottom.repeated = paddingBottom.length; + process.cssMetrics[fileName].comparison.padding.bottom.unique = reduceDuplicates(paddingBottom).length; + process.cssMetrics[fileName].comparison.padding.bottom.repeated = paddingBottom.length; - metrics.comparison.padding.left.unique = reduceDuplicates(paddingLeft).length; - metrics.comparison.padding.left.repeated = paddingLeft.length; + process.cssMetrics[fileName].comparison.padding.left.unique = reduceDuplicates(paddingLeft).length; + process.cssMetrics[fileName].comparison.padding.left.repeated = paddingLeft.length; /* Margin Compairson */ - metrics.comparison.margin.all.unique = reduceDuplicates(margin).length; - metrics.comparison.margin.all.repeated = margin.length; - - metrics.comparison.margin.top.unique = reduceDuplicates(marginTop).length; - metrics.comparison.margin.top.repeated = marginTop.length; + process.cssMetrics[fileName].comparison.margin.all.unique = reduceDuplicates(margin).length; + process.cssMetrics[fileName].comparison.margin.all.repeated = margin.length; - metrics.comparison.margin.right.unique = reduceDuplicates(marginRight).length; - metrics.comparison.margin.right.repeated = marginRight.length; + process.cssMetrics[fileName].comparison.margin.top.unique = reduceDuplicates(marginTop).length; + process.cssMetrics[fileName].comparison.margin.top.repeated = marginTop.length; - metrics.comparison.margin.bottom.unique = reduceDuplicates(marginBottom).length; - metrics.comparison.margin.bottom.repeated = marginBottom.length; + process.cssMetrics[fileName].comparison.margin.right.unique = reduceDuplicates(marginRight).length; + process.cssMetrics[fileName].comparison.margin.right.repeated = marginRight.length; - metrics.comparison.margin.left.unique = reduceDuplicates(marginLeft).length; - metrics.comparison.margin.left.repeated = marginLeft.length; + process.cssMetrics[fileName].comparison.margin.bottom.unique = reduceDuplicates(marginBottom).length; + process.cssMetrics[fileName].comparison.margin.bottom.repeated = marginBottom.length; - process.cssMetrics = metrics; + process.cssMetrics[fileName].comparison.margin.left.unique = reduceDuplicates(marginLeft).length; + process.cssMetrics[fileName].comparison.margin.left.repeated = marginLeft.length; } } }); diff --git a/build/configs/js/.eslintrc b/build/configs/js/.eslintrc index be25478..b5257ff 100644 --- a/build/configs/js/.eslintrc +++ b/build/configs/js/.eslintrc @@ -5,6 +5,7 @@ "arrow-parens": ["error", "always"], "camelcase": 0, "comma-dangle": ["error", "never"], + "guard-for-in": 0, "import/extensions": 0, "import/no-extraneous-dependencies": 0, "import/no-named-as-default": 0, @@ -21,6 +22,7 @@ "no-new": 0, "no-param-reassign": 0, "no-plusplus": 0, + "no-restricted-syntax": ["off", "forInStatement", "ForOfStatement"], "no-template-curly-in-string": 0, "react/destructuring-assignment": 0, "react/forbid-prop-types": 0, @@ -37,7 +39,10 @@ "react/require-default-props": 0, "react/jsx-props-no-spreading": 0, "react/static-property-placement": 0, - "react/jsx-fragments": 0 + "react/jsx-fragments": 0, + "react/no-unescaped-entities": [ "error", { + "forbid": [">", "}"] + }], }, "globals": { "__stats__": true, diff --git a/build/configs/js/js.config.js b/build/configs/js/js.config.js index dc8ef0e..1a81a27 100644 --- a/build/configs/js/js.config.js +++ b/build/configs/js/js.config.js @@ -10,7 +10,11 @@ const { ESDocs, JSXDocs, ESMetrics, Bundle } = require('./js.config.plugins.js') const babelPlugins = [ '@babel/plugin-proposal-object-rest-spread', // (see: https://babeljs.io/docs/en/babel-plugin-transform-object-rest-spread) '@babel/plugin-proposal-class-properties', // (see: https://babeljs.io/docs/en/babel-plugin-transform-class-properties/) - '@babel/plugin-transform-react-display-name' // (see: https://www.npmjs.com/package/babel-plugin-add-react-displayname) + '@babel/plugin-transform-react-display-name', // (see: https://www.npmjs.com/package/babel-plugin-add-react-displayname) + '@babel/plugin-proposal-nullish-coalescing-operator', // (see: https://babeljs.io/docs/en/babel-plugin-proposal-nullish-coalescing-operator) + '@babel/plugin-proposal-async-generator-functions', // (see: https://babeljs.io/docs/en/babel-plugin-proposal-async-generator-functions) + '@babel/plugin-transform-for-of', // (see: https://babeljs.io/docs/en/babel-plugin-transform-for-of) + '@babel/plugin-proposal-optional-chaining' // (see: https://babeljs.io/docs/en/babel-plugin-proposal-optional-chaining) ]; const babelOptions = { @@ -22,6 +26,7 @@ const babelOptions = { // all js(x) files get ran through these build processes module.exports = { config: [{ + // Full transpile of JS and JSX files for rendering in browser 'test': /\.(jsx|js)$/, 'exclude': [path.resolve(__dirname, '../../../node_modules')], 'use': [ @@ -35,12 +40,14 @@ module.exports = { } ] }, { + // Pre transpile entry for JS Docs and Metrics building 'test': /\.js$/, 'exclude': [path.resolve(__dirname, '../../../node_modules')], 'use': [ { 'loader': 'babel-loader?cacheDirectory', // (see: https://www.npmjs.com/package/babel-loader) 'options': { + 'compact': false, 'plugins': [ ESMetrics, ESDocs @@ -52,12 +59,14 @@ module.exports = { } ] }, { + // Pre transpile entry for JSX Docs and Metrics building 'test': /\.jsx$/, 'exclude': [path.resolve(__dirname, '../../../node_modules')], 'use': [ { 'loader': 'babel-loader?cacheDirectory', // (see: https://www.npmjs.com/package/babel-loader) 'options': { + 'compact': false, 'presets': ['@babel/preset-react'], 'plugins': [ JSXDocs, diff --git a/build/configs/js/js.config.plugins.js b/build/configs/js/js.config.plugins.js index ca66618..73693d9 100644 --- a/build/configs/js/js.config.plugins.js +++ b/build/configs/js/js.config.plugins.js @@ -6,10 +6,14 @@ const fs = require('fs'); const path = require('path'); const { declare } = require('@babel/helper-plugin-utils'); +const types = require('@babel/types'); +const traverse = require('@babel/traverse').default; +const generator = require('@babel/generator').default; const getElementName = (pathing) => path.basename(path.resolve(__dirname, pathing)).split('.')[0]; -// Unslated's ECMA Script comment based docs + +// Used to collect all metrics and docs from element .container.js files const ESDocs = declare((api, opts) => { process.esDocsReset = () => {}; process.esDocs = {}; @@ -33,25 +37,13 @@ const ESDocs = declare((api, opts) => { return comment; }; - const getMethodParams = (containers) => { - let params = []; - Object.keys(containers.init.params).map((j) => { - params.push(containers.init.params[j].name); - }); - - return params; - }; - - const getEventParams = (params) => { - let collection = []; - if (params) { - Object.keys(params).map((j) => { - collection.push(params[j].name); - }); - } + const getMethodParams = (containers) => (containers) + ? [...Object.keys(containers.init.params).map((i) => containers.init.params[i].name)] + : []; - return collection; - }; + const getEventParams = (params) => (params) + ? [...Object.keys(params).map((i) => params[i].name)] + : []; const getSelectorTemplateLiteral = (expressions, quasis) => { let selector = ''; @@ -92,17 +84,26 @@ const ESDocs = declare((api, opts) => { name: 'ESDocs', visitor: { Program(ast, file) { - if (file.filename.indexOf('.container.js') !== -1) { + if (file.filename.indexOf('.container') !== -1) { comments = ast.container.comments; // Grab elements name from file.filename const elementName = getElementName(file.filename); // Start element's collection entry point - process.esDocs[elementName] = {}; - process.esDocs[elementName].events = []; - process.esDocs[elementName].methods = []; - process.esDocs[elementName].selectors = []; + process.esDocs[elementName] = { + events: [], + methods: [], + expressions: [], + selectors: [], + variables: [], + utils: [], + loops: [], + promises: { + async: [], + await: [] + } + }; } }, Expression(ast, file) { @@ -119,8 +120,10 @@ const ESDocs = declare((api, opts) => { process.esDocs[elementName].methods.push({ name: container[i].id.name, type: ast.type, + kind: ast.kind, + params: getMethodParams(container[0]), comment: commentToSourceMatching(comments, ast, container[i].id.name), - params: getMethodParams(container[0]) + line: container.loc.start.line // line in document this is expressed }); } }); @@ -129,8 +132,10 @@ const ESDocs = declare((api, opts) => { process.esDocs[elementName].methods.push({ name: container.id.name, type: ast.type, + kind: ast.kind, + params: getMethodParams(container), comment: commentToSourceMatching(comments, ast, container.id.name), - params: getMethodParams(container) + line: container.loc.start.line // line in document this is expressed }); } } @@ -140,8 +145,9 @@ const ESDocs = declare((api, opts) => { process.esDocs[elementName].methods.push({ name: ast.name, type: ast.type, + params: getMethodParams(container), comment: commentToSourceMatching(comments, ast), - params: getMethodParams(container) + line: container.loc.start.line // line in document this is expressed }); } @@ -161,17 +167,14 @@ const ESDocs = declare((api, opts) => { element = endpoint.name; } - if (!element) { - console.log(element); - } - process.esDocs[elementName].events.push({ file: file.filename, - line: container.loc.start.line, // line in document this is expressed element: element, eventType: args[0].value, // `click`, `mouseup`, keyup etc. callbackType: args[1].type, // callback kind `function(){}` or `() => {}` callbackParams: getEventParams(args[1].params), // params passed to listener callback + comments: commentToSourceMatching(comments, ast), + line: container.loc.start.line // line in document this is expressed }); } @@ -185,21 +188,22 @@ const ESDocs = declare((api, opts) => { if (args[0].type === 'StringLiteral') { process.esDocs[elementName].selectors.push({ file: file.filename, - line: container.loc.start.line, // line in document this is expressed element: callee.object.name, selector: args[0].value, // '#someId .someClass etc.' - selectorType: ast.node.property.name + selectorType: ast.node.property.name, + comments: commentToSourceMatching(comments, ast), + line: container.loc.start.line // line in document this is expressed }); } if (args[0].type === 'TemplateLiteral') { - console.log(); process.esDocs[elementName].selectors.push({ file: file.filename, - line: container.loc.start.line, // line in document this is expressed element: callee.object.name, selector: getSelectorTemplateLiteral(args[0].expressions, args[0].quasis), // templateliteral variable usage - selectorType: ast.node.property.name + selectorType: ast.node.property.name, + comments: commentToSourceMatching(comments, ast), + line: container.loc.start.line // line in document this is expressed }); } } @@ -221,16 +225,143 @@ const ESDocs = declare((api, opts) => { method.used.push(container.expression.callee.loc.start.line); } }); - } } } } + }, + VariableDeclaration(ast, file) { + if (file.filename.indexOf('.container') !== -1) { + const elementName = getElementName(file.filename); + process.esDocs[elementName].variables.push({ + type: ast.type, + kind: ast.node.kind, + name: ast.node.declarations[0].id.name, + comments: commentToSourceMatching(comments, ast), + line: ast.node.local + }); + } + }, + CallExpression(ast, file) { + const elementName = getElementName(file.filename); + if (file.filename.indexOf('.container') !== -1) { + // sometimes x.y(arguments) othertimes y(arguments) + process.esDocs[elementName].expressions.push({ + type: ast.node.type, + object: (ast.node.callee.object) ? ast.node.callee.object.name : null, + property: (ast.node.callee.property) ? ast.node.callee.property.name : null, + identifier: (ast.node.callee.name) ? ast.node.callee.name : null, + arguments: (ast.node.arguments) ? Object.keys(ast.node.arguments).map((i) => ast.node.arguments[i].type) : [], + comments: commentToSourceMatching(comments, ast), + line: ast.node.loc.start.line + }); + } + }, + AssignmentExpression(ast, file) { + const elementName = getElementName(file.filename); + if (file.filename.indexOf('.container') !== -1) { + process.esDocs[elementName].expressions.push({ + type: ast.node.type, + left: `${ast.node.left.object.name}.${ast.node.left.property.name}`, + operator: ast.node.operator, + comments: commentToSourceMatching(comments, ast), + line: ast.node.loc.start.line + }); + } + }, + MemberExpression(ast, file) { + const elementName = getElementName(file.filename); + if (file.filename.indexOf('.container') !== -1) { + process.esDocs[elementName].expressions.push({ + type: ast.node.type, + object: ast.node.object.name, + property: ast.node.property.name, + comments: commentToSourceMatching(comments, ast), + line: ast.node.loc.start.line + }); + + /* Utils Usage */ + if (ast.node.name === 'Utils') { + process.esDocs[elementName].utils.push({ + object: ast.node.name, + property: ast.node.property.name, + comments: commentToSourceMatching(comments, ast), + line: ast.node.loc.start.line + }); + } + + // Object Methods (keys, map) + if (ast.node.property.name === 'keys') { + process.esDocs[elementName].loops.push({ + type: 'ObjectKeysExpression', + keys: Object.keys(ast.container.arguments).map((i) => ast.container.arguments[i].property.name), + comments: commentToSourceMatching(comments, ast), + line: ast.node.loc.start.line + }); + } + } + }, + ForStatement(ast, file) { + const elementName = getElementName(file.filename); + if (file.filename.indexOf('container.js') !== -1) { + Object.keys(ast.container).map((i) => { + if (ast.container[i].type === 'ForStatement') { + process.esDocs[elementName].loops.push({ + type: 'ForStatement', + test: `${generator(ast.container[i].init, {}, ast.container[i].init).code} ${generator(ast.container[i].test, {}, ast.container[i].test).code} ${generator(ast.container[i].update, {}, ast.container[i].update).code}`, + comments: commentToSourceMatching(comments, ast), + line: ast.node.loc.start.line + }); + } + }); + } + }, + ForInStatement(ast, file) { + const elementName = getElementName(file.filename); + if (file.filename.indexOf('container.js') !== -1) { + Object.keys(ast.container).map((i) => { + if (ast.container[i].type === 'ForInStatement') { + process.esDocs[elementName].loops.push({ + type: 'ForInStatement', + test: `${generator(ast.container[i].left, {}, ast.container[i].left).code.replace(';', '')} in ${generator(ast.container[i].right, {}, ast.container[i].right).code}`, + comments: commentToSourceMatching(comments, ast), + line: ast.node.loc.start.line + }); + } + }); + } + }, + ForOfStatement(ast, file) { + const elementName = getElementName(file.filename); + if (file.filename.indexOf('container.js') !== -1) { + Object.keys(ast.container).map((i) => { + if (ast.container[i].type === 'ForOfStatement') { + process.esDocs[elementName].loops.push({ + type: 'ForOfStatement', + test: `${generator(ast.container[i].left, {}, ast.container[i].left).code.replace(';', '')} of ${generator(ast.container[i].right, {}, ast.container[i].right).code}`, + comments: commentToSourceMatching(comments, ast), + line: ast.node.loc.start.line + }); + } + }); + } + }, + WhileStatement(ast, file) { + const elementName = getElementName(file.filename); + if (file.filename.indexOf('container.js') !== -1) { + process.esDocs[elementName].loops.push({ + type: 'WhileStatement', + test: generator(ast.container.test, {}, ast.container.test), + comments: commentToSourceMatching(comments, ast), + line: ast.node.loc.start.line + }); + } } } }; }); +// Used to collect all metrcis and docs from element .jsx and example.jsx files const JSXDocs = declare((api, opts) => { process.jsxDocsReset = () => {}; process.jsxDocs = {}; @@ -288,14 +419,42 @@ const JSXDocs = declare((api, opts) => { return collection; }; + const getAtomicLevel = (path) => { + if (path.indexOf('atoms') !== -1) { + return 'atoms'; + } + if (path.indexOf('modifiers') !== -1) { + return 'modifiers'; + } + if (path.indexOf('molecules') !== -1) { + return 'molecules'; + } + if (path.indexOf('organisms') !== -1) { + return 'organisms'; + } + if (path.indexOf('templates') !== -1) { + return 'templates'; + } + + return false; + }; + + // https://babeljs.io/docs/en/6.26.3/babel-types for all available babel AST types + // pre: used to make targeted updates to the collected data during dev builds + // visitor: used as the actual data collection all build types + // post: used as cleanup point for any collected data return { name: 'JSXDocs', + pre(state) { + // Targeted reset for dev builds + const elementName = path.basename(state.hub.file.opts.filename).split('.')[0]; + if (process.jsxDocs[elementName]) { + process.jsxDocs[elementName].Using = {}; + process.jsxDocs[elementName].Reusing = {}; + } + }, visitor: { - Program(ast, file) { - if (file.filename.indexOf('.jsx') !== -1 && file.filename.indexOf('.example.jsx') === -1) { - - } - }, + Program(ast, file) {}, Class(ast, file) { if (ast.node.superClass.object.name === 'React') { const elementName = ast.node.id.name; @@ -303,19 +462,143 @@ const JSXDocs = declare((api, opts) => { // If you build it, they will come. if (!process.jsxDocs[getElementName(file.filename)]) { - process.jsxDocs[getElementName(file.filename)] = {}; + process.jsxDocs[getElementName(file.filename)] = { + Level: undefined, + Examples: 0, + Tags: {}, + Using: {}, + Reusing: {} + }; } - process.jsxDocs[getElementName(file.filename)][elementName] = { + process.jsxDocs[getElementName(file.filename)].Level = getAtomicLevel(file.filename); + process.jsxDocs[getElementName(file.filename)].Tags[elementName] = { description: getComment(ast.container), props: getPropTypes(classProperties, elementName) }; } } + }, + post(state) { + traverse(state.ast, { + ImportDeclaration: (ast) => { + const value = ast.node.source.value.toLowerCase(); + const levels = ['atoms', 'molecules', 'organisms', 'templates']; + + if ( + value.indexOf('.css') === -1 + && value.indexOf('.js') === -1 + && value.indexOf('.container') === -1 + && value.indexOf('.example') === -1 + ) { + // Determins used element types and levels (root or sub and atomic levels) + Object.keys(ast.container).map((i) => { + const node = ast.container[i]; + if (!node.source) { return false; } + + const sourceFilename = path.basename(ast.hub.file.opts.filename).split('.')[0]; + const sourceValue = node.source.value; + + if (sourceFilename.indexOf('@guide') !== -1) { return false; } + if (ast.hub.file.opts.filename.indexOf('guide') !== -1) { return false; } + + if ( + sourceValue && + sourceValue.indexOf('@guide') === -1 && + sourceValue.indexOf('@vars') === -1 && + sourceValue.indexOf('@src') === -1 && + sourceValue.indexOf('.json') === -1 && + sourceValue.indexOf('.jpg') === -1 && + sourceValue.indexOf('.svg') === -1 && + sourceValue.indexOf('.png') === -1 && + sourceValue.indexOf('.gif') === -1 && + sourceValue.indexOf('.ico') === -1 && + sourceValue.indexOf('.woff') === -1 && + sourceValue.indexOf('.woff2') === -1 && + sourceValue.indexOf('.ttf') === -1 && + sourceValue.indexOf('.eot') === -1 && + sourceValue.indexOf('!') === -1) { + const importedFilename = path.basename(sourceValue).split('.')[0]; + + Object.keys(node.specifiers).map((j) => { + if (!process.jsxDocs[sourceFilename]) { return false; } + if (sourceFilename === importedFilename) { return false; } + + if (node.specifiers[j].type === 'ImportDefaultSpecifier') { + // Direct import of element + const importedElementName = node.specifiers[j].local.name; + // if (process.jsxDocs[sourceFilename].uses[importedElementName]) { return false; } + if (importedElementName === importedFilename ) { + process.jsxDocs[sourceFilename].Using[importedElementName] = { + tagPath: sourceValue, + tagType: 'root', + tagLevel: getAtomicLevel(sourceValue) + }; + } + } + + if (node.specifiers[j].type === 'ImportSpecifier') { + // Mupltiple import of element and sub elements + const importedElementName = node.specifiers[j].imported.name; + // if (process.jsxDocs[sourceFilename].uses[importedElementName]) { return false; } + if (importedElementName === importedFilename) { + process.jsxDocs[sourceFilename].Using[importedElementName] = { + tagPath: sourceValue, + tagType: 'root', + tagLevel: getAtomicLevel(sourceValue) + }; + } else { + process.jsxDocs[sourceFilename].Using[importedElementName] = { + tagPath: sourceValue, + tagType: 'sub', + tagLevel: getAtomicLevel(sourceValue) + }; + } + } + + return false; + }); + } + + return false; + }); + } + }, + CallExpression: (ast) => { + /* Capture getExample() usage metrics */ + if (ast.node.callee) { + if (ast.node.callee.property) { + if (ast.node.callee.property.name === 'getExample') { + if (ast.node.arguments) { + const sourceFilename = path.basename(ast.hub.file.opts.filename).split('.')[0]; + + const reusedExampleFileName = ast.node.arguments[0].name; + const resuedExampleIndex = ast.node.arguments[1].value; + + process.jsxDocs[sourceFilename].Reusing[reusedExampleFileName] = { + exampleIndex: resuedExampleIndex + } + } + } + } + } + }, + ExportDefaultDeclaration: (ast) => { + /* Captures element's example.jsx file metrics */ + const { filename } = ast.hub.file.opts; + if (filename.indexOf('.example') !== -1) { + const elementName = path.basename(filename).split('.')[0]; + if (process.jsxDocs[elementName]) { + process.jsxDocs[elementName].Examples = ast.node.declaration.elements[0].properties[0].value.elements.length; + } + } + } + }) } }; }); +// Fuck you stupid waste of time method! const ESMetrics = declare((api, opts) => { process.jsMetricsReset = () => { return { @@ -359,98 +642,13 @@ const ESMetrics = declare((api, opts) => { process.jsMetrics = process.jsMetricsReset(); // https://babeljs.io/docs/en/6.26.3/babel-types for all available babel AST types + // pre: used to make targeted updates to the collected data during dev builds + // visitor: used as the actual data collection all build types + // post: used as cleanup point for any collected data return { name: "metrics", visitor: { - Declaration(ast, file) { - if (file.filename.indexOf('container.js') !== -1) { - if (ast.type === 'VariableDeclaration') { - if (ast.node.kind === 'let') { // please note let === var - process.jsMetrics.variables.all++; - process.jsMetrics.variables.lets++; - } - - if (ast.node.kind === 'const') { - process.jsMetrics.variables.all++; - process.jsMetrics.variables.const++; - } - } - } - }, - Expression(ast, file) { - if (file.filename.indexOf('container.js') !== -1) { - /* Arrow Methods */ - if (ast.type === 'ArrowFunctionExpression') { - process.jsMetrics.methods.all++; - process.jsMetrics.methods.arrows++; - } - if (ast.type === 'FunctionExpression') { - process.jsMetrics.methods.all++; - process.jsMetrics.methods.functions++; - } - - if (ast.type === 'CallExpression') { - process.jsMetrics.expressions.all++; - process.jsMetrics.expressions.calls++; - } - - if (ast.type === 'AssignmentExpression') { - process.jsMetrics.expressions.all++; - process.jsMetrics.expressions.assignments++; - } - - if (ast.type === 'MemberExpression') { - process.jsMetrics.expressions.all++; - process.jsMetrics.expressions.members++; - - /* Utils Usage */ - if (ast.node.name === 'Utils') { - // All Utils used - process.jsMetrics.utils.all++; - - // XHR Usage - if (ast.node.property.name === 'XHR') { - process.jsMetrics.utils.xhr++; - } - - // Fetch Usage - if (ast.node.property.name === 'Fetch') { - process.jsMetrics.utils.fetch++; - } - } - - // Object Methods (keys, map) - if (ast.node.property.name === 'keys') { - process.jsMetrics.loops.all++; - process.jsMetrics.loops.object++; - } - } - } - }, - For(ast, file) { - if (file.filename.indexOf('container.js') !== -1) { - process.jsMetrics.loops.all++; - - if (ast.type === 'ForStatement') { - process.jsMetrics.loops.for++; - } - - if (ast.type === 'ForInStatement') { - process.jsMetrics.loops.forIn++; - } - - if (ast.type === 'ForOfStatement') { - process.jsMetrics.loops.forOf++; - } - } - }, - While(ast, file) { - if (file.filename.indexOf('container.js') !== -1) { - process.jsMetrics.loops.all++; - process.jsMetrics.loops.while++; - } - } } }; }); @@ -466,8 +664,8 @@ class Bundle { files: [] }; - this.excludes = ['node_modules', '!', 'jsx', 'guide']; - this.includes = ['js', 'css', 'svg', 'jpg', 'png', 'gif', 'atoms', 'molecules', 'modifiers', 'organisms']; + this.excludes = ['node_modules', 'example.jsx', 'test.jsx', '!', 'guide']; + this.includes = ['js', 'jsx', 'css', 'svg', 'jpg', 'png', 'gif', 'atoms', 'molecules', 'modifiers', 'organisms']; } // Used to prevent unwanted file types into our file list buildup @@ -529,10 +727,11 @@ class Bundle { if (i.indexOf('guide.js') !== -1) { this.stats.js = process.jsMetrics; this.stats.css = process.cssMetrics; + const source = ` var __stats__ = ${JSON.stringify(this.stats)}; - var __jsxDocs__ = ${JSON.stringify(process.jsxDocs)}; var __esDocs__ = ${JSON.stringify(process.esDocs)}; + var __jsxDocs__ = ${JSON.stringify(process.jsxDocs)}; \n ${compilation.assets[i].source()}; `; @@ -547,7 +746,6 @@ class Bundle { // The great memory leak prevention reset (DO NOT REMOVE!) process.jsMetrics = process.jsMetricsReset(); - process.cssMetrics = process.cssMetricsReset(); } }); }); diff --git a/build/configs/webpack/alias.config.js b/build/configs/webpack/alias.config.js index fa0cc4a..b455e77 100644 --- a/build/configs/webpack/alias.config.js +++ b/build/configs/webpack/alias.config.js @@ -29,6 +29,7 @@ module.exports = { '@guideModifiers': path.resolve(__dirname, '../../guide/src/elements/modifiers/'), '@guideOrganisms': path.resolve(__dirname, '../../guide/src/elements/organisms/'), '@sly': path.resolve(__dirname, '../../../src/elements/modifiers/Sly/Sly'), + '@razor': path.resolve(__dirname, '../../../src/elements/modifiers/Razor/Razor'), Utils: path.resolve(__dirname, '../../../src/utilities.jsx'), GuideUtils: path.resolve(__dirname, '../../guide/guide.utilities.jsx') }, diff --git a/build/configs/webpack/webpack.plugins.js b/build/configs/webpack/webpack.plugins.js index 30adc8b..b05b7d8 100644 --- a/build/configs/webpack/webpack.plugins.js +++ b/build/configs/webpack/webpack.plugins.js @@ -62,7 +62,7 @@ class StaticBundle { } fs.writeFile( - path.resolve(__dirname, `../../../${Package.statics.dest}/${example.staticPath}`), + path.resolve(__dirname, `../../../${Package.statics.dest}/${example.exports}`), `\n\n${DOM.toString()}`, (e) => { if (e) { @@ -79,9 +79,9 @@ class StaticBundle { Object.keys(global.components).map((i) => { const example = global.components[i]; - if (example.staticPath) { - example.staticPath = example.staticPath.replace(/\\/g, '/'); - const fileless = example.staticPath.substring(0, example.staticPath.lastIndexOf("/")); + if (example.exports) { + example.exports = example.exports.replace(/\\/g, '/'); + const fileless = example.exports.substring(0, example.exports.lastIndexOf("/")); const dest = path.resolve(__dirname, `../../../${Package.statics.dest}${fileless}`).replace(/\\/g, '/'); fs.ensureDirSync(dest); diff --git a/build/guide/docs/jsx/README.md b/build/guide/docs/jsx/README.md index 6c921f7..21509a9 100644 --- a/build/guide/docs/jsx/README.md +++ b/build/guide/docs/jsx/README.md @@ -165,7 +165,7 @@ export default [{ { name: 'Default styling', description: '', - staticPath: '', + exports: '', component: ( Lorem ipsum ), @@ -174,7 +174,7 @@ export default [{ }, { name: 'Special styling', description: '', - staticPath: '', + exports: '', component: ( Lorem ipsum ), diff --git a/build/guide/figma/README.md b/build/guide/figma/README.md new file mode 100644 index 0000000..a0a69f8 --- /dev/null +++ b/build/guide/figma/README.md @@ -0,0 +1,40 @@ +Below are the steps to get your plugin running. You can also find instructions at: + + https://www.figma.com/plugin-docs/setup/ + +This plugin template uses Typescript and NPM, two standard tools in creating JavaScript applications. + +First, download Node.js which comes with NPM. This will allow you to install TypeScript and other +libraries. You can find the download link here: + + https://nodejs.org/en/download/ + +Next, install TypeScript using the command: + + npm install -g typescript + +Finally, in the directory of your plugin, get the latest type definitions for the plugin API by running: + + npm install --saveDev @figma/plugin-typings + +If you are familiar with JavaScript, TypeScript will look very familiar. In fact, valid JavaScript code +is already valid Typescript code. + +TypeScript adds type annotations to variables. This allows code editors such as Visual Studio Code +to provide information about the Figma API while you are writing code, as well as help catch bugs +you previously didn't notice. + +For more information, visit https://www.typescriptlang.org/ + +Using TypeScript requires a compiler to convert TypeScript (code.ts) into JavaScript (code.js) +for the browser to run. + +We recommend writing TypeScript code using Visual Studio code: + +1. Download Visual Studio Code if you haven't already: https://code.visualstudio.com/. +2. Open this directory in Visual Studio Code. +3. Compile TypeScript to JavaScript: Run the "Terminal > Run Build Task..." menu item, + then select "tsc: watch - tsconfig.json". You will have to do this again every time + you reopen Visual Studio Code. + +That's it! Visual Studio Code will regenerate the JavaScript file every time you save. diff --git a/build/guide/figma/code.js b/build/guide/figma/code.js new file mode 100644 index 0000000..36788ad --- /dev/null +++ b/build/guide/figma/code.js @@ -0,0 +1,29 @@ +// This plugin will open a modal to prompt the user to enter a number, and +// it will then create that many rectangles on the screen. +// This file holds the main code for the plugins. It has access to the *document*. +// You can access browser APIs in the diff --git a/build/guide/guide.utilities.jsx b/build/guide/guide.utilities.jsx index ae2a311..d5ad8d4 100644 --- a/build/guide/guide.utilities.jsx +++ b/build/guide/guide.utilities.jsx @@ -4,6 +4,7 @@ IMPORTANT NOTE: Never remove any methods marked "CORE:" as they are dependencies for the framework. */ +const pretty = require('pretty'); /* CORE: Helper method to convert raw int into bytes, kb or kb for display. @@ -281,33 +282,7 @@ const WCAGTest = (ratio, size, level) => { Please note, this can't be used on JSX syntax as it normalizes the tags to being lowercase */ -const XMLParser = (node, level) => { - let textNode; - const indentBefore = new Array(level++ + 1).join(' '); - const indentAfter = new Array(level - 1).join(' '); - - for (let i = 0; i < node.children.length; i++) { - if (level !== 1) { - textNode = document.createTextNode(`\n ${indentBefore}`); - node.insertBefore(textNode, node.children[i]); - } - - XMLParser(node.children[i], level); - - if (node.lastElementChild === node.children[i] && level !== 1) { - textNode = document.createTextNode(`\n ${indentAfter}`); - node.appendChild(textNode); - } - } - - return node; -}; - -const XMLFormat = (string) => { - const div = document.createElement('div'); - div.innerHTML = string.replace((/ {2}|\r\n|\n|\r/gm), '').trim(); - return XMLParser(div, 0).innerHTML.replace(/^\s+|\s+$/g, ''); -}; +const XMLFormat = (string) => pretty(string); /* diff --git a/build/guide/src/elements/molecules/Examples/Examples.jsx b/build/guide/src/elements/molecules/Examples/Examples.jsx index c20ab14..57a4806 100644 --- a/build/guide/src/elements/molecules/Examples/Examples.jsx +++ b/build/guide/src/elements/molecules/Examples/Examples.jsx @@ -49,18 +49,12 @@ export const Examples = (props) => { // HTML Prisim Code Snips const getHTMLPrisim = (component) => { let prisimData = ReactDOMServer.renderToStaticMarkup(component); - let indent = ''; - prisimData = prisimData.replace(/> { - indent += ' '; - return x.replace('><', `>\n${indent}<`); - }).trim(); - if (component.props.devonly === 'true') { - prisimData = prisimData.replace(/<(.*)devonly="true">((.|\n)*)<\/(.*)>/m, '$2').trim(); - } + prisimData = prisimData.replace(/\r?\n|\r/g, ''); prisimData = prisimData.replace(/>/g, '>'); prisimData = prisimData.replace(/</g, '<'); prisimData = prisimData.replace(/'/g, "'"); prisimData = prisimData.replace(/is="sly"/g, ''); + prisimData = prisimData.replace(/<(.*)devonly="true">((.|\n)*)<\/(.*)>/m, '$2').trim(); return Prism.highlight(GuideUtils.XMLFormat(prisimData), Prism.languages.html, 'html'); // eslint-disable-line }; diff --git a/build/guide/src/elements/molecules/Readme/Readme.Container.js b/build/guide/src/elements/molecules/Readme/Readme.Container.js index 16fccb7..7442ddf 100644 --- a/build/guide/src/elements/molecules/Readme/Readme.Container.js +++ b/build/guide/src/elements/molecules/Readme/Readme.Container.js @@ -21,12 +21,12 @@ export const GuideReadme = (el) => { const jsxPropsListing = () => { const collection = []; if (data.jsxDocs) { - Object.keys(data.jsxDocs).map((i, index) => { - const elementProps = data.jsxDocs[i].props; + Object.keys(data.jsxDocs.Tags).map((i, index) => { + const elementProps = data.jsxDocs.Tags[i].props; collection.push(`

<${i}>

-

${data.jsxDocs[i].description}

+

${data.jsxDocs.Tags[i].description}

diff --git a/build/guide/src/elements/organisms/Metrics/Metrics.Container.js b/build/guide/src/elements/organisms/Metrics/Metrics.Container.js index 8db3a1d..433c1bd 100644 --- a/build/guide/src/elements/organisms/Metrics/Metrics.Container.js +++ b/build/guide/src/elements/organisms/Metrics/Metrics.Container.js @@ -53,11 +53,13 @@ export const GuideMetrics = (el) => { JSAssetList: el.querySelector('.guide__welcome__assets-list.js'), CSSAssetList: el.querySelector('.guide__welcome__assets-list.css'), MediaAssetList: el.querySelector('.guide__welcome__assets-list.media'), + JSXAtomicList: el.querySelector('.atomic-jsx'), JSAtomicList: el.querySelector('.atomic-js'), CSSAtomicList: el.querySelector('.atomic-css'), MediaAtomicList: el.querySelector('.atomic-media'), cards: { all: el.querySelectorAll('.tabs__trigger'), + jsxSize: el.querySelector('.jsx-size'), jsSize: el.querySelector('.js-size'), cssSize: el.querySelector('.css-size'), mediaSize: el.querySelector('.media-size'), @@ -68,6 +70,7 @@ export const GuideMetrics = (el) => { totalErrors: el.querySelector('.total-errors') }, charts: { + JSXChart: el.querySelector('#jsx-chart'), JSChart: el.querySelector('#js-chart'), CSSChart: el.querySelector('#css-chart'), MediaChart: el.querySelector('#media-chart'), @@ -75,6 +78,32 @@ export const GuideMetrics = (el) => { TotalCSSChart: el.querySelector('#total-css'), TotalMediaChart: el.querySelector('#total-media') }, + jsxMetrics: { + roots: el.querySelector('.roots'), + subs: el.querySelector('.subs'), + props: el.querySelector('.props'), + strings: el.querySelector('.strings'), + elements: el.querySelector('.elements'), + funcs: el.querySelector('.funcs'), + nodes: el.querySelector('.nodes'), + oneOfs: el.querySelector('.oneOfs'), + oneOfTypes: el.querySelector('.oneOfTypes'), + isReuireds: el.querySelector('.isReuireds'), + used: el.querySelector('.used'), + usedRoots: el.querySelector('.used-roots'), + usedSubs: el.querySelector('.used-subs'), + usedAtoms: el.querySelector('.used-atoms'), + usedMolecules: el.querySelector('.used-molecules'), + usedOrganisms: el.querySelector('.used-organisms'), + usedTemplates: el.querySelector('.used-templates'), + examples: el.querySelector('.examples'), + exampleExports: el.querySelector('.example-exported'), + exampleReused: el.querySelector('.example-reused'), + exampleAtoms: el.querySelector('.example-atoms'), + exampleMolecules: el.querySelector('.example-molecules'), + exampleOrganisms: el.querySelector('.example-organisms'), + exampleTemplates: el.querySelector('.example-templates') + }, jsMetrics: { const: el.querySelector('.const'), lets: el.querySelector('.lets'), @@ -366,7 +395,174 @@ export const GuideMetrics = (el) => { return `${Math.round(total / 1000)}KB`; }; + const getRootTagTotal = (data) => Object.keys(data).map( + (i) => Object.keys(data[i].Tags).map( + (j) => ((i === j) ? 1 : 0) + ).reduce((a, b) => a + b, 0) + ).reduce((a, b) => a + b, 0); + + const getSubTagTotal = (data) => Object.keys(data).map( + (i) => Object.keys(data[i].Tags).map( + (j) => ((i !== j) ? 1 : 0) + ).reduce((a, b) => a + b, 0) + ).reduce((a, b) => a + b, 0); + + const getPropsTotal = (data, filter = false) => Object.keys(data).map( + (i) => Object.keys(data[i].Tags).map( + (j) => ( + (filter) + ? Object.keys(data[i].Tags[j].props).map( + (k) => ( + (data[i].Tags[j].props[k].type === filter) // eslint-disable-line + ? 1 + : (filter === 'isRequired' && data[i].Tags[j].props[k].required) ? 1 : 0 // eslint-disable-line + ) + ).reduce((a, b) => a + b, 0) + : data[i].Tags[j].props.length) + ).reduce((a, b) => a + b, 0) + ).reduce((a, b) => a + b, 0); + + const getUsedTagTotal = (data, filter = false, filterType = false) => Object.keys(data).map( + (i) => ( + (filter) + ? Object.keys(data[i].Using).map((j) => ( + (data[i].Using[j][filterType] === filter) ? 1 : 0 + )).reduce((a, b) => a + b, 0) + : Object.keys(data[i].Using).length + ) + ).reduce((a, b) => a + b, 0); + + const getReusedTagTotal = (data, filter = false) => Object.keys(data).map( + (i) => Object.keys(data[i].Reusing).map( + (j) => ( + (filter) // eslint-disable-line + ? (data[j].Level === filter) ? 1 : 0 // eslint-disable-line + : Object.keys(data[i].Reusing).length) + ).reduce((a, b) => a + b, 0) + ).reduce((a, b) => a + b, 0); + + const getExamplesTotal = (data, filter = false) => Object.keys(data).map( + (i) => ((filter) // eslint-disable-line + ? (data[i].Level === filter) ? data[i].Examples : 0 // eslint-disable-line + : data[i].Examples + ) + ).reduce((a, b) => a + b, 0); + + const getVariablesTotal = (data, filter = false) => Object.keys(data).map( + (i) => ((filter) // eslint-disable-line + ? Object.keys(data[i].variables).map((j) => (data[i].variables[j].kind === filter) ? 1 : 0).reduce((a, b) => a + b, 0) // eslint-disable-line + : data[i].variables.length + ) + ).reduce((a, b) => a + b, 0); + + const getLoopsTotal = (data, filter = false) => Object.keys(data).map( + (i) => ((filter) // eslint-disable-line + ? Object.keys(data[i].loops).map((j) => (data[i].loops[j].type === filter) ? 1 : 0).reduce((a, b) => a + b, 0) // eslint-disable-line + : data[i].loops.length + ) + ).reduce((a, b) => a + b, 0); + + const getMethodsTotal = (data, filter = false) => Object.keys(data).map( + (i) => ((filter) // eslint-disable-line + ? Object.keys(data[i].methods).map((j) => (data[i].methods[j].type === filter) ? 1 : 0).reduce((a, b) => a + b, 0) // eslint-disable-line + : data[i].methods.length + ) + ).reduce((a, b) => a + b, 0); + + const getExpressionsTotal = (data, filter = false) => Object.keys(data).map( + (i) => ((filter) // eslint-disable-line + ? Object.keys(data[i].expressions).map((j) => (data[i].expressions[j].type === filter) ? 1 : 0).reduce((a, b) => a + b, 0) // eslint-disable-line + : data[i].expressions.length + ) + ).reduce((a, b) => a + b, 0); + + const getSelectorTotals = (data, filter = false) => Object.keys(data).map( + (i) => ((filter) // eslint-disable-line + ? (i === filter) ? data[i].selectors : 0 // eslint-disable-line + : data[i].selectors + ) + ).reduce((a, b) => a + b, 0); + + const getDeclarationsTotals = (data, filter = false) => Object.keys(data).map( + (i) => ((filter) // eslint-disable-line + ? (i === filter) ? data[i].declarations : 0 // eslint-disable-line + : data[i].declarations + ) + ).reduce((a, b) => a + b, 0); + + const getPropertiesTotals = (data, filter = false) => Object.keys(data).map( + (i) => ((filter) // eslint-disable-line + ? (i === filter) ? data[i].properties : 0 // eslint-disable-line + : data[i].properties + ) + ).reduce((a, b) => a + b, 0); + + const getIdsTotals = (data, filter = false) => Object.keys(data).map( + (i) => ((filter) // eslint-disable-line + ? (i === filter) ? data[i].ids : 0 // eslint-disable-line + : data[i].ids + ) + ).reduce((a, b) => a + b, 0); + + const getClassesTotals = (data, filter = false) => Object.keys(data).map( + (i) => ((filter) // eslint-disable-line + ? (i === filter) ? data[i].classes : 0 // eslint-disable-line + : data[i].classes + ) + ).reduce((a, b) => a + b, 0); + + const getPseudoTotals = (data, filter = false) => Object.keys(data).map( + (i) => ((filter) + ? data[i].pseudo[filter] + : Object.keys(data[i].pseudo).map((j) => data[i].pseudo[j]).reduce((a, b) => a + b, 0) + ) + ).reduce((a, b) => a + b, 0); + + const getLayoutTotals = (data, filter = false) => Object.keys(data).map( + (i) => ((filter) + ? data[i].layout[filter] + : Object.keys(data[i].layout).map((j) => data[i].layout[j]).reduce((a, b) => a + b, 0) + ) + ).reduce((a, b) => a + b, 0); + + const getSkinsTotals = (data, filter = false) => Object.keys(data).map( + (i) => ((filter) + ? data[i].skin[filter] + : Object.keys(data[i].skin).map((j) => data[i].skin[j]).reduce((a, b) => a + b, 0) + ) + ).reduce((a, b) => a + b, 0); + + const getTypographyTotals = (data, filter = false) => Object.keys(data).map( + (i) => ((filter) + ? data[i].typography[filter] + : Object.keys(data[i].typography).map((j) => data[i].typography[j]).reduce((a, b) => a + b, 0) + ) + ).reduce((a, b) => a + b, 0); + + const getSpacingTotals = (data, filter = false, side = false) => Object.keys(data).map( + (i) => (filter && side) // eslint-disable-line + ? data[i].spacing[filter][side] + : 0 + ).reduce((a, b) => a + b, 0); + + const getResetTotals = (data, filter = false, side = false) => Object.keys(data).map( + (i) => (filter && side) // eslint-disable-line + ? data[i].resets[filter][side] + : 0 + ).reduce((a, b) => a + b, 0); + + const getCompairsonTotals = (data, category = false, prop = false, type = false) => Object.keys(data).map( + (i) => (category && prop && type) // eslint-disable-line + ? data[i].comparison[category][prop][type] + : 0 + ).reduce((a, b) => a + b, 0); + const init = () => { + // Install JSX Size card + ui.cards.jsxSize.innerHTML = getAssetsTotal(getFilteredData(__stats__, ['/*.jsx$']), 'JSX Size:'); + createAtomicList(ui.JSXAtomicList, getFilteredData(__stats__, ['/*.jsx$'])); + renderDoughnutChart(ui.charts.JSXChart, getFilteredData(__stats__, ['/*.jsx$']), 'Project JSX (files and atomic levels)'); + // Install JS Size card ui.cards.jsSize.innerHTML = getAssetsTotal(getFilteredData(__stats__, ['/*.js$']), 'JS Size:'); createAtomicList(ui.JSAtomicList, getFilteredData(__stats__, ['/*.js$'])); @@ -382,114 +578,136 @@ export const GuideMetrics = (el) => { createAtomicList(ui.MediaAtomicList, getFilteredData(__stats__, ['/*.svg', '/*.jpg', '/*.png'])); renderDoughnutChart(ui.charts.MediaChart, getFilteredData(__stats__, ['/*.svg', '/*.jpg', '/*.png']), 'Project Media (files and atomic levels)'); - if (process.env.NODE_ENV === 'development') { - // Install Total Builds card - // ui.cards.totalBuilds.innerHTML = `Build Counts / Time${__stats__.builds.count} / ${__stats__.builds.time}ms`; - - // Install Total Errors card - // ui.cards.totalErrors.innerHTML = `Build Fails${__stats__.builds.errors}`; - } + // Install JS Metrics + ui.jsxMetrics.roots.innerHTML = `${getRootTagTotal(__jsxDocs__)} / Root elements`; // eslint-disable-line + ui.jsxMetrics.subs.innerHTML = `${getSubTagTotal(__jsxDocs__)} / Root__Sub elements`; // eslint-disable-line + + ui.jsxMetrics.props.innerHTML = `${getPropsTotal(__jsxDocs__)} / Total props`; // eslint-disable-line + ui.jsxMetrics.strings.innerHTML = `${getPropsTotal(__jsxDocs__, 'string')} / propTypes.strings`; // eslint-disable-line + ui.jsxMetrics.elements.innerHTML = `${getPropsTotal(__jsxDocs__, 'element')} / propTypes.elements`; // eslint-disable-line + ui.jsxMetrics.funcs.innerHTML = `${getPropsTotal(__jsxDocs__, 'function')} / propTypes.functions`; // eslint-disable-line + ui.jsxMetrics.nodes.innerHTML = `${getPropsTotal(__jsxDocs__, 'node')} / propTypes.nodes`; // eslint-disable-line + ui.jsxMetrics.oneOfs.innerHTML = `${getPropsTotal(__jsxDocs__, 'oneOf')} / propTypes.oneOfs`; // eslint-disable-line + ui.jsxMetrics.oneOfTypes.innerHTML = `${getPropsTotal(__jsxDocs__, 'oneOfType')} / propTypes.oneOfTypes`; // eslint-disable-line + ui.jsxMetrics.isReuireds.innerHTML = `${getPropsTotal(__jsxDocs__, 'isRequired')} / propTypes.isRequired`; // eslint-disable-line + + ui.jsxMetrics.used.innerHTML = `${getUsedTagTotal(__jsxDocs__)} / Total used`; // eslint-disable-line + ui.jsxMetrics.usedRoots.innerHTML = `${getUsedTagTotal(__jsxDocs__, 'root', 'tagType')} / Root elements`; // eslint-disable-line + ui.jsxMetrics.usedSubs.innerHTML = `${getUsedTagTotal(__jsxDocs__, 'sub', 'tagType')} / Sub elements`; // eslint-disable-line + ui.jsxMetrics.usedAtoms.innerHTML = `${getUsedTagTotal(__jsxDocs__, 'atoms', 'tagLevel')} / Atoms`; // eslint-disable-line + ui.jsxMetrics.usedMolecules.innerHTML = `${getUsedTagTotal(__jsxDocs__, 'molecules', 'tagLevel')} / Molecules used`; // eslint-disable-line + ui.jsxMetrics.usedOrganisms.innerHTML = `${getUsedTagTotal(__jsxDocs__, 'organisms', 'tagLevel')} / Organisms used`; // eslint-disable-line + ui.jsxMetrics.usedTemplates.innerHTML = `${getUsedTagTotal(__jsxDocs__, 'templates', 'tagLevel')} / Templates used`; // eslint-disable-line + + ui.jsxMetrics.examples.innerHTML = `${getExamplesTotal(__jsxDocs__)} / Total examples`; // eslint-disable-line + ui.jsxMetrics.exampleExports.innerHTML = `FIXME / Exported`; // eslint-disable-line + ui.jsxMetrics.exampleReused.innerHTML = `${getReusedTagTotal(__jsxDocs__)} / Utils.getExample`; // eslint-disable-line + + ui.jsxMetrics.exampleAtoms.innerHTML = `${getExamplesTotal(__jsxDocs__, 'atoms')} / Atoms examples`; // eslint-disable-line + ui.jsxMetrics.exampleMolecules.innerHTML = `${getExamplesTotal(__jsxDocs__, 'molecules')} / Molecules examples`; // eslint-disable-line + ui.jsxMetrics.exampleOrganisms.innerHTML = `${getExamplesTotal(__jsxDocs__, 'organisms')} / Organisms examples`; // eslint-disable-line + ui.jsxMetrics.exampleTemplates.innerHTML = `${getExamplesTotal(__jsxDocs__, 'templates')} / Templates examples`; // eslint-disable-line // Install JS Metrics - ui.jsMetrics.variables.innerHTML = `${__stats__.js.variables.all} / variables`; - ui.jsMetrics.loops.innerHTML = `${__stats__.js.loops.all} / loops`; - ui.jsMetrics.methods.innerHTML = `${__stats__.js.methods.all} / functions`; - ui.jsMetrics.expressions.innerHTML = `${__stats__.js.expressions.all} / expressions`; + ui.jsMetrics.variables.innerHTML = `${getVariablesTotal(__esDocs__)} / Variables`; // eslint-disable-line + ui.jsMetrics.loops.innerHTML = `${getLoopsTotal(__esDocs__)} / Loops`; // eslint-disable-line + ui.jsMetrics.methods.innerHTML = `${getMethodsTotal(__esDocs__)} / Functions`; // eslint-disable-line + ui.jsMetrics.expressions.innerHTML = `${getExpressionsTotal(__esDocs__)} / Expressions`; // eslint-disable-line - ui.jsMetrics.const.innerHTML = `${__stats__.js.variables.const} / const`; - ui.jsMetrics.lets.innerHTML = `${__stats__.js.variables.lets} / lets`; + ui.jsMetrics.const.innerHTML = `${getVariablesTotal(__esDocs__, 'const')} / const`; // eslint-disable-line + ui.jsMetrics.lets.innerHTML = `${getVariablesTotal(__esDocs__, 'let')} / lets`; // eslint-disable-line - ui.jsMetrics.for.innerHTML = `${__stats__.js.loops.for} / for() loops`; - ui.jsMetrics.forIn.innerHTML = `${__stats__.js.loops.forIn} / forIn() loops`; - ui.jsMetrics.forOf.innerHTML = `${__stats__.js.loops.forOf} / forOf() loops`; - ui.jsMetrics.while.innerHTML = `${__stats__.js.loops.while} / while() loops`; - ui.jsMetrics.object.innerHTML = `${__stats__.js.loops.object} / object.key() loops`; + ui.jsMetrics.for.innerHTML = `${getLoopsTotal(__esDocs__, 'ForStatement')} / for() Loops`; // eslint-disable-line + ui.jsMetrics.forIn.innerHTML = `${getLoopsTotal(__esDocs__, 'ForInStatement')} / forIn() Loops`; // eslint-disable-line + ui.jsMetrics.forOf.innerHTML = `${getLoopsTotal(__esDocs__, 'ForOfStatement')} / forOf() Loops`; // eslint-disable-line + ui.jsMetrics.while.innerHTML = `${getLoopsTotal(__esDocs__, 'WhileStatement')} / while() Loops`; // eslint-disable-line + ui.jsMetrics.object.innerHTML = `${getLoopsTotal(__esDocs__, 'ObjectKeysExpression')} / object.key() Loops`; // eslint-disable-line - ui.jsMetrics.functions.innerHTML = `${__stats__.js.methods.functions} / Functions()`; - ui.jsMetrics.arrows.innerHTML = `${__stats__.js.methods.arrows} / (Arrows) =>`; + ui.jsMetrics.functions.innerHTML = `${getMethodsTotal(__esDocs__, 'FunctionExpression')} / Functions()`; // eslint-disable-line + ui.jsMetrics.arrows.innerHTML = `${getMethodsTotal(__esDocs__, 'ArrowFunctionExpression')} / (Arrows) =>`; // eslint-disable-line - ui.jsMetrics.calls.innerHTML = `${__stats__.js.expressions.calls} / x() calls`; - ui.jsMetrics.members.innerHTML = `${__stats__.js.expressions.members} / x.y() members`; - ui.jsMetrics.assignments.innerHTML = `${__stats__.js.expressions.assignments} / x = y assignments`; + ui.jsMetrics.calls.innerHTML = `${getExpressionsTotal(__esDocs__, 'CallExpression')} / x() Calls`; // eslint-disable-line + ui.jsMetrics.members.innerHTML = `${getExpressionsTotal(__esDocs__, 'MemberExpression')} / x.y() Members`; // eslint-disable-line + ui.jsMetrics.assignments.innerHTML = `${getExpressionsTotal(__esDocs__, 'AssignmentExpression')} / x = y Assignments`; // eslint-disable-line // Install CSS Metrics - ui.cssMetrics.selectors.innerHTML = `${__stats__.css.selectors} / selectors`; - ui.cssMetrics.declarations.innerHTML = `${__stats__.css.selectors} / declarations`; - ui.cssMetrics.declarations.innerHTML = `${__stats__.css.declarations} / declarations`; - ui.cssMetrics.properties.innerHTML = `${__stats__.css.properties} / properties`; - ui.cssMetrics.ids.innerHTML = `${__stats__.css.ids} / ids`; - ui.cssMetrics.classes.innerHTML = `${__stats__.css.classes} / classes`; - ui.cssMetrics.pseudoClass.innerHTML = `${__stats__.css.pseudo.class} / pseudo class`; - ui.cssMetrics.pseudoElement.innerHTML = `${__stats__.css.pseudo.element} / pseudo element`; - - ui.cssMetrics.display.innerHTML = `${__stats__.css.layout.display} / display`; - ui.cssMetrics.float.innerHTML = `${__stats__.css.layout.float} / float`; - ui.cssMetrics.width.innerHTML = `${__stats__.css.layout.width} / width`; - ui.cssMetrics.height.innerHTML = `${__stats__.css.layout.height} / height`; - ui.cssMetrics.maxWidth.innerHTML = `${__stats__.css.layout.maxWidth} / max-width`; - ui.cssMetrics.minWidth.innerHTML = `${__stats__.css.layout.minWidth} / min-width`; - ui.cssMetrics.maxHeight.innerHTML = `${__stats__.css.layout.maxHeight} / max-height`; - ui.cssMetrics.minHeight.innerHTML = `${__stats__.css.layout.minHeight} / min-height`; - - ui.cssMetrics.color.innerHTML = `${__stats__.css.skin.color} / color`; - ui.cssMetrics.backgroundColor.innerHTML = `${__stats__.css.skin.backgroundColor} / background-color`; - ui.cssMetrics.borderColor.innerHTML = `${__stats__.css.skin.borderColor} / border-color`; - ui.cssMetrics.boxShadow.innerHTML = `${__stats__.css.skin.boxShadow} / box-shadow`; - - ui.cssMetrics.family.innerHTML = `${__stats__.css.typography.family} / font-family`; - ui.cssMetrics.size.innerHTML = `${__stats__.css.typography.size} / font-size`; - ui.cssMetrics.weight.innerHTML = `${__stats__.css.typography.weight} / font-weight`; - ui.cssMetrics.alignment.innerHTML = `${__stats__.css.typography.alignment} / text-align`; - ui.cssMetrics.lineHeight.innerHTML = `${__stats__.css.typography.lineHeight} / line-height`; - ui.cssMetrics.letterSpace.innerHTML = `${__stats__.css.typography.letterSpace} / letter-spacing`; - ui.cssMetrics.decoration.innerHTML = `${__stats__.css.typography.decoration} / decoration`; - ui.cssMetrics.transform.innerHTML = `${__stats__.css.typography.transform} / transform`; - ui.cssMetrics.shadow.innerHTML = `${__stats__.css.typography.shadow} / shadow`; - - ui.cssMetrics.spacingPadding.innerHTML = `${__stats__.css.spacing.padding.all} / padding`; - ui.cssMetrics.spacingPaddingTop.innerHTML = `${__stats__.css.spacing.padding.top} / padding-top`; - ui.cssMetrics.spacingPaddingRight.innerHTML = `${__stats__.css.spacing.padding.right} / padding-right`; - ui.cssMetrics.spacingPaddingBottom.innerHTML = `${__stats__.css.spacing.padding.bottom} / padding-bottom`; - ui.cssMetrics.spacingPaddingLeft.innerHTML = `${__stats__.css.spacing.padding.left} / padding-left`; - - ui.cssMetrics.spacingMargin.innerHTML = `${__stats__.css.spacing.margin.all} / margin`; - ui.cssMetrics.spacingMarginTop.innerHTML = `${__stats__.css.spacing.margin.top} / margin-top`; - ui.cssMetrics.spacingMarginRight.innerHTML = `${__stats__.css.spacing.margin.right} / margin-right`; - ui.cssMetrics.spacingMarginBottom.innerHTML = `${__stats__.css.spacing.margin.bottom} / margin-bottom`; - ui.cssMetrics.spacingMarginLeft.innerHTML = `${__stats__.css.spacing.margin.left} / margin-left`; - - ui.cssMetrics.resetPadding.innerHTML = `${__stats__.css.resets.padding.all} / padding`; - ui.cssMetrics.resetPaddingTop.innerHTML = `${__stats__.css.resets.padding.top} / padding-top`; - ui.cssMetrics.resetPaddingRight.innerHTML = `${__stats__.css.resets.padding.right} / padding-right`; - ui.cssMetrics.resetPaddingBottom.innerHTML = `${__stats__.css.resets.padding.bottom} / padding-bottom`; - ui.cssMetrics.resetPaddingLeft.innerHTML = `${__stats__.css.resets.padding.left} / padding-left`; - - ui.cssMetrics.resetMargin.innerHTML = `${__stats__.css.resets.margin.all} / margin`; - ui.cssMetrics.resetMarginTop.innerHTML = `${__stats__.css.resets.margin.top} / margin-top`; - ui.cssMetrics.resetMarginRight.innerHTML = `${__stats__.css.resets.margin.right} / margin-right`; - ui.cssMetrics.resetMarginBottom.innerHTML = `${__stats__.css.resets.margin.bottom} / margin-bottom`; - ui.cssMetrics.resetMarginLeft.innerHTML = `${__stats__.css.resets.margin.left} / margin-left`; - - ui.cssMetrics.compDisplay.innerHTML = `Display
${__stats__.css.comparison.layout.display.unique} Unique ${__stats__.css.comparison.layout.display.repeated} Repeated`; - ui.cssMetrics.compFloat.innerHTML = `Float
${__stats__.css.comparison.layout.float.unique} Unique ${__stats__.css.comparison.layout.float.repeated} Repeated`; - ui.cssMetrics.compWidth.innerHTML = `Width
${__stats__.css.comparison.layout.width.unique} Unique ${__stats__.css.comparison.layout.width.repeated} Repeated`; - ui.cssMetrics.compHeight.innerHTML = `Height
${__stats__.css.comparison.layout.height.unique} Unique ${__stats__.css.comparison.layout.height.repeated} Repeated`; - ui.cssMetrics.compMinWidth.innerHTML = `Min-width
${__stats__.css.comparison.layout.minWidth.unique} Unique ${__stats__.css.comparison.layout.minWidth.repeated} Repeated`; - ui.cssMetrics.compMaxWidth.innerHTML = `Max-width
${__stats__.css.comparison.layout.maxWidth.unique} Unique ${__stats__.css.comparison.layout.maxWidth.repeated} Repeated`; - ui.cssMetrics.compMinHeight.innerHTML = `Min-height
${__stats__.css.comparison.layout.minHeight.unique} Unique ${__stats__.css.comparison.layout.minHeight.repeated} Repeated`; - ui.cssMetrics.compMaxHeight.innerHTML = `Max-height
${__stats__.css.comparison.layout.maxHeight.unique} Unique ${__stats__.css.comparison.layout.maxHeight.repeated} Repeated`; - - ui.cssMetrics.compPadding.innerHTML = `Padding
${__stats__.css.comparison.padding.all.unique} Unique ${__stats__.css.comparison.padding.all.repeated} Repeated`; - ui.cssMetrics.compPaddingTop.innerHTML = `Padding-top
${__stats__.css.comparison.padding.top.unique} Unique ${__stats__.css.comparison.padding.top.repeated} Repeated`; - ui.cssMetrics.compPaddingRight.innerHTML = `Padding-right
${__stats__.css.comparison.padding.right.unique} Unique ${__stats__.css.comparison.padding.right.repeated} Repeated`; - ui.cssMetrics.compPaddingBottom.innerHTML = `Padding-bottom
${__stats__.css.comparison.padding.bottom.unique} Unique ${__stats__.css.comparison.padding.bottom.repeated} Repeated`; - ui.cssMetrics.compPaddingLeft.innerHTML = `Padding-left
${__stats__.css.comparison.padding.left.unique} Unique ${__stats__.css.comparison.padding.left.repeated} Repeated`; - - ui.cssMetrics.compMargin.innerHTML = `Margin
${__stats__.css.comparison.margin.all.unique} Unique ${__stats__.css.comparison.margin.all.repeated} Repeated`; - ui.cssMetrics.compMarginTop.innerHTML = `Margin-top
${__stats__.css.comparison.margin.top.unique} Unique ${__stats__.css.comparison.margin.top.repeated} Repeated`; - ui.cssMetrics.compMarginRight.innerHTML = `Margin-right
${__stats__.css.comparison.margin.right.unique} Unique ${__stats__.css.comparison.margin.right.repeated} Repeated`; - ui.cssMetrics.compMarginBottom.innerHTML = `Margin-bottom
${__stats__.css.comparison.margin.bottom.unique} Unique ${__stats__.css.comparison.margin.bottom.repeated} Repeated`; - ui.cssMetrics.compMarginLeft.innerHTML = `Margin-left
${__stats__.css.comparison.margin.left.unique} Unique ${__stats__.css.comparison.margin.left.repeated} Repeated`; + ui.cssMetrics.selectors.innerHTML = `${getSelectorTotals(__stats__.css)} / Selectors`; + ui.cssMetrics.declarations.innerHTML = `${getDeclarationsTotals(__stats__.css)} / Declarations`; + ui.cssMetrics.properties.innerHTML = `${getPropertiesTotals(__stats__.css)} / Properties`; + ui.cssMetrics.ids.innerHTML = `${getIdsTotals(__stats__.css)} / #ids`; + ui.cssMetrics.classes.innerHTML = `${getClassesTotals(__stats__.css)} / .classes`; + ui.cssMetrics.pseudoClass.innerHTML = `${getPseudoTotals(__stats__.css, 'class')} / Pseudo class`; + ui.cssMetrics.pseudoElement.innerHTML = `${getPseudoTotals(__stats__.css, 'element')} / Pseudo element`; + + ui.cssMetrics.display.innerHTML = `${getLayoutTotals(__stats__.css, 'display')} / Display`; + ui.cssMetrics.float.innerHTML = `${getLayoutTotals(__stats__.css, 'float')} / Float`; + ui.cssMetrics.width.innerHTML = `${getLayoutTotals(__stats__.css, 'width')} / Width`; + ui.cssMetrics.height.innerHTML = `${getLayoutTotals(__stats__.css, 'height')} / Height`; + ui.cssMetrics.maxWidth.innerHTML = `${getLayoutTotals(__stats__.css, 'maxWidth')} / Max-width`; + ui.cssMetrics.minWidth.innerHTML = `${getLayoutTotals(__stats__.css, 'minWidth')} / Min-width`; + ui.cssMetrics.maxHeight.innerHTML = `${getLayoutTotals(__stats__.css, 'maxHeight')} / Max-height`; + ui.cssMetrics.minHeight.innerHTML = `${getLayoutTotals(__stats__.css, 'minHeight')} / Min-height`; + + ui.cssMetrics.color.innerHTML = `${getSkinsTotals(__stats__.css, 'color')} / Color`; + ui.cssMetrics.backgroundColor.innerHTML = `${getSkinsTotals(__stats__.css, 'backgroundColor')} / Background-color`; + ui.cssMetrics.borderColor.innerHTML = `${getSkinsTotals(__stats__.css, 'borderColor')} / Border-color`; + ui.cssMetrics.boxShadow.innerHTML = `${getSkinsTotals(__stats__.css, 'boxShadow')} / Box-shadow`; + + ui.cssMetrics.family.innerHTML = `${getTypographyTotals(__stats__.css, 'family')} / Font-family`; + ui.cssMetrics.size.innerHTML = `${getTypographyTotals(__stats__.css, 'size')} / Font-size`; + ui.cssMetrics.weight.innerHTML = `${getTypographyTotals(__stats__.css, 'weight')} / Font-weight`; + ui.cssMetrics.alignment.innerHTML = `${getTypographyTotals(__stats__.css, 'alignment')} / Text-align`; + ui.cssMetrics.lineHeight.innerHTML = `${getTypographyTotals(__stats__.css, 'lineHeight')} / Line-height`; + ui.cssMetrics.letterSpace.innerHTML = `${getTypographyTotals(__stats__.css, 'letterSpace')} / Letter-spacing`; + ui.cssMetrics.decoration.innerHTML = `${getTypographyTotals(__stats__.css, 'decoration')} / Decoration`; + ui.cssMetrics.transform.innerHTML = `${getTypographyTotals(__stats__.css, 'transform')} / Transform`; + ui.cssMetrics.shadow.innerHTML = `${getTypographyTotals(__stats__.css, 'shadow')} / Shadow`; + + ui.cssMetrics.spacingPadding.innerHTML = `${getSpacingTotals(__stats__.css, 'padding', 'all')} / Padding`; + ui.cssMetrics.spacingPaddingTop.innerHTML = `${getSpacingTotals(__stats__.css, 'padding', 'top')} / Padding-top`; + ui.cssMetrics.spacingPaddingRight.innerHTML = `${getSpacingTotals(__stats__.css, 'padding', 'right')} / Padding-right`; + ui.cssMetrics.spacingPaddingBottom.innerHTML = `${getSpacingTotals(__stats__.css, 'padding', 'bottom')} / Padding-bottom`; + ui.cssMetrics.spacingPaddingLeft.innerHTML = `${getSpacingTotals(__stats__.css, 'padding', 'left')} / Padding-left`; + + ui.cssMetrics.spacingMargin.innerHTML = `${getSpacingTotals(__stats__.css, 'margin', 'all')} / Margin`; + ui.cssMetrics.spacingMarginTop.innerHTML = `${getSpacingTotals(__stats__.css, 'margin', 'top')} / Margin-top`; + ui.cssMetrics.spacingMarginRight.innerHTML = `${getSpacingTotals(__stats__.css, 'margin', 'right')} / Margin-right`; + ui.cssMetrics.spacingMarginBottom.innerHTML = `${getSpacingTotals(__stats__.css, 'margin', 'bottom')} / Margin-bottom`; + ui.cssMetrics.spacingMarginLeft.innerHTML = `${getSpacingTotals(__stats__.css, 'margin', 'left')} / Margin-left`; + + ui.cssMetrics.resetPadding.innerHTML = `${getResetTotals(__stats__.css, 'padding', 'all')} / Padding`; + ui.cssMetrics.resetPaddingTop.innerHTML = `${getResetTotals(__stats__.css, 'padding', 'top')} / Padding-top`; + ui.cssMetrics.resetPaddingRight.innerHTML = `${getResetTotals(__stats__.css, 'padding', 'right')} / Padding-right`; + ui.cssMetrics.resetPaddingBottom.innerHTML = `${getResetTotals(__stats__.css, 'padding', 'bottom')} / Padding-bottom`; + ui.cssMetrics.resetPaddingLeft.innerHTML = `${getResetTotals(__stats__.css, 'padding', 'left')} / Padding-left`; + + ui.cssMetrics.resetMargin.innerHTML = `${getResetTotals(__stats__.css, 'margin', 'all')} / Margin`; + ui.cssMetrics.resetMarginTop.innerHTML = `${getResetTotals(__stats__.css, 'margin', 'top')} / Margin-top`; + ui.cssMetrics.resetMarginRight.innerHTML = `${getResetTotals(__stats__.css, 'margin', 'right')} / Margin-right`; + ui.cssMetrics.resetMarginBottom.innerHTML = `${getResetTotals(__stats__.css, 'margin', 'bottom')} / Margin-bottom`; + ui.cssMetrics.resetMarginLeft.innerHTML = `${getResetTotals(__stats__.css, 'margin', 'left')} / Margin-left`; + + + ui.cssMetrics.compDisplay.innerHTML = `Display
${getCompairsonTotals(__stats__.css, 'layout', 'display', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'layout', 'display', 'repeated')} Repeated`; + ui.cssMetrics.compFloat.innerHTML = `Float
${getCompairsonTotals(__stats__.css, 'layout', 'float', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'layout', 'float', 'repeated')} Repeated`; + ui.cssMetrics.compWidth.innerHTML = `Width
${getCompairsonTotals(__stats__.css, 'layout', 'width', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'layout', 'width', 'repeated')} Repeated`; + ui.cssMetrics.compHeight.innerHTML = `Height
${getCompairsonTotals(__stats__.css, 'layout', 'height', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'layout', 'height', 'repeated')} Repeated`; + ui.cssMetrics.compMinWidth.innerHTML = `Min-width
${getCompairsonTotals(__stats__.css, 'layout', 'minWidth', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'layout', 'minWidth', 'repeated')} Repeated`; + ui.cssMetrics.compMaxWidth.innerHTML = `Max-width
${getCompairsonTotals(__stats__.css, 'layout', 'maxWidth', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'layout', 'maxWidth', 'repeated')} Repeated`; + ui.cssMetrics.compMinHeight.innerHTML = `Min-height
${getCompairsonTotals(__stats__.css, 'layout', 'minHeight', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'layout', 'minHeight', 'repeated')} Repeated`; + ui.cssMetrics.compMaxHeight.innerHTML = `Max-height
${getCompairsonTotals(__stats__.css, 'layout', 'maxHeight', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'layout', 'maxHeight', 'repeated')} Repeated`; + + ui.cssMetrics.compPadding.innerHTML = `Padding
${getCompairsonTotals(__stats__.css, 'padding', 'all', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'padding', 'all', 'repeated')} Repeated`; + ui.cssMetrics.compPaddingTop.innerHTML = `Padding-top
${getCompairsonTotals(__stats__.css, 'padding', 'top', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'padding', 'top', 'repeated')} Repeated`; + ui.cssMetrics.compPaddingRight.innerHTML = `Padding-right
${getCompairsonTotals(__stats__.css, 'padding', 'right', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'padding', 'right', 'repeated')} Repeated`; + ui.cssMetrics.compPaddingBottom.innerHTML = `Padding-bottom
${getCompairsonTotals(__stats__.css, 'padding', 'bottom', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'padding', 'bottom', 'repeated')} Repeated`; + ui.cssMetrics.compPaddingLeft.innerHTML = `Padding-left
${getCompairsonTotals(__stats__.css, 'padding', 'left', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'padding', 'left', 'repeated')} Repeated`; + + ui.cssMetrics.compMargin.innerHTML = `Margin
${getCompairsonTotals(__stats__.css, 'margin', 'all', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'margin', 'all', 'repeated')} Repeated`; + ui.cssMetrics.compMarginTop.innerHTML = `Margin-top
${getCompairsonTotals(__stats__.css, 'margin', 'top', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'margin', 'top', 'repeated')} Repeated`; + ui.cssMetrics.compMarginRight.innerHTML = `Margin-right
${getCompairsonTotals(__stats__.css, 'margin', 'right', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'margin', 'right', 'repeated')} Repeated`; + ui.cssMetrics.compMarginBottom.innerHTML = `Margin-bottom
${getCompairsonTotals(__stats__.css, 'margin', 'bottom', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'margin', 'bottom', 'repeated')} Repeated`; + ui.cssMetrics.compMarginLeft.innerHTML = `Margin-left
${getCompairsonTotals(__stats__.css, 'margin', 'left', 'unique')} Unique ${getCompairsonTotals(__stats__.css, 'margin', 'left', 'repeated')} Repeated`; // Install media metrics ui.mediaMetrics.counts.all.innerHTML = `Total / ${getMediaFiles(__stats__.files).length}`; diff --git a/build/guide/src/elements/organisms/Metrics/Metrics.css b/build/guide/src/elements/organisms/Metrics/Metrics.css index 18ad634..d4f5062 100644 --- a/build/guide/src/elements/organisms/Metrics/Metrics.css +++ b/build/guide/src/elements/organisms/Metrics/Metrics.css @@ -31,7 +31,7 @@ align-items: flex-start; .guide__card__body { position: sticky; - align-self: top; + align-self: bottom; top: 0; bottom: 0; width: 100%; @@ -63,6 +63,7 @@ width: 100%; &.fall-flip { + margin: rem(5px); animation: 2s ease-in-out fall-flip forwards; } @@ -96,16 +97,21 @@ } &.guide__card:nth-child(1) { + background-color: #5a9af1; + color: var(--color-white); + } + + &.guide__card:nth-child(2) { background-color: #f1e05a; color: var(--color-black); } - &.guide__card:nth-child(2) { + &.guide__card:nth-child(3) { background-color: #563d7c; color: var(--color-white); } - &.guide__card:nth-child(3) { + &.guide__card:nth-child(4) { background-color: #90c185; color: var(--color-white); } diff --git a/build/guide/src/elements/organisms/Metrics/Metrics.jsx b/build/guide/src/elements/organisms/Metrics/Metrics.jsx index 32e7384..29f57d0 100644 --- a/build/guide/src/elements/organisms/Metrics/Metrics.jsx +++ b/build/guide/src/elements/organisms/Metrics/Metrics.jsx @@ -21,6 +21,9 @@ export const Metrics = () => { + + + @@ -33,6 +36,57 @@ export const Metrics = () => { + {/* JSX React */} +
+ + + + + + + General JSX Metrics +
+
+
+
+ + JSX Prop Metrics +
+
+
+
+
+
+
+
+
+
+ + JSX Usage Metrics +
+
+
+
+
+
+
+
+
+ + JSX Example Metrics +
+
+
+
+
+
+
+
+
+ + +
+ {/* JAVASCRIPT */}
diff --git a/build/scaffolding/elements/[name].example.jsx b/build/scaffolding/elements/[name].example.jsx index 4b806d3..8c75979 100644 --- a/build/scaffolding/elements/[name].example.jsx +++ b/build/scaffolding/elements/[name].example.jsx @@ -28,11 +28,11 @@ export default [{ { name: 'Default styling', description: '', - staticPath: '', + exports: '', + notes: '', component: ( <{{name}}>Lorem ipsum - ), - notes: '' + ) } ] }]; diff --git a/build/scaffolding/modifiers/[name].example.jsx b/build/scaffolding/modifiers/[name].example.jsx index e9fd957..04adc0f 100644 --- a/build/scaffolding/modifiers/[name].example.jsx +++ b/build/scaffolding/modifiers/[name].example.jsx @@ -26,11 +26,11 @@ export default [{ { name: 'Default styling', description: '', - staticPath: '', + exports: '', + notes: '', component: (
Lorem ipsum
- ), - notes: '' + ) } ] }]; diff --git a/build/static.jsx b/build/static.jsx index 53464cb..c4c8879 100644 --- a/build/static.jsx +++ b/build/static.jsx @@ -12,14 +12,14 @@ Object.keys(components).map((i) => { Object.keys(examples).map((j) => { const example = examples[j]; const { component } = example; - const { staticPath } = example; + const { exports } = example; const { name } = component.type; - if (staticPath) { + if (exports) { global.components.push({ name, source: component, - staticPath + exports }); } return false; diff --git a/package-lock.json b/package-lock.json index ba2a6dc..57f2121 100644 --- a/package-lock.json +++ b/package-lock.json @@ -62,6 +62,37 @@ } } }, + "@babel/generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/helper-annotate-as-pure": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", @@ -434,14 +465,145 @@ "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", - "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.4.tgz", + "integrity": "sha512-MJbxGSmejEFVOANAezdO39SObkURO5o/8b6fSH6D1pi9RZQt+ldppKPXfqgUWpSQ9asM6xaSaSJIaeWMDRP0Zg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", "@babel/plugin-syntax-async-generators": "^7.8.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", + "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "dev": true + }, + "@babel/traverse": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-proposal-class-properties": { @@ -475,13 +637,21 @@ } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } } }, "@babel/plugin-proposal-numeric-separator": { @@ -516,13 +686,21 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", - "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz", + "integrity": "sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } } }, "@babel/plugin-proposal-unicode-property-regex": { @@ -728,12 +906,20 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", - "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } } }, "@babel/plugin-transform-function-name": { @@ -1176,6 +1362,62 @@ "regenerator-runtime": "^0.13.4" } }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "dev": true + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/traverse": { "version": "7.9.6", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", @@ -1208,14 +1450,22 @@ } }, "@babel/types": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", - "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.5", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==", + "dev": true + } } }, "@jimp/bmp": { @@ -2003,49 +2253,11 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "abstract-syntax-tree": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/abstract-syntax-tree/-/abstract-syntax-tree-2.7.0.tgz", - "integrity": "sha512-c12JhRqIQIkDEdO6riuWfplab3gOe0dPx17+XSpyyQcHpFV4S0BruHEeCFl0TcZQyU3m0KCV+Eut2nM2abGqtw==", - "dev": true, - "requires": { - "astring": "^1.3.0", - "asttv": "^1.0.1", - "esquery": "^1.0.1", - "estemplate": "^0.5.1", - "estraverse": "^4.2.0", - "meriyah": "^1.9.1", - "source-map": "^0.7.2", - "to-ast": "^1.0.0" - }, - "dependencies": { - "estemplate": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/estemplate/-/estemplate-0.5.1.tgz", - "integrity": "sha1-FxSp1GGQc4rJWLyv1J4CnNpWo54=", - "dev": true, - "requires": { - "esprima": "^2.7.2", - "estraverse": "^4.1.1" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "to-ast": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-ast/-/to-ast-1.0.0.tgz", - "integrity": "sha1-DEoxyMmO396arwGSx5S0yLEe4oc=", - "dev": true, - "requires": { - "ast-types": "^0.7.2", - "esprima": "^2.1.0" - } - } - } + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true }, "accepts": { "version": "1.3.7", @@ -2355,12 +2567,6 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "ast-types": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", - "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=", - "dev": true - }, "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -2373,18 +2579,6 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, - "astring": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.4.3.tgz", - "integrity": "sha512-yJlJU/bmN820vL+cbWShu2YQU87dBP5V7BH2N4wODapRv27A2dZtUD0LgjP9lZENvPe9XRoSyWx+pZR6qKqNBw==", - "dev": true - }, - "asttv": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/asttv/-/asttv-1.0.1.tgz", - "integrity": "sha512-Ibk9v22jMFoK6yH09oOlea7SIwbDWDzT5nzO56VmCDM5s1sMP/FNqVAcimLuxtVnmgPa75Ffwre1EtQEbysZcg==", - "dev": true - }, "async": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", @@ -3912,12 +4106,48 @@ "typedarray": "^0.0.6" } }, + "condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha1-PemFVTE5R10yUCyDsC9gaE0kxV8=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "config-chain": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", "dev": true, - "optional": true, "requires": { "ini": "^1.3.4", "proto-list": "~1.2.1" @@ -5072,6 +5302,36 @@ "safer-buffer": "^2.1.0" } }, + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -5703,12 +5963,6 @@ "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", "dev": true }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, "esquery": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", @@ -8917,6 +9171,12 @@ "dev": true, "optional": true }, + "is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha1-Fjnssb4DauxppUy7QBz77XEUq38=", + "dev": true + }, "is-whitespace-character": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", @@ -8996,6 +9256,27 @@ "integrity": "sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ==", "dev": true }, + "js-beautify": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.11.0.tgz", + "integrity": "sha512-a26B+Cx7USQGSWnz9YxgJNMmML/QG2nqIaL7VVYPCXbqiKz8PN0waSNvroMtvAK6tY7g/wPdNWGEP+JTNIBr6A==", + "dev": true, + "requires": { + "config-chain": "^1.1.12", + "editorconfig": "^0.15.3", + "glob": "^7.1.3", + "mkdirp": "~1.0.3", + "nopt": "^4.0.3" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9732,12 +10013,6 @@ "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", "dev": true }, - "meriyah": { - "version": "1.9.12", - "resolved": "https://registry.npmjs.org/meriyah/-/meriyah-1.9.12.tgz", - "integrity": "sha512-EgnwghBfzhegstEg3GL17cyjXs/YZOzDGW4mDpiv+v4ZqZgfjNvjfjsAJ99IJMA3LyGvdC8nffZJRGX65FOqLQ==", - "dev": true - }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -10263,6 +10538,16 @@ "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", "dev": true }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -10658,6 +10943,12 @@ "arch": "^2.1.0" } }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", @@ -10714,6 +11005,16 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, "p-cancelable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", @@ -11756,6 +12057,28 @@ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, + "pretty": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", + "integrity": "sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU=", + "dev": true, + "requires": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "pretty-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", @@ -11800,8 +12123,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true, - "optional": true + "dev": true }, "proxy-addr": { "version": "2.0.6", @@ -11823,8 +12145,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true, - "optional": true + "dev": true }, "psl": { "version": "1.8.0", @@ -12995,6 +13316,12 @@ "object-inspect": "^1.7.0" } }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", diff --git a/package.json b/package.json index 2dd34bc..4f472b5 100644 --- a/package.json +++ b/package.json @@ -69,14 +69,18 @@ "devDependencies": { "@babel/core": "^7.5.5", "@babel/parser": "^7.5.5", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", "@babel/plugin-proposal-class-properties": "^7.5.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-proposal-optional-chaining": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", "@babel/plugin-transform-react-display-name": "^7.2.0", "@babel/preset-env": "^7.5.5", "@babel/preset-react": "^7.0.0", "@babel/register": "^7.5.5", "@babel/traverse": "^7.5.5", - "abstract-syntax-tree": "^2.4.0", + "@babel/types": "^7.10.3", "babel-eslint": "^10.0.3", "babel-loader": "^8.0.6", "clean-css": "^4.2.1", @@ -97,7 +101,7 @@ "file-loader": "^4.2.0", "fs-extra": "^8.1.0", "html-loader": "^0.5.5", - "html-webpack-plugin": "^4.0.0-beta.5", + "html-webpack-plugin": "^4.3.0", "image-webpack-loader": "^5.0.0", "loader-utils": "^2.0.0", "mini-css-extract-plugin": "^0.8.0", @@ -108,6 +112,7 @@ "postcss-in-out": "^1.1.0", "postcss-loader": "^3.0.0", "postcss-nested": "^4.1.2", + "pretty": "^2.0.0", "react": "^16.9.0", "react-dom": "^16.9.0", "reset-css": "^4.0.1", diff --git a/src/elements/atoms/Button/Button.example.jsx b/src/elements/atoms/Button/Button.example.jsx index 0601eff..1b7f8b5 100644 --- a/src/elements/atoms/Button/Button.example.jsx +++ b/src/elements/atoms/Button/Button.example.jsx @@ -28,10 +28,7 @@ export default [{ name: 'Default styling', component: ( - ), - options: { - background: '#666' - } + ) }, { name: 'Linked button', component: ( diff --git a/src/elements/atoms/Button/Button.jsx b/src/elements/atoms/Button/Button.jsx index 9718d4e..5be56d9 100644 --- a/src/elements/atoms/Button/Button.jsx +++ b/src/elements/atoms/Button/Button.jsx @@ -19,7 +19,9 @@ export class Button extends React.Component { /** If used, button becomes an anchor tag with button styles */ href: PropTypes.string, /** Children nodes being passed through */ - children: PropTypes.node + children: PropTypes.node, + /** Testing is all */ + newThing: PropTypes.string }; static defaultProps = { diff --git a/src/elements/modifiers/Paddings/Paddings.example.jsx b/src/elements/modifiers/Paddings/Paddings.example.jsx index f9bdf3e..78b3ccb 100644 --- a/src/elements/modifiers/Paddings/Paddings.example.jsx +++ b/src/elements/modifiers/Paddings/Paddings.example.jsx @@ -26,7 +26,7 @@ export default [{ { name: 'Small padding', description: '', - staticPath: '', + exports: '', component: (
{Utils.ipsum('paragraph', 2)}
), @@ -34,7 +34,7 @@ export default [{ }, { name: 'Medium padding', description: '', - staticPath: '', + exports: '', component: (
{Utils.ipsum('paragraph', 2)}
), @@ -42,7 +42,7 @@ export default [{ }, { name: 'Large padding', description: '', - staticPath: '', + exports: '', component: (
{Utils.ipsum('paragraph', 2)}
), @@ -50,7 +50,7 @@ export default [{ }, { name: 'Extra large padding', description: '', - staticPath: '', + exports: '', component: (
{Utils.ipsum('paragraph', 2)}
), diff --git a/src/elements/modifiers/Razor/Razor.example.jsx b/src/elements/modifiers/Razor/Razor.example.jsx new file mode 100644 index 0000000..9343ffa --- /dev/null +++ b/src/elements/modifiers/Razor/Razor.example.jsx @@ -0,0 +1,125 @@ +import { + Using, + Inherit, + Model, + Call, + Code, + Helper, + Html, + If, + Else +} from '@razor'; + +import Button from '@atoms/Button/Button'; // Button used for example sakes + +export default [{ + examples: [ + { + name: '@using', + description: '', + exports: '', + component: ( +
+          { /* Here we are envokng the "path" prop to load in a external resource */ }
+          
+
+          { /* Or you can envoke the "use" prop on that same external resource, but in block form */ }
+          
+            
+          
+        
+ ), + options: { + showAsCode: true + }, + notes: '' + }, { + name: '@inherits', + description: '', + exports: '', + component: ( + // Here we are inheriting an external resource by again envoking the "path" prop +
+          
+        
+ ), + notes: '' + }, { + name: '@Model', + description: '', + exports: '', + component: ( +
+          
+
+          
+        
+ ), + notes: '' + }, { + name: '@if', + description: '', + exports: '', + component: ( +
+          
+            
+          
+        
+ ), + notes: '' + }, { + name: '@if/else', + description: '', + exports: '', + component: ( +
+          
+            
+          
+          
+            
+          
+        
+ ), + notes: '' + }, { + name: '@Html', + description: '', + exports: '', + component: ( +
+          
+        
+ ), + notes: '' + }, { + name: '@Helper', + description: '', + exports: '', + component: ( +
+          
+            
+          
+        
+ ), + notes: '' + }, { + name: '@ code fragments', + description: '', + exports: '', + component: ( +
+          
+            int x = 123;
+            string y = "because.";
+          
+        
+ ), + notes: '' + } + ] +}]; diff --git a/src/elements/modifiers/Razor/Razor.jsx b/src/elements/modifiers/Razor/Razor.jsx new file mode 100644 index 0000000..00caa60 --- /dev/null +++ b/src/elements/modifiers/Razor/Razor.jsx @@ -0,0 +1,321 @@ +/** + A simple re-abstraction of .NET Razor view functionality into JSX tag form. + Allow .NET to do razor view data modeling with-in and exported of JSX examples. +*/ + +/** + @using +*/ + +class Using extends React.Component { + static propTypes = { + /** The path or name of library */ + path: PropTypes.string, + use: PropTypes.string, + children: PropTypes.oneOfType([ + PropTypes.any + ]) + }; + + /** Element level options */ + static options = {}; + + render = () => { + const { + use, + path, + children + } = this.props; + + if (use) { + return ( + + @using {'('}{use}{')'} {'{\r\n'} + {children} + {'\r\n}'} + + ); + } + + return ( + {`@using ${path};\r\n`} + ); + } +} + +/** + @inherit +*/ + +class Inherit extends React.Component { + static propTypes = { + /** The path or name of library */ + path: PropTypes.string + }; + + /** Element level options */ + static options = {}; + + render = () => { + const { + path + } = this.props; + + return ( + {`@inherits ${path};\r\n`} + ); + } +} + + +/** + @Model +*/ + +class Model extends React.Component { + static propTypes = { + /** Expresses what to use from the model */ + use: PropTypes.string, + path: PropTypes.string + }; + + /** Element level options */ + static options = {}; + + render = () => { + const { + use, + path + } = this.props; + + if (use) { + return ( + {`@Model.${use}`} + ); + } + + return ( + {`@model ${path};\r\n`} + ); + } +} + +/** + @Helper +*/ + +class Helper extends React.Component { + static propTypes = { + /** Conditional expression of if statement */ + use: PropTypes.string, + /** Children passed through */ + children: PropTypes.oneOfType([ + PropTypes.any + ]) + }; + + + /** Element level options */ + static options = {}; + + render = () => { + const { + use, + children + } = this.props; + + return ( + + @Helper {use} {'{\r\n'} + {children} + {'\r\n}'} + + ); + } +} + +/** + @Html +*/ + +class Html extends React.Component { + static propTypes = { + /** Expresses what to use from the model */ + use: PropTypes.string + }; + + /** Element level options */ + static options = {}; + + render = () => { + const { + use + } = this.props; + + return ( + {`@Html.${use}`} + ); + } +} + +/** + @Call +*/ + +class Call extends React.Component { + static propTypes = { + /** What to call or render */ + use: PropTypes.string + }; + + /** Element level options */ + static options = {}; + + render = () => { + const { + use + } = this.props; + + return ( + {`@${use}`} + ); + } +} + + +/** + @If +*/ +class If extends React.Component { + static propTypes = { + /** Conditional expression of if statement */ + condition: PropTypes.string, + /** Children passed through */ + children: PropTypes.oneOfType([ + PropTypes.any + ]) + }; + + + /** Element level options */ + static options = {}; + + render = () => { + const { + condition, + children + } = this.props; + + return ( + + @if {'('}{condition}{')'} {'{'} + {children} + {'}'} + + ); + } +} + +/** + @Else +*/ + +class Else extends React.Component { + static propTypes = { + /** Children passed through */ + children: PropTypes.oneOfType([ + PropTypes.any + ]) + }; + + /** Element level options */ + static options = {}; + + render = () => { + const { + children + } = this.props; + + return ( + + else {'{'} + {children} + {'}'} + + ); + } +} + +/** + @Foreach +*/ + +class Foreach extends React.Component { + static propTypes = { + expression: PropTypes.string, + /** Children passed through */ + children: PropTypes.oneOfType([ + PropTypes.any + ]) + }; + + /** Element level options */ + static options = {}; + + render = () => { + const { + children, + expression + } = this.props; + + return ( + + @foreach {'('}{expression}{')'} {'{'} + {children} + {'}'} + + ); + } +} + +/** + @ +*/ + +class Code extends React.Component { + static propTypes = { + /** Children passed through */ + children: PropTypes.string + }; + + /** Element level options */ + static options = {}; + + render = () => { + const { + children + } = this.props; + + return ( + + @{'{'} + {children} + {'}'} + + ); + } +} + + +export { + Using, + Inherit, + Model, + Helper, + Html, + Call, + If, + Else, + Foreach, + Code +};