11#!/usr/bin/env node
22'use strict' ;
3- var __importDefault =
4- ( this && this . __importDefault ) ||
5- function ( mod ) {
6- return mod && mod . __esModule ? mod : { default : mod } ;
7- } ;
8- Object . defineProperty ( exports , '__esModule' , { value : true } ) ;
3+ var __importDefault = ( this && this . __importDefault ) || function ( mod ) {
4+ return ( mod && mod . __esModule ) ? mod : { "default" : mod } ;
5+ } ;
6+ Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
97const LogColor = '\x1b[32m' ;
10- const child_process_1 = require ( ' child_process' ) ;
11- const fs_extra_1 = __importDefault ( require ( ' fs-extra' ) ) ;
12- const path_1 = __importDefault ( require ( ' path' ) ) ;
13- const yargs_1 = __importDefault ( require ( ' yargs' ) ) ;
8+ const child_process_1 = require ( " child_process" ) ;
9+ const fs_extra_1 = __importDefault ( require ( " fs-extra" ) ) ;
10+ const path_1 = __importDefault ( require ( " path" ) ) ;
11+ const yargs_1 = __importDefault ( require ( " yargs" ) ) ;
1412const argv = yargs_1 . default
15- . help ( )
16- . option ( 'name' , {
13+ . help ( )
14+ . option ( 'name' , {
1715 alias : 'n' ,
1816 description : 'Name of the app' ,
1917 type : 'string' ,
20- } )
21- . alias ( 'help' , 'h' ) . argv ;
18+ } )
19+ . alias ( 'help' , 'h' ) . argv ;
2220if ( ! argv . name ) {
23- console . log ( 'You should specify the name of the app with --name' ) ;
24- process . exit ( ) ;
21+ console . log ( 'You should specify the name of the app with --name' ) ;
22+ process . exit ( ) ;
2523}
2624// run the app ;)
2725app ( ) ;
2826async function app ( ) {
29- const appName = argv . name ;
30- const appNameWeb = appName + '-web-will-be-deleted-afterwards' ;
31- logSpaced ( `
27+ const appName = argv . name ;
28+ const appNameWeb = appName + '-web-will-be-deleted-afterwards' ;
29+ logSpaced ( `
3230 Creating ${ appName } , brought to you by webRidge.
3331
3432 Please wait till everything is finished :)
3533
3634 ` ) ;
37- try {
38- await Promise . all ( [
39- createReactNativeApp ( appName ) ,
40- createReactScriptsApp ( appNameWeb ) ,
41- ] ) ;
42- } catch ( error ) {
43- console . log ( 'Could not create React Native project' , { error } ) ;
44- }
45- logSpaced (
46- "Created two projects in two directories. Let's merge them to one project ;)"
47- ) ;
48- const webPackagePath = appNameWeb + '/package.json' ;
49- const webPackageFile = fs_extra_1 . default . readFileSync (
50- webPackagePath ,
51- 'utf8'
52- ) ;
53- const webPackageJSON = JSON . parse ( webPackageFile ) ;
54- const removePackages = [ 'web-vitals' ] ;
55- const webDependencies = Object . keys ( webPackageJSON . dependencies )
56- . filter ( ( packageName ) => ! removePackages . includes ( packageName ) )
57- . map ( ( packageName ) => ( {
58- name : packageName ,
59- version : webPackageJSON . dependencies [ packageName ] ,
60- isDev : packageName . includes ( '@testing-library' ) ,
35+ try {
36+ await Promise . all ( [
37+ createReactNativeApp ( appName ) ,
38+ createReactScriptsApp ( appNameWeb ) ,
39+ ] ) ;
40+ }
41+ catch ( error ) {
42+ console . log ( 'Could not create React Native project' , { error } ) ;
43+ }
44+ logSpaced ( "Created two projects in two directories. Let's merge them to one project ;)" ) ;
45+ const webPackagePath = appNameWeb + '/package.json' ;
46+ const webPackageFile = fs_extra_1 . default . readFileSync ( webPackagePath , 'utf8' ) ;
47+ const webPackageJSON = JSON . parse ( webPackageFile ) ;
48+ const removePackages = [ 'web-vitals' ] ;
49+ const webDependencies = Object . keys ( webPackageJSON . dependencies )
50+ . filter ( ( packageName ) => ! removePackages . includes ( packageName ) )
51+ . map ( ( packageName ) => ( {
52+ name : packageName ,
53+ version : webPackageJSON . dependencies [ packageName ] ,
54+ isDev : packageName . includes ( '@testing-library' ) ,
6155 } ) ) ;
62- const reactNativePackagePath = appName + '/package.json' ;
63- const reactNativePackageFile = fs_extra_1 . default . readFileSync (
64- reactNativePackagePath ,
65- 'utf8'
66- ) ;
67- const reactNativePackageJSON = JSON . parse ( reactNativePackageFile ) ;
68- let webScripts = replaceValuesOfObject (
69- prefixObject ( webPackageJSON . scripts , 'web:' ) ,
70- 'react-scripts' ,
71- 'react-app-rewired'
72- ) ;
73- // more like yarn android, yarn ios, yarn web
74- //@ts -ignore
75- let webStartCommand = webScripts [ 'web:start' ] ;
76- delete webScripts [ 'web:start' ] ;
77- //@ts -ignore
78- webScripts . web = webStartCommand ;
79- // console.log({ webScripts });
80- const mergedPackageJSON = {
81- ...reactNativePackageJSON ,
82- // we're gonna merge scripts and dependencies ourself :)
83- ...excludeObjectKeys ( webPackageJSON , [ 'dependencies' , 'scripts' , 'name' ] ) ,
84- scripts : {
85- ...reactNativePackageJSON . scripts ,
86- ...webScripts ,
87- } ,
88- } ;
89- // write merged package.json down
90- fs_extra_1 . default . writeFileSync (
91- reactNativePackagePath ,
92- JSON . stringify ( mergedPackageJSON )
93- ) ;
94- // install web packages to native project
95- await installPackages (
96- [
97- ...webDependencies ,
98- { name : 'react-native-web' } ,
99- { name : 'react-app-rewired' , isDev : true } ,
100- { name : 'customize-cra' , isDev : true } ,
101- { name : 'typescript' , isDev : true } ,
102- { name : '@types/react-native' , isDev : true } ,
103- { name : '@types/react' , isDev : true } ,
104- { name : 'babel-plugin-import' , isDev : true } ,
105- ] ,
106- appName
107- ) ;
108- // copy template files
109- const templateDir =
110- path_1 . default . dirname ( require . main . filename ) + '/template' ;
111- logSpaced ( { templateDir } ) ;
112- fs_extra_1 . default . copySync ( templateDir , appName ) ;
113- fs_extra_1 . default . copySync ( appNameWeb + '/public' , appName + '/public' ) ;
114- fs_extra_1 . default . unlinkSync ( appName + '/App.js' ) ;
115- fs_extra_1 . default . removeSync ( appNameWeb ) ;
116- logSpaced ( "Yeah!! We're done!" ) ;
117- logSpaced ( `
56+ const reactNativePackagePath = appName + '/package.json' ;
57+ const reactNativePackageFile = fs_extra_1 . default . readFileSync ( reactNativePackagePath , 'utf8' ) ;
58+ const reactNativePackageJSON = JSON . parse ( reactNativePackageFile ) ;
59+ let webScripts = replaceValuesOfObject ( prefixObject ( webPackageJSON . scripts , 'web:' ) , 'react-scripts' , 'react-app-rewired' ) ;
60+ // more like yarn android, yarn ios, yarn web
61+ //@ts -ignore
62+ let webStartCommand = webScripts [ 'web:start' ] ;
63+ delete webScripts [ 'web:start' ] ;
64+ //@ts -ignore
65+ webScripts . web = webStartCommand ;
66+ // console.log({ webScripts });
67+ const mergedPackageJSON = {
68+ ...reactNativePackageJSON ,
69+ // we're gonna merge scripts and dependencies ourself :)
70+ ...excludeObjectKeys ( webPackageJSON , [ 'dependencies' , 'scripts' , 'name' ] ) ,
71+ scripts : {
72+ ...reactNativePackageJSON . scripts ,
73+ ...webScripts ,
74+ } ,
75+ } ;
76+ // write merged package.json down
77+ fs_extra_1 . default . writeFileSync ( reactNativePackagePath , JSON . stringify ( mergedPackageJSON ) ) ;
78+ // install web packages to native project
79+ await installPackages ( [
80+ ...webDependencies ,
81+ { name : 'react-native-web' } ,
82+ { name : 'react-app-rewired' , isDev : true } ,
83+ { name : 'customize-cra' , isDev : true } ,
84+ { name : 'typescript' , isDev : true } ,
85+ { name : '@types/react-native' , isDev : true } ,
86+ { name : '@types/react' , isDev : true } ,
87+ { name : 'babel-plugin-import' , isDev : true } ,
88+ ] , appName ) ;
89+ // copy template files
90+ const templateDir = path_1 . default . dirname ( require . main . filename ) + '/template' ;
91+ logSpaced ( { templateDir } ) ;
92+ fs_extra_1 . default . copySync ( templateDir , appName ) ;
93+ fs_extra_1 . default . copySync ( appNameWeb + '/public' , appName + '/public' ) ;
94+ fs_extra_1 . default . unlinkSync ( appName + '/App.js' ) ;
95+ fs_extra_1 . default . removeSync ( appNameWeb ) ;
96+ logSpaced ( "Yeah!! We're done!" ) ;
97+ logSpaced ( `
11898 Start your app with by going to the created directory: 'cd ${ appName } '
11999
120100 yarn android
@@ -126,104 +106,85 @@ async function app() {
126106 ` ) ;
127107}
128108async function installPackages ( packages , directory ) {
129- await installPackagesAdvanced (
130- packages . filter ( ( p ) => p . isDev === true ) ,
131- directory ,
132- true
133- ) ;
134- await installPackagesAdvanced (
135- packages . filter ( ( p ) => ! p . isDev ) ,
136- directory ,
137- false
138- ) ;
109+ await installPackagesAdvanced ( packages . filter ( ( p ) => p . isDev === true ) , directory , true ) ;
110+ await installPackagesAdvanced ( packages . filter ( ( p ) => ! p . isDev ) , directory , false ) ;
139111}
140112async function installPackagesAdvanced ( packages , directory , dev ) {
141- return new Promise ( ( resolve , reject ) => {
142- const joinedPackages = packages . map (
143- ( p ) => p . name + ( p . version ? `@${ p . version } ` : `` )
144- ) ;
145- // console.log({ joinedPackages });
146- const createReactNativeProcess = child_process_1 . spawn (
147- 'yarn' ,
148- [
149- '--cwd' ,
150- directory ,
151- 'add' ,
152- ...joinedPackages ,
153- dev ? '--dev' : undefined ,
154- ] . filter ( ( n ) => ! ! n ) ,
155- { stdio : 'inherit' , shell : true }
156- ) ;
157- createReactNativeProcess . on ( 'error' , function ( error ) {
158- reject ( error ) ;
113+ return new Promise ( ( resolve , reject ) => {
114+ const joinedPackages = packages . map ( ( p ) => p . name + ( p . version ? `@${ p . version } ` : `` ) ) ;
115+ // console.log({ joinedPackages });
116+ const createReactNativeProcess = child_process_1 . spawn ( spawnPlatform ( 'yarn' ) , [
117+ '--cwd' ,
118+ directory ,
119+ 'add' ,
120+ ...joinedPackages ,
121+ dev ? '--dev' : undefined ,
122+ ] . filter ( ( n ) => ! ! n ) , { stdio : 'inherit' , shell : true } ) ;
123+ createReactNativeProcess . on ( 'error' , function ( error ) {
124+ reject ( error ) ;
125+ } ) ;
126+ createReactNativeProcess . on ( 'exit' , function ( response ) {
127+ resolve ( response ) ;
128+ } ) ;
159129 } ) ;
160- createReactNativeProcess . on ( 'exit' , function ( response ) {
161- resolve ( response ) ;
162- } ) ;
163- } ) ;
164130}
165131async function createReactNativeApp ( appName ) {
166- return new Promise ( ( resolve , reject ) => {
167- const createReactNativeProcess = child_process_1 . spawn (
168- 'npx' ,
169- [ 'react-native' , 'init' , appName ] ,
170- { stdio : 'inherit' , shell : true }
171- ) ;
172- createReactNativeProcess . on ( 'error' , function ( error ) {
173- reject ( error ) ;
174- } ) ;
175- createReactNativeProcess . on ( 'exit' , function ( response ) {
176- resolve ( response ) ;
132+ return new Promise ( ( resolve , reject ) => {
133+ const createReactNativeProcess = child_process_1 . spawn ( spawnPlatform ( 'npx' ) , [ 'react-native' , 'init' , appName ] , { stdio : 'inherit' , shell : true } ) ;
134+ createReactNativeProcess . on ( 'error' , function ( error ) {
135+ reject ( error ) ;
136+ } ) ;
137+ createReactNativeProcess . on ( 'exit' , function ( response ) {
138+ resolve ( response ) ;
139+ } ) ;
177140 } ) ;
178- } ) ;
179141}
180142async function createReactScriptsApp ( appName ) {
181- return new Promise ( function ( resolve , reject ) {
182- const createReactNativeProcess = child_process_1 . spawn (
183- 'npx' ,
184- [ 'create-react-app' , appName ] ,
185- { stdio : 'inherit' , shell : true }
186- ) ;
187- createReactNativeProcess . on ( 'error' , function ( error ) {
188- reject ( error ) ;
143+ return new Promise ( function ( resolve , reject ) {
144+ const createReactNativeProcess = child_process_1 . spawn ( spawnPlatform ( 'npx' ) , [ 'create-react-app' , appName ] , { stdio : 'inherit' , shell : true } ) ;
145+ createReactNativeProcess . on ( 'error' , function ( error ) {
146+ reject ( error ) ;
147+ } ) ;
148+ createReactNativeProcess . on ( 'exit' , function ( response ) {
149+ resolve ( response ) ;
150+ } ) ;
189151 } ) ;
190- createReactNativeProcess . on ( 'exit' , function ( response ) {
191- resolve ( response ) ;
192- } ) ;
193- } ) ;
194152}
195-
153+ function spawnPlatform ( s ) {
154+ const isWin = process . platform === 'win32' ;
155+ if ( isWin ) {
156+ return s + '.cmd' ;
157+ }
158+ return s ;
159+ }
196160function logSpaced ( args ) {
197- console . log ( '' ) ;
198- console . log ( LogColor , args ) ;
199- console . log ( '' ) ;
161+ console . log ( '' ) ;
162+ console . log ( LogColor , args ) ;
163+ console . log ( '' ) ;
200164}
201-
202165function excludeObjectKeys ( object , ignoredKeys ) {
203- let newObject = { ...object } ;
204- ignoredKeys . forEach ( function ( key ) {
205- delete newObject [ key ] ;
206- } ) ;
207- return newObject ;
166+ let newObject = { ...object } ;
167+ ignoredKeys . forEach ( function ( key ) {
168+ delete newObject [ key ] ;
169+ } ) ;
170+ return newObject ;
208171}
209-
210172function replaceValuesOfObject ( object , search , replace ) {
211- let newObject = { } ;
212- Object . keys ( object ) . forEach ( ( key ) => {
213- // console.log({ key });
214- const value = object [ key ] ;
215- // console.log({ value });
216- if ( value ) {
217- newObject [ key ] = value . replace ? value . replace ( search , replace ) : value ;
218- }
219- } ) ;
220- return newObject ;
173+ let newObject = { } ;
174+ Object . keys ( object ) . forEach ( ( key ) => {
175+ // console.log({ key });
176+ const value = object [ key ] ;
177+ // console.log({ value });
178+ if ( value ) {
179+ newObject [ key ] = value . replace ? value . replace ( search , replace ) : value ;
180+ }
181+ } ) ;
182+ return newObject ;
221183}
222-
223184function prefixObject ( object , prefix ) {
224- let newObject = { } ;
225- Object . keys ( object ) . forEach ( ( key ) => {
226- newObject [ prefix + key ] = object [ key ] ;
227- } ) ;
228- return newObject ;
185+ let newObject = { } ;
186+ Object . keys ( object ) . forEach ( ( key ) => {
187+ newObject [ prefix + key ] = object [ key ] ;
188+ } ) ;
189+ return newObject ;
229190}
0 commit comments