{"version":3,"names":["buildSchemaValidationError","errors","context","message","join","SchemaValidationError","Error","constructor","super","this","name","Schema","definition","validate","values","mergedValues","default","property","error","push","length","defaultValues","defaultValue","Value","baseConfig","value","required","isNullOrUndefined","Function","isUndefined","isNull","NumberValue","config","valueValidation","isNumberOrUndefined","min","max","isNumber","isNaN","urlRegex","StringValue","emptyAllowed","url","regex","constrainTo","isString","test","includes","Object","prototype","toString","call","isArray","Array"],"sources":["../bueno/dist/browser/bueno.esm.js"],"sourcesContent":["/**\n * @license\n *\n * Copyright 2023 Coveo Solutions Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// src/schema.ts\nfunction buildSchemaValidationError(errors, context) {\n const message = `\n The following properties are invalid:\n\n ${errors.join(\"\\n\t\")}\n \n ${context}\n `;\n return new SchemaValidationError(message);\n}\nvar SchemaValidationError = class extends Error {\n constructor(message) {\n super(message);\n this.name = \"SchemaValidationError\";\n }\n};\nvar Schema = class {\n constructor(definition) {\n this.definition = definition;\n }\n validate(values = {}, message = \"\") {\n const mergedValues = {\n ...this.default,\n ...values\n };\n const errors = [];\n for (const property in this.definition) {\n const error = this.definition[property].validate(mergedValues[property]);\n error && errors.push(`${property}: ${error}`);\n }\n if (errors.length) {\n throw buildSchemaValidationError(errors, message);\n }\n return mergedValues;\n }\n get default() {\n const defaultValues = {};\n for (const property in this.definition) {\n const defaultValue = this.definition[property].default;\n if (defaultValue !== void 0) {\n defaultValues[property] = defaultValue;\n }\n }\n return defaultValues;\n }\n};\n\n// src/values/value.ts\nvar Value = class {\n constructor(baseConfig = {}) {\n this.baseConfig = baseConfig;\n }\n validate(value) {\n if (this.baseConfig.required && isNullOrUndefined(value)) {\n return \"value is required.\";\n }\n return null;\n }\n get default() {\n return this.baseConfig.default instanceof Function ? this.baseConfig.default() : this.baseConfig.default;\n }\n get required() {\n return this.baseConfig.required === true;\n }\n};\nfunction isUndefined(value) {\n return value === void 0;\n}\nfunction isNull(value) {\n return value === null;\n}\nfunction isNullOrUndefined(value) {\n return isUndefined(value) || isNull(value);\n}\n\n// src/values/number-value.ts\nvar NumberValue = class {\n constructor(config = {}) {\n this.config = config;\n this.value = new Value(config);\n }\n validate(value) {\n const valueValidation = this.value.validate(value);\n if (valueValidation) {\n return valueValidation;\n }\n if (!isNumberOrUndefined(value)) {\n return \"value is not a number.\";\n }\n if (value < this.config.min) {\n return `minimum value of ${this.config.min} not respected.`;\n }\n if (value > this.config.max) {\n return `maximum value of ${this.config.max} not respected.`;\n }\n return null;\n }\n get default() {\n return this.value.default;\n }\n get required() {\n return this.value.required;\n }\n};\nfunction isNumberOrUndefined(value) {\n return isUndefined(value) || isNumber(value);\n}\nfunction isNumber(value) {\n return typeof value === \"number\" && !isNaN(value);\n}\n\n// src/values/boolean-value.ts\nvar BooleanValue = class {\n constructor(config = {}) {\n this.value = new Value(config);\n }\n validate(value) {\n const valueValidation = this.value.validate(value);\n if (valueValidation) {\n return valueValidation;\n }\n if (!isBooleanOrUndefined(value)) {\n return \"value is not a boolean.\";\n }\n return null;\n }\n get default() {\n return this.value.default;\n }\n get required() {\n return this.value.required;\n }\n};\nfunction isBooleanOrUndefined(value) {\n return isUndefined(value) || isBoolean(value);\n}\nfunction isBoolean(value) {\n return typeof value === \"boolean\";\n}\n\n// src/values/string-value.ts\nvar urlRegex = /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})).?)(?::\\d{2,5})?(?:[/?#]\\S*)?$/i;\nvar StringValue = class {\n constructor(config = {}) {\n this.config = {\n emptyAllowed: true,\n url: false,\n ...config\n };\n this.value = new Value(this.config);\n }\n validate(value) {\n const { emptyAllowed, url, regex, constrainTo } = this.config;\n const valueValidation = this.value.validate(value);\n if (valueValidation) {\n return valueValidation;\n }\n if (isUndefined(value)) {\n return null;\n }\n if (!isString(value)) {\n return \"value is not a string.\";\n }\n if (!emptyAllowed && !value.length) {\n return \"value is an empty string.\";\n }\n if (url && !urlRegex.test(value)) {\n return \"value is not a valid URL.\";\n }\n if (regex && !regex.test(value)) {\n return `value did not match provided regex ${regex}`;\n }\n if (constrainTo && !constrainTo.includes(value)) {\n const values = constrainTo.join(\", \");\n return `value should be one of: ${values}.`;\n }\n return null;\n }\n get default() {\n return this.value.default;\n }\n get required() {\n return this.value.required;\n }\n};\nfunction isString(value) {\n return Object.prototype.toString.call(value) === \"[object String]\";\n}\n\n// src/values/complex-value.ts\nvar RecordValue = class {\n constructor(config = {}) {\n this.config = {\n options: { required: false },\n values: {},\n ...config\n };\n }\n validate(input) {\n if (isUndefined(input)) {\n return this.config.options.required ? \"value is required and is currently undefined\" : null;\n }\n if (!isRecord(input)) {\n return \"value is not an object\";\n }\n for (const [k, v] of Object.entries(this.config.values)) {\n if (v.required && isNullOrUndefined(input[k])) {\n return `value does not contain ${k}`;\n }\n }\n let out = \"\";\n for (const [key, validator] of Object.entries(this.config.values)) {\n const value = input[key];\n const invalidValue = validator.validate(value);\n if (invalidValue !== null) {\n out += \" \" + invalidValue;\n }\n }\n return out === \"\" ? null : out;\n }\n get default() {\n return void 0;\n }\n get required() {\n return !!this.config.options.required;\n }\n};\nfunction isRecord(value) {\n return value !== void 0 && typeof value === \"object\";\n}\nvar ArrayValue = class {\n constructor(config = {}) {\n this.config = config;\n this.value = new Value(this.config);\n }\n validate(input) {\n if (!isNullOrUndefined(input) && !Array.isArray(input)) {\n return \"value is not an array\";\n }\n const invalid = this.value.validate(input);\n if (invalid !== null) {\n return invalid;\n }\n if (isNullOrUndefined(input)) {\n return null;\n }\n if (this.config.max !== void 0 && input.length > this.config.max) {\n return `value contains more than ${this.config.max}`;\n }\n if (this.config.min !== void 0 && input.length < this.config.min) {\n return `value contains less than ${this.config.min}`;\n }\n if (this.config.each !== void 0) {\n let out = \"\";\n input.forEach((el) => {\n if (this.config.each.required && isNullOrUndefined(el)) {\n out = `value is null or undefined: ${input.join(\",\")}`;\n }\n const isInvalid = this.validatePrimitiveValue(el, this.config.each);\n if (isInvalid !== null) {\n out += \" \" + isInvalid;\n }\n });\n return out === \"\" ? null : out;\n }\n return null;\n }\n validatePrimitiveValue(v, validator) {\n if (isBoolean(v)) {\n return validator.validate(v);\n } else if (isString(v)) {\n return validator.validate(v);\n } else if (isNumber(v)) {\n return validator.validate(v);\n } else if (isRecord(v)) {\n return validator.validate(v);\n }\n return \"value is not a primitive value\";\n }\n get default() {\n return void 0;\n }\n get required() {\n return this.value.required;\n }\n};\nfunction isArray(value) {\n return Array.isArray(value);\n}\n\n// src/values/enum-value.ts\nvar EnumValue = class {\n constructor(config) {\n this.config = config;\n this.value = new Value(config);\n }\n validate(value) {\n const invalid = this.value.validate(value);\n if (invalid !== null) {\n return invalid;\n }\n if (isUndefined(value)) {\n return null;\n }\n const valueInEnum = Object.values(this.config.enum).find((enumValue) => enumValue === value);\n if (!valueInEnum) {\n return \"value is not in enum.\";\n }\n return null;\n }\n get default() {\n return this.value.default;\n }\n get required() {\n return this.value.required;\n }\n};\nexport {\n ArrayValue,\n BooleanValue,\n EnumValue,\n NumberValue,\n RecordValue,\n Schema,\n SchemaValidationError,\n StringValue,\n Value,\n isArray,\n isBoolean,\n isBooleanOrUndefined,\n isNull,\n isNullOrUndefined,\n isNumber,\n isNumberOrUndefined,\n isRecord,\n isString,\n isUndefined\n};\n"],"mappings":"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"}