1*eeffdb10STomasz Sapetaimport * as fs from 'fs-extra'; 2*eeffdb10STomasz Sapetaimport * as path from 'path'; 3*eeffdb10STomasz Sapetaimport chalk from 'chalk'; 4*eeffdb10STomasz Sapeta 5*eeffdb10STomasz Sapetaimport configureModule from './configureModule'; 6*eeffdb10STomasz Sapetaimport fetchTemplate from './fetchTemplate'; 7*eeffdb10STomasz Sapetaimport promptQuestionsAsync from './promptQuestionsAsync'; 8*eeffdb10STomasz Sapetaimport { PACKAGES_DIR, EXPO_DIR } from '../Constants'; 9*eeffdb10STomasz Sapeta 10*eeffdb10STomasz Sapetaconst TEMPLATE_PACKAGE_NAME = 'expo-module-template'; 11*eeffdb10STomasz Sapeta 12*eeffdb10STomasz Sapetaexport default async function generateModuleAsync( 13*eeffdb10STomasz Sapeta newModuleProjectDir: string, 14*eeffdb10STomasz Sapeta options: { template?: string; useLocalTemplate?: boolean } 15*eeffdb10STomasz Sapeta) { 16*eeffdb10STomasz Sapeta console.log( 17*eeffdb10STomasz Sapeta `Creating new unimodule under ${chalk.magenta(path.relative(EXPO_DIR, newModuleProjectDir))}...` 18*eeffdb10STomasz Sapeta ); 19*eeffdb10STomasz Sapeta 20*eeffdb10STomasz Sapeta let templatePath: string | undefined; 21*eeffdb10STomasz Sapeta 22*eeffdb10STomasz Sapeta if (options.template) { 23*eeffdb10STomasz Sapeta console.log(`Using custom module template: ${chalk.blue(options.template)}`); 24*eeffdb10STomasz Sapeta templatePath = options.template; 25*eeffdb10STomasz Sapeta } else if (options.useLocalTemplate) { 26*eeffdb10STomasz Sapeta templatePath = path.join(PACKAGES_DIR, TEMPLATE_PACKAGE_NAME); 27*eeffdb10STomasz Sapeta 28*eeffdb10STomasz Sapeta console.log( 29*eeffdb10STomasz Sapeta `Using local module template from ${chalk.blue(path.relative(EXPO_DIR, templatePath))}` 30*eeffdb10STomasz Sapeta ); 31*eeffdb10STomasz Sapeta } 32*eeffdb10STomasz Sapeta 33*eeffdb10STomasz Sapeta const newModulePathFromArgv = newModuleProjectDir && path.resolve(newModuleProjectDir); 34*eeffdb10STomasz Sapeta const newModuleName = newModulePathFromArgv && path.basename(newModulePathFromArgv); 35*eeffdb10STomasz Sapeta const newModuleParentPath = newModulePathFromArgv 36*eeffdb10STomasz Sapeta ? path.dirname(newModulePathFromArgv) 37*eeffdb10STomasz Sapeta : process.cwd(); 38*eeffdb10STomasz Sapeta 39*eeffdb10STomasz Sapeta const configuration = await promptQuestionsAsync(newModuleName); 40*eeffdb10STomasz Sapeta const newModulePath = path.resolve(newModuleParentPath, configuration.npmModuleName); 41*eeffdb10STomasz Sapeta if (fs.existsSync(newModulePath)) { 42*eeffdb10STomasz Sapeta throw new Error(`Module '${newModulePath}' already exists!`); 43*eeffdb10STomasz Sapeta } 44*eeffdb10STomasz Sapeta 45*eeffdb10STomasz Sapeta await fetchTemplate(newModulePath, templatePath); 46*eeffdb10STomasz Sapeta 47*eeffdb10STomasz Sapeta await configureModule(newModulePath, configuration); 48*eeffdb10STomasz Sapeta} 49