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