diff --git a/.eslintrc b/.eslintrc
deleted file mode 100644
index 8da7796..0000000
--- a/.eslintrc
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "extends": "airbnb",
- "parser": "babel-eslint",
- "parserOptions": {
- "ecmaFeatures": {
- "classes": true
- }
- },
- "rules": {
- "react/jsx-filename-extension": [
- "error",
- {
- "extensions": [".js", ".jsx"]
- }
- ],
- "no-new": "warn",
- "global-require": "off",
- "no-console": "error",
- "import/no-extraneous-dependencies": "off",
- "import/extensions": "off",
- "import/no-unresolved": "off",
- "jsx-a11y/anchor-is-valid": "off",
- "no-underscore-dangle": "error",
- "prefer-promise-reject-errors": "error",
- "no-nested-ternary": "error",
- "react/no-multi-comp": "off",
- "comma-dangle": 0,
- "prefer-destructuring": 1
- },
- "env": {
- "jest": true
- },
- "globals": {
- "__DEV__": true
- }
-}
diff --git a/.travis.yml b/.travis.yml
index 43d67ea..9691e50 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -12,7 +12,7 @@ jobs:
language: node_js
node_js: 8.11.2
install: yarn
- script: npm run lint
+ script: yarn lint
- stage: Build Android 🤖
before_install:
- sudo apt-get install build-essential checkinstall && sudo apt-get install libssl-dev
diff --git a/README.md b/README.md
index a9d2530..c1e595d 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 
-### An opinionated [React Native](https://facebook.github.io/react-native/docs/getting-started) Starter Kit with [React Native Navigation](https://github.com/wix/react-native-navigation) + [Redux](https://github.com/reactjs/redux) + [Eslint](https://github.com/airbnb/javascript) to build iOS / Android apps using [TypeScript](https://github.com/Microsoft/TypeScript-React-Native-Starter)
+### An opinionated [React Native](https://facebook.github.io/react-native/docs/getting-started) Starter Kit with [React Native Navigation](https://github.com/wix/react-native-navigation) + [Redux](https://github.com/reactjs/redux) + [TSLint](https://github.com/airbnb/javascript) to build iOS / Android apps using [TypeScript](https://github.com/Microsoft/TypeScript-React-Native-Starter)
The project has been setup based off [RN Getting Started](https://facebook.github.io/react-native/docs/getting-started) and instructions from [Microsoft's Github TypeScript React Native Starter](https://github.com/Microsoft/TypeScript-React-Native-Starter) repo.
@@ -17,7 +17,11 @@ You might also want to [rename](https://medium.com/the-react-native-log/how-to-r
_Disclaimer_:
This is an **opinionated** approach to building apps with RN. The project structure is inspired by multiple production apps built by the contributors.
-The project uses and encourages to use industry best practices / tools / libraries like RNN, redux, eslint, separation of concern and structure to build a maintainable app.
+The project uses and encourages to use industry best practices / tools / libraries like RNN, redux, tslint, separation of concern and structure to build a maintainable app.
+
+|  |  |
+| :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: |
+
### Table of Contents
@@ -62,10 +66,11 @@ The project uses and encourages to use industry best practices / tools / librari
│ ├── presentation
│ └── redux
├── .babelrc
-├── .eslintrc Lint configuration - extending AirBnb
├── .gitignore
-├── .travis.yml Travis CI
+├── .travis.yml Travis CI
├── tsconfig.json TypeScript Configuration
+├── tslint.js TSLint configuration - extending AirBnb
+├── tsconfig.json
├── app.json
├── index.js Application Entry point
├── package.json
@@ -113,16 +118,16 @@ and the launch from IDE.
#### Lint
-To run lint on the application:
+To run tslint on the application:
```
-npm run lint
+yarn lint
```
-To fix lint issues automatically
+To fix most tslint issues automatically
```
-npm run lint:fix
+yarn lint:fix
```
#### Unit Test
@@ -166,7 +171,7 @@ Please check out [Contributing](https://github.com/AmitM30/react-native-typescri
#### Authors
-- **Anurag Chutani** - _Android Setup_ - [Profile](https://github.com/a7urag)
+- [**Anurag Chutani**](https://github.com/a7urag) - _Android Setup_
See also the list of [contributors](https://github.com/AmitM30/react-native-typescript-boilerplate/contributors) who participated in this project.
diff --git a/__tests__/App.tsx b/__tests__/App.tsx
index db4a9f6..4b154ee 100644
--- a/__tests__/App.tsx
+++ b/__tests__/App.tsx
@@ -4,12 +4,12 @@
*/
import 'react-native';
-import renderer from 'react-test-renderer';
+import reactTestRenderer from 'react-test-renderer';
-import App from '../src/navigators';
+import * as App from '../src/navigators';
// Note: test renderer must be required after react-native.
it('renders correctly', () => {
- renderer.create(App());
+ reactTestRenderer.create(App());
});
diff --git a/__tests__/views/home.tsx b/__tests__/views/home.tsx
index c5354f9..936d996 100644
--- a/__tests__/views/home.tsx
+++ b/__tests__/views/home.tsx
@@ -1,11 +1,10 @@
-import React from 'react';
import 'react-native';
-import renderer from 'react-test-renderer';
+import reactTestRenderer from 'react-test-renderer';
-import Home from '../../src/view/screens/home';
+import * as Home from '../../src/view/screens/home';
// Note: test renderer must be required after react-native.
it('renders correctly with defaults', () => {
- const tree = renderer.create().toJSON();
+ const tree = reactTestRenderer.create().toJSON();
expect(tree).toMatchSnapshot();
});
diff --git a/index.js b/index.js
index 1798e1c..0e36f5b 100644
--- a/index.js
+++ b/index.js
@@ -1,14 +1,7 @@
-// /**
-// * @format
-// * @lint-ignore-every XPLATJSCOPYRIGHT1
-// */
-
-// import { AppRegistry } from "react-native";
-// import App from "./App";
-// import { name as appName } from "./app.json";
-
-// AppRegistry.registerComponent(appName, () => App);
-
-import App from './src/navigators';
+/**
+ * @format
+ * @lint-ignore-every XPLATJSCOPYRIGHT1
+ */
+import App from "./src/navigators";
App();
diff --git a/package.json b/package.json
index 8ab104a..3dd6e2f 100644
--- a/package.json
+++ b/package.json
@@ -26,8 +26,8 @@
"start": "node node_modules/react-native/local-cli/cli.js start",
"test": "jest",
"android": "react-native run-android --variant=Debug",
- "lint": "eslint .",
- "lint:fix": "npm run lint -- --fix"
+ "lint": "tslint --project ./tsconfig.json",
+ "lint:fix": "tslint --fix --project ./tsconfig.json"
},
"dependencies": {
"react": "16.6.3",
@@ -67,6 +67,8 @@
"react-test-renderer": "16.6.3",
"regenerator-runtime": "^0.13.1",
"ts-jest": "^23.10.5",
+ "tslint": "^5.12.1",
+ "tslint-config-airbnb": "^5.11.1",
"typescript": "^3.2.4"
},
"jest": {
diff --git a/shared/redux/constants/actionTypes.tsx b/shared/redux/constants/actionTypes.tsx
index 9bbdda2..efe6068 100644
--- a/shared/redux/constants/actionTypes.tsx
+++ b/shared/redux/constants/actionTypes.tsx
@@ -1,8 +1,8 @@
/* Add All Action constants here */
-const ActionTypes = {
+const ACTION_TYPES = {
// Splash Actions
- SPLASH_LAUNCHED: 'SPLASH_LAUNCHED'
+ SPLASH_LAUNCHED: 'SPLASH_LAUNCHED',
};
-export default ActionTypes;
+export { ACTION_TYPES };
diff --git a/shared/redux/reducers/app.tsx b/shared/redux/reducers/app.tsx
index 58d5639..05e22dd 100644
--- a/shared/redux/reducers/app.tsx
+++ b/shared/redux/reducers/app.tsx
@@ -1,14 +1,14 @@
-import ActionTypes from '../constants/actionTypes';
+import { ACTION_TYPES } from '../constants/actionTypes';
const initialState = {
- isLoading: false
+ isLoading: false,
};
-export default (state = initialState, action) => {
+export default (state = initialState, action: any) => {
switch (action.type) {
- case ActionTypes.SPLASH_LAUNCHED:
+ case ACTION_TYPES.SPLASH_LAUNCHED:
return {
- ...state
+ ...state,
};
default:
return state;
diff --git a/shared/redux/reducers/index.tsx b/shared/redux/reducers/index.tsx
index 4817673..9dd1c50 100644
--- a/shared/redux/reducers/index.tsx
+++ b/shared/redux/reducers/index.tsx
@@ -8,5 +8,5 @@ import { combineReducers } from 'redux';
import app from './app';
export default combineReducers({
- app
+ app,
});
diff --git a/shared/redux/store/index.tsx b/shared/redux/store/index.tsx
index cd2a1aa..c04fda9 100644
--- a/shared/redux/store/index.tsx
+++ b/shared/redux/store/index.tsx
@@ -1,10 +1,10 @@
import { applyMiddleware, createStore } from 'redux';
-import thunkMiddleware from 'redux-thunk';
+import * as thunkMiddleware from 'redux-thunk';
import { createLogger } from 'redux-logger';
import reducers from '../reducers';
-let middlewares = [thunkMiddleware];
+let middlewares = [thunkMiddleware.default];
if (__DEV__) {
const loggerMiddleware = createLogger();
middlewares = [...middlewares, loggerMiddleware];
diff --git a/src/constants/screen.tsx b/src/constants/screen.tsx
index 9a9fbe5..1fb5ee0 100644
--- a/src/constants/screen.tsx
+++ b/src/constants/screen.tsx
@@ -1,9 +1,9 @@
// Screen ids constants
-const Screens = {
+const SCREENS = {
Splash: 'Splash',
Home: 'Home',
- Settings: 'Settings'
+ Settings: 'Settings',
};
-export default Screens;
+export { SCREENS };
diff --git a/src/navigators/index.tsx b/src/navigators/index.tsx
index 066d561..2c3bc8a 100644
--- a/src/navigators/index.tsx
+++ b/src/navigators/index.tsx
@@ -2,7 +2,7 @@ import { Navigation } from 'react-native-navigation';
import { Provider } from 'react-redux';
import store from '../../shared/redux/store';
-import registerScreens from '../view/screens';
+import { registerScreens } from '../view/screens';
import { showSplash } from './navigation';
/**
@@ -10,16 +10,14 @@ import { showSplash } from './navigation';
*/
registerScreens({ store, Provider });
-const App = () => {
+const app = () => {
Navigation.events().registerAppLaunchedListener(() => {
Navigation.setDefaultOptions({
- topBar: {
- visible: true
- }
+ topBar: { visible: true },
});
showSplash();
});
};
-export default App;
+export default app;
diff --git a/src/navigators/navigation.tsx b/src/navigators/navigation.tsx
index 1f235ba..0357d29 100644
--- a/src/navigators/navigation.tsx
+++ b/src/navigators/navigation.tsx
@@ -1,89 +1,88 @@
import { Navigation } from 'react-native-navigation';
-import Screens from '../constants/screen';
-import TYPOGRAPHY from '../view/styles/typography';
+import { SCREENS } from '../constants/screen';
+import { TYPOGRAPHY } from '../view/styles/typography';
export const showSplash = () => {
Navigation.setRoot({
root: {
- component: {
- name: Screens.Splash
- }
- }
+ component: { name: SCREENS.Splash },
+ },
});
};
-export const tabbedNavigation = () => Navigation.setRoot({
- root: {
- bottomTabs: {
- id: 'BottomTabsId',
- children: [
- {
- stack: {
- children: [
- {
- component: {
- name: Screens.Home,
- passProps: {
- text: 'This is Home'
+export const tabbedNavigation = () =>
+ Navigation.setRoot({
+ root: {
+ bottomTabs: {
+ id: 'BottomTabsId',
+ children: [
+ {
+ stack: {
+ children: [
+ {
+ component: {
+ name: SCREENS.Home,
+ passProps: {
+ text: 'This is Home',
+ },
+ options: {
+ topBar: {
+ visible: false,
+ drawBehind: true,
+ animate: true,
+ },
+ bottomTab: {
+ fontSize: 12,
+ text: 'Home',
+ textColor: TYPOGRAPHY.COLOR.Primary,
+ selectedTextColor: TYPOGRAPHY.COLOR.Secondary,
+ icon: require('../view/assets/images/tabbar/home.png'),
+ selectedIcon: require('../view/assets/images/tabbar/home.png'),
+ },
+ },
},
- options: {
- topBar: {
- visible: false,
- drawBehind: true,
- animate: true
+ },
+ ],
+ },
+ },
+ {
+ stack: {
+ children: [
+ {
+ component: {
+ name: SCREENS.Settings,
+ options: {
+ topBar: {
+ visible: false,
+ drawBehind: true,
+ animate: true,
+ },
+ bottomTab: {
+ text: 'Settings',
+ fontSize: 12,
+ textColor: TYPOGRAPHY.COLOR.Primary,
+ selectedTextColor: TYPOGRAPHY.COLOR.Secondary,
+ icon: require('../view/assets/images/tabbar/settings.png'),
+ selectedIcon: require('../view/assets/images/tabbar/settings.png'),
+ },
},
- bottomTab: {
- fontSize: 12,
- text: 'Home',
- textColor: TYPOGRAPHY.Color.Primary,
- selectedTextColor: TYPOGRAPHY.Color.Primary,
- icon: require('../view/assets/images/tabbar/home.png'),
- selectedIcon: require('../view/assets/images/tabbar/home.png')
- }
- }
- }
- }
- ]
- }
+ },
+ },
+ ],
+ },
+ },
+ ],
+ options: {
+ bottomTabs: {
+ visible: true,
+ titleDisplayMode: 'alwaysShow',
+ backgroundColor: TYPOGRAPHY.COLOR.Default,
+ drawBehind: true,
+ },
},
- {
- stack: {
- children: [
- {
- component: {
- name: Screens.Settings,
- options: {
- topBar: {
- visible: false,
- drawBehind: true,
- animate: true
- },
- bottomTab: {
- text: 'Settings',
- fontSize: 12,
- textColor: TYPOGRAPHY.Color.Primary,
- selectedTextColor: TYPOGRAPHY.Color.Primary,
- icon: require('../view/assets/images/tabbar/settings.png'),
- selectedIcon: require('../view/assets/images/tabbar/settings.png')
- }
- }
- }
- }
- ]
- }
- }
- ],
- options: {
- bottomTabs: {
- visible: true,
- titleDisplayMode: 'alwaysShow',
- backgroundColor: TYPOGRAPHY.Color.Default,
- drawBehind: true
- }
- }
- }
- }
-});
+ },
+ },
+ });
export default tabbedNavigation;
diff --git a/src/view/assets/images/rn_ts.png b/src/view/assets/images/rn_ts.png
new file mode 100644
index 0000000..edf1339
Binary files /dev/null and b/src/view/assets/images/rn_ts.png differ
diff --git a/src/view/assets/images/rnn2.png b/src/view/assets/images/rnn2.png
new file mode 100644
index 0000000..998b8c9
Binary files /dev/null and b/src/view/assets/images/rnn2.png differ
diff --git a/src/view/assets/images/sample/1.png b/src/view/assets/images/sample/1.png
new file mode 100644
index 0000000..858249d
Binary files /dev/null and b/src/view/assets/images/sample/1.png differ
diff --git a/src/view/assets/images/sample/2.png b/src/view/assets/images/sample/2.png
new file mode 100644
index 0000000..ef6b28f
Binary files /dev/null and b/src/view/assets/images/sample/2.png differ
diff --git a/src/view/elements/buttons.tsx b/src/view/elements/buttons.tsx
new file mode 100644
index 0000000..cfb03fe
--- /dev/null
+++ b/src/view/elements/buttons.tsx
@@ -0,0 +1,27 @@
+import * as React from 'react';
+import { TouchableOpacity } from 'react-native';
+
+import { GLOBAL } from '../styles/global';
+import { CText } from './custom';
+
+type Callback = () => any;
+export interface Props {
+ title: string;
+ onClick: Callback;
+ style?: Text.propTypes.style;
+}
+
+/**
+ * Default Button
+ */
+const BUTTON_DEFAULT = ({ title, onClick, style }: Props) => (
+ onClick()}
+ >
+ {title}
+
+);
+
+export { BUTTON_DEFAULT };
diff --git a/src/view/elements/custom.tsx b/src/view/elements/custom.tsx
new file mode 100644
index 0000000..17c187b
--- /dev/null
+++ b/src/view/elements/custom.tsx
@@ -0,0 +1,28 @@
+import * as React from 'react';
+import { Text } from 'react-native';
+
+import { GLOBAL } from '../styles/global';
+
+export interface Props {
+ style: Text.propTypes.style;
+}
+
+interface State {}
+
+class CText extends React.PureComponent {
+ static defaultProps = {
+ style: GLOBAL.TEXT.Default,
+ };
+
+ render() {
+ const { style, children } = this.props;
+
+ return (
+
+ {children}
+
+ );
+ }
+}
+
+export { CText };
diff --git a/src/view/screens/home/Component.tsx b/src/view/screens/home/Component.tsx
index 45dd5cc..840ff49 100644
--- a/src/view/screens/home/Component.tsx
+++ b/src/view/screens/home/Component.tsx
@@ -1,7 +1,8 @@
-import React, { PureComponent } from 'react';
-import { View, Text } from 'react-native';
+import * as React from 'react';
+import { View } from 'react-native';
import styles from './styles';
+import { CText } from '../../elements/custom';
export interface Props {
name: string;
@@ -11,11 +12,11 @@ interface State {
name: string;
}
-class Home extends PureComponent {
+class Home extends React.PureComponent {
constructor(props: Props) {
super(props);
this.state = {
- name: props.name || 'Amit'
+ name: props.name || 'RN + TS + RNN2',
};
}
@@ -26,8 +27,8 @@ class Home extends PureComponent {
return (
- Home
- {name}
+ Home
+ {name}
);
}
diff --git a/src/view/screens/home/index.tsx b/src/view/screens/home/index.tsx
index 9273664..520cb95 100644
--- a/src/view/screens/home/index.tsx
+++ b/src/view/screens/home/index.tsx
@@ -1,14 +1,14 @@
import { connect } from 'react-redux';
-import Home from './Component';
+import Component from './Component';
const mapStateToProps = () => ({});
const mapDispatchToProps = () => ({});
-const HomeContainer = connect(
+const homeContainer = connect(
mapStateToProps,
- mapDispatchToProps
-)(Home);
+ mapDispatchToProps,
+)(Component);
-export default HomeContainer;
+export default homeContainer;
diff --git a/src/view/screens/home/styles.tsx b/src/view/screens/home/styles.tsx
index c35f24c..30c3d2e 100644
--- a/src/view/screens/home/styles.tsx
+++ b/src/view/screens/home/styles.tsx
@@ -1,13 +1,13 @@
import { StyleSheet } from 'react-native';
-import TYPOGRAPHY from '../../styles/typography';
+import { TYPOGRAPHY } from '../../styles/typography';
-const Styles = StyleSheet.create({
+const styles = StyleSheet.create({
container: {
flex: 1,
display: 'flex',
- backgroundColor: TYPOGRAPHY.Color.Default
- }
+ backgroundColor: TYPOGRAPHY.COLOR.Default,
+ },
});
-export default Styles;
+export default styles;
diff --git a/src/view/screens/index.tsx b/src/view/screens/index.tsx
index badee8c..24a37ae 100644
--- a/src/view/screens/index.tsx
+++ b/src/view/screens/index.tsx
@@ -1,17 +1,25 @@
import { Navigation } from 'react-native-navigation';
-import Screens from '../../constants/screen';
+import { SCREENS } from '../../constants/screen';
-import Splash from './splash';
-import Home from './home';
-import Settings from './settings';
+import * as Splash from './splash';
+import * as Home from './home';
+import * as Settings from './settings';
-const registerComponentWithRedux = (redux: any) => (name: string, component: any) => {
- Navigation.registerComponentWithRedux(name, () => component, redux.Provider, redux.store);
+const registerComponentWithRedux = (redux: any) => (
+ name: string,
+ component: any,
+) => {
+ Navigation.registerComponentWithRedux(
+ name,
+ () => component,
+ redux.Provider,
+ redux.store,
+ );
};
-export default function registerScreens(redux: any) {
- registerComponentWithRedux(redux)(Screens.Splash, Splash);
- registerComponentWithRedux(redux)(Screens.Home, Home);
- registerComponentWithRedux(redux)(Screens.Settings, Settings);
+export function registerScreens(redux: any) {
+ registerComponentWithRedux(redux)(SCREENS.Splash, Splash.default);
+ registerComponentWithRedux(redux)(SCREENS.Home, Home.default);
+ registerComponentWithRedux(redux)(SCREENS.Settings, Settings.default);
}
diff --git a/src/view/screens/settings/Component.tsx b/src/view/screens/settings/Component.tsx
index cc78fd2..6abcdce 100644
--- a/src/view/screens/settings/Component.tsx
+++ b/src/view/screens/settings/Component.tsx
@@ -1,13 +1,14 @@
-import React, { PureComponent } from 'react';
-import { View, Text } from 'react-native';
+import * as React from 'react';
+import { View } from 'react-native';
import styles from './styles';
+import { CText } from '../../elements/custom';
export interface Props {}
interface State {}
-class Settings extends PureComponent {
+class Settings extends React.PureComponent {
constructor(props: Props) {
super(props);
this.state = {};
@@ -18,7 +19,7 @@ class Settings extends PureComponent {
render() {
return (
- Settings
+ Settings
);
}
diff --git a/src/view/screens/settings/index.tsx b/src/view/screens/settings/index.tsx
index 636628d..7aff87d 100644
--- a/src/view/screens/settings/index.tsx
+++ b/src/view/screens/settings/index.tsx
@@ -1,14 +1,14 @@
import { connect } from 'react-redux';
-import Settings from './Component';
+import Component from './Component';
const mapStateToProps = () => ({});
const mapDispatchToProps = () => ({});
-const SettingsContainer = connect(
+const settingsContainer = connect(
mapStateToProps,
- mapDispatchToProps
-)(Settings);
+ mapDispatchToProps,
+)(Component);
-export default SettingsContainer;
+export default settingsContainer;
diff --git a/src/view/screens/settings/styles.tsx b/src/view/screens/settings/styles.tsx
index c35f24c..30c3d2e 100644
--- a/src/view/screens/settings/styles.tsx
+++ b/src/view/screens/settings/styles.tsx
@@ -1,13 +1,13 @@
import { StyleSheet } from 'react-native';
-import TYPOGRAPHY from '../../styles/typography';
+import { TYPOGRAPHY } from '../../styles/typography';
-const Styles = StyleSheet.create({
+const styles = StyleSheet.create({
container: {
flex: 1,
display: 'flex',
- backgroundColor: TYPOGRAPHY.Color.Default
- }
+ backgroundColor: TYPOGRAPHY.COLOR.Default,
+ },
});
-export default Styles;
+export default styles;
diff --git a/src/view/screens/splash/Component.tsx b/src/view/screens/splash/Component.tsx
index a23d4a8..7810082 100644
--- a/src/view/screens/splash/Component.tsx
+++ b/src/view/screens/splash/Component.tsx
@@ -1,16 +1,15 @@
-import React, { PureComponent } from 'react';
-import {
- View, Text, SafeAreaView, Button
-} from 'react-native';
+import * as React from 'react';
+import { View, Image, SafeAreaView } from 'react-native';
import { tabbedNavigation } from '../../../navigators/navigation';
import styles from './styles';
+import { BUTTON_DEFAULT } from '../../elements/buttons';
export interface Props {}
interface State {}
-class Splash extends PureComponent {
+class Splash extends React.PureComponent {
constructor(props: Props) {
super(props);
this.state = {};
@@ -20,14 +19,25 @@ class Splash extends PureComponent {
navigateToHome = () => {
tabbedNavigation();
- };
+ }
render() {
return (
- Splash
-
+
+
+
);
diff --git a/src/view/screens/splash/index.tsx b/src/view/screens/splash/index.tsx
index 63cec96..513c312 100644
--- a/src/view/screens/splash/index.tsx
+++ b/src/view/screens/splash/index.tsx
@@ -1,14 +1,14 @@
import { connect } from 'react-redux';
-import Splash from './Component';
+import Component from './Component';
const mapStateToProps = () => ({});
const mapDispatchToProps = () => ({});
-const SplashContainer = connect(
+const splashContainer = connect(
mapStateToProps,
- mapDispatchToProps
-)(Splash);
+ mapDispatchToProps,
+)(Component);
-export default SplashContainer;
+export default splashContainer;
diff --git a/src/view/screens/splash/styles.tsx b/src/view/screens/splash/styles.tsx
index c35f24c..607750c 100644
--- a/src/view/screens/splash/styles.tsx
+++ b/src/view/screens/splash/styles.tsx
@@ -1,13 +1,17 @@
import { StyleSheet } from 'react-native';
-import TYPOGRAPHY from '../../styles/typography';
+import { TYPOGRAPHY } from '../../styles/typography';
-const Styles = StyleSheet.create({
+const styles = StyleSheet.create({
container: {
flex: 1,
display: 'flex',
- backgroundColor: TYPOGRAPHY.Color.Default
- }
+ alignItems: 'center',
+ backgroundColor: TYPOGRAPHY.COLOR.Default,
+ },
+ image: {
+ width: '70%',
+ },
});
-export default Styles;
+export default styles;
diff --git a/src/view/styles/global.tsx b/src/view/styles/global.tsx
index c6b9cf1..19748b0 100644
--- a/src/view/styles/global.tsx
+++ b/src/view/styles/global.tsx
@@ -1,26 +1,26 @@
import { StyleSheet, Platform } from 'react-native';
-import TYPOGRAPHY from './typography';
+import { TYPOGRAPHY } from './typography';
-export const WidgetPaddingValue = 16;
+export const widgetPaddingValue = 16;
-const Layout = StyleSheet.create({
+const LAYOUT = StyleSheet.create({
SafeArea: {
flex: 1,
- backgroundColor: TYPOGRAPHY.Color.Primary
+ backgroundColor: TYPOGRAPHY.COLOR.Primary,
},
container: {
- flex: 1
+ flex: 1,
},
pageContainer: {
- padding: 16
+ padding: 16,
},
shadow: {
- shadowOpacity: 0.5,
- shadowRadius: 2.5,
- shadowOffset: { width: 2, height: 2 },
- elevation: Platform.OS === 'ios' ? 0 : 7
- }
+ shadowOpacity: 0.25,
+ shadowRadius: 3,
+ shadowOffset: { width: 3, height: 3 },
+ elevation: Platform.OS === 'ios' ? 0 : 3,
+ },
});
const CTA = {
@@ -31,13 +31,15 @@ const CTA = {
justifyContent: 'space-between',
height: 48,
paddingVertical: 8,
- paddingHorizontal: 10,
- borderRadius: 5
+ paddingHorizontal: 20,
+ borderRadius: 10,
+ borderWidth: 1,
+ backgroundColor: TYPOGRAPHY.COLOR.Default,
},
primaryText: {
fontSize: 16,
- color: TYPOGRAPHY.Color.Primary,
- textAlign: 'center'
+ color: TYPOGRAPHY.COLOR.Primary,
+ textAlign: 'center',
},
secondary: {
flexDirection: 'row',
@@ -45,81 +47,81 @@ const CTA = {
justifyContent: 'space-between',
height: 48,
borderWidth: 1,
- backgroundColor: TYPOGRAPHY.Color.Default,
+ backgroundColor: TYPOGRAPHY.COLOR.Default,
borderRadius: 5,
- borderColor: TYPOGRAPHY.Color.Primary
+ borderColor: TYPOGRAPHY.COLOR.Primary,
},
secondaryText: {
- color: TYPOGRAPHY.Color.Primary,
+ color: TYPOGRAPHY.COLOR.Primary,
fontSize: 16,
- textAlign: 'center'
- }
+ textAlign: 'center',
+ },
}),
TouchableOpacity: {
- default: 0.8
- }
+ default: 0.8,
+ },
};
-const Fonts = StyleSheet.create({
+const FONTS = StyleSheet.create({
h1: {
fontSize: 30,
- fontFamily: TYPOGRAPHY.Font.Primary,
- color: TYPOGRAPHY.Color.DefaultSelected
+ fontFamily: TYPOGRAPHY.FONT.Primary,
+ color: TYPOGRAPHY.COLOR.DefaultSelected,
},
body: {
fontSize: 16,
- fontFamily: TYPOGRAPHY.Font.Primary,
- color: TYPOGRAPHY.Color.Default
+ fontFamily: TYPOGRAPHY.FONT.Primary,
+ color: TYPOGRAPHY.COLOR.Default,
},
subTitle: {
fontSize: 14,
- fontFamily: TYPOGRAPHY.Font.Primary,
- color: TYPOGRAPHY.Color.Secondary
- }
+ fontFamily: TYPOGRAPHY.FONT.Primary,
+ color: TYPOGRAPHY.COLOR.Secondary,
+ },
});
-const Text = StyleSheet.create({
+const TEXT = StyleSheet.create({
Default: {
textAlign: 'left',
- fontFamily: TYPOGRAPHY.Font.Primary,
+ fontFamily: TYPOGRAPHY.FONT.Primary,
fontSize: 14,
- color: TYPOGRAPHY.Color.Primary
+ color: TYPOGRAPHY.COLOR.Primary,
},
Bold: {
textAlign: 'left',
fontSize: 14,
- fontFamily: TYPOGRAPHY.Font.Primary,
- color: TYPOGRAPHY.Color.Primary
- }
+ fontFamily: TYPOGRAPHY.FONT.Primary,
+ color: TYPOGRAPHY.COLOR.Primary,
+ },
});
-const TextInput = {
+const TEXT_INPUT = {
Style: StyleSheet.create({
Default: {
- fontFamily: TYPOGRAPHY.Font.Primary,
+ fontFamily: TYPOGRAPHY.FONT.Primary,
textAlign: 'left',
fontSize: 12,
borderWidth: 0.2,
- borderColor: TYPOGRAPHY.Color.Border,
- color: TYPOGRAPHY.Color.Primary
+ borderColor: TYPOGRAPHY.COLOR.Border,
+ color: TYPOGRAPHY.COLOR.Primary,
},
Bold: {
- fontFamily: TYPOGRAPHY.Font.Primary,
+ fontFamily: TYPOGRAPHY.FONT.Primary,
textAlign: 'left',
fontSize: 12,
borderWidth: 0.2,
- borderColor: TYPOGRAPHY.Color.Border,
- color: TYPOGRAPHY.Color.Primary
- }
- })
+ borderColor: TYPOGRAPHY.COLOR.Border,
+ color: TYPOGRAPHY.COLOR.Primary,
+ },
+ }),
};
const GLOBAL = {
- Layout,
+ LAYOUT,
CTA,
- Fonts,
- Text,
- TextInput
+ FONTS,
+ TEXT,
+ TEXT_INPUT,
};
-export default GLOBAL;
+export { GLOBAL };
diff --git a/src/view/styles/typography.tsx b/src/view/styles/typography.tsx
index bd94c6f..4f951d2 100644
--- a/src/view/styles/typography.tsx
+++ b/src/view/styles/typography.tsx
@@ -1,4 +1,4 @@
-const Color = {
+const COLOR = {
// CTA
Primary: '#565656',
Secondary: '#399be0',
@@ -6,21 +6,21 @@ const Color = {
DefaultSelected: '#222222',
Border: '#E7E7E8',
Success: '#2BC480',
- Warning: '#D91E5B'
+ Warning: '#D91E5B',
};
-const Font = {
- Primary: 'Helvetica'
+const FONT = {
+ Primary: 'Helvetica',
};
-const Button = {
- radius: 5
+const BUTTON = {
+ radius: 5,
};
const TYPOGRAPHY = {
- Color,
- Font,
- Button
+ COLOR,
+ FONT,
+ BUTTON,
};
-export default TYPOGRAPHY;
+export { TYPOGRAPHY };
diff --git a/tsconfig.json b/tsconfig.json
index c607e59..d6f1268 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -22,12 +22,12 @@
/* Strict Type-Checking Options */
"strict": true /* Enable all strict type-checking options. */,
- // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
- // "strictNullChecks": true, /* Enable strict null checks. */
- // "strictFunctionTypes": true, /* Enable strict checking of function types. */
+ "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */,
+ "strictNullChecks": true /* Enable strict null checks. */,
+ "strictFunctionTypes": true /* Enable strict checking of function types. */,
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
- // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
+ "noImplicitThis": true /* Raise error on 'this' expressions with an implied 'any' type. */,
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
/* Additional Checks */
diff --git a/tslint.js b/tslint.js
new file mode 100644
index 0000000..24271da
--- /dev/null
+++ b/tslint.js
@@ -0,0 +1,88 @@
+const path = require('path');
+
+module.exports = {
+ rulesDirectory: [
+ path.join(path.dirname(require.resolve('tslint-consistent-codestyle')), './'),
+ path.join(path.dirname(require.resolve('tslint-eslint-rules')), 'dist/rules'),
+ path.join(path.dirname(require.resolve('tslint-microsoft-contrib')), './')
+ ],
+ rules: {
+ // based on https://github.com/airbnb/javascript/tree/74fb34f08d4f1961169e9c37c9036a5b42aa7bf1
+ 'prefer-const': true, // 2.1, 13.1
+ 'no-var-keyword': true, // 2.2
+ 'object-literal-shorthand': true, // 3.3, 3.4
+ 'object-shorthand-properties-first': true, // 3.5
+ 'object-literal-key-quotes': [true, 'as-needed'], // 3.6
+ 'prefer-array-literal': true, // 4.1
+ quotemark: [true, 'single', 'avoid-escape', 'avoid-template', 'jsx-double'], // 6.1, 6.5
+ 'prefer-template': true, // 6.3
+ 'no-eval': true, // 6.4
+ 'no-function-constructor-with-string-args': true, // 7.10
+ 'space-before-function-paren': [
+ true,
+ {
+ anonymous: 'always', // 7.11
+ named: 'never' // 19.3
+ }
+ ],
+ 'no-parameter-reassignment': true, // 7.12
+ align: [true, 'arguments', 'parameters'], // 7.15
+ 'ter-prefer-arrow-callback': [true], // 8.1
+ 'arrow-parens': false, // 8.2
+ 'ter-arrow-parens': [true, 'as-needed', { requireForBlockBody: true }], // 8.4
+ 'no-duplicate-imports': true, // 10.4
+ 'one-variable-per-declaration': [true, 'ignore-for-loop'], // 13.2
+ 'no-increment-decrement': true, // 13.6
+ 'triple-equals': [true, 'allow-null-check'], // 15.1
+ 'no-boolean-literal-compare': true, // 15.3
+ curly: [true, 'ignore-same-line'], // 16.1
+ 'brace-style': [true, '1tbs', { allowSingleLine: true }], // 16.2
+ 'no-else-after-return': true, // 16.3
+ 'comment-format': [true, 'check-space'], // 18.3
+ indent: [true, 'spaces'], // 19.1
+ 'ter-indent': [true, 2, { SwitchCase: 1 }], // 19.1
+ whitespace: [
+ true,
+ 'check-branch', // 19.3
+ 'check-decl', // 19.4
+ 'check-operator', // 19.4
+ 'check-preblock', // 19.2
+ 'check-separator' // 19.14
+ ],
+ eofline: true, // 19.5
+ 'space-in-parens': [true, 'never'], // 19.9
+ 'array-bracket-spacing': [true, 'never'], // 19.10
+ 'object-curly-spacing': [true, 'always'], // 19.11
+ 'max-line-length': [true, 100], // 19.12
+ 'block-spacing': true, // 19.13
+ 'ter-computed-property-spacing': true, // 19.15
+ 'ter-func-call-spacing': true, // 19.16
+ 'no-trailing-whitespace': true, // 19.18
+ 'no-consecutive-blank-lines': true, // 19.19
+ 'trailing-comma': [
+ true,
+ {
+ multiline: 'always',
+ singleline: 'never',
+ esSpecCompliant: true
+ }
+ ], // 20.2
+ semicolon: [true, 'always'], // 21.1
+ 'no-construct': true, // 22.2, 22.3, 22.6
+ radix: true, // 22.3
+ 'function-name': [
+ true,
+ {
+ 'function-regex': /^[a-z$][\w\d]+$/,
+ 'method-regex': /^[a-z$][\w\d]+$/,
+ 'private-method-regex': /^[a-z$][\w\d]+$/,
+ 'protected-method-regex': /^[a-z$][\w\d]+$/,
+ 'static-method-regex': /^[a-z$][\w\d]+$/
+ } // 23.1
+ ],
+ 'variable-name': [true, 'check-format'], // 23.2
+ 'class-name': true, // 23.3
+ 'no-this-assignment': [true, 'allow-destructuring'], // 23.5
+ 'import-name': true // 23.6
+ }
+};
diff --git a/tslint.json b/tslint.json
new file mode 100644
index 0000000..35b2163
--- /dev/null
+++ b/tslint.json
@@ -0,0 +1,3 @@
+{
+ "extends": "tslint-config-airbnb"
+}
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
index 8e1cd18..901baaa 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -761,6 +761,25 @@
lodash "^4.17.10"
to-fast-properties "^2.0.0"
+"@fimbul/bifrost@^0.17.0":
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/@fimbul/bifrost/-/bifrost-0.17.0.tgz#f0383ba7e40992e3193dc87e2ddfde2ad62a9cf4"
+ integrity sha512-gVTkJAOef5HtN6LPmrtt5fAUmBywwlgmObsU3FBhPoNeXPLaIl2zywXkJEtvvVLQnaFmtff3x+wIj5lHRCDE3Q==
+ dependencies:
+ "@fimbul/ymir" "^0.17.0"
+ get-caller-file "^2.0.0"
+ tslib "^1.8.1"
+ tsutils "^3.5.0"
+
+"@fimbul/ymir@^0.17.0":
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/@fimbul/ymir/-/ymir-0.17.0.tgz#4f28389b9f804d1cd202e11983af1743488b7815"
+ integrity sha512-xMXM9KTXRLHLVS6dnX1JhHNEkmWHcAVCQ/4+DA1KKwC/AFnGHzu/7QfQttEPgw3xplT+ILf9e3i64jrFwB3JtA==
+ dependencies:
+ inversify "^5.0.0"
+ reflect-metadata "^0.1.12"
+ tslib "^1.8.1"
+
"@types/jest@^23.3.13":
version "23.3.13"
resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.13.tgz#c81484b6f4ca007bb09887ed15ecb3286d58f928"
@@ -1095,7 +1114,7 @@ axobject-query@^2.0.2:
dependencies:
ast-types-flow "0.0.7"
-babel-code-frame@^6.26.0:
+babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
@@ -1771,7 +1790,7 @@ buffer-from@1.x, buffer-from@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
-builtin-modules@^1.0.0:
+builtin-modules@^1.0.0, builtin-modules@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
@@ -1846,7 +1865,7 @@ chalk@^1.1.1, chalk@^1.1.3:
strip-ansi "^3.0.0"
supports-color "^2.0.0"
-chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.0:
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.0:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
dependencies:
@@ -1981,7 +2000,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
dependencies:
delayed-stream "~1.0.0"
-commander@^2.11.0, commander@^2.9.0:
+commander@^2.11.0, commander@^2.12.1, commander@^2.9.0:
version "2.19.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
@@ -2248,6 +2267,19 @@ diff-sequences@^24.0.0:
version "24.0.0"
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.0.0.tgz#cdf8e27ed20d8b8d3caccb4e0c0d8fe31a173013"
+diff@^3.2.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+ integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
+
+doctrine@0.7.2:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523"
+ integrity sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=
+ dependencies:
+ esutils "^1.1.6"
+ isarray "0.0.1"
+
doctrine@1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
@@ -2575,6 +2607,11 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+esutils@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375"
+ integrity sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=
+
esutils@^2.0.0, esutils@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
@@ -2981,6 +3018,11 @@ get-caller-file@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+get-caller-file@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.1.tgz#25835260d3a2b9665fcdbb08cb039a7bbf7011c0"
+ integrity sha512-SpOZHfz845AH0wJYVuZk2jWDqFmu7Xubsx+ldIpwzy5pDUpu7OJHK7QYNSA2NPlDSKQwM1GFaAkciOWjjW92Sg==
+
get-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
@@ -3273,6 +3315,11 @@ invariant@^2.2.2, invariant@^2.2.4:
dependencies:
loose-envify "^1.0.0"
+inversify@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/inversify/-/inversify-5.0.1.tgz#500d709b1434896ce5a0d58915c4a4210e34fb6e"
+ integrity sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ==
+
invert-kv@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
@@ -3485,6 +3532,11 @@ is-windows@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
@@ -3947,7 +3999,7 @@ js-tokens@^3.0.2:
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
-js-yaml@^3.12.0, js-yaml@^3.9.0:
+js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0:
version "3.12.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600"
dependencies:
@@ -5509,6 +5561,11 @@ redux@^4.0.0, redux@^4.0.1:
loose-envify "^1.4.0"
symbol-observable "^1.2.0"
+reflect-metadata@^0.1.12:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
+ integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
+
regenerate-unicode-properties@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c"
@@ -6283,11 +6340,89 @@ ts-jest@^23.10.5:
semver "^5.5"
yargs-parser "10.x"
-tslib@1.9.3, tslib@^1.9.0:
+tslib@1.9.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
+ integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==
+
+tslib@1.9.3, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
version "1.9.3"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
+tslint-config-airbnb@^5.11.1:
+ version "5.11.1"
+ resolved "https://registry.yarnpkg.com/tslint-config-airbnb/-/tslint-config-airbnb-5.11.1.tgz#51a27fbb8bf24c144d064a274a71da47e7ece617"
+ integrity sha512-hkaittm2607vVMe8eotANGN1CimD5tor7uoY3ypg2VTtEcDB/KGWYbJOz58t8LI4cWSyWtgqYQ5F0HwKxxhlkQ==
+ dependencies:
+ tslint-consistent-codestyle "^1.14.1"
+ tslint-eslint-rules "^5.4.0"
+ tslint-microsoft-contrib "~5.2.1"
+
+tslint-consistent-codestyle@^1.14.1:
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.15.0.tgz#a3acf8d0a3ca0dc7d1285705102ba1fe4a17c4cb"
+ integrity sha512-6BNDBbZh2K0ibRXe70Mkl9gfVttxQ3t3hqV1BRDfpIcjrUoOgD946iH4SrXp+IggDgeMs3dJORjD5tqL5j4jXg==
+ dependencies:
+ "@fimbul/bifrost" "^0.17.0"
+ tslib "^1.7.1"
+ tsutils "^2.29.0"
+
+tslint-eslint-rules@^5.4.0:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz#e488cc9181bf193fe5cd7bfca213a7695f1737b5"
+ integrity sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==
+ dependencies:
+ doctrine "0.7.2"
+ tslib "1.9.0"
+ tsutils "^3.0.0"
+
+tslint-microsoft-contrib@~5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz#a6286839f800e2591d041ea2800c77487844ad81"
+ integrity sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA==
+ dependencies:
+ tsutils "^2.27.2 <2.29.0"
+
+tslint@^5.12.1:
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.12.1.tgz#8cec9d454cf8a1de9b0a26d7bdbad6de362e52c1"
+ integrity sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==
+ dependencies:
+ babel-code-frame "^6.22.0"
+ builtin-modules "^1.1.1"
+ chalk "^2.3.0"
+ commander "^2.12.1"
+ diff "^3.2.0"
+ glob "^7.1.1"
+ js-yaml "^3.7.0"
+ minimatch "^3.0.4"
+ resolve "^1.3.2"
+ semver "^5.3.0"
+ tslib "^1.8.0"
+ tsutils "^2.27.2"
+
+tsutils@^2.27.2, tsutils@^2.29.0:
+ version "2.29.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99"
+ integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==
+ dependencies:
+ tslib "^1.8.1"
+
+"tsutils@^2.27.2 <2.29.0":
+ version "2.28.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.28.0.tgz#6bd71e160828f9d019b6f4e844742228f85169a1"
+ integrity sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==
+ dependencies:
+ tslib "^1.8.1"
+
+tsutils@^3.0.0, tsutils@^3.5.0:
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.8.0.tgz#7a3dbadc88e465596440622b65c04edc8e187ae5"
+ integrity sha512-XQdPhgcoTbCD8baXC38PQ0vpTZ8T3YrE+vR66YIj/xvDt1//8iAhafpIT/4DmvzzC1QFapEImERu48Pa01dIUA==
+ dependencies:
+ tslib "^1.8.1"
+
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"