@xyo-network/xns-record-payloadset-plugins 3.0.12 → 3.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.mjs +3 -2
- package/dist/browser/index.mjs.map +1 -1
- package/dist/browser/validation/name/Name.d.ts +3 -1
- package/dist/browser/validation/name/Name.d.ts.map +1 -1
- package/dist/neutral/index.mjs +3 -2
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/neutral/validation/name/Name.d.ts +3 -1
- package/dist/neutral/validation/name/Name.d.ts.map +1 -1
- package/dist/node/index.mjs +3 -2
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/validation/name/Name.d.ts +3 -1
- package/dist/node/validation/name/Name.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/validation/name/Name.ts +5 -3
package/dist/browser/index.mjs
CHANGED
|
@@ -170,6 +170,7 @@ var removeDisallowedCharacters = (xnsName) => {
|
|
|
170
170
|
};
|
|
171
171
|
|
|
172
172
|
// src/validation/name/Name.ts
|
|
173
|
+
var defaultMaskOptions = { maskStartEndHyphens: false };
|
|
173
174
|
var XnsNameHelper = class _XnsNameHelper {
|
|
174
175
|
static ValidTLDs = [".xyo"];
|
|
175
176
|
_xnsName;
|
|
@@ -230,13 +231,13 @@ var XnsNameHelper = class _XnsNameHelper {
|
|
|
230
231
|
* @param {string} str
|
|
231
232
|
* @returns string
|
|
232
233
|
*/
|
|
233
|
-
static mask(str) {
|
|
234
|
+
static mask(str, options = defaultMaskOptions) {
|
|
234
235
|
if (str.length > MAX_DOMAIN_LENGTH) {
|
|
235
236
|
throw new Error(`Domain name too long: ${str.length} exceeds max length: ${MAX_DOMAIN_LENGTH}`);
|
|
236
237
|
}
|
|
237
238
|
const lowercaseXnsName = str.toLowerCase();
|
|
238
239
|
let formattedXnsName = lowercaseXnsName.replaceAll(/[^\dA-Za-z-]+$/g, "");
|
|
239
|
-
formattedXnsName = formattedXnsName.replaceAll(/^-+|-+$/g, "");
|
|
240
|
+
if (options.maskStartEndHyphens) formattedXnsName = formattedXnsName.replaceAll(/^-+|-+$/g, "");
|
|
240
241
|
return removeDisallowedCharacters(formattedXnsName);
|
|
241
242
|
}
|
|
242
243
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/estimate/lib/parseDomainEstimates.ts","../../src/validation/name/Name.ts","../../src/validation/validation/Constants.ts","../../src/validation/validation/factory/validators.ts","../../src/validation/validation/validators/validators.ts","../../src/validation/name/lib/removeDisallowedCharacters.ts"],"sourcesContent":["import { exists } from '@xylabs/exists'\nimport { type BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport {\n type HashLeaseEstimate, HashLeaseEstimateSchema,\n isHashLeaseEstimateWithMeta,\n} from '@xyo-network/diviner-hash-lease'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, WithMeta, WithSources,\n} from '@xyo-network/payload-model'\nimport {\n type DomainEstimate,\n type DomainRegistrationLease, DomainRegistrationLeaseSchema, isDomainRegistrationLeaseWithMeta,\n} from '@xyo-network/xns-record-payload-plugins'\n\n/**\n * Parses a generic array of payloads into estimates\n * @param payloads An array of payloads\n * @returns Parsed estimates\n */\nexport const parseDomainEstimates = async (payloads?: Payload[]): Promise<DomainEstimate[]> => {\n if (!payloads) return []\n const bws = payloads\n // Find all bound witnesses\n .filter(isBoundWitness)\n // that have the required estimate payloads\n .filter(hasEstimatePayloads) ?? []\n if (bws.length === 0) return []\n const hashMap = await PayloadBuilder.toAllHashMap(payloads)\n return bws.map<DomainEstimate | undefined>((bw) => {\n const hashLeaseEstimate = getPayloadBySchemaFromBoundWitness<WithSources<HashLeaseEstimate>>(\n bw,\n HashLeaseEstimateSchema,\n hashMap,\n isHashLeaseEstimateWithMeta,\n )\n if (!hashLeaseEstimate) return\n const domainLease = getPayloadBySchemaFromBoundWitness<DomainRegistrationLease>(\n bw,\n DomainRegistrationLeaseSchema,\n hashMap,\n isDomainRegistrationLeaseWithMeta,\n )\n if (!domainLease) return\n return [bw, hashLeaseEstimate, domainLease]\n }).filter(exists)\n}\n\n/**\n * Tests if a BoundWitness has the required estimate payloads\n * @param bw The BoundWitness to check for estimate payloads\n * @returns True if the BoundWitness has the required estimate payloads, false otherwise\n */\nconst hasEstimatePayloads = (bw: BoundWitness): boolean => {\n return bw.payload_schemas.includes(DomainRegistrationLeaseSchema)\n && bw.payload_schemas.includes(HashLeaseEstimateSchema)\n}\n\n/**\n * Finds the first instance of a payload in a BoundWitness by schema\n * @param bw The BoundWitness to extract the payload from\n * @param schema The schema of the payload to extract\n * @param hashMap The hashmap of the payloads\n * @param identity An identity function to check if the payload is of the correct type\n * @returns The payload if it exists or undefined\n */\nconst getPayloadBySchemaFromBoundWitness = <T extends Payload = Payload>(\n bw: BoundWitness,\n schema: string,\n hashMap: Awaited<ReturnType<typeof PayloadBuilder.toHashMap>>,\n identity: (payload: Payload) => payload is WithMeta<T>,\n): WithMeta<T> | undefined => {\n const schemaIndex = bw.payload_schemas.indexOf(schema)\n if (schemaIndex === -1) return\n const hash = bw.payload_hashes[schemaIndex]\n return [hashMap[hash]].filter(exists).find(identity)\n}\n","import { assertEx } from '@xylabs/assert'\nimport { isHash } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { DomainFields, TopLevelDomain } from '@xyo-network/xns-record-payload-plugins'\nimport { DomainSchema } from '@xyo-network/xns-record-payload-plugins'\n\nimport { MAX_DOMAIN_LENGTH, XnsNameSimpleValidators } from '../validation/index.ts'\nimport { removeDisallowedCharacters } from './lib/index.ts'\nimport type { ValidSourceTypes } from './types/index.ts'\n\nexport class XnsNameHelper {\n static ValidTLDs = ['.xyo'] as const\n\n private _xnsName: Payload<DomainFields>\n\n private constructor(xnsName: Payload<DomainFields>) {\n this._xnsName = xnsName\n }\n\n get domain() {\n return assertEx(this.xnsName.domain, () => 'domain not found in payload')\n }\n\n get name() {\n return `${this.domain}.${this.tld}`\n }\n\n get tld() {\n return assertEx(this.xnsName.tld, () => 'tld not found in payload')\n }\n\n get xnsName() {\n return assertEx(this._xnsName, () => 'XnsNameHelper xnsName not set')\n }\n\n /**\n * Create an XnsNameHelper from a domain payload\n * @param {Domain} domain\n * @returns Promise<XnsNameHelper>\n */\n static fromPayload(domain: Payload<DomainFields>): Promisable<XnsNameHelper> {\n return new XnsNameHelper(domain)\n }\n\n /**\n * Create an XnsNameHelper from a string\n * @param {string} xnsName\n * @returns Promise<XnsNameHelper>\n */\n static fromString(xnsName: string): XnsNameHelper {\n const parts = xnsName.split('.')\n assertEx(parts.length === 2, () => 'Unable to parse xnsName')\n\n const domain = parts[0]\n const tld = parts[1] as TopLevelDomain\n return new XnsNameHelper({\n schema: DomainSchema, domain, tld,\n })\n }\n\n /**\n * Determine if a string is a valid XNS name or hash\n * @param {string} source?\n * @returns ValidSourceTypes\n */\n static isPotentialXnsNameOrHash(source?: string): ValidSourceTypes {\n if (isHash(source)) return 'hash'\n const xnsName = XnsNameHelper.ValidTLDs.some(tld => source?.endsWith(tld)) ? source : null\n return xnsName ? 'xnsName' : null\n }\n\n static isValid(domain: Payload<DomainFields>) {\n return XnsNameSimpleValidators.every(validator => validator(domain))\n }\n\n /**\n * Mask a string to be a valid XNS name\n * @param {string} str\n * @returns string\n */\n static mask(str: string) {\n // Check if the domain name is too long\n if (str.length > MAX_DOMAIN_LENGTH) {\n throw new Error(`Domain name too long: ${str.length} exceeds max length: ${MAX_DOMAIN_LENGTH}`)\n }\n\n // convert to lowercase\n const lowercaseXnsName = str.toLowerCase()\n\n // Remove everything except letters, numbers, and dashes\n let formattedXnsName = lowercaseXnsName.replaceAll(/[^\\dA-Za-z-]+$/g, '')\n\n // Remove leading and trailing dashes\n formattedXnsName = formattedXnsName.replaceAll(/^-+|-+$/g, '')\n\n // Filter out disallowed characters.\n return removeDisallowedCharacters(formattedXnsName)\n }\n}\n","export const MIN_DOMAIN_LENGTH = 3\nexport const MAX_DOMAIN_LENGTH = 128\n","import type { Payload, PayloadValidationFunction } from '@xyo-network/payload-model'\nimport type { DomainFields } from '@xyo-network/xns-record-payload-plugins'\n\nexport const getDomainReservedStringsValidator = (\n reservedStrings: string[],\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if in one of the reserved name lists\n if (reservedStrings.includes(domain)) {\n console.log('Reserved name')\n return false\n }\n return true\n }\n}\n\nexport const getDomainReservedFragmentsValidator = (\n reservedFragments: string[],\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if any of our fragments are in the name\n for (const reserved of reservedFragments) {\n if (domain.includes(reserved)) {\n console.log('Reserved name fragment')\n return false\n }\n }\n return true\n }\n}\n\nexport const getDomainReservedNamesValidator = (reservedNames: string[]): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if any of our fragments are in the name\n for (const reserved of reservedNames) {\n const parts = reserved.split(' ')\n if (domain === [parts[1], parts[0]].join('') || domain === [parts[0], parts[1]].join('')) {\n console.log('Reserved name')\n return false\n }\n }\n return true\n }\n}\n","import { isModuleName } from '@xyo-network/module-model'\nimport type { Payload, PayloadValidationFunction } from '@xyo-network/payload-model'\nimport type { DomainFields } from '@xyo-network/xns-record-payload-plugins'\n\nimport { MAX_DOMAIN_LENGTH, MIN_DOMAIN_LENGTH } from '../Constants.ts'\n\nexport const domainCasingValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { domain } = payload\n // Check if all lowercase\n if (domain.toLowerCase() !== domain) {\n console.log('name must be lowercase')\n return false\n }\n return true\n}\n\nexport const domainModuleNameValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { domain } = payload\n\n // check if domain is a valid name\n if (!isModuleName(domain)) {\n console.log(`Domain is not a valid module name: ${domain}`)\n return false\n }\n\n return true\n}\n\nexport const domainTldValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { tld } = payload\n // Check if all lowercase\n if (tld.toLowerCase() !== tld) {\n console.log('TLD must be lowercase')\n return false\n }\n // Check if supported TLDs\n if (tld !== 'xyo') {\n console.log('Only XYO TLD currently supported')\n return false\n }\n return true\n}\n\nexport const getDomainLengthValidator = (\n minNameLength = MIN_DOMAIN_LENGTH,\n maxLength = MAX_DOMAIN_LENGTH,\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if min length\n if (domain.length < minNameLength) {\n console.log(`name must be at least ${minNameLength} characters`)\n return false\n }\n if (domain.length > maxLength) {\n console.log(`name must be at least ${maxLength} characters`)\n return false\n }\n return true\n }\n}\n\nexport const getDomainAllowedHyphensValidator = (\n options?: { end?: boolean; start?: boolean },\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n const { start, end } = options ?? {}\n if (!start && domain.startsWith('-')) {\n console.log('name cannot start with hyphen')\n return false\n }\n if (!end && domain.endsWith('-')) {\n console.log('name cannot end with hyphen')\n return false\n }\n return true\n }\n}\n\nexport const XnsNameSimpleValidators = [\n domainCasingValidator,\n domainModuleNameValidator,\n domainTldValidator,\n getDomainLengthValidator(),\n getDomainAllowedHyphensValidator(),\n]\n","import { DisallowedModuleIdentifierCharacters } from '@xyo-network/module-model'\n\n/**\n * A set of all the disallowed characters in module identifiers\n */\nconst DISALLOWED_CHARACTERS = new Set(Object.keys(DisallowedModuleIdentifierCharacters))\n\n/**\n * Iterates over a string removing disallowed characters\n * @param xnsName The XNS name to remove disallowed characters from\n * @returns The XNS name with disallowed characters removed\n */\nexport const removeDisallowedCharacters = (xnsName: string): string => {\n // Create the initial result\n let result = ''\n // Iterate over each character in the XNS name\n for (const char of xnsName) {\n // If the character is not a disallowed character\n if (!DISALLOWED_CHARACTERS.has(char)) {\n // add it to the result\n result += char\n }\n }\n // Return the result which contains only allowed characters\n return result\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/estimate/lib/parseDomainEstimates.ts","../../src/validation/name/Name.ts","../../src/validation/validation/Constants.ts","../../src/validation/validation/factory/validators.ts","../../src/validation/validation/validators/validators.ts","../../src/validation/name/lib/removeDisallowedCharacters.ts"],"sourcesContent":["import { exists } from '@xylabs/exists'\nimport { type BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport {\n type HashLeaseEstimate, HashLeaseEstimateSchema,\n isHashLeaseEstimateWithMeta,\n} from '@xyo-network/diviner-hash-lease'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, WithMeta, WithSources,\n} from '@xyo-network/payload-model'\nimport {\n type DomainEstimate,\n type DomainRegistrationLease, DomainRegistrationLeaseSchema, isDomainRegistrationLeaseWithMeta,\n} from '@xyo-network/xns-record-payload-plugins'\n\n/**\n * Parses a generic array of payloads into estimates\n * @param payloads An array of payloads\n * @returns Parsed estimates\n */\nexport const parseDomainEstimates = async (payloads?: Payload[]): Promise<DomainEstimate[]> => {\n if (!payloads) return []\n const bws = payloads\n // Find all bound witnesses\n .filter(isBoundWitness)\n // that have the required estimate payloads\n .filter(hasEstimatePayloads) ?? []\n if (bws.length === 0) return []\n const hashMap = await PayloadBuilder.toAllHashMap(payloads)\n return bws.map<DomainEstimate | undefined>((bw) => {\n const hashLeaseEstimate = getPayloadBySchemaFromBoundWitness<WithSources<HashLeaseEstimate>>(\n bw,\n HashLeaseEstimateSchema,\n hashMap,\n isHashLeaseEstimateWithMeta,\n )\n if (!hashLeaseEstimate) return\n const domainLease = getPayloadBySchemaFromBoundWitness<DomainRegistrationLease>(\n bw,\n DomainRegistrationLeaseSchema,\n hashMap,\n isDomainRegistrationLeaseWithMeta,\n )\n if (!domainLease) return\n return [bw, hashLeaseEstimate, domainLease]\n }).filter(exists)\n}\n\n/**\n * Tests if a BoundWitness has the required estimate payloads\n * @param bw The BoundWitness to check for estimate payloads\n * @returns True if the BoundWitness has the required estimate payloads, false otherwise\n */\nconst hasEstimatePayloads = (bw: BoundWitness): boolean => {\n return bw.payload_schemas.includes(DomainRegistrationLeaseSchema)\n && bw.payload_schemas.includes(HashLeaseEstimateSchema)\n}\n\n/**\n * Finds the first instance of a payload in a BoundWitness by schema\n * @param bw The BoundWitness to extract the payload from\n * @param schema The schema of the payload to extract\n * @param hashMap The hashmap of the payloads\n * @param identity An identity function to check if the payload is of the correct type\n * @returns The payload if it exists or undefined\n */\nconst getPayloadBySchemaFromBoundWitness = <T extends Payload = Payload>(\n bw: BoundWitness,\n schema: string,\n hashMap: Awaited<ReturnType<typeof PayloadBuilder.toHashMap>>,\n identity: (payload: Payload) => payload is WithMeta<T>,\n): WithMeta<T> | undefined => {\n const schemaIndex = bw.payload_schemas.indexOf(schema)\n if (schemaIndex === -1) return\n const hash = bw.payload_hashes[schemaIndex]\n return [hashMap[hash]].filter(exists).find(identity)\n}\n","import { assertEx } from '@xylabs/assert'\nimport { isHash } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { DomainFields, TopLevelDomain } from '@xyo-network/xns-record-payload-plugins'\nimport { DomainSchema } from '@xyo-network/xns-record-payload-plugins'\n\nimport { MAX_DOMAIN_LENGTH, XnsNameSimpleValidators } from '../validation/index.ts'\nimport { removeDisallowedCharacters } from './lib/index.ts'\nimport type { ValidSourceTypes } from './types/index.ts'\n\nconst defaultMaskOptions = { maskStartEndHyphens: false }\n\nexport class XnsNameHelper {\n static ValidTLDs = ['.xyo'] as const\n\n private _xnsName: Payload<DomainFields>\n\n private constructor(xnsName: Payload<DomainFields>) {\n this._xnsName = xnsName\n }\n\n get domain() {\n return assertEx(this.xnsName.domain, () => 'domain not found in payload')\n }\n\n get name() {\n return `${this.domain}.${this.tld}`\n }\n\n get tld() {\n return assertEx(this.xnsName.tld, () => 'tld not found in payload')\n }\n\n get xnsName() {\n return assertEx(this._xnsName, () => 'XnsNameHelper xnsName not set')\n }\n\n /**\n * Create an XnsNameHelper from a domain payload\n * @param {Domain} domain\n * @returns Promise<XnsNameHelper>\n */\n static fromPayload(domain: Payload<DomainFields>): Promisable<XnsNameHelper> {\n return new XnsNameHelper(domain)\n }\n\n /**\n * Create an XnsNameHelper from a string\n * @param {string} xnsName\n * @returns Promise<XnsNameHelper>\n */\n static fromString(xnsName: string): XnsNameHelper {\n const parts = xnsName.split('.')\n assertEx(parts.length === 2, () => 'Unable to parse xnsName')\n\n const domain = parts[0]\n const tld = parts[1] as TopLevelDomain\n return new XnsNameHelper({\n schema: DomainSchema, domain, tld,\n })\n }\n\n /**\n * Determine if a string is a valid XNS name or hash\n * @param {string} source?\n * @returns ValidSourceTypes\n */\n static isPotentialXnsNameOrHash(source?: string): ValidSourceTypes {\n if (isHash(source)) return 'hash'\n const xnsName = XnsNameHelper.ValidTLDs.some(tld => source?.endsWith(tld)) ? source : null\n return xnsName ? 'xnsName' : null\n }\n\n static isValid(domain: Payload<DomainFields>): boolean {\n return XnsNameSimpleValidators.every(validator => validator(domain))\n }\n\n /**\n * Mask a string to be a valid XNS name\n * @param {string} str\n * @returns string\n */\n static mask(str: string, options: { maskStartEndHyphens: boolean } = defaultMaskOptions): string {\n // Check if the domain name is too long\n if (str.length > MAX_DOMAIN_LENGTH) {\n throw new Error(`Domain name too long: ${str.length} exceeds max length: ${MAX_DOMAIN_LENGTH}`)\n }\n\n // convert to lowercase\n const lowercaseXnsName = str.toLowerCase()\n\n // Remove everything except letters, numbers, and dashes\n let formattedXnsName = lowercaseXnsName.replaceAll(/[^\\dA-Za-z-]+$/g, '')\n\n // Remove leading and trailing dashes\n if (options.maskStartEndHyphens) formattedXnsName = formattedXnsName.replaceAll(/^-+|-+$/g, '')\n\n // Filter out disallowed characters.\n return removeDisallowedCharacters(formattedXnsName)\n }\n}\n","export const MIN_DOMAIN_LENGTH = 3\nexport const MAX_DOMAIN_LENGTH = 128\n","import type { Payload, PayloadValidationFunction } from '@xyo-network/payload-model'\nimport type { DomainFields } from '@xyo-network/xns-record-payload-plugins'\n\nexport const getDomainReservedStringsValidator = (\n reservedStrings: string[],\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if in one of the reserved name lists\n if (reservedStrings.includes(domain)) {\n console.log('Reserved name')\n return false\n }\n return true\n }\n}\n\nexport const getDomainReservedFragmentsValidator = (\n reservedFragments: string[],\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if any of our fragments are in the name\n for (const reserved of reservedFragments) {\n if (domain.includes(reserved)) {\n console.log('Reserved name fragment')\n return false\n }\n }\n return true\n }\n}\n\nexport const getDomainReservedNamesValidator = (reservedNames: string[]): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if any of our fragments are in the name\n for (const reserved of reservedNames) {\n const parts = reserved.split(' ')\n if (domain === [parts[1], parts[0]].join('') || domain === [parts[0], parts[1]].join('')) {\n console.log('Reserved name')\n return false\n }\n }\n return true\n }\n}\n","import { isModuleName } from '@xyo-network/module-model'\nimport type { Payload, PayloadValidationFunction } from '@xyo-network/payload-model'\nimport type { DomainFields } from '@xyo-network/xns-record-payload-plugins'\n\nimport { MAX_DOMAIN_LENGTH, MIN_DOMAIN_LENGTH } from '../Constants.ts'\n\nexport const domainCasingValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { domain } = payload\n // Check if all lowercase\n if (domain.toLowerCase() !== domain) {\n console.log('name must be lowercase')\n return false\n }\n return true\n}\n\nexport const domainModuleNameValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { domain } = payload\n\n // check if domain is a valid name\n if (!isModuleName(domain)) {\n console.log(`Domain is not a valid module name: ${domain}`)\n return false\n }\n\n return true\n}\n\nexport const domainTldValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { tld } = payload\n // Check if all lowercase\n if (tld.toLowerCase() !== tld) {\n console.log('TLD must be lowercase')\n return false\n }\n // Check if supported TLDs\n if (tld !== 'xyo') {\n console.log('Only XYO TLD currently supported')\n return false\n }\n return true\n}\n\nexport const getDomainLengthValidator = (\n minNameLength = MIN_DOMAIN_LENGTH,\n maxLength = MAX_DOMAIN_LENGTH,\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if min length\n if (domain.length < minNameLength) {\n console.log(`name must be at least ${minNameLength} characters`)\n return false\n }\n if (domain.length > maxLength) {\n console.log(`name must be at least ${maxLength} characters`)\n return false\n }\n return true\n }\n}\n\nexport const getDomainAllowedHyphensValidator = (\n options?: { end?: boolean; start?: boolean },\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n const { start, end } = options ?? {}\n if (!start && domain.startsWith('-')) {\n console.log('name cannot start with hyphen')\n return false\n }\n if (!end && domain.endsWith('-')) {\n console.log('name cannot end with hyphen')\n return false\n }\n return true\n }\n}\n\nexport const XnsNameSimpleValidators = [\n domainCasingValidator,\n domainModuleNameValidator,\n domainTldValidator,\n getDomainLengthValidator(),\n getDomainAllowedHyphensValidator(),\n]\n","import { DisallowedModuleIdentifierCharacters } from '@xyo-network/module-model'\n\n/**\n * A set of all the disallowed characters in module identifiers\n */\nconst DISALLOWED_CHARACTERS = new Set(Object.keys(DisallowedModuleIdentifierCharacters))\n\n/**\n * Iterates over a string removing disallowed characters\n * @param xnsName The XNS name to remove disallowed characters from\n * @returns The XNS name with disallowed characters removed\n */\nexport const removeDisallowedCharacters = (xnsName: string): string => {\n // Create the initial result\n let result = ''\n // Iterate over each character in the XNS name\n for (const char of xnsName) {\n // If the character is not a disallowed character\n if (!DISALLOWED_CHARACTERS.has(char)) {\n // add it to the result\n result += char\n }\n }\n // Return the result which contains only allowed characters\n return result\n}\n"],"mappings":"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","names":[]}
|
|
@@ -16,6 +16,8 @@ export declare class XnsNameHelper {
|
|
|
16
16
|
static fromString(xnsName: string): XnsNameHelper;
|
|
17
17
|
static isPotentialXnsNameOrHash(source?: string): ValidSourceTypes;
|
|
18
18
|
static isValid(domain: Payload<DomainFields>): boolean;
|
|
19
|
-
static mask(str: string
|
|
19
|
+
static mask(str: string, options?: {
|
|
20
|
+
maskStartEndHyphens: boolean;
|
|
21
|
+
}): string;
|
|
20
22
|
}
|
|
21
23
|
//# sourceMappingURL=Name.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Name.d.ts","sourceRoot":"","sources":["../../../../src/validation/name/Name.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,yCAAyC,CAAA;AAK3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"Name.d.ts","sourceRoot":"","sources":["../../../../src/validation/name/Name.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,yCAAyC,CAAA;AAK3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAIxD,qBAAa,aAAa;IACxB,MAAM,CAAC,SAAS,oBAAoB;IAEpC,OAAO,CAAC,QAAQ,CAAuB;IAEvC,OAAO;IAIP,IAAI,MAAM,WAET;IAED,IAAI,IAAI,WAEP;IAED,IAAI,GAAG,UAEN;IAED,IAAI,OAAO;;MAEV;IAOD,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,UAAU,CAAC,aAAa,CAAC;IAS5E,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa;IAgBjD,MAAM,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB;IAMlE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO;IAStD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,mBAAmB,EAAE,OAAO,CAAA;KAAuB,GAAG,MAAM;CAkBjG"}
|
package/dist/neutral/index.mjs
CHANGED
|
@@ -170,6 +170,7 @@ var removeDisallowedCharacters = (xnsName) => {
|
|
|
170
170
|
};
|
|
171
171
|
|
|
172
172
|
// src/validation/name/Name.ts
|
|
173
|
+
var defaultMaskOptions = { maskStartEndHyphens: false };
|
|
173
174
|
var XnsNameHelper = class _XnsNameHelper {
|
|
174
175
|
static ValidTLDs = [".xyo"];
|
|
175
176
|
_xnsName;
|
|
@@ -230,13 +231,13 @@ var XnsNameHelper = class _XnsNameHelper {
|
|
|
230
231
|
* @param {string} str
|
|
231
232
|
* @returns string
|
|
232
233
|
*/
|
|
233
|
-
static mask(str) {
|
|
234
|
+
static mask(str, options = defaultMaskOptions) {
|
|
234
235
|
if (str.length > MAX_DOMAIN_LENGTH) {
|
|
235
236
|
throw new Error(`Domain name too long: ${str.length} exceeds max length: ${MAX_DOMAIN_LENGTH}`);
|
|
236
237
|
}
|
|
237
238
|
const lowercaseXnsName = str.toLowerCase();
|
|
238
239
|
let formattedXnsName = lowercaseXnsName.replaceAll(/[^\dA-Za-z-]+$/g, "");
|
|
239
|
-
formattedXnsName = formattedXnsName.replaceAll(/^-+|-+$/g, "");
|
|
240
|
+
if (options.maskStartEndHyphens) formattedXnsName = formattedXnsName.replaceAll(/^-+|-+$/g, "");
|
|
240
241
|
return removeDisallowedCharacters(formattedXnsName);
|
|
241
242
|
}
|
|
242
243
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/estimate/lib/parseDomainEstimates.ts","../../src/validation/name/Name.ts","../../src/validation/validation/Constants.ts","../../src/validation/validation/factory/validators.ts","../../src/validation/validation/validators/validators.ts","../../src/validation/name/lib/removeDisallowedCharacters.ts"],"sourcesContent":["import { exists } from '@xylabs/exists'\nimport { type BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport {\n type HashLeaseEstimate, HashLeaseEstimateSchema,\n isHashLeaseEstimateWithMeta,\n} from '@xyo-network/diviner-hash-lease'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, WithMeta, WithSources,\n} from '@xyo-network/payload-model'\nimport {\n type DomainEstimate,\n type DomainRegistrationLease, DomainRegistrationLeaseSchema, isDomainRegistrationLeaseWithMeta,\n} from '@xyo-network/xns-record-payload-plugins'\n\n/**\n * Parses a generic array of payloads into estimates\n * @param payloads An array of payloads\n * @returns Parsed estimates\n */\nexport const parseDomainEstimates = async (payloads?: Payload[]): Promise<DomainEstimate[]> => {\n if (!payloads) return []\n const bws = payloads\n // Find all bound witnesses\n .filter(isBoundWitness)\n // that have the required estimate payloads\n .filter(hasEstimatePayloads) ?? []\n if (bws.length === 0) return []\n const hashMap = await PayloadBuilder.toAllHashMap(payloads)\n return bws.map<DomainEstimate | undefined>((bw) => {\n const hashLeaseEstimate = getPayloadBySchemaFromBoundWitness<WithSources<HashLeaseEstimate>>(\n bw,\n HashLeaseEstimateSchema,\n hashMap,\n isHashLeaseEstimateWithMeta,\n )\n if (!hashLeaseEstimate) return\n const domainLease = getPayloadBySchemaFromBoundWitness<DomainRegistrationLease>(\n bw,\n DomainRegistrationLeaseSchema,\n hashMap,\n isDomainRegistrationLeaseWithMeta,\n )\n if (!domainLease) return\n return [bw, hashLeaseEstimate, domainLease]\n }).filter(exists)\n}\n\n/**\n * Tests if a BoundWitness has the required estimate payloads\n * @param bw The BoundWitness to check for estimate payloads\n * @returns True if the BoundWitness has the required estimate payloads, false otherwise\n */\nconst hasEstimatePayloads = (bw: BoundWitness): boolean => {\n return bw.payload_schemas.includes(DomainRegistrationLeaseSchema)\n && bw.payload_schemas.includes(HashLeaseEstimateSchema)\n}\n\n/**\n * Finds the first instance of a payload in a BoundWitness by schema\n * @param bw The BoundWitness to extract the payload from\n * @param schema The schema of the payload to extract\n * @param hashMap The hashmap of the payloads\n * @param identity An identity function to check if the payload is of the correct type\n * @returns The payload if it exists or undefined\n */\nconst getPayloadBySchemaFromBoundWitness = <T extends Payload = Payload>(\n bw: BoundWitness,\n schema: string,\n hashMap: Awaited<ReturnType<typeof PayloadBuilder.toHashMap>>,\n identity: (payload: Payload) => payload is WithMeta<T>,\n): WithMeta<T> | undefined => {\n const schemaIndex = bw.payload_schemas.indexOf(schema)\n if (schemaIndex === -1) return\n const hash = bw.payload_hashes[schemaIndex]\n return [hashMap[hash]].filter(exists).find(identity)\n}\n","import { assertEx } from '@xylabs/assert'\nimport { isHash } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { DomainFields, TopLevelDomain } from '@xyo-network/xns-record-payload-plugins'\nimport { DomainSchema } from '@xyo-network/xns-record-payload-plugins'\n\nimport { MAX_DOMAIN_LENGTH, XnsNameSimpleValidators } from '../validation/index.ts'\nimport { removeDisallowedCharacters } from './lib/index.ts'\nimport type { ValidSourceTypes } from './types/index.ts'\n\nexport class XnsNameHelper {\n static ValidTLDs = ['.xyo'] as const\n\n private _xnsName: Payload<DomainFields>\n\n private constructor(xnsName: Payload<DomainFields>) {\n this._xnsName = xnsName\n }\n\n get domain() {\n return assertEx(this.xnsName.domain, () => 'domain not found in payload')\n }\n\n get name() {\n return `${this.domain}.${this.tld}`\n }\n\n get tld() {\n return assertEx(this.xnsName.tld, () => 'tld not found in payload')\n }\n\n get xnsName() {\n return assertEx(this._xnsName, () => 'XnsNameHelper xnsName not set')\n }\n\n /**\n * Create an XnsNameHelper from a domain payload\n * @param {Domain} domain\n * @returns Promise<XnsNameHelper>\n */\n static fromPayload(domain: Payload<DomainFields>): Promisable<XnsNameHelper> {\n return new XnsNameHelper(domain)\n }\n\n /**\n * Create an XnsNameHelper from a string\n * @param {string} xnsName\n * @returns Promise<XnsNameHelper>\n */\n static fromString(xnsName: string): XnsNameHelper {\n const parts = xnsName.split('.')\n assertEx(parts.length === 2, () => 'Unable to parse xnsName')\n\n const domain = parts[0]\n const tld = parts[1] as TopLevelDomain\n return new XnsNameHelper({\n schema: DomainSchema, domain, tld,\n })\n }\n\n /**\n * Determine if a string is a valid XNS name or hash\n * @param {string} source?\n * @returns ValidSourceTypes\n */\n static isPotentialXnsNameOrHash(source?: string): ValidSourceTypes {\n if (isHash(source)) return 'hash'\n const xnsName = XnsNameHelper.ValidTLDs.some(tld => source?.endsWith(tld)) ? source : null\n return xnsName ? 'xnsName' : null\n }\n\n static isValid(domain: Payload<DomainFields>) {\n return XnsNameSimpleValidators.every(validator => validator(domain))\n }\n\n /**\n * Mask a string to be a valid XNS name\n * @param {string} str\n * @returns string\n */\n static mask(str: string) {\n // Check if the domain name is too long\n if (str.length > MAX_DOMAIN_LENGTH) {\n throw new Error(`Domain name too long: ${str.length} exceeds max length: ${MAX_DOMAIN_LENGTH}`)\n }\n\n // convert to lowercase\n const lowercaseXnsName = str.toLowerCase()\n\n // Remove everything except letters, numbers, and dashes\n let formattedXnsName = lowercaseXnsName.replaceAll(/[^\\dA-Za-z-]+$/g, '')\n\n // Remove leading and trailing dashes\n formattedXnsName = formattedXnsName.replaceAll(/^-+|-+$/g, '')\n\n // Filter out disallowed characters.\n return removeDisallowedCharacters(formattedXnsName)\n }\n}\n","export const MIN_DOMAIN_LENGTH = 3\nexport const MAX_DOMAIN_LENGTH = 128\n","import type { Payload, PayloadValidationFunction } from '@xyo-network/payload-model'\nimport type { DomainFields } from '@xyo-network/xns-record-payload-plugins'\n\nexport const getDomainReservedStringsValidator = (\n reservedStrings: string[],\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if in one of the reserved name lists\n if (reservedStrings.includes(domain)) {\n console.log('Reserved name')\n return false\n }\n return true\n }\n}\n\nexport const getDomainReservedFragmentsValidator = (\n reservedFragments: string[],\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if any of our fragments are in the name\n for (const reserved of reservedFragments) {\n if (domain.includes(reserved)) {\n console.log('Reserved name fragment')\n return false\n }\n }\n return true\n }\n}\n\nexport const getDomainReservedNamesValidator = (reservedNames: string[]): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if any of our fragments are in the name\n for (const reserved of reservedNames) {\n const parts = reserved.split(' ')\n if (domain === [parts[1], parts[0]].join('') || domain === [parts[0], parts[1]].join('')) {\n console.log('Reserved name')\n return false\n }\n }\n return true\n }\n}\n","import { isModuleName } from '@xyo-network/module-model'\nimport type { Payload, PayloadValidationFunction } from '@xyo-network/payload-model'\nimport type { DomainFields } from '@xyo-network/xns-record-payload-plugins'\n\nimport { MAX_DOMAIN_LENGTH, MIN_DOMAIN_LENGTH } from '../Constants.ts'\n\nexport const domainCasingValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { domain } = payload\n // Check if all lowercase\n if (domain.toLowerCase() !== domain) {\n console.log('name must be lowercase')\n return false\n }\n return true\n}\n\nexport const domainModuleNameValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { domain } = payload\n\n // check if domain is a valid name\n if (!isModuleName(domain)) {\n console.log(`Domain is not a valid module name: ${domain}`)\n return false\n }\n\n return true\n}\n\nexport const domainTldValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { tld } = payload\n // Check if all lowercase\n if (tld.toLowerCase() !== tld) {\n console.log('TLD must be lowercase')\n return false\n }\n // Check if supported TLDs\n if (tld !== 'xyo') {\n console.log('Only XYO TLD currently supported')\n return false\n }\n return true\n}\n\nexport const getDomainLengthValidator = (\n minNameLength = MIN_DOMAIN_LENGTH,\n maxLength = MAX_DOMAIN_LENGTH,\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if min length\n if (domain.length < minNameLength) {\n console.log(`name must be at least ${minNameLength} characters`)\n return false\n }\n if (domain.length > maxLength) {\n console.log(`name must be at least ${maxLength} characters`)\n return false\n }\n return true\n }\n}\n\nexport const getDomainAllowedHyphensValidator = (\n options?: { end?: boolean; start?: boolean },\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n const { start, end } = options ?? {}\n if (!start && domain.startsWith('-')) {\n console.log('name cannot start with hyphen')\n return false\n }\n if (!end && domain.endsWith('-')) {\n console.log('name cannot end with hyphen')\n return false\n }\n return true\n }\n}\n\nexport const XnsNameSimpleValidators = [\n domainCasingValidator,\n domainModuleNameValidator,\n domainTldValidator,\n getDomainLengthValidator(),\n getDomainAllowedHyphensValidator(),\n]\n","import { DisallowedModuleIdentifierCharacters } from '@xyo-network/module-model'\n\n/**\n * A set of all the disallowed characters in module identifiers\n */\nconst DISALLOWED_CHARACTERS = new Set(Object.keys(DisallowedModuleIdentifierCharacters))\n\n/**\n * Iterates over a string removing disallowed characters\n * @param xnsName The XNS name to remove disallowed characters from\n * @returns The XNS name with disallowed characters removed\n */\nexport const removeDisallowedCharacters = (xnsName: string): string => {\n // Create the initial result\n let result = ''\n // Iterate over each character in the XNS name\n for (const char of xnsName) {\n // If the character is not a disallowed character\n if (!DISALLOWED_CHARACTERS.has(char)) {\n // add it to the result\n result += char\n }\n }\n // Return the result which contains only allowed characters\n return result\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/estimate/lib/parseDomainEstimates.ts","../../src/validation/name/Name.ts","../../src/validation/validation/Constants.ts","../../src/validation/validation/factory/validators.ts","../../src/validation/validation/validators/validators.ts","../../src/validation/name/lib/removeDisallowedCharacters.ts"],"sourcesContent":["import { exists } from '@xylabs/exists'\nimport { type BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport {\n type HashLeaseEstimate, HashLeaseEstimateSchema,\n isHashLeaseEstimateWithMeta,\n} from '@xyo-network/diviner-hash-lease'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, WithMeta, WithSources,\n} from '@xyo-network/payload-model'\nimport {\n type DomainEstimate,\n type DomainRegistrationLease, DomainRegistrationLeaseSchema, isDomainRegistrationLeaseWithMeta,\n} from '@xyo-network/xns-record-payload-plugins'\n\n/**\n * Parses a generic array of payloads into estimates\n * @param payloads An array of payloads\n * @returns Parsed estimates\n */\nexport const parseDomainEstimates = async (payloads?: Payload[]): Promise<DomainEstimate[]> => {\n if (!payloads) return []\n const bws = payloads\n // Find all bound witnesses\n .filter(isBoundWitness)\n // that have the required estimate payloads\n .filter(hasEstimatePayloads) ?? []\n if (bws.length === 0) return []\n const hashMap = await PayloadBuilder.toAllHashMap(payloads)\n return bws.map<DomainEstimate | undefined>((bw) => {\n const hashLeaseEstimate = getPayloadBySchemaFromBoundWitness<WithSources<HashLeaseEstimate>>(\n bw,\n HashLeaseEstimateSchema,\n hashMap,\n isHashLeaseEstimateWithMeta,\n )\n if (!hashLeaseEstimate) return\n const domainLease = getPayloadBySchemaFromBoundWitness<DomainRegistrationLease>(\n bw,\n DomainRegistrationLeaseSchema,\n hashMap,\n isDomainRegistrationLeaseWithMeta,\n )\n if (!domainLease) return\n return [bw, hashLeaseEstimate, domainLease]\n }).filter(exists)\n}\n\n/**\n * Tests if a BoundWitness has the required estimate payloads\n * @param bw The BoundWitness to check for estimate payloads\n * @returns True if the BoundWitness has the required estimate payloads, false otherwise\n */\nconst hasEstimatePayloads = (bw: BoundWitness): boolean => {\n return bw.payload_schemas.includes(DomainRegistrationLeaseSchema)\n && bw.payload_schemas.includes(HashLeaseEstimateSchema)\n}\n\n/**\n * Finds the first instance of a payload in a BoundWitness by schema\n * @param bw The BoundWitness to extract the payload from\n * @param schema The schema of the payload to extract\n * @param hashMap The hashmap of the payloads\n * @param identity An identity function to check if the payload is of the correct type\n * @returns The payload if it exists or undefined\n */\nconst getPayloadBySchemaFromBoundWitness = <T extends Payload = Payload>(\n bw: BoundWitness,\n schema: string,\n hashMap: Awaited<ReturnType<typeof PayloadBuilder.toHashMap>>,\n identity: (payload: Payload) => payload is WithMeta<T>,\n): WithMeta<T> | undefined => {\n const schemaIndex = bw.payload_schemas.indexOf(schema)\n if (schemaIndex === -1) return\n const hash = bw.payload_hashes[schemaIndex]\n return [hashMap[hash]].filter(exists).find(identity)\n}\n","import { assertEx } from '@xylabs/assert'\nimport { isHash } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { DomainFields, TopLevelDomain } from '@xyo-network/xns-record-payload-plugins'\nimport { DomainSchema } from '@xyo-network/xns-record-payload-plugins'\n\nimport { MAX_DOMAIN_LENGTH, XnsNameSimpleValidators } from '../validation/index.ts'\nimport { removeDisallowedCharacters } from './lib/index.ts'\nimport type { ValidSourceTypes } from './types/index.ts'\n\nconst defaultMaskOptions = { maskStartEndHyphens: false }\n\nexport class XnsNameHelper {\n static ValidTLDs = ['.xyo'] as const\n\n private _xnsName: Payload<DomainFields>\n\n private constructor(xnsName: Payload<DomainFields>) {\n this._xnsName = xnsName\n }\n\n get domain() {\n return assertEx(this.xnsName.domain, () => 'domain not found in payload')\n }\n\n get name() {\n return `${this.domain}.${this.tld}`\n }\n\n get tld() {\n return assertEx(this.xnsName.tld, () => 'tld not found in payload')\n }\n\n get xnsName() {\n return assertEx(this._xnsName, () => 'XnsNameHelper xnsName not set')\n }\n\n /**\n * Create an XnsNameHelper from a domain payload\n * @param {Domain} domain\n * @returns Promise<XnsNameHelper>\n */\n static fromPayload(domain: Payload<DomainFields>): Promisable<XnsNameHelper> {\n return new XnsNameHelper(domain)\n }\n\n /**\n * Create an XnsNameHelper from a string\n * @param {string} xnsName\n * @returns Promise<XnsNameHelper>\n */\n static fromString(xnsName: string): XnsNameHelper {\n const parts = xnsName.split('.')\n assertEx(parts.length === 2, () => 'Unable to parse xnsName')\n\n const domain = parts[0]\n const tld = parts[1] as TopLevelDomain\n return new XnsNameHelper({\n schema: DomainSchema, domain, tld,\n })\n }\n\n /**\n * Determine if a string is a valid XNS name or hash\n * @param {string} source?\n * @returns ValidSourceTypes\n */\n static isPotentialXnsNameOrHash(source?: string): ValidSourceTypes {\n if (isHash(source)) return 'hash'\n const xnsName = XnsNameHelper.ValidTLDs.some(tld => source?.endsWith(tld)) ? source : null\n return xnsName ? 'xnsName' : null\n }\n\n static isValid(domain: Payload<DomainFields>): boolean {\n return XnsNameSimpleValidators.every(validator => validator(domain))\n }\n\n /**\n * Mask a string to be a valid XNS name\n * @param {string} str\n * @returns string\n */\n static mask(str: string, options: { maskStartEndHyphens: boolean } = defaultMaskOptions): string {\n // Check if the domain name is too long\n if (str.length > MAX_DOMAIN_LENGTH) {\n throw new Error(`Domain name too long: ${str.length} exceeds max length: ${MAX_DOMAIN_LENGTH}`)\n }\n\n // convert to lowercase\n const lowercaseXnsName = str.toLowerCase()\n\n // Remove everything except letters, numbers, and dashes\n let formattedXnsName = lowercaseXnsName.replaceAll(/[^\\dA-Za-z-]+$/g, '')\n\n // Remove leading and trailing dashes\n if (options.maskStartEndHyphens) formattedXnsName = formattedXnsName.replaceAll(/^-+|-+$/g, '')\n\n // Filter out disallowed characters.\n return removeDisallowedCharacters(formattedXnsName)\n }\n}\n","export const MIN_DOMAIN_LENGTH = 3\nexport const MAX_DOMAIN_LENGTH = 128\n","import type { Payload, PayloadValidationFunction } from '@xyo-network/payload-model'\nimport type { DomainFields } from '@xyo-network/xns-record-payload-plugins'\n\nexport const getDomainReservedStringsValidator = (\n reservedStrings: string[],\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if in one of the reserved name lists\n if (reservedStrings.includes(domain)) {\n console.log('Reserved name')\n return false\n }\n return true\n }\n}\n\nexport const getDomainReservedFragmentsValidator = (\n reservedFragments: string[],\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if any of our fragments are in the name\n for (const reserved of reservedFragments) {\n if (domain.includes(reserved)) {\n console.log('Reserved name fragment')\n return false\n }\n }\n return true\n }\n}\n\nexport const getDomainReservedNamesValidator = (reservedNames: string[]): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if any of our fragments are in the name\n for (const reserved of reservedNames) {\n const parts = reserved.split(' ')\n if (domain === [parts[1], parts[0]].join('') || domain === [parts[0], parts[1]].join('')) {\n console.log('Reserved name')\n return false\n }\n }\n return true\n }\n}\n","import { isModuleName } from '@xyo-network/module-model'\nimport type { Payload, PayloadValidationFunction } from '@xyo-network/payload-model'\nimport type { DomainFields } from '@xyo-network/xns-record-payload-plugins'\n\nimport { MAX_DOMAIN_LENGTH, MIN_DOMAIN_LENGTH } from '../Constants.ts'\n\nexport const domainCasingValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { domain } = payload\n // Check if all lowercase\n if (domain.toLowerCase() !== domain) {\n console.log('name must be lowercase')\n return false\n }\n return true\n}\n\nexport const domainModuleNameValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { domain } = payload\n\n // check if domain is a valid name\n if (!isModuleName(domain)) {\n console.log(`Domain is not a valid module name: ${domain}`)\n return false\n }\n\n return true\n}\n\nexport const domainTldValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { tld } = payload\n // Check if all lowercase\n if (tld.toLowerCase() !== tld) {\n console.log('TLD must be lowercase')\n return false\n }\n // Check if supported TLDs\n if (tld !== 'xyo') {\n console.log('Only XYO TLD currently supported')\n return false\n }\n return true\n}\n\nexport const getDomainLengthValidator = (\n minNameLength = MIN_DOMAIN_LENGTH,\n maxLength = MAX_DOMAIN_LENGTH,\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if min length\n if (domain.length < minNameLength) {\n console.log(`name must be at least ${minNameLength} characters`)\n return false\n }\n if (domain.length > maxLength) {\n console.log(`name must be at least ${maxLength} characters`)\n return false\n }\n return true\n }\n}\n\nexport const getDomainAllowedHyphensValidator = (\n options?: { end?: boolean; start?: boolean },\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n const { start, end } = options ?? {}\n if (!start && domain.startsWith('-')) {\n console.log('name cannot start with hyphen')\n return false\n }\n if (!end && domain.endsWith('-')) {\n console.log('name cannot end with hyphen')\n return false\n }\n return true\n }\n}\n\nexport const XnsNameSimpleValidators = [\n domainCasingValidator,\n domainModuleNameValidator,\n domainTldValidator,\n getDomainLengthValidator(),\n getDomainAllowedHyphensValidator(),\n]\n","import { DisallowedModuleIdentifierCharacters } from '@xyo-network/module-model'\n\n/**\n * A set of all the disallowed characters in module identifiers\n */\nconst DISALLOWED_CHARACTERS = new Set(Object.keys(DisallowedModuleIdentifierCharacters))\n\n/**\n * Iterates over a string removing disallowed characters\n * @param xnsName The XNS name to remove disallowed characters from\n * @returns The XNS name with disallowed characters removed\n */\nexport const removeDisallowedCharacters = (xnsName: string): string => {\n // Create the initial result\n let result = ''\n // Iterate over each character in the XNS name\n for (const char of xnsName) {\n // If the character is not a disallowed character\n if (!DISALLOWED_CHARACTERS.has(char)) {\n // add it to the result\n result += char\n }\n }\n // Return the result which contains only allowed characters\n return result\n}\n"],"mappings":"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","names":[]}
|
|
@@ -16,6 +16,8 @@ export declare class XnsNameHelper {
|
|
|
16
16
|
static fromString(xnsName: string): XnsNameHelper;
|
|
17
17
|
static isPotentialXnsNameOrHash(source?: string): ValidSourceTypes;
|
|
18
18
|
static isValid(domain: Payload<DomainFields>): boolean;
|
|
19
|
-
static mask(str: string
|
|
19
|
+
static mask(str: string, options?: {
|
|
20
|
+
maskStartEndHyphens: boolean;
|
|
21
|
+
}): string;
|
|
20
22
|
}
|
|
21
23
|
//# sourceMappingURL=Name.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Name.d.ts","sourceRoot":"","sources":["../../../../src/validation/name/Name.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,yCAAyC,CAAA;AAK3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"Name.d.ts","sourceRoot":"","sources":["../../../../src/validation/name/Name.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,yCAAyC,CAAA;AAK3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAIxD,qBAAa,aAAa;IACxB,MAAM,CAAC,SAAS,oBAAoB;IAEpC,OAAO,CAAC,QAAQ,CAAuB;IAEvC,OAAO;IAIP,IAAI,MAAM,WAET;IAED,IAAI,IAAI,WAEP;IAED,IAAI,GAAG,UAEN;IAED,IAAI,OAAO;;MAEV;IAOD,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,UAAU,CAAC,aAAa,CAAC;IAS5E,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa;IAgBjD,MAAM,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB;IAMlE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO;IAStD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,mBAAmB,EAAE,OAAO,CAAA;KAAuB,GAAG,MAAM;CAkBjG"}
|
package/dist/node/index.mjs
CHANGED
|
@@ -170,6 +170,7 @@ var removeDisallowedCharacters = (xnsName) => {
|
|
|
170
170
|
};
|
|
171
171
|
|
|
172
172
|
// src/validation/name/Name.ts
|
|
173
|
+
var defaultMaskOptions = { maskStartEndHyphens: false };
|
|
173
174
|
var XnsNameHelper = class _XnsNameHelper {
|
|
174
175
|
static ValidTLDs = [".xyo"];
|
|
175
176
|
_xnsName;
|
|
@@ -230,13 +231,13 @@ var XnsNameHelper = class _XnsNameHelper {
|
|
|
230
231
|
* @param {string} str
|
|
231
232
|
* @returns string
|
|
232
233
|
*/
|
|
233
|
-
static mask(str) {
|
|
234
|
+
static mask(str, options = defaultMaskOptions) {
|
|
234
235
|
if (str.length > MAX_DOMAIN_LENGTH) {
|
|
235
236
|
throw new Error(`Domain name too long: ${str.length} exceeds max length: ${MAX_DOMAIN_LENGTH}`);
|
|
236
237
|
}
|
|
237
238
|
const lowercaseXnsName = str.toLowerCase();
|
|
238
239
|
let formattedXnsName = lowercaseXnsName.replaceAll(/[^\dA-Za-z-]+$/g, "");
|
|
239
|
-
formattedXnsName = formattedXnsName.replaceAll(/^-+|-+$/g, "");
|
|
240
|
+
if (options.maskStartEndHyphens) formattedXnsName = formattedXnsName.replaceAll(/^-+|-+$/g, "");
|
|
240
241
|
return removeDisallowedCharacters(formattedXnsName);
|
|
241
242
|
}
|
|
242
243
|
};
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/estimate/lib/parseDomainEstimates.ts","../../src/validation/name/Name.ts","../../src/validation/validation/Constants.ts","../../src/validation/validation/factory/validators.ts","../../src/validation/validation/validators/validators.ts","../../src/validation/name/lib/removeDisallowedCharacters.ts"],"sourcesContent":["import { exists } from '@xylabs/exists'\nimport { type BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport {\n type HashLeaseEstimate, HashLeaseEstimateSchema,\n isHashLeaseEstimateWithMeta,\n} from '@xyo-network/diviner-hash-lease'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, WithMeta, WithSources,\n} from '@xyo-network/payload-model'\nimport {\n type DomainEstimate,\n type DomainRegistrationLease, DomainRegistrationLeaseSchema, isDomainRegistrationLeaseWithMeta,\n} from '@xyo-network/xns-record-payload-plugins'\n\n/**\n * Parses a generic array of payloads into estimates\n * @param payloads An array of payloads\n * @returns Parsed estimates\n */\nexport const parseDomainEstimates = async (payloads?: Payload[]): Promise<DomainEstimate[]> => {\n if (!payloads) return []\n const bws = payloads\n // Find all bound witnesses\n .filter(isBoundWitness)\n // that have the required estimate payloads\n .filter(hasEstimatePayloads) ?? []\n if (bws.length === 0) return []\n const hashMap = await PayloadBuilder.toAllHashMap(payloads)\n return bws.map<DomainEstimate | undefined>((bw) => {\n const hashLeaseEstimate = getPayloadBySchemaFromBoundWitness<WithSources<HashLeaseEstimate>>(\n bw,\n HashLeaseEstimateSchema,\n hashMap,\n isHashLeaseEstimateWithMeta,\n )\n if (!hashLeaseEstimate) return\n const domainLease = getPayloadBySchemaFromBoundWitness<DomainRegistrationLease>(\n bw,\n DomainRegistrationLeaseSchema,\n hashMap,\n isDomainRegistrationLeaseWithMeta,\n )\n if (!domainLease) return\n return [bw, hashLeaseEstimate, domainLease]\n }).filter(exists)\n}\n\n/**\n * Tests if a BoundWitness has the required estimate payloads\n * @param bw The BoundWitness to check for estimate payloads\n * @returns True if the BoundWitness has the required estimate payloads, false otherwise\n */\nconst hasEstimatePayloads = (bw: BoundWitness): boolean => {\n return bw.payload_schemas.includes(DomainRegistrationLeaseSchema)\n && bw.payload_schemas.includes(HashLeaseEstimateSchema)\n}\n\n/**\n * Finds the first instance of a payload in a BoundWitness by schema\n * @param bw The BoundWitness to extract the payload from\n * @param schema The schema of the payload to extract\n * @param hashMap The hashmap of the payloads\n * @param identity An identity function to check if the payload is of the correct type\n * @returns The payload if it exists or undefined\n */\nconst getPayloadBySchemaFromBoundWitness = <T extends Payload = Payload>(\n bw: BoundWitness,\n schema: string,\n hashMap: Awaited<ReturnType<typeof PayloadBuilder.toHashMap>>,\n identity: (payload: Payload) => payload is WithMeta<T>,\n): WithMeta<T> | undefined => {\n const schemaIndex = bw.payload_schemas.indexOf(schema)\n if (schemaIndex === -1) return\n const hash = bw.payload_hashes[schemaIndex]\n return [hashMap[hash]].filter(exists).find(identity)\n}\n","import { assertEx } from '@xylabs/assert'\nimport { isHash } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { DomainFields, TopLevelDomain } from '@xyo-network/xns-record-payload-plugins'\nimport { DomainSchema } from '@xyo-network/xns-record-payload-plugins'\n\nimport { MAX_DOMAIN_LENGTH, XnsNameSimpleValidators } from '../validation/index.ts'\nimport { removeDisallowedCharacters } from './lib/index.ts'\nimport type { ValidSourceTypes } from './types/index.ts'\n\nexport class XnsNameHelper {\n static ValidTLDs = ['.xyo'] as const\n\n private _xnsName: Payload<DomainFields>\n\n private constructor(xnsName: Payload<DomainFields>) {\n this._xnsName = xnsName\n }\n\n get domain() {\n return assertEx(this.xnsName.domain, () => 'domain not found in payload')\n }\n\n get name() {\n return `${this.domain}.${this.tld}`\n }\n\n get tld() {\n return assertEx(this.xnsName.tld, () => 'tld not found in payload')\n }\n\n get xnsName() {\n return assertEx(this._xnsName, () => 'XnsNameHelper xnsName not set')\n }\n\n /**\n * Create an XnsNameHelper from a domain payload\n * @param {Domain} domain\n * @returns Promise<XnsNameHelper>\n */\n static fromPayload(domain: Payload<DomainFields>): Promisable<XnsNameHelper> {\n return new XnsNameHelper(domain)\n }\n\n /**\n * Create an XnsNameHelper from a string\n * @param {string} xnsName\n * @returns Promise<XnsNameHelper>\n */\n static fromString(xnsName: string): XnsNameHelper {\n const parts = xnsName.split('.')\n assertEx(parts.length === 2, () => 'Unable to parse xnsName')\n\n const domain = parts[0]\n const tld = parts[1] as TopLevelDomain\n return new XnsNameHelper({\n schema: DomainSchema, domain, tld,\n })\n }\n\n /**\n * Determine if a string is a valid XNS name or hash\n * @param {string} source?\n * @returns ValidSourceTypes\n */\n static isPotentialXnsNameOrHash(source?: string): ValidSourceTypes {\n if (isHash(source)) return 'hash'\n const xnsName = XnsNameHelper.ValidTLDs.some(tld => source?.endsWith(tld)) ? source : null\n return xnsName ? 'xnsName' : null\n }\n\n static isValid(domain: Payload<DomainFields>) {\n return XnsNameSimpleValidators.every(validator => validator(domain))\n }\n\n /**\n * Mask a string to be a valid XNS name\n * @param {string} str\n * @returns string\n */\n static mask(str: string) {\n // Check if the domain name is too long\n if (str.length > MAX_DOMAIN_LENGTH) {\n throw new Error(`Domain name too long: ${str.length} exceeds max length: ${MAX_DOMAIN_LENGTH}`)\n }\n\n // convert to lowercase\n const lowercaseXnsName = str.toLowerCase()\n\n // Remove everything except letters, numbers, and dashes\n let formattedXnsName = lowercaseXnsName.replaceAll(/[^\\dA-Za-z-]+$/g, '')\n\n // Remove leading and trailing dashes\n formattedXnsName = formattedXnsName.replaceAll(/^-+|-+$/g, '')\n\n // Filter out disallowed characters.\n return removeDisallowedCharacters(formattedXnsName)\n }\n}\n","export const MIN_DOMAIN_LENGTH = 3\nexport const MAX_DOMAIN_LENGTH = 128\n","import type { Payload, PayloadValidationFunction } from '@xyo-network/payload-model'\nimport type { DomainFields } from '@xyo-network/xns-record-payload-plugins'\n\nexport const getDomainReservedStringsValidator = (\n reservedStrings: string[],\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if in one of the reserved name lists\n if (reservedStrings.includes(domain)) {\n console.log('Reserved name')\n return false\n }\n return true\n }\n}\n\nexport const getDomainReservedFragmentsValidator = (\n reservedFragments: string[],\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if any of our fragments are in the name\n for (const reserved of reservedFragments) {\n if (domain.includes(reserved)) {\n console.log('Reserved name fragment')\n return false\n }\n }\n return true\n }\n}\n\nexport const getDomainReservedNamesValidator = (reservedNames: string[]): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if any of our fragments are in the name\n for (const reserved of reservedNames) {\n const parts = reserved.split(' ')\n if (domain === [parts[1], parts[0]].join('') || domain === [parts[0], parts[1]].join('')) {\n console.log('Reserved name')\n return false\n }\n }\n return true\n }\n}\n","import { isModuleName } from '@xyo-network/module-model'\nimport type { Payload, PayloadValidationFunction } from '@xyo-network/payload-model'\nimport type { DomainFields } from '@xyo-network/xns-record-payload-plugins'\n\nimport { MAX_DOMAIN_LENGTH, MIN_DOMAIN_LENGTH } from '../Constants.ts'\n\nexport const domainCasingValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { domain } = payload\n // Check if all lowercase\n if (domain.toLowerCase() !== domain) {\n console.log('name must be lowercase')\n return false\n }\n return true\n}\n\nexport const domainModuleNameValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { domain } = payload\n\n // check if domain is a valid name\n if (!isModuleName(domain)) {\n console.log(`Domain is not a valid module name: ${domain}`)\n return false\n }\n\n return true\n}\n\nexport const domainTldValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { tld } = payload\n // Check if all lowercase\n if (tld.toLowerCase() !== tld) {\n console.log('TLD must be lowercase')\n return false\n }\n // Check if supported TLDs\n if (tld !== 'xyo') {\n console.log('Only XYO TLD currently supported')\n return false\n }\n return true\n}\n\nexport const getDomainLengthValidator = (\n minNameLength = MIN_DOMAIN_LENGTH,\n maxLength = MAX_DOMAIN_LENGTH,\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if min length\n if (domain.length < minNameLength) {\n console.log(`name must be at least ${minNameLength} characters`)\n return false\n }\n if (domain.length > maxLength) {\n console.log(`name must be at least ${maxLength} characters`)\n return false\n }\n return true\n }\n}\n\nexport const getDomainAllowedHyphensValidator = (\n options?: { end?: boolean; start?: boolean },\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n const { start, end } = options ?? {}\n if (!start && domain.startsWith('-')) {\n console.log('name cannot start with hyphen')\n return false\n }\n if (!end && domain.endsWith('-')) {\n console.log('name cannot end with hyphen')\n return false\n }\n return true\n }\n}\n\nexport const XnsNameSimpleValidators = [\n domainCasingValidator,\n domainModuleNameValidator,\n domainTldValidator,\n getDomainLengthValidator(),\n getDomainAllowedHyphensValidator(),\n]\n","import { DisallowedModuleIdentifierCharacters } from '@xyo-network/module-model'\n\n/**\n * A set of all the disallowed characters in module identifiers\n */\nconst DISALLOWED_CHARACTERS = new Set(Object.keys(DisallowedModuleIdentifierCharacters))\n\n/**\n * Iterates over a string removing disallowed characters\n * @param xnsName The XNS name to remove disallowed characters from\n * @returns The XNS name with disallowed characters removed\n */\nexport const removeDisallowedCharacters = (xnsName: string): string => {\n // Create the initial result\n let result = ''\n // Iterate over each character in the XNS name\n for (const char of xnsName) {\n // If the character is not a disallowed character\n if (!DISALLOWED_CHARACTERS.has(char)) {\n // add it to the result\n result += char\n }\n }\n // Return the result which contains only allowed characters\n return result\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/estimate/lib/parseDomainEstimates.ts","../../src/validation/name/Name.ts","../../src/validation/validation/Constants.ts","../../src/validation/validation/factory/validators.ts","../../src/validation/validation/validators/validators.ts","../../src/validation/name/lib/removeDisallowedCharacters.ts"],"sourcesContent":["import { exists } from '@xylabs/exists'\nimport { type BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport {\n type HashLeaseEstimate, HashLeaseEstimateSchema,\n isHashLeaseEstimateWithMeta,\n} from '@xyo-network/diviner-hash-lease'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, WithMeta, WithSources,\n} from '@xyo-network/payload-model'\nimport {\n type DomainEstimate,\n type DomainRegistrationLease, DomainRegistrationLeaseSchema, isDomainRegistrationLeaseWithMeta,\n} from '@xyo-network/xns-record-payload-plugins'\n\n/**\n * Parses a generic array of payloads into estimates\n * @param payloads An array of payloads\n * @returns Parsed estimates\n */\nexport const parseDomainEstimates = async (payloads?: Payload[]): Promise<DomainEstimate[]> => {\n if (!payloads) return []\n const bws = payloads\n // Find all bound witnesses\n .filter(isBoundWitness)\n // that have the required estimate payloads\n .filter(hasEstimatePayloads) ?? []\n if (bws.length === 0) return []\n const hashMap = await PayloadBuilder.toAllHashMap(payloads)\n return bws.map<DomainEstimate | undefined>((bw) => {\n const hashLeaseEstimate = getPayloadBySchemaFromBoundWitness<WithSources<HashLeaseEstimate>>(\n bw,\n HashLeaseEstimateSchema,\n hashMap,\n isHashLeaseEstimateWithMeta,\n )\n if (!hashLeaseEstimate) return\n const domainLease = getPayloadBySchemaFromBoundWitness<DomainRegistrationLease>(\n bw,\n DomainRegistrationLeaseSchema,\n hashMap,\n isDomainRegistrationLeaseWithMeta,\n )\n if (!domainLease) return\n return [bw, hashLeaseEstimate, domainLease]\n }).filter(exists)\n}\n\n/**\n * Tests if a BoundWitness has the required estimate payloads\n * @param bw The BoundWitness to check for estimate payloads\n * @returns True if the BoundWitness has the required estimate payloads, false otherwise\n */\nconst hasEstimatePayloads = (bw: BoundWitness): boolean => {\n return bw.payload_schemas.includes(DomainRegistrationLeaseSchema)\n && bw.payload_schemas.includes(HashLeaseEstimateSchema)\n}\n\n/**\n * Finds the first instance of a payload in a BoundWitness by schema\n * @param bw The BoundWitness to extract the payload from\n * @param schema The schema of the payload to extract\n * @param hashMap The hashmap of the payloads\n * @param identity An identity function to check if the payload is of the correct type\n * @returns The payload if it exists or undefined\n */\nconst getPayloadBySchemaFromBoundWitness = <T extends Payload = Payload>(\n bw: BoundWitness,\n schema: string,\n hashMap: Awaited<ReturnType<typeof PayloadBuilder.toHashMap>>,\n identity: (payload: Payload) => payload is WithMeta<T>,\n): WithMeta<T> | undefined => {\n const schemaIndex = bw.payload_schemas.indexOf(schema)\n if (schemaIndex === -1) return\n const hash = bw.payload_hashes[schemaIndex]\n return [hashMap[hash]].filter(exists).find(identity)\n}\n","import { assertEx } from '@xylabs/assert'\nimport { isHash } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { DomainFields, TopLevelDomain } from '@xyo-network/xns-record-payload-plugins'\nimport { DomainSchema } from '@xyo-network/xns-record-payload-plugins'\n\nimport { MAX_DOMAIN_LENGTH, XnsNameSimpleValidators } from '../validation/index.ts'\nimport { removeDisallowedCharacters } from './lib/index.ts'\nimport type { ValidSourceTypes } from './types/index.ts'\n\nconst defaultMaskOptions = { maskStartEndHyphens: false }\n\nexport class XnsNameHelper {\n static ValidTLDs = ['.xyo'] as const\n\n private _xnsName: Payload<DomainFields>\n\n private constructor(xnsName: Payload<DomainFields>) {\n this._xnsName = xnsName\n }\n\n get domain() {\n return assertEx(this.xnsName.domain, () => 'domain not found in payload')\n }\n\n get name() {\n return `${this.domain}.${this.tld}`\n }\n\n get tld() {\n return assertEx(this.xnsName.tld, () => 'tld not found in payload')\n }\n\n get xnsName() {\n return assertEx(this._xnsName, () => 'XnsNameHelper xnsName not set')\n }\n\n /**\n * Create an XnsNameHelper from a domain payload\n * @param {Domain} domain\n * @returns Promise<XnsNameHelper>\n */\n static fromPayload(domain: Payload<DomainFields>): Promisable<XnsNameHelper> {\n return new XnsNameHelper(domain)\n }\n\n /**\n * Create an XnsNameHelper from a string\n * @param {string} xnsName\n * @returns Promise<XnsNameHelper>\n */\n static fromString(xnsName: string): XnsNameHelper {\n const parts = xnsName.split('.')\n assertEx(parts.length === 2, () => 'Unable to parse xnsName')\n\n const domain = parts[0]\n const tld = parts[1] as TopLevelDomain\n return new XnsNameHelper({\n schema: DomainSchema, domain, tld,\n })\n }\n\n /**\n * Determine if a string is a valid XNS name or hash\n * @param {string} source?\n * @returns ValidSourceTypes\n */\n static isPotentialXnsNameOrHash(source?: string): ValidSourceTypes {\n if (isHash(source)) return 'hash'\n const xnsName = XnsNameHelper.ValidTLDs.some(tld => source?.endsWith(tld)) ? source : null\n return xnsName ? 'xnsName' : null\n }\n\n static isValid(domain: Payload<DomainFields>): boolean {\n return XnsNameSimpleValidators.every(validator => validator(domain))\n }\n\n /**\n * Mask a string to be a valid XNS name\n * @param {string} str\n * @returns string\n */\n static mask(str: string, options: { maskStartEndHyphens: boolean } = defaultMaskOptions): string {\n // Check if the domain name is too long\n if (str.length > MAX_DOMAIN_LENGTH) {\n throw new Error(`Domain name too long: ${str.length} exceeds max length: ${MAX_DOMAIN_LENGTH}`)\n }\n\n // convert to lowercase\n const lowercaseXnsName = str.toLowerCase()\n\n // Remove everything except letters, numbers, and dashes\n let formattedXnsName = lowercaseXnsName.replaceAll(/[^\\dA-Za-z-]+$/g, '')\n\n // Remove leading and trailing dashes\n if (options.maskStartEndHyphens) formattedXnsName = formattedXnsName.replaceAll(/^-+|-+$/g, '')\n\n // Filter out disallowed characters.\n return removeDisallowedCharacters(formattedXnsName)\n }\n}\n","export const MIN_DOMAIN_LENGTH = 3\nexport const MAX_DOMAIN_LENGTH = 128\n","import type { Payload, PayloadValidationFunction } from '@xyo-network/payload-model'\nimport type { DomainFields } from '@xyo-network/xns-record-payload-plugins'\n\nexport const getDomainReservedStringsValidator = (\n reservedStrings: string[],\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if in one of the reserved name lists\n if (reservedStrings.includes(domain)) {\n console.log('Reserved name')\n return false\n }\n return true\n }\n}\n\nexport const getDomainReservedFragmentsValidator = (\n reservedFragments: string[],\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if any of our fragments are in the name\n for (const reserved of reservedFragments) {\n if (domain.includes(reserved)) {\n console.log('Reserved name fragment')\n return false\n }\n }\n return true\n }\n}\n\nexport const getDomainReservedNamesValidator = (reservedNames: string[]): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if any of our fragments are in the name\n for (const reserved of reservedNames) {\n const parts = reserved.split(' ')\n if (domain === [parts[1], parts[0]].join('') || domain === [parts[0], parts[1]].join('')) {\n console.log('Reserved name')\n return false\n }\n }\n return true\n }\n}\n","import { isModuleName } from '@xyo-network/module-model'\nimport type { Payload, PayloadValidationFunction } from '@xyo-network/payload-model'\nimport type { DomainFields } from '@xyo-network/xns-record-payload-plugins'\n\nimport { MAX_DOMAIN_LENGTH, MIN_DOMAIN_LENGTH } from '../Constants.ts'\n\nexport const domainCasingValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { domain } = payload\n // Check if all lowercase\n if (domain.toLowerCase() !== domain) {\n console.log('name must be lowercase')\n return false\n }\n return true\n}\n\nexport const domainModuleNameValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { domain } = payload\n\n // check if domain is a valid name\n if (!isModuleName(domain)) {\n console.log(`Domain is not a valid module name: ${domain}`)\n return false\n }\n\n return true\n}\n\nexport const domainTldValidator: PayloadValidationFunction<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n) => {\n const { tld } = payload\n // Check if all lowercase\n if (tld.toLowerCase() !== tld) {\n console.log('TLD must be lowercase')\n return false\n }\n // Check if supported TLDs\n if (tld !== 'xyo') {\n console.log('Only XYO TLD currently supported')\n return false\n }\n return true\n}\n\nexport const getDomainLengthValidator = (\n minNameLength = MIN_DOMAIN_LENGTH,\n maxLength = MAX_DOMAIN_LENGTH,\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n // Check if min length\n if (domain.length < minNameLength) {\n console.log(`name must be at least ${minNameLength} characters`)\n return false\n }\n if (domain.length > maxLength) {\n console.log(`name must be at least ${maxLength} characters`)\n return false\n }\n return true\n }\n}\n\nexport const getDomainAllowedHyphensValidator = (\n options?: { end?: boolean; start?: boolean },\n): PayloadValidationFunction<Payload<DomainFields>> => {\n return (payload: Payload<DomainFields>) => {\n const { domain } = payload\n const { start, end } = options ?? {}\n if (!start && domain.startsWith('-')) {\n console.log('name cannot start with hyphen')\n return false\n }\n if (!end && domain.endsWith('-')) {\n console.log('name cannot end with hyphen')\n return false\n }\n return true\n }\n}\n\nexport const XnsNameSimpleValidators = [\n domainCasingValidator,\n domainModuleNameValidator,\n domainTldValidator,\n getDomainLengthValidator(),\n getDomainAllowedHyphensValidator(),\n]\n","import { DisallowedModuleIdentifierCharacters } from '@xyo-network/module-model'\n\n/**\n * A set of all the disallowed characters in module identifiers\n */\nconst DISALLOWED_CHARACTERS = new Set(Object.keys(DisallowedModuleIdentifierCharacters))\n\n/**\n * Iterates over a string removing disallowed characters\n * @param xnsName The XNS name to remove disallowed characters from\n * @returns The XNS name with disallowed characters removed\n */\nexport const removeDisallowedCharacters = (xnsName: string): string => {\n // Create the initial result\n let result = ''\n // Iterate over each character in the XNS name\n for (const char of xnsName) {\n // If the character is not a disallowed character\n if (!DISALLOWED_CHARACTERS.has(char)) {\n // add it to the result\n result += char\n }\n }\n // Return the result which contains only allowed characters\n return result\n}\n"],"mappings":"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","names":[]}
|
|
@@ -16,6 +16,8 @@ export declare class XnsNameHelper {
|
|
|
16
16
|
static fromString(xnsName: string): XnsNameHelper;
|
|
17
17
|
static isPotentialXnsNameOrHash(source?: string): ValidSourceTypes;
|
|
18
18
|
static isValid(domain: Payload<DomainFields>): boolean;
|
|
19
|
-
static mask(str: string
|
|
19
|
+
static mask(str: string, options?: {
|
|
20
|
+
maskStartEndHyphens: boolean;
|
|
21
|
+
}): string;
|
|
20
22
|
}
|
|
21
23
|
//# sourceMappingURL=Name.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Name.d.ts","sourceRoot":"","sources":["../../../../src/validation/name/Name.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,yCAAyC,CAAA;AAK3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"Name.d.ts","sourceRoot":"","sources":["../../../../src/validation/name/Name.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,yCAAyC,CAAA;AAK3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAIxD,qBAAa,aAAa;IACxB,MAAM,CAAC,SAAS,oBAAoB;IAEpC,OAAO,CAAC,QAAQ,CAAuB;IAEvC,OAAO;IAIP,IAAI,MAAM,WAET;IAED,IAAI,IAAI,WAEP;IAED,IAAI,GAAG,UAEN;IAED,IAAI,OAAO;;MAEV;IAOD,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,UAAU,CAAC,aAAa,CAAC;IAS5E,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa;IAgBjD,MAAM,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB;IAMlE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO;IAStD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,mBAAmB,EAAE,OAAO,CAAA;KAAuB,GAAG,MAAM;CAkBjG"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/xns-record-payloadset-plugins",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.13",
|
|
4
4
|
"description": "Typescript/Javascript Plugins for XYO Platform",
|
|
5
5
|
"homepage": "https://xyo.network",
|
|
6
6
|
"bugs": {
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"@xyo-network/module-model": "^3.1.5",
|
|
39
39
|
"@xyo-network/payload-builder": "^3.1.4",
|
|
40
40
|
"@xyo-network/payload-model": "^3.1.4",
|
|
41
|
-
"@xyo-network/xns-record-payload-plugins": "^3.0.
|
|
41
|
+
"@xyo-network/xns-record-payload-plugins": "^3.0.13"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@xylabs/ts-scripts-yarn3": "^4.0.7",
|
|
@@ -9,6 +9,8 @@ import { MAX_DOMAIN_LENGTH, XnsNameSimpleValidators } from '../validation/index.
|
|
|
9
9
|
import { removeDisallowedCharacters } from './lib/index.ts'
|
|
10
10
|
import type { ValidSourceTypes } from './types/index.ts'
|
|
11
11
|
|
|
12
|
+
const defaultMaskOptions = { maskStartEndHyphens: false }
|
|
13
|
+
|
|
12
14
|
export class XnsNameHelper {
|
|
13
15
|
static ValidTLDs = ['.xyo'] as const
|
|
14
16
|
|
|
@@ -70,7 +72,7 @@ export class XnsNameHelper {
|
|
|
70
72
|
return xnsName ? 'xnsName' : null
|
|
71
73
|
}
|
|
72
74
|
|
|
73
|
-
static isValid(domain: Payload<DomainFields>) {
|
|
75
|
+
static isValid(domain: Payload<DomainFields>): boolean {
|
|
74
76
|
return XnsNameSimpleValidators.every(validator => validator(domain))
|
|
75
77
|
}
|
|
76
78
|
|
|
@@ -79,7 +81,7 @@ export class XnsNameHelper {
|
|
|
79
81
|
* @param {string} str
|
|
80
82
|
* @returns string
|
|
81
83
|
*/
|
|
82
|
-
static mask(str: string) {
|
|
84
|
+
static mask(str: string, options: { maskStartEndHyphens: boolean } = defaultMaskOptions): string {
|
|
83
85
|
// Check if the domain name is too long
|
|
84
86
|
if (str.length > MAX_DOMAIN_LENGTH) {
|
|
85
87
|
throw new Error(`Domain name too long: ${str.length} exceeds max length: ${MAX_DOMAIN_LENGTH}`)
|
|
@@ -92,7 +94,7 @@ export class XnsNameHelper {
|
|
|
92
94
|
let formattedXnsName = lowercaseXnsName.replaceAll(/[^\dA-Za-z-]+$/g, '')
|
|
93
95
|
|
|
94
96
|
// Remove leading and trailing dashes
|
|
95
|
-
formattedXnsName = formattedXnsName.replaceAll(/^-+|-+$/g, '')
|
|
97
|
+
if (options.maskStartEndHyphens) formattedXnsName = formattedXnsName.replaceAll(/^-+|-+$/g, '')
|
|
96
98
|
|
|
97
99
|
// Filter out disallowed characters.
|
|
98
100
|
return removeDisallowedCharacters(formattedXnsName)
|