{"version":3,"file":"index.cjs","sources":["../../src/validators/handler/ValidatorHandler.js","../../src/validators/Error.js","../../src/validators/ContainsPropertyValidator.js","../../src/validators/IsTypeValidator.js","../../src/validators/PropertyContainsValidTypeValidator.js","../../src/functionsBuilder/replacer/ReplacerBuilder.js","../../src/functionsBuilder/reviver/ReviverBuilder.js","../../src/serializers/handler/SerializerHandler.js","../../src/core/JSONSerializer.js","../../src/index.js"],"sourcesContent":["import { Validator } from '../Validator'\n\nexport class ValidatorHandler {\n  #validators\n\n  /**\n   * Object used to manage the validation through Validator objects.\n   *\n   * @param {Validator[]} validators Array that contains Validator objects used\n   *   to validate data.\n   */\n  constructor(validators) {\n    this.#validators = validators\n  }\n\n  /** @param {any} data Data to validate. */\n  validate(data) {\n    const validators = this.#validators\n    for (const validator of validators) {\n      validator.validate(data)\n    }\n  }\n}\n","export class InvalidTypeError extends Error {\n  /** @param {string} message The Error's message. */\n  constructor(message) {\n    super(message)\n    this.name = 'Invalid Type'\n  }\n}\n\nexport class DoesNotContainPropertyError extends Error {\n  /** @param {string} message The Error's message. */\n  constructor(message) {\n    super(message)\n    this.name = 'Does not contain property'\n  }\n}\n","import { DoesNotContainPropertyError } from './Error'\nimport { Validator } from './Validator'\n\n/**\n * @throws {DoesNotContainPropertyError}\n * @implements {Validator}\n */\nexport class ContainsPropertyValidator {\n  #requiredPropertyName\n\n  /**\n   * Validates if the data contains the required property.\n   *\n   * @param {string} requiredPropertyName The name of the required property.\n   */\n  constructor(requiredPropertyName) {\n    this.#requiredPropertyName = requiredPropertyName\n  }\n\n  /**\n   * Returns the name of the required property to find.\n   *\n   * @returns {string} The name of the required property to find.\n   */\n  getRequiredPropertyName() {\n    return this.#requiredPropertyName\n  }\n\n  /**\n   * Validates the data. If they are invalid an Error is thrown.\n   *\n   * @param {any} data The data to validate.\n   */\n  validate(data) {\n    const requiredPropertyName = this.#requiredPropertyName\n\n    if (!(requiredPropertyName in data)) {\n      const message = `${data} should include the ${requiredPropertyName} property`\n      throw new DoesNotContainPropertyError(message)\n    }\n  }\n}\n","import { InvalidTypeError } from './Error'\nimport { Validator } from './Validator'\n\n/* eslint-disable valid-typeof */\n/**\n * @throws {InvalidTypeError}\n * @implements {Validator}\n */\nexport class IsTypeValidator {\n  #validType\n\n  /**\n   * Validates if the data is of the required type (this Validator validates\n   * through typeof data).\n   *\n   * @param {string} validType The valid type expected. It must match the values\n   *   returned by typeof operator.\n   */\n  constructor(validType) {\n    this.#validType = validType\n  }\n\n  /**\n   * Validates the data using the typeof operator to obtain the data type. If\n   * they are invalid an Error is thrown.\n   *\n   * @param {any} data The data to validate.\n   */\n  validate(data) {\n    const validType = this.#validType\n\n    if (typeof data !== validType) {\n      const message = `${data} should be ${validType}`\n      throw new InvalidTypeError(message)\n    }\n  }\n}\n","import { ContainsPropertyValidator } from './ContainsPropertyValidator'\nimport { DoesNotContainPropertyError, InvalidTypeError } from './Error'\nimport { IsTypeValidator } from './IsTypeValidator'\nimport { Validator } from './Validator'\n\n/**\n * @throws {DoesNotContainPropertyError}\n * @throws {InvalidTypeError}\n * @implements {Validator}\n */\nexport class PropertyContainsValidTypeValidator {\n  #containsPropertyValidator\n  #isTypeValidator\n\n  /**\n   * Validates if the data contains the required property and this is of the\n   * required type.\n   *\n   * @param {ContainsPropertyValidator} containsPropertyValidator A\n   *   containsPropertyValidator object.\n   * @param {IsTypeValidator} isTypeValidator An IsTypeValidator object.\n   */\n  constructor(containsPropertyValidator, isTypeValidator) {\n    this.#containsPropertyValidator = containsPropertyValidator\n    this.#isTypeValidator = isTypeValidator\n  }\n\n  /**\n   * Validates the data. If they are invalid an Error is thrown.\n   *\n   * @param {any} data The data to validate.\n   */\n  validate(data) {\n    const containsPropertyValidator = this.#containsPropertyValidator\n\n    containsPropertyValidator.validate(data)\n\n    const requiredPropertyName =\n      containsPropertyValidator.getRequiredPropertyName()\n    const requiredValue = data[requiredPropertyName]\n\n    this.#isTypeValidator.validate(requiredValue)\n  }\n}\n","export class ReplacerBuilder {\n  #serializers\n\n  /**\n   * Object used to build the replacer function. That function is used by\n   * JSON.stringify method.\n   */\n  constructor() {\n    this.#serializers = {}\n  }\n\n  /**\n   * Sets Serializers. When the build method is called, the Serializers are\n   * added to the replacer function.\n   *\n   * @param {object} serializers An object that contains Serializers added to\n   *   JsonSerializer object. The keys are obtained from\n   *   Serializer.getSerializerType method and the values are the Serializer\n   *   objects.\n   */\n  setSerializers(serializers) {\n    this.#serializers = serializers\n  }\n\n  /**\n   * Builds a replacer function using builder pattern.\n   *\n   * @returns {(key: string, value: any) => any} Replacer function used by\n   *   JSON.stringify method.\n   */\n  build() {\n    const serializers = this.#serializers\n    const getSerializerType = (unserializedData) => {\n      const type = typeof unserializedData\n      return type === 'object' ? unserializedData.constructor.name : type\n    }\n\n    return function replacer(key, value) {\n      const unserializedData = this[key]\n      const serializerType = getSerializerType(unserializedData)\n      const serializer = serializers[serializerType]\n      if (serializer) {\n        const serializedData = serializer.serialize(unserializedData)\n        return {\n          __typeof__: serializerType,\n          ...serializedData,\n        }\n      }\n      // Using serialized data by JSON.stringify algorithm\n      return value\n    }\n  }\n}\n","export class ReviverBuilder {\n  #serializers\n\n  /**\n   * Object used to build the reviver function. That function is used by\n   * JSON.parse method.\n   */\n  constructor() {\n    this.#serializers = {}\n  }\n\n  /**\n   * Sets Serializers. When the build method is called, the Serializers are\n   * added to the reviver function.\n   *\n   * @param {object} serializers An object that contains Serializers added to\n   *   JsonSerializer object. The keys are obtained from\n   *   Serializer.getSerializerType method and the values are the Serializer\n   *   objects.\n   */\n  setSerializers(serializers) {\n    this.#serializers = serializers\n  }\n\n  /**\n   * Builds a reviver function using builder pattern.\n   *\n   * @returns {(key: string, value: any) => any} Reviver function used by\n   *   JSON.parse method.\n   */\n  build() {\n    const serializers = this.#serializers\n\n    return function reviver(key, value) {\n      const serializerType = value.__typeof__\n      const serializer = serializers[serializerType]\n      if (serializer) {\n        return serializer.parse(value)\n      }\n      // Using parsed data by JSON.parse algorithm\n      return value\n    }\n  }\n}\n","import { ValidatorHandler } from '../../validators/handler/ValidatorHandler'\n\nexport class SerializerHandler {\n  #serializers\n  #serializerValidatorHandler\n\n  /**\n   * Object used to manage the Serializer objects.\n   *\n   * @param {ValidatorHandler} [serializerValidatorHandler] A ValidatorHandler\n   *   object used to validate Serializers.\n   */\n  constructor(serializerValidatorHandler) {\n    this.#serializers = {}\n    this.#serializerValidatorHandler = serializerValidatorHandler\n  }\n\n  /**\n   * Returns an object that contains the Serializers added to JsonSerializer\n   * object. The keys are obtained from Serializer.getSerializerType method and\n   * the values are the Serializer objects.\n   *\n   * @returns {object} Object that contains the Serializers added to\n   *   JsonSerializer object.\n   */\n  getSerializers() {\n    const serializers = this.#serializers\n    return { ...serializers }\n  }\n\n  /**\n   * Validates a Serializer. If it is invalid an Error will be thrown.\n   *\n   * @param {object} serializer An object used to serialize and unserialize\n   *   data.\n   * @param {() => string} serializer.getSerializerType An function that return\n   *   the type of serializer.\n   * @param {(unserializedData: any) => object} serializer.serialize An function\n   *   that serialize data.\n   * @param {(serializedData: string) => any} serializer.parse An function that\n   *   unserialize data.\n   */\n  #validate(serializer) {\n    const serializerValidatorHandler = this.#serializerValidatorHandler\n    if (serializerValidatorHandler) {\n      serializerValidatorHandler.validate(serializer)\n    }\n  }\n\n  /**\n   * Adds a Serializer. If it is invalid an Error will be thrown.\n   *\n   * @param {object} serializer An object used to serialize and unserialize\n   *   data.\n   * @param {() => string} serializer.getSerializerType An function that return\n   *   the type of Serializer.\n   * @param {(unserializedData: any) => object} serializer.serialize An function\n   *   that serialize data.\n   * @param {(serializedData: string) => any} serializer.parse An function that\n   *   unserialize data.\n   */\n  addSerializer(serializer) {\n    this.#validate(serializer)\n\n    const serializerType = serializer.getSerializerType()\n    this.#serializers[serializerType] = serializer\n  }\n}\n","import { ReplacerBuilder } from '../functionsBuilder/replacer/ReplacerBuilder'\nimport { ReviverBuilder } from '../functionsBuilder/reviver/ReviverBuilder'\nimport { SerializerHandler } from '../serializers/handler/SerializerHandler'\n\n/**\n * @callback replacer\n * @param {string} key\n * @param {any} value\n */\n\n/**\n * @callback reviver\n * @param {string} key\n * @param {any} value\n */\n\nexport class JsonSerializer {\n  #replacerBuilder\n  #reviverBuilder\n  #serializerHandler\n  /**\n   * @type {replacer} Function Used for JSON.stringify (second parameter) to\n   *   serialize data.\n   */\n  #replacer\n  /**\n   * @type {reviver} Function Used for JSON.parse (second parameter) to\n   *   unserialize data.\n   */\n  #reviver\n\n  /**\n   * JSON wrapper used to extend the functionality of JSON.stringify and\n   * JSON.parse methods through Serializers.\n   *\n   * @param {ReplacerBuilder} replacerBuilder The object used to obtain the\n   *   replacer function.\n   * @param {ReviverBuilder} reviverBuilder The object used to obtain the\n   *   reviver function.\n   * @param {SerializerHandler} serializerHandler The object used to manage the\n   *   Serializer objects.\n   */\n  constructor(replacerBuilder, reviverBuilder, serializerHandler) {\n    this.#replacerBuilder = replacerBuilder\n    this.#reviverBuilder = reviverBuilder\n    this.#serializerHandler = serializerHandler\n  }\n\n  /** Refreshes the JsonSerializer object. */\n  #refreshJsonSerializer() {\n    const serializerHandler = this.#serializerHandler\n    const serializers = serializerHandler.getSerializers()\n\n    this.#refreshReplacer(serializers)\n    this.#refreshReviver(serializers)\n  }\n\n  /**\n   * Refreshes the replacer function.\n   *\n   * @param {object} serializers Object that contains the Serializers added to\n   *   JsonSerializer object.\n   */\n  #refreshReplacer(serializers) {\n    const replacerBuilder = this.#replacerBuilder\n\n    replacerBuilder.setSerializers(serializers)\n    this.#replacer = replacerBuilder.build()\n  }\n\n  /**\n   * Refreshes the reviver function.\n   *\n   * @param {object} serializers Object that contains the Serializers added to\n   *   JsonSerializer object.\n   */\n  #refreshReviver(serializers) {\n    const reviverBuilder = this.#reviverBuilder\n\n    reviverBuilder.setSerializers(serializers)\n    this.#reviver = reviverBuilder.build()\n  }\n\n  /**\n   * Adds serializers through the serializersInstaller object.\n   *\n   * @param {object} serializersInstaller An object that adds serializers using\n   *   the install method.\n   * @param {(\n   *   serializerHandler: SerializerHandler,\n   *   installOptions: object,\n   * ) => void} serializersInstaller.install\n   *   The method used to add serializers to JsonSerializer object.\n   * @param {object} [installOptions] An object that contains the install\n   *   options.\n   */\n  #installSerializers(serializersInstaller, installOptions) {\n    const serializerHandler = this.#serializerHandler\n\n    serializersInstaller.install(serializerHandler, installOptions)\n  }\n\n  /**\n   * @param {object} serializer An object used to serialize and unserialize\n   *   data.\n   * @param {() => string} serializer.getSerializerType An function that return\n   *   the type of serializer.\n   * @param {(unserializedData: any) => object} serializer.serialize An function\n   *   that serialize data.\n   * @param {(serializedData: string) => any} serializer.parse An function that\n   *   unserialize data.\n   */\n  #addSerializer(serializer) {\n    const serializerHandler = this.#serializerHandler\n\n    serializerHandler.addSerializer(serializer)\n  }\n\n  /**\n   * Returns an object that contains the serializers added to JsonSerializer\n   * object. The keys are obtained from serializer.getSerializerType method and\n   * the values are the Serializer objects.\n   *\n   * @returns {object} Object that contains the serializers added to\n   *   JsonSerializer object.\n   */\n  getSerializers() {\n    const serializerHandler = this.#serializerHandler\n    return serializerHandler.getSerializers()\n  }\n\n  /**\n   * Adds serializers through the serializersInstaller and to update the\n   * JsonSerializer object.\n   *\n   * @param {object} serializersInstaller An object that adds serializers using\n   *   the install method.\n   * @param {(\n   *   serializerHandler: SerializerHandler,\n   *   installOptions: object,\n   * ) => void} serializersInstaller.install\n   *   The method used to add serializers to JsonSerializer object.\n   * @param {object} [installOptions] An object that contains the install\n   *   options.\n   */\n  installSerializersAndRefreshJsonSerializer(\n    serializersInstaller,\n    installOptions = {},\n  ) {\n    this.#installSerializers(serializersInstaller, installOptions)\n    this.#refreshJsonSerializer()\n  }\n\n  /**\n   * Adds a Serializer and to update the JsonSerializer object.\n   *\n   * @param {object} serializer An object used to serialize and unserialize\n   *   data.\n   * @param {() => string} serializer.getSerializerType An function that returns\n   *   the type of serializer.\n   * @param {(unserializedData: any) => object} serializer.serialize An function\n   *   that serializes data.\n   * @param {(serializedData: string) => any} serializer.parse An function that\n   *   unserializes data.\n   */\n  addSerializerAndRefreshJsonSerializer(serializer) {\n    this.#addSerializer(serializer)\n    this.#refreshJsonSerializer()\n  }\n\n  /**\n   * Transforms a javascript value to a JSON string using JSON.stringify method.\n   *\n   * According to JSON.stringify's documentation the parameters represent.\n   *\n   * @param {any} unserializedData A javascript value, usually an object or\n   *   array, to be converted.\n   * @param {string | number} space Adds indentation, white space, and line\n   *   break characters to the return-value JSON text to make it easier to\n   *   read.\n   * @returns {string} A JSON string generated by JSON.stringify method.\n   */\n  serialize(unserializedData, space) {\n    const replacer = this.#replacer\n    return JSON.stringify(unserializedData, replacer, space)\n  }\n\n  /**\n   * Transform a JSON string to a javascript value using JSON.parse method.\n   *\n   * According to JSON.parse's documentation the parameters represent.\n   *\n   * @param {string} serializedData A valid JSON string.\n   * @returns {any} A javascript value generated by JSON.parse method.\n   */\n  parse(serializedData) {\n    const reviver = this.#reviver\n    return JSON.parse(serializedData, reviver)\n  }\n}\n","import { ValidatorHandler } from './validators/handler/ValidatorHandler'\nimport { ContainsPropertyValidator } from './validators/ContainsPropertyValidator'\nimport { PropertyContainsValidTypeValidator } from './validators/PropertyContainsValidTypeValidator'\nimport { IsTypeValidator } from './validators/IsTypeValidator'\nimport { ReplacerBuilder } from './functionsBuilder/replacer/ReplacerBuilder'\nimport { ReviverBuilder } from './functionsBuilder/reviver/ReviverBuilder'\nimport { SerializerHandler } from './serializers/handler/SerializerHandler'\nimport { JsonSerializer } from './core/JSONSerializer'\n\nexport class JsonSerializerFactory {\n  /**\n   * Create a new instance of JsonSerializer\n   *\n   * @returns {JsonSerializer} A new instance of JsonSerializer\n   */\n  static createJsonSerializer() {\n    const serializerValidators = [\n      new PropertyContainsValidTypeValidator(\n        new ContainsPropertyValidator('getSerializerType'),\n        new IsTypeValidator('function'),\n      ),\n      new PropertyContainsValidTypeValidator(\n        new ContainsPropertyValidator('serialize'),\n        new IsTypeValidator('function'),\n      ),\n      new PropertyContainsValidTypeValidator(\n        new ContainsPropertyValidator('parse'),\n        new IsTypeValidator('function'),\n      ),\n    ]\n\n    return new JsonSerializer(\n      new ReplacerBuilder(),\n      new ReviverBuilder(),\n      new SerializerHandler(new ValidatorHandler(serializerValidators)),\n    )\n  }\n}\n"],"names":["ValidatorHandler","constructor","validators","_classCallCheck","_classPrivateFieldInitSpec","_validators","writable","value","_classPrivateFieldSet","_createClass","key","validate","data","_classPrivateFieldGet","_iterator","_createForOfIteratorHelper","_step","s","n","done","validator","err","e","f","InvalidTypeError","_Error","_inherits","_super","_createSuper","message","_this","call","name","_wrapNativeSuper","Error","DoesNotContainPropertyError","_Error2","_super2","_this2","_requiredPropertyName","_WeakMap","ContainsPropertyValidator","requiredPropertyName","getRequiredPropertyName","_context","_concatInstanceProperty","concat","_validType","IsTypeValidator","validType","_typeof","_context2","_containsPropertyValidator","_isTypeValidator","PropertyContainsValidTypeValidator","containsPropertyValidator","isTypeValidator","requiredValue","_serializers","ReplacerBuilder","setSerializers","serializers","build","getSerializerType","unserializedData","type","replacer","serializerType","serializer","serializedData","serialize","_objectSpread","__typeof__","_serializers2","ReviverBuilder","reviver","parse","_serializers3","_serializerValidatorHandler","_validate","_WeakSet","SerializerHandler","serializerValidatorHandler","_classPrivateMethodInitSpec","getSerializers","addSerializer","_classPrivateMethodGet","_validate2","_replacerBuilder","_reviverBuilder","_serializerHandler","_replacer","_reviver","_refreshJsonSerializer","_refreshReplacer","_refreshReviver","_installSerializers","_addSerializer","JsonSerializer","replacerBuilder","reviverBuilder","serializerHandler","installSerializersAndRefreshJsonSerializer","serializersInstaller","installOptions","arguments","length","undefined","_installSerializers2","_refreshJsonSerializer2","addSerializerAndRefreshJsonSerializer","_addSerializer2","space","JSON","_refreshReplacer2","_refreshReviver2","install","JsonSerializerFactory","createJsonSerializer","serializerValidators"],"mappings":"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"}