88 lines
2.6 KiB
TypeScript

/* 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<void> {
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<CopyrightOptions> {
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<CopyrightOptions|null> {
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<void> {
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, '');
}
}