@topgroup/diginext
Version:
A BUILD SERVER & CLI to deploy apps to any Kubernetes clusters.
369 lines (368 loc) • 7.47 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeSlugByName = exports.makeUniqueSlug = exports.makeSlug = void 0;
const random_1 = require("diginext-utils/dist/string/random");
const isEmpty_1 = __importDefault(require("lodash/isEmpty"));
const contain_1 = require("./contain");
const defaults = {
delimiter: "-",
lowercase: true,
replacements: {},
transliterate: typeof XRegExp === "undefined" ? true : false,
};
const char_map = {
// Latin
À: "A",
Á: "A",
Â: "A",
Ã: "A",
Ä: "A",
Å: "A",
Æ: "AE",
Ç: "C",
È: "E",
É: "E",
Ê: "E",
Ë: "E",
Ì: "I",
Í: "I",
Î: "I",
Ï: "I",
Ð: "D",
Ñ: "N",
Ò: "O",
Ó: "O",
Ô: "O",
Õ: "O",
Ö: "O",
Ő: "O",
Ø: "O",
Ù: "U",
Ú: "U",
Û: "U",
Ü: "U",
Ű: "U",
Ý: "Y",
Þ: "TH",
ß: "ss",
à: "a",
á: "a",
â: "a",
ã: "a",
ä: "a",
å: "a",
æ: "ae",
ç: "c",
è: "e",
é: "e",
ê: "e",
ë: "e",
ì: "i",
í: "i",
î: "i",
ï: "i",
ð: "d",
ñ: "n",
ò: "o",
ó: "o",
ô: "o",
õ: "o",
ö: "o",
ő: "o",
ø: "o",
ù: "u",
ú: "u",
û: "u",
ü: "u",
ű: "u",
ý: "y",
þ: "th",
ÿ: "y",
// Latin symbols
"©": "(c)",
// Greek
Α: "A",
Β: "B",
Γ: "G",
Δ: "D",
Ε: "E",
Ζ: "Z",
Η: "H",
Θ: "8",
Ι: "I",
Κ: "K",
Λ: "L",
Μ: "M",
Ν: "N",
Ξ: "3",
Ο: "O",
Π: "P",
Ρ: "R",
Σ: "S",
Τ: "T",
Υ: "Y",
Φ: "F",
Χ: "X",
Ψ: "PS",
Ω: "W",
Ά: "A",
Έ: "E",
Ί: "I",
Ό: "O",
Ύ: "Y",
Ή: "H",
Ώ: "W",
Ϊ: "I",
Ϋ: "Y",
α: "a",
β: "b",
γ: "g",
δ: "d",
ε: "e",
ζ: "z",
η: "h",
θ: "8",
ι: "i",
κ: "k",
λ: "l",
μ: "m",
ν: "n",
ξ: "3",
ο: "o",
π: "p",
ρ: "r",
σ: "s",
τ: "t",
υ: "y",
φ: "f",
χ: "x",
ψ: "ps",
ω: "w",
ά: "a",
έ: "e",
ί: "i",
ό: "o",
ύ: "y",
ή: "h",
ώ: "w",
ς: "s",
ϊ: "i",
ΰ: "y",
ϋ: "y",
ΐ: "i",
// Turkish
Ş: "S",
İ: "I",
Ğ: "G",
ş: "s",
ı: "i",
ğ: "g",
// Russian
А: "A",
Б: "B",
В: "V",
Г: "G",
Д: "D",
Е: "E",
Ё: "Yo",
Ж: "Zh",
З: "Z",
И: "I",
Й: "J",
К: "K",
Л: "L",
М: "M",
Н: "N",
О: "O",
П: "P",
Р: "R",
С: "S",
Т: "T",
У: "U",
Ф: "F",
Х: "H",
Ц: "C",
Ч: "Ch",
Ш: "Sh",
Щ: "Sh",
Ъ: "",
Ы: "Y",
Ь: "",
Э: "E",
Ю: "Yu",
Я: "Ya",
а: "a",
б: "b",
в: "v",
г: "g",
д: "d",
е: "e",
ё: "yo",
ж: "zh",
з: "z",
и: "i",
й: "j",
к: "k",
л: "l",
м: "m",
н: "n",
о: "o",
п: "p",
р: "r",
с: "s",
т: "t",
у: "u",
ф: "f",
х: "h",
ц: "c",
ч: "ch",
ш: "sh",
щ: "sh",
ъ: "",
ы: "y",
ь: "",
э: "e",
ю: "yu",
я: "ya",
// Ukrainian
Є: "Ye",
І: "I",
Ї: "Yi",
Ґ: "G",
є: "ye",
і: "i",
ї: "yi",
ґ: "g",
// Czech
Č: "C",
Ď: "D",
Ě: "E",
Ň: "N",
Ř: "R",
Š: "S",
Ť: "T",
Ů: "U",
Ž: "Z",
č: "c",
ď: "d",
ě: "e",
ň: "n",
ř: "r",
š: "s",
ť: "t",
ů: "u",
ž: "z",
// Polish
Ą: "A",
Ć: "C",
Ę: "e",
Ł: "L",
Ń: "N",
Ś: "S",
Ź: "Z",
Ż: "Z",
ą: "a",
ć: "c",
ę: "e",
ł: "l",
ń: "n",
ś: "s",
ź: "z",
ż: "z",
// Latvian
Ā: "A",
Ē: "E",
Ģ: "G",
Ī: "i",
Ķ: "k",
Ļ: "L",
Ņ: "N",
Ū: "u",
ā: "a",
ē: "e",
ģ: "g",
ī: "i",
ķ: "k",
ļ: "l",
ņ: "n",
ū: "u",
};
const makeSlug = (input, opt = {}) => {
if (!input)
throw new Error(`"input" argument is required.`);
// convert any input type to string ;)
let str = `${input}`;
str = (0, contain_1.filterSpecialChars)(str);
if ((0, isEmpty_1.default)(str) || (0, contain_1.containsChinese)(str) || (0, contain_1.containsEmoji)(str))
str = "item";
// Merge options
for (const key in defaults) {
if (!Object.prototype.hasOwnProperty.call(opt, key))
opt[key] = defaults[key];
}
// Vietnamese
str = str.replace(/á|à|ả|ạ|ã|ă|ắ|ằ|ẳ|ẵ|ặ|â|ấ|ầ|ẩ|ẫ|ậ/gi, "a");
str = str.replace(/é|è|ẻ|ẽ|ẹ|ê|ế|ề|ể|ễ|ệ/gi, "e");
str = str.replace(/i|í|ì|ỉ|ĩ|ị/gi, "i");
str = str.replace(/ó|ò|ỏ|õ|ọ|ô|ố|ồ|ổ|ỗ|ộ|ơ|ớ|ờ|ở|ỡ|ợ/gi, "o");
str = str.replace(/ú|ù|ủ|ũ|ụ|ư|ứ|ừ|ử|ữ|ự/gi, "u");
str = str.replace(/ý|ỳ|ỷ|ỹ|ỵ/gi, "y");
str = str.replace(/đ/gi, "d");
str = str.replace(/-----/gi, "-");
str = str.replace(/----/gi, "-");
str = str.replace(/---/gi, "-");
str = str.replace(/--/g, "-");
str = "@" + str + "@";
str = str.replace(/@-|-@|@/g, "");
// Make custom replacements
for (const k in opt.replacements) {
if (opt.replacements[k]) {
str = str.replace(RegExp(k, "g"), opt.replacements[k]);
}
}
// Transliterate characters to ASCII
if (opt.transliterate)
for (var m in char_map)
str = str.replace(RegExp(m, "g"), char_map[m]);
// Replace non-alphanumeric characters with our delimiter
var alnum = typeof XRegExp === "undefined" ? RegExp("[^a-z0-9]+", "ig") : XRegExp("[^\\p{L}\\p{N}]+", "ig");
str = str.replace(alnum, opt.delimiter || "");
// Remove duplicate delimiters
str = str.replace(RegExp("[" + opt.delimiter + "]{2,}", "g"), opt.delimiter || "");
// Truncate slug to max. characters
if (typeof opt.limit !== "undefined")
str = str.substring(0, opt.limit);
// Remove delimiter from ends
str = str.replace(RegExp("(^" + opt.delimiter + "|" + opt.delimiter + "$)", "g"), "");
return opt.lowercase ? str.toLowerCase() : str;
};
exports.makeSlug = makeSlug;
/**
* Create a unique slug by input string
* @param prismaSchema Prisma schema
* @param input Input string
* @param opt Make slug options
* @returns {string} Unique slug
*/
async function makeUniqueSlug(prismaSchema, input, opt = { field: "slug", atempt: 0 }) {
const slug = (0, exports.makeSlug)(input, opt);
const uniqueSlug = await prismaSchema.findUnique({ where: { [opt.field]: slug } });
if (uniqueSlug) {
opt.atempt++;
return makeUniqueSlug(prismaSchema, `${input}-${opt.atempt}`, { ...opt, field: opt.field });
}
return slug;
}
exports.makeUniqueSlug = makeUniqueSlug;
function makeSlugByName(name) {
try {
return `${(0, exports.makeSlug)(name)}-${(0, random_1.randomStringAndNumberByLength)(8)}`;
}
catch (error) {
throw new Error(`Make Slug By Name failed: ${error instanceof Error ? error.message : "Unknown error"}`);
}
}
exports.makeSlugByName = makeSlugByName;