Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | import { getIO, setIO } from './io.js'; import { getTemplateDir, npmInstall, formatError, copyTemplate } from './util.js'; import type { IOMap, IOPath, IOInquirer } from './io.js' import type { CustomNodeSystemError } from './util.js'; import type { DistinctQuestion } from 'inquirer'; const TEMPLATE_DIR = '../../../templates'; const TEMPLATES = { 'typescript@4.8.4 + node@18.11.8': 'ts-node18', 'typescript@latest + node@latest': 'ts-node' }; interface FileExistsPromptArgs { message: string; dir: string; } const fileExistsPrompt = async ( { message, dir }: FileExistsPromptArgs ): Promise<void> => { const question: DistinctQuestion = { type: 'list', name: 'existsAction', message, choices: ['overwrite', 'abort'], default: 'overwrite' }; const { existsAction } = await getIO<IOInquirer>('inquirer').prompt<{ existsAction: 'overwrite' | 'abort' }>([question]); if (existsAction === 'overwrite') { await copyTemplate(dir, { force: true }); } else { process.stderr.write('Exiting...'); process.exit(1); } } interface CliConfig { io: IOMap; } const cli = async ({ io }: CliConfig) => { setIO(io); const templateQuestion = { type: 'list', name: 'templateName', message: 'What template do you want to use?', choices: Object.keys(TEMPLATES), default: Object.keys(TEMPLATES)[0], }; const { templateName } = await getIO<IOInquirer>('inquirer').prompt< { templateName: keyof typeof TEMPLATES } >([templateQuestion]); const templateDir = getTemplateDir(import.meta.url, TEMPLATE_DIR) const templatePath = getIO<IOPath>('path').resolve( templateDir, TEMPLATES[templateName] ); try { await copyTemplate(templatePath); } catch (e) { const error = (e as CustomNodeSystemError); switch (error.code) { // File-exists error case 'ERR_FS_CP_EEXIST': await fileExistsPrompt({ dir: templatePath, message: `${error.info['message']??''}. Do you want to overwrite?`, }); break; default: // Unknown error formatError(new Error( 'Failed copying template to current working directory', { cause: { error } } )); } } npmInstall(); return 0; }; export { cli }; |