{"version":3,"file":"content-source-maps.mjs","sources":["../../src/services/content-source-maps.ts"],"sourcesContent":["import { vercelStegaCombine } from '@vercel/stega';\nimport type { Core, Struct, UID } from '@strapi/types';\nimport { traverseEntity } from '@strapi/utils';\nimport type { FieldContentSourceMap } from '@strapi/admin/strapi-admin';\n\nconst ENCODABLE_TYPES = [\n  'string',\n  'text',\n  'richtext',\n  'biginteger',\n  'date',\n  'time',\n  'datetime',\n  'timestamp',\n  'boolean',\n  'enumeration',\n  'json',\n  'media',\n  'email',\n  'password',\n  /**\n   * We cannot modify the response shape, so types that aren't based on string cannot be encoded:\n   * - json: object\n   * - blocks: object, will require a custom implementation in a dedicated PR\n   * - integer, float and decimal: number\n   * - boolean: boolean (believe it or not)\n   * - uid: can be stringified but would mess up URLs\n   */\n];\n\n// TODO: use a centralized store for these fields that would be shared with the CM and CTB\nconst EXCLUDED_FIELDS = [\n  'id',\n  'documentId',\n  'locale',\n  'localizations',\n  'created_by',\n  'updated_by',\n  'created_at',\n  'updated_at',\n  'publishedAt',\n];\n\ninterface EncodingInfo {\n  data: any;\n  schema: Struct.Schema;\n}\n\nconst isObject = (value: unknown): value is Record<string, any> => {\n  return typeof value === 'object' && value !== null;\n};\n\nconst createContentSourceMapsService = (strapi: Core.Strapi) => {\n  return {\n    encodeField(\n      text: string,\n      { kind, model, documentId, type, path, locale }: FieldContentSourceMap\n    ) {\n      /**\n       * Combine all metadata into into a one string so we only have to deal with one data-atribute\n       * on the frontend. Make it human readable because that data-attribute may be set manually by\n       * users for fields that don't support sourcemap encoding.\n       */\n      const strapiSource = new URLSearchParams();\n      strapiSource.set('documentId', documentId);\n      strapiSource.set('type', type);\n      strapiSource.set('path', path);\n\n      if (model) {\n        strapiSource.set('model', model);\n      }\n      if (kind) {\n        strapiSource.set('kind', kind);\n      }\n      if (locale) {\n        strapiSource.set('locale', locale);\n      }\n\n      return vercelStegaCombine(text, { strapiSource: strapiSource.toString() });\n    },\n\n    async encodeEntry({ data, schema }: EncodingInfo): Promise<any> {\n      if (!isObject(data) || data === undefined) {\n        return data;\n      }\n\n      return traverseEntity(\n        ({ key, value, attribute, schema, path }, { set }) => {\n          if (!attribute || EXCLUDED_FIELDS.includes(key)) {\n            return;\n          }\n\n          if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {\n            set(\n              key,\n              this.encodeField(value, {\n                path: path.rawWithIndices!,\n                type: attribute.type,\n                kind: schema.kind,\n                model: schema.uid as UID.Schema,\n                locale: data.locale,\n                documentId: data.documentId,\n              }) as any\n            );\n          }\n        },\n        {\n          schema,\n          getModel: (uid) => strapi.getModel(uid as UID.Schema),\n        },\n        data\n      );\n    },\n\n    async encodeSourceMaps({ data, schema }: EncodingInfo): Promise<any> {\n      try {\n        if (Array.isArray(data)) {\n          return await Promise.all(\n            data.map((item) => this.encodeSourceMaps({ data: item, schema }))\n          );\n        }\n\n        if (!isObject(data)) {\n          return data;\n        }\n\n        return await this.encodeEntry({ data, schema });\n      } catch (error) {\n        strapi.log.error('Error encoding source maps:', error);\n        return data;\n      }\n    },\n  };\n};\n\nexport { createContentSourceMapsService };\n"],"names":["ENCODABLE_TYPES","EXCLUDED_FIELDS","isObject","value","createContentSourceMapsService","strapi","encodeField","text","kind","model","documentId","type","path","locale","strapiSource","URLSearchParams","set","vercelStegaCombine","toString","encodeEntry","data","schema","undefined","traverseEntity","key","attribute","includes","rawWithIndices","uid","getModel","encodeSourceMaps","Array","isArray","Promise","all","map","item","error","log"],"mappings":"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"}