From da68908bdda3977ba7cb0393a7689080109b2857 Mon Sep 17 00:00:00 2001 From: Alexander Fedyashov Date: Tue, 26 Sep 2017 11:16:06 +0300 Subject: [PATCH] docs(ComponentDoc): refactor, add sidebar navigation --- .../Components/ComponentDoc/ComponentDoc.js | 21 ++++- .../ComponentDoc/ComponentDocLinks.js | 6 +- .../ComponentDoc/ComponentDocSee.js | 10 +-- .../ComponentExample/ComponentExample.js | 1 + .../ComponentProps/ComponentProps.js | 6 +- ...iption.js => ComponentPropsDescription.js} | 6 +- .../ComponentDoc/ComponentSidebar.js | 64 --------------- .../ComponentSidebar/ComponentSidebar.js | 79 ++++++++++++++++++ .../ComponentSidebar/ComponentSidebarItem.js | 28 +++++++ .../ComponentSidebarSection.js | 48 +++++++++++ .../ComponentDoc/ComponentSidebar/index.js | 1 + docs/app/utils/docs.js | 80 ++++++++++++++++--- gulp/plugins/gulp-menugen.js | 17 +++- gulp/plugins/util/parseBuffer.js | 11 +++ gulp/plugins/util/parseDocExample.js | 35 ++++---- gulp/plugins/util/parseDocSection.js | 72 ++++++++++------- yarn.lock | 49 ++---------- 17 files changed, 355 insertions(+), 179 deletions(-) rename docs/app/Components/ComponentDoc/ComponentProps/{ComponentPropsComponentDescription.js => ComponentPropsDescription.js} (73%) delete mode 100644 docs/app/Components/ComponentDoc/ComponentSidebar.js create mode 100644 docs/app/Components/ComponentDoc/ComponentSidebar/ComponentSidebar.js create mode 100644 docs/app/Components/ComponentDoc/ComponentSidebar/ComponentSidebarItem.js create mode 100644 docs/app/Components/ComponentDoc/ComponentSidebar/ComponentSidebarSection.js create mode 100644 docs/app/Components/ComponentDoc/ComponentSidebar/index.js create mode 100644 gulp/plugins/util/parseBuffer.js diff --git a/docs/app/Components/ComponentDoc/ComponentDoc.js b/docs/app/Components/ComponentDoc/ComponentDoc.js index e97f03b28e..578edd5d8a 100644 --- a/docs/app/Components/ComponentDoc/ComponentDoc.js +++ b/docs/app/Components/ComponentDoc/ComponentDoc.js @@ -1,8 +1,11 @@ +import _ from 'lodash' import PropTypes from 'prop-types' import React, { Component } from 'react' import DocumentTitle from 'react-document-title' +import { withRouter } from 'react-router' import { Grid } from 'semantic-ui-react' +import { scrollToAnchor } from 'docs/app/utils' import ComponentDocHeader from './ComponentDocHeader' import ComponentDocLinks from './ComponentDocLinks' import ComponentDocSee from './ComponentDocSee' @@ -12,13 +15,14 @@ import ComponentSidebar from './ComponentSidebar' const topRowStyle = { margin: '1em' } -export default class ComponentDoc extends Component { +class ComponentDoc extends Component { static childContextTypes = { onPassed: PropTypes.func, } static propTypes = { _meta: PropTypes.object, + history: PropTypes.object.isRequired, } state = {} @@ -29,10 +33,22 @@ export default class ComponentDoc extends Component { } } + componentWillReceiveProps() { + this.setState({ activePath: undefined }) + } + handleExamplePassed = (e, { examplePath }) => this.setState({ activePath: examplePath }) handleExamplesRef = examplesRef => this.setState({ examplesRef }) + handleSidebarItemClick = (e, { path }) => { + const { history } = this.props + const aPath = _.kebabCase(_.last(path.split('/'))) + + history.replace(`${location.pathname}#${aPath}`) + scrollToAnchor() + } + render() { const { _meta } = this.props const { activePath, examplesRef } = this.state @@ -61,6 +77,7 @@ export default class ComponentDoc extends Component { activePath={activePath} componentName={_meta.parent || _meta.name} examplesRef={examplesRef} + onItemClick={this.handleSidebarItemClick} /> @@ -69,3 +86,5 @@ export default class ComponentDoc extends Component { ) } } + +export default withRouter(ComponentDoc) diff --git a/docs/app/Components/ComponentDoc/ComponentDocLinks.js b/docs/app/Components/ComponentDoc/ComponentDocLinks.js index 65ac09a155..c3b71d6159 100644 --- a/docs/app/Components/ComponentDoc/ComponentDocLinks.js +++ b/docs/app/Components/ComponentDoc/ComponentDocLinks.js @@ -3,7 +3,7 @@ import React from 'react' import { List } from 'semantic-ui-react' import { pure } from 'docs/app/HOC' -import { getGithubSourceUrl, getPosixPath, getSemanticUIDocsUrl } from 'docs/app/utils' +import { getDocGithubSourceUrl, getPosixPath, getDocSemanticUiUrl } from 'docs/app/utils' const linkListStyle = { background: '#f7f7f7', @@ -16,8 +16,8 @@ const linkListStyle = { } const ComponentDocLinks = ({ componentName, type }) => { - const ghLink = getGithubSourceUrl(componentName) - const suiLink = getSemanticUIDocsUrl(componentName, type) + const ghLink = getDocGithubSourceUrl(componentName) + const suiLink = getDocSemanticUiUrl(componentName, type) return ( diff --git a/docs/app/Components/ComponentDoc/ComponentDocSee.js b/docs/app/Components/ComponentDoc/ComponentDocSee.js index d90ad36d41..7ed1690dc2 100644 --- a/docs/app/Components/ComponentDoc/ComponentDocSee.js +++ b/docs/app/Components/ComponentDoc/ComponentDocSee.js @@ -4,24 +4,24 @@ import React from 'react' import { Link } from 'react-router-dom' import { Header, List } from 'semantic-ui-react' -import { getSeeLinks } from 'docs/app/utils' +import { getDocSeeItems } from 'docs/app/utils' const listStyle = { display: 'block' } const ComponentDocSee = ({ componentName }) => { - const links = getSeeLinks(componentName) + const items = getDocSeeItems(componentName) return ( - {/* still render empty lists to reserve the whitespace */} + {/* Heads up! Still render empty lists to reserve the whitespace */}
0 ? 'See:' : ' '} + content={items.length > 0 ? 'See:' : ' '} size='tiny' /> - {_.map(links, ({ description, name, type }) => ( + {_.map(items, ({ description, name, type }) => ( { const { history } = this.props + history.replace(`${location.pathname}#${this.anchorName}`) scrollToAnchor() } diff --git a/docs/app/Components/ComponentDoc/ComponentProps/ComponentProps.js b/docs/app/Components/ComponentDoc/ComponentProps/ComponentProps.js index 28332eeca6..11151543e1 100644 --- a/docs/app/Components/ComponentDoc/ComponentProps/ComponentProps.js +++ b/docs/app/Components/ComponentDoc/ComponentProps/ComponentProps.js @@ -3,9 +3,9 @@ import React, { Component } from 'react' import { getDocSubComponents } from 'docs/app/utils' import ComponentTable from '../ComponentTable' -import ComponentPropsComponentDescription from './ComponentPropsComponentDescription' -import ComponentPropsHeader from './ComponentPropsHeader' import ComponentPropsComponents from './ComponentPropsComponents' +import ComponentPropsDescription from './ComponentPropsDescription' +import ComponentPropsHeader from './ComponentPropsHeader' export default class ComponentProps extends Component { static propTypes = { @@ -49,7 +49,7 @@ export default class ComponentProps extends Component { {activeName && (
- +
)} diff --git a/docs/app/Components/ComponentDoc/ComponentProps/ComponentPropsComponentDescription.js b/docs/app/Components/ComponentDoc/ComponentProps/ComponentPropsDescription.js similarity index 73% rename from docs/app/Components/ComponentDoc/ComponentProps/ComponentPropsComponentDescription.js rename to docs/app/Components/ComponentDoc/ComponentProps/ComponentPropsDescription.js index 31e0132c3c..18b196a73e 100644 --- a/docs/app/Components/ComponentDoc/ComponentProps/ComponentPropsComponentDescription.js +++ b/docs/app/Components/ComponentDoc/ComponentProps/ComponentPropsDescription.js @@ -10,15 +10,15 @@ const descriptionStyle = { color: '#777', } -const ComponentPropsComponent = ({ name }) => ( +const ComponentPropsDescription = ({ name }) => (
{getDocDescription(name)}
) -ComponentPropsComponent.propTypes = { +ComponentPropsDescription.propTypes = { name: PropTypes.string, } -export default pure(ComponentPropsComponent) +export default pure(ComponentPropsDescription) diff --git a/docs/app/Components/ComponentDoc/ComponentSidebar.js b/docs/app/Components/ComponentDoc/ComponentSidebar.js deleted file mode 100644 index 3aa40915e3..0000000000 --- a/docs/app/Components/ComponentDoc/ComponentSidebar.js +++ /dev/null @@ -1,64 +0,0 @@ -import _ from 'lodash' -import PropTypes from 'prop-types' -import React, { Component } from 'react' -import { Accordion, Icon, Menu, Sticky } from 'semantic-ui-react' -import { withRouter } from 'react-router' - -import { scrollToAnchor } from 'docs/app/utils' -import menuInfo from 'docs/app/menuInfo.json' - -const sidebarStyle = { - background: '#fff', - boxShadow: '0 2px 2px rgba(0, 0, 0, 0.1)', - paddingLeft: '1em', - paddingBottom: '0.1em', - paddingTop: '0.1em', -} - -class ComponentSidebar extends Component { - static propTypes = { - activePath: PropTypes.string, - componentName: PropTypes.string, - examplesRef: PropTypes.func, - history: PropTypes.object.isRequired, - } - - setHashAndScroll = (e, { name }) => { - const aName = _.kebabCase(_.last(name.split('/'))) - const { history } = this.props - - history.replace(`${location.pathname}#${aName}`) - scrollToAnchor() - } - - render() { - const { activePath, componentName, examplesRef } = this.props - const items = _.get(menuInfo, componentName) - - return ( - - - {_.map(items, ({ name, examples }) => ( - - - {name} - - - - {_.map(examples, ({ title, path }) => )} - - - ))} - - - ) - } -} - -export default withRouter(ComponentSidebar) diff --git a/docs/app/Components/ComponentDoc/ComponentSidebar/ComponentSidebar.js b/docs/app/Components/ComponentDoc/ComponentSidebar/ComponentSidebar.js new file mode 100644 index 0000000000..86f7921e1b --- /dev/null +++ b/docs/app/Components/ComponentDoc/ComponentSidebar/ComponentSidebar.js @@ -0,0 +1,79 @@ +import _ from 'lodash' +import PropTypes from 'prop-types' +import React, { Component } from 'react' +import { Accordion, Menu, Sticky } from 'semantic-ui-react' + +import { pure } from 'docs/app/HOC' +import menuInfo from 'docs/app/menuInfo.json' +import ComponentSideBarSection from './ComponentSidebarSection' + +const sidebarStyle = { + background: '#fff', + boxShadow: '0 2px 2px rgba(0, 0, 0, 0.1)', + paddingLeft: '1em', + paddingBottom: '0.1em', + paddingTop: '0.1em', +} + +class ComponentSidebar extends Component { + static propTypes = { + activePath: PropTypes.string, + componentName: PropTypes.string, + examplesRef: PropTypes.func, + onItemClick: PropTypes.func, + } + + state = {} + + constructor(props) { + super(props) + + this.state = { sections: this.computeSections(props) } + } + + componentWillReceiveProps(nextProps) { + this.setState({ sections: this.computeSections(nextProps) }) + } + + computeSections = ({ componentName }) => _.get(menuInfo, componentName) + + handleItemClick = (e, { path }) => _.invoke(this.props, 'onItemClick', e, { path }) + + handleTitleClick = (e, { name }) => { + const { sections } = this.state + const { examples } = _.find(sections, { name }) + const { path } = _.head(examples) + + _.invoke(this.props, 'onItemClick', e, { path }) + } + + render() { + const { activePath, examplesRef } = this.props + const { sections } = this.state + + return ( + + + {_.map(sections, ({ examples, name }) => ( + + ))} + + + ) + } +} + +export default pure(ComponentSidebar) diff --git a/docs/app/Components/ComponentDoc/ComponentSidebar/ComponentSidebarItem.js b/docs/app/Components/ComponentDoc/ComponentSidebar/ComponentSidebarItem.js new file mode 100644 index 0000000000..7d61cddf02 --- /dev/null +++ b/docs/app/Components/ComponentDoc/ComponentSidebar/ComponentSidebarItem.js @@ -0,0 +1,28 @@ +import _ from 'lodash' +import PropTypes from 'prop-types' +import React, { Component } from 'react' +import { Menu } from 'semantic-ui-react' + +export default class ComponentSidebarItem extends Component { + static propTypes = { + active: PropTypes.bool, + onClick: PropTypes.func, + path: PropTypes.string, + title: PropTypes.string, + } + + handleClick = e => _.invoke(this.props, 'onClick', e, this.props) + + render() { + const { active, path, title } = this.props + + return ( + + ) + } +} diff --git a/docs/app/Components/ComponentDoc/ComponentSidebar/ComponentSidebarSection.js b/docs/app/Components/ComponentDoc/ComponentSidebar/ComponentSidebarSection.js new file mode 100644 index 0000000000..b2eccf56be --- /dev/null +++ b/docs/app/Components/ComponentDoc/ComponentSidebar/ComponentSidebarSection.js @@ -0,0 +1,48 @@ +import _ from 'lodash' +import PropTypes from 'prop-types' +import React, { Component } from 'react' +import { Accordion, Icon, Menu } from 'semantic-ui-react' + +import { pure } from 'docs/app/HOC' +import ComponentSidebarItem from './ComponentSidebarItem' + +class ComponentSidebarSection extends Component { + static propTypes = { + activePath: PropTypes.string, + examples: PropTypes.object, + name: PropTypes.string, + onItemClick: PropTypes.func, + onTitleClick: PropTypes.func, + } + + handleItemClick = (e, itemProps) => _.invoke(this.props, 'onItemClick', e, itemProps) + + handleTitleClick = e => _.invoke(this.props, 'onTitleClick', e, this.props) + + render() { + const { activePath, examples, name } = this.props + const active = _.find(examples, { path: activePath }) + + return ( + + + {name} + + + + {_.map(examples, ({ title, path }) => ( + + ))} + + + ) + } +} + +export default pure(ComponentSidebarSection) diff --git a/docs/app/Components/ComponentDoc/ComponentSidebar/index.js b/docs/app/Components/ComponentDoc/ComponentSidebar/index.js new file mode 100644 index 0000000000..ecc2658e70 --- /dev/null +++ b/docs/app/Components/ComponentDoc/ComponentSidebar/index.js @@ -0,0 +1 @@ +export default from './ComponentSidebar' diff --git a/docs/app/utils/docs.js b/docs/app/utils/docs.js index 9955df1107..807f66a16a 100644 --- a/docs/app/utils/docs.js +++ b/docs/app/utils/docs.js @@ -6,26 +6,86 @@ import { repoURL } from './constants' const docPaths = _.keys(docInfo) -export const getDocPath = name => _.find(path => new RegExp(`${__PATH_SEP__}${name}.js$`).test(path), docPaths) +/** + * Get a path of the passed component in the generated doc definitions. + * + * @param {string} componentName A name of component. + * @return {string} + */ +export const getDocPath = componentName => _.find( + path => new RegExp(`${__PATH_SEP__}${componentName}.js$`).test(path), + docPaths, +) -export const getDocInfo = name => _.get(getDocPath(name), docInfo) +/** + * Get generated doc definitions of the passed component. + * + * @param {string} componentName A name of component. + * @return {object} + */ +export const getDocInfo = componentName => _.get(getDocPath(componentName), docInfo) -export const getDocProps = name => _.get('props', getDocInfo(name)) +/** + * Get props definitions of the passed component from the generated doc definitions. + * + * @param {string} componentName A name of component. + * @return {array} + */ +export const getDocProps = componentName => _.get('props', getDocInfo(componentName)) -export const getDocDescription = name => _.get('docBlock.description', getDocInfo(name)) +/** + * Get a component description of the passed component from the generated doc definitions. + * + * @param {string} componentName A name of component. + * @return {array} An array of lines that represents the description. + */ +export const getDocDescription = componentName => _.get('docBlock.description', getDocInfo(componentName)) -export const getDocSubComponents = name => _.map( +/** + * Get subcomponents of the passed component. + * + * @param {string} componentName A name of component. + * @return {array} An array of subcomponent names. + */ +export const getDocSubComponents = componentName => _.map( '_meta.name', - _.filter(component => _.get('_meta.parent', component) === name, semanticUIReact), + _.filter(component => _.get('_meta.parent', component) === componentName, semanticUIReact), ) -export const getPosixPath = name => getDocPath(name).replace(new RegExp(_.escapeRegExp(__PATH_SEP__), 'g'), '/') +/** + * Get POSIX path no matter the OS path separator, use '/'. + * + * @param {string} componentName A name of component. + * @return {string} + */ +export const getPosixPath = componentName => getDocPath(componentName) + .replace(new RegExp(_.escapeRegExp(__PATH_SEP__), 'g'), '/') -export const getGithubSourceUrl = name => `${repoURL}/blob/master/${getPosixPath(name)}` +/** + * Get link to the source on Github of passed component. + * + * @param {string} componentName A name of component. + * @return {string} + */ +export const getDocGithubSourceUrl = componentName => `${repoURL}/blob/master/${getPosixPath(componentName)}` -export const getSemanticUIDocsUrl = (name, type) => `https://semantic-ui.com/${type}s/${name}`.toLowerCase() +/** + * Get link to the Semantic UI Docs of the passed component. + * + * @param {string} componentName A name of component. + * @param {string} type A type of a component. + * @return {string} + */ +export const getDocSemanticUiUrl = (componentName, type) => `https://semantic-ui.com/${type}s/${componentName}` + .toLowerCase() -export const getSeeLinks = componentName => _.map(({ description }) => { +/** + * Get items that marked as @see in component doc. + * + * @param {string} componentName A name of component. + * @return {array} Returns an array of objects that contain info about a related component. + */ +export const getDocSeeItems = componentName => _.map(({ description }) => { const seeMeta = _.get('_meta', semanticUIReact[description]) if (!seeMeta) return null diff --git a/gulp/plugins/gulp-menugen.js b/gulp/plugins/gulp-menugen.js index 308d5e1083..4c9047a48e 100644 --- a/gulp/plugins/gulp-menugen.js +++ b/gulp/plugins/gulp-menugen.js @@ -8,6 +8,14 @@ import { parseDocExample, parseDocSection } from './util' const examplesPath = `${config.paths.docsSrc()}/Examples/` +const normalizeResult = result => JSON.stringify(_.mapValues( + result, + sections => _.map( + _.sortBy(sections, 'position'), + ({ examples, name }) => ({ examples, name }), + ), +), null, 2) + export default (filename) => { const defaultFilename = 'menuInfo.json' const result = {} @@ -37,10 +45,11 @@ export default (filename) => { cb() return } - const { examples } = parseDocSection(file.contents) - result[component][section].examples = examples - // result[component][section] = 100 + result[component][section] = { + ...result[component][section], + ...parseDocSection(file.contents), + } cb() } catch (err) { const pluginError = new gutil.PluginError(pluginName, err) @@ -52,7 +61,7 @@ export default (filename) => { function endStream(cb) { finalFile = latestFile.clone({ contents: false }) finalFile.path = path.join(latestFile.base, (filename || defaultFilename)) - finalFile.contents = new Buffer(JSON.stringify(result, null, 2)) + finalFile.contents = new Buffer(normalizeResult(result)) this.push(finalFile) cb() } diff --git a/gulp/plugins/util/parseBuffer.js b/gulp/plugins/util/parseBuffer.js new file mode 100644 index 0000000000..549a678fed --- /dev/null +++ b/gulp/plugins/util/parseBuffer.js @@ -0,0 +1,11 @@ +import { parse } from 'babylon' + +const parseBuffer = buffer => parse(buffer.toString(), { + plugins: [ + 'classProperties', + 'jsx', + ], + sourceType: 'module', +}) + +export default parseBuffer diff --git a/gulp/plugins/util/parseDocExample.js b/gulp/plugins/util/parseDocExample.js index 41e53b8e84..7add8c7246 100644 --- a/gulp/plugins/util/parseDocExample.js +++ b/gulp/plugins/util/parseDocExample.js @@ -1,17 +1,18 @@ -import _ from 'lodash' -import { parse } from 'babylon' import traverse from 'babel-traverse' +import _ from 'lodash' +import parseBuffer from './parseBuffer' -export default (buffer) => { - const ast = parse(buffer.toString(), { - sourceType: 'module', - plugins: [ - 'classProperties', - 'jsx', - ], - }) +/** + * Parses the root view of component examples and builds an object with order of sections. + * + * @param {buffer} buffer The content of a view + * @return {object} + */ +const parseDocExample = (buffer) => { + const ast = parseBuffer(buffer) const sections = {} + let position = 0 traverse(ast, { ImportDeclaration: (path) => { @@ -22,13 +23,19 @@ export default (buffer) => { const name = _.get(specifier, 'node.local.name') const source = _.get(path, 'node.source.value') - if (_.startsWith(source, './')) { - sections[name] = { - name, - } + if (_.startsWith(source, './')) sections[name] = {} + }, + JSXIdentifier: (path) => { + const name = _.get(path, 'node.name') + + if (_.has(sections, name)) { + position += 1 + sections[name] = { position } } }, }) return sections } + +export default parseDocExample diff --git a/gulp/plugins/util/parseDocSection.js b/gulp/plugins/util/parseDocSection.js index a032ab7a6f..573680d0a0 100644 --- a/gulp/plugins/util/parseDocSection.js +++ b/gulp/plugins/util/parseDocSection.js @@ -1,48 +1,58 @@ import _ from 'lodash' -import { parse } from 'babylon' import traverse from 'babel-traverse' -export default (buffer) => { - const ast = parse(buffer.toString(), { - sourceType: 'module', - plugins: [ - 'classProperties', - 'jsx', - ], - }) - const section = { - examples: [], - } +import parseBuffer from './parseBuffer' + +const getJSXAttributes = jsxPath => _.map( + _.get(jsxPath, 'node.attributes'), + attr => ({ + name: _.get(attr, 'name.name'), + value: _.get(attr, 'value.value'), + }), +) + +const getAttributeValue = (attributes, name) => _.get( + _.find(attributes, { name }), + 'value', +) + +/** + * Parses the section view of component examples and builds an object with examples titles and paths. + * + * @param {buffer} buffer The content of a view + * @return {object} + */ +const parseDocSection = (buffer) => { + const ast = parseBuffer(buffer) + const examples = [] + let sectionName traverse(ast, { JSXOpeningElement: (path) => { - const attrs = _.map(_.get(path, 'node.attributes'), a => ({ - name: _.get(a, 'name.name'), - value: _.get(a, 'value.value'), - })) + const attributes = getJSXAttributes(path) const name = _.get(path, 'node.name.name') - if (name === 'ExampleSection') { - const title = _.find(attrs, { name: 'title' }) + const title = getAttributeValue(attributes, 'title') + const examplePath = getAttributeValue(attributes, 'examplePath') - section.name = title.name + if (name === 'ExampleSection') { + sectionName = title return } - if (name === 'ComponentExample') { - const title = _.find(attrs, { name: 'title' }) - - if (title) { - const { value } = _.find(attrs, { name: 'examplePath' }) - - section.examples.push({ - title: title.value, - path: value, - }) - } + if (name === 'ComponentExample' && title) { + examples.push({ + title, + path: examplePath, + }) } }, }) - return section + return { + examples, + name: sectionName, + } } + +export default parseDocSection diff --git a/yarn.lock b/yarn.lock index 79b4b06020..ccc09e448f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -339,18 +339,12 @@ async@1.x, async@^1.4.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@2.1.4: +async@2.1.4, async@^2.1.2, async@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" dependencies: lodash "^4.14.0" -async@^2.1.2, async@^2.1.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" - dependencies: - lodash "^4.14.0" - async@~0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" @@ -2066,14 +2060,10 @@ di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" -diff@3.2.0: +diff@3.2.0, diff@^3.0.1, diff@^3.1.0, diff@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" -diff@^3.0.1, diff@^3.1.0, diff@^3.2.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" - diffie-hellman@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" @@ -4857,7 +4847,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: +minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -4865,10 +4855,6 @@ minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2 version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - mkdirp@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" @@ -4980,20 +4966,13 @@ node-dir@^0.1.10: dependencies: minimatch "^3.0.2" -node-fetch@1.6.3: +node-fetch@1.6.3, node-fetch@^1.0.1: version "1.6.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" dependencies: encoding "^0.1.11" is-stream "^1.0.1" -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - node-gyp@^3.3.1: version "3.6.2" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" @@ -6697,7 +6676,7 @@ structured-source@^3.0.2: dependencies: boundary "^1.0.1" -supports-color@3.1.2: +supports-color@3.1.2, supports-color@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" dependencies: @@ -6707,12 +6686,6 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -supports-color@^3.1.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - dependencies: - has-flag "^1.0.0" - supports-color@^4.0.0, supports-color@^4.2.1: version "4.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" @@ -6862,13 +6835,13 @@ timespan@2.x: version "2.3.0" resolved "https://registry.yarnpkg.com/timespan/-/timespan-2.3.0.tgz#4902ce040bd13d845c8f59b27e9d59bad6f39929" -tmp@0.0.31: +tmp@0.0.31, tmp@0.0.x: version "0.0.31" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" dependencies: os-tmpdir "~1.0.1" -tmp@0.0.x, tmp@^0.0.33: +tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" dependencies: @@ -6961,19 +6934,13 @@ tslint-config-unional@^0.6.0: tslint-config-standard "2.0.0" tslint-eslint-rules "3.0.0" -tslint-eslint-rules@3.0.0: +tslint-eslint-rules@3.0.0, tslint-eslint-rules@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-3.0.0.tgz#42c17e06b4d467cee4268606c6fd455db5822d67" dependencies: doctrine "^0.7.2" tslint "^4.0.0" -tslint-eslint-rules@^3.0.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-3.5.1.tgz#e43efdcdd760d6285600031720f972c92f4a058a" - dependencies: - doctrine "^0.7.2" - tslint@^4.0.0: version "4.5.1" resolved "https://registry.yarnpkg.com/tslint/-/tslint-4.5.1.tgz#05356871bef23a434906734006fc188336ba824b"