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