Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a332cb68f4 | ||
|
|
ffc9af3595 | ||
|
|
ea456ca75d | ||
|
|
100447b7d5 | ||
|
|
4fc8174c3f | ||
|
|
ffcf32376d | ||
|
|
9e7a6483bb | ||
|
|
44e7ad381c | ||
|
|
9da8429132 | ||
|
|
371438e4e2 | ||
|
|
3c0fb203c8 | ||
|
|
be099fa8ce | ||
|
|
ad5174f050 | ||
|
|
e55051bb09 | ||
|
|
da099611c2 | ||
|
|
6052e12972 | ||
|
|
5c7ed69e2b | ||
|
|
afb35e18bc | ||
|
|
0cb1761f5b | ||
|
|
e48a1e4354 | ||
|
|
d1cc0b9707 | ||
|
|
df0149ac5f | ||
|
|
10fac6c22f | ||
|
|
172b32155d | ||
|
|
2d7334d61e | ||
|
|
caae886d8f | ||
|
|
270f516448 | ||
|
|
8ed8b19828 | ||
|
|
c66f735c19 | ||
|
|
b2f6208cb4 | ||
|
|
3b10c51f74 | ||
|
|
8d885ab3f5 | ||
|
|
b937346ac2 | ||
|
|
cd047d58f0 | ||
|
|
6a8da82688 | ||
|
|
ac23b8ac83 | ||
|
|
987fe89238 | ||
|
|
5361316879 | ||
|
|
c11df248ab | ||
|
|
ec3a826edc | ||
|
|
a585faa237 | ||
|
|
919ebb922e |
No files matched your search
+1
-56
@@ -1,57 +1,2 @@
|
||||
# OSX
|
||||
#
|
||||
.DS_Store
|
||||
|
||||
# Xcode
|
||||
#
|
||||
build/
|
||||
*.pbxuser
|
||||
!default.pbxuser
|
||||
*.mode1v3
|
||||
!default.mode1v3
|
||||
*.mode2v3
|
||||
!default.mode2v3
|
||||
*.perspectivev3
|
||||
!default.perspectivev3
|
||||
xcuserdata
|
||||
*.xccheckout
|
||||
*.moved-aside
|
||||
DerivedData
|
||||
*.hmap
|
||||
*.ipa
|
||||
*.xcuserstate
|
||||
project.xcworkspace
|
||||
|
||||
# Android/IntelliJ
|
||||
#
|
||||
build/
|
||||
.idea
|
||||
.gradle
|
||||
local.properties
|
||||
*.iml
|
||||
|
||||
# Visual Studio Code
|
||||
#
|
||||
.vscode/
|
||||
|
||||
# node.js
|
||||
#
|
||||
node_modules/
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
|
||||
# BUCK
|
||||
buck-out/
|
||||
\.buckd/
|
||||
*.keystore
|
||||
|
||||
# fastlane
|
||||
#
|
||||
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
|
||||
# screenshots whenever they are needed.
|
||||
# For more information about the recommended setup visit:
|
||||
# https://docs.fastlane.tools/best-practices/source-control/
|
||||
|
||||
*/fastlane/report.xml
|
||||
*/fastlane/Preview.html
|
||||
*/fastlane/screenshots
|
||||
.vscode/
|
||||
@@ -4,20 +4,17 @@
|
||||
*
|
||||
* Generated with the TypeScript template
|
||||
* https://github.com/emin93/react-native-template-typescript
|
||||
*
|
||||
* @format
|
||||
*/
|
||||
|
||||
import React, { Component } from 'react';
|
||||
import {
|
||||
Platform,
|
||||
StyleSheet,
|
||||
Text,
|
||||
View
|
||||
} from 'react-native';
|
||||
import React, {Component} from 'react';
|
||||
import {Platform, StyleSheet, Text, View} from 'react-native';
|
||||
|
||||
const instructions = Platform.select({
|
||||
ios: 'Press Cmd+R to reload,\n' +
|
||||
'Cmd+D or shake for dev menu',
|
||||
android: 'Double tap R on your keyboard to reload,\n' +
|
||||
ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu',
|
||||
android:
|
||||
'Double tap R on your keyboard to reload,\n' +
|
||||
'Shake or press menu button for dev menu',
|
||||
});
|
||||
|
||||
@@ -26,15 +23,9 @@ export default class App extends Component<Props> {
|
||||
render() {
|
||||
return (
|
||||
<View style={styles.container}>
|
||||
<Text style={styles.welcome}>
|
||||
Welcome to React Native!
|
||||
</Text>
|
||||
<Text style={styles.instructions}>
|
||||
To get started, edit App.tsx
|
||||
</Text>
|
||||
<Text style={styles.instructions}>
|
||||
{instructions}
|
||||
</Text>
|
||||
<Text style={styles.welcome}>Welcome to React Native!</Text>
|
||||
<Text style={styles.instructions}>To get started, edit App.tsx</Text>
|
||||
<Text style={styles.instructions}>{instructions}</Text>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,55 +1,56 @@
|
||||
# :space_invader: React Native Template TypeScript · [](https://www.npmjs.com/package/react-native-template-typescript) [](https://travis-ci.org/emin93/react-native-template-typescript)
|
||||
# :space_invader: React Native Template TypeScript · [](https://travis-ci.org/emin93/react-native-template-typescript)
|
||||
|
||||
Clean and minimalist React Native template for a quick start with TypeScript.
|
||||
|
||||
[](https://medium.com/@emin93/react-native-typescript-b965059109d3)
|
||||
|
||||
This template can be used with the React Native CLI, which means it doesn't mess with the platform specific files. Instead of including a lot of dependencies, my aim when creating this template was to provide a very easy and minimalist way to start your React Native project with TypeScript. Of course you can always include other dependencies as you need them.
|
||||
|
||||
## :star: Features
|
||||
|
||||
- Seamless integration with the React Native CLI! :sparkles:
|
||||
- Consistent with the default React Native template (no additional stuff)
|
||||
- React Native TypeScript transformer directly integrated into the packager (no separate process for `tsc`)
|
||||
- Unit testing in TypeScript with TS Jest
|
||||
- Always latest dependencies :raised_hands:
|
||||
- Seamlessly integrated into the React Native CLI! :sparkles:
|
||||
- Consistent with the default React Native template
|
||||
- Always latest dependencies :raised_hands:
|
||||
|
||||
## :arrow_forward: Quick Start
|
||||
|
||||
```
|
||||
react-native init MyApp --template typescript
|
||||
cd MyApp
|
||||
node setup.js
|
||||
```bash
|
||||
react-native init MyApp --template typescript && node MyApp/setup.js
|
||||
```
|
||||
|
||||
## :question: FAQ
|
||||
|
||||
### What is included in this template?
|
||||
### Why this template when React Native 0.57+ supports TypeScript out of the box?
|
||||
|
||||
- [TypeScript](https://github.com/Microsoft/TypeScript)
|
||||
- [React Native TypeScript transformer](https://github.com/ds300/react-native-typescript-transformer)
|
||||
- [Type definitions for React & React Native](https://github.com/DefinitelyTyped/DefinitelyTyped)
|
||||
- [TS Jest](https://github.com/kulshekhar/ts-jest)
|
||||
Actually, when React Native 0.57 was announced, I planned to stop maintenance on this template. But after further evaluation, there's still quite a lot of manual work to do (add type definitions for React & React Native, create a `.tsconfig` for type checking, etc.) to properly set up a React Native 0.57+ TypeScript project. And that's where this template comes in and does that work for you. :raised_hands:
|
||||
|
||||
This template always uses the latest versions of the dependencies at the time when the setup script (`node setup.js`) is being executed. This means you don't have to worry about old versions.
|
||||
### What additional dependencies are included in this template?
|
||||
|
||||
- [TypeScript](https://github.com/Microsoft/TypeScript)
|
||||
- [Type definitions for React & React Native](https://github.com/DefinitelyTyped/DefinitelyTyped)
|
||||
- [ts-jest](https://github.com/kulshekhar/ts-jest)
|
||||
|
||||
This template always uses the latest versions of the dependencies at the time when the `react-native init` command is being executed. This means you don't have to worry about old versions.
|
||||
|
||||
Lots of :heart: and credits to the owners and maintainers of those packages.
|
||||
|
||||
### Why the setup script?
|
||||
|
||||
The React Native CLI supports automatic installation of production dependencies only. Since TypeScript and the other dependencies are dev dependencies, the setup script is being used to install those. It also takes care of obsolete files like the `.flowconfig` and the `setup.js` itself after the setup.
|
||||
It deletes obsolete files like the `.flowconfig` and the `setup.js` itself after the setup.
|
||||
|
||||
### How will this template affect the React Native CLI workflow?
|
||||
### How to do type checking?
|
||||
|
||||
The React Native CLI will do everything just as without a template and afterwards overwrite the files with the ones from this template. This means you don't have to worry about incompatibility issues with later React Native upgrades.
|
||||
`npm run tsc`
|
||||
|
||||
### Does debugging work too?
|
||||
### Does debugging work?
|
||||
|
||||
Yes it does. Some users reported that they got an error about relative paths when they tried to debug inside Visual Studio Code. In this case check out the [fix by Mo Mac](https://medium.com/@nocnoc/great-work-f0b5ef365ca6).
|
||||
Yes it does.
|
||||
|
||||
[](https://medium.com/@emin93/react-native-typescript-b965059109d3)
|
||||
|
||||
## :globe_with_meridians: Links
|
||||
|
||||
- ["Using React Native with TypeScript just became simple" on Medium](https://medium.com/@emin93/react-native-typescript-b965059109d3)
|
||||
- ["Using React Native with TypeScript just became simple" on Medium](https://medium.com/@emin93/react-native-typescript-b965059109d3)
|
||||
- ["24 tips for React Native you probably want to know" on Albert Gao's blog](http://albertgao.xyz/2018/05/30/24-tips-for-react-native-you-probably-want-to-know/#9-For-Typescript)
|
||||
- ["3 Easy Steps to Set Up React Native with TypeScript, Jest and Enzyme" on Medium by Jan Hesters](https://medium.com/@jan.hesters/3-easy-steps-to-set-up-react-native-with-typescript-jest-and-enzyme-592ca042262f)
|
||||
|
||||
## :computer: Contributing
|
||||
|
||||
|
||||
+5
-3
@@ -1,3 +1,7 @@
|
||||
/**
|
||||
* @format
|
||||
*/
|
||||
|
||||
import 'react-native';
|
||||
import React from 'react';
|
||||
import App from '../App';
|
||||
@@ -6,7 +10,5 @@ import App from '../App';
|
||||
import renderer from 'react-test-renderer';
|
||||
|
||||
it('renders correctly', () => {
|
||||
const tree = renderer.create(
|
||||
<App />
|
||||
);
|
||||
renderer.create(<App />);
|
||||
});
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
# OSX
|
||||
#
|
||||
.DS_Store
|
||||
|
||||
# Xcode
|
||||
#
|
||||
build/
|
||||
*.pbxuser
|
||||
!default.pbxuser
|
||||
*.mode1v3
|
||||
!default.mode1v3
|
||||
*.mode2v3
|
||||
!default.mode2v3
|
||||
*.perspectivev3
|
||||
!default.perspectivev3
|
||||
xcuserdata
|
||||
*.xccheckout
|
||||
*.moved-aside
|
||||
DerivedData
|
||||
*.hmap
|
||||
*.ipa
|
||||
*.xcuserstate
|
||||
project.xcworkspace
|
||||
|
||||
# Android/IntelliJ
|
||||
#
|
||||
build/
|
||||
.idea
|
||||
.gradle
|
||||
local.properties
|
||||
*.iml
|
||||
|
||||
# Visual Studio Code
|
||||
#
|
||||
.vscode/
|
||||
|
||||
# node.js
|
||||
#
|
||||
node_modules/
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
|
||||
# BUCK
|
||||
buck-out/
|
||||
\.buckd/
|
||||
*.keystore
|
||||
|
||||
# fastlane
|
||||
#
|
||||
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
|
||||
# screenshots whenever they are needed.
|
||||
# For more information about the recommended setup visit:
|
||||
# https://docs.fastlane.tools/best-practices/source-control/
|
||||
|
||||
*/fastlane/report.xml
|
||||
*/fastlane/Preview.html
|
||||
*/fastlane/screenshots
|
||||
|
||||
# Bundle artifact
|
||||
*.jsbundle
|
||||
@@ -1,9 +1,8 @@
|
||||
[
|
||||
"@types/jest",
|
||||
"@types/react",
|
||||
"@types/react-native",
|
||||
"@types/react-test-renderer",
|
||||
"react-native-typescript-transformer",
|
||||
"ts-jest",
|
||||
"typescript"
|
||||
]
|
||||
{
|
||||
"@types/jest": "latest",
|
||||
"@types/react-native": "latest",
|
||||
"@types/react-test-renderer": "latest",
|
||||
"@types/react": "latest",
|
||||
"ts-jest": "latest",
|
||||
"typescript": "latest"
|
||||
}
|
||||
@@ -3,13 +3,6 @@
|
||||
"^.+\\.tsx?$": "ts-jest"
|
||||
},
|
||||
"testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$",
|
||||
"moduleFileExtensions": [
|
||||
"ts",
|
||||
"tsx",
|
||||
"js",
|
||||
"jsx",
|
||||
"json",
|
||||
"node"
|
||||
],
|
||||
"moduleFileExtensions": ["ts", "tsx", "js", "jsx", "json", "node"],
|
||||
"modulePaths": ["<rootDir>"]
|
||||
}
|
||||
Generated
+361
-614
File diff suppressed because it is too large.
Load diff
+3
-2
@@ -4,7 +4,8 @@
|
||||
"description": "Clean and minimalist React Native template for a quick start with TypeScript.",
|
||||
"scripts": {
|
||||
"test": "standard setup.js",
|
||||
"prepublishOnly": "git reset --hard && npm --no-git-tag-version version from-git"
|
||||
"prepublishOnly": "npm --no-git-tag-version version $TRAVIS_TAG",
|
||||
"install": "node setup.js"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -24,6 +25,6 @@
|
||||
},
|
||||
"homepage": "https://github.com/emin93/react-native-template-typescript#readme",
|
||||
"devDependencies": {
|
||||
"standard": "11.0.1"
|
||||
"standard": "12.0.1"
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
module.exports = {
|
||||
getTransformModulePath() {
|
||||
return require.resolve('react-native-typescript-transformer');
|
||||
},
|
||||
getSourceExts() {
|
||||
return ['ts', 'tsx'];
|
||||
},
|
||||
};
|
||||
@@ -1,56 +1,29 @@
|
||||
const fs = require('fs')
|
||||
const path = require('path')
|
||||
const {execSync} = require('child_process')
|
||||
|
||||
const packageJson = require('./package.json')
|
||||
const jestConfig = require('./jest.json')
|
||||
const devDependencies = require('./devDependencies.json')
|
||||
|
||||
const deleteFile = (fileName) => {
|
||||
const filePath = path.join(process.cwd(), fileName)
|
||||
|
||||
if (!fs.existsSync(filePath)) {
|
||||
return
|
||||
}
|
||||
|
||||
fs.unlinkSync(filePath)
|
||||
}
|
||||
const writeFile = (fileName, data) => fs.writeFileSync(path.join(process.cwd(), fileName), data)
|
||||
const isYarnAvailable = () => {
|
||||
try {
|
||||
execSync('yarn --version', {stdio: 'ignore'})
|
||||
return true
|
||||
} catch (exc) {
|
||||
return false
|
||||
}
|
||||
if (!packageJson.jest) {
|
||||
process.exit()
|
||||
}
|
||||
|
||||
const packageManager = isYarnAvailable() ? 'yarn' : 'npm'
|
||||
const execOptions = {stdio: 'inherit'}
|
||||
const deleteFile = fileName => fs.unlinkSync(path.join(__dirname, fileName))
|
||||
const writeFile = (fileName, data) => fs.writeFileSync(path.join(__dirname, fileName), data)
|
||||
|
||||
console.log('🔄 Please wait...\n')
|
||||
console.log('🔄 Setting up...')
|
||||
|
||||
packageJson.scripts.start = `${packageJson.scripts.start} --config ../../../../rn-cli.config.js`
|
||||
packageJson.scripts.tsc = 'tsc'
|
||||
packageJson.jest = Object.assign(packageJson.jest, jestConfig)
|
||||
|
||||
writeFile('package.json', JSON.stringify(packageJson, null, 2))
|
||||
|
||||
console.log(`📦 Installing dependencies with ${packageManager}...\n`)
|
||||
|
||||
switch (packageManager) {
|
||||
case 'yarn':
|
||||
execSync(`yarn add ${devDependencies.join(' ')} --dev --exact`, execOptions)
|
||||
break
|
||||
default:
|
||||
execSync(`npm i ${devDependencies.join(' ')} --save-dev --save-exact`, execOptions)
|
||||
}
|
||||
|
||||
deleteFile('.flowconfig')
|
||||
deleteFile('App.js')
|
||||
deleteFile('__tests__/App.js')
|
||||
deleteFile('.flowconfig')
|
||||
deleteFile('devDependencies.json')
|
||||
deleteFile('jest.json')
|
||||
deleteFile('README.md')
|
||||
deleteFile('LICENSE')
|
||||
deleteFile('README.md')
|
||||
deleteFile('setup.js')
|
||||
|
||||
console.log(`\n✅ Setup completed! You can now start with: ${packageManager} start\n`)
|
||||
console.log(`✅ Setup completed!`)
|
||||
+10
-9
@@ -1,14 +1,15 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es2015",
|
||||
"jsx": "react",
|
||||
"noEmit": true,
|
||||
"moduleResolution": "node",
|
||||
"noImplicitAny": true,
|
||||
"allowJs": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"esModuleInterop": true
|
||||
"esModuleInterop": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "react",
|
||||
"lib": ["es6"],
|
||||
"moduleResolution": "node",
|
||||
"noEmit": true,
|
||||
"strict": true,
|
||||
"target": "esnext"
|
||||
},
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
]
|
||||
"exclude": ["node_modules", "babel.config.js"]
|
||||
}
|
||||
Reference in new issue
Block a user