├── .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 | [](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 | iOS |
88 |
89 | 
|
90 | 
|
91 | 
|
92 | 
|
93 |
94 | Android |
95 |
96 | 
|
97 | 
|
98 | 
|
99 | 
|
100 |
101 |
102 |
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 |
--------------------------------------------------------------------------------