@iota/iota-names-sdk
Version:
IOTA-Names SDK
104 lines (103 loc) • 4.12 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var utils_exports = {};
__export(utils_exports, {
isValidIotaName: () => isValidIotaName,
normalizeIotaName: () => normalizeIotaName,
validateIotaName: () => validateIotaName,
validateIotaSubname: () => validateIotaSubname
});
module.exports = __toCommonJS(utils_exports);
const LABEL_REGEX = /(?!-)[a-z0-9-]{0,62}[a-z0-9]/;
const SUBNAME_REGEX = /^(?!-)[a-z0-9-]{1,62}[a-z0-9]$/;
const PATH_REGEX = new RegExp(`(?:${LABEL_REGEX.source}(?:\\.${LABEL_REGEX.source})*)`);
const NAME_AT_REGEX = new RegExp(`^(${PATH_REGEX.source})?@${LABEL_REGEX.source}$`);
const NAME_DOT_REGEX = new RegExp(`^(?:${LABEL_REGEX.source}\\.)+(iota)$`);
const MAX_LENGTH = 235;
function isValidIotaName(name) {
if (name.length > MAX_LENGTH) {
return false;
}
return NAME_AT_REGEX.test(name) || NAME_DOT_REGEX.test(name);
}
const LONG_NAMES_TRUNCATE_LENGTH = 11;
const CHARACTERS_TO_SHOW = 6;
function normalizeIotaName(name, format = "at", {
onlyFirstSubname,
truncateLongParts,
ellipsisForDeepSubnames = onlyFirstSubname === true
} = {}) {
const lowerCase = name.toLowerCase();
let parts;
if (NAME_AT_REGEX.test(lowerCase)) {
let [path, name2] = lowerCase.split("@");
parts = [...path ? path.split(".") : [], name2];
} else if (NAME_DOT_REGEX.test(lowerCase)) {
parts = lowerCase.split(".").slice(0, -1);
} else {
throw new Error(`Invalid IOTA name "${name}"`);
}
const subnamesEllipsis = format === "dot" ? "." : "..";
let subnames = onlyFirstSubname ? [
// First name from the left (e.g yes.no.no.no.iota)
parts[0],
ellipsisForDeepSubnames && parts.length > 2 ? subnamesEllipsis : ""
].filter(Boolean) : parts.slice(0, -1);
let parentName = parts[parts.length - 1];
if (truncateLongParts) {
subnames = subnames.map((s) => {
return s.length > LONG_NAMES_TRUNCATE_LENGTH ? `${s.slice(0, CHARACTERS_TO_SHOW)}...${s.slice(-CHARACTERS_TO_SHOW)}` : s;
});
parentName = parentName.length > LONG_NAMES_TRUNCATE_LENGTH ? `${parentName.slice(0, CHARACTERS_TO_SHOW)}...${parentName.slice(-CHARACTERS_TO_SHOW)}` : parentName;
}
if (format === "dot") {
return `${[...subnames, parentName].join(".")}.iota`;
} else {
return `${subnames.join(".")}@${parentName}`;
}
}
function validateIotaSubname(name, minLength = 3, maxLength = 64) {
if (!name) return null;
const lowerCase = name.toLowerCase();
if (!SUBNAME_REGEX.test(lowerCase)) {
return "Invalid characters. Only a-z, 0-9, and hyphens (not at the beginning or end) are allowed";
}
if (name.length < minLength || name.length > maxLength) {
return `Name must be ${minLength}-${maxLength} characters long`;
}
return null;
}
function validateIotaName(name, minLength = 3, maxLength = 64, allowSubnames = true) {
if (!name) return null;
const lowerCase = name.toLowerCase();
const parts = lowerCase.split(".");
if (!allowSubnames && parts.length > 2) {
return "No subnames allowed";
}
for (const part of parts.slice(0, -1)) {
if (part.length < minLength || part.length > maxLength) {
return `Name must be ${minLength}-${maxLength} characters long`;
}
}
if (!NAME_DOT_REGEX.test(name)) {
return "Invalid characters. Only a-z, 0-9, and hyphens (not at the beginning or end) are allowed";
}
return null;
}
//# sourceMappingURL=utils.js.map