import path from 'path'; import fs from 'fs-extra'; import { NPMExecutor } from '@squeebot/core/lib/npm'; import { defaultEnvironment } from '../default/environment.default'; import { gitignore } from '../default/gitignore.default'; import { tsConfig } from '../default/tsconfig.default'; import { REPOSITORY_SCHEMA } from './constants'; /** * Create a new repository, complete with typescript and git. * @param name Repository name * @param location Repository path * @param typescript Use typescript */ export async function newRepository( name: string, location?: string, typescript = true): Promise { if (!name) { throw new Error('Repository needs a name!'); } if (!location) { location = name; } location = path.resolve(process.cwd(), location); console.log('Creating a new repository development environment at', location); await fs.ensureDir(location); const env = defaultEnvironment(location); console.log('Creating package.json and installing base requirements'); const executor = new NPMExecutor(env, '@squeebot/core'); await executor.loadPackageFile(); let gitIgnore = gitignore + ''; if (typescript) { console.log('Installing TypeScript support'); await executor.installPackage('typescript'); await fs.writeJson(path.join(location, 'tsconfig.json'), tsConfig); gitIgnore += '\n*.js'; gitIgnore += '\n!.eslintrc.js'; gitIgnore += '\n*.d.ts'; gitIgnore += '\n*.tsbuildinfo'; gitIgnore += '\n'; console.log('Adding TypeScript scripts to package.json'); const pkgjson = path.join(location, 'package.json'); const contents = await fs.readJson(pkgjson); contents.scripts = { build: 'tsc', watch: 'tsc -w', }; await fs.writeJson(pkgjson, contents, { spaces: 2 }); } console.log('Creating .gitignore'); await fs.writeFile(path.join(location, '.gitignore'), gitIgnore); console.log('Writing build metadata'); await fs.writeJson(path.join(location, 'squeebot.repo.json'), { name, plugins: [], typescript, $schema: REPOSITORY_SCHEMA, }, { spaces: 2 }); console.log('\nDone! Your repository "%s" lives at:', name, location); }