UNPKG

@openshift-assisted/ui-lib

Version:

React component library for the Assisted Installer UI

461 lines 25.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.IPv4ValidationSchema = exports.dualStackValidationSchema = exports.serviceNetworkValidationSchema = exports.clusterNetworksValidationSchema = exports.machineNetworksValidationSchema = exports.locationValidationSchema = exports.bmcAddressValidationSchema = exports.day2ApiVipValidationSchema = exports.ntpSourceValidationSchema = exports.noProxyValidationSchema = exports.httpProxyValidationSchema = exports.richHostnameValidationSchema = exports.richNameValidationSchema = exports.hostPrefixValidationSchema = exports.baseDomainValidationSchema = exports.dnsNameValidationSchema = exports.ipBlockValidationSchema = exports.vipArrayValidationSchema = exports.vipNoSuffixValidationSchema = exports.vipValidationSchema = exports.hostSubnetValidationSchema = exports.vipRangeValidationSchema = exports.macAddressValidationSchema = exports.ipNoSuffixValidationSchema = exports.ipValidationSchema = exports.pullSecretValidationSchema = exports.sshPublicKeyListValidationSchema = exports.sshPublicKeyValidationSchema = exports.nameValidationSchema = void 0; const tslib_1 = require("tslib"); const cidr_tools_1 = require("cidr-tools"); const ip_address_1 = require("ip-address"); const is_cidr_1 = tslib_1.__importDefault(require("is-cidr")); const is_in_subnet_1 = require("is-in-subnet"); const Yup = tslib_1.__importStar(require("yup")); const lodash_es_1 = require("lodash-es"); const parse_url_1 = tslib_1.__importDefault(require("parse-url")); const constants_1 = require("../../../config/constants"); const utils_1 = require("../../clusterConfiguration/utils"); const constants_2 = require("./constants"); const utils_2 = require("./utils"); const selectors_1 = require("../../../selectors"); const ALPHANUMERIC_REGEX = /^[a-zA-Z0-9]+$/; const NAME_START_END_REGEX = /^[a-z0-9](.*[a-z0-9])?$/; const NAME_CHARS_REGEX = /^[a-z0-9-.]*$/; const CLUSTER_NAME_START_END_REGEX = /^[a-z0-9](.*[a-z0-9])?$/; const CLUSTER_NAME_VALID_CHARS_REGEX = /^[a-z0-9-]*$/; const SSH_PUBLIC_KEY_REGEX = /^(ssh-rsa AAAAB3NzaC1yc2|ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNT|ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzOD|ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1Mj|ssh-ed25519 AAAAC3NzaC1lZDI1NTE5|ssh-dss AAAAB3NzaC1kc3)[0-9A-Za-z+/]+[=]{0,3}( .*)?$/; const DNS_NAME_REGEX = /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/; const PROXY_DNS_REGEX = /(^\.?([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*$)/; const IP_V4_ZERO = '0.0.0.0'; const IP_V6_ZERO = '0000:0000:0000:0000:0000:0000:0000:0000'; const MAC_REGEX = /^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$/; const HOST_NAME_REGEX = /^[^.]{1,63}(?:[.][^.]{1,63})*$/; const LOCATION_CHARS_REGEX = /^[a-zA-Z0-9-._]*$/; const nameValidationSchema = (t, usedClusterNames, baseDnsDomain = '', validateUniqueName, isOcm = false) => { const clusterNameValidationMessagesList = (0, constants_2.clusterNameValidationMessages)(t); return Yup.string() .required('Required') .matches(CLUSTER_NAME_VALID_CHARS_REGEX, { message: clusterNameValidationMessagesList.INVALID_VALUE, excludeEmptyString: true, }) .matches(CLUSTER_NAME_START_END_REGEX, { message: clusterNameValidationMessagesList.INVALID_START_END, excludeEmptyString: true, }) .min(isOcm ? 1 : 2, isOcm ? clusterNameValidationMessagesList.INVALID_LENGTH_OCM : clusterNameValidationMessagesList.INVALID_LENGTH_ACM) .max(constants_2.CLUSTER_NAME_MAX_LENGTH, isOcm ? clusterNameValidationMessagesList.INVALID_LENGTH_OCM : clusterNameValidationMessagesList.INVALID_LENGTH_ACM) .when('useRedHatDnsService', { is: (useRedHatDnsService) => useRedHatDnsService === true, then: (schema) => schema.test('is-name-unique', clusterNameValidationMessagesList.NOT_UNIQUE, (value) => { const clusterFullName = `${value || ''}.${baseDnsDomain}`; return !value || !usedClusterNames.includes(clusterFullName); }), otherwise: (schema) => schema.test('is-name-unique', clusterNameValidationMessagesList.NOT_UNIQUE, (value) => { // in CIM cluster name is ClusterDeployment CR name which must be unique return validateUniqueName ? !value || !usedClusterNames.includes(value) : true; }), }); }; exports.nameValidationSchema = nameValidationSchema; exports.sshPublicKeyValidationSchema = Yup.string().test('ssh-public-key', 'SSH public key must consist of "[TYPE] key [[EMAIL]]", supported types are: ssh-rsa, ssh-ed25519, ecdsa-[VARIANT]. A single key can be provided only.', (value) => { if (!value) { return true; } return !!(0, utils_2.trimSshPublicKey)(value).match(SSH_PUBLIC_KEY_REGEX); }); exports.sshPublicKeyListValidationSchema = Yup.string() .test('ssh-public-keys', 'SSH public key must consist of "[TYPE] key [[EMAIL]]", supported types are: ssh-rsa, ssh-ed25519, ecdsa-[VARIANT].', (value) => { if (!value) { return true; } return !!(0, utils_2.trimSshPublicKey)(value).match(SSH_PUBLIC_KEY_REGEX); // disable until mutliple keys are supported (https://issues.redhat.com/browse/METAL-250) // return ( // trimSshPublicKey(value) // .split('\n') // .find((line: string) => !line.match(SSH_PUBLIC_KEY_REGEX)) === undefined // ); }) .test('ssh-public-keys-unique', 'SSH public keys must be unique.', (value) => { if (!value) { return true; } const keyList = (0, utils_2.trimSshPublicKey)(value).split('\n'); return new Set(keyList).size === keyList.length; }); exports.pullSecretValidationSchema = Yup.string().test('is-well-formed-json', "Invalid pull secret format. You must use your Red Hat account's pull secret.", (value) => { const isValid = true; if (!value) return isValid; try { const pullSecret = JSON.parse(value); return (pullSecret.constructor.name === 'Object' && !!(pullSecret === null || pullSecret === void 0 ? void 0 : pullSecret.auths) && pullSecret.auths.constructor.name === 'Object'); } catch (_a) { return !isValid; } }); const isValidIpWithoutSuffix = (addr) => { const address = (0, utils_2.getAddress)(addr); return !!address && address.address === address.addressMinusSuffix; }; exports.ipValidationSchema = Yup.string().test('ip-validation', 'Not a valid IP address', (value) => ip_address_1.Address4.isValid(value || '') || ip_address_1.Address6.isValid(value || '')); exports.ipNoSuffixValidationSchema = Yup.string().test('ip-validation-no-suffix', 'Not a valid IP address', (value) => { return isValidIpWithoutSuffix(value || ''); }); exports.macAddressValidationSchema = Yup.string().matches(MAC_REGEX, { message: 'Value "${value}" is not valid MAC address.', excludeEmptyString: true, }); const vipRangeValidationSchema = (hostSubnets, { machineNetworks, hostSubnet }, allowSuffix) => Yup.string().test('vip-validation', 'IP Address is outside of selected subnet', (value) => { if (!value) { return true; } try { const validator = allowSuffix ? exports.ipValidationSchema : exports.ipNoSuffixValidationSchema; validator.validateSync(value); } catch (err) { return true; } const foundHostSubnets = []; if (machineNetworks) { const cidrs = machineNetworks === null || machineNetworks === void 0 ? void 0 : machineNetworks.map((network) => network.cidr); foundHostSubnets.push(...hostSubnets.filter((hn) => cidrs === null || cidrs === void 0 ? void 0 : cidrs.includes(hn.subnet))); } else { const subnet = hostSubnets.find((hn) => hn.subnet === hostSubnet); if (subnet) { foundHostSubnets.push(subnet); } } for (const hostSubnet of foundHostSubnets) { if (hostSubnet === null || hostSubnet === void 0 ? void 0 : hostSubnet.subnet) { // Workaround for bug in CIM backend. hostIDs are empty if (!hostSubnet.hostIDs.length) { return true; } else if ((0, is_in_subnet_1.isInSubnet)(value, hostSubnet.subnet)) { return true; } } } return false; }); exports.vipRangeValidationSchema = vipRangeValidationSchema; const vipUniqueValidationSchema = ({ ingressVips, apiVips, apiVip, ingressVip }, useIPArray) => Yup.string().test('vip-uniqueness-validation', 'The Ingress and API IP addresses cannot be the same.', (value) => { if (useIPArray) { if (!value || (ingressVips === null || ingressVips === void 0 ? void 0 : ingressVips.length) === 0 || (apiVips === null || apiVips === void 0 ? void 0 : apiVips.length) === 0) { return true; } return (0, selectors_1.selectApiVip)({ apiVips }) !== (0, selectors_1.selectIngressVip)({ ingressVips }); } else { if (!value) { return true; } return apiVip !== ingressVip; } }); const vipBroadcastValidationSchema = ({ machineNetworks }) => Yup.string().test('vip-no-broadcast', 'The IP address cannot be a network or broadcast address', (value) => { var _a; const vipAddress = (_a = (0, utils_2.getAddress)(value || '')) === null || _a === void 0 ? void 0 : _a.address; const machineNetwork = (0, utils_2.getAddress)(((machineNetworks === null || machineNetworks === void 0 ? void 0 : machineNetworks.length) && machineNetworks[0].cidr) || ''); const machineNetworkBroadcast = machineNetwork === null || machineNetwork === void 0 ? void 0 : machineNetwork.endAddress().address; const machineNetworkAddress = machineNetwork === null || machineNetwork === void 0 ? void 0 : machineNetwork.startAddress().address; return vipAddress !== machineNetworkBroadcast && vipAddress !== machineNetworkAddress; }); // like .required() but passes for initially empty field const requiredOnceSet = (initialValue, message) => Yup.string().test('required-once-set', message || 'The value is required.', (value) => !!value || !initialValue); exports.hostSubnetValidationSchema = Yup.string().when(['managedNetworkingType'], { is: (managedNetworkingType) => managedNetworkingType === 'clusterManaged', then: () => Yup.string().notOneOf([constants_1.NO_SUBNET_SET], 'Host subnet must be selected.'), }); const vipValidationSchema = (hostSubnets, values, initialValue) => Yup.mixed().when(['vipDhcpAllocation', 'managedNetworkingType'], { is: (vipDhcpAllocation, managedNetworkingType) => !vipDhcpAllocation && managedNetworkingType !== 'userManaged', then: () => requiredOnceSet(initialValue, 'Required. Please provide an IP address') .concat((0, exports.vipRangeValidationSchema)(hostSubnets, values, true)) .concat(vipUniqueValidationSchema(values, false)), }); exports.vipValidationSchema = vipValidationSchema; const vipNoSuffixValidationSchema = (hostSubnets, values, initialValues) => Yup.mixed().when(['vipDhcpAllocation', 'managedNetworkingType'], { is: (vipDhcpAllocation, managedNetworkingType) => !vipDhcpAllocation && managedNetworkingType !== 'userManaged', then: () => { var _a; return requiredOnceSet((_a = (0, lodash_es_1.head)(initialValues)) === null || _a === void 0 ? void 0 : _a.ip, 'Required. Please provide an IP address') .concat(exports.ipNoSuffixValidationSchema) .concat((0, exports.vipRangeValidationSchema)(hostSubnets, values, false)) .concat(vipBroadcastValidationSchema(values)) .concat(vipUniqueValidationSchema(values, true)); }, }); exports.vipNoSuffixValidationSchema = vipNoSuffixValidationSchema; const vipArrayValidationSchema = (hostSubnets, values, initialValues) => (values.managedNetworkingType === 'clusterManaged' ? Yup.array().of(Yup.object({ clusterId: Yup.string(), ip: (0, exports.vipNoSuffixValidationSchema)(hostSubnets, values, initialValues), })) : Yup.array()).test('vips-length', 'Both API and ingress APIs must be provided.', (_value) => { var _a, _b; return ((_a = values.apiVips) === null || _a === void 0 ? void 0 : _a.length) === ((_b = values.ingressVips) === null || _b === void 0 ? void 0 : _b.length); }); exports.vipArrayValidationSchema = vipArrayValidationSchema; const ipBlockValidationSchema = (reservedCidrs) => Yup.string() .required('A value is required.') .test('valid-ip-address', 'Invalid IP address block. Expected value is a network expressed in CIDR notation (IP/netmask). For example: 123.123.123.0/24, 2055:d7a::/116', (value) => !!value && (is_cidr_1.default.v4(value) || is_cidr_1.default.v6(value))) .test('valid-netmask', 'IPv4 netmask must be between 1-25 and include at least 128 addresses.\nIPv6 netmask must be between 8-128 and include at least 256 addresses.', (value) => { const suffix = parseInt((value || '').split('/')[1]); return ((is_cidr_1.default.v4(value || '') && 0 < suffix && suffix < 26) || (is_cidr_1.default.v6(value || '') && 7 < suffix && suffix < 129)); }) .test('cidr-is-not-unspecified', 'The specified CIDR is invalid because its resulting routing prefix matches the unspecified address.', (cidr) => { const ip = (0, utils_1.getSubnet)(cidr); if (ip === null) { return false; } // The first address is used to represent the network const startAddress = ip.startAddress().address; return startAddress !== IP_V4_ZERO && startAddress !== IP_V6_ZERO; }) .test('valid-cidr-base-address', ({ value }) => `${value} is not a valid CIDR`, (cidr) => { const ip = (0, utils_1.getSubnet)(cidr); if (ip === null) { return false; } const networkAddress = ip.startAddress().parsedAddress; const ipAddress = ip.parsedAddress; const result = ipAddress.every((part, idx) => part === networkAddress[idx]); return result; }) .test('cidrs-can-not-overlap', 'Provided CIDRs can not overlap.', (cidr) => { try { if (cidr && reservedCidrs && reservedCidrs.length > 0) { return !(0, cidr_tools_1.overlap)(cidr, reservedCidrs); } } catch (_a) { return false; } // passing by default return true; }); exports.ipBlockValidationSchema = ipBlockValidationSchema; exports.dnsNameValidationSchema = Yup.string() .test('dns-name-label-length', 'Single label of the DNS name can not be longer than 63 characters.', (value) => (value || '').split('.').every((label) => label.length <= 63)) .matches(DNS_NAME_REGEX, { message: 'Value "${value}" is not valid DNS name. Example: basedomain.example.com', excludeEmptyString: true, }); exports.baseDomainValidationSchema = Yup.string().test('dns-name-label-length', 'Every single host component in the base domain name cannot contain more than 63 characters and must not contain spaces.', (value) => { // Check if the value contains any spaces if (/\s/.test(value)) { return false; // Value contains spaces, validation fails } // Check the label lengths const labels = (value || '').split('.'); return labels.every((label) => label.length <= 63); }); const hostPrefixValidationSchema = (clusterNetworkCidr) => { const requiredText = 'The host prefix is required.'; const minMaxText = 'The host prefix is a number between 1 and 32 for IPv4 and between 8 and 128 for IPv6.'; const netBlock = (clusterNetworkCidr || '').split('/')[1]; if (!netBlock) { return Yup.number().required(requiredText).min(1, minMaxText).max(32, minMaxText); } let netBlockNumber = parseInt(netBlock); if (isNaN(netBlockNumber)) { netBlockNumber = 1; } const errorMsgPrefix = 'The host prefix is a number between size of the cluster network CIDR range'; const errorMsgIPv4 = `${errorMsgPrefix} (${netBlockNumber}) and 25.`; const errorMsgIPv6 = `${errorMsgPrefix} (8) and 128.`; if (ip_address_1.Address6.isValid(clusterNetworkCidr || '')) { return Yup.number().required(requiredText).min(8, errorMsgIPv6).max(128, errorMsgIPv6); } if (ip_address_1.Address4.isValid(clusterNetworkCidr || '')) { return Yup.number() .required(requiredText) .min(netBlockNumber, errorMsgIPv4) .max(25, errorMsgIPv4); } return Yup.number().required(requiredText); }; exports.hostPrefixValidationSchema = hostPrefixValidationSchema; const richNameValidationSchema = (t, usedNames, origName) => { const nameValidationMessagesList = (0, constants_2.nameValidationMessages)(t); return Yup.string() .min(1, nameValidationMessagesList.INVALID_LENGTH) .max(253, nameValidationMessagesList.INVALID_LENGTH) .test(nameValidationMessagesList.INVALID_START_END, nameValidationMessagesList.INVALID_START_END, (value) => { const trimmed = value === null || value === void 0 ? void 0 : value.trim(); if (!trimmed) { return true; } return (!!trimmed[0].match(NAME_START_END_REGEX) && (trimmed[trimmed.length - 1] ? !!trimmed[trimmed.length - 1].match(NAME_START_END_REGEX) : true)); }) .matches(HOST_NAME_REGEX, nameValidationMessagesList.INVALID_FORMAT) .matches(NAME_CHARS_REGEX, { message: nameValidationMessagesList.INVALID_VALUE, excludeEmptyString: true, }) .test(nameValidationMessagesList.NOT_UNIQUE, nameValidationMessagesList.NOT_UNIQUE, (value) => { if (!value || value === origName) { return true; } return !usedNames.find((n) => n === value); }) .notOneOf(constants_2.FORBIDDEN_HOSTNAMES, (0, constants_2.hostnameValidationMessages)(t).LOCALHOST_ERR); }; exports.richNameValidationSchema = richNameValidationSchema; const richHostnameValidationSchema = (t, usedNames, origName) => { const hostnameValidationMessagesList = (0, constants_2.hostnameValidationMessages)(t); return Yup.string() .min(1, hostnameValidationMessagesList.INVALID_LENGTH) .max(63, hostnameValidationMessagesList.INVALID_LENGTH) .test(hostnameValidationMessagesList.INVALID_START_END, hostnameValidationMessagesList.INVALID_START_END, (value) => { const trimmed = value === null || value === void 0 ? void 0 : value.trim(); if (!trimmed) { return true; } return (!!trimmed[0].match(NAME_START_END_REGEX) && (trimmed[trimmed.length - 1] ? !!trimmed[trimmed.length - 1].match(NAME_START_END_REGEX) : true)); }) .matches(NAME_CHARS_REGEX, { message: hostnameValidationMessagesList.INVALID_VALUE, excludeEmptyString: true, }) .test(hostnameValidationMessagesList.NOT_UNIQUE, hostnameValidationMessagesList.NOT_UNIQUE, (value) => { if (!value || value === origName) { return true; } return !usedNames.find((n) => n === value); }) .notOneOf(constants_2.FORBIDDEN_HOSTNAMES, hostnameValidationMessagesList.LOCALHOST_ERR); }; exports.richHostnameValidationSchema = richHostnameValidationSchema; const httpProxyValidationMessage = 'Provide a valid HTTP URL.'; const httpProxyValidationSchema = ({ values, pairValueName, allowEmpty, }) => { const validation = Yup.string().test('http-proxy-validation', httpProxyValidationMessage, (value) => { if (!value) { return true; } if (!value.startsWith('http://')) { return false; } try { new URL(value); } catch (_a) { return false; } return true; }); if (allowEmpty) { return validation; } return validation.test('http-proxy-no-empty-validation', 'At least one of the HTTP or HTTPS proxy URLs is required.', (value) => !values.enableProxy || !!value || !!values[pairValueName]); }; exports.httpProxyValidationSchema = httpProxyValidationSchema; const isIPorDN = (value, dnsRegex = DNS_NAME_REGEX) => { if (value.match(dnsRegex)) { return true; } try { exports.ipValidationSchema.validateSync(value); return true; } catch (err) { return false; } }; exports.noProxyValidationSchema = Yup.string().test('no-proxy-validation', 'Provide a comma separated list of valid DNS names or IP addresses.', (value) => { if (!value || value === '*') { return true; } // https://docs.openshift.com/container-platform/4.5/installing/installing_bare_metal/installing-restricted-networks-bare-metal.html#installation-configure-proxy_installing-restricted-networks-bare-metal // A comma-separated list of destination domain names, domains, IP addresses, or other network CIDRs to exclude proxying. // Preface a domain with . to match subdomains only. For example, .y.com matches x.y.com, but not y.com. // Use * to bypass proxy for all destinations. const noProxyList = (0, utils_2.trimCommaSeparatedList)(value).split(','); return noProxyList.every((p) => isIPorDN(p, PROXY_DNS_REGEX)); }); exports.ntpSourceValidationSchema = Yup.string() .test('ntp-source-validation', 'Provide a comma separated list of valid DNS names or IP addresses.', (value) => { if (!value || value === '') { return true; } return (0, utils_2.trimCommaSeparatedList)(value) .split(',') .every((v) => isIPorDN(v)); }) .test('ntp-source-validation-unique', 'DNS names and IP addresses must be unique.', (value) => { if (!value || value === '') { return true; } const arr = (0, utils_2.trimCommaSeparatedList)(value).split(','); return arr.length === new Set(arr).size; }); exports.day2ApiVipValidationSchema = Yup.string().test('day2-api-vip', 'Provide a valid DNS name or IP Address', (value) => { if (!value) { return true; } return isIPorDN(value); }); const bmcAddressValidationSchema = (t) => { const bmcAddressValidationMessagesList = (0, constants_2.bmcAddressValidationMessages)(t); return Yup.string() .required() .test('valid-bmc-address', bmcAddressValidationMessagesList.INVALID_VALUE, (val) => { try { const url = (0, parse_url_1.default)(val); return ['redfish-virtualmedia', 'idrac-virtualmedia'].includes(url.protocol); } catch (error) { return false; } }); }; exports.bmcAddressValidationSchema = bmcAddressValidationSchema; const locationValidationSchema = (t) => { const locationValidationMessagesList = (0, constants_2.locationValidationMessages)(t); return Yup.string() .min(1, locationValidationMessagesList.INVALID_LENGTH) .max(63, locationValidationMessagesList.INVALID_LENGTH) .test(locationValidationMessagesList.INVALID_START_END, locationValidationMessagesList.INVALID_START_END, (value) => { const trimmed = value === null || value === void 0 ? void 0 : value.trim(); if (!trimmed) { return true; } return (!!trimmed[0].match(ALPHANUMERIC_REGEX) && (trimmed[trimmed.length - 1] ? !!trimmed[trimmed.length - 1].match(ALPHANUMERIC_REGEX) : true)); }) .matches(LOCATION_CHARS_REGEX, { message: locationValidationMessagesList.INVALID_VALUE, excludeEmptyString: true, }); }; exports.locationValidationSchema = locationValidationSchema; exports.machineNetworksValidationSchema = Yup.array().of(Yup.object({ cidr: exports.hostSubnetValidationSchema, clusterId: Yup.string() })); exports.clusterNetworksValidationSchema = Yup.array().of(Yup.lazy((values) => Yup.object({ cidr: (0, exports.ipBlockValidationSchema)(undefined /* So far used in OCM only and so validated by backend */), hostPrefix: (0, exports.hostPrefixValidationSchema)(values.cidr), clusterId: Yup.string(), }))); exports.serviceNetworkValidationSchema = Yup.array().of(Yup.object({ cidr: (0, exports.ipBlockValidationSchema)(undefined /* So far used in OCM only and so validated by backend */), clusterId: Yup.string(), })); const dualStackValidationSchema = (field) => Yup.array() .max(2, `Maximum number of ${field} subnets in dual stack is 2.`) .test('dual-stack-ipv4', 'First network has to be IPv4 subnet.', (values) => !!(values === null || values === void 0 ? void 0 : values[0].cidr) && ip_address_1.Address4.isValid(values[0].cidr)) .test('dual-stack-ipv6', 'Second network has to be IPv6 subnet.', (values) => !!(values === null || values === void 0 ? void 0 : values[1].cidr) && ip_address_1.Address6.isValid(values[1].cidr)); exports.dualStackValidationSchema = dualStackValidationSchema; exports.IPv4ValidationSchema = Yup.array().test('single-stack', `All network subnets must be IPv4.`, (values) => (0, utils_2.allSubnetsIPv4)(values)); //# sourceMappingURL=validationSchemas.js.map