@mysten/sui
Version:
Sui TypeScript API(Work in Progress)
44 lines (35 loc) • 1.22 kB
text/typescript
// Copyright (c) Mysten Labs, Inc.
// SPDX-License-Identifier: Apache-2.0
const SUI_NS_NAME_REGEX =
/^(?!.*(^(?!@)|[-.@])($|[-.@]))(?:[a-z0-9-]{0,63}(?:\.[a-z0-9-]{0,63})*)?@[a-z0-9-]{0,63}$/i;
const SUI_NS_DOMAIN_REGEX = /^(?!.*(^|[-.])($|[-.]))(?:[a-z0-9-]{0,63}\.)+sui$/i;
const MAX_SUI_NS_NAME_LENGTH = 235;
export function isValidSuiNSName(name: string): boolean {
if (name.length > MAX_SUI_NS_NAME_LENGTH) {
return false;
}
if (name.includes('@')) {
return SUI_NS_NAME_REGEX.test(name);
}
return SUI_NS_DOMAIN_REGEX.test(name);
}
export function normalizeSuiNSName(name: string, format: 'at' | 'dot' = 'at'): string {
const lowerCase = name.toLowerCase();
let parts;
if (lowerCase.includes('@')) {
if (!SUI_NS_NAME_REGEX.test(lowerCase)) {
throw new Error(`Invalid SuiNS name ${name}`);
}
const [labels, domain] = lowerCase.split('@');
parts = [...(labels ? labels.split('.') : []), domain];
} else {
if (!SUI_NS_DOMAIN_REGEX.test(lowerCase)) {
throw new Error(`Invalid SuiNS name ${name}`);
}
parts = lowerCase.split('.').slice(0, -1);
}
if (format === 'dot') {
return `${parts.join('.')}.sui`;
}
return `${parts.slice(0, -1).join('.')}@${parts[parts.length - 1]}`;
}