{"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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"}