diff --git a/lib/snippets/copyright/index.ts b/lib/snippets/copyright/index.ts index 8b5bb78..8c08ca7 100644 --- a/lib/snippets/copyright/index.ts +++ b/lib/snippets/copyright/index.ts @@ -10,34 +10,44 @@ import { FileMapper } from './file_mapper'; import { CopyrightOptions } from './copyright_options'; export default class Copyright implements Snippet { + private options: CopyrightOptions | null = null; + private cwd: string = ''; + async start (cwd: string): Promise { - const options = (await this.load_options_file (cwd)) - || (await this.gather_options ()); + this.cwd = cwd; + await this.load_options_file(); + if (!this.options) + await this.gather_options (); await FileMapper.map_all_files ( - cwd, - Copyright.fix_file_license, - [ options ] + this.cwd, + this.fix_file_license.bind(this) ); + + if (await new Confirm({ + message: 'should those settings be saved for the next run?' + }).run()) { + this.save_options_file(); + } } - private async gather_options (): Promise { - const options = (new CopyrightOptions); - options.author = await new Input ({ message: 'author' }) + private async gather_options (): Promise { + this.options = (new CopyrightOptions); + this.options.author = await new Input ({ message: 'author' }) .run (); - options.email = await new Input ({ message: 'email' }) + this.options.email = await new Input ({ message: 'email' }) .run (); - options.company = await new Input ({ message: 'company' }) + this.options.company = await new Input ({ message: 'company' }) .run (); - options.software = await new Input ({ message: 'software name' }) + this.options.software = await new Input ({ message: 'software name' }) .run (); - options.has_license = await new Confirm ({ + this.options.has_license = await new Confirm ({ message: 'would you like to specify a license?' }) .run (); - if (options.has_license) { - options.license = await new AutoComplete ({ + if (this.options.has_license) { + this.options.license = await new AutoComplete ({ name: 'license', message: 'choose a license', limit: 10, @@ -45,33 +55,28 @@ export default class Copyright implements Snippet { }) .run (); } - - return options; } - private async load_options_file - (folder: string): Promise { - const file_path = path.join (folder, '.liconfig.json'); + private async load_options_file (): Promise { + const file_path = path.join (this.cwd, '.liconfig.json'); if (await fs.pathExists (file_path)) { - return JSON.parse ( + this.options = JSON.parse ( await fs.readFile (file_path, 'utf-8') ); } - return null; + this.options = 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 async save_options_file(): Promise { + const file_path = path.join (this.cwd, '.liconfig.json'); + await fs.writeFile (file_path, JSON.stringify (this.options, null, 2), 'utf-8'); } - private static fix_file_license ( + private fix_file_license ( data: string, - filename: string, - [ options ]: [CopyrightOptions] + filename: string ): string | null { const regex = /\/\*\s+\*\sCopyright[\s\S]*?\*\/\n{0,2}/gu; const shebang = /^#!.*?\n\n/gu; @@ -80,7 +85,7 @@ export default class Copyright implements Snippet { if (!(/\.(?:js|ts|mjs)$/u).test (filename) && !regex.test (data)) return null; return (shebang_line ? shebang_line[0] : '') - + CopyrightGenerator.get_copyright_notice (options) + + CopyrightGenerator.get_copyright_notice (this.options as CopyrightOptions) + data.replace (regex, '') .replace (shebang, ''); }