├── .gitignore ├── LICENSE ├── README.md ├── index.js ├── package-lock.json ├── package.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 AtliQ Technologies Pvt Ltd 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # react-native-app-starter 2 | 3 | This project is a [React Native](https://facebook.github.io/react-native/) boilerplate that can be used to kickstart a mobile application. 4 | 5 | The boilerplate provides **an optimized architecture for building solid cross-platform mobile applications** through separation of concerns between the UI and business logic. It contains redux, saga, context, theme, localization, tabs and stack navigation. 6 | 7 |
8 | 9 | [![npm version](https://img.shields.io/npm/v/react-native-app-starter.svg?style=for-the-badge)](https://www.npmjs.com/package/react-native-app-starter) 10 | 11 | ## Getting Started 12 | 13 | ``` 14 | $ npx react-native-app-starter 15 | 16 | $ cd 17 | 18 | $ npx react-native run-ios 19 | 20 | $ npx react-native run-android 21 | ``` 22 | 23 |
24 | 25 | ## Directory Structure 26 | 27 | ``` 28 | root 29 | ├── __tests__ 30 | ├── android 31 | ├── ios 32 | └── App 33 | └── Actions 34 | | ├── Keys 35 | └── ApiConfig 36 | └── AppContext 37 | └── Localization 38 | └── Reducers 39 | | ├──Default 40 | └── Routes 41 | └── Sagas 42 | └── Screens 43 | | CommonComponent 44 | | Components 45 | | SubComponents 46 | └── Services 47 | └── Stores 48 | └── Theme 49 | | Images 50 | └── Utils 51 | ├── fastlane 52 | ├── .env 53 | ... 54 | ``` 55 | 56 |
57 | 58 | ## Preconfigured with 59 | 60 | - Latest react native version 61 | 62 | - Redux saga with persistReducer 63 | 64 | - Localization 65 | 66 | - Theme support (Dark / Light) 67 | 68 | - Utility for validations and error messages 69 | 70 | - Custom font and font size for maintain typography 71 | 72 | - .env and fastlane setup 73 | 74 | - Support different env for PRODUCTION and DEVELOPMENT 75 | 76 | - User Authemntication flow 77 | 78 | - UI for Login, Tabs and Settings 79 | 80 |
81 | 82 | ## Predefined UI 83 | 84 |
85 | Expand for screenshots 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 |
iOS

Android

103 |
104 | 105 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env node 2 | 3 | const fs = require("fs"); 4 | const os = require("os"); 5 | const shell = require("shelljs"); 6 | 7 | const { program } = require("commander"); 8 | const cliSelect = require("cli-select"); 9 | const { cwd } = require("process"); 10 | 11 | program.parse(); 12 | 13 | const programOptions = program.opts(); 14 | 15 | const main = async (repositoryUrl, directoryName, husky) => { 16 | console.log(`Creating new project ${directoryName}`); 17 | console.log(`Installing Yarn`); 18 | shell.exec("npm install -g yarn", (code, stdout, stderr) => { 19 | console.log(stdout); 20 | }); 21 | if (directoryName.match(/[<>:"\/\\|?*\x00-\x1F]/)) { 22 | return console.error(` 23 | Invalid directory name. 24 | Usage : 'npx react-native-app-starter name_of_app' 25 | `); 26 | } 27 | 28 | const randomNameGenerator = (num) => { 29 | let res = ""; 30 | for (let i = 0; i < num; i++) { 31 | const random = Math.floor(Math.random() * 27); 32 | res += String.fromCharCode(97 + random); 33 | } 34 | return res; 35 | }; 36 | 37 | //Get the name of the app-directory to make 38 | let tmpDir = "temp" + randomNameGenerator(5); 39 | try { 40 | shell.exec(`git clone ${repositoryUrl} ${tmpDir}`); 41 | 42 | //2. get the json from package.json 43 | const packageJsonRaw = fs.readFileSync(`${tmpDir}/package.json`); 44 | 45 | const packageJson = JSON.parse(packageJsonRaw); 46 | const dependencyList = Object.keys(packageJson.dependencies); 47 | const devDependencyList = Object.keys(packageJson.devDependencies); 48 | 49 | console.log("Now, installing react-native..."); 50 | 51 | const shellOptions = { 52 | cwd: `${process.cwd()}/${directoryName}`, 53 | }; 54 | 55 | shell.exec( 56 | `echo N | npx @react-native-community/cli init ${directoryName}` 57 | ); 58 | 59 | //3. Installing the dependencies. 60 | console.log("installing... ", dependencyList); 61 | shell.exec(`yarn add ${dependencyList.join(" ")}`, shellOptions); 62 | shell.exec(`yarn add -D ${devDependencyList.join(" ")}`, shellOptions); 63 | 64 | if (!husky) { 65 | shell.exec(`yarn remove husky`, shellOptions); 66 | } 67 | const projectDirectories = directoryName.split("/"); 68 | 69 | shell.ls(`${tmpDir}/android/app/src/main/res/drawable/`).forEach((file) => { 70 | shell.cp( 71 | "-rf", 72 | `${tmpDir}/android/app/src/main/res/drawable/${file}`, 73 | `${directoryName}/android/app/src/main/res/drawable/` 74 | ); 75 | }); 76 | shell 77 | .ls(`${tmpDir}/ios/boilerPlateTypescript/Images.xcassets/`) 78 | .forEach((file) => { 79 | shell.cp( 80 | "-rf", 81 | `${tmpDir}/ios/boilerPlateTypescript/Images.xcassets/${file}`, 82 | `${directoryName}/ios/${ 83 | projectDirectories[projectDirectories.length - 1] 84 | }/Images.xcassets/` 85 | ); 86 | }); 87 | shell.mv(`${tmpDir}/App`, `${directoryName}`); 88 | shell.mv(`${tmpDir}/.env`, `${directoryName}`); 89 | shell.mv(`${tmpDir}/fastlane`, `${directoryName}`); 90 | 91 | if (os.type() === "Darwin") { 92 | shell.exec(`pod install --project-directory=ios`, { 93 | cwd: `${process.cwd()}/${directoryName}`, 94 | }); 95 | } else { 96 | console.log("iOS setup only supported in Mac OS."); 97 | } 98 | 99 | if (husky) { 100 | shell.exec(`npx husky install`, shellOptions); 101 | shell.rm("-rf", `${directoryName}/.husky`); 102 | shell.mv(`${tmpDir}/.husky`, `${directoryName}`); 103 | } 104 | 105 | if (repositoryUrl === tsURL) { 106 | shell.rm("-rf", `${directoryName}/index.js`); 107 | shell.mv(`${tmpDir}/index.js`, `${directoryName}`); 108 | shell.rm("-rf", `${directoryName}/App.tsx`); 109 | } else { 110 | shell.rm("-rf", `${directoryName}/App.js`); 111 | } 112 | shell.rm("-rf", `${directoryName}/babel.config.js`); 113 | shell.rm("-rf", `${directoryName}/tsconfig.json`); 114 | shell.mv(`${tmpDir}/babel.config.js`, `${directoryName}`); 115 | shell.mv(`${tmpDir}/tsconfig.json`, `${directoryName}`); 116 | shell.mv(`${tmpDir}/moduleResolver.js`, `${directoryName}`); 117 | shell.mv(`${tmpDir}/modules.json`, `${directoryName}`); 118 | shell.mv(`${tmpDir}/postinstall`, `${directoryName}`); 119 | shell.mv(`${tmpDir}/.prettierrc.js`, `${directoryName}`); 120 | shell.mv(`${tmpDir}/env.config`, `${directoryName}`); 121 | shell.mv(`${tmpDir}/react-native-config.d.ts`, `${directoryName}`); 122 | 123 | console.log("Adding additional scripts..."); 124 | addScripts(directoryName, husky); 125 | if (husky) { 126 | console.log("Installing husky hooks"); 127 | shell.exec("yarn", "prepare", shellOptions); 128 | } 129 | console.log("Setting up .gitignore"); 130 | shell.exec( 131 | `echo "\n.env\n\!**/fastlane/.env" >> ${directoryName}/.gitignore` 132 | ); 133 | 134 | console.log(`Application generated... its ready to use. 135 | To get started, 136 | - cd ${directoryName} 137 | - npm run dev 138 | `); 139 | 140 | // console.log( 141 | // 'Please, add "postinstall": "sh postinstall" in script to package.json ' 142 | // ); 143 | 144 | // - If not start try to delete watchman watches by running following command: 145 | // - watchman watch-del-all 146 | // - Then start metro server clearing its cache by running following command: 147 | // - yarn start --clear-cache 148 | 149 | // the rest of your app goes here 150 | } catch { 151 | // handle error 152 | } finally { 153 | try { 154 | if (tmpDir) { 155 | fs.rmSync(tmpDir, { recursive: true }); 156 | } 157 | } catch (e) { 158 | console.error( 159 | `An error has occurred while removing the temp folder at ${tmpDir}. Please remove it manually. Error: ${e}` 160 | ); 161 | } 162 | } 163 | }; 164 | 165 | const addScripts = (directory, husky) => { 166 | let packageJSON = JSON.parse( 167 | fs.readFileSync(`${directory}/package.json`, "utf8") 168 | ); 169 | let scripts = packageJSON.scripts; 170 | scripts = { 171 | ...scripts, 172 | postinstall: "sh postinstall", 173 | lint: "eslint .", 174 | "lint:fix": "eslint . --fix", 175 | prepare: "husky install", 176 | "bundle-android": 177 | "npx react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle", 178 | "bundle-ios": 179 | "npx react-native bundle --entry-file index.js --platform ios --dev false --bundle-output ios/main.jsbundle", 180 | "release-ios-changelog": 181 | "yarn install && yarn run generate-changelog && fastlane ios beta", 182 | "release-android-changelog": 183 | "yarn install && yarn run generate-changelog && fastlane android beta", 184 | "release-ios-changelog-bump": 185 | "yarn install && yarn run generate-changelog-bump && fastlane ios beta", 186 | "release-android-changelog-bump": 187 | "yarn install && yarn run generate-changelog-bump && fastlane android beta", 188 | "generate-changelog": 189 | 'fastlane changelog build_changelog bump_type:"patch"', 190 | "generate-changelog-bump": "fastlane changelog build_changelog", 191 | "release-ios": "yarn install && fastlane ios beta", 192 | "release-android": "yarn install && fastlane android beta", 193 | release: 194 | "yarn run generate-changelog && yarn run release-android && yarn run release-ios", 195 | "release-bump": 196 | "yarn run generate-changelog-bump && yarn run release-android && yarn run release-ios", 197 | }; 198 | if (!husky) { 199 | delete scripts.prepare; 200 | } 201 | packageJSON.scripts = scripts; 202 | fs.writeFileSync( 203 | `${directory}/package.json`, 204 | JSON.stringify(packageJSON, null, 2) 205 | ); 206 | console.log("Added scripts to package.json"); 207 | }; 208 | 209 | const tsURL = "https://github.com/atliq/react-native-boilerplate-ts.git"; 210 | 211 | let directoryName = process.argv[2]; 212 | 213 | if (!directoryName || directoryName.length === 0) { 214 | const readline = require("readline").createInterface({ 215 | input: process.stdin, 216 | output: process.stdout, 217 | }); 218 | 219 | readline.question(`What's your project name?`, (name) => { 220 | console.log(`Hi ${name}!`); 221 | readline.close(); 222 | directoryName = name; 223 | 224 | console.log(`Do you want to install husky`); 225 | cliSelect({ 226 | values: ["Yes", "No"], 227 | }).then((husky) => { 228 | console.log(husky); 229 | if (husky.value === "Yes") { 230 | main(tsURL, directoryName, true); 231 | } else { 232 | main(tsURL, directoryName, false); 233 | } 234 | }); 235 | if (programOptions.ts) { 236 | console.log("Generating... Typescript Template"); 237 | return main(tsURL, directoryName); 238 | } 239 | }); 240 | return; 241 | } 242 | 243 | if (directoryName.match(/[<>:"\/\\|?*\x00-\x1F]/)) { 244 | return console.error(` 245 | Invalid directory name. 246 | Usage : '@atliq/react-native-starter name_of_app' 247 | `); 248 | } 249 | 250 | if (programOptions.ts) { 251 | console.log("Generating... Typescript Template"); 252 | return main(tsURL, directoryName); 253 | } 254 | 255 | console.log(`Do you want to install husky`); 256 | 257 | cliSelect({ 258 | values: ["Yes", "No"], 259 | }).then((husky) => { 260 | console.log(husky); 261 | if (husky.value === "Yes") { 262 | main(tsURL, directoryName, true); 263 | } else { 264 | main(tsURL, directoryName, false); 265 | } 266 | }); 267 | 268 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-app-starter", 3 | "version": "1.0.5", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "react-native-app-starter", 9 | "version": "1.0.5", 10 | "license": "ISC", 11 | "dependencies": { 12 | "cli-select": "^1.1.2", 13 | "commander": "^9.0.0", 14 | "shelljs": "^0.8.5" 15 | }, 16 | "bin": { 17 | "react-native-app-starter": "index.js" 18 | } 19 | }, 20 | "node_modules/ansi-escapes": { 21 | "version": "3.2.0", 22 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 23 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", 24 | "engines": { 25 | "node": ">=4" 26 | } 27 | }, 28 | "node_modules/balanced-match": { 29 | "version": "1.0.2", 30 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 31 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 32 | }, 33 | "node_modules/brace-expansion": { 34 | "version": "1.1.11", 35 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 36 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 37 | "dependencies": { 38 | "balanced-match": "^1.0.0", 39 | "concat-map": "0.0.1" 40 | } 41 | }, 42 | "node_modules/cli-select": { 43 | "version": "1.1.2", 44 | "resolved": "https://registry.npmjs.org/cli-select/-/cli-select-1.1.2.tgz", 45 | "integrity": "sha512-PSvWb8G0PPmBNDcz/uM2LkZN3Nn5JmhUl465tTfynQAXjKzFpmHbxStM6X/+awKp5DJuAaHMzzMPefT0suGm1w==", 46 | "dependencies": { 47 | "ansi-escapes": "^3.2.0" 48 | } 49 | }, 50 | "node_modules/commander": { 51 | "version": "9.0.0", 52 | "resolved": "https://registry.npmjs.org/commander/-/commander-9.0.0.tgz", 53 | "integrity": "sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw==", 54 | "engines": { 55 | "node": "^12.20.0 || >=14" 56 | } 57 | }, 58 | "node_modules/concat-map": { 59 | "version": "0.0.1", 60 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 61 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 62 | }, 63 | "node_modules/fs.realpath": { 64 | "version": "1.0.0", 65 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 66 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 67 | }, 68 | "node_modules/function-bind": { 69 | "version": "1.1.1", 70 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 71 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 72 | }, 73 | "node_modules/glob": { 74 | "version": "7.2.3", 75 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 76 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 77 | "dependencies": { 78 | "fs.realpath": "^1.0.0", 79 | "inflight": "^1.0.4", 80 | "inherits": "2", 81 | "minimatch": "^3.1.1", 82 | "once": "^1.3.0", 83 | "path-is-absolute": "^1.0.0" 84 | }, 85 | "engines": { 86 | "node": "*" 87 | }, 88 | "funding": { 89 | "url": "https://github.com/sponsors/isaacs" 90 | } 91 | }, 92 | "node_modules/has": { 93 | "version": "1.0.3", 94 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 95 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 96 | "dependencies": { 97 | "function-bind": "^1.1.1" 98 | }, 99 | "engines": { 100 | "node": ">= 0.4.0" 101 | } 102 | }, 103 | "node_modules/inflight": { 104 | "version": "1.0.6", 105 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 106 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 107 | "dependencies": { 108 | "once": "^1.3.0", 109 | "wrappy": "1" 110 | } 111 | }, 112 | "node_modules/inherits": { 113 | "version": "2.0.4", 114 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 115 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 116 | }, 117 | "node_modules/interpret": { 118 | "version": "1.4.0", 119 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", 120 | "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", 121 | "engines": { 122 | "node": ">= 0.10" 123 | } 124 | }, 125 | "node_modules/is-core-module": { 126 | "version": "2.9.0", 127 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", 128 | "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", 129 | "dependencies": { 130 | "has": "^1.0.3" 131 | }, 132 | "funding": { 133 | "url": "https://github.com/sponsors/ljharb" 134 | } 135 | }, 136 | "node_modules/minimatch": { 137 | "version": "3.1.2", 138 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 139 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 140 | "dependencies": { 141 | "brace-expansion": "^1.1.7" 142 | }, 143 | "engines": { 144 | "node": "*" 145 | } 146 | }, 147 | "node_modules/once": { 148 | "version": "1.4.0", 149 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 150 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 151 | "dependencies": { 152 | "wrappy": "1" 153 | } 154 | }, 155 | "node_modules/path-is-absolute": { 156 | "version": "1.0.1", 157 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 158 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 159 | "engines": { 160 | "node": ">=0.10.0" 161 | } 162 | }, 163 | "node_modules/path-parse": { 164 | "version": "1.0.7", 165 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 166 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 167 | }, 168 | "node_modules/rechoir": { 169 | "version": "0.6.2", 170 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 171 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 172 | "dependencies": { 173 | "resolve": "^1.1.6" 174 | }, 175 | "engines": { 176 | "node": ">= 0.10" 177 | } 178 | }, 179 | "node_modules/resolve": { 180 | "version": "1.22.0", 181 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", 182 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", 183 | "dependencies": { 184 | "is-core-module": "^2.8.1", 185 | "path-parse": "^1.0.7", 186 | "supports-preserve-symlinks-flag": "^1.0.0" 187 | }, 188 | "bin": { 189 | "resolve": "bin/resolve" 190 | }, 191 | "funding": { 192 | "url": "https://github.com/sponsors/ljharb" 193 | } 194 | }, 195 | "node_modules/shelljs": { 196 | "version": "0.8.5", 197 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", 198 | "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", 199 | "dependencies": { 200 | "glob": "^7.0.0", 201 | "interpret": "^1.0.0", 202 | "rechoir": "^0.6.2" 203 | }, 204 | "bin": { 205 | "shjs": "bin/shjs" 206 | }, 207 | "engines": { 208 | "node": ">=4" 209 | } 210 | }, 211 | "node_modules/supports-preserve-symlinks-flag": { 212 | "version": "1.0.0", 213 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 214 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 215 | "engines": { 216 | "node": ">= 0.4" 217 | }, 218 | "funding": { 219 | "url": "https://github.com/sponsors/ljharb" 220 | } 221 | }, 222 | "node_modules/wrappy": { 223 | "version": "1.0.2", 224 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 225 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 226 | } 227 | }, 228 | "dependencies": { 229 | "ansi-escapes": { 230 | "version": "3.2.0", 231 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 232 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" 233 | }, 234 | "balanced-match": { 235 | "version": "1.0.2", 236 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 237 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 238 | }, 239 | "brace-expansion": { 240 | "version": "1.1.11", 241 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 242 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 243 | "requires": { 244 | "balanced-match": "^1.0.0", 245 | "concat-map": "0.0.1" 246 | } 247 | }, 248 | "cli-select": { 249 | "version": "1.1.2", 250 | "resolved": "https://registry.npmjs.org/cli-select/-/cli-select-1.1.2.tgz", 251 | "integrity": "sha512-PSvWb8G0PPmBNDcz/uM2LkZN3Nn5JmhUl465tTfynQAXjKzFpmHbxStM6X/+awKp5DJuAaHMzzMPefT0suGm1w==", 252 | "requires": { 253 | "ansi-escapes": "^3.2.0" 254 | } 255 | }, 256 | "commander": { 257 | "version": "9.0.0", 258 | "resolved": "https://registry.npmjs.org/commander/-/commander-9.0.0.tgz", 259 | "integrity": "sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw==" 260 | }, 261 | "concat-map": { 262 | "version": "0.0.1", 263 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 264 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 265 | }, 266 | "fs.realpath": { 267 | "version": "1.0.0", 268 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 269 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 270 | }, 271 | "function-bind": { 272 | "version": "1.1.1", 273 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 274 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 275 | }, 276 | "glob": { 277 | "version": "7.2.3", 278 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 279 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 280 | "requires": { 281 | "fs.realpath": "^1.0.0", 282 | "inflight": "^1.0.4", 283 | "inherits": "2", 284 | "minimatch": "^3.1.1", 285 | "once": "^1.3.0", 286 | "path-is-absolute": "^1.0.0" 287 | } 288 | }, 289 | "has": { 290 | "version": "1.0.3", 291 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 292 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 293 | "requires": { 294 | "function-bind": "^1.1.1" 295 | } 296 | }, 297 | "inflight": { 298 | "version": "1.0.6", 299 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 300 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 301 | "requires": { 302 | "once": "^1.3.0", 303 | "wrappy": "1" 304 | } 305 | }, 306 | "inherits": { 307 | "version": "2.0.4", 308 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 309 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 310 | }, 311 | "interpret": { 312 | "version": "1.4.0", 313 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", 314 | "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" 315 | }, 316 | "is-core-module": { 317 | "version": "2.9.0", 318 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", 319 | "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", 320 | "requires": { 321 | "has": "^1.0.3" 322 | } 323 | }, 324 | "minimatch": { 325 | "version": "3.1.2", 326 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 327 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 328 | "requires": { 329 | "brace-expansion": "^1.1.7" 330 | } 331 | }, 332 | "once": { 333 | "version": "1.4.0", 334 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 335 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 336 | "requires": { 337 | "wrappy": "1" 338 | } 339 | }, 340 | "path-is-absolute": { 341 | "version": "1.0.1", 342 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 343 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 344 | }, 345 | "path-parse": { 346 | "version": "1.0.7", 347 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 348 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 349 | }, 350 | "rechoir": { 351 | "version": "0.6.2", 352 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 353 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 354 | "requires": { 355 | "resolve": "^1.1.6" 356 | } 357 | }, 358 | "resolve": { 359 | "version": "1.22.0", 360 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", 361 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", 362 | "requires": { 363 | "is-core-module": "^2.8.1", 364 | "path-parse": "^1.0.7", 365 | "supports-preserve-symlinks-flag": "^1.0.0" 366 | } 367 | }, 368 | "shelljs": { 369 | "version": "0.8.5", 370 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", 371 | "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", 372 | "requires": { 373 | "glob": "^7.0.0", 374 | "interpret": "^1.0.0", 375 | "rechoir": "^0.6.2" 376 | } 377 | }, 378 | "supports-preserve-symlinks-flag": { 379 | "version": "1.0.0", 380 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 381 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" 382 | }, 383 | "wrappy": { 384 | "version": "1.0.2", 385 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 386 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 387 | } 388 | } 389 | } 390 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-app-starter", 3 | "version": "1.0.16", 4 | "description": "A React Native Template.", 5 | "main": "index.js", 6 | "bin": "index.js", 7 | "scripts": { 8 | "test": "echo \"No test specified\" && exit 1" 9 | }, 10 | "keywords": [ 11 | "react-native", 12 | "boilerplate", 13 | "starter", 14 | "template", 15 | "dark-theme", 16 | "localization", 17 | "react-tab", 18 | "redux", 19 | "redux-saga", 20 | "react-redux", 21 | "redux-persist", 22 | "theme", 23 | "hooks", 24 | "theme-context", 25 | "react-native-theme" 26 | ], 27 | "repository": { 28 | "type": "git", 29 | "url": "git+https://github.com/atliq/react-native-starter" 30 | }, 31 | "author": { 32 | "name": "Atliq Technologies" 33 | }, 34 | "license": "ISC", 35 | "dependencies": { 36 | "cli-select": "^1.1.2", 37 | "commander": "^9.0.0", 38 | "shelljs": "^0.8.5" 39 | } 40 | } 41 | 42 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "ansi-escapes@^3.2.0": 6 | "integrity" "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" 7 | "resolved" "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz" 8 | "version" "3.2.0" 9 | 10 | "balanced-match@^1.0.0": 11 | "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 12 | "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" 13 | "version" "1.0.2" 14 | 15 | "brace-expansion@^1.1.7": 16 | "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" 17 | "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 18 | "version" "1.1.11" 19 | dependencies: 20 | "balanced-match" "^1.0.0" 21 | "concat-map" "0.0.1" 22 | 23 | "cli-select@^1.1.2": 24 | "integrity" "sha512-PSvWb8G0PPmBNDcz/uM2LkZN3Nn5JmhUl465tTfynQAXjKzFpmHbxStM6X/+awKp5DJuAaHMzzMPefT0suGm1w==" 25 | "resolved" "https://registry.npmjs.org/cli-select/-/cli-select-1.1.2.tgz" 26 | "version" "1.1.2" 27 | dependencies: 28 | "ansi-escapes" "^3.2.0" 29 | 30 | "commander@^9.0.0": 31 | "integrity" "sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw==" 32 | "resolved" "https://registry.npmjs.org/commander/-/commander-9.0.0.tgz" 33 | "version" "9.0.0" 34 | 35 | "concat-map@0.0.1": 36 | "integrity" "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 37 | "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 38 | "version" "0.0.1" 39 | 40 | "fs.realpath@^1.0.0": 41 | "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 42 | "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" 43 | "version" "1.0.0" 44 | 45 | "function-bind@^1.1.1": 46 | "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 47 | "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" 48 | "version" "1.1.1" 49 | 50 | "glob@^7.0.0": 51 | "integrity" "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==" 52 | "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" 53 | "version" "7.2.3" 54 | dependencies: 55 | "fs.realpath" "^1.0.0" 56 | "inflight" "^1.0.4" 57 | "inherits" "2" 58 | "minimatch" "^3.1.1" 59 | "once" "^1.3.0" 60 | "path-is-absolute" "^1.0.0" 61 | 62 | "has@^1.0.3": 63 | "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" 64 | "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" 65 | "version" "1.0.3" 66 | dependencies: 67 | "function-bind" "^1.1.1" 68 | 69 | "inflight@^1.0.4": 70 | "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" 71 | "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" 72 | "version" "1.0.6" 73 | dependencies: 74 | "once" "^1.3.0" 75 | "wrappy" "1" 76 | 77 | "inherits@2": 78 | "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 79 | "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" 80 | "version" "2.0.4" 81 | 82 | "interpret@^1.0.0": 83 | "integrity" "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" 84 | "resolved" "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" 85 | "version" "1.4.0" 86 | 87 | "is-core-module@^2.8.1": 88 | "integrity" "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==" 89 | "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz" 90 | "version" "2.9.0" 91 | dependencies: 92 | "has" "^1.0.3" 93 | 94 | "minimatch@^3.1.1": 95 | "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" 96 | "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" 97 | "version" "3.1.2" 98 | dependencies: 99 | "brace-expansion" "^1.1.7" 100 | 101 | "once@^1.3.0": 102 | "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" 103 | "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" 104 | "version" "1.4.0" 105 | dependencies: 106 | "wrappy" "1" 107 | 108 | "path-is-absolute@^1.0.0": 109 | "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 110 | "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" 111 | "version" "1.0.1" 112 | 113 | "path-parse@^1.0.7": 114 | "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 115 | "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" 116 | "version" "1.0.7" 117 | 118 | "rechoir@^0.6.2": 119 | "integrity" "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=" 120 | "resolved" "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" 121 | "version" "0.6.2" 122 | dependencies: 123 | "resolve" "^1.1.6" 124 | 125 | "resolve@^1.1.6": 126 | "integrity" "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==" 127 | "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz" 128 | "version" "1.22.0" 129 | dependencies: 130 | "is-core-module" "^2.8.1" 131 | "path-parse" "^1.0.7" 132 | "supports-preserve-symlinks-flag" "^1.0.0" 133 | 134 | "shelljs@^0.8.5": 135 | "integrity" "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==" 136 | "resolved" "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" 137 | "version" "0.8.5" 138 | dependencies: 139 | "glob" "^7.0.0" 140 | "interpret" "^1.0.0" 141 | "rechoir" "^0.6.2" 142 | 143 | "supports-preserve-symlinks-flag@^1.0.0": 144 | "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" 145 | "resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" 146 | "version" "1.0.0" 147 | 148 | "wrappy@1": 149 | "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 150 | "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 151 | "version" "1.0.2" 152 | --------------------------------------------------------------------------------