diff --git a/package.json b/package.json index 132f2bfac1..05d57cbfe5 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,8 @@ "check-license": "./scripts/check-license.sh", "coverage": "lerna run coverage", "eslint": "eslint 'scripts/*.{js,ts,tsx}' 'packages/*/src/**/*.{js,ts,tsx}' 'packages/*/*.{js,ts,tsx}'", - "flow": "glow", + "flow-comment": "echo 'disable flow as it dislikes typescript'", + "flow": "exit 0 || glow", "lint": "yarn run prettier-lint && yarn run tsc-lint && yarn run eslint && yarn run flow && yarn run check-license", "prepare": "lerna run --stream --sort prepublishOnly", diff --git a/packages/jaeger-ui/package.json b/packages/jaeger-ui/package.json index f59ffe728c..1e20a6b0d8 100644 --- a/packages/jaeger-ui/package.json +++ b/packages/jaeger-ui/package.json @@ -34,11 +34,18 @@ }, "dependencies": { "@jaegertracing/plexus": "0.0.1-dev.4", + "@types/classnames": "^2.2.7", + "@types/deep-freeze": "^0.1.1", + "@types/history": "^4.7.2", "@types/jsdom": "^12.2.3", "@types/lodash": "^4.14.123", "@types/moment": "^2.13.0", "@types/node": "^11.11.2", + "@types/react-copy-to-clipboard": "^4.2.6", + "@types/react-icons": "2.2.7", + "@types/react-redux": "^7.0.3", "@types/react-router-dom": "^4.3.1", + "@types/react-virtualized-select": "^3.0.7", "antd": "3.8.0", "chance": "^1.0.10", "classnames": "^2.2.5", diff --git a/packages/jaeger-ui/src/components/TraceDiff/TraceDiffHeader/TraceTimelineLink.js b/packages/jaeger-ui/src/components/TraceDiff/TraceDiffHeader/TraceTimelineLink.js index 925399c9eb..414b9a1e9a 100644 --- a/packages/jaeger-ui/src/components/TraceDiff/TraceDiffHeader/TraceTimelineLink.js +++ b/packages/jaeger-ui/src/components/TraceDiff/TraceDiffHeader/TraceTimelineLink.js @@ -17,7 +17,7 @@ import * as React from 'react'; import { getUrl } from '../../TracePage/url'; -import NewWindowIcon from '../../common/NewWindowIcon.js'; +import NewWindowIcon from '../../common/NewWindowIcon'; type PropsType = { traceID: string, diff --git a/packages/jaeger-ui/src/components/TraceDiff/TraceDiffHeader/TraceTimelineLink.test.js b/packages/jaeger-ui/src/components/TraceDiff/TraceDiffHeader/TraceTimelineLink.test.js index e725d821c3..799e4f52e8 100644 --- a/packages/jaeger-ui/src/components/TraceDiff/TraceDiffHeader/TraceTimelineLink.test.js +++ b/packages/jaeger-ui/src/components/TraceDiff/TraceDiffHeader/TraceTimelineLink.test.js @@ -16,7 +16,7 @@ import * as React from 'react'; import { shallow } from 'enzyme'; import TraceTimelineLink from './TraceTimelineLink'; -import NewWindowIcon from '../../common/NewWindowIcon.js'; +import NewWindowIcon from '../../common/NewWindowIcon'; describe('TraceTimelineLink', () => { const traceID = 'test-trace-id'; diff --git a/packages/jaeger-ui/src/components/TraceDiff/getValidState.js b/packages/jaeger-ui/src/components/TraceDiff/getValidState.ts similarity index 60% rename from packages/jaeger-ui/src/components/TraceDiff/getValidState.js rename to packages/jaeger-ui/src/components/TraceDiff/getValidState.ts index ad1701ba47..a76c1b82b2 100644 --- a/packages/jaeger-ui/src/components/TraceDiff/getValidState.js +++ b/packages/jaeger-ui/src/components/TraceDiff/getValidState.ts @@ -1,5 +1,3 @@ -// @flow - // Copyright (c) 2017 Uber Technologies, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,9 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -export default function getValidState(state?: ?{ a?: ?string, b?: ?string, cohort: string[] }) { - const { a: stA, b: stB, cohort: stCohort } = state || {}; - const cohortSet = new Set([].concat(stA, stB, stCohort || []).filter(Boolean)); +import TNullable from '../../types/nullable'; // eslint-disable-line no-unused-vars +import { TraceDiffState } from '../../types/trace-diff'; // eslint-disable-line no-unused-vars + +export default function getValidState(state: TraceDiffState) { + const { a: stA, b: stB, cohort: stCohort } = state; + const cohortSet = new Set( + ([] as (string | TNullable)[]) + .concat(stA, stB, stCohort) + .filter((str: string | TNullable): str is string => Boolean(str)) + ); const cohort: string[] = Array.from(cohortSet); const a = cohort[0]; const b = cohort[1]; diff --git a/packages/jaeger-ui/src/components/TraceDiff/url.js b/packages/jaeger-ui/src/components/TraceDiff/url.ts similarity index 89% rename from packages/jaeger-ui/src/components/TraceDiff/url.js rename to packages/jaeger-ui/src/components/TraceDiff/url.ts index 072d054801..9ee79a4eb4 100644 --- a/packages/jaeger-ui/src/components/TraceDiff/url.js +++ b/packages/jaeger-ui/src/components/TraceDiff/url.ts @@ -1,5 +1,3 @@ -// @flow - // Copyright (c) 2018 Uber Technologies, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,6 +16,7 @@ import queryString from 'query-string'; import { matchPath } from 'react-router-dom'; import getValidState from './getValidState'; +import { TraceDiffState } from '../../types/trace-diff'; // eslint-disable-line no-unused-vars import prefixUrl from '../../utils/prefix-url'; export const ROUTE_PATH = prefixUrl('/trace/:a?\\.\\.\\.:b?'); @@ -28,7 +27,7 @@ export function matches(path: string) { return Boolean(matchPath(path, ROUTE_MATCHER)); } -export function getUrl(state?: ?{ a?: ?string, b?: ?string, cohort: string[] }) { +export function getUrl(state: TraceDiffState) { const { a, b, cohort } = getValidState(state); const search = queryString.stringify({ cohort }); return prefixUrl(`/trace/${a || ''}...${b || ''}${search ? '?' : ''}${search}`); diff --git a/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/SpanDetail/DetailState.js b/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/SpanDetail/DetailState.ts similarity index 87% rename from packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/SpanDetail/DetailState.js rename to packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/SpanDetail/DetailState.ts index 8cd924526d..7754b9c201 100644 --- a/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/SpanDetail/DetailState.js +++ b/packages/jaeger-ui/src/components/TracePage/TraceTimelineViewer/SpanDetail/DetailState.ts @@ -14,7 +14,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -import type { Log } from '../../../../types/trace'; +import { Log } from '../../../../types/trace'; // eslint-disable-line no-unused-vars /** * Which items of a {@link SpanDetail} component are expanded. @@ -22,10 +22,10 @@ import type { Log } from '../../../../types/trace'; export default class DetailState { isTagsOpen: boolean; isProcessOpen: boolean; - logs: { isOpen: boolean, openedItems: Set }; + logs: { isOpen: boolean; openedItems: Set }; constructor(oldState?: DetailState) { - const { isTagsOpen, isProcessOpen, logs } = oldState || {}; + const { isTagsOpen, isProcessOpen, logs }: DetailState | Record = oldState || {}; this.isTagsOpen = Boolean(isTagsOpen); this.isProcessOpen = Boolean(isProcessOpen); this.logs = { diff --git a/packages/jaeger-ui/src/components/common/BreakableText.js b/packages/jaeger-ui/src/components/common/BreakableText.tsx similarity index 79% rename from packages/jaeger-ui/src/components/common/BreakableText.js rename to packages/jaeger-ui/src/components/common/BreakableText.tsx index 1598bcfe3c..31f7cda76e 100644 --- a/packages/jaeger-ui/src/components/common/BreakableText.js +++ b/packages/jaeger-ui/src/components/common/BreakableText.tsx @@ -21,12 +21,16 @@ import './BreakableText.css'; const WORD_RX = /\W*\w+\W*/g; type Props = { - text: string, - className?: string, - wordRegexp?: RegExp, + text: string; + className?: string; + wordRegexp?: RegExp; }; -export default function BreakableText(props: Props) { +// TODO typescript doesn't understand text or null as react nodes +// https://github.com/Microsoft/TypeScript/issues/21699 +export default function BreakableText( + props: Props +): any /* React.ReactNode /* React.ReactElement | React.ReactElement[] \*\/ */ { const { className, text, wordRegexp = WORD_RX } = props; if (!text) { return typeof text === 'string' ? text : null; diff --git a/packages/jaeger-ui/src/components/common/CopyIcon.js b/packages/jaeger-ui/src/components/common/CopyIcon.tsx similarity index 88% rename from packages/jaeger-ui/src/components/common/CopyIcon.js rename to packages/jaeger-ui/src/components/common/CopyIcon.tsx index 1645106b2e..cd6fe6ea3a 100644 --- a/packages/jaeger-ui/src/components/common/CopyIcon.js +++ b/packages/jaeger-ui/src/components/common/CopyIcon.tsx @@ -17,23 +17,21 @@ import * as React from 'react'; import { Icon, Tooltip } from 'antd'; -import { CopyToClipboard } from 'react-copy-to-clipboard'; +import CopyToClipboard from 'react-copy-to-clipboard'; type PropsType = { - className?: string, - copyText: string, - tooltipTitle: string, + className?: string; + copyText: string; + tooltipTitle: string; }; type StateType = { - hasCopied: boolean, + hasCopied: boolean; }; export default class CopyIcon extends React.PureComponent { - props: PropsType; - - static defaultProps = { - className: null, + static defaultProps: Partial = { + className: undefined, }; state = { diff --git a/packages/jaeger-ui/src/components/common/ErrorMessage.js b/packages/jaeger-ui/src/components/common/ErrorMessage.tsx similarity index 86% rename from packages/jaeger-ui/src/components/common/ErrorMessage.js rename to packages/jaeger-ui/src/components/common/ErrorMessage.tsx index 066affb3e4..cc68820aea 100644 --- a/packages/jaeger-ui/src/components/common/ErrorMessage.js +++ b/packages/jaeger-ui/src/components/common/ErrorMessage.tsx @@ -16,25 +16,25 @@ import * as React from 'react'; -import type { ApiError } from '../../types/api-error'; +import { ApiError } from '../../types/api-error'; // eslint-disable-line no-unused-vars import './ErrorMessage.css'; type ErrorMessageProps = { - className?: string, - detailClassName?: string, - messageClassName?: string, - error: ApiError, + className?: string; + detailClassName?: string; + messageClassName?: string; + error: ApiError; }; type SubPartProps = { - className?: string, - error: ApiError, - wrap?: boolean, - wrapperClassName?: string, + className?: string; + error: ApiError; + wrap?: boolean; + wrapperClassName?: string; }; -function ErrorAttr({ name, value }: { name: string, value: any }) { +function ErrorAttr({ name, value }: { name: string; value: any }) { return ( {name} @@ -46,12 +46,12 @@ function ErrorAttr({ name, value }: { name: string, value: any }) { function Message(props: SubPartProps) { const { className, error, wrap, wrapperClassName } = props; const cssClass = `ErrorMessage--msg ${className || ''}`; - let msg: React.Node; - if (typeof error === 'string') { - msg =

{error}

; - } else { - msg =

{error.message}

; - } + const msg = + typeof error === 'string' ? ( +

{error}

+ ) : ( +

{error.message}

+ ); if (wrap) { return
{msg}
; } diff --git a/packages/jaeger-ui/src/components/common/LabeledList.js b/packages/jaeger-ui/src/components/common/LabeledList.tsx similarity index 87% rename from packages/jaeger-ui/src/components/common/LabeledList.js rename to packages/jaeger-ui/src/components/common/LabeledList.tsx index 6845c4a5dc..c20dc70e70 100644 --- a/packages/jaeger-ui/src/components/common/LabeledList.js +++ b/packages/jaeger-ui/src/components/common/LabeledList.tsx @@ -20,9 +20,9 @@ import { Divider } from 'antd'; import './LabeledList.css'; type LabeledListProps = { - className?: string, - dividerClassName?: string, - items: { key: string, label: React.Node, value: React.Node }[], + className?: string; + dividerClassName?: string; + items: { key: string; label: React.ReactNode; value: React.ReactNode }[]; }; export default function LabeledList(props: LabeledListProps) { @@ -46,8 +46,3 @@ export default function LabeledList(props: LabeledListProps) { ); } - -LabeledList.defaultProps = { - className: undefined, - dividerClassName: undefined, -}; diff --git a/packages/jaeger-ui/src/components/common/LoadingIndicator.js b/packages/jaeger-ui/src/components/common/LoadingIndicator.tsx similarity index 94% rename from packages/jaeger-ui/src/components/common/LoadingIndicator.js rename to packages/jaeger-ui/src/components/common/LoadingIndicator.tsx index 1cdb4e2342..6243773130 100644 --- a/packages/jaeger-ui/src/components/common/LoadingIndicator.js +++ b/packages/jaeger-ui/src/components/common/LoadingIndicator.tsx @@ -20,9 +20,9 @@ import { Icon } from 'antd'; import './LoadingIndicator.css'; type LoadingIndicatorProps = { - centered?: boolean, - className?: string, - small?: boolean, + centered?: boolean; + className?: string; + small?: boolean; }; export default function LoadingIndicator(props: LoadingIndicatorProps) { diff --git a/packages/jaeger-ui/src/components/common/NewWindowIcon.js b/packages/jaeger-ui/src/components/common/NewWindowIcon.tsx similarity index 98% rename from packages/jaeger-ui/src/components/common/NewWindowIcon.js rename to packages/jaeger-ui/src/components/common/NewWindowIcon.tsx index 8d497f5ff3..1c0427ad8e 100644 --- a/packages/jaeger-ui/src/components/common/NewWindowIcon.js +++ b/packages/jaeger-ui/src/components/common/NewWindowIcon.tsx @@ -21,7 +21,7 @@ import IoAndroidOpen from 'react-icons/lib/io/android-open'; import './NewWindowIcon.css'; type Props = { - isLarge?: boolean, + isLarge?: boolean; }; export default function NewWindowIcon(props: Props) { diff --git a/packages/jaeger-ui/src/components/common/RelativeDate.ts b/packages/jaeger-ui/src/components/common/RelativeDate.tsx similarity index 100% rename from packages/jaeger-ui/src/components/common/RelativeDate.ts rename to packages/jaeger-ui/src/components/common/RelativeDate.tsx diff --git a/packages/jaeger-ui/src/components/common/TraceName.js b/packages/jaeger-ui/src/components/common/TraceName.tsx similarity index 75% rename from packages/jaeger-ui/src/components/common/TraceName.js rename to packages/jaeger-ui/src/components/common/TraceName.tsx index 9cb5ef479c..e16c477390 100644 --- a/packages/jaeger-ui/src/components/common/TraceName.js +++ b/packages/jaeger-ui/src/components/common/TraceName.tsx @@ -20,22 +20,23 @@ import BreakableText from './BreakableText'; import LoadingIndicator from './LoadingIndicator'; import { fetchedState, FALLBACK_TRACE_NAME } from '../../constants'; -import type { FetchedState } from '../../types'; -import type { ApiError } from '../../types/api-error'; +import { FetchedState } from '../../types'; // eslint-disable-line no-unused-vars +import { ApiError } from '../../types/api-error'; // eslint-disable-line no-unused-vars import './TraceName.css'; type Props = { - className?: string, - error?: ?ApiError, - state?: ?FetchedState, - traceName?: ?string, + className?: string; + // TODO nullable type + error?: ApiError | undefined | null; + state?: FetchedState | undefined | null; + traceName?: string | undefined | null; }; export default function TraceName(props: Props) { const { className, error, state, traceName } = props; const isErred = state === fetchedState.ERROR; - let title = traceName || FALLBACK_TRACE_NAME; + let title: string | React.ReactNode = traceName || FALLBACK_TRACE_NAME; let errorCssClass = ''; if (isErred) { errorCssClass = 'is-error'; @@ -46,19 +47,13 @@ export default function TraceName(props: Props) { if (!titleStr) { titleStr = 'Error: Unknown error'; } + title = titleStr; title = ; } else if (state === fetchedState.LOADING) { title = ; } else { - const text = traceName || FALLBACK_TRACE_NAME; + const text: string = String(traceName || FALLBACK_TRACE_NAME); title = ; } return {title}; } - -TraceName.defaultProps = { - className: '', - error: null, - state: null, - traceName: null, -}; diff --git a/packages/jaeger-ui/src/components/common/UiFindInput.js b/packages/jaeger-ui/src/components/common/UiFindInput.tsx similarity index 57% rename from packages/jaeger-ui/src/components/common/UiFindInput.js rename to packages/jaeger-ui/src/components/common/UiFindInput.tsx index 41a027ec37..431aefb354 100644 --- a/packages/jaeger-ui/src/components/common/UiFindInput.js +++ b/packages/jaeger-ui/src/components/common/UiFindInput.tsx @@ -17,35 +17,43 @@ import * as React from 'react'; import { Input } from 'antd'; import _debounce from 'lodash/debounce'; +import _isString from 'lodash/isString'; import { connect } from 'react-redux'; import { withRouter } from 'react-router-dom'; import queryString from 'query-string'; -import type { Location, RouterHistory } from 'react-router-dom'; +import { History as RouterHistory, Location } from 'history'; // eslint-disable-line no-unused-vars import updateUiFind from '../../utils/update-ui-find'; -import type { ReduxState } from '../../types/index'; +import { ReduxState } from '../../types/index'; // eslint-disable-line no-unused-vars -type PropsType = { - forwardedRef?: { current: Input | null }, - inputProps?: Object, - history: RouterHistory, - location: Location, - trackFindFunction?: (?string) => void, - uiFind?: string, +type OwnPropsType = { + forwardedRef?: { current: Input | null }; + inputProps?: Object; + history: RouterHistory; + location: Location; + match: any; + // todo + trackFindFunction?: (str: string | null | undefined) => void; }; +type extractUiFindFromStateReturn = { + uiFind?: string; +}; + +type PropsType = OwnPropsType & extractUiFindFromStateReturn; + type StateType = { - ownInputValue: ?string, + ownInputValue: string | null; }; export class UnconnectedUiFindInput extends React.PureComponent { - static defaultProps = { - forwardedRef: null, + static defaultProps: Partial = { + forwardedRef: undefined, inputProps: {}, - trackFindFunction: null, - uiFind: null, + trackFindFunction: undefined, + uiFind: undefined, }; state = { @@ -57,13 +65,13 @@ export class UnconnectedUiFindInput extends React.PureComponent) => { + handleInputChange = (evt: React.ChangeEvent) => { const { value } = evt.target; this.updateUiFindQueryParam(value); this.setState({ ownInputValue: value }); }; - updateUiFindQueryParam = _debounce((uiFind: ?string) => { + updateUiFindQueryParam = _debounce((uiFind: string | undefined) => { const { history, location, trackFindFunction } = this.props; updateUiFind({ location, @@ -74,11 +82,15 @@ export class UnconnectedUiFindInput extends React.PureComponent void, + focusedOption: option, + focusOption: (obj: Object) => void, key: string, labelKey: string, - option: { [string]: any }, - selectValue: ({}) => void, - style: {}, - valueArray: ?({}[]), + option: option, + selectValue: (obj: Object) => void, + style: object, + valueArray: object[] | null | undefined, }; + */ type RenderArrowArgs = { - isOpen: boolean, + isOpen: boolean; }; function renderOption({ @@ -50,7 +58,10 @@ function renderOption({ selectValue, style, valueArray, -}: RenderOptionArgs) { +}: // react-Virtualized-select is deprecated and I cannot unravel its types +// maybe time to use react-select which supports async +// TODO discuss 👆 +any) /* RenderOptionArgs) \*\/: JSX.Element */ { const className = ['VirtSelect--option']; if (option === focusedOption) { className.push('is-focused'); @@ -81,7 +92,7 @@ function renderArrow({ isOpen }: RenderArrowArgs) { return ; } -export default function VirtSelect(props: {}) { +export default function VirtSelect(props: object) { return ( '; -export const FETCH_DONE = 'FETCH_DONE'; -export const FETCH_ERROR = 'FETCH_ERROR'; -export const FETCH_LOADING = 'FETCH_LOADING'; +export const FETCH_DONE = 'FETCH_DONE' as 'FETCH_DONE'; +export const FETCH_ERROR = 'FETCH_ERROR' as 'FETCH_ERROR'; +export const FETCH_LOADING = 'FETCH_LOADING' as 'FETCH_LOADING'; export const fetchedState = { DONE: FETCH_DONE, diff --git a/packages/jaeger-ui/src/constants/search-form.js b/packages/jaeger-ui/src/constants/search-form.ts similarity index 73% rename from packages/jaeger-ui/src/constants/search-form.js rename to packages/jaeger-ui/src/constants/search-form.ts index e716b295af..feedb7fa08 100644 --- a/packages/jaeger-ui/src/constants/search-form.js +++ b/packages/jaeger-ui/src/constants/search-form.ts @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -export const DEFAULT_OPERATION = 'all'; -export const DEFAULT_LOOKBACK = '1h'; -export const DEFAULT_LIMIT = 20; +export const DEFAULT_OPERATION = 'all' as 'all'; +export const DEFAULT_LOOKBACK = '1h' as '1h'; +export const DEFAULT_LIMIT = 20 as 20; -export const FORM_CHANGE_ACTION_TYPE = '@@redux-form/CHANGE'; +export const FORM_CHANGE_ACTION_TYPE = '@@redux-form/CHANGE' as '@@redux-form/CHANGE'; diff --git a/packages/jaeger-ui/src/constants/tag-keys.js b/packages/jaeger-ui/src/constants/tag-keys.ts similarity index 77% rename from packages/jaeger-ui/src/constants/tag-keys.js rename to packages/jaeger-ui/src/constants/tag-keys.ts index 266677b36a..b8a3df059b 100644 --- a/packages/jaeger-ui/src/constants/tag-keys.js +++ b/packages/jaeger-ui/src/constants/tag-keys.ts @@ -14,6 +14,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -export const HTTP_METHOD = 'http.method'; -export const PEER_SERVICE = 'peer.service'; -export const SPAN_KIND = 'span.kind'; +export const HTTP_METHOD = 'http.method' as 'http.method'; +export const PEER_SERVICE = 'peer.service' as 'peer.service'; +export const SPAN_KIND = 'span.kind' as 'span.kind'; diff --git a/packages/jaeger-ui/src/types/api-error.js b/packages/jaeger-ui/src/types/api-error.ts similarity index 73% rename from packages/jaeger-ui/src/types/api-error.js rename to packages/jaeger-ui/src/types/api-error.ts index d22ae3adf8..1cccaf6e2e 100644 --- a/packages/jaeger-ui/src/types/api-error.js +++ b/packages/jaeger-ui/src/types/api-error.ts @@ -1,5 +1,3 @@ -// @flow - // Copyright (c) 2017 Uber Technologies, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,13 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -export type ApiError = +export type ApiError = // eslint-disable-line import/prefer-default-export | string | { - message: string, - httpStatus?: any, - httpStatusText?: string, - httpUrl?: string, - httpQuery?: string, - httpBody?: string, + message: string; + httpStatus?: any; + httpStatusText?: string; + httpUrl?: string; + httpQuery?: string; + httpBody?: string; }; diff --git a/packages/jaeger-ui/src/types/archive.js b/packages/jaeger-ui/src/types/archive.ts similarity index 71% rename from packages/jaeger-ui/src/types/archive.js rename to packages/jaeger-ui/src/types/archive.ts index 1b8028ab15..b5e15cb951 100644 --- a/packages/jaeger-ui/src/types/archive.js +++ b/packages/jaeger-ui/src/types/archive.ts @@ -1,5 +1,3 @@ -// @flow - // Copyright (c) 2017 Uber Technologies, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,16 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -import type { ApiError } from './api-error'; +import { ApiError } from './api-error'; // eslint-disable-line no-unused-vars export type TraceArchive = { - isLoading?: boolean, - isArchived?: boolean, - isError?: boolean, - error?: ApiError, - isAcknowledged?: boolean, + isLoading?: boolean; + isArchived?: boolean; + isError?: boolean; + error?: ApiError; + isAcknowledged?: boolean; }; -export type TracesArchive = { - [string]: TraceArchive, -}; +export type TracesArchive = Record; diff --git a/packages/jaeger-ui/src/types/config.js b/packages/jaeger-ui/src/types/config.ts similarity index 61% rename from packages/jaeger-ui/src/types/config.js rename to packages/jaeger-ui/src/types/config.ts index 95aded2ce7..1ed9d125ee 100644 --- a/packages/jaeger-ui/src/types/config.js +++ b/packages/jaeger-ui/src/types/config.ts @@ -1,5 +1,3 @@ -// @flow - // Copyright (c) 2017 Uber Technologies, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,23 +12,25 @@ // See the License for the specific language governing permissions and // limitations under the License. +import TNullable from './nullable'; // eslint-disable-line no-unused-vars + export type ConfigMenuItem = { - label: string, - url: string, - anchorTarget?: '_self' | '_blank' | '_parent' | '_top', + label: string; + url: string; + anchorTarget?: '_self' | '_blank' | '_parent' | '_top'; }; export type ConfigMenuGroup = { - label: string, - items: ConfigMenuItem[], + label: string; + items: ConfigMenuItem[]; }; export type Config = { - archiveEnabled: ?boolean, - dependencies?: { dagMaxServicesLen?: number, menuEnabled?: boolean }, + archiveEnabled: boolean | TNullable; + dependencies?: { dagMaxServicesLen?: number; menuEnabled?: boolean }; tracking?: { - gaID: ?string, - trackErrors: ?boolean, - }, - menu: (ConfigMenuGroup | ConfigMenuItem)[], + gaID: string | TNullable; + trackErrors: boolean | TNullable; + }; + menu: (ConfigMenuGroup | ConfigMenuItem)[]; }; diff --git a/packages/jaeger-ui/src/types/embedded.js b/packages/jaeger-ui/src/types/embedded.ts similarity index 74% rename from packages/jaeger-ui/src/types/embedded.js rename to packages/jaeger-ui/src/types/embedded.ts index dda27aa331..986f4ef41b 100644 --- a/packages/jaeger-ui/src/types/embedded.js +++ b/packages/jaeger-ui/src/types/embedded.ts @@ -15,13 +15,13 @@ // limitations under the License. type EmbeddedStateV0 = { - version: 'v0', - searchHideGraph: boolean, + version: 'v0'; + searchHideGraph: boolean; timeline: { - collapseTitle: boolean, - hideMinimap: boolean, - hideSummary: boolean, - }, + collapseTitle: boolean; + hideMinimap: boolean; + hideSummary: boolean; + }; }; -export type EmbeddedState = EmbeddedStateV0; +export type EmbeddedState = EmbeddedStateV0; // eslint-disable-line import/prefer-default-export diff --git a/packages/jaeger-ui/src/types/index.js b/packages/jaeger-ui/src/types/index.js deleted file mode 100644 index c6e255714d..0000000000 --- a/packages/jaeger-ui/src/types/index.js +++ /dev/null @@ -1,64 +0,0 @@ -// @flow - -// Copyright (c) 2017 Uber Technologies, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import type { ContextRouter } from 'react-router-dom'; - -import type { ApiError } from './api-error'; -import type { TracesArchive } from './archive'; -import type { Config } from './config'; -import type { EmbeddedState } from './embedded'; -import type { SearchQuery } from './search'; -import type { Trace } from './trace'; -import type { TraceDiffState } from './trace-diff'; -import type { TraceTimeline } from './trace-timeline'; - -export type FetchedState = 'FETCH_DONE' | 'FETCH_ERROR' | 'FETCH_LOADING'; - -export type FetchedTrace = { - data?: Trace, - error?: ApiError, - id: string, - state?: FetchedState, -}; - -export type ReduxState = { - archive: TracesArchive, - config: Config, - dependencies: { - dependencies: { parent: string, child: string, callCount: number }[], - loading: boolean, - error: ?ApiError, - }, - embedded: EmbeddedState, - router: ContextRouter, - services: { - services: ?(string[]), - operationsForService: { [string]: string[] }, - loading: boolean, - error: ?ApiError, - }, - trace: { - traces: { [string]: FetchedTrace }, - search: { - error?: ApiError, - results: string[], - state?: FetchedState, - query?: SearchQuery, - }, - }, - traceDiff: TraceDiffState, - traceTimeline: TraceTimeline, -}; diff --git a/packages/jaeger-ui/src/types/index.ts b/packages/jaeger-ui/src/types/index.ts new file mode 100644 index 0000000000..c01becf1b2 --- /dev/null +++ b/packages/jaeger-ui/src/types/index.ts @@ -0,0 +1,69 @@ +// @flow + +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// TODO: Everett is this correct? Can't find ContextRouter +import { Router } from 'react-router-dom'; // eslint-disable-line no-unused-vars +import { History as RouterHistory, Location } from 'history'; // eslint-disable-line no-unused-vars + +import { ApiError } from './api-error'; // eslint-disable-line no-unused-vars +import { TracesArchive } from './archive'; // eslint-disable-line no-unused-vars +import { Config } from './config'; // eslint-disable-line no-unused-vars +import { EmbeddedState } from './embedded'; // eslint-disable-line no-unused-vars +import TNullable from './nullable'; // eslint-disable-line no-unused-vars +import { SearchQuery } from './search'; // eslint-disable-line no-unused-vars +import { Trace } from './trace'; // eslint-disable-line no-unused-vars +import { TraceDiffState } from './trace-diff'; // eslint-disable-line no-unused-vars +import { TraceTimeline } from './trace-timeline'; // eslint-disable-line no-unused-vars + +export type FetchedState = 'FETCH_DONE' | 'FETCH_ERROR' | 'FETCH_LOADING'; + +export type FetchedTrace = { + data?: Trace; + error?: ApiError; + id: string; + state?: FetchedState; +}; + +export type ReduxState = { + archive: TracesArchive; + config: Config; + dependencies: { + dependencies: { parent: string; child: string; callCount: number }[]; + loading: boolean; + error: ApiError | TNullable; + }; + embedded: EmbeddedState; + router: Router & { + location: Location; + }; + services: { + services: (string[]) | TNullable; + operationsForService: Record; + loading: boolean; + error: ApiError | TNullable; + }; + trace: { + traces: Record; + search: { + error?: ApiError; + results: string[]; + state?: FetchedState; + query?: SearchQuery; + }; + }; + traceDiff: TraceDiffState; + traceTimeline: TraceTimeline; +}; diff --git a/packages/jaeger-ui/src/types/trace-diff.js b/packages/jaeger-ui/src/types/nullable.ts similarity index 86% rename from packages/jaeger-ui/src/types/trace-diff.js rename to packages/jaeger-ui/src/types/nullable.ts index 932f18ba75..43b207e849 100644 --- a/packages/jaeger-ui/src/types/trace-diff.js +++ b/packages/jaeger-ui/src/types/nullable.ts @@ -1,5 +1,3 @@ -// @flow - // Copyright (c) 2017 Uber Technologies, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,8 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -export type TraceDiffState = { - a: ?string, - b: ?string, - cohort: string[], -}; +type TNullable = null | undefined; + +export default TNullable; // eslint-disable-line no-undef diff --git a/packages/jaeger-ui/src/types/trace-diff.ts b/packages/jaeger-ui/src/types/trace-diff.ts new file mode 100644 index 0000000000..d86f3728f0 --- /dev/null +++ b/packages/jaeger-ui/src/types/trace-diff.ts @@ -0,0 +1,24 @@ +// @flow + +// Copyright (c) 2017 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import TNullable from './nullable'; // eslint-disable-line no-unused-vars + +// eslint-disable-next-line import/prefer-default-export +export type TraceDiffState = { + a: string | TNullable; + b: string | TNullable; + cohort: string[]; +}; diff --git a/packages/jaeger-ui/src/types/trace-timeline.js b/packages/jaeger-ui/src/types/trace-timeline.ts similarity index 63% rename from packages/jaeger-ui/src/types/trace-timeline.js rename to packages/jaeger-ui/src/types/trace-timeline.ts index 51ae92b727..a421b2c86c 100644 --- a/packages/jaeger-ui/src/types/trace-timeline.js +++ b/packages/jaeger-ui/src/types/trace-timeline.ts @@ -14,13 +14,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -import DetailState from '../components/TracePage/TraceTimelineViewer/SpanDetail/DetailState'; +import DetailState from '../components/TracePage/TraceTimelineViewer/SpanDetail/DetailState'; // eslint-disable-line no-unused-vars +import TNullable from './nullable'; // eslint-disable-line no-unused-vars +// eslint-disable-next-line import/prefer-default-export export type TraceTimeline = { - traceID: ?string, - spanNameColumnWidth: number, - childrenHiddenIDs: Set, - findMatches: ?Set, - detailStates: Map, - hoverIndentGuideIds: Set, + traceID: string | TNullable; + spanNameColumnWidth: number; + childrenHiddenIDs: Set; + findMatches: Set | TNullable; + detailStates: Map; + hoverIndentGuideIds: Set; }; diff --git a/packages/jaeger-ui/src/types/trace.js b/packages/jaeger-ui/src/types/trace.ts similarity index 55% rename from packages/jaeger-ui/src/types/trace.js rename to packages/jaeger-ui/src/types/trace.ts index 5840e46398..8fcc5db853 100644 --- a/packages/jaeger-ui/src/types/trace.js +++ b/packages/jaeger-ui/src/types/trace.ts @@ -1,5 +1,3 @@ -// @flow - // Copyright (c) 2017 Uber Technologies, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,62 +17,62 @@ */ export type KeyValuePair = { - key: string, - value: any, + key: string; + value: any; }; export type Link = { - url: string, - text: string, + url: string; + text: string; }; export type Log = { - timestamp: number, - fields: Array, + timestamp: number; + fields: Array; }; export type Process = { - serviceName: string, - tags: Array, + serviceName: string; + tags: Array; }; export type SpanReference = { - refType: 'CHILD_OF' | 'FOLLOWS_FROM', + refType: 'CHILD_OF' | 'FOLLOWS_FROM'; // eslint-disable-next-line no-use-before-define - span: ?Span, - spanID: string, - traceID: string, + span: Span | null | undefined; + spanID: string; + traceID: string; }; export type SpanData = { - spanID: string, - traceID: string, - processID: string, - operationName: string, - startTime: number, - duration: number, - logs: Array, - tags: Array, - references: Array, + spanID: string; + traceID: string; + processID: string; + operationName: string; + startTime: number; + duration: number; + logs: Array; + tags: Array; + references: Array; }; export type Span = SpanData & { - depth: number, - hasChildren: boolean, - process: Process, - relativeStartTime: number, + depth: number; + hasChildren: boolean; + process: Process; + relativeStartTime: number; }; export type TraceData = { - processes: { [string]: Process }, - traceID: string, + processes: Record; + traceID: string; }; export type Trace = TraceData & { - duration: number, - endTime: number, - spans: Span[], - startTime: number, - traceName: string, - services: { name: string, numberOfSpans: number }[], + duration: number; + endTime: number; + spans: Span[]; + startTime: number; + traceName: string; + services: { name: string; numberOfSpans: number }[]; }; diff --git a/packages/jaeger-ui/src/utils/update-ui-find.js b/packages/jaeger-ui/src/utils/update-ui-find.ts similarity index 69% rename from packages/jaeger-ui/src/utils/update-ui-find.js rename to packages/jaeger-ui/src/utils/update-ui-find.ts index 4d5738248e..4af944b6d5 100644 --- a/packages/jaeger-ui/src/utils/update-ui-find.js +++ b/packages/jaeger-ui/src/utils/update-ui-find.ts @@ -16,7 +16,10 @@ import queryString from 'query-string'; -import type { Location, RouterHistory } from 'react-router-dom'; +import { History as RouterHistory, Location } from 'history'; // eslint-disable-line no-unused-vars +// import { Location, RouterHistory } from 'react-router-dom'; + +import TNullable from '../types/nullable'; // eslint-disable-line no-unused-vars export default function updateUiFind({ history, @@ -24,17 +27,17 @@ export default function updateUiFind({ trackFindFunction, uiFind, }: { - history: RouterHistory, - location: Location, - trackFindFunction?: (?string) => void, - uiFind?: ?string, + history: RouterHistory; + location: Location; + trackFindFunction?: (uiFind: string | TNullable) => void; + uiFind?: string | TNullable; }) { const { uiFind: omittedOldValue, ...queryParams } = queryString.parse(location.search); if (trackFindFunction) { trackFindFunction(uiFind); } if (uiFind) { - queryParams.uiFind = uiFind; + (queryParams as Record).uiFind = uiFind; } history.replace({ ...location, diff --git a/tsconfig.json b/tsconfig.json index 0941f63b62..a3d5a05d4d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,7 +20,9 @@ // TODO(joef) "packages/plexus/demo", "packages/plexus/src", + "packages/jaeger-ui/src", // easier to add `./typings` here than deal with typeRoots, paths, etc. "typings" - ] + ], + "exclude": ["packages/jaeger-ui/src/**/*.js"] } diff --git a/yarn.lock b/yarn.lock index d88e2193b5..b514c8cc01 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1563,6 +1563,11 @@ "@svgr/core" "^2.4.1" loader-utils "^1.1.0" +"@types/classnames@^2.2.7": + version "2.2.7" + resolved "https://unpm.uberinternal.com/@types%2fclassnames/-/classnames-2.2.7.tgz#fb68cc9be8487e6ea5b13700e759bfbab7e0fefd" + integrity sha512-rzOhiQ55WzAiFgXRtitP/ZUT8iVNyllEpylJ5zHzR4vArUvMB39GTk+Zon/uAM0JxEFAWnwsxC2gH8s+tZ3Myg== + "@types/d3-color@*": version "1.2.2" resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-1.2.2.tgz#80cf7cfff7401587b8f89307ba36fe4a576bc7cf" @@ -1584,9 +1589,22 @@ "@types/d3-interpolate" "*" "@types/d3-selection" "*" -"@types/history@*": +"@types/deep-freeze@^0.1.1": + version "0.1.1" + resolved "https://unpm.uberinternal.com/@types%2fdeep-freeze/-/deep-freeze-0.1.1.tgz#0e1ee6ceee06f51baeb663deec0bb7780bd72827" + integrity sha512-nP6a+Z7pFv8aag1N6XOI68vaM11jjpI6sSig9fPTPDP6cc33gLXbotarnDzjGjoEkXRPWcSGKeTT8qkgh936Pw== + +"@types/history@*", "@types/history@^4.7.2": version "4.7.2" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.2.tgz#0e670ea254d559241b6eeb3894f8754991e73220" + resolved "https://unpm.uberinternal.com/@types%2fhistory/-/history-4.7.2.tgz#0e670ea254d559241b6eeb3894f8754991e73220" + integrity sha512-ui3WwXmjTaY73fOQ3/m3nnajU/Orhi6cEu5rzX+BrAAJxa3eITXZ5ch9suPqtM03OWhAHhPSyBGCN4UKoxO20Q== + +"@types/hoist-non-react-statics@*": + version "3.3.0" + resolved "https://unpm.uberinternal.com/@types%2fhoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#a59c0c995cc885bef1b8ec2241b114f9b35b517b" + integrity sha512-O2OGyW9wlO2bbDmZRH17MecArQfsIa1g//ve2IJk6BnmwEglFz5kdhP1BlgeqjVNH5IHIhsc83DWFo8StCe8+Q== + dependencies: + "@types/react" "*" "@types/jsdom@^12.2.3": version "12.2.3" @@ -1626,15 +1644,47 @@ version "1.5.1" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.1.tgz#48fd98c1561fe718b61733daed46ff115b496e18" +"@types/react-copy-to-clipboard@^4.2.6": + version "4.2.6" + resolved "https://unpm.uberinternal.com/@types%2freact-copy-to-clipboard/-/react-copy-to-clipboard-4.2.6.tgz#d1374550dec803f17f26ec71b62783c5737bfc02" + integrity sha512-v4/yLsuPf8GSFuTy9fA1ABpL5uuy04vwW7qs+cfxSe1UU/M/KK95rF3N3GRseismoK9tA28SvpwVsAg/GWoF3A== + dependencies: + "@types/react" "*" + "@types/react-dom@^16.0.11": version "16.8.2" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.8.2.tgz#9bd7d33f908b243ff0692846ef36c81d4941ad12" dependencies: "@types/react" "*" +"@types/react-icon-base@*": + version "2.1.3" + resolved "https://unpm.uberinternal.com/@types%2freact-icon-base/-/react-icon-base-2.1.3.tgz#0faf840b854a9dbc3fa6fe1935c7c40eb4153114" + integrity sha512-OtZn25vQn7A9sJIDE33iUMDTnK83mnzs9bxDUhZ7timyBPXbxMBOHx/L9rf2rOU3B1xavOjag4RWqX4wzZNriQ== + dependencies: + "@types/react" "*" + +"@types/react-icons@2.2.7": + version "2.2.7" + resolved "https://unpm.uberinternal.com/@types%2freact-icons/-/react-icons-2.2.7.tgz#ed0a767293ba827f26552504714eebbd80403fc1" + integrity sha512-qxc8xtwgDG5Ub/WILU9tZa7zxz2UZqOU4yXbBa+Xg+0LbP031NB9gvf1d/ALvHLGCsCf3WEVttNoW/wc30jn1w== + dependencies: + "@types/react" "*" + "@types/react-icon-base" "*" + +"@types/react-redux@^7.0.3": + version "7.0.3" + resolved "https://unpm.uberinternal.com/@types%2freact-redux/-/react-redux-7.0.3.tgz#b8dc3faa954b7f28e4b0209bcf9209b45251ed6b" + integrity sha512-6qsIHHNwF41viooUgR2lXHL81v3uyeJsugq9YCMYE4g2bDyG710G/I/w5nbn7AQ9XfuOLUwrWfm3edV7gDJ9AQ== + dependencies: + "@types/hoist-non-react-statics" "*" + "@types/react" "*" + redux "^4.0.0" + "@types/react-router-dom@^4.3.1": version "4.3.1" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-4.3.1.tgz#71fe2918f8f60474a891520def40a63997dafe04" + resolved "https://unpm.uberinternal.com/@types%2freact-router-dom/-/react-router-dom-4.3.1.tgz#71fe2918f8f60474a891520def40a63997dafe04" + integrity sha512-GbztJAScOmQ/7RsQfO4cd55RuH1W4g6V1gDW3j4riLlt+8yxYLqqsiMzmyuXBLzdFmDtX/uU2Bpcm0cmudv44A== dependencies: "@types/history" "*" "@types/react" "*" @@ -1647,6 +1697,30 @@ "@types/history" "*" "@types/react" "*" +"@types/react-select@^1": + version "1.3.4" + resolved "https://unpm.uberinternal.com/@types%2freact-select/-/react-select-1.3.4.tgz#e3cd29b0e4b8a782ddfe76e5500f08d3476370ce" + integrity sha512-0BwjswNzKBszG5O4xq72W54NrrbmOZvJfaM/Dwru3F6DhvFO9nihMP1IRzXSOJ1qGRCS3VCu9FnBYJ+25lSldw== + dependencies: + "@types/react" "*" + +"@types/react-virtualized-select@^3.0.7": + version "3.0.7" + resolved "https://unpm.uberinternal.com/@types%2freact-virtualized-select/-/react-virtualized-select-3.0.7.tgz#068c97c5ff1cd46b292b29a34cb06f2efa0e94d4" + integrity sha512-NumODs66O012oAaq0ebD0m3RAb5ztGLXwgul5knod85JH6UQ9qunhO3XDJew7Am3814e1K/tX5ySSeXDzNa/RQ== + dependencies: + "@types/react" "*" + "@types/react-select" "^1" + "@types/react-virtualized" "*" + +"@types/react-virtualized@*": + version "9.18.12" + resolved "https://unpm.uberinternal.com/@types%2freact-virtualized/-/react-virtualized-9.18.12.tgz#541e65c5e0b4629d6a1c6f339171c7943e016ecb" + integrity sha512-Msdpt9zvYlb5Ul4PA339QUkJ0/z2O+gaFxed1rG+2rZjbe6XdYo7jWfJe206KBnjj84DwPPIbPFQCtoGuNwNTQ== + dependencies: + "@types/prop-types" "*" + "@types/react" "*" + "@types/react@*", "@types/react@^16.7.20": version "16.8.7" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.8.7.tgz#7b1c0223dd5494f9b4501ad2a69aa6acb350a29b" @@ -10543,11 +10617,13 @@ react-helmet@^5.1.3: react-icon-base@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/react-icon-base/-/react-icon-base-2.1.0.tgz#a196e33fdf1e7aaa1fda3aefbb68bdad9e82a79d" + resolved "https://unpm.uberinternal.com/react-icon-base/-/react-icon-base-2.1.0.tgz#a196e33fdf1e7aaa1fda3aefbb68bdad9e82a79d" + integrity sha1-oZbjP98eeqof2jrvu2i9rZ6Cp50= react-icons@2.2.7: version "2.2.7" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-2.2.7.tgz#d7860826b258557510dac10680abea5ca23cf650" + resolved "https://unpm.uberinternal.com/react-icons/-/react-icons-2.2.7.tgz#d7860826b258557510dac10680abea5ca23cf650" + integrity sha512-0n4lcGqzJFcIQLoQytLdJCE0DKSA9dkwEZRYoGrIDJZFvIT6Hbajx5mv9geqhqFiNjUgtxg8kPyDfjlhymbGFg== dependencies: react-icon-base "2.1.0" @@ -11014,6 +11090,14 @@ redux@^3.0.2, redux@^3.7.2: loose-envify "^1.1.0" symbol-observable "^1.0.3" +redux@^4.0.0: + version "4.0.1" + resolved "https://unpm.uberinternal.com/redux/-/redux-4.0.1.tgz#436cae6cc40fbe4727689d7c8fae44808f1bfef5" + integrity sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg== + dependencies: + loose-envify "^1.4.0" + symbol-observable "^1.2.0" + regenerate-unicode-properties@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz#7b38faa296252376d363558cfbda90c9ce709662" @@ -12144,7 +12228,7 @@ svgo@^1.0.0, svgo@^1.0.5: unquote "~1.1.1" util.promisify "~1.0.0" -symbol-observable@^1.0.3, symbol-observable@^1.0.4: +symbol-observable@^1.0.3, symbol-observable@^1.0.4, symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"