UNPKG

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
"use strict"; 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;