boats
Version:
Beautiful Open / Async Template System - Write less yaml with BOATS and Nunjucks.
111 lines (110 loc) • 5.32 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const lodash_1 = tslib_1.__importDefault(require("lodash"));
const upath_1 = tslib_1.__importStar(require("upath"));
const lcFirst_1 = tslib_1.__importDefault(require("./lcFirst"));
const removeFileExtension_1 = tslib_1.__importDefault(require("./removeFileExtension"));
const constants_1 = require("./constants");
const StringStyle_1 = require("./enums/StringStyle");
const ucFirst_1 = tslib_1.__importDefault(require("./ucFirst"));
class UniqueOperationIds {
// eslint-disable-next-line max-lines-per-function
getUniqueOperationIdFromPath(input) {
const { stripValue, removeMethod, prefixes, firstSegmentSplit } = input;
const cwd = input.cwd || upath_1.default.toUnix(process.cwd());
const segmentStyle = input.segmentStyle || StringStyle_1.StringStyle.camelCase;
const style = input.style || StringStyle_1.StringStyle.camelCase;
let filePath = input.filePath.replace(cwd, '');
// Ensure tails is an array
let tails = typeof input.tails === 'string' ? [input.tails] : input.tails || [];
tails = tails.filter((tail) => tail.length > 0);
filePath = (0, removeFileExtension_1.default)(filePath.replace(stripValue, ''));
// split the path into parts governed by the path separator, sep used for unix and windows compatibility
let filePathParts = filePath.split(upath_1.sep);
// firstSegmentSplit is the highlight the 1st
let iterationToNotCaseChange = -1;
if (firstSegmentSplit) {
iterationToNotCaseChange = 0;
}
// inject the prefixes if given
if (prefixes && prefixes.length > 0) {
if (firstSegmentSplit) {
iterationToNotCaseChange = prefixes.length - 1;
}
filePathParts = prefixes.concat(filePathParts);
}
for (let i = 0; i < filePathParts.length; ++i) {
if (filePathParts[i] !== upath_1.sep) {
switch (segmentStyle) {
case StringStyle_1.StringStyle.snakeCase:
filePathParts[i] = lodash_1.default.snakeCase(this.removeCurlys(filePathParts[i]));
break;
case StringStyle_1.StringStyle.PascalCase:
filePathParts[i] = (0, ucFirst_1.default)(lodash_1.default.camelCase(this.removeCurlys(filePathParts[i])));
break;
case StringStyle_1.StringStyle.kebabCase:
filePathParts[i] = lodash_1.default.kebabCase(this.removeCurlys(filePathParts[i]));
break;
case StringStyle_1.StringStyle.asIs:
filePathParts[i] = this.removeCurlys(filePathParts[i]);
break;
default:
filePathParts[i] = lodash_1.default.camelCase(this.removeCurlys(filePathParts[i]));
break;
}
// upper case for camel and pascal for overall styling
if ([StringStyle_1.StringStyle.camelCase, StringStyle_1.StringStyle.PascalCase].includes(style)) {
filePathParts[i] = (0, ucFirst_1.default)(filePathParts[i]);
if (iterationToNotCaseChange !== -1 && (i - 1) === iterationToNotCaseChange) {
filePathParts[i] = (0, lcFirst_1.default)(filePathParts[i]);
}
}
// Add the split highlight
if (i === iterationToNotCaseChange) {
filePathParts[i] += firstSegmentSplit;
}
}
}
if (removeMethod) {
if (constants_1.METHODS.includes(filePathParts[filePathParts.length - 1].toLowerCase())) {
filePathParts.pop();
}
}
if (tails) {
filePathParts = filePathParts.concat(tails);
}
let operationId = '';
switch (style) {
case StringStyle_1.StringStyle.kebabCase:
operationId = (0, lcFirst_1.default)(filePathParts.join('-'));
break;
case StringStyle_1.StringStyle.PascalCase:
operationId = filePathParts.join('');
break;
case StringStyle_1.StringStyle.snakeCase:
operationId = filePathParts.join('_');
break;
case StringStyle_1.StringStyle.dotNotation:
operationId = filePathParts.join('.');
break;
default:
operationId = (0, lcFirst_1.default)(filePathParts.join(''));
break;
}
// lastly, if we have any replacements, apply them now
if (input.replacements && input.replacements.length) {
input.replacements.forEach((replacement) => {
operationId = operationId.split(replacement.find).join(replacement.replace);
});
}
return operationId;
}
/**
* Strings the path param curlies from a folder name
*/
removeCurlys(input) {
return input.replace('{', '').replace('}', '');
}
}
exports.default = new UniqueOperationIds();