@xyo-network/xns-record-payloadset-plugins 3.0.14 → 3.0.16

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.
@@ -91,58 +91,67 @@ var getDomainReservedNamesValidator = (reservedNames) => {
91
91
 
92
92
  // src/validation/validation/validators/validators.ts
93
93
  import { isModuleName } from "@xyo-network/module-model";
94
- var domainCasingValidator = (payload) => {
94
+ var domainCasingValidator = (payload, onErrors) => {
95
95
  const { domain } = payload;
96
96
  if (domain.toLowerCase() !== domain) {
97
- console.log("name must be lowercase");
97
+ onErrors?.(["name must be lowercase"]);
98
98
  return false;
99
99
  }
100
100
  return true;
101
101
  };
102
- var domainModuleNameValidator = (payload) => {
102
+ var domainModuleNameValidator = (payload, onErrors) => {
103
103
  const { domain } = payload;
104
104
  if (!isModuleName(domain)) {
105
- console.log(`Domain is not a valid module name: ${domain}`);
105
+ onErrors?.([`Domain is not a valid module name: ${domain}`]);
106
106
  return false;
107
107
  }
108
108
  return true;
109
109
  };
110
- var domainTldValidator = (payload) => {
110
+ var domainTldValidator = (payload, onErrors) => {
111
111
  const { tld } = payload;
112
+ const errorMessages = [];
112
113
  if (tld.toLowerCase() !== tld) {
113
- console.log("TLD must be lowercase");
114
- return false;
114
+ errorMessages.push("TLD must be lowercase");
115
115
  }
116
116
  if (tld !== "xyo") {
117
- console.log("Only XYO TLD currently supported");
117
+ errorMessages.push("Only XYO TLD currently supported");
118
+ }
119
+ if (errorMessages.length > 0) {
120
+ onErrors?.(errorMessages);
118
121
  return false;
119
122
  }
120
123
  return true;
121
124
  };
122
125
  var getDomainLengthValidator = (minNameLength = MIN_DOMAIN_LENGTH, maxLength = MAX_DOMAIN_LENGTH) => {
123
- return (payload) => {
126
+ return (payload, onErrors) => {
124
127
  const { domain } = payload;
128
+ const errorMessages = [];
125
129
  if (domain.length < minNameLength) {
126
- console.log(`name must be at least ${minNameLength} characters`);
127
- return false;
130
+ errorMessages.push(`name must be at least ${minNameLength} characters`);
128
131
  }
129
132
  if (domain.length > maxLength) {
130
- console.log(`name must be at least ${maxLength} characters`);
133
+ errorMessages.push(`name must be no more than ${maxLength} characters`);
134
+ }
135
+ if (errorMessages.length > 0) {
136
+ onErrors?.(errorMessages);
131
137
  return false;
132
138
  }
133
139
  return true;
134
140
  };
135
141
  };
136
142
  var getDomainAllowedHyphensValidator = (options) => {
137
- return (payload) => {
143
+ return (payload, onErrors) => {
138
144
  const { domain } = payload;
139
145
  const { start, end } = options ?? {};
146
+ const errorMessages = [];
140
147
  if (!start && domain.startsWith("-")) {
141
- console.log("name cannot start with hyphen");
142
- return false;
148
+ errorMessages.push("name cannot start with hyphen");
143
149
  }
144
150
  if (!end && domain.endsWith("-")) {
145
- console.log("name cannot end with hyphen");
151
+ errorMessages.push("name cannot end with hyphen");
152
+ }
153
+ if (errorMessages.length > 0) {
154
+ onErrors?.(errorMessages);
146
155
  return false;
147
156
  }
148
157
  return true;
@@ -155,6 +164,13 @@ var XnsNameSimpleValidators = [
155
164
  getDomainLengthValidator(),
156
165
  getDomainAllowedHyphensValidator()
157
166
  ];
167
+ var XnsNameSimpleValidatorsWithErrors = (onErrors) => [
168
+ domainCasingValidator,
169
+ domainModuleNameValidator,
170
+ domainTldValidator,
171
+ getDomainLengthValidator(),
172
+ getDomainAllowedHyphensValidator()
173
+ ].map((validator) => (payload) => validator(payload, onErrors));
158
174
 
159
175
  // src/validation/name/lib/removeDisallowedCharacters.ts
160
176
  import { DisallowedModuleIdentifierCharacters } from "@xyo-network/module-model";
@@ -240,12 +256,24 @@ var XnsNameHelper = class _XnsNameHelper {
240
256
  if (options.maskStartEndHyphens) formattedXnsName = formattedXnsName.replaceAll(/^-+|-+$/g, "");
241
257
  return removeDisallowedCharacters(formattedXnsName);
242
258
  }
259
+ async validate() {
260
+ const errorMessages = [];
261
+ const onErrorsInternal = (message) => errorMessages.push(...message);
262
+ for (const validator of XnsNameSimpleValidators) {
263
+ await validator(this.xnsName, onErrorsInternal);
264
+ }
265
+ if (errorMessages.length > 0) {
266
+ return [false, errorMessages];
267
+ }
268
+ return [true, []];
269
+ }
243
270
  };
244
271
  export {
245
272
  MAX_DOMAIN_LENGTH,
246
273
  MIN_DOMAIN_LENGTH,
247
274
  XnsNameHelper,
248
275
  XnsNameSimpleValidators,
276
+ XnsNameSimpleValidatorsWithErrors,
249
277
  domainCasingValidator,
250
278
  domainModuleNameValidator,
251
279
  domainTldValidator,
@@ -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\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":[]}
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 async validate(): Promise<[boolean, string[]]> {\n const errorMessages: string[] = []\n const onErrorsInternal = (message: string[]) => errorMessages.push(...message)\n\n for (const validator of XnsNameSimpleValidators) {\n await validator(this.xnsName, onErrorsInternal)\n }\n\n if (errorMessages.length > 0) {\n return [false, errorMessages]\n }\n\n return [true, []]\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 } 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 type PayloadValidationFunctionWithError<T extends Payload = Payload> = (payload: T, onErrors?: (message: string[]) => void) => boolean | Promise<boolean>\n\nexport const domainCasingValidator: PayloadValidationFunctionWithError<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n onErrors?: (message: string[]) => void,\n) => {\n const { domain } = payload\n // Check if all lowercase\n if (domain.toLowerCase() !== domain) {\n onErrors?.(['name must be lowercase'])\n return false\n }\n return true\n}\n\nexport const domainModuleNameValidator: PayloadValidationFunctionWithError<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n onErrors?: (message: string[]) => void,\n) => {\n const { domain } = payload\n\n // check if domain is a valid name\n if (!isModuleName(domain)) {\n onErrors?.([`Domain is not a valid module name: ${domain}`])\n return false\n }\n\n return true\n}\n\nexport const domainTldValidator: PayloadValidationFunctionWithError<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n onErrors?: (message: string[]) => void,\n) => {\n const { tld } = payload\n const errorMessages: string[] = []\n\n // Check if all lowercase\n if (tld.toLowerCase() !== tld) {\n errorMessages.push('TLD must be lowercase')\n }\n // Check if supported TLDs\n if (tld !== 'xyo') {\n errorMessages.push('Only XYO TLD currently supported')\n }\n if (errorMessages.length > 0) {\n onErrors?.(errorMessages)\n return false\n }\n return true\n}\n\nexport const getDomainLengthValidator = (\n minNameLength = MIN_DOMAIN_LENGTH,\n maxLength = MAX_DOMAIN_LENGTH,\n): PayloadValidationFunctionWithError<Payload<DomainFields>> => {\n return (\n payload: Payload<DomainFields>,\n onErrors?: (message: string[]) => void,\n ) => {\n const { domain } = payload\n const errorMessages: string[] = []\n\n // Check if min length\n if (domain.length < minNameLength) {\n errorMessages.push(`name must be at least ${minNameLength} characters`)\n }\n\n if (domain.length > maxLength) {\n errorMessages.push(`name must be no more than ${maxLength} characters`)\n }\n\n if (errorMessages.length > 0) {\n onErrors?.(errorMessages)\n return false\n }\n\n return true\n }\n}\n\nexport const getDomainAllowedHyphensValidator = (\n options?: { end?: boolean; start?: boolean },\n): PayloadValidationFunctionWithError<Payload<DomainFields>> => {\n return (\n payload: Payload<DomainFields>,\n onErrors?: (message: string[]) => void,\n ) => {\n const { domain } = payload\n const { start, end } = options ?? {}\n const errorMessages: string[] = []\n\n if (!start && domain.startsWith('-')) {\n errorMessages.push('name cannot start with hyphen')\n }\n\n if (!end && domain.endsWith('-')) {\n errorMessages.push('name cannot end with hyphen')\n }\n\n if (errorMessages.length > 0) {\n onErrors?.(errorMessages)\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\nexport const XnsNameSimpleValidatorsWithErrors = (onErrors: (message: string[]) => void) => [\n domainCasingValidator,\n domainModuleNameValidator,\n domainTldValidator,\n getDomainLengthValidator(),\n getDomainAllowedHyphensValidator(),\n].map(validator => (payload: Payload<DomainFields>) => validator(payload, onErrors))\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":[]}
@@ -19,5 +19,6 @@ export declare class XnsNameHelper {
19
19
  static mask(str: string, options?: {
20
20
  maskStartEndHyphens: boolean;
21
21
  }): string;
22
+ validate(): Promise<[boolean, string[]]>;
22
23
  }
23
24
  //# 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;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"}
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;IAmB1F,QAAQ,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;CAc/C"}
@@ -1,14 +1,16 @@
1
- import type { Payload, PayloadValidationFunction } from '@xyo-network/payload-model';
1
+ import type { Payload } from '@xyo-network/payload-model';
2
2
  import type { DomainFields } from '@xyo-network/xns-record-payload-plugins';
3
- export declare const domainCasingValidator: PayloadValidationFunction<Payload<DomainFields>>;
4
- export declare const domainModuleNameValidator: PayloadValidationFunction<Payload<DomainFields>>;
5
- export declare const domainTldValidator: PayloadValidationFunction<Payload<DomainFields>>;
6
- export declare const getDomainLengthValidator: (minNameLength?: number, maxLength?: number) => PayloadValidationFunction<Payload<DomainFields>>;
3
+ export type PayloadValidationFunctionWithError<T extends Payload = Payload> = (payload: T, onErrors?: (message: string[]) => void) => boolean | Promise<boolean>;
4
+ export declare const domainCasingValidator: PayloadValidationFunctionWithError<Payload<DomainFields>>;
5
+ export declare const domainModuleNameValidator: PayloadValidationFunctionWithError<Payload<DomainFields>>;
6
+ export declare const domainTldValidator: PayloadValidationFunctionWithError<Payload<DomainFields>>;
7
+ export declare const getDomainLengthValidator: (minNameLength?: number, maxLength?: number) => PayloadValidationFunctionWithError<Payload<DomainFields>>;
7
8
  export declare const getDomainAllowedHyphensValidator: (options?: {
8
9
  end?: boolean;
9
10
  start?: boolean;
10
- }) => PayloadValidationFunction<Payload<DomainFields>>;
11
- export declare const XnsNameSimpleValidators: PayloadValidationFunction<import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & DomainFields & {
11
+ }) => PayloadValidationFunctionWithError<Payload<DomainFields>>;
12
+ export declare const XnsNameSimpleValidators: PayloadValidationFunctionWithError<import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & DomainFields & {
12
13
  schema: import("@xyo-network/payload-model").Schema;
13
14
  }>[];
15
+ export declare const XnsNameSimpleValidatorsWithErrors: (onErrors: (message: string[]) => void) => ((payload: Payload<DomainFields>) => boolean | Promise<boolean>)[];
14
16
  //# sourceMappingURL=validators.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../../../../src/validation/validation/validators/validators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAA;AAI3E,eAAO,MAAM,qBAAqB,EAAE,yBAAyB,CAAC,OAAO,CAAC,YAAY,CAAC,CAUlF,CAAA;AAED,eAAO,MAAM,yBAAyB,EAAE,yBAAyB,CAAC,OAAO,CAAC,YAAY,CAAC,CAYtF,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,yBAAyB,CAAC,OAAO,CAAC,YAAY,CAAC,CAe/E,CAAA;AAED,eAAO,MAAM,wBAAwB,kDAGlC,yBAAyB,CAAC,OAAO,CAAC,YAAY,CAAC,CAcjD,CAAA;AAED,eAAO,MAAM,gCAAgC,aACjC;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,KAC3C,yBAAyB,CAAC,OAAO,CAAC,YAAY,CAAC,CAcjD,CAAA;AAED,eAAO,MAAM,uBAAuB;;IAMnC,CAAA"}
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../../../../src/validation/validation/validators/validators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAA;AAI3E,MAAM,MAAM,kCAAkC,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;AAEhK,eAAO,MAAM,qBAAqB,EAAE,kCAAkC,CAAC,OAAO,CAAC,YAAY,CAAC,CAW3F,CAAA;AAED,eAAO,MAAM,yBAAyB,EAAE,kCAAkC,CAAC,OAAO,CAAC,YAAY,CAAC,CAa/F,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,kCAAkC,CAAC,OAAO,CAAC,YAAY,CAAC,CAoBxF,CAAA;AAED,eAAO,MAAM,wBAAwB,kDAGlC,kCAAkC,CAAC,OAAO,CAAC,YAAY,CAAC,CAwB1D,CAAA;AAED,eAAO,MAAM,gCAAgC,aACjC;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,KAC3C,kCAAkC,CAAC,OAAO,CAAC,YAAY,CAAC,CAuB1D,CAAA;AAED,eAAO,MAAM,uBAAuB;;IAMnC,CAAA;AAED,eAAO,MAAM,iCAAiC,aAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,gBAM1D,OAAO,CAAC,YAAY,CAAC,kCAAkC,CAAA"}
@@ -91,58 +91,67 @@ var getDomainReservedNamesValidator = (reservedNames) => {
91
91
 
92
92
  // src/validation/validation/validators/validators.ts
93
93
  import { isModuleName } from "@xyo-network/module-model";
94
- var domainCasingValidator = (payload) => {
94
+ var domainCasingValidator = (payload, onErrors) => {
95
95
  const { domain } = payload;
96
96
  if (domain.toLowerCase() !== domain) {
97
- console.log("name must be lowercase");
97
+ onErrors?.(["name must be lowercase"]);
98
98
  return false;
99
99
  }
100
100
  return true;
101
101
  };
102
- var domainModuleNameValidator = (payload) => {
102
+ var domainModuleNameValidator = (payload, onErrors) => {
103
103
  const { domain } = payload;
104
104
  if (!isModuleName(domain)) {
105
- console.log(`Domain is not a valid module name: ${domain}`);
105
+ onErrors?.([`Domain is not a valid module name: ${domain}`]);
106
106
  return false;
107
107
  }
108
108
  return true;
109
109
  };
110
- var domainTldValidator = (payload) => {
110
+ var domainTldValidator = (payload, onErrors) => {
111
111
  const { tld } = payload;
112
+ const errorMessages = [];
112
113
  if (tld.toLowerCase() !== tld) {
113
- console.log("TLD must be lowercase");
114
- return false;
114
+ errorMessages.push("TLD must be lowercase");
115
115
  }
116
116
  if (tld !== "xyo") {
117
- console.log("Only XYO TLD currently supported");
117
+ errorMessages.push("Only XYO TLD currently supported");
118
+ }
119
+ if (errorMessages.length > 0) {
120
+ onErrors?.(errorMessages);
118
121
  return false;
119
122
  }
120
123
  return true;
121
124
  };
122
125
  var getDomainLengthValidator = (minNameLength = MIN_DOMAIN_LENGTH, maxLength = MAX_DOMAIN_LENGTH) => {
123
- return (payload) => {
126
+ return (payload, onErrors) => {
124
127
  const { domain } = payload;
128
+ const errorMessages = [];
125
129
  if (domain.length < minNameLength) {
126
- console.log(`name must be at least ${minNameLength} characters`);
127
- return false;
130
+ errorMessages.push(`name must be at least ${minNameLength} characters`);
128
131
  }
129
132
  if (domain.length > maxLength) {
130
- console.log(`name must be at least ${maxLength} characters`);
133
+ errorMessages.push(`name must be no more than ${maxLength} characters`);
134
+ }
135
+ if (errorMessages.length > 0) {
136
+ onErrors?.(errorMessages);
131
137
  return false;
132
138
  }
133
139
  return true;
134
140
  };
135
141
  };
136
142
  var getDomainAllowedHyphensValidator = (options) => {
137
- return (payload) => {
143
+ return (payload, onErrors) => {
138
144
  const { domain } = payload;
139
145
  const { start, end } = options ?? {};
146
+ const errorMessages = [];
140
147
  if (!start && domain.startsWith("-")) {
141
- console.log("name cannot start with hyphen");
142
- return false;
148
+ errorMessages.push("name cannot start with hyphen");
143
149
  }
144
150
  if (!end && domain.endsWith("-")) {
145
- console.log("name cannot end with hyphen");
151
+ errorMessages.push("name cannot end with hyphen");
152
+ }
153
+ if (errorMessages.length > 0) {
154
+ onErrors?.(errorMessages);
146
155
  return false;
147
156
  }
148
157
  return true;
@@ -155,6 +164,13 @@ var XnsNameSimpleValidators = [
155
164
  getDomainLengthValidator(),
156
165
  getDomainAllowedHyphensValidator()
157
166
  ];
167
+ var XnsNameSimpleValidatorsWithErrors = (onErrors) => [
168
+ domainCasingValidator,
169
+ domainModuleNameValidator,
170
+ domainTldValidator,
171
+ getDomainLengthValidator(),
172
+ getDomainAllowedHyphensValidator()
173
+ ].map((validator) => (payload) => validator(payload, onErrors));
158
174
 
159
175
  // src/validation/name/lib/removeDisallowedCharacters.ts
160
176
  import { DisallowedModuleIdentifierCharacters } from "@xyo-network/module-model";
@@ -240,12 +256,24 @@ var XnsNameHelper = class _XnsNameHelper {
240
256
  if (options.maskStartEndHyphens) formattedXnsName = formattedXnsName.replaceAll(/^-+|-+$/g, "");
241
257
  return removeDisallowedCharacters(formattedXnsName);
242
258
  }
259
+ async validate() {
260
+ const errorMessages = [];
261
+ const onErrorsInternal = (message) => errorMessages.push(...message);
262
+ for (const validator of XnsNameSimpleValidators) {
263
+ await validator(this.xnsName, onErrorsInternal);
264
+ }
265
+ if (errorMessages.length > 0) {
266
+ return [false, errorMessages];
267
+ }
268
+ return [true, []];
269
+ }
243
270
  };
244
271
  export {
245
272
  MAX_DOMAIN_LENGTH,
246
273
  MIN_DOMAIN_LENGTH,
247
274
  XnsNameHelper,
248
275
  XnsNameSimpleValidators,
276
+ XnsNameSimpleValidatorsWithErrors,
249
277
  domainCasingValidator,
250
278
  domainModuleNameValidator,
251
279
  domainTldValidator,
@@ -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\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":";AAAA,SAAS,cAAc;AACvB,SAA4B,sBAAsB;AAClD;AAAA,EAC0B;AAAA,EACxB;AAAA,OACK;AACP,SAAS,sBAAsB;AAI/B;AAAA,EAEgC;AAAA,EAA+B;AAAA,OACxD;AAOA,IAAM,uBAAuB,OAAO,aAAoD;AAC7F,MAAI,CAAC,SAAU,QAAO,CAAC;AACvB,QAAM,MAAM,SAET,OAAO,cAAc,EAErB,OAAO,mBAAmB,KAAK,CAAC;AACnC,MAAI,IAAI,WAAW,EAAG,QAAO,CAAC;AAC9B,QAAM,UAAU,MAAM,eAAe,aAAa,QAAQ;AAC1D,SAAO,IAAI,IAAgC,CAAC,OAAO;AACjD,UAAM,oBAAoB;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,kBAAmB;AACxB,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,YAAa;AAClB,WAAO,CAAC,IAAI,mBAAmB,WAAW;AAAA,EAC5C,CAAC,EAAE,OAAO,MAAM;AAClB;AAOA,IAAM,sBAAsB,CAAC,OAA8B;AACzD,SAAO,GAAG,gBAAgB,SAAS,6BAA6B,KAC3D,GAAG,gBAAgB,SAAS,uBAAuB;AAC1D;AAUA,IAAM,qCAAqC,CACzC,IACA,QACA,SACA,aAC4B;AAC5B,QAAM,cAAc,GAAG,gBAAgB,QAAQ,MAAM;AACrD,MAAI,gBAAgB,GAAI;AACxB,QAAM,OAAO,GAAG,eAAe,WAAW;AAC1C,SAAO,CAAC,QAAQ,IAAI,CAAC,EAAE,OAAO,MAAM,EAAE,KAAK,QAAQ;AACrD;;;AC5EA,SAAS,gBAAgB;AACzB,SAAS,cAAc;AAIvB,SAAS,oBAAoB;;;ACLtB,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;;;ACE1B,IAAM,oCAAoC,CAC/C,oBACqD;AACrD,SAAO,CAAC,YAAmC;AACzC,UAAM,EAAE,OAAO,IAAI;AAEnB,QAAI,gBAAgB,SAAS,MAAM,GAAG;AACpC,cAAQ,IAAI,eAAe;AAC3B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;AAEO,IAAM,sCAAsC,CACjD,sBACqD;AACrD,SAAO,CAAC,YAAmC;AACzC,UAAM,EAAE,OAAO,IAAI;AAEnB,eAAW,YAAY,mBAAmB;AACxC,UAAI,OAAO,SAAS,QAAQ,GAAG;AAC7B,gBAAQ,IAAI,wBAAwB;AACpC,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEO,IAAM,kCAAkC,CAAC,kBAA8E;AAC5H,SAAO,CAAC,YAAmC;AACzC,UAAM,EAAE,OAAO,IAAI;AAEnB,eAAW,YAAY,eAAe;AACpC,YAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,UAAI,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG;AACxF,gBAAQ,IAAI,eAAe;AAC3B,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;AC9CA,SAAS,oBAAoB;AAMtB,IAAM,wBAA0E,CACrF,YACG;AACH,QAAM,EAAE,OAAO,IAAI;AAEnB,MAAI,OAAO,YAAY,MAAM,QAAQ;AACnC,YAAQ,IAAI,wBAAwB;AACpC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,4BAA8E,CACzF,YACG;AACH,QAAM,EAAE,OAAO,IAAI;AAGnB,MAAI,CAAC,aAAa,MAAM,GAAG;AACzB,YAAQ,IAAI,sCAAsC,MAAM,EAAE;AAC1D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,IAAM,qBAAuE,CAClF,YACG;AACH,QAAM,EAAE,IAAI,IAAI;AAEhB,MAAI,IAAI,YAAY,MAAM,KAAK;AAC7B,YAAQ,IAAI,uBAAuB;AACnC,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,OAAO;AACjB,YAAQ,IAAI,kCAAkC;AAC9C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,2BAA2B,CACtC,gBAAgB,mBAChB,YAAY,sBACyC;AACrD,SAAO,CAAC,YAAmC;AACzC,UAAM,EAAE,OAAO,IAAI;AAEnB,QAAI,OAAO,SAAS,eAAe;AACjC,cAAQ,IAAI,yBAAyB,aAAa,aAAa;AAC/D,aAAO;AAAA,IACT;AACA,QAAI,OAAO,SAAS,WAAW;AAC7B,cAAQ,IAAI,yBAAyB,SAAS,aAAa;AAC3D,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;AAEO,IAAM,mCAAmC,CAC9C,YACqD;AACrD,SAAO,CAAC,YAAmC;AACzC,UAAM,EAAE,OAAO,IAAI;AACnB,UAAM,EAAE,OAAO,IAAI,IAAI,WAAW,CAAC;AACnC,QAAI,CAAC,SAAS,OAAO,WAAW,GAAG,GAAG;AACpC,cAAQ,IAAI,+BAA+B;AAC3C,aAAO;AAAA,IACT;AACA,QAAI,CAAC,OAAO,OAAO,SAAS,GAAG,GAAG;AAChC,cAAQ,IAAI,6BAA6B;AACzC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;AAEO,IAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA,yBAAyB;AAAA,EACzB,iCAAiC;AACnC;;;AC5FA,SAAS,4CAA4C;AAKrD,IAAM,wBAAwB,IAAI,IAAI,OAAO,KAAK,oCAAoC,CAAC;AAOhF,IAAM,6BAA6B,CAAC,YAA4B;AAErE,MAAI,SAAS;AAEb,aAAW,QAAQ,SAAS;AAE1B,QAAI,CAAC,sBAAsB,IAAI,IAAI,GAAG;AAEpC,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AACT;;;AJdA,IAAM,qBAAqB,EAAE,qBAAqB,MAAM;AAEjD,IAAM,gBAAN,MAAM,eAAc;AAAA,EACzB,OAAO,YAAY,CAAC,MAAM;AAAA,EAElB;AAAA,EAEA,YAAY,SAAgC;AAClD,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,SAAS,KAAK,QAAQ,QAAQ,MAAM,6BAA6B;AAAA,EAC1E;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,GAAG,KAAK,MAAM,IAAI,KAAK,GAAG;AAAA,EACnC;AAAA,EAEA,IAAI,MAAM;AACR,WAAO,SAAS,KAAK,QAAQ,KAAK,MAAM,0BAA0B;AAAA,EACpE;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,SAAS,KAAK,UAAU,MAAM,+BAA+B;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,YAAY,QAA0D;AAC3E,WAAO,IAAI,eAAc,MAAM;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,WAAW,SAAgC;AAChD,UAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,aAAS,MAAM,WAAW,GAAG,MAAM,yBAAyB;AAE5D,UAAM,SAAS,MAAM,CAAC;AACtB,UAAM,MAAM,MAAM,CAAC;AACnB,WAAO,IAAI,eAAc;AAAA,MACvB,QAAQ;AAAA,MAAc;AAAA,MAAQ;AAAA,IAChC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,yBAAyB,QAAmC;AACjE,QAAI,OAAO,MAAM,EAAG,QAAO;AAC3B,UAAM,UAAU,eAAc,UAAU,KAAK,SAAO,QAAQ,SAAS,GAAG,CAAC,IAAI,SAAS;AACtF,WAAO,UAAU,YAAY;AAAA,EAC/B;AAAA,EAEA,OAAO,QAAQ,QAAwC;AACrD,WAAO,wBAAwB,MAAM,eAAa,UAAU,MAAM,CAAC;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,KAAK,KAAa,UAA4C,oBAA4B;AAE/F,QAAI,IAAI,SAAS,mBAAmB;AAClC,YAAM,IAAI,MAAM,yBAAyB,IAAI,MAAM,wBAAwB,iBAAiB,EAAE;AAAA,IAChG;AAGA,UAAM,mBAAmB,IAAI,YAAY;AAGzC,QAAI,mBAAmB,iBAAiB,WAAW,mBAAmB,EAAE;AAGxE,QAAI,QAAQ,oBAAqB,oBAAmB,iBAAiB,WAAW,YAAY,EAAE;AAG9F,WAAO,2BAA2B,gBAAgB;AAAA,EACpD;AACF;","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 async validate(): Promise<[boolean, string[]]> {\n const errorMessages: string[] = []\n const onErrorsInternal = (message: string[]) => errorMessages.push(...message)\n\n for (const validator of XnsNameSimpleValidators) {\n await validator(this.xnsName, onErrorsInternal)\n }\n\n if (errorMessages.length > 0) {\n return [false, errorMessages]\n }\n\n return [true, []]\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 } 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 type PayloadValidationFunctionWithError<T extends Payload = Payload> = (payload: T, onErrors?: (message: string[]) => void) => boolean | Promise<boolean>\n\nexport const domainCasingValidator: PayloadValidationFunctionWithError<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n onErrors?: (message: string[]) => void,\n) => {\n const { domain } = payload\n // Check if all lowercase\n if (domain.toLowerCase() !== domain) {\n onErrors?.(['name must be lowercase'])\n return false\n }\n return true\n}\n\nexport const domainModuleNameValidator: PayloadValidationFunctionWithError<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n onErrors?: (message: string[]) => void,\n) => {\n const { domain } = payload\n\n // check if domain is a valid name\n if (!isModuleName(domain)) {\n onErrors?.([`Domain is not a valid module name: ${domain}`])\n return false\n }\n\n return true\n}\n\nexport const domainTldValidator: PayloadValidationFunctionWithError<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n onErrors?: (message: string[]) => void,\n) => {\n const { tld } = payload\n const errorMessages: string[] = []\n\n // Check if all lowercase\n if (tld.toLowerCase() !== tld) {\n errorMessages.push('TLD must be lowercase')\n }\n // Check if supported TLDs\n if (tld !== 'xyo') {\n errorMessages.push('Only XYO TLD currently supported')\n }\n if (errorMessages.length > 0) {\n onErrors?.(errorMessages)\n return false\n }\n return true\n}\n\nexport const getDomainLengthValidator = (\n minNameLength = MIN_DOMAIN_LENGTH,\n maxLength = MAX_DOMAIN_LENGTH,\n): PayloadValidationFunctionWithError<Payload<DomainFields>> => {\n return (\n payload: Payload<DomainFields>,\n onErrors?: (message: string[]) => void,\n ) => {\n const { domain } = payload\n const errorMessages: string[] = []\n\n // Check if min length\n if (domain.length < minNameLength) {\n errorMessages.push(`name must be at least ${minNameLength} characters`)\n }\n\n if (domain.length > maxLength) {\n errorMessages.push(`name must be no more than ${maxLength} characters`)\n }\n\n if (errorMessages.length > 0) {\n onErrors?.(errorMessages)\n return false\n }\n\n return true\n }\n}\n\nexport const getDomainAllowedHyphensValidator = (\n options?: { end?: boolean; start?: boolean },\n): PayloadValidationFunctionWithError<Payload<DomainFields>> => {\n return (\n payload: Payload<DomainFields>,\n onErrors?: (message: string[]) => void,\n ) => {\n const { domain } = payload\n const { start, end } = options ?? {}\n const errorMessages: string[] = []\n\n if (!start && domain.startsWith('-')) {\n errorMessages.push('name cannot start with hyphen')\n }\n\n if (!end && domain.endsWith('-')) {\n errorMessages.push('name cannot end with hyphen')\n }\n\n if (errorMessages.length > 0) {\n onErrors?.(errorMessages)\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\nexport const XnsNameSimpleValidatorsWithErrors = (onErrors: (message: string[]) => void) => [\n domainCasingValidator,\n domainModuleNameValidator,\n domainTldValidator,\n getDomainLengthValidator(),\n getDomainAllowedHyphensValidator(),\n].map(validator => (payload: Payload<DomainFields>) => validator(payload, onErrors))\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":[]}
@@ -19,5 +19,6 @@ export declare class XnsNameHelper {
19
19
  static mask(str: string, options?: {
20
20
  maskStartEndHyphens: boolean;
21
21
  }): string;
22
+ validate(): Promise<[boolean, string[]]>;
22
23
  }
23
24
  //# 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;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"}
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;IAmB1F,QAAQ,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;CAc/C"}
@@ -1,14 +1,16 @@
1
- import type { Payload, PayloadValidationFunction } from '@xyo-network/payload-model';
1
+ import type { Payload } from '@xyo-network/payload-model';
2
2
  import type { DomainFields } from '@xyo-network/xns-record-payload-plugins';
3
- export declare const domainCasingValidator: PayloadValidationFunction<Payload<DomainFields>>;
4
- export declare const domainModuleNameValidator: PayloadValidationFunction<Payload<DomainFields>>;
5
- export declare const domainTldValidator: PayloadValidationFunction<Payload<DomainFields>>;
6
- export declare const getDomainLengthValidator: (minNameLength?: number, maxLength?: number) => PayloadValidationFunction<Payload<DomainFields>>;
3
+ export type PayloadValidationFunctionWithError<T extends Payload = Payload> = (payload: T, onErrors?: (message: string[]) => void) => boolean | Promise<boolean>;
4
+ export declare const domainCasingValidator: PayloadValidationFunctionWithError<Payload<DomainFields>>;
5
+ export declare const domainModuleNameValidator: PayloadValidationFunctionWithError<Payload<DomainFields>>;
6
+ export declare const domainTldValidator: PayloadValidationFunctionWithError<Payload<DomainFields>>;
7
+ export declare const getDomainLengthValidator: (minNameLength?: number, maxLength?: number) => PayloadValidationFunctionWithError<Payload<DomainFields>>;
7
8
  export declare const getDomainAllowedHyphensValidator: (options?: {
8
9
  end?: boolean;
9
10
  start?: boolean;
10
- }) => PayloadValidationFunction<Payload<DomainFields>>;
11
- export declare const XnsNameSimpleValidators: PayloadValidationFunction<import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & DomainFields & {
11
+ }) => PayloadValidationFunctionWithError<Payload<DomainFields>>;
12
+ export declare const XnsNameSimpleValidators: PayloadValidationFunctionWithError<import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & DomainFields & {
12
13
  schema: import("@xyo-network/payload-model").Schema;
13
14
  }>[];
15
+ export declare const XnsNameSimpleValidatorsWithErrors: (onErrors: (message: string[]) => void) => ((payload: Payload<DomainFields>) => boolean | Promise<boolean>)[];
14
16
  //# sourceMappingURL=validators.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../../../../src/validation/validation/validators/validators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAA;AAI3E,eAAO,MAAM,qBAAqB,EAAE,yBAAyB,CAAC,OAAO,CAAC,YAAY,CAAC,CAUlF,CAAA;AAED,eAAO,MAAM,yBAAyB,EAAE,yBAAyB,CAAC,OAAO,CAAC,YAAY,CAAC,CAYtF,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,yBAAyB,CAAC,OAAO,CAAC,YAAY,CAAC,CAe/E,CAAA;AAED,eAAO,MAAM,wBAAwB,kDAGlC,yBAAyB,CAAC,OAAO,CAAC,YAAY,CAAC,CAcjD,CAAA;AAED,eAAO,MAAM,gCAAgC,aACjC;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,KAC3C,yBAAyB,CAAC,OAAO,CAAC,YAAY,CAAC,CAcjD,CAAA;AAED,eAAO,MAAM,uBAAuB;;IAMnC,CAAA"}
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../../../../src/validation/validation/validators/validators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAA;AAI3E,MAAM,MAAM,kCAAkC,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;AAEhK,eAAO,MAAM,qBAAqB,EAAE,kCAAkC,CAAC,OAAO,CAAC,YAAY,CAAC,CAW3F,CAAA;AAED,eAAO,MAAM,yBAAyB,EAAE,kCAAkC,CAAC,OAAO,CAAC,YAAY,CAAC,CAa/F,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,kCAAkC,CAAC,OAAO,CAAC,YAAY,CAAC,CAoBxF,CAAA;AAED,eAAO,MAAM,wBAAwB,kDAGlC,kCAAkC,CAAC,OAAO,CAAC,YAAY,CAAC,CAwB1D,CAAA;AAED,eAAO,MAAM,gCAAgC,aACjC;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,KAC3C,kCAAkC,CAAC,OAAO,CAAC,YAAY,CAAC,CAuB1D,CAAA;AAED,eAAO,MAAM,uBAAuB;;IAMnC,CAAA;AAED,eAAO,MAAM,iCAAiC,aAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,gBAM1D,OAAO,CAAC,YAAY,CAAC,kCAAkC,CAAA"}
@@ -91,58 +91,67 @@ var getDomainReservedNamesValidator = (reservedNames) => {
91
91
 
92
92
  // src/validation/validation/validators/validators.ts
93
93
  import { isModuleName } from "@xyo-network/module-model";
94
- var domainCasingValidator = (payload) => {
94
+ var domainCasingValidator = (payload, onErrors) => {
95
95
  const { domain } = payload;
96
96
  if (domain.toLowerCase() !== domain) {
97
- console.log("name must be lowercase");
97
+ onErrors?.(["name must be lowercase"]);
98
98
  return false;
99
99
  }
100
100
  return true;
101
101
  };
102
- var domainModuleNameValidator = (payload) => {
102
+ var domainModuleNameValidator = (payload, onErrors) => {
103
103
  const { domain } = payload;
104
104
  if (!isModuleName(domain)) {
105
- console.log(`Domain is not a valid module name: ${domain}`);
105
+ onErrors?.([`Domain is not a valid module name: ${domain}`]);
106
106
  return false;
107
107
  }
108
108
  return true;
109
109
  };
110
- var domainTldValidator = (payload) => {
110
+ var domainTldValidator = (payload, onErrors) => {
111
111
  const { tld } = payload;
112
+ const errorMessages = [];
112
113
  if (tld.toLowerCase() !== tld) {
113
- console.log("TLD must be lowercase");
114
- return false;
114
+ errorMessages.push("TLD must be lowercase");
115
115
  }
116
116
  if (tld !== "xyo") {
117
- console.log("Only XYO TLD currently supported");
117
+ errorMessages.push("Only XYO TLD currently supported");
118
+ }
119
+ if (errorMessages.length > 0) {
120
+ onErrors?.(errorMessages);
118
121
  return false;
119
122
  }
120
123
  return true;
121
124
  };
122
125
  var getDomainLengthValidator = (minNameLength = MIN_DOMAIN_LENGTH, maxLength = MAX_DOMAIN_LENGTH) => {
123
- return (payload) => {
126
+ return (payload, onErrors) => {
124
127
  const { domain } = payload;
128
+ const errorMessages = [];
125
129
  if (domain.length < minNameLength) {
126
- console.log(`name must be at least ${minNameLength} characters`);
127
- return false;
130
+ errorMessages.push(`name must be at least ${minNameLength} characters`);
128
131
  }
129
132
  if (domain.length > maxLength) {
130
- console.log(`name must be at least ${maxLength} characters`);
133
+ errorMessages.push(`name must be no more than ${maxLength} characters`);
134
+ }
135
+ if (errorMessages.length > 0) {
136
+ onErrors?.(errorMessages);
131
137
  return false;
132
138
  }
133
139
  return true;
134
140
  };
135
141
  };
136
142
  var getDomainAllowedHyphensValidator = (options) => {
137
- return (payload) => {
143
+ return (payload, onErrors) => {
138
144
  const { domain } = payload;
139
145
  const { start, end } = options ?? {};
146
+ const errorMessages = [];
140
147
  if (!start && domain.startsWith("-")) {
141
- console.log("name cannot start with hyphen");
142
- return false;
148
+ errorMessages.push("name cannot start with hyphen");
143
149
  }
144
150
  if (!end && domain.endsWith("-")) {
145
- console.log("name cannot end with hyphen");
151
+ errorMessages.push("name cannot end with hyphen");
152
+ }
153
+ if (errorMessages.length > 0) {
154
+ onErrors?.(errorMessages);
146
155
  return false;
147
156
  }
148
157
  return true;
@@ -155,6 +164,13 @@ var XnsNameSimpleValidators = [
155
164
  getDomainLengthValidator(),
156
165
  getDomainAllowedHyphensValidator()
157
166
  ];
167
+ var XnsNameSimpleValidatorsWithErrors = (onErrors) => [
168
+ domainCasingValidator,
169
+ domainModuleNameValidator,
170
+ domainTldValidator,
171
+ getDomainLengthValidator(),
172
+ getDomainAllowedHyphensValidator()
173
+ ].map((validator) => (payload) => validator(payload, onErrors));
158
174
 
159
175
  // src/validation/name/lib/removeDisallowedCharacters.ts
160
176
  import { DisallowedModuleIdentifierCharacters } from "@xyo-network/module-model";
@@ -240,12 +256,24 @@ var XnsNameHelper = class _XnsNameHelper {
240
256
  if (options.maskStartEndHyphens) formattedXnsName = formattedXnsName.replaceAll(/^-+|-+$/g, "");
241
257
  return removeDisallowedCharacters(formattedXnsName);
242
258
  }
259
+ async validate() {
260
+ const errorMessages = [];
261
+ const onErrorsInternal = (message) => errorMessages.push(...message);
262
+ for (const validator of XnsNameSimpleValidators) {
263
+ await validator(this.xnsName, onErrorsInternal);
264
+ }
265
+ if (errorMessages.length > 0) {
266
+ return [false, errorMessages];
267
+ }
268
+ return [true, []];
269
+ }
243
270
  };
244
271
  export {
245
272
  MAX_DOMAIN_LENGTH,
246
273
  MIN_DOMAIN_LENGTH,
247
274
  XnsNameHelper,
248
275
  XnsNameSimpleValidators,
276
+ XnsNameSimpleValidatorsWithErrors,
249
277
  domainCasingValidator,
250
278
  domainModuleNameValidator,
251
279
  domainTldValidator,
@@ -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\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":[]}
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 async validate(): Promise<[boolean, string[]]> {\n const errorMessages: string[] = []\n const onErrorsInternal = (message: string[]) => errorMessages.push(...message)\n\n for (const validator of XnsNameSimpleValidators) {\n await validator(this.xnsName, onErrorsInternal)\n }\n\n if (errorMessages.length > 0) {\n return [false, errorMessages]\n }\n\n return [true, []]\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 } 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 type PayloadValidationFunctionWithError<T extends Payload = Payload> = (payload: T, onErrors?: (message: string[]) => void) => boolean | Promise<boolean>\n\nexport const domainCasingValidator: PayloadValidationFunctionWithError<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n onErrors?: (message: string[]) => void,\n) => {\n const { domain } = payload\n // Check if all lowercase\n if (domain.toLowerCase() !== domain) {\n onErrors?.(['name must be lowercase'])\n return false\n }\n return true\n}\n\nexport const domainModuleNameValidator: PayloadValidationFunctionWithError<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n onErrors?: (message: string[]) => void,\n) => {\n const { domain } = payload\n\n // check if domain is a valid name\n if (!isModuleName(domain)) {\n onErrors?.([`Domain is not a valid module name: ${domain}`])\n return false\n }\n\n return true\n}\n\nexport const domainTldValidator: PayloadValidationFunctionWithError<Payload<DomainFields>> = (\n payload: Payload<DomainFields>,\n onErrors?: (message: string[]) => void,\n) => {\n const { tld } = payload\n const errorMessages: string[] = []\n\n // Check if all lowercase\n if (tld.toLowerCase() !== tld) {\n errorMessages.push('TLD must be lowercase')\n }\n // Check if supported TLDs\n if (tld !== 'xyo') {\n errorMessages.push('Only XYO TLD currently supported')\n }\n if (errorMessages.length > 0) {\n onErrors?.(errorMessages)\n return false\n }\n return true\n}\n\nexport const getDomainLengthValidator = (\n minNameLength = MIN_DOMAIN_LENGTH,\n maxLength = MAX_DOMAIN_LENGTH,\n): PayloadValidationFunctionWithError<Payload<DomainFields>> => {\n return (\n payload: Payload<DomainFields>,\n onErrors?: (message: string[]) => void,\n ) => {\n const { domain } = payload\n const errorMessages: string[] = []\n\n // Check if min length\n if (domain.length < minNameLength) {\n errorMessages.push(`name must be at least ${minNameLength} characters`)\n }\n\n if (domain.length > maxLength) {\n errorMessages.push(`name must be no more than ${maxLength} characters`)\n }\n\n if (errorMessages.length > 0) {\n onErrors?.(errorMessages)\n return false\n }\n\n return true\n }\n}\n\nexport const getDomainAllowedHyphensValidator = (\n options?: { end?: boolean; start?: boolean },\n): PayloadValidationFunctionWithError<Payload<DomainFields>> => {\n return (\n payload: Payload<DomainFields>,\n onErrors?: (message: string[]) => void,\n ) => {\n const { domain } = payload\n const { start, end } = options ?? {}\n const errorMessages: string[] = []\n\n if (!start && domain.startsWith('-')) {\n errorMessages.push('name cannot start with hyphen')\n }\n\n if (!end && domain.endsWith('-')) {\n errorMessages.push('name cannot end with hyphen')\n }\n\n if (errorMessages.length > 0) {\n onErrors?.(errorMessages)\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\nexport const XnsNameSimpleValidatorsWithErrors = (onErrors: (message: string[]) => void) => [\n domainCasingValidator,\n domainModuleNameValidator,\n domainTldValidator,\n getDomainLengthValidator(),\n getDomainAllowedHyphensValidator(),\n].map(validator => (payload: Payload<DomainFields>) => validator(payload, onErrors))\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":[]}
@@ -19,5 +19,6 @@ export declare class XnsNameHelper {
19
19
  static mask(str: string, options?: {
20
20
  maskStartEndHyphens: boolean;
21
21
  }): string;
22
+ validate(): Promise<[boolean, string[]]>;
22
23
  }
23
24
  //# 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;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"}
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;IAmB1F,QAAQ,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;CAc/C"}
@@ -1,14 +1,16 @@
1
- import type { Payload, PayloadValidationFunction } from '@xyo-network/payload-model';
1
+ import type { Payload } from '@xyo-network/payload-model';
2
2
  import type { DomainFields } from '@xyo-network/xns-record-payload-plugins';
3
- export declare const domainCasingValidator: PayloadValidationFunction<Payload<DomainFields>>;
4
- export declare const domainModuleNameValidator: PayloadValidationFunction<Payload<DomainFields>>;
5
- export declare const domainTldValidator: PayloadValidationFunction<Payload<DomainFields>>;
6
- export declare const getDomainLengthValidator: (minNameLength?: number, maxLength?: number) => PayloadValidationFunction<Payload<DomainFields>>;
3
+ export type PayloadValidationFunctionWithError<T extends Payload = Payload> = (payload: T, onErrors?: (message: string[]) => void) => boolean | Promise<boolean>;
4
+ export declare const domainCasingValidator: PayloadValidationFunctionWithError<Payload<DomainFields>>;
5
+ export declare const domainModuleNameValidator: PayloadValidationFunctionWithError<Payload<DomainFields>>;
6
+ export declare const domainTldValidator: PayloadValidationFunctionWithError<Payload<DomainFields>>;
7
+ export declare const getDomainLengthValidator: (minNameLength?: number, maxLength?: number) => PayloadValidationFunctionWithError<Payload<DomainFields>>;
7
8
  export declare const getDomainAllowedHyphensValidator: (options?: {
8
9
  end?: boolean;
9
10
  start?: boolean;
10
- }) => PayloadValidationFunction<Payload<DomainFields>>;
11
- export declare const XnsNameSimpleValidators: PayloadValidationFunction<import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & DomainFields & {
11
+ }) => PayloadValidationFunctionWithError<Payload<DomainFields>>;
12
+ export declare const XnsNameSimpleValidators: PayloadValidationFunctionWithError<import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & DomainFields & {
12
13
  schema: import("@xyo-network/payload-model").Schema;
13
14
  }>[];
15
+ export declare const XnsNameSimpleValidatorsWithErrors: (onErrors: (message: string[]) => void) => ((payload: Payload<DomainFields>) => boolean | Promise<boolean>)[];
14
16
  //# sourceMappingURL=validators.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../../../../src/validation/validation/validators/validators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAA;AAI3E,eAAO,MAAM,qBAAqB,EAAE,yBAAyB,CAAC,OAAO,CAAC,YAAY,CAAC,CAUlF,CAAA;AAED,eAAO,MAAM,yBAAyB,EAAE,yBAAyB,CAAC,OAAO,CAAC,YAAY,CAAC,CAYtF,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,yBAAyB,CAAC,OAAO,CAAC,YAAY,CAAC,CAe/E,CAAA;AAED,eAAO,MAAM,wBAAwB,kDAGlC,yBAAyB,CAAC,OAAO,CAAC,YAAY,CAAC,CAcjD,CAAA;AAED,eAAO,MAAM,gCAAgC,aACjC;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,KAC3C,yBAAyB,CAAC,OAAO,CAAC,YAAY,CAAC,CAcjD,CAAA;AAED,eAAO,MAAM,uBAAuB;;IAMnC,CAAA"}
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../../../../src/validation/validation/validators/validators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAA;AAI3E,MAAM,MAAM,kCAAkC,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;AAEhK,eAAO,MAAM,qBAAqB,EAAE,kCAAkC,CAAC,OAAO,CAAC,YAAY,CAAC,CAW3F,CAAA;AAED,eAAO,MAAM,yBAAyB,EAAE,kCAAkC,CAAC,OAAO,CAAC,YAAY,CAAC,CAa/F,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,kCAAkC,CAAC,OAAO,CAAC,YAAY,CAAC,CAoBxF,CAAA;AAED,eAAO,MAAM,wBAAwB,kDAGlC,kCAAkC,CAAC,OAAO,CAAC,YAAY,CAAC,CAwB1D,CAAA;AAED,eAAO,MAAM,gCAAgC,aACjC;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,KAC3C,kCAAkC,CAAC,OAAO,CAAC,YAAY,CAAC,CAuB1D,CAAA;AAED,eAAO,MAAM,uBAAuB;;IAMnC,CAAA;AAED,eAAO,MAAM,iCAAiC,aAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,gBAM1D,OAAO,CAAC,YAAY,CAAC,kCAAkC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/xns-record-payloadset-plugins",
3
- "version": "3.0.14",
3
+ "version": "3.0.16",
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.14"
41
+ "@xyo-network/xns-record-payload-plugins": "^3.0.16"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@xylabs/ts-scripts-yarn3": "^4.0.7",
@@ -99,4 +99,19 @@ export class XnsNameHelper {
99
99
  // Filter out disallowed characters.
100
100
  return removeDisallowedCharacters(formattedXnsName)
101
101
  }
102
+
103
+ async validate(): Promise<[boolean, string[]]> {
104
+ const errorMessages: string[] = []
105
+ const onErrorsInternal = (message: string[]) => errorMessages.push(...message)
106
+
107
+ for (const validator of XnsNameSimpleValidators) {
108
+ await validator(this.xnsName, onErrorsInternal)
109
+ }
110
+
111
+ if (errorMessages.length > 0) {
112
+ return [false, errorMessages]
113
+ }
114
+
115
+ return [true, []]
116
+ }
102
117
  }
@@ -1,47 +1,56 @@
1
1
  import { isModuleName } from '@xyo-network/module-model'
2
- import type { Payload, PayloadValidationFunction } from '@xyo-network/payload-model'
2
+ import type { Payload } from '@xyo-network/payload-model'
3
3
  import type { DomainFields } from '@xyo-network/xns-record-payload-plugins'
4
4
 
5
5
  import { MAX_DOMAIN_LENGTH, MIN_DOMAIN_LENGTH } from '../Constants.ts'
6
6
 
7
- export const domainCasingValidator: PayloadValidationFunction<Payload<DomainFields>> = (
7
+ export type PayloadValidationFunctionWithError<T extends Payload = Payload> = (payload: T, onErrors?: (message: string[]) => void) => boolean | Promise<boolean>
8
+
9
+ export const domainCasingValidator: PayloadValidationFunctionWithError<Payload<DomainFields>> = (
8
10
  payload: Payload<DomainFields>,
11
+ onErrors?: (message: string[]) => void,
9
12
  ) => {
10
13
  const { domain } = payload
11
14
  // Check if all lowercase
12
15
  if (domain.toLowerCase() !== domain) {
13
- console.log('name must be lowercase')
16
+ onErrors?.(['name must be lowercase'])
14
17
  return false
15
18
  }
16
19
  return true
17
20
  }
18
21
 
19
- export const domainModuleNameValidator: PayloadValidationFunction<Payload<DomainFields>> = (
22
+ export const domainModuleNameValidator: PayloadValidationFunctionWithError<Payload<DomainFields>> = (
20
23
  payload: Payload<DomainFields>,
24
+ onErrors?: (message: string[]) => void,
21
25
  ) => {
22
26
  const { domain } = payload
23
27
 
24
28
  // check if domain is a valid name
25
29
  if (!isModuleName(domain)) {
26
- console.log(`Domain is not a valid module name: ${domain}`)
30
+ onErrors?.([`Domain is not a valid module name: ${domain}`])
27
31
  return false
28
32
  }
29
33
 
30
34
  return true
31
35
  }
32
36
 
33
- export const domainTldValidator: PayloadValidationFunction<Payload<DomainFields>> = (
37
+ export const domainTldValidator: PayloadValidationFunctionWithError<Payload<DomainFields>> = (
34
38
  payload: Payload<DomainFields>,
39
+ onErrors?: (message: string[]) => void,
35
40
  ) => {
36
41
  const { tld } = payload
42
+ const errorMessages: string[] = []
43
+
37
44
  // Check if all lowercase
38
45
  if (tld.toLowerCase() !== tld) {
39
- console.log('TLD must be lowercase')
40
- return false
46
+ errorMessages.push('TLD must be lowercase')
41
47
  }
42
48
  // Check if supported TLDs
43
49
  if (tld !== 'xyo') {
44
- console.log('Only XYO TLD currently supported')
50
+ errorMessages.push('Only XYO TLD currently supported')
51
+ }
52
+ if (errorMessages.length > 0) {
53
+ onErrors?.(errorMessages)
45
54
  return false
46
55
  }
47
56
  return true
@@ -50,34 +59,53 @@ export const domainTldValidator: PayloadValidationFunction<Payload<DomainFields>
50
59
  export const getDomainLengthValidator = (
51
60
  minNameLength = MIN_DOMAIN_LENGTH,
52
61
  maxLength = MAX_DOMAIN_LENGTH,
53
- ): PayloadValidationFunction<Payload<DomainFields>> => {
54
- return (payload: Payload<DomainFields>) => {
62
+ ): PayloadValidationFunctionWithError<Payload<DomainFields>> => {
63
+ return (
64
+ payload: Payload<DomainFields>,
65
+ onErrors?: (message: string[]) => void,
66
+ ) => {
55
67
  const { domain } = payload
68
+ const errorMessages: string[] = []
69
+
56
70
  // Check if min length
57
71
  if (domain.length < minNameLength) {
58
- console.log(`name must be at least ${minNameLength} characters`)
59
- return false
72
+ errorMessages.push(`name must be at least ${minNameLength} characters`)
60
73
  }
74
+
61
75
  if (domain.length > maxLength) {
62
- console.log(`name must be at least ${maxLength} characters`)
76
+ errorMessages.push(`name must be no more than ${maxLength} characters`)
77
+ }
78
+
79
+ if (errorMessages.length > 0) {
80
+ onErrors?.(errorMessages)
63
81
  return false
64
82
  }
83
+
65
84
  return true
66
85
  }
67
86
  }
68
87
 
69
88
  export const getDomainAllowedHyphensValidator = (
70
89
  options?: { end?: boolean; start?: boolean },
71
- ): PayloadValidationFunction<Payload<DomainFields>> => {
72
- return (payload: Payload<DomainFields>) => {
90
+ ): PayloadValidationFunctionWithError<Payload<DomainFields>> => {
91
+ return (
92
+ payload: Payload<DomainFields>,
93
+ onErrors?: (message: string[]) => void,
94
+ ) => {
73
95
  const { domain } = payload
74
96
  const { start, end } = options ?? {}
97
+ const errorMessages: string[] = []
98
+
75
99
  if (!start && domain.startsWith('-')) {
76
- console.log('name cannot start with hyphen')
77
- return false
100
+ errorMessages.push('name cannot start with hyphen')
78
101
  }
102
+
79
103
  if (!end && domain.endsWith('-')) {
80
- console.log('name cannot end with hyphen')
104
+ errorMessages.push('name cannot end with hyphen')
105
+ }
106
+
107
+ if (errorMessages.length > 0) {
108
+ onErrors?.(errorMessages)
81
109
  return false
82
110
  }
83
111
  return true
@@ -91,3 +119,11 @@ export const XnsNameSimpleValidators = [
91
119
  getDomainLengthValidator(),
92
120
  getDomainAllowedHyphensValidator(),
93
121
  ]
122
+
123
+ export const XnsNameSimpleValidatorsWithErrors = (onErrors: (message: string[]) => void) => [
124
+ domainCasingValidator,
125
+ domainModuleNameValidator,
126
+ domainTldValidator,
127
+ getDomainLengthValidator(),
128
+ getDomainAllowedHyphensValidator(),
129
+ ].map(validator => (payload: Payload<DomainFields>) => validator(payload, onErrors))