mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-10-27 22:49:02 +08:00
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:
commit
dfa1c83c9f
16 changed files with 2065 additions and 1820 deletions
1
.babelrc
1
.babelrc
|
|
@ -16,6 +16,7 @@
|
|||
"flow"
|
||||
],
|
||||
"plugins": [
|
||||
"transform-flow-strip-types",
|
||||
"transform-object-rest-spread",
|
||||
"syntax-dynamic-import",
|
||||
"transform-react-jsx-source",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
6
flow-typed/npm/axios_v0.16.x.js
vendored
6
flow-typed/npm/axios_v0.16.x.js
vendored
|
|
@ -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
|
||||
|
|
|
|||
3470
flow-typed/npm/lodash_v4.x.x.js
vendored
3470
flow-typed/npm/lodash_v4.x.x.js
vendored
File diff suppressed because it is too large
Load diff
39
flow-typed/npm/prettier-eslint_vx.x.x.js
vendored
Normal file
39
flow-typed/npm/prettier-eslint_vx.x.x.js
vendored
Normal 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'>;
|
||||
}
|
||||
4
flow-typed/npm/react-intl_v2.x.x.js
vendored
4
flow-typed/npm/react-intl_v2.x.x.js
vendored
|
|
@ -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
14
flow-typed/types.js
vendored
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
117
yarn.lock
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue