diff options
author | Stas Vilchik <stas.vilchik@sonarsource.com> | 2018-07-10 14:41:16 +0200 |
---|---|---|
committer | SonarTech <sonartech@sonarsource.com> | 2018-07-10 20:21:20 +0200 |
commit | f09ee6b610528aa37b7b51be395c93524cebae8f (patch) | |
tree | c1ec210eb18ce9ae6a86b5c68f10ceef9dfcab50 /server/sonar-web | |
parent | 4e9feaddc45af56194e90e941d591bc465add571 (diff) | |
download | sonarqube-f09ee6b610528aa37b7b51be395c93524cebae8f.tar.gz sonarqube-f09ee6b610528aa37b7b51be395c93524cebae8f.zip |
load web app asynchronously (#493)
Diffstat (limited to 'server/sonar-web')
22 files changed, 434 insertions, 446 deletions
diff --git a/server/sonar-web/config/webpack.config.js b/server/sonar-web/config/webpack.config.js index 9030b4b41eb..c240dbd623c 100644 --- a/server/sonar-web/config/webpack.config.js +++ b/server/sonar-web/config/webpack.config.js @@ -45,7 +45,7 @@ module.exports = ({ production = true }) => ({ require.resolve('./polyfills'), !production && require.resolve('react-error-overlay'), './src/main/js/app/utils/setPublicPath.js', - './src/main/js/app/index.js' + './src/main/js/app/index.ts' ].filter(Boolean), output: { path: paths.appBuild, @@ -150,11 +150,5 @@ module.exports = ({ production = true }) => ({ optimization: { splitChunks: { chunks: 'all' } }, - performance: production - ? { - hints: 'error', - maxEntrypointSize: 600000, // recommended: 250kb - maxAssetSize: 320000 // recommended: 250kb - } - : undefined + performance: production ? { hints: 'error' } : undefined }); diff --git a/server/sonar-web/package.json b/server/sonar-web/package.json index 0d67511cec5..9d91aa58460 100644 --- a/server/sonar-web/package.json +++ b/server/sonar-web/package.json @@ -115,7 +115,7 @@ "ts-loader": "4.3.0", "typescript": "2.8.3", "typescript-eslint-parser": "15.0.0", - "webpack": "4.8.1", + "webpack": "4.15.1", "webpack-bundle-analyzer": "2.11.2", "webpack-dev-server": "3.1.4" }, diff --git a/server/sonar-web/src/main/js/api/nav.ts b/server/sonar-web/src/main/js/api/nav.ts index 1313c73972e..e5af1bb7e91 100644 --- a/server/sonar-web/src/main/js/api/nav.ts +++ b/server/sonar-web/src/main/js/api/nav.ts @@ -17,11 +17,11 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -import { getJSON, parseJSON, request } from '../helpers/request'; -import { BranchParameters } from '../app/types'; +import { getJSON } from '../helpers/request'; +import { AppState, BranchParameters } from '../app/types'; import throwGlobalError from '../app/utils/throwGlobalError'; -export function getGlobalNavigation(): Promise<any> { +export function getGlobalNavigation(): Promise<AppState> { return getJSON('/api/navigation/global'); } @@ -38,18 +38,3 @@ export function getMarketplaceNavigation(): Promise<{ serverId: string; ncloc: n export function getSettingsNavigation(): Promise<any> { return getJSON('/api/navigation/settings').catch(throwGlobalError); } - -export function tryGetGlobalNavigation(): Promise<any> { - return request('/api/navigation/global') - .submit() - .then(response => { - if (response.status >= 200 && response.status < 300) { - return parseJSON(response); - } else if (response.status === 401) { - return {}; - } else { - return Promise.reject(response); - } - }) - .catch(response => throwGlobalError({ response }).catch(() => Promise.resolve({}))); -} diff --git a/server/sonar-web/src/main/js/app/components/App.tsx b/server/sonar-web/src/main/js/app/components/App.tsx index 91c65cc4e6c..dca11f0b8eb 100644 --- a/server/sonar-web/src/main/js/app/components/App.tsx +++ b/server/sonar-web/src/main/js/app/components/App.tsx @@ -21,32 +21,32 @@ import * as React from 'react'; import * as PropTypes from 'prop-types'; import { connect } from 'react-redux'; import Helmet from 'react-helmet'; -import GlobalLoading from './GlobalLoading'; -import { CurrentUser } from '../types'; -import { fetchCurrentUser } from '../../store/users/actions'; -import { fetchLanguages, fetchAppState } from '../../store/rootActions'; +import { AppState, CurrentUser } from '../types'; +import { fetchLanguages } from '../../store/rootActions'; import { fetchMyOrganizations } from '../../apps/account/organizations/actions'; import { getInstance, isSonarCloud } from '../../helpers/system'; import { lazyLoad } from '../../components/lazyLoad'; +import { getCurrentUser, getAppState } from '../../store/rootReducer'; const PageTracker = lazyLoad(() => import('./PageTracker')); -interface Props { - children: JSX.Element; - fetchAppState: () => Promise<any>; - fetchCurrentUser: () => Promise<CurrentUser>; +interface StateProps { + appState: AppState | undefined; + currentUser: CurrentUser | undefined; +} + +interface DispatchProps { fetchLanguages: () => Promise<void>; fetchMyOrganizations: () => Promise<void>; } -interface State { - branchesEnabled: boolean; - canAdmin: boolean; - loading: boolean; - organizationsEnabled: boolean; +interface OwnProps { + children: JSX.Element; } -class App extends React.PureComponent<Props, State> { +type Props = StateProps & DispatchProps & OwnProps; + +class App extends React.PureComponent<Props> { mounted = false; static childContextTypes = { @@ -55,66 +55,31 @@ class App extends React.PureComponent<Props, State> { organizationsEnabled: PropTypes.bool }; - constructor(props: Props) { - super(props); - this.state = { - branchesEnabled: false, - canAdmin: false, - loading: true, - organizationsEnabled: false - }; - } - getChildContext() { + const { appState } = this.props; return { - branchesEnabled: this.state.branchesEnabled, - canAdmin: this.state.canAdmin, - organizationsEnabled: this.state.organizationsEnabled + branchesEnabled: (appState && appState.branchesEnabled) || false, + canAdmin: (appState && appState.canAdmin) || false, + organizationsEnabled: (appState && appState.organizationsEnabled) || false }; } componentDidMount() { this.mounted = true; - - this.props.fetchCurrentUser().then( - currentUser => { - Promise.all([this.fetchAppState(), this.props.fetchLanguages()]).then( - ([appState]) => { - if (this.mounted) { - if (appState.organizationsEnabled && currentUser.isLoggedIn) { - this.props.fetchMyOrganizations(); - } - this.setState({ loading: false }); - } - }, - () => {} - ); - }, - () => {} - ); + this.props.fetchLanguages(); + const { appState, currentUser } = this.props; + if (appState && currentUser) { + if (appState.organizationsEnabled && currentUser.isLoggedIn) { + this.props.fetchMyOrganizations(); + } + } } componentWillUnmount() { this.mounted = false; } - fetchAppState = () => { - return this.props.fetchAppState().then(appState => { - if (this.mounted) { - this.setState({ - branchesEnabled: appState.branchesEnabled, - canAdmin: appState.canAdmin, - organizationsEnabled: appState.organizationsEnabled - }); - } - return appState; - }); - }; - render() { - if (this.state.loading) { - return <GlobalLoading />; - } return ( <> <Helmet defaultTitle={getInstance()} /> @@ -125,9 +90,14 @@ class App extends React.PureComponent<Props, State> { } } -export default connect(null, { - fetchAppState, - fetchCurrentUser, +const mapStateToProps = (state: any): StateProps => ({ + appState: getAppState(state), + currentUser: getCurrentUser(state) +}); + +const mapDispatchToProps = ({ fetchLanguages, fetchMyOrganizations -})(App as any); +} as any) as DispatchProps; + +export default connect(mapStateToProps, mapDispatchToProps)(App); diff --git a/server/sonar-web/src/main/js/app/components/GlobalLoading.tsx b/server/sonar-web/src/main/js/app/components/GlobalLoading.tsx deleted file mode 100644 index 8ae81282526..00000000000 --- a/server/sonar-web/src/main/js/app/components/GlobalLoading.tsx +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2018 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -import * as React from 'react'; - -export default function GlobalLoading() { - return ( - <> - <div className="global-loading"> - <i className="spinner global-loading-spinner" /> - <span className="global-loading-text">Loading...</span> - </div> - </> - ); -} diff --git a/server/sonar-web/src/main/js/app/components/LocalizationContainer.tsx b/server/sonar-web/src/main/js/app/components/LocalizationContainer.tsx deleted file mode 100644 index 22c457bf7ea..00000000000 --- a/server/sonar-web/src/main/js/app/components/LocalizationContainer.tsx +++ /dev/null @@ -1,86 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2018 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -import * as React from 'react'; -import { addLocaleData, IntlProvider, Locale } from 'react-intl'; -import GlobalLoading from './GlobalLoading'; -import { DEFAULT_LANGUAGE, requestMessages } from '../../helpers/l10n'; - -interface Props { - children?: any; -} - -interface State { - loading: boolean; - lang?: string; -} - -export default class LocalizationContainer extends React.PureComponent<Props, State> { - mounted = false; - - state: State = { loading: true }; - - componentDidMount() { - this.mounted = true; - requestMessages().then(this.bundleLoaded, this.bundleLoaded); - } - - componentWillUnmount() { - this.mounted = false; - } - - bundleLoaded = (lang: string) => { - const langToLoad = lang || DEFAULT_LANGUAGE; - // No need to load english (default) bundle, it's coming with react-intl - if (langToLoad !== DEFAULT_LANGUAGE) { - import('react-intl/locale-data/' + langToLoad).then( - intlBundle => this.updateLang(langToLoad, intlBundle), - this.setDefaultLang - ); - } else { - this.setDefaultLang(); - } - }; - - setDefaultLang = () => { - if (this.mounted) { - this.setState({ loading: false, lang: DEFAULT_LANGUAGE }); - } - }; - - updateLang = (lang: string, intlBundle: Locale[]) => { - if (this.mounted) { - addLocaleData(intlBundle); - this.setState({ loading: false, lang }); - } - }; - - render() { - if (this.state.loading) { - return <GlobalLoading />; - } - return ( - <IntlProvider - defaultLocale={this.state.lang || DEFAULT_LANGUAGE} - locale={this.state.lang || DEFAULT_LANGUAGE}> - {this.props.children} - </IntlProvider> - ); - } -} diff --git a/server/sonar-web/src/main/js/app/index.js b/server/sonar-web/src/main/js/app/index.js deleted file mode 100644 index 6fe8aa8dc40..00000000000 --- a/server/sonar-web/src/main/js/app/index.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2018 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -import startReactApp from './utils/startReactApp'; -import installExtensionsHandler from './utils/installExtensionsHandler'; -import { installGlobal } from '../helpers/l10n'; -// styles -import './styles/sonar.css'; - -installGlobal(); -startReactApp(); -installExtensionsHandler(); diff --git a/server/sonar-web/src/main/js/app/index.ts b/server/sonar-web/src/main/js/app/index.ts new file mode 100644 index 00000000000..f1bb44ebaba --- /dev/null +++ b/server/sonar-web/src/main/js/app/index.ts @@ -0,0 +1,132 @@ +/* + * SonarQube + * Copyright (C) 2009-2018 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +import installExtensionsHandler from './utils/installExtensionsHandler'; +import { installGlobal, DEFAULT_LANGUAGE, requestMessages } from '../helpers/l10n'; +import { request, parseJSON } from '../helpers/request'; +import { getSystemStatus } from '../helpers/system'; +import './styles/sonar.css'; + +installGlobal(); + +if (isMainApp()) { + installExtensionsHandler(); + + Promise.all([loadMessages(), loadUser(), loadAppState(), loadApp()]).then( + ([lang, user, appState, startReactApp]) => { + startReactApp(lang, user, appState); + }, + error => { + if (isResponse(error) && error.status === 401) { + redirectToLogin(); + } else { + logError(error); + } + } + ); +} else { + // login, maintenance or setup pages + Promise.all([loadMessages(), loadApp()]).then( + ([lang, startReactApp]) => { + startReactApp(lang, undefined, undefined); + }, + error => { + logError(error); + } + ); +} + +function loadMessages() { + return requestMessages().then(setLanguage, setLanguage); +} + +function loadLocaleData(langToLoad: string) { + return Promise.all([import('react-intl/locale-data/' + langToLoad), import('react-intl')]).then( + ([intlBundle, intl]) => { + intl.addLocaleData(intlBundle); + } + ); +} + +function setLanguage(lang: string) { + const langToLoad = lang || DEFAULT_LANGUAGE; + // No need to load english (default) bundle, it's coming with react-intl + if (langToLoad !== DEFAULT_LANGUAGE) { + return loadLocaleData(langToLoad).then(() => langToLoad, () => DEFAULT_LANGUAGE); + } else { + return DEFAULT_LANGUAGE; + } +} + +function loadUser() { + return request('/api/users/current') + .submit() + .then(checkStatus) + .then(parseJSON); +} + +function loadAppState() { + return request('/api/navigation/global') + .submit() + .then(checkStatus) + .then(parseJSON); +} + +function loadApp() { + return import(/* webpackChunkName: 'app' */ './utils/startReactApp').then(i => i.default); +} + +function checkStatus(response: Response) { + return new Promise((resolve, reject) => { + if (response.status >= 200 && response.status < 300) { + resolve(response); + } else { + reject(response); + } + }); +} + +function isResponse(error: any): error is Response { + return typeof error.status === 'number'; +} + +function redirectToLogin() { + const returnTo = window.location.pathname + window.location.search + window.location.hash; + window.location.href = `${getBaseUrl()}/sessions/new?return_to=${encodeURIComponent(returnTo)}`; +} + +function logError(error: any) { + // eslint-disable-next-line no-console + console.error('Application failed to start!', error); +} + +function isMainApp() { + const { pathname } = window.location; + return ( + getSystemStatus() === 'UP' && + !pathname.startsWith(`${getBaseUrl()}/sessions`) && + !pathname.startsWith(`${getBaseUrl()}/maintenance`) && + !pathname.startsWith(`${getBaseUrl()}/setup`) && + !pathname.startsWith(`${getBaseUrl()}/markdown/help`) + ); +} + +function getBaseUrl(): string { + return (window as any).baseUrl; +} diff --git a/server/sonar-web/src/main/js/app/types.ts b/server/sonar-web/src/main/js/app/types.ts index 03ddcc4e356..97168176c94 100644 --- a/server/sonar-web/src/main/js/app/types.ts +++ b/server/sonar-web/src/main/js/app/types.ts @@ -25,6 +25,7 @@ export interface AppState { adminPages?: Extension[]; authenticationError?: boolean; authorizationError?: boolean; + branchesEnabled?: boolean; canAdmin?: boolean; globalPages?: Extension[]; organizationsEnabled?: boolean; diff --git a/server/sonar-web/src/main/js/app/utils/getStore.js b/server/sonar-web/src/main/js/app/utils/getStore.ts index 00cc9a013c6..477fc5a57b4 100644 --- a/server/sonar-web/src/main/js/app/utils/getStore.js +++ b/server/sonar-web/src/main/js/app/utils/getStore.ts @@ -17,15 +17,25 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -// @flow -import configureStore from '../../store/utils/configureStore'; +import { Store } from 'redux'; +import { AppState, CurrentUser } from '../types'; +import { setAppState } from '../../store/appState/duck'; import rootReducer from '../../store/rootReducer'; +import { receiveCurrentUser } from '../../store/users/actions'; +import configureStore from '../../store/utils/configureStore'; -let store; +let store: Store<any>; -const createStore = () => { +const createStore = (currentUser?: CurrentUser, appState?: AppState) => { store = configureStore(rootReducer); + if (currentUser) { + store.dispatch(receiveCurrentUser(currentUser)); + } + if (appState) { + store.dispatch(setAppState(appState)); + } return store; }; -export default () => (store ? store : createStore()); +export default (currentUser?: CurrentUser, appState?: AppState) => + store ? store : createStore(currentUser, appState); diff --git a/server/sonar-web/src/main/js/app/utils/installExtensionsHandler.js b/server/sonar-web/src/main/js/app/utils/installExtensionsHandler.ts index d9800fbe554..9ddc6d1d3e2 100644 --- a/server/sonar-web/src/main/js/app/utils/installExtensionsHandler.js +++ b/server/sonar-web/src/main/js/app/utils/installExtensionsHandler.ts @@ -17,17 +17,16 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -// @flow -const extensions = {}; +const extensions: { [key: string]: Function } = {}; -const registerExtension = (key /*: string */, start /*: Function */) => { +const registerExtension = (key: string, start: Function) => { extensions[key] = start; }; export default () => { - window.registerExtension = registerExtension; + (window as any).registerExtension = registerExtension; }; -export const getExtensionFromCache = (key /*: string */) => { +export const getExtensionFromCache = (key: string) => { return extensions[key]; }; diff --git a/server/sonar-web/src/main/js/app/utils/startReactApp.js b/server/sonar-web/src/main/js/app/utils/startReactApp.js index e092a6c13eb..97e9845a344 100644 --- a/server/sonar-web/src/main/js/app/utils/startReactApp.js +++ b/server/sonar-web/src/main/js/app/utils/startReactApp.js @@ -22,9 +22,9 @@ import React from 'react'; import { render } from 'react-dom'; import { Router, Route, IndexRoute, Redirect } from 'react-router'; import { Provider } from 'react-redux'; +import { IntlProvider } from 'react-intl'; import getStore from './getStore'; import getHistory from './getHistory'; -import LocalizationContainer from '../components/LocalizationContainer'; import MigrationContainer from '../components/MigrationContainer'; import App from '../components/App'; import GlobalContainer from '../components/GlobalContainer'; @@ -75,72 +75,72 @@ function handleUpdate() { } } -const startReactApp = () => { +const startReactApp = (lang, currentUser, appState) => { const el = document.getElementById('content'); const history = getHistory(); - const store = getStore(); + const store = getStore(currentUser, appState); render( <Provider store={store}> - <Router history={history} onUpdate={handleUpdate}> - <Route - path="/account/issues" - onEnter={(_, replace) => { - replace({ pathname: '/issues', query: { myIssues: 'true', resolved: 'false' } }); - }} - /> + <IntlProvider defaultLocale={lang} locale={lang}> + <Router history={history} onUpdate={handleUpdate}> + <Route + path="/account/issues" + onEnter={(_, replace) => { + replace({ pathname: '/issues', query: { myIssues: 'true', resolved: 'false' } }); + }} + /> - <Route - path="/codingrules" - onEnter={(nextState, replace) => { - replace('/coding_rules' + window.location.hash); - }} - /> + <Route + path="/codingrules" + onEnter={(nextState, replace) => { + replace('/coding_rules' + window.location.hash); + }} + /> - <Route - path="/dashboard/index/:key" - onEnter={(nextState, replace) => { - replace({ pathname: '/dashboard', query: { id: nextState.params.key } }); - }} - /> + <Route + path="/dashboard/index/:key" + onEnter={(nextState, replace) => { + replace({ pathname: '/dashboard', query: { id: nextState.params.key } }); + }} + /> - <Route - path="/issues/search" - onEnter={(nextState, replace) => { - replace('/issues' + window.location.hash); - }} - /> + <Route + path="/issues/search" + onEnter={(nextState, replace) => { + replace('/issues' + window.location.hash); + }} + /> - <Redirect from="/admin" to="/admin/settings" /> - <Redirect from="/background_tasks" to="/admin/background_tasks" /> - <Redirect from="/component/index" to="/component" /> - <Redirect from="/component_issues" to="/project/issues" /> - <Redirect from="/dashboard/index" to="/dashboard" /> - <Redirect from="/governance" to="/portfolio" /> - <Redirect from="/groups" to="/admin/groups" /> - <Redirect from="/extension/governance/portfolios" to="/portfolios" /> - <Redirect from="/metrics" to="/admin/custom_metrics" /> - <Redirect from="/permission_templates" to="/admin/permission_templates" /> - <Redirect from="/profiles/index" to="/profiles" /> - <Redirect from="/projects_admin" to="/admin/projects_management" /> - <Redirect from="/quality_gates/index" to="/quality_gates" /> - <Redirect from="/roles/global" to="/admin/permissions" /> - <Redirect from="/settings" to="/admin/settings" /> - <Redirect from="/settings/encryption" to="/admin/settings/encryption" /> - <Redirect from="/settings/index" to="/admin/settings" /> - <Redirect from="/sessions/login" to="/sessions/new" /> - <Redirect from="/system" to="/admin/system" /> - <Redirect from="/system/index" to="/admin/system" /> - <Redirect from="/view" to="/portfolio" /> - <Redirect from="/users" to="/admin/users" /> + <Redirect from="/admin" to="/admin/settings" /> + <Redirect from="/background_tasks" to="/admin/background_tasks" /> + <Redirect from="/component/index" to="/component" /> + <Redirect from="/component_issues" to="/project/issues" /> + <Redirect from="/dashboard/index" to="/dashboard" /> + <Redirect from="/governance" to="/portfolio" /> + <Redirect from="/groups" to="/admin/groups" /> + <Redirect from="/extension/governance/portfolios" to="/portfolios" /> + <Redirect from="/metrics" to="/admin/custom_metrics" /> + <Redirect from="/permission_templates" to="/admin/permission_templates" /> + <Redirect from="/profiles/index" to="/profiles" /> + <Redirect from="/projects_admin" to="/admin/projects_management" /> + <Redirect from="/quality_gates/index" to="/quality_gates" /> + <Redirect from="/roles/global" to="/admin/permissions" /> + <Redirect from="/settings" to="/admin/settings" /> + <Redirect from="/settings/encryption" to="/admin/settings/encryption" /> + <Redirect from="/settings/index" to="/admin/settings" /> + <Redirect from="/sessions/login" to="/sessions/new" /> + <Redirect from="/system" to="/admin/system" /> + <Redirect from="/system/index" to="/admin/system" /> + <Redirect from="/view" to="/portfolio" /> + <Redirect from="/users" to="/admin/users" /> - <Route - path="markdown/help" - component={lazyLoad(() => import('../components/MarkdownHelp'))} - /> + <Route + path="markdown/help" + component={lazyLoad(() => import('../components/MarkdownHelp'))} + /> - <Route component={LocalizationContainer}> <Route component={lazyLoad(() => import('../components/SimpleContainer'))}> <Route path="maintenance">{maintenanceRoutes}</Route> <Route path="setup">{setupRoutes}</Route> @@ -263,8 +263,8 @@ const startReactApp = () => { <Route path="*" component={lazyLoad(() => import('../components/NotFound'))} /> </Route> </Route> - </Route> - </Router> + </Router> + </IntlProvider> </Provider>, el ); diff --git a/server/sonar-web/src/main/js/apps/component/components/__tests__/__snapshots__/App-test.tsx.snap b/server/sonar-web/src/main/js/apps/component/components/__tests__/__snapshots__/App-test.tsx.snap index f5dd7e1a6ce..c513d6b7a6d 100644 --- a/server/sonar-web/src/main/js/apps/component/components/__tests__/__snapshots__/App-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/component/components/__tests__/__snapshots__/App-test.tsx.snap @@ -4,7 +4,7 @@ exports[`renders 1`] = ` <div className="page page-limited" > - <Connect(SourceViewerBase) + <Connect(LazyLoader) aroundLine={7} branchLike={ Object { diff --git a/server/sonar-web/src/main/js/apps/sessions/components/LoginForm.tsx b/server/sonar-web/src/main/js/apps/sessions/components/LoginForm.tsx index ab0cecf826e..6d322c62ac4 100644 --- a/server/sonar-web/src/main/js/apps/sessions/components/LoginForm.tsx +++ b/server/sonar-web/src/main/js/apps/sessions/components/LoginForm.tsx @@ -18,11 +18,11 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import * as React from 'react'; -import { Link } from 'react-router'; import DeferredSpinner from '../../../components/common/DeferredSpinner'; import GlobalMessagesContainer from '../../../app/components/GlobalMessagesContainer'; import { SubmitButton } from '../../../components/ui/buttons'; import { translate } from '../../../helpers/l10n'; +import { getBaseUrl } from '../../../helpers/urls'; import './LoginForm.css'; interface Props { @@ -129,9 +129,9 @@ export default class LoginForm extends React.PureComponent<Props, State> { <SubmitButton disabled={this.state.loading}> {translate('sessions.log_in')} </SubmitButton> - <Link className="spacer-left" to="/"> + <a className="spacer-left" href={`${getBaseUrl()}/`}> {translate('cancel')} - </Link> + </a> </div> </div> </form> diff --git a/server/sonar-web/src/main/js/apps/sessions/components/__tests__/__snapshots__/LoginForm-test.tsx.snap b/server/sonar-web/src/main/js/apps/sessions/components/__tests__/__snapshots__/LoginForm-test.tsx.snap index aa19aded41e..4790486f71e 100644 --- a/server/sonar-web/src/main/js/apps/sessions/components/__tests__/__snapshots__/LoginForm-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/sessions/components/__tests__/__snapshots__/LoginForm-test.tsx.snap @@ -76,14 +76,12 @@ exports[`expands more options 2`] = ` > sessions.log_in </SubmitButton> - <Link + <a className="spacer-left" - onlyActiveOnIndex={false} - style={Object {}} - to="/" + href="/" > cancel - </Link> + </a> </div> </div> </form> @@ -151,14 +149,12 @@ exports[`logs in with simple credentials 1`] = ` > sessions.log_in </SubmitButton> - <Link + <a className="spacer-left" - onlyActiveOnIndex={false} - style={Object {}} - to="/" + href="/" > cancel - </Link> + </a> </div> </div> </form> @@ -226,14 +222,12 @@ exports[`should display a spinner and disabled button while loading 1`] = ` > sessions.log_in </SubmitButton> - <Link + <a className="spacer-left" - onlyActiveOnIndex={false} - style={Object {}} - to="/" + href="/" > cancel - </Link> + </a> </div> </div> </form> diff --git a/server/sonar-web/src/main/js/components/SourceViewer/SourceViewer.tsx b/server/sonar-web/src/main/js/components/SourceViewer/SourceViewer.tsx index 3b40ed80dae..2e0a1c2daf8 100644 --- a/server/sonar-web/src/main/js/components/SourceViewer/SourceViewer.tsx +++ b/server/sonar-web/src/main/js/components/SourceViewer/SourceViewer.tsx @@ -18,8 +18,9 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import { Dispatch } from 'redux'; -import { connect } from 'react-redux'; -import SourceViewerBase from './SourceViewerBase'; +import { connect, Omit } from 'react-redux'; +import { Props } from './SourceViewerBase'; +import { lazyLoad } from '../lazyLoad'; import { SourceViewerFile } from '../../app/types'; import { receiveFavorites } from '../../store/favorites/duck'; @@ -44,4 +45,8 @@ const onReceiveComponent = (component: SourceViewerFile) => (dispatch: Dispatch< const mapDispatchToProps: DispatchProps = { onReceiveComponent }; -export default connect(mapStateToProps, mapDispatchToProps)(SourceViewerBase); +type OwnProps = Omit<Props, keyof DispatchProps>; + +export default connect<null, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)( + lazyLoad(() => import(/* webpackPrefetch: true */ './SourceViewerBase')) +); diff --git a/server/sonar-web/src/main/js/components/SourceViewer/SourceViewerBase.tsx b/server/sonar-web/src/main/js/components/SourceViewer/SourceViewerBase.tsx index c0e9326f5e8..826cd8781a8 100644 --- a/server/sonar-web/src/main/js/components/SourceViewer/SourceViewerBase.tsx +++ b/server/sonar-web/src/main/js/components/SourceViewer/SourceViewerBase.tsx @@ -54,7 +54,7 @@ import './styles.css'; // TODO react-virtualized -interface Props { +export interface Props { aroundLine?: number; branchLike: BranchLike | undefined; component: string; diff --git a/server/sonar-web/src/main/js/components/workspace/__tests__/__snapshots__/WorkspaceComponentViewer-test.tsx.snap b/server/sonar-web/src/main/js/components/workspace/__tests__/__snapshots__/WorkspaceComponentViewer-test.tsx.snap index 221000a98f5..7453ffec082 100644 --- a/server/sonar-web/src/main/js/components/workspace/__tests__/__snapshots__/WorkspaceComponentViewer-test.tsx.snap +++ b/server/sonar-web/src/main/js/components/workspace/__tests__/__snapshots__/WorkspaceComponentViewer-test.tsx.snap @@ -28,7 +28,7 @@ exports[`should render 1`] = ` } } > - <Connect(SourceViewerBase) + <Connect(LazyLoader) component="foo" onLoaded={[Function]} /> diff --git a/server/sonar-web/src/main/js/helpers/request.ts b/server/sonar-web/src/main/js/helpers/request.ts index 682b86d22fe..1ae4d87dc5a 100644 --- a/server/sonar-web/src/main/js/helpers/request.ts +++ b/server/sonar-web/src/main/js/helpers/request.ts @@ -165,10 +165,9 @@ export function checkStatus(response: Response): Promise<Response> { return new Promise((resolve, reject) => { if (checkApplicationVersion(response)) { if (response.status === 401) { - // workaround cyclic dependencies - const requireAuthentication = require('../app/utils/handleRequiredAuthentication').default; - requireAuthentication(); - reject(); + import('../app/utils/handleRequiredAuthentication') + .then(i => i.default()) + .then(reject, reject); } else if (response.status >= 200 && response.status < 300) { resolve(response); } else { diff --git a/server/sonar-web/src/main/js/helpers/storage.ts b/server/sonar-web/src/main/js/helpers/storage.ts index d4cb6082856..af72c31ba82 100644 --- a/server/sonar-web/src/main/js/helpers/storage.ts +++ b/server/sonar-web/src/main/js/helpers/storage.ts @@ -17,7 +17,6 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - export function save(key: string, value?: string, suffix?: string): void { try { const finalKey = suffix ? `${key}.${suffix}` : key; diff --git a/server/sonar-web/src/main/js/store/utils/configureStore.js b/server/sonar-web/src/main/js/store/utils/configureStore.js index 48da487316e..a41ada6d570 100644 --- a/server/sonar-web/src/main/js/store/utils/configureStore.js +++ b/server/sonar-web/src/main/js/store/utils/configureStore.js @@ -35,6 +35,3 @@ const finalCreateStore = compose(applyMiddleware(...middlewares), ...composed)(c export default function configureStore(rootReducer, initialState) { return finalCreateStore(rootReducer, initialState); } - -export const configureTestStore = (rootReducer, initialState) => - createStore(rootReducer, initialState); diff --git a/server/sonar-web/yarn.lock b/server/sonar-web/yarn.lock index 33dd4edc00b..eba63961f78 100644 --- a/server/sonar-web/yarn.lock +++ b/server/sonar-web/yarn.lock @@ -182,115 +182,140 @@ version "16.0.29" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.29.tgz#4eea6a8de9f40ca71d580ae7a9f3b4b77b368de8" -"@webassemblyjs/ast@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.3.1.tgz#3081b4b3ff0af733aa5ba573af998f33711293f8" +"@webassemblyjs/ast@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25" dependencies: - "@webassemblyjs/helper-wasm-bytecode" "1.3.1" - "@webassemblyjs/wast-parser" "1.3.1" - webassemblyjs "1.3.1" + "@webassemblyjs/helper-module-context" "1.5.13" + "@webassemblyjs/helper-wasm-bytecode" "1.5.13" + "@webassemblyjs/wast-parser" "1.5.13" + debug "^3.1.0" + mamacro "^0.0.3" -"@webassemblyjs/floating-point-hex-parser@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.3.1.tgz#82646903ba25c3e5d88dec41ecb4e4d770615bfc" +"@webassemblyjs/floating-point-hex-parser@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz#29ce0baa97411f70e8cce68ce9c0f9d819a4e298" -"@webassemblyjs/helper-buffer@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.3.1.tgz#aa66bb6c274a7e5610d7468f94a2702186713bc6" +"@webassemblyjs/helper-api-error@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz#e49b051d67ee19a56e29b9aa8bd949b5b4442a59" -"@webassemblyjs/helper-code-frame@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.3.1.tgz#b5eba87cf37992e8a62c402545aed87dfd02be83" +"@webassemblyjs/helper-buffer@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz#873bb0a1b46449231137c1262ddfd05695195a1e" dependencies: - "@webassemblyjs/wast-printer" "1.3.1" + debug "^3.1.0" -"@webassemblyjs/helper-fsm@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.3.1.tgz#297113d09a9541613eaeb265d7f948c5e03eb0a2" +"@webassemblyjs/helper-code-frame@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz#1bd2181b6a0be14e004f0fe9f5a660d265362b58" + dependencies: + "@webassemblyjs/wast-printer" "1.5.13" -"@webassemblyjs/helper-wasm-bytecode@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.3.1.tgz#53b0308988e3a0cad836c83fc0801255906608f8" +"@webassemblyjs/helper-fsm@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz#cdf3d9d33005d543a5c5e5adaabf679ffa8db924" -"@webassemblyjs/helper-wasm-section@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.3.1.tgz#3df13898e89a376ffb89439d216d9f0001bf9632" +"@webassemblyjs/helper-module-context@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz#dc29ddfb51ed657655286f94a5d72d8a489147c5" dependencies: - "@webassemblyjs/ast" "1.3.1" - "@webassemblyjs/helper-buffer" "1.3.1" - "@webassemblyjs/helper-wasm-bytecode" "1.3.1" - "@webassemblyjs/wasm-gen" "1.3.1" + debug "^3.1.0" + mamacro "^0.0.3" -"@webassemblyjs/leb128@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.3.1.tgz#e0cf1c585c72955637eeeabab1e2ab37c12c2338" - dependencies: - leb "^0.3.0" +"@webassemblyjs/helper-wasm-bytecode@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz#03245817f0a762382e61733146f5773def15a747" -"@webassemblyjs/validation@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/validation/-/validation-1.3.1.tgz#ed0129d7ccca7858a3f46e7e47a6889008547a39" +"@webassemblyjs/helper-wasm-section@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz#efc76f44a10d3073b584b43c38a179df173d5c7d" dependencies: - "@webassemblyjs/ast" "1.3.1" - -"@webassemblyjs/wasm-edit@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.3.1.tgz#a16ca4d9a12144b1b28d4e66ad1ad66ec65e479e" - dependencies: - "@webassemblyjs/ast" "1.3.1" - "@webassemblyjs/helper-buffer" "1.3.1" - "@webassemblyjs/helper-wasm-bytecode" "1.3.1" - "@webassemblyjs/helper-wasm-section" "1.3.1" - "@webassemblyjs/wasm-gen" "1.3.1" - "@webassemblyjs/wasm-opt" "1.3.1" - "@webassemblyjs/wasm-parser" "1.3.1" - "@webassemblyjs/wast-printer" "1.3.1" + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-buffer" "1.5.13" + "@webassemblyjs/helper-wasm-bytecode" "1.5.13" + "@webassemblyjs/wasm-gen" "1.5.13" debug "^3.1.0" -"@webassemblyjs/wasm-gen@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.3.1.tgz#43263fc56a0570e0564e407bbcd4c02e85167398" +"@webassemblyjs/ieee754@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz#573e97c8c12e4eebb316ca5fde0203ddd90b0364" dependencies: - "@webassemblyjs/ast" "1.3.1" - "@webassemblyjs/helper-wasm-bytecode" "1.3.1" - "@webassemblyjs/leb128" "1.3.1" + ieee754 "^1.1.11" -"@webassemblyjs/wasm-opt@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.3.1.tgz#172601dcdaaacd6b0b002df1252033198c65eceb" +"@webassemblyjs/leb128@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.5.13.tgz#ab52ebab9cec283c1c1897ac1da833a04a3f4cee" dependencies: - "@webassemblyjs/ast" "1.3.1" - "@webassemblyjs/helper-buffer" "1.3.1" - "@webassemblyjs/wasm-gen" "1.3.1" - "@webassemblyjs/wasm-parser" "1.3.1" + long "4.0.0" -"@webassemblyjs/wasm-parser@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.3.1.tgz#76727be6c313a9b775170ed38a126558eed7e8ef" +"@webassemblyjs/utf8@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.5.13.tgz#6b53d2cd861cf94fa99c1f12779dde692fbc2469" + +"@webassemblyjs/wasm-edit@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz#c9cef5664c245cf11b3b3a73110c9155831724a8" dependencies: - "@webassemblyjs/ast" "1.3.1" - "@webassemblyjs/helper-wasm-bytecode" "1.3.1" - "@webassemblyjs/leb128" "1.3.1" - "@webassemblyjs/wasm-parser" "1.3.1" - webassemblyjs "1.3.1" + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-buffer" "1.5.13" + "@webassemblyjs/helper-wasm-bytecode" "1.5.13" + "@webassemblyjs/helper-wasm-section" "1.5.13" + "@webassemblyjs/wasm-gen" "1.5.13" + "@webassemblyjs/wasm-opt" "1.5.13" + "@webassemblyjs/wasm-parser" "1.5.13" + "@webassemblyjs/wast-printer" "1.5.13" + debug "^3.1.0" -"@webassemblyjs/wast-parser@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.3.1.tgz#62b6eba09580477868dd394cee3e3f5c64e1f3f8" +"@webassemblyjs/wasm-gen@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz#8e6ea113c4b432fa66540189e79b16d7a140700e" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-wasm-bytecode" "1.5.13" + "@webassemblyjs/ieee754" "1.5.13" + "@webassemblyjs/leb128" "1.5.13" + "@webassemblyjs/utf8" "1.5.13" + +"@webassemblyjs/wasm-opt@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz#147aad7717a7ee4211c36b21a5f4c30dddf33138" dependencies: - "@webassemblyjs/ast" "1.3.1" - "@webassemblyjs/floating-point-hex-parser" "1.3.1" - "@webassemblyjs/helper-code-frame" "1.3.1" - "@webassemblyjs/helper-fsm" "1.3.1" + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-buffer" "1.5.13" + "@webassemblyjs/wasm-gen" "1.5.13" + "@webassemblyjs/wasm-parser" "1.5.13" + debug "^3.1.0" + +"@webassemblyjs/wasm-parser@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz#6f46516c5bb23904fbdf58009233c2dd8a54c72f" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-api-error" "1.5.13" + "@webassemblyjs/helper-wasm-bytecode" "1.5.13" + "@webassemblyjs/ieee754" "1.5.13" + "@webassemblyjs/leb128" "1.5.13" + "@webassemblyjs/utf8" "1.5.13" + +"@webassemblyjs/wast-parser@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz#5727a705d397ae6a3ae99d7f5460acf2ec646eea" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/floating-point-hex-parser" "1.5.13" + "@webassemblyjs/helper-api-error" "1.5.13" + "@webassemblyjs/helper-code-frame" "1.5.13" + "@webassemblyjs/helper-fsm" "1.5.13" long "^3.2.0" - webassemblyjs "1.3.1" + mamacro "^0.0.3" -"@webassemblyjs/wast-printer@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.3.1.tgz#3e75b889e6f1ba2dfa854e4436b4287e7687e82c" +"@webassemblyjs/wast-printer@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz#bb34d528c14b4f579e7ec11e793ec50ad7cd7c95" dependencies: - "@webassemblyjs/ast" "1.3.1" - "@webassemblyjs/wast-parser" "1.3.1" + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/wast-parser" "1.5.13" long "^3.2.0" abab@^1.0.3: @@ -334,6 +359,10 @@ acorn@^5.0.0, acorn@^5.1.2, acorn@^5.3.0, acorn@^5.5.0: version "5.5.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" +acorn@^5.6.2: + version "5.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" + address@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/address/-/address-1.0.2.tgz#480081e82b587ba319459fef512f516fe03d58af" @@ -1782,9 +1811,11 @@ chownr@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" -chrome-trace-event@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-0.1.2.tgz#90f36885d5345a50621332f0717b595883d5d982" +chrome-trace-event@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" + dependencies: + tslib "^1.9.0" ci-info@^1.0.0: version "1.1.1" @@ -2809,6 +2840,14 @@ enhanced-resolve@^4.0.0: memory-fs "^0.4.0" tapable "^1.0.0" +enhanced-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" @@ -4069,6 +4108,10 @@ icss-utils@^2.1.0: dependencies: postcss "^6.0.1" +ieee754@^1.1.11: + version "1.1.12" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + ieee754@^1.1.4: version "1.1.8" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" @@ -5107,6 +5150,10 @@ jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" @@ -5210,10 +5257,6 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" -leb@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/leb/-/leb-0.3.0.tgz#32bee9fad168328d6aea8522d833f4180eed1da3" - left-pad@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.2.0.tgz#d30a73c6b8201d8f7d8e7956ba9616087a68e0ee" @@ -5420,6 +5463,10 @@ loglevelnext@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-1.0.3.tgz#0f69277e73bbbf2cd61b94d82313216bf87ac66e" +long@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + long@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" @@ -5472,6 +5519,10 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -8359,6 +8410,10 @@ ts-loader@4.3.0: micromatch "^3.1.4" semver "^5.0.1" +tslib@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -8721,16 +8776,6 @@ wbuf@^1.1.0, wbuf@^1.7.2: dependencies: minimalistic-assert "^1.0.0" -webassemblyjs@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/webassemblyjs/-/webassemblyjs-1.3.1.tgz#2bb8ebc724d0fe09b9562ab20e32ce3f5bac5c74" - dependencies: - "@webassemblyjs/ast" "1.3.1" - "@webassemblyjs/validation" "1.3.1" - "@webassemblyjs/wasm-parser" "1.3.1" - "@webassemblyjs/wast-parser" "1.3.1" - long "^3.2.0" - webidl-conversions@^4.0.1, webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -8813,20 +8858,23 @@ webpack-sources@^1.0.1, webpack-sources@^1.1.0: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@4.8.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.8.1.tgz#59e38f99f2751c931dd09a035aba7bec4b5f916e" +webpack@4.15.1: + version "4.15.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.15.1.tgz#dc716779a3b88827c369f18c71a6137fa7e582fd" dependencies: - "@webassemblyjs/ast" "1.3.1" - "@webassemblyjs/wasm-edit" "1.3.1" - "@webassemblyjs/wasm-parser" "1.3.1" - acorn "^5.0.0" + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-module-context" "1.5.13" + "@webassemblyjs/wasm-edit" "1.5.13" + "@webassemblyjs/wasm-opt" "1.5.13" + "@webassemblyjs/wasm-parser" "1.5.13" + acorn "^5.6.2" acorn-dynamic-import "^3.0.0" ajv "^6.1.0" ajv-keywords "^3.1.0" - chrome-trace-event "^0.1.1" - enhanced-resolve "^4.0.0" + chrome-trace-event "^1.0.0" + enhanced-resolve "^4.1.0" eslint-scope "^3.7.1" + json-parse-better-errors "^1.0.2" loader-runner "^2.3.0" loader-utils "^1.1.0" memory-fs "~0.4.1" |