{"version":3,"file":"mappers.mjs","sources":["../../../../src/core-api/routes/validation/mappers.ts"],"sourcesContent":["/**\n * @fileoverview\n * This file contains functions responsible for mapping Strapi attribute definitions to Zod schemas.\n */\n\nimport type { Schema } from '@strapi/types';\nimport * as z from 'zod/v4';\n\n// eslint-disable-next-line import/no-cycle\nimport * as attributes from './attributes';\n\nconst isCustomFieldAttribute = (\n  attribute: unknown\n): attribute is { type: 'customField'; customField: string } => {\n  return (\n    !!attribute &&\n    typeof attribute === 'object' &&\n    (attribute as any).type === 'customField' &&\n    typeof (attribute as any).customField === 'string'\n  );\n};\n\n/**\n * Creates a Zod schema for a collection of Strapi attributes.\n *\n * @param attributes - An array of tuples, where each tuple contains the attribute name and its schema definition.\n * @returns A Zod object schema representing the combined attributes.\n *\n * @example\n * ```typescript\n * const myAttributes = [\n *   ['title', { type: 'string', required: true }],\n *   ['description', { type: 'text' }],\n * ];\n * const schema = createAttributesSchema(myAttributes);\n * // schema will be a Zod object with 'title' and 'description' fields,\n * // each mapped to their respective Zod schemas based on their Strapi attribute types.\n * ```\n */\nexport const createAttributesSchema = (\n  attributes: [name: string, attribute: Schema.Attribute.AnyAttribute][]\n) => {\n  return attributes.reduce((acc, [name, attribute]) => {\n    return acc.extend({\n      get [name]() {\n        return mapAttributeToSchema(attribute);\n      },\n    });\n  }, z.object({}));\n};\n\n/**\n * Creates a Zod input schema for a collection of Strapi attributes.\n * This is typically used for validating incoming data (e.g., from API requests).\n *\n * @param attributes - An array of tuples, where each tuple contains the attribute name and its schema definition.\n * @returns A Zod object schema representing the combined input attributes.\n *\n * @example\n * ```typescript\n * const myInputAttributes = [\n *   ['email', { type: 'email', required: true }],\n *   ['description', { type: 'text', minLength: 8 }],\n * ];\n * const inputSchema = createAttributesInputSchema(myInputAttributes);\n * // inputSchema will be a Zod object with 'email' and 'description' fields,\n * // mapped to Zod schemas suitable for input validation.\n * ```\n */\nexport const createAttributesInputSchema = (\n  attributes: [name: string, attribute: Schema.Attribute.AnyAttribute][]\n) => {\n  return attributes.reduce((acc, [name, attribute]) => {\n    return acc.extend({\n      get [name]() {\n        return mapAttributeToInputSchema(attribute);\n      },\n    });\n  }, z.object({}));\n};\n\n/**\n * Maps a Strapi attribute definition to a corresponding Zod validation schema.\n *\n * This function handles every Strapi attribute types and converts them into\n * appropriate Zod validation schemas.\n *\n * @param attribute - The Strapi attribute configuration object.\n * @returns A Zod schema that corresponds to the input attribute's type.\n * @throws {Error} Throws an error if an unsupported attribute type is provided.\n *\n * @example\n * ```typescript\n * const stringAttribute = { type: 'string', minLength: 3 };\n * const stringSchema = mapAttributeToSchema(stringAttribute); // Returns a Zod string schema with minLength.\n *\n * const booleanAttribute = { type: 'boolean', default: false };\n * const booleanSchema = mapAttributeToSchema(booleanAttribute); // Returns a Zod boolean schema with a default.\n * ```\n */\nexport const mapAttributeToSchema = (attribute: Schema.Attribute.AnyAttribute): z.ZodTypeAny => {\n  switch (attribute.type) {\n    case 'biginteger':\n      return attributes.bigIntegerToSchema(attribute);\n    case 'blocks':\n      return attributes.blocksToSchema();\n    case 'boolean':\n      return attributes.booleanToSchema(attribute);\n    case 'component':\n      return attributes.componentToSchema(attribute);\n    case 'date':\n      return attributes.dateToSchema(attribute);\n    case 'datetime':\n      return attributes.datetimeToSchema(attribute);\n    case 'decimal':\n      return attributes.decimalToSchema(attribute);\n    case 'dynamiczone':\n      return attributes.dynamicZoneToSchema(attribute);\n    case 'email':\n      return attributes.emailToSchema(attribute);\n    case 'enumeration':\n      return attributes.enumToSchema(attribute);\n    case 'float':\n      return attributes.floatToSchema(attribute);\n    case 'integer':\n      return attributes.integerToSchema(attribute);\n    case 'json':\n      return attributes.jsonToSchema(attribute);\n    case 'media':\n      return attributes.mediaToSchema(attribute);\n    case 'relation':\n      return attributes.relationToSchema(attribute);\n    case 'password':\n    case 'text':\n    case 'richtext':\n    case 'string':\n      return attributes.stringToSchema(attribute);\n    case 'time':\n      return attributes.timeToSchema(attribute);\n    case 'timestamp':\n      return attributes.timestampToSchema(attribute);\n    case 'uid':\n      return attributes.uidToSchema(attribute);\n    default: {\n      if (isCustomFieldAttribute(attribute)) {\n        const attrCF = attribute as { type: 'customField'; customField: string };\n        const strapiInstance = global.strapi;\n        if (!strapiInstance) {\n          throw new Error('Strapi instance not available for custom field conversion');\n        }\n\n        const customField = strapiInstance.get('custom-fields').get(attrCF.customField);\n        if (!customField) {\n          throw new Error(`Custom field '${attrCF.customField}' not found`);\n        }\n\n        // Re-dispatch with the resolved underlying Strapi kind\n        return mapAttributeToSchema({ ...attrCF, type: customField.type });\n      }\n\n      const { type } = attribute as Schema.Attribute.AnyAttribute;\n\n      throw new Error(`Unsupported attribute type: ${type}`);\n    }\n  }\n};\n\n/**\n * Maps a Strapi attribute definition to a corresponding Zod input validation schema.\n *\n * This function handles every Strapi attribute types and converts them into\n * appropriate Zod validation schemas with their respective constraints.\n *\n * @param attribute - The Strapi attribute configuration object. Contains type information\n *                   and validation rules for the attribute.\n *\n * @returns A Zod schema that corresponds to the input attribute's type and validation rules\n *\n * @example\n * ```typescript\n * // String attribute with constraints\n * const stringAttribute = {\n *   type: 'string',\n *   minLength: 3,\n *   maxLength: 50,\n *   required: true\n * };\n * const stringSchema = mapAttributeToInputSchema(stringAttribute);\n *\n * // Enumeration attribute\n * const enumAttribute = {\n *   type: 'enumeration',\n *   enum: ['draft', 'published', 'archived']\n * };\n * const enumSchema = mapAttributeToInputSchema(enumAttribute);\n *\n * // Media attribute with multiple files\n * const mediaAttribute = {\n *   type: 'media',\n *   multiple: true\n * };\n * const mediaSchema = mapAttributeToInputSchema(mediaAttribute);\n * ```\n *\n * @throws {Error} Throws an error if an unsupported attribute type is provided\n *\n */\nexport const mapAttributeToInputSchema = (\n  attribute: Schema.Attribute.AnyAttribute\n): z.ZodTypeAny => {\n  switch (attribute.type) {\n    case 'biginteger':\n      return attributes.bigIntegerToInputSchema(attribute);\n    case 'blocks':\n      return attributes.blocksToInputSchema();\n    case 'boolean':\n      return attributes.booleanToInputSchema(attribute);\n    case 'component':\n      return attributes.componentToInputSchema(attribute);\n    case 'date':\n      return attributes.dateToInputSchema(attribute);\n    case 'datetime':\n      return attributes.datetimeToInputSchema(attribute);\n    case 'decimal':\n      return attributes.decimalToInputSchema(attribute);\n    case 'dynamiczone':\n      return attributes.dynamicZoneToInputSchema(attribute);\n    case 'email':\n      return attributes.emailToInputSchema(attribute);\n    case 'enumeration':\n      return attributes.enumerationToInputSchema(attribute);\n    case 'float':\n      return attributes.floatToInputSchema(attribute);\n    case 'integer':\n      return attributes.integerToInputSchema(attribute);\n    case 'json':\n      return attributes.jsonToInputSchema(attribute);\n    case 'media':\n      return attributes.mediaToInputSchema(attribute);\n    case 'relation':\n      return attributes.relationToInputSchema(attribute);\n    case 'password':\n    case 'text':\n    case 'richtext':\n    case 'string':\n      return attributes.textToInputSchema(attribute);\n    case 'time':\n      return attributes.timeToInputSchema(attribute);\n    case 'timestamp':\n      return attributes.timestampToInputSchema(attribute);\n    case 'uid':\n      return attributes.uidToInputSchema(attribute);\n    default: {\n      if (isCustomFieldAttribute(attribute)) {\n        const attrCF = attribute as { type: 'customField'; customField: string };\n        const strapiInstance = global.strapi;\n        if (!strapiInstance) {\n          throw new Error('Strapi instance not available for custom field conversion');\n        }\n\n        const customField = strapiInstance.get('custom-fields').get(attrCF.customField);\n        if (!customField) {\n          throw new Error(`Custom field '${attrCF.customField}' not found`);\n        }\n\n        // Re-dispatch with the resolved underlying Strapi kind\n        return mapAttributeToInputSchema({ ...attrCF, type: customField.type });\n      }\n\n      const { type } = attribute as Schema.Attribute.AnyAttribute;\n\n      throw new Error(`Unsupported attribute type: ${type}`);\n    }\n  }\n};\n"],"names":["isCustomFieldAttribute","attribute","type","customField","createAttributesSchema","attributes","reduce","acc","name","extend","mapAttributeToSchema","z","object","createAttributesInputSchema","mapAttributeToInputSchema","attrCF","strapiInstance","global","strapi","Error","get"],"mappings":"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"}