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