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 }) => (
+
+
+
+ Property |
+ PropType |
+ Value |
+ typeof |
+
+
+ {
+ Object.keys(props)
+ .map(prop => (
+
+ { 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 => (
-
-
-
- Property |
- PropType |
- Value |
- typeof |
-
-
-
- {Object.keys(props).map(prop => (
-
- { 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) => (
-
-
-
- Property |
- PropType |
- Value |
- typeof |
-
-
-
- {Object.keys(props).map(prop => (
-
- { 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"