/* eslint-disable no-await-in-loop */ import path from 'path'; import fs from 'fs-extra'; import { Confirm, Input, AutoComplete } from 'enquirer'; // eslint-disable-next-line id-match import { findLicense } from 'license'; import { Snippet } from '../../Snippet'; import { CopyrightGenerator } from './copyright_generator'; import { FileMapper } from './file_mapper'; import { CopyrightOptions } from './copyright_options'; export default class Copyright implements Snippet { async start (cwd: string): Promise { const options = (await this.load_options_file (cwd)) || (await this.gather_options ()); await FileMapper.map_all_files ( cwd, Copyright.fix_file_license, [ options ] ); } private async gather_options (): Promise { const options = (new CopyrightOptions); options.author = await new Input ({ message: 'author' }) .run (); options.email = await new Input ({ message: 'email' }) .run (); options.company = await new Input ({ message: 'company' }) .run (); options.software = await new Input ({ message: 'software name' }) .run (); options.has_license = await new Confirm ({ message: 'would you like to specify a license?' }) .run (); if (options.has_license) { options.license = await new AutoComplete ({ name: 'license', message: 'choose a license', limit: 10, choices: findLicense ('') }) .run (); } return options; } private async load_options_file (folder: string): Promise { const file_path = path.join (folder, '.liconfig.json'); if (await fs.pathExists (file_path)) { return JSON.parse ( await fs.readFile (file_path, 'utf-8') ); } return null; } private async save_options_file (folder: string, options: CopyrightOptions): Promise { const file_path = path.join (folder, '.liconfig.json'); await fs.writeFile (file_path, JSON.stringify (options, null, 2), 'utf-8'); } private static fix_file_license ( data: string, filename: string, [ options ]: [CopyrightOptions] ): string | null { const regex = /\/\*\s+\*\sCopyright[\s\S]*?\*\/\n{0,2}/gu; const shebang = /^#!.*?\n\n/gu; const shebang_line = shebang.exec (data); if (!(/\.(?:js|ts|mjs)$/u).test (filename) && !regex.test (data)) return null; return (shebang_line ? shebang_line[0] : '') + CopyrightGenerator.get_copyright_notice (options) + data.replace (regex, '') .replace (shebang, ''); } }