rucken
Version:
Console tools and scripts for nx and not only that I (EndyKaufman) use to automate the workflow and speed up the development process
312 lines (311 loc) • 16 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CopyPasteService = void 0;
const tslib_1 = require("tslib");
const common_1 = require("@nestjs/common");
const case_anything_1 = require("case-anything");
const crypto_1 = require("crypto");
const fs_1 = require("fs");
const log4js_1 = require("log4js");
const path_1 = require("path");
const pluralize_1 = tslib_1.__importDefault(require("pluralize"));
const recursive_readdir_1 = tslib_1.__importDefault(require("recursive-readdir"));
const sort_paths_1 = tslib_1.__importDefault(require("sort-paths"));
const utils_service_1 = require("../utils/utils.service");
const glob_1 = require("glob");
let CopyPasteService = class CopyPasteService {
constructor(utilsService) {
this.utilsService = utilsService;
}
setLogger(command) {
this.logger = (0, log4js_1.getLogger)(command);
this.logger.level = utils_service_1.UtilsService.logLevel();
}
copyPasteHandler({ path, find, findPlural, replace, replacePlural, destPath, extensions, cases, globRules, replaceEnvs, }) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
this.logger.info('Start copy past files...');
this.logger.debug(`Config: ${JSON.stringify({
path,
find,
findPlural,
replace,
replacePlural,
destPath,
extensions,
cases,
globRules,
replaceEnvs,
})}`);
yield this.process({
path,
find,
findPlural,
replace,
replacePlural,
destPath,
extensions,
cases,
globRules,
replaceEnvs,
});
this.logger.info('End of copy paste files...');
});
}
process({ path, find, findPlural, replace, replacePlural, destPath, extensions, cases, globRules, replaceEnvs, }) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
if (!findPlural) {
findPlural = (0, pluralize_1.default)(find);
}
if (!replacePlural) {
replacePlural = (0, pluralize_1.default)(replace);
}
if (!path) {
path = '.';
}
if (destPath && destPath[0] === '.' && path[0] !== '.') {
destPath = (0, path_1.resolve)((0, path_1.join)(destPath, (0, path_1.basename)(path)));
}
else {
if (destPath && destPath[0] === path_1.sep && path[0] !== path_1.sep) {
destPath = (0, path_1.resolve)((0, path_1.join)((0, path_1.dirname)(path), (0, path_1.basename)(destPath)));
}
else {
if ((destPath === null || destPath === void 0 ? void 0 : destPath.startsWith('.')) &&
(0, path_1.dirname)(destPath) == (0, path_1.dirname)(path) &&
destPath !== path) {
destPath = (0, path_1.resolve)(destPath);
}
else {
if (!destPath || !(0, fs_1.existsSync)((0, path_1.resolve)(destPath))) {
destPath = (0, path_1.resolve)(path);
}
}
}
}
extensions = extensions.map((extension) => extension.toUpperCase());
path = (0, path_1.resolve)(path);
let allResultReplacedTexts = [];
// collect all filepaths
let files = globRules
? yield (0, glob_1.glob)((0, path_1.join)(path, globRules))
: yield (0, recursive_readdir_1.default)(path);
files = (0, sort_paths_1.default)(files, path_1.sep);
allResultReplacedTexts = this.collectFilepaths(files, extensions, path, destPath, find, findPlural, replace, replacePlural, cases, allResultReplacedTexts);
// replace content
for (let file of files) {
file = file.split(path_1.sep).join('/');
const fileExt = file.split('.').pop().toUpperCase();
if (extensions[0] === '*' || extensions.includes(fileExt)) {
let { destFile } = this.getDestFile(allResultReplacedTexts, destPath, file, path, find, findPlural, replace, replacePlural, cases);
const content = (0, fs_1.readFileSync)(file).toString();
let destContent = this.getDestContent(content, allResultReplacedTexts, find, findPlural, replace, replacePlural, cases);
if (replaceEnvs) {
const findStrings = Object.entries(process.env).map(([key]) => replaceEnvs.replace('key', key));
const replaceStrings = Object.entries(process.env).map(([key, value]) => this.utilsService.replaceEnv(value));
for (let index = 0; index < findStrings.length; index++) {
const findString = findStrings[index];
const replaceString = replaceStrings[index];
destFile = destFile.split(findString).join(replaceString);
destContent = destContent.split(findString).join(replaceString);
}
}
if (file !== destFile) {
this.logger.log(`${file}(${content.length}) => ${destFile}(${destContent.length})`);
if (!(0, fs_1.existsSync)((0, path_1.dirname)(destFile))) {
(0, fs_1.mkdirSync)((0, path_1.dirname)(destFile), { recursive: true });
}
(0, fs_1.writeFileSync)(destFile, destContent);
}
}
}
});
}
getDestContent(content, allResultReplacedTexts, find, findPlural, replace, replacePlural, cases) {
let destContent = content;
// first we should replace all paths
for (const allResultReplacedText of allResultReplacedTexts) {
destContent = destContent.replace(new RegExp(`${path_1.sep}${allResultReplacedText.from}`, 'g'), `${path_1.sep}${allResultReplacedText.toMd5}`);
}
// collect replace markers
const result = this.replace({
text: destContent,
find,
findPlural,
replace,
replacePlural,
cases,
mode: 'content',
});
destContent = result.newText;
const resultReplacedTexts = result.resultReplacedTexts;
// replace all markers to replaced text for paths
for (const allResultReplacedText of allResultReplacedTexts) {
destContent = destContent.replace(new RegExp(`${path_1.sep}${allResultReplacedText.toMd5}`, 'g'), `${path_1.sep}${allResultReplacedText.to}`);
}
// replace all markers to replaced text for content
for (const allResultReplacedText of allResultReplacedTexts) {
destContent = destContent.replace(new RegExp(allResultReplacedText.toMd5, 'g'), allResultReplacedText.to);
}
// replace markers to replaced text for content
for (const allResultReplacedText of resultReplacedTexts) {
destContent = destContent.replace(new RegExp(allResultReplacedText.toMd5, 'g'), allResultReplacedText.to);
}
return destContent;
}
getDestFile(allResultReplacedTexts, destPath, file, path, find, findPlural, replace, replacePlural, cases) {
for (const allResultReplacedText of allResultReplacedTexts) {
destPath = destPath.replace(new RegExp(`${path_1.sep}${allResultReplacedText.from}`, 'g'), `${path_1.sep}${allResultReplacedText.toMd5}`);
}
const result = this.replace({
text: file.replace(path, destPath),
find,
findPlural,
replace,
replacePlural,
cases,
mode: 'filepath',
});
const filesResultReplacedTexts = result.resultReplacedTexts;
let destFile = result.newText;
for (const allResultReplacedText of allResultReplacedTexts) {
destPath = destPath.replace(new RegExp(`${path_1.sep}${allResultReplacedText.toMd5}`, 'g'), `${path_1.sep}${allResultReplacedText.to}`);
destFile = destFile.replace(new RegExp(allResultReplacedText.toMd5, 'g'), allResultReplacedText.to);
}
for (const allResultReplacedText of filesResultReplacedTexts) {
destFile = destFile.replace(new RegExp(allResultReplacedText.toMd5, 'g'), allResultReplacedText.to);
}
return { destFile };
}
collectFilepaths(files, extensions, path, destPath, find, findPlural, replace, replacePlural, cases, allResultReplacedTexts) {
for (let file of files) {
file = file.split(path_1.sep).join('/');
const fileExt = file.split('.').pop().toUpperCase();
if (extensions[0] === '*' || extensions.includes(fileExt)) {
const { resultReplacedTexts } = this.replace({
text: file.replace(path, destPath),
find,
findPlural,
replace,
replacePlural,
cases,
mode: 'filepath',
});
allResultReplacedTexts = [
...allResultReplacedTexts,
...resultReplacedTexts,
];
}
}
return allResultReplacedTexts;
}
replace({ text, find, findPlural, replace, replacePlural, cases, mode, }) {
let newText = text;
const functions = mode === 'filepath'
? [
//🥙 kebab-case
cases.includes('kebabCase') ? case_anything_1.kebabCase : undefined,
// 🐫 UpperCamelCase
cases.includes('upperCamelCase') ? case_anything_1.upperCamelCase : undefined,
// 🐍 snake_case
cases.includes('snakeCase') ? case_anything_1.snakeCase : undefined,
// 🐪 camelCase
cases.includes('camelCase') ? case_anything_1.camelCase : undefined,
// 🐫 PascalCase
cases.includes('pascalCase') ? case_anything_1.pascalCase : undefined,
// 📣 CONSTANT_CASE
cases.includes('constantCase') ? case_anything_1.constantCase : undefined,
// 🚂 Train-Case
cases.includes('trainCase') ? case_anything_1.trainCase : undefined,
// 🕊 Ada_Case
cases.includes('adaCase') ? case_anything_1.adaCase : undefined,
// 👔 COBOL-CASE
cases.includes('cobolCase') ? case_anything_1.cobolCase : undefined,
// 📍 Dot.notation
cases.includes('dotNotation') ? case_anything_1.dotNotation : undefined,
// 🛰 Space case
cases.includes('spaceCase') ? case_anything_1.spaceCase : undefined,
// 🏛 Capital Case
cases.includes('capitalCase') ? case_anything_1.capitalCase : undefined,
// 🔡 lower case
cases.includes('lowerCase') ? case_anything_1.lowerCase : undefined,
// 🔠 UPPER CASE
cases.includes('upperCase') ? case_anything_1.upperCase : undefined,
// 📂 Path/case
cases.includes('pathCase') ? case_anything_1.pathCase : undefined,
].filter((func) => Boolean(Boolean) && typeof func === 'function')
: [
// 🐪 camelCase
cases.includes('camelCase') ? case_anything_1.camelCase : undefined,
// 🐫 PascalCase
cases.includes('pascalCase') ? case_anything_1.pascalCase : undefined,
// 🐫 UpperCamelCase
cases.includes('upperCamelCase') ? case_anything_1.upperCamelCase : undefined,
//🥙 kebab-case
cases.includes('kebabCase') ? case_anything_1.kebabCase : undefined,
// 🐍 snake_case
cases.includes('snakeCase') ? case_anything_1.snakeCase : undefined,
// 📣 CONSTANT_CASE
cases.includes('constantCase') ? case_anything_1.constantCase : undefined,
// 🚂 Train-Case
cases.includes('trainCase') ? case_anything_1.trainCase : undefined,
// 🕊 Ada_Case
cases.includes('adaCase') ? case_anything_1.adaCase : undefined,
// 👔 COBOL-CASE
cases.includes('cobolCase') ? case_anything_1.cobolCase : undefined,
// 📍 Dot.notation
cases.includes('dotNotation') ? case_anything_1.dotNotation : undefined,
// 📂 Path/case
cases.includes('pathCase') ? case_anything_1.pathCase : undefined,
// 🛰 Space case
cases.includes('spaceCase') ? case_anything_1.spaceCase : undefined,
// 🏛 Capital Case
cases.includes('capitalCase') ? case_anything_1.capitalCase : undefined,
// 🔡 lower case
cases.includes('lowerCase') ? case_anything_1.lowerCase : undefined,
// 🔠 UPPER CASE
cases.includes('upperCase') ? case_anything_1.upperCase : undefined,
].filter((func) => Boolean(Boolean) && typeof func === 'function');
const resultReplacedTexts = [];
// plural
for (const item of functions) {
const func = (string, options) => mode === 'filepath'
? item((0, case_anything_1.camelCase)(string), options)
: item((0, case_anything_1.camelCase)(string), options);
const from = func(findPlural, { keepSpecialCharacters: true });
const to = func(replacePlural, { keepSpecialCharacters: true });
const toMd5 = (0, crypto_1.createHash)('md5').update(to).digest('hex');
const replacedText = newText.replace(new RegExp(mode === 'filepath'
? from
: // eslint-disable-next-line no-useless-escape
from.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), toMd5);
if (newText !== replacedText) {
resultReplacedTexts.push({ from, to, toMd5 });
}
newText = replacedText;
}
// singular
for (const item of functions) {
const func = (string, options) => mode === 'filepath'
? item((0, case_anything_1.camelCase)(string), options)
: item((0, case_anything_1.camelCase)(string), options);
const from = func(find, { keepSpecialCharacters: true });
const to = func(replace, { keepSpecialCharacters: true });
const toMd5 = (0, crypto_1.createHash)('md5').update(to).digest('hex');
const replacedText = newText.replace(new RegExp(mode === 'filepath'
? from
: // eslint-disable-next-line no-useless-escape
from.replace(/[-_\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), toMd5);
if (newText !== replacedText) {
resultReplacedTexts.push({ from, to, toMd5 });
}
newText = replacedText;
}
return { newText, resultReplacedTexts };
}
};
CopyPasteService.title = 'copy-paste';
CopyPasteService = tslib_1.__decorate([
(0, common_1.Injectable)(),
tslib_1.__metadata("design:paramtypes", [utils_service_1.UtilsService])
], CopyPasteService);
exports.CopyPasteService = CopyPasteService;