@dialpad/dialtone-css
Version:
Dialpad's design system
136 lines (123 loc) • 4.2 kB
JavaScript
import chalk from 'chalk';
import {
confirmStart,
doPatternSearch,
error,
findMatchedFiles,
getConfigFileList,
getAllFileContents,
inquireForFile,
modifyFileContents,
readConfigFile,
} from './helpers.mjs';
import ora from 'ora';
import { dirname, normalize } from 'path';
import { fileURLToPath } from 'url';
import { hideBin } from 'yargs/helpers';
import yargs from 'yargs';
// eslint-disable-next-line complexity
(async () => {
// get command line args
const argv = yargs(hideBin(process.argv))
.scriptName('dialtone-migration-helper')
.usage(
'$0 --cwd "../root/directory" --include "file1.ext" "**/*.ext2" --ignore "**/ignored/**", "**/another_ignored/**"',
)
.options({
cwd: {
type: 'string',
description: 'Root directory for scan. Defaults to CWD.',
default: process.cwd(),
},
include: {
type: 'array',
description: 'Glob patters to include during search, if omitted, will include all the files on the CWD.',
},
ignore: {
type: 'array',
description: 'Other glob patterns to ignore during search. .gitignore included by default.',
},
force: {
boolean: true,
description: 'Skip interactive prompts, use caution!',
default: false,
},
})
.help().argv;
// get list of configuration files
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const CONFIG_FOLDER = __dirname + '/configs';
const configList = await getConfigFileList(CONFIG_FOLDER).catch((err) =>
error('getConfigFileList: ' + err),
);
// load configuration from arg or list
const [configData, configFile] = await inquireForFile(CONFIG_FOLDER, configList)
.catch((err) =>
error('inquireForFile: ' + err),
);
// set up some globby defaults
configData.globbyConfig = configData.globbyConfig || {};
configData.globbyConfig.gitignore = configData.globbyConfig.gitignore || true;
console.log(
`\n${chalk.green('++')} Configuration Loaded! (${configFile}) ${chalk.green('++')}\n`,
);
// take CWD if specified from command line
const cwd = !argv.cwd ? process.cwd() : normalize(argv.cwd);
configData.globbyConfig.cwd = configData.globbyConfig.cwd || cwd;
// push include list to configuration array
if (argv.include) {
configData.patterns = argv.include;
}
// push ignore list to configuration array
if (argv.ignore) {
configData.globbyConfig.ignore = argv.ignore;
}
// run glob search with configData.patterns
const globSpinner = ora('Performing pattern search').start();
const files = await doPatternSearch(configData).then((f) => {
return findMatchedFiles(f, configData);
});
if (files.length <= 0) {
console.log(
'\n' +
chalk.cyan('??') +
' No matches found! Check your patterns and cwd settings if you think this is an error ' +
`patterns: [${configData.patterns}] | cwd: [${configData.globbyConfig.cwd}] `,
);
process.exit(0);
}
globSpinner.stop();
console.log(`[ ${chalk.whiteBright(files.length)} ] files queued for modification:\n`);
console.log(files);
console.log(
`\n${chalk.yellow('Configuration Description')}${chalk.gray(':')}\n${configData.description}\n`,
);
// kick off file search and replace
const startModification = () => {
console.log(`\n${chalk.blue('__')} Starting ...`);
getAllFileContents(files, configData.globbyConfig.cwd)
.then((content) => {
modifyFileContents(content, configData.expressions).then(() => {
console.log(`${chalk.magenta('==')} Modification complete!\n`);
});
})
.catch((err) => error('getAllFileContents: ' + err));
};
// begin file modification based on configuration rules
// start automatically if --force is specified
if (!argv.force) {
confirmStart()
.then((val) => {
if (val) {
startModification();
} else {
console.log(`\n${chalk.red('__')} Cancelling ...\n`);
}
})
.catch((err) => error('confirmStart ' + err));
} else {
startModification();
}
})();