Merge branch 'lm-add-flow-to-validation' of https://github.com/Ducz0r/scinote-web into Ducz0r-lm-add-flow-to-validation

Conflicts:
	flow-typed/npm/lodash_v4.x.x.js
This commit is contained in:
Luka Murn 2017-11-08 09:33:29 +01:00
commit dfa1c83c9f
16 changed files with 2065 additions and 1820 deletions

View file

@ -16,6 +16,7 @@
"flow"
],
"plugins": [
"transform-flow-strip-types",
"transform-object-rest-spread",
"syntax-dynamic-import",
"transform-react-jsx-source",

View file

@ -19,6 +19,8 @@
"rules": {
"import/extensions": "off",
"import/no-unresolved": "off",
// Because of flow-typed & flow-bin
"import/no-extraneous-dependencies": ["error", { "devDependencies": true }],
"react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }],
"spaced-comment": [
"error",

View file

@ -1,6 +1,9 @@
import React, { Component } from "react";
// @flow
import * as React from "react";
import { HelpBlock } from "react-bootstrap";
import { FormattedMessage } from "react-intl";
import type { ValidationError } from "flow-typed";
import PropTypes from "prop-types";
import styled from "styled-components";
import shortid from "shortid";
@ -11,8 +14,12 @@ const MyHelpBlock = styled(HelpBlock)`
}
`;
class ValidatedErrorHelpBlock extends Component {
static renderErrorMessage(error) {
type Props = {
tag: string
};
class ValidatedErrorHelpBlock extends React.Component<Props> {
static renderErrorMessage(error: ValidationError): React.Node {
const key = shortid.generate();
if (error.intl) {
return (
@ -39,16 +46,14 @@ class ValidatedErrorHelpBlock extends Component {
const errors = this.context.errors(tag) || [];
return (
<MyHelpBlock {...cleanProps}>
{errors.map((error) => ValidatedErrorHelpBlock.renderErrorMessage(error))}
{errors.map(
(error: ValidationError) => ValidatedErrorHelpBlock.renderErrorMessage(error)
)}
</MyHelpBlock>
);
}
}
ValidatedErrorHelpBlock.propTypes = {
tag: PropTypes.string.isRequired
};
ValidatedErrorHelpBlock.contextTypes = {
errors: PropTypes.func
}

View file

@ -1,33 +1,64 @@
import React, { Component } from "react";
// @flow
import * as React from "react";
import update from "immutability-helper";
import type {
ValidationError,
ValidationErrors
} from "flow-typed";
import PropTypes from "prop-types";
import _ from "lodash";
class ValidatedForm extends Component {
static parseErrors(errors) {
type Props = {
children?: React.Node
};
type State = {
[string]: Array<ValidationError>
};
type ChildContext = {
setErrors: Function,
setErrorsForTag: Function,
errors: Function,
hasAnyError: Function,
hasErrorForTag: Function,
addErrorsForTag: Function,
clearErrorsForTag: Function,
clearErrors: Function
};
class ValidatedForm extends React.Component<Props, State> {
static defaultProps = {
children: undefined
}
static parseErrors(errors: ValidationErrors): Array<ValidationError> {
// This method is quite smart, in the sense that accepts either
// errors in 3 shapes: localized error messages ({}),
// unlocalized error messages ({}), or mere strings (unlocalized)
const arr = _.isString(errors) ? [errors] : errors;
return arr.map((el) => _.isString(el) ? { message: el } : el);
return arr.map(
(el: string | ValidationError) => _.isString(el) ? { message: el } : el
);
}
constructor(props) {
constructor(props: Props) {
super(props);
this.state = {}
this.state = {};
this.setErrors = this.setErrors.bind(this);
this.setErrorsForTag = this.setErrorsForTag.bind(this);
this.errors = this.errors.bind(this);
this.hasAnyError = this.hasAnyError.bind(this);
this.hasErrorForTag = this.hasErrorForTag.bind(this);
this.addErrorsForTag = this.addErrorsForTag.bind(this);
this.clearErrorsForTag = this.clearErrorsForTag.bind(this);
this.clearErrors = this.clearErrors.bind(this);
(this: any).setErrors = this.setErrors.bind(this);
(this: any).setErrorsForTag = this.setErrorsForTag.bind(this);
(this: any).errors = this.errors.bind(this);
(this: any).hasAnyError = this.hasAnyError.bind(this);
(this: any).hasErrorForTag = this.hasErrorForTag.bind(this);
(this: any).addErrorsForTag = this.addErrorsForTag.bind(this);
(this: any).clearErrorsForTag = this.clearErrorsForTag.bind(this);
(this: any).clearErrors = this.clearErrors.bind(this);
}
getChildContext() {
getChildContext(): ChildContext {
// Pass functions downstream via context
return {
setErrors: this.setErrors,
@ -41,7 +72,7 @@ class ValidatedForm extends Component {
};
}
setErrors(errors) {
setErrors(errors: { [string]: ValidationErrors }): void {
const newState = {};
_.entries(errors).forEach(([key, value]) => {
newState[key] = ValidatedForm.parseErrors(value);
@ -49,28 +80,28 @@ class ValidatedForm extends Component {
this.setState(newState);
}
setErrorsForTag(tag, errors) {
setErrorsForTag(tag: string, errors: ValidationErrors): void {
const newState = update(this.state, {
[tag]: { $set: ValidatedForm.parseErrors(errors) }
});
this.setState(newState);
}
errors(tag) {
errors(tag: string): Array<ValidationError> {
return this.state[tag];
}
hasAnyError() {
hasAnyError(): boolean {
return _.values(this.state) &&
_.flatten(_.values(this.state)).length > 0;
}
hasErrorForTag(tag) {
hasErrorForTag(tag: string): boolean {
return _.has(this.state, tag) && this.state[tag].length > 0;
}
addErrorsForTag(tag, errors) {
let newState;
addErrorsForTag(tag: string, errors: ValidationErrors): void {
let newState: State;
if (_.has(this.state, tag)) {
newState = update(this.state, { [tag]: { $push: errors } });
} else {
@ -79,12 +110,12 @@ class ValidatedForm extends Component {
this.setState(newState);
}
clearErrorsForTag(tag) {
clearErrorsForTag(tag: string): void {
const newState = update(this.state, { [tag]: { $set: [] } });
this.setState(newState);
}
clearErrors() {
clearErrors(): void {
this.setState({});
}
@ -97,14 +128,6 @@ class ValidatedForm extends Component {
}
}
ValidatedForm.propTypes = {
children: PropTypes.node
}
ValidatedForm.defaultProps = {
children: undefined
}
ValidatedForm.childContextTypes = {
setErrors: PropTypes.func,
setErrorsForTag: PropTypes.func,

View file

@ -1,16 +1,33 @@
import React, { Component } from "react";
// @flow
import * as React from "react";
import { FormControl } from "react-bootstrap";
import type { ValidationError } from "flow-typed";
import PropTypes from "prop-types";
import _ from "lodash";
class ValidatedFormControl extends Component {
constructor(props) {
super(props);
type Props = {
tag: string,
messageIds: {[string]: Array<string>},
onChange?: Function,
validatorsOnChange: Array<Function>,
children?: React.Node
};
this.handleChange = this.handleChange.bind(this);
this.cleanProps = this.cleanProps.bind(this);
class ValidatedFormControl extends React.Component<Props> {
static defaultProps = {
onChange: undefined,
children: undefined
}
handleChange(e) {
constructor(props: Props) {
super(props);
(this: any).handleChange = this.handleChange.bind(this);
(this: any).cleanProps = this.cleanProps.bind(this);
}
handleChange(e: SyntheticEvent<HTMLInputElement>): void {
const tag = this.props.tag;
const messageIds = this.props.messageIds;
const target = e.target;
@ -21,8 +38,8 @@ class ValidatedFormControl extends Component {
}
// Validate the field
let errors = [];
this.props.validatorsOnChange.forEach((validator) => {
let errors: Array<ValidationError> = [];
this.props.validatorsOnChange.forEach((validator: Function) => {
errors = errors.concat(validator(target, messageIds));
});
this.context.setErrorsForTag(tag, errors);
@ -50,19 +67,6 @@ class ValidatedFormControl extends Component {
}
}
ValidatedFormControl.propTypes = {
tag: PropTypes.string.isRequired,
messageIds: PropTypes.objectOf(PropTypes.string),
validatorsOnChange: PropTypes.arrayOf(PropTypes.func),
onChange: PropTypes.func
}
ValidatedFormControl.defaultProps = {
messageIds: {},
validatorsOnChange: [],
onChange: undefined
}
ValidatedFormControl.contextTypes = {
setErrorsForTag: PropTypes.func
}

View file

@ -1,8 +1,14 @@
import React from "react";
// @flow
import * as React from "react";
import { FormGroup } from "react-bootstrap";
import PropTypes from "prop-types";
const ValidatedFormGroup = (props, context) => {
type Props = {
tag: string
};
const ValidatedFormGroup = (props: Props, context: any) => {
// Remove additional props from the props
const { tag, ...cleanProps } = props;
@ -19,10 +25,6 @@ const ValidatedFormGroup = (props, context) => {
);
};
ValidatedFormGroup.propTypes = {
tag: PropTypes.string.isRequired
}
ValidatedFormGroup.contextTypes = {
hasErrorForTag: PropTypes.func
}

View file

@ -1,17 +1,20 @@
// @flow
import React from "react";
import { Button } from "react-bootstrap";
import PropTypes from "prop-types";
import type { Node } from 'react';
const ValidatedSubmitButton = (props, context) =>
type Props = {
children?: Node
};
const ValidatedSubmitButton = (props: Props, context: any) =>
<Button {...props} disabled={context.hasAnyError()}>
{props.children}
</Button>
;
ValidatedSubmitButton.propTypes = {
children: PropTypes.node
}
ValidatedSubmitButton.defaultProps = {
children: undefined
}

View file

@ -1,8 +1,13 @@
// @flow
import _ from "lodash";
import type { ValidationError } from "flow-typed";
import { AVATAR_MAX_SIZE_MB } from "../../../config/constants/numeric";
import { AVATAR_VALID_EXTENSIONS } from "../../../config/constants/strings";
export const avatarExtensionValidator = (target, messageIds = {}) => {
export const avatarExtensionValidator = (
target: HTMLInputElement,
messageIds: { [string]: string } = {}): Array<ValidationError> => {
const messageId = _.has(messageIds, "invalid_file_extension") ?
messageIds.invalid_file_extension :
"validators.file.invalid_file_extension";
@ -25,7 +30,9 @@ export const avatarExtensionValidator = (target, messageIds = {}) => {
return [];
}
export const avatarSizeValidator = (target, messageIds = {}) => {
export const avatarSizeValidator = (
target: HTMLInputElement,
messageIds: { [string]: string } = {}): Array<ValidationError> => {
const messageId = _.has(messageIds, "file_too_large") ?
messageIds.file_too_large :
"validators.file.file_too_large";

View file

@ -1,4 +1,7 @@
// @flow
import _ from "lodash";
import type { ValidationError } from "flow-typed";
import {
NAME_MIN_LENGTH,
NAME_MAX_LENGTH,
@ -9,7 +12,9 @@ import {
} from "../../../config/constants/numeric";
import { EMAIL_REGEX } from "../../../config/constants/strings";
export const nameMinLengthValidator = (target, messageIds = {}) => {
export const nameMinLengthValidator = (
target: HTMLInputElement,
messageIds: { [string]: string } = {}): Array<ValidationError> => {
const messageId = _.has(messageIds, "text_too_short") ?
messageIds.text_too_short :
"validators.text.text_too_short";
@ -25,7 +30,9 @@ export const nameMinLengthValidator = (target, messageIds = {}) => {
return [];
};
export const nameMaxLengthValidator = (target, messageIds = {}) => {
export const nameMaxLengthValidator = (
target: HTMLInputElement,
messageIds: { [string]: string } = {}): Array<ValidationError> => {
const messageId = _.has(messageIds, "text_too_long") ?
messageIds.text_too_long :
"validators.text.text_too_long";
@ -41,7 +48,9 @@ export const nameMaxLengthValidator = (target, messageIds = {}) => {
return [];
};
export const nameLengthValidator = (target, messageIds = {}) => {
export const nameLengthValidator = (
target: HTMLInputElement,
messageIds: { [string]: string } = {}): Array<ValidationError> => {
const res = nameMinLengthValidator(target, messageIds);
if (res.length > 0) {
return res;
@ -49,7 +58,9 @@ export const nameLengthValidator = (target, messageIds = {}) => {
return nameMaxLengthValidator(target, messageIds);
};
export const textBlankValidator = (target, messageIds = {}) => {
export const textBlankValidator = (
target: HTMLInputElement,
messageIds: { [string]: string } = {}): Array<ValidationError> => {
const messageId = _.has(messageIds, "text_blank") ?
messageIds.text_blank :
"validators.text.text_blank";
@ -64,7 +75,9 @@ export const textBlankValidator = (target, messageIds = {}) => {
return [];
}
export const textMaxLengthValidator = (target, messageIds = {}) => {
export const textMaxLengthValidator = (
target: HTMLInputElement,
messageIds: { [string]: string } = {}): Array<ValidationError> => {
const messageId = _.has(messageIds, "text_too_long") ?
messageIds.text_too_long :
"validators.text.text_too_long";
@ -80,7 +93,9 @@ export const textMaxLengthValidator = (target, messageIds = {}) => {
return [];
};
export const passwordLengthValidator = (target, messageIds = {}) => {
export const passwordLengthValidator = (
target: HTMLInputElement,
messageIds: { [string]: string } = {}): Array<ValidationError> => {
const messageIdTooShort = _.has(messageIds, "text_too_short") ?
messageIds.text_too_short :
"validators.text.text_too_short";
@ -105,7 +120,9 @@ export const passwordLengthValidator = (target, messageIds = {}) => {
return [];
};
export const userInitialsMaxLengthValidator = (target, messageIds = {}) => {
export const userInitialsMaxLengthValidator = (
target: HTMLInputElement,
messageIds: { [string]: string } = {}): Array<ValidationError> => {
const messageId = _.has(messageIds, "text_too_long") ?
messageIds.text_too_long :
"validators.text.text_too_long";
@ -121,7 +138,9 @@ export const userInitialsMaxLengthValidator = (target, messageIds = {}) => {
return [];
};
export const emailValidator = (target, messageIds = {}) => {
export const emailValidator = (
target: HTMLInputElement,
messageIds: { [string]: string } = {}): Array<ValidationError> => {
const res = textBlankValidator(target, messageIds);
if (res.length > 0) {
return res;

View file

@ -1,5 +1,5 @@
// flow-typed signature: c788eedb73f0df0fed02bf99c0b49bcc
// flow-typed version: 2adcdf60cc/axios_v0.16.x/flow_>=v0.25.x
// flow-typed signature: 783541c5bb930cc2cb39610705a4adc1
// flow-typed version: d84de54b07/axios_v0.16.x/flow_>=v0.25.x
declare module 'axios' {
declare interface ProxyConfig {
@ -60,7 +60,7 @@ declare module 'axios' {
declare class AxiosXHR<T> {
config: AxiosXHRConfig<T>;
data: T;
headers: Object;
headers?: Object;
status: number;
statusText: string,
request: http$ClientRequest | XMLHttpRequest

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,39 @@
// flow-typed signature: ace44a98a89509a513ab899eea5ba4fd
// flow-typed version: <<STUB>>/prettier-eslint_v^8.2.1/flow_v0.56.0
/**
* This is an autogenerated libdef stub for:
*
* 'prettier-eslint'
*
* Fill this stub out by replacing all the `any` types.
*
* Once filled out, we encourage you to share your work with the
* community by sending a pull request to:
* https://github.com/flowtype/flow-typed
*/
declare module 'prettier-eslint' {
declare module.exports: any;
}
/**
* We include stubs for each file inside this npm package in case you need to
* require those files directly. Feel free to delete any files that aren't
* needed.
*/
declare module 'prettier-eslint/dist/index' {
declare module.exports: any;
}
declare module 'prettier-eslint/dist/utils' {
declare module.exports: any;
}
// Filename aliases
declare module 'prettier-eslint/dist/index.js' {
declare module.exports: $Exports<'prettier-eslint/dist/index'>;
}
declare module 'prettier-eslint/dist/utils.js' {
declare module.exports: $Exports<'prettier-eslint/dist/utils'>;
}

View file

@ -1,5 +1,5 @@
// flow-typed signature: 4c4c0d4f407d88878f9e0b815c57c823
// flow-typed version: 97b6f00328/react-intl_v2.x.x/flow_>=v0.53.x
// flow-typed signature: ffba6b43bdc8cce76dba8a7d4fb7b539
// flow-typed version: cc3eacb5a2/react-intl_v2.x.x/flow_>=v0.53.x <=v0.56.x
/**
* Original implementation of this file by @marudor at https://github.com/marudor/flowInterfaces

14
flow-typed/types.js vendored
View file

@ -16,6 +16,20 @@ export type Alert = {
timeout: number
};
export type ValidationErrorSimple = {|
message: string
|};
export type ValidationErrorIntl = {|
intl: boolean,
messageId: string,
values: string
|};
export type ValidationError = ValidationErrorSimple | ValidationErrorIntl;
export type ValidationErrors = string | Array<string> | Array<ValidationError>;
export type Activity = {
id: number,
message: string,

View file

@ -33,6 +33,7 @@
"flow-bin": "^0.56.0",
"flow-typed": "^2.1.5",
"prettier": "^1.7.0",
"prettier-eslint": "^8.2.1",
"webpack-dev-server": "^2.5.1"
},
"dependencies": {
@ -95,4 +96,4 @@
"webpack-manifest-plugin": "^1.1.2",
"webpack-merge": "^4.1.0"
}
}
}

117
yarn.lock
View file

@ -102,7 +102,7 @@ ansi-html@0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
ansi-regex@^2.0.0:
ansi-regex@^2.0.0, ansi-regex@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
@ -114,7 +114,7 @@ ansi-styles@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
ansi-styles@^3.1.0:
ansi-styles@^3.0.0, ansi-styles@^3.1.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88"
dependencies:
@ -1424,6 +1424,12 @@ combined-stream@^1.0.5, combined-stream@~1.0.5:
dependencies:
delayed-stream "~1.0.0"
common-tags@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.4.0.tgz#1187be4f3d4cf0c0427d43f74eef1f73501614c0"
dependencies:
babel-runtime "^6.18.0"
commondir@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@ -1874,6 +1880,10 @@ diffie-hellman@^5.0.0:
miller-rabin "^4.0.0"
randombytes "^2.0.0"
dlv@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.0.tgz#fee1a7c43f63be75f3f679e85262da5f102764a7"
dns-equal@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
@ -2163,6 +2173,48 @@ eslint-scope@^3.7.1:
esrecurse "^4.1.0"
estraverse "^4.1.1"
eslint@^4.5.0:
version "4.10.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.10.0.tgz#f25d0d7955c81968c2309aa5c9a229e045176bb7"
dependencies:
ajv "^5.2.0"
babel-code-frame "^6.22.0"
chalk "^2.1.0"
concat-stream "^1.6.0"
cross-spawn "^5.1.0"
debug "^3.0.1"
doctrine "^2.0.0"
eslint-scope "^3.7.1"
espree "^3.5.1"
esquery "^1.0.0"
estraverse "^4.2.0"
esutils "^2.0.2"
file-entry-cache "^2.0.0"
functional-red-black-tree "^1.0.1"
glob "^7.1.2"
globals "^9.17.0"
ignore "^3.3.3"
imurmurhash "^0.1.4"
inquirer "^3.0.6"
is-resolvable "^1.0.0"
js-yaml "^3.9.1"
json-stable-stringify "^1.0.1"
levn "^0.3.0"
lodash "^4.17.4"
minimatch "^3.0.2"
mkdirp "^0.5.1"
natural-compare "^1.4.0"
optionator "^0.8.2"
path-is-inside "^1.0.2"
pluralize "^7.0.0"
progress "^2.0.0"
require-uncached "^1.0.3"
semver "^5.3.0"
strip-ansi "^4.0.0"
strip-json-comments "~2.0.1"
table "^4.0.1"
text-table "~0.2.0"
eslint@^4.7.2:
version "4.8.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.8.0.tgz#229ef0e354e0e61d837c7a80fdfba825e199815e"
@ -3012,6 +3064,10 @@ indent-string@^2.1.0:
dependencies:
repeating "^2.0.0"
indent-string@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
indexes-of@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
@ -3631,6 +3687,10 @@ lodash.memoize@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
lodash.merge@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5"
lodash.mergewith@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55"
@ -3643,6 +3703,10 @@ lodash.tail@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
lodash.unescape@4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"
lodash.uniq@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
@ -3651,6 +3715,13 @@ lodash.uniq@^4.5.0:
version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
loglevel-colored-level-prefix@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e"
dependencies:
chalk "^1.1.3"
loglevel "^1.4.1"
loglevel@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.4.1.tgz#95b383f91a3c2756fd4ab093667e4309161f2bcd"
@ -4827,10 +4898,33 @@ preserve@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
prettier@^1.7.0:
prettier-eslint@^8.2.1:
version "8.2.1"
resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-8.2.1.tgz#cd66cf8b1a2c2fce2217f1b28474809031b9a77c"
dependencies:
common-tags "^1.4.0"
dlv "^1.1.0"
eslint "^4.5.0"
indent-string "^3.2.0"
lodash.merge "^4.6.0"
loglevel-colored-level-prefix "^1.0.0"
prettier "^1.7.1"
pretty-format "^20.0.3"
require-relative "^0.8.7"
typescript "^2.5.1"
typescript-eslint-parser "^8.0.0"
prettier@^1.7.0, prettier@^1.7.1:
version "1.7.4"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.7.4.tgz#5e8624ae9363c80f95ec644584ecdf55d74f93fa"
pretty-format@^20.0.3:
version "20.0.3"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-20.0.3.tgz#020e350a560a1fe1a98dc3beb6ccffb386de8b14"
dependencies:
ansi-regex "^2.1.1"
ansi-styles "^3.0.0"
private@^0.1.6, private@^0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1"
@ -5391,6 +5485,10 @@ require-main-filename@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
require-relative@^0.8.7:
version "0.8.7"
resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de"
require-uncached@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
@ -5545,7 +5643,7 @@ selfsigned@^1.9.1:
dependencies:
node-forge "0.6.33"
"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0:
"semver@2 || 3 || 4 || 5", semver@5.4.1, semver@^5.1.0, semver@^5.3.0:
version "5.4.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
@ -6095,6 +6193,17 @@ typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
typescript-eslint-parser@^8.0.0:
version "8.0.1"
resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-8.0.1.tgz#e8cac537d996e16c3dbb0d7c4d509799e67afe0c"
dependencies:
lodash.unescape "4.0.1"
semver "5.4.1"
typescript@^2.5.1:
version "2.5.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d"
ua-parser-js@^0.7.9:
version "0.7.14"
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.14.tgz#110d53fa4c3f326c121292bbeac904d2e03387ca"