diff --git a/.gitignore b/.gitignore index 0993ed8..f88c188 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/ dist settings.json +.idea diff --git a/.storybook/webpack.config.js b/.storybook/webpack.config.js index 9036a2b..87edc23 100644 --- a/.storybook/webpack.config.js +++ b/.storybook/webpack.config.js @@ -1,13 +1,20 @@ const path = require('path') -module.exports = { - module: { - rules: [ +module.exports = async ({ config }) => { + config.module.rules.push({ + test: /\.(ts|tsx)$/, + use: [ + 'react-docgen-typescript-loader', { - test: /\.(css)$/, - loaders: ['style-loader', 'css-loader'], - include: path.resolve(__dirname, '../') + loader: 'ts-loader', + options: { + transpileOnly: true, + }, } - ] - } -} + ], + }); + + config.resolve.extensions.push('.ts', '.tsx'); + + return config; +}; diff --git a/README.md b/README.md index 9d5e692..2ead878 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Smart knobs addon for Storybook -This Storybook plugin uses `@storybook/addon-knobs` but creates the knobs automatically based on PropTypes and Flow. +This Storybook plugin uses `@storybook/addon-knobs` but creates the knobs automatically based on PropTypes, Flow and Typescript. ## Installation: @@ -11,7 +11,8 @@ npm i storybook-addon-smart-knobs --save-dev ## Usage: ```js -import React, { PropTypes } from 'react' +import React from 'react' +import PropTypes from 'prop-types' import { storiesOf } from '@storybook/react' import { withKnobs } from '@storybook/addon-knobs' import { withSmartKnobs } from 'storybook-addon-smart-knobs' @@ -53,3 +54,7 @@ module.exports = (baseConfig, env, defaultConfig) => { return defaultConfig } ``` + +## Typescript: + +Use [react-docgen-typescript-loader](https://github.com/strothj/react-docgen-typescript-loader) to generate docgen info from Typescript types. This docgen info will be used to automatically create knobs. diff --git a/example/stories/SmartKnobedComponent.css b/example/stories/PropTable.css similarity index 67% rename from example/stories/SmartKnobedComponent.css rename to example/stories/PropTable.css index dfe858d..5d7f236 100644 --- a/example/stories/SmartKnobedComponent.css +++ b/example/stories/PropTable.css @@ -1,4 +1,4 @@ -.SmartKnobedComponent { +.PropTable { border: 1px solid #999; color: #333; font-family: monospace; @@ -7,17 +7,17 @@ text-align: left; } -.SmartKnobedComponent thead { +.PropTable thead { font-style: italic; font-size: 0.85em; } -.SmartKnobedComponent th { +.PropTable th { background-color: #eee; } -.SmartKnobedComponent th, -.SmartKnobedComponent td { +.PropTable th, +.PropTable td { border: 0.05em solid #999; min-width: 1em; padding: 0.4em; diff --git a/example/stories/PropTable.js b/example/stories/PropTable.js new file mode 100644 index 0000000..ee39f41 --- /dev/null +++ b/example/stories/PropTable.js @@ -0,0 +1,32 @@ +import React from 'react' +import PropTypes from 'prop-types' + +import './PropTable.css' + +export const PropTable = ({ docgenInfo, ...props }) => ( + + + + + + + + + + { + Object.keys(props) + .map(prop => ( + + + + + + + )) + } +
PropertyPropTypeValuetypeof
{ prop }{ (docgenInfo.props[prop].type || docgenInfo.props[prop].flowType || {}).name }{ typeof props[prop] === 'function' ? function : JSON.stringify(props[prop]) || '(empty)' }{ typeof props[prop] }
+) + +PropTable.propTypes = { + docgenInfo: PropTypes.object.isRequired +} diff --git a/example/stories/SmartKnobedComponent.js b/example/stories/SmartKnobedComponent.js index 70df209..0f4c8d5 100644 --- a/example/stories/SmartKnobedComponent.js +++ b/example/stories/SmartKnobedComponent.js @@ -1,30 +1,9 @@ import React from 'react' import PropTypes from 'prop-types' -import './SmartKnobedComponent.css' +import { PropTable } from './PropTable' -const SmartKnobedComponent = props => ( - - - - - - - - - - - {Object.keys(props).map(prop => ( - - - - - - - ))} - -
PropertyPropTypeValuetypeof
{ prop }{ SmartKnobedComponent.__docgenInfo.props[prop].type.name }{ typeof props[prop] === 'function' ? function : JSON.stringify(props[prop]) || '(empty)' }{ typeof props[prop] }
-) +const SmartKnobedComponent = props => SmartKnobedComponent.propTypes = { bool: PropTypes.bool, diff --git a/example/stories/SmartKnobedComponentMissingProps.js b/example/stories/SmartKnobedComponentMissingProps.js index b327a19..ca9d8e7 100644 --- a/example/stories/SmartKnobedComponentMissingProps.js +++ b/example/stories/SmartKnobedComponentMissingProps.js @@ -2,14 +2,15 @@ import React from 'react' import PropTypes from 'prop-types' +import { PropTable } from './PropTable' + const SmartKnobedComponentMissingProps = ({ foo = '', bar = 'bar', }) => (

You should see a console.warn about a prop with default value bar.

-

{foo}

-

{bar}

+
) diff --git a/example/stories/SmartKnobedComponentWithFlow.js b/example/stories/SmartKnobedComponentWithFlow.js index a76a23e..f2cb55e 100644 --- a/example/stories/SmartKnobedComponentWithFlow.js +++ b/example/stories/SmartKnobedComponentWithFlow.js @@ -1,6 +1,7 @@ // @flow import React from 'react' -import './SmartKnobedComponent.css' + +import { PropTable } from './PropTable' /* eslint-disable */ type PropType = { @@ -13,27 +14,6 @@ type PropType = { } /* eslint-enable */ -const SmartKnobedComponent = (props: PropType) => ( - - - - - - - - - - - {Object.keys(props).map(prop => ( - - - - - - - ))} - -
PropertyPropTypeValuetypeof
{ prop }{ SmartKnobedComponent.__docgenInfo.props[prop].flowType.name }{ typeof props[prop] === 'function' ? function : JSON.stringify(props[prop]) || '(empty)' }{ typeof props[prop] }
-) +const SmartKnobedComponent = (props: PropType) => export default SmartKnobedComponent diff --git a/example/stories/SmartKnobedComponentWithTypescript.tsx b/example/stories/SmartKnobedComponentWithTypescript.tsx new file mode 100644 index 0000000..0af1676 --- /dev/null +++ b/example/stories/SmartKnobedComponentWithTypescript.tsx @@ -0,0 +1,16 @@ +import * as React from 'react' + +import {PropTable} from './PropTable' + +interface IProps { + bool: boolean; + number: number; + string: string; + func: () => void; + object: {}; + node: React.ReactNode; + oneOf?: 'one' | 'two' | 'three'; +} + +export const SmartKnobedComponentWithTypescript: React.FC & { __docgenInfo?: any } = (props) => + diff --git a/example/stories/index.js b/example/stories/index.js index 71b0a11..5f6b635 100644 --- a/example/stories/index.js +++ b/example/stories/index.js @@ -6,6 +6,7 @@ import { withKnobs, select } from '@storybook/addon-knobs' import SmartKnobedComponent from './SmartKnobedComponent' import SmartKnobedComponentMissingProps from './SmartKnobedComponentMissingProps' import SmartKnobedComponentWithFlow from './SmartKnobedComponentWithFlow' +import { SmartKnobedComponentWithTypescript } from './SmartKnobedComponentWithTypescript' const stub = fn => fn() @@ -14,6 +15,7 @@ storiesOf('Basic', module) .addDecorator(withKnobs) .add('proptypes', () => ) .add('flow', () => ) + .add('typescript', () => ) storiesOf('Missing props', module) .addDecorator(withSmartKnobs) diff --git a/package.json b/package.json index ddeae0d..9ab9f39 100644 --- a/package.json +++ b/package.json @@ -27,16 +27,20 @@ "@storybook/addon-options": "^5.0.0", "@storybook/client-logger": "^5.0.0", "@storybook/react": "^5.0.0", + "@types/react": "^16.9.1", "babel-loader": "^8.0.4", - "css-loader": "^3.1.0", "core-js": "^3.0.1", + "css-loader": "^3.1.0", "eslint-config-taller": "^2.0.0", "eslint-plugin-flowtype": "^3.5.1", "jest": "^24.7.1", "prop-types": "^15.7.2", "react": "^16.8.6", + "react-docgen-typescript-loader": "^3.1.1", "react-dom": "^16.8.6", - "rimraf": "^2.6.3" + "rimraf": "^2.6.3", + "ts-loader": "^6.0.4", + "typescript": "^3.5.3" }, "peerDependencies": { "@storybook/addon-knobs": "^5.0.0", diff --git a/src/index.js b/src/index.js index 72069ce..265bbf5 100644 --- a/src/index.js +++ b/src/index.js @@ -3,6 +3,9 @@ import { action } from '@storybook/addon-actions' import { logger } from '@storybook/client-logger' import { text, boolean, number, object, select } from '@storybook/addon-knobs' +const QUOTED_STRING_REGEXP = /^['"](.*)['"]$/ +const cleanupString = str => str.replace(QUOTED_STRING_REGEXP, '$1') + const knobResolvers = {} export const addKnobResolver = ({ name, resolver, weight = 0 }) => (knobResolvers[name] = { name, resolver, weight }) @@ -11,9 +14,11 @@ export const addKnobResolver = ({ name, resolver, weight = 0 }) => (knobResolver * -------------------------------- */ -export const propTypeKnobResolver = (name, knob, ...args) => - (propName, propType, value, propTypes, defaultProps) => - propType.type.name === name ? knob(propName, value, ...args) : undefined +export const propTypeKnobResolver = (name, regexp, knob, ...args) => + (propName, propType, value) => + (propType.type.name === name || (regexp && regexp.test(propType.type.name))) + ? knob(propName, value, ...args) + : undefined const flowTypeKnobsMap = [ { name: 'signature', knob: (name, value) => value || action(name) }, @@ -25,31 +30,32 @@ const flowTypeKnobsMap = [ const propTypeKnobsMap = [ { name: 'string', knob: text }, { name: 'number', knob: number }, - { name: 'bool', knob: boolean }, - { name: 'func', knob: (name, value) => value || action(name) }, - { name: 'object', knob: object }, - { name: 'node', knob: text }, + { name: 'bool', knob: boolean }, + { name: 'func', regexp: /=>/, knob: (name, value) => value || action(name) }, + { name: 'object', regexp: /^{.*}$/, knob: object }, + { name: 'node', regexp: /^ReactNode$/, knob: text }, { name: 'element', knob: text }, - { name: 'array', knob: object }, + { name: 'array', regexp: /\[]$|^\[.*]$/, knob: object }, ] const typeKnobsMap = [...flowTypeKnobsMap, ...propTypeKnobsMap] -typeKnobsMap.forEach(({ name, knob, args = [] }, weight) => addKnobResolver({ +typeKnobsMap.forEach(({ name, regexp, knob, args = [] }, weight) => addKnobResolver({ weight: weight * 10, name: `PropTypes.${name}`, - resolver: propTypeKnobResolver(name, knob, ...args) + resolver: propTypeKnobResolver(name, regexp, knob, ...args) })) const optionsReducer = (res, value) => ({ ...res, [value]: value }) const withDefaultOption = (options) => ({ '': '--', ...options }) -const createSelect = (propName, elements, defaultProps) => { +const createSelect = (propName, elements, defaultValue) => { try { const options = elements // Cleanup string quotes, if any. - .map(value => value.value.replace(/^['"](.*)['"]$/, '$1')) + .map(value => cleanupString(value.value)) .reduce(optionsReducer, {}) - return select(propName, withDefaultOption(options), defaultProps[propName]) + + return select(propName, withDefaultOption(options), defaultValue) } catch (e) { } } @@ -57,13 +63,21 @@ const createSelect = (propName, elements, defaultProps) => { // Register 'oneOf' PropType knob resolver. addKnobResolver({ name: 'PropTypes.oneOf', - resolver: (propName, propType, value, propTypes, defaultProps) => { + resolver: (propName, propType, defaultValue) => { if (propType.type.name === 'enum' && propType.type.value.length) { - return createSelect(propName, propType.type.value, defaultProps) + return createSelect(propName, propType.type.value, defaultValue) } // for flow support if (propType.type.name === 'union' && propType.type.elements) { - return createSelect(propName, propType.type.elements, defaultProps) + return createSelect(propName, propType.type.elements, defaultValue) + } + // for typescript support + if (propType.type.name.includes('|')) { + const values = propType.type.name.split('|').map(v => v.trim()) + + if (values.length && values.every(value => QUOTED_STRING_REGEXP.test(value))) { + return createSelect(propName, values.map(value => ({ value })), defaultValue) + } } } }) @@ -114,8 +128,13 @@ const resolvePropValues = (propTypes, defaultProps) => { return propNames .map(propName => resolvers.reduce( - (value, resolver) => value !== undefined ? value - : resolver(propName, propTypes[propName], defaultProps[propName], propTypes, defaultProps), + (value, resolver) => { + const propType = propTypes[propName] || {} + const defaultValue = (propType.defaultValue && cleanupString(propType.defaultValue.value || '')) || undefined + + return value !== undefined ? value + : resolver(propName, propType, defaultValue) + }, undefined )) .reduce((props, value, i) => ({ diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8ef96e7 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "jsx": "react", + "module": "esnext" + } +} diff --git a/yarn.lock b/yarn.lock index 1cc2fe5..795b74e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1831,11 +1831,24 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/prop-types@*": + version "15.7.1" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.1.tgz#f1a11e7babb0c3cad68100be381d1e064c68f1f6" + integrity sha512-CFzn9idOEpHrgdw8JsoTkaDDyRWk1jrzIV8djzcgpq0y9tG4B4lFT+Nxh52DVpDXV+n4+NPNv7M1Dj5uMp6XFg== + "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== +"@types/react@^16.9.1": + version "16.9.1" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.1.tgz#862c83b4c9d5cd116e42fd9a4f3694843cd2c051" + integrity sha512-jGM2x8F7m7/r+81N/BOaUKVwbC5Cdw6ExlWEUpr77XPwVeNvAppnPEnMMLMfxRDYL8FPEX8MHjwtD2NQMJ0yyQ== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" @@ -1992,6 +2005,18 @@ "@webassemblyjs/wast-parser" "1.8.5" "@xtuc/long" "4.2.2" +"@webpack-contrib/schema-utils@^1.0.0-beta.0": + version "1.0.0-beta.0" + resolved "https://registry.yarnpkg.com/@webpack-contrib/schema-utils/-/schema-utils-1.0.0-beta.0.tgz#bf9638c9464d177b48209e84209e23bee2eb4f65" + integrity sha512-LonryJP+FxQQHsjGBi6W786TQB1Oym+agTpY0c+Kj8alnIw+DLUJb6SI8Y1GHGhLCH1yPRrucjObUmxNICQ1pg== + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chalk "^2.3.2" + strip-ansi "^4.0.0" + text-table "^0.2.0" + webpack-log "^1.1.2" + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -2939,6 +2964,13 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -3185,7 +3217,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3782,7 +3814,7 @@ cssstyle@^1.0.0: dependencies: cssom "0.3.x" -csstype@^2.5.2, csstype@^2.5.7: +csstype@^2.2.0, csstype@^2.5.2, csstype@^2.5.7: version "2.6.6" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.6.tgz#c34f8226a94bbb10c32cc0d714afdf942291fc41" integrity sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg== @@ -3792,6 +3824,14 @@ cyclist@~0.2.2: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= +d@1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -4184,7 +4224,7 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^4.1.0: +enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== @@ -4233,16 +4273,42 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" +es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@~0.10.14: + version "0.10.50" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778" + integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "^1.0.0" + es5-shim@^4.5.13: version "4.5.13" resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.5.13.tgz#5d88062de049f8969f83783f4a4884395f21d28b" integrity sha512-xi6hh6gsvDE0MaW4Vp1lgNEBpVcCXRWfPXj5egDvtgLz4L9MEvNwYEMdJH+JJinWkwa8c3c3o5HduV7dB/e1Hw== +es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + es6-shim@^0.35.5: version "0.35.5" resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.5.tgz#46f59dc0a84a1c5029e8ff1166ca0a902077a9ab" integrity sha512-E9kK/bjtCQRpN1K28Xh4BlmP8egvZBGJJ+9GtnzOwt7mdqtrjHFuVGr7QJfdjBIKqrlU5duPf3pCBoDrkjVYFg== +es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= + dependencies: + d "1" + es5-ext "~0.10.14" + escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -4787,6 +4853,13 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -5797,6 +5870,11 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -6669,6 +6747,21 @@ lodash@^4.0.1, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.1 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +log-symbols@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +loglevelnext@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-1.0.5.tgz#36fc4f5996d6640f539ff203ba819641680d75a2" + integrity sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A== + dependencies: + es6-symbol "^3.1.1" + object.assign "^4.1.0" + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -6890,6 +6983,14 @@ micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -7116,6 +7217,11 @@ nested-object-assign@^1.0.3: resolved "https://registry.yarnpkg.com/nested-object-assign/-/nested-object-assign-1.0.3.tgz#5aca69390d9affe5a612152b5f0843ae399ac597" integrity sha512-kgq1CuvLyUcbcIuTiCA93cQ2IJFSlRwXcN+hLcb2qLJwC2qrePHGZZa7IipyWqaWF6tQjdax2pQnVxdq19Zzwg== +next-tick@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -7736,6 +7842,11 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picomatch@^2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" + integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -8274,6 +8385,20 @@ react-dev-utils@^9.0.0: strip-ansi "5.2.0" text-table "0.2.0" +react-docgen-typescript-loader@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/react-docgen-typescript-loader/-/react-docgen-typescript-loader-3.1.1.tgz#c1992538524fb9e45246d6c1314ddcfbf26e9d08" + integrity sha512-h8xfQIiEI4Z1oZewZhi9oohiWMS5Ek19LmgrvoL77Y/5d3tzu6fE3QHqhzYzdPnTaCfMzF7JMDUaydJiLbsDKg== + dependencies: + "@webpack-contrib/schema-utils" "^1.0.0-beta.0" + loader-utils "^1.2.3" + react-docgen-typescript "^1.12.3" + +react-docgen-typescript@^1.12.3: + version "1.12.5" + resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-1.12.5.tgz#922cdbd9b6f3804695c94bff377c1b40a2e04f0c" + integrity sha512-rXwT6sNThl4A9ISJCnhGLIZBbz0KnXKaNRDIJlpyAsUnG0CutR51grpJv+gsltj+wTLXyr4bhRcuOu8l6MkCHw== + react-docgen@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-4.1.1.tgz#8fef0212dbf14733e09edecef1de6b224d87219e" @@ -9669,7 +9794,7 @@ test-exclude@^5.2.3: read-pkg-up "^4.0.0" require-main-filename "^2.0.0" -text-table@0.2.0, text-table@~0.2.0: +text-table@0.2.0, text-table@^0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= @@ -9751,6 +9876,13 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" @@ -9806,6 +9938,17 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= +ts-loader@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.0.4.tgz#bc331ad91a887a60632d94c9f79448666f2c4b63" + integrity sha512-p2zJYe7OtwR+49kv4gs7v4dMrfYD1IPpOtqiSPCbe8oR+4zEBtdHwzM7A7M91F+suReqgzZrlClk4LRSSp882g== + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^4.0.0" + semver "^6.0.0" + ts-pnp@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.2.tgz#be8e4bfce5d00f0f58e0666a82260c34a57af552" @@ -9853,6 +9996,11 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +type@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/type/-/type-1.0.3.tgz#16f5d39f27a2d28d86e48f8981859e9d3296c179" + integrity sha512-51IMtNfVcee8+9GJvj0spSuFcZHe9vSib6Xtgsny1Km9ugyz2mbS08I3rsUIRYgJohFRFU1160sgRodYz378Hg== + typed-styles@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" @@ -9863,6 +10011,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" + integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== + ua-parser-js@^0.7.18: version "0.7.20" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.20.tgz#7527178b82f6a62a0f243d1f94fd30e3e3c21098" @@ -10040,7 +10193,7 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.3.2: +uuid@^3.1.0, uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== @@ -10134,6 +10287,16 @@ webpack-hot-middleware@^2.25.0: querystring "^0.2.0" strip-ansi "^3.0.0" +webpack-log@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d" + integrity sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA== + dependencies: + chalk "^2.1.0" + log-symbols "^2.1.0" + loglevelnext "^1.0.1" + uuid "^3.1.0" + webpack-log@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f"