| import { array } from './array.js'; |
| import { getOrCreateLowerAlphaArbitrary, getOrCreateLowerAlphaNumericArbitrary, } from './_internals/builders/CharacterRangeArbitraryBuilder.js'; |
| import { option } from './option.js'; |
| import { string } from './string.js'; |
| import { tuple } from './tuple.js'; |
| import { filterInvalidSubdomainLabel } from './_internals/helpers/InvalidSubdomainLabelFiIter.js'; |
| import { resolveSize, relativeSizeToSize } from './_internals/helpers/MaxLengthFromMinLength.js'; |
| import { adapter } from './_internals/AdapterArbitrary.js'; |
| import { safeJoin, safeSlice, safeSplit, safeSubstring } from '../utils/globals.js'; |
| function toSubdomainLabelMapper([f, d]) { |
| return d === null ? f : `${f}${d[0]}${d[1]}`; |
| } |
| function toSubdomainLabelUnmapper(value) { |
| if (typeof value !== 'string' || value.length === 0) { |
| throw new Error('Unsupported'); |
| } |
| if (value.length === 1) { |
| return [value[0], null]; |
| } |
| return [value[0], [safeSubstring(value, 1, value.length - 1), value[value.length - 1]]]; |
| } |
| function subdomainLabel(size) { |
| const alphaNumericArb = getOrCreateLowerAlphaNumericArbitrary(''); |
| const alphaNumericHyphenArb = getOrCreateLowerAlphaNumericArbitrary('-'); |
| return tuple(alphaNumericArb, option(tuple(string({ unit: alphaNumericHyphenArb, size, maxLength: 61 }), alphaNumericArb))) |
| .map(toSubdomainLabelMapper, toSubdomainLabelUnmapper) |
| .filter(filterInvalidSubdomainLabel); |
| } |
| function labelsMapper(elements) { |
| return `${safeJoin(elements[0], '.')}.${elements[1]}`; |
| } |
| function labelsUnmapper(value) { |
| if (typeof value !== 'string') { |
| throw new Error('Unsupported type'); |
| } |
| const lastDotIndex = value.lastIndexOf('.'); |
| return [safeSplit(safeSubstring(value, 0, lastDotIndex), '.'), safeSubstring(value, lastDotIndex + 1)]; |
| } |
| function labelsAdapter(labels) { |
| const [subDomains, suffix] = labels; |
| let lengthNotIncludingIndex = suffix.length; |
| for (let index = 0; index !== subDomains.length; ++index) { |
| lengthNotIncludingIndex += 1 + subDomains[index].length; |
| if (lengthNotIncludingIndex > 255) { |
| return { adapted: true, value: [safeSlice(subDomains, 0, index), suffix] }; |
| } |
| } |
| return { adapted: false, value: labels }; |
| } |
| export function domain(constraints = {}) { |
| const resolvedSize = resolveSize(constraints.size); |
| const resolvedSizeMinusOne = relativeSizeToSize('-1', resolvedSize); |
| const lowerAlphaArb = getOrCreateLowerAlphaArbitrary(); |
| const publicSuffixArb = string({ unit: lowerAlphaArb, minLength: 2, maxLength: 63, size: resolvedSizeMinusOne }); |
| return (adapter(tuple(array(subdomainLabel(resolvedSize), { size: resolvedSizeMinusOne, minLength: 1, maxLength: 127 }), publicSuffixArb), labelsAdapter).map(labelsMapper, labelsUnmapper)); |
| } |
|
|