Browse Source

load web app asynchronously (#493)

tags/7.5
Stas Vilchik 5 years ago
parent
commit
f09ee6b610
22 changed files with 434 additions and 446 deletions
  1. 2
    8
      server/sonar-web/config/webpack.config.js
  2. 1
    1
      server/sonar-web/package.json
  3. 3
    18
      server/sonar-web/src/main/js/api/nav.ts
  4. 34
    64
      server/sonar-web/src/main/js/app/components/App.tsx
  5. 0
    31
      server/sonar-web/src/main/js/app/components/GlobalLoading.tsx
  6. 0
    86
      server/sonar-web/src/main/js/app/components/LocalizationContainer.tsx
  7. 0
    28
      server/sonar-web/src/main/js/app/index.js
  8. 132
    0
      server/sonar-web/src/main/js/app/index.ts
  9. 1
    0
      server/sonar-web/src/main/js/app/types.ts
  10. 15
    5
      server/sonar-web/src/main/js/app/utils/getStore.ts
  11. 4
    5
      server/sonar-web/src/main/js/app/utils/installExtensionsHandler.ts
  12. 57
    57
      server/sonar-web/src/main/js/app/utils/startReactApp.js
  13. 1
    1
      server/sonar-web/src/main/js/apps/component/components/__tests__/__snapshots__/App-test.tsx.snap
  14. 3
    3
      server/sonar-web/src/main/js/apps/sessions/components/LoginForm.tsx
  15. 9
    15
      server/sonar-web/src/main/js/apps/sessions/components/__tests__/__snapshots__/LoginForm-test.tsx.snap
  16. 8
    3
      server/sonar-web/src/main/js/components/SourceViewer/SourceViewer.tsx
  17. 1
    1
      server/sonar-web/src/main/js/components/SourceViewer/SourceViewerBase.tsx
  18. 1
    1
      server/sonar-web/src/main/js/components/workspace/__tests__/__snapshots__/WorkspaceComponentViewer-test.tsx.snap
  19. 3
    4
      server/sonar-web/src/main/js/helpers/request.ts
  20. 0
    1
      server/sonar-web/src/main/js/helpers/storage.ts
  21. 0
    3
      server/sonar-web/src/main/js/store/utils/configureStore.js
  22. 159
    111
      server/sonar-web/yarn.lock

+ 2
- 8
server/sonar-web/config/webpack.config.js View File

@@ -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
});

+ 1
- 1
server/sonar-web/package.json View File

@@ -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"
},

+ 3
- 18
server/sonar-web/src/main/js/api/nav.ts View File

@@ -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({})));
}

+ 34
- 64
server/sonar-web/src/main/js/app/components/App.tsx View File

@@ -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);

+ 0
- 31
server/sonar-web/src/main/js/app/components/GlobalLoading.tsx View File

@@ -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>
</>
);
}

+ 0
- 86
server/sonar-web/src/main/js/app/components/LocalizationContainer.tsx View File

@@ -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>
);
}
}

+ 0
- 28
server/sonar-web/src/main/js/app/index.js View File

@@ -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();

+ 132
- 0
server/sonar-web/src/main/js/app/index.ts View File

@@ -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;
}

+ 1
- 0
server/sonar-web/src/main/js/app/types.ts View File

@@ -25,6 +25,7 @@ export interface AppState {
adminPages?: Extension[];
authenticationError?: boolean;
authorizationError?: boolean;
branchesEnabled?: boolean;
canAdmin?: boolean;
globalPages?: Extension[];
organizationsEnabled?: boolean;

server/sonar-web/src/main/js/app/utils/getStore.js → server/sonar-web/src/main/js/app/utils/getStore.ts View File

@@ -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);

server/sonar-web/src/main/js/app/utils/installExtensionsHandler.js → server/sonar-web/src/main/js/app/utils/installExtensionsHandler.ts View File

@@ -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];
};

+ 57
- 57
server/sonar-web/src/main/js/app/utils/startReactApp.js View File

@@ -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
);

+ 1
- 1
server/sonar-web/src/main/js/apps/component/components/__tests__/__snapshots__/App-test.tsx.snap View File

@@ -4,7 +4,7 @@ exports[`renders 1`] = `
<div
className="page page-limited"
>
<Connect(SourceViewerBase)
<Connect(LazyLoader)
aroundLine={7}
branchLike={
Object {

+ 3
- 3
server/sonar-web/src/main/js/apps/sessions/components/LoginForm.tsx View File

@@ -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>

+ 9
- 15
server/sonar-web/src/main/js/apps/sessions/components/__tests__/__snapshots__/LoginForm-test.tsx.snap View File

@@ -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>

+ 8
- 3
server/sonar-web/src/main/js/components/SourceViewer/SourceViewer.tsx View File

@@ -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'))
);

+ 1
- 1
server/sonar-web/src/main/js/components/SourceViewer/SourceViewerBase.tsx View File

@@ -54,7 +54,7 @@ import './styles.css';

// TODO react-virtualized

interface Props {
export interface Props {
aroundLine?: number;
branchLike: BranchLike | undefined;
component: string;

+ 1
- 1
server/sonar-web/src/main/js/components/workspace/__tests__/__snapshots__/WorkspaceComponentViewer-test.tsx.snap View File

@@ -28,7 +28,7 @@ exports[`should render 1`] = `
}
}
>
<Connect(SourceViewerBase)
<Connect(LazyLoader)
component="foo"
onLoaded={[Function]}
/>

+ 3
- 4
server/sonar-web/src/main/js/helpers/request.ts View File

@@ -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 {

+ 0
- 1
server/sonar-web/src/main/js/helpers/storage.ts View File

@@ -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;

+ 0
- 3
server/sonar-web/src/main/js/store/utils/configureStore.js View File

@@ -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);

+ 159
- 111
server/sonar-web/yarn.lock View File

@@ -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"

Loading…
Cancel
Save