@ai-stack/payloadcms 3.2.24-beta → 3.68.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/{LICENSE.md → LICENSE} +1 -1
  2. package/README.md +218 -229
  3. package/dist/access/checkAccess.d.ts +4 -0
  4. package/dist/access/checkAccess.js +20 -0
  5. package/dist/access/checkAccess.js.map +1 -0
  6. package/dist/ai/core/generateObject.d.ts +7 -0
  7. package/dist/ai/core/generateObject.js +35 -0
  8. package/dist/ai/core/generateObject.js.map +1 -0
  9. package/dist/ai/core/generateText.d.ts +7 -0
  10. package/dist/ai/core/generateText.js +31 -0
  11. package/dist/ai/core/generateText.js.map +1 -0
  12. package/dist/ai/core/index.d.ts +11 -0
  13. package/dist/ai/core/index.js +10 -0
  14. package/dist/ai/core/index.js.map +1 -0
  15. package/dist/ai/core/media/generateMedia.d.ts +7 -0
  16. package/dist/ai/core/media/generateMedia.js +50 -0
  17. package/dist/ai/core/media/generateMedia.js.map +1 -0
  18. package/dist/ai/core/media/image/generateImage.d.ts +6 -0
  19. package/dist/ai/core/media/image/generateImage.js +41 -0
  20. package/dist/ai/core/media/image/generateImage.js.map +1 -0
  21. package/dist/ai/core/media/image/handlers/multimodal.d.ts +7 -0
  22. package/dist/ai/core/media/image/handlers/multimodal.js +95 -0
  23. package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -0
  24. package/dist/ai/core/media/image/handlers/standard.d.ts +7 -0
  25. package/dist/ai/core/media/image/handlers/standard.js +28 -0
  26. package/dist/ai/core/media/image/handlers/standard.js.map +1 -0
  27. package/dist/ai/core/media/image/index.d.ts +2 -0
  28. package/dist/ai/core/media/image/index.js +3 -0
  29. package/dist/ai/core/media/image/index.js.map +1 -0
  30. package/dist/ai/core/media/index.d.ts +2 -0
  31. package/dist/ai/core/media/index.js +3 -0
  32. package/dist/ai/core/media/index.js.map +1 -0
  33. package/dist/ai/core/media/speech/generateSpeech.d.ts +5 -0
  34. package/dist/ai/core/media/speech/generateSpeech.js +55 -0
  35. package/dist/ai/core/media/speech/generateSpeech.js.map +1 -0
  36. package/dist/ai/core/media/speech/index.d.ts +2 -0
  37. package/dist/ai/core/media/speech/index.js +3 -0
  38. package/dist/ai/core/media/speech/index.js.map +1 -0
  39. package/dist/ai/core/media/types.d.ts +74 -0
  40. package/dist/ai/core/media/types.js +5 -0
  41. package/dist/ai/core/media/types.js.map +1 -0
  42. package/dist/ai/core/media/utils.d.ts +11 -0
  43. package/dist/ai/core/media/utils.js +34 -0
  44. package/dist/ai/core/media/utils.js.map +1 -0
  45. package/dist/ai/core/media/video/generateVideo.d.ts +6 -0
  46. package/dist/ai/core/media/video/generateVideo.js +32 -0
  47. package/dist/ai/core/media/video/generateVideo.js.map +1 -0
  48. package/dist/ai/core/media/video/index.d.ts +2 -0
  49. package/dist/ai/core/media/video/index.js +3 -0
  50. package/dist/ai/core/media/video/index.js.map +1 -0
  51. package/dist/ai/core/streamObject.d.ts +7 -0
  52. package/dist/ai/core/streamObject.js +57 -0
  53. package/dist/ai/core/streamObject.js.map +1 -0
  54. package/dist/ai/core/streamText.d.ts +7 -0
  55. package/dist/ai/core/streamText.js +30 -0
  56. package/dist/ai/core/streamText.js.map +1 -0
  57. package/dist/ai/core/types.d.ts +85 -0
  58. package/dist/ai/core/types.js +5 -0
  59. package/dist/ai/core/types.js.map +1 -0
  60. package/dist/ai/index.d.ts +11 -0
  61. package/dist/ai/index.js +25 -0
  62. package/dist/ai/index.js.map +1 -0
  63. package/dist/ai/providers/blocks/anthropic.d.ts +2 -0
  64. package/dist/ai/providers/blocks/anthropic.js +222 -0
  65. package/dist/ai/providers/blocks/anthropic.js.map +1 -0
  66. package/dist/ai/providers/blocks/elevenlabs.d.ts +2 -0
  67. package/dist/ai/providers/blocks/elevenlabs.js +448 -0
  68. package/dist/ai/providers/blocks/elevenlabs.js.map +1 -0
  69. package/dist/ai/providers/blocks/fal.d.ts +2 -0
  70. package/dist/ai/providers/blocks/fal.js +311 -0
  71. package/dist/ai/providers/blocks/fal.js.map +1 -0
  72. package/dist/ai/providers/blocks/google.d.ts +2 -0
  73. package/dist/ai/providers/blocks/google.js +622 -0
  74. package/dist/ai/providers/blocks/google.js.map +1 -0
  75. package/dist/ai/providers/blocks/index.d.ts +2 -0
  76. package/dist/ai/providers/blocks/index.js +18 -0
  77. package/dist/ai/providers/blocks/index.js.map +1 -0
  78. package/dist/ai/providers/blocks/openai-compatible.d.ts +2 -0
  79. package/dist/ai/providers/blocks/openai-compatible.js +307 -0
  80. package/dist/ai/providers/blocks/openai-compatible.js.map +1 -0
  81. package/dist/ai/providers/blocks/openai.d.ts +2 -0
  82. package/dist/ai/providers/blocks/openai.js +599 -0
  83. package/dist/ai/providers/blocks/openai.js.map +1 -0
  84. package/dist/ai/providers/blocks/xai.d.ts +2 -0
  85. package/dist/ai/providers/blocks/xai.js +246 -0
  86. package/dist/ai/providers/blocks/xai.js.map +1 -0
  87. package/dist/ai/providers/index.d.ts +2 -0
  88. package/dist/ai/providers/index.js +6 -0
  89. package/dist/ai/providers/index.js.map +1 -0
  90. package/dist/ai/providers/registry.d.ts +40 -0
  91. package/dist/ai/providers/registry.js +256 -0
  92. package/dist/ai/providers/registry.js.map +1 -0
  93. package/dist/ai/providers/types.d.ts +115 -0
  94. package/dist/ai/providers/types.js +4 -0
  95. package/dist/ai/providers/types.js.map +1 -0
  96. package/dist/ai/utils/systemGenerate.d.ts +1 -1
  97. package/dist/ai/utils/systemGenerate.js +19 -19
  98. package/dist/ai/utils/systemGenerate.js.map +1 -1
  99. package/dist/collections/AIJobs.d.ts +2 -0
  100. package/dist/collections/AIJobs.js +81 -0
  101. package/dist/collections/AIJobs.js.map +1 -0
  102. package/dist/collections/AISettings.d.ts +2 -0
  103. package/dist/collections/AISettings.js +279 -0
  104. package/dist/collections/AISettings.js.map +1 -0
  105. package/dist/collections/Instructions.js +185 -37
  106. package/dist/collections/Instructions.js.map +1 -1
  107. package/dist/defaults.d.ts +3 -0
  108. package/dist/defaults.js +3 -0
  109. package/dist/defaults.js.map +1 -1
  110. package/dist/endpoints/buildPromptUtils.d.ts +19 -0
  111. package/dist/endpoints/buildPromptUtils.js +114 -0
  112. package/dist/endpoints/buildPromptUtils.js.map +1 -0
  113. package/dist/endpoints/chat.d.js +3 -0
  114. package/dist/endpoints/chat.d.js.map +1 -0
  115. package/dist/endpoints/fetchVoices.d.ts +2 -0
  116. package/dist/endpoints/fetchVoices.js +79 -0
  117. package/dist/endpoints/fetchVoices.js.map +1 -0
  118. package/dist/endpoints/index.js +253 -214
  119. package/dist/endpoints/index.js.map +1 -1
  120. package/dist/exports/client.d.ts +9 -0
  121. package/dist/exports/client.js +9 -0
  122. package/dist/exports/client.js.map +1 -1
  123. package/dist/fields/ComposeField/ComposeField.js +2 -2
  124. package/dist/fields/ComposeField/ComposeField.js.map +1 -1
  125. package/dist/fields/ComposeField/ComposeField.jsx +2 -2
  126. package/dist/fields/PromptEditorField/PromptEditorField.js +155 -14
  127. package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
  128. package/dist/fields/PromptEditorField/PromptEditorField.jsx +118 -3
  129. package/dist/index.d.ts +1 -0
  130. package/dist/index.js.map +1 -1
  131. package/dist/init.js +35 -13
  132. package/dist/init.js.map +1 -1
  133. package/dist/payload-ai.d.js +3 -0
  134. package/dist/payload-ai.d.js.map +1 -0
  135. package/dist/plugin.js +80 -9
  136. package/dist/plugin.js.map +1 -1
  137. package/dist/providers/InstructionsProvider/InstructionsProvider.js +35 -7
  138. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  139. package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +27 -4
  140. package/dist/providers/InstructionsProvider/context.d.ts +1 -0
  141. package/dist/providers/InstructionsProvider/context.js +1 -0
  142. package/dist/providers/InstructionsProvider/context.js.map +1 -1
  143. package/dist/providers/InstructionsProvider/useInstructions.js +13 -6
  144. package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
  145. package/dist/types.d.ts +7 -7
  146. package/dist/types.js.map +1 -1
  147. package/dist/ui/AIConfigDashboard/index.d.ts +2 -0
  148. package/dist/ui/AIConfigDashboard/index.js +46 -0
  149. package/dist/ui/AIConfigDashboard/index.js.map +1 -0
  150. package/dist/ui/AIConfigDashboard/index.jsx +24 -0
  151. package/dist/ui/ApiKeyStatusIndicator/index.d.ts +6 -0
  152. package/dist/ui/ApiKeyStatusIndicator/index.js +39 -0
  153. package/dist/ui/ApiKeyStatusIndicator/index.js.map +1 -0
  154. package/dist/ui/ApiKeyStatusIndicator/index.jsx +29 -0
  155. package/dist/ui/Compose/Compose.d.ts +1 -2
  156. package/dist/ui/Compose/Compose.js +116 -90
  157. package/dist/ui/Compose/Compose.js.map +1 -1
  158. package/dist/ui/Compose/Compose.jsx +111 -101
  159. package/dist/ui/Compose/ComposePlaceholder.d.ts +7 -0
  160. package/dist/ui/Compose/ComposePlaceholder.js +78 -0
  161. package/dist/ui/Compose/ComposePlaceholder.js.map +1 -0
  162. package/dist/ui/Compose/ComposePlaceholder.jsx +66 -0
  163. package/dist/ui/Compose/UndoRedoActions.js +3 -1
  164. package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
  165. package/dist/ui/Compose/UndoRedoActions.jsx +2 -1
  166. package/dist/ui/Compose/compose.module.css +1 -1
  167. package/dist/ui/Compose/hooks/menu/itemsMap.js +1 -1
  168. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
  169. package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -1
  170. package/dist/ui/Compose/hooks/menu/useMenu.js +2 -2
  171. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  172. package/dist/ui/Compose/hooks/menu/useMenu.jsx +2 -2
  173. package/dist/ui/Compose/hooks/useActiveFieldTracking.js +69 -10
  174. package/dist/ui/Compose/hooks/useActiveFieldTracking.js.map +1 -1
  175. package/dist/ui/Compose/hooks/useGenerate.d.ts +3 -0
  176. package/dist/ui/Compose/hooks/useGenerate.js +71 -11
  177. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
  178. package/dist/ui/Compose/hooks/useHistory.js +52 -5
  179. package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
  180. package/dist/ui/DynamicModelSelect/index.d.ts +7 -0
  181. package/dist/ui/DynamicModelSelect/index.js +231 -0
  182. package/dist/ui/DynamicModelSelect/index.js.map +1 -0
  183. package/dist/ui/DynamicModelSelect/index.jsx +207 -0
  184. package/dist/ui/DynamicProviderSelect/index.d.ts +7 -0
  185. package/dist/ui/DynamicProviderSelect/index.js +101 -0
  186. package/dist/ui/DynamicProviderSelect/index.js.map +1 -0
  187. package/dist/ui/DynamicProviderSelect/index.jsx +90 -0
  188. package/dist/ui/DynamicVoiceSelect/index.d.ts +7 -0
  189. package/dist/ui/DynamicVoiceSelect/index.js +104 -0
  190. package/dist/ui/DynamicVoiceSelect/index.js.map +1 -0
  191. package/dist/ui/DynamicVoiceSelect/index.jsx +69 -0
  192. package/dist/ui/EncryptedTextField/index.d.ts +8 -0
  193. package/dist/ui/EncryptedTextField/index.js +74 -0
  194. package/dist/ui/EncryptedTextField/index.js.map +1 -0
  195. package/dist/ui/EncryptedTextField/index.jsx +35 -0
  196. package/dist/ui/Icons/LottieAnimation.js +3 -1
  197. package/dist/ui/Icons/LottieAnimation.js.map +1 -1
  198. package/dist/ui/Icons/LottieAnimation.jsx +2 -1
  199. package/dist/ui/ModelRowLabel/index.d.ts +6 -0
  200. package/dist/ui/ModelRowLabel/index.js +41 -0
  201. package/dist/ui/ModelRowLabel/index.js.map +1 -0
  202. package/dist/ui/ModelRowLabel/index.jsx +26 -0
  203. package/dist/ui/ProviderOptionsEditor/index.d.ts +7 -0
  204. package/dist/ui/ProviderOptionsEditor/index.js +291 -0
  205. package/dist/ui/ProviderOptionsEditor/index.js.map +1 -0
  206. package/dist/ui/ProviderOptionsEditor/index.jsx +210 -0
  207. package/dist/ui/VoicesFetcher/index.d.ts +7 -0
  208. package/dist/ui/VoicesFetcher/index.js +72 -0
  209. package/dist/ui/VoicesFetcher/index.js.map +1 -0
  210. package/dist/ui/VoicesFetcher/index.jsx +56 -0
  211. package/dist/utilities/encryption.d.ts +2 -0
  212. package/dist/utilities/encryption.js +47 -0
  213. package/dist/utilities/encryption.js.map +1 -0
  214. package/dist/utilities/extractImageData.d.ts +9 -0
  215. package/dist/utilities/extractImageData.js +12 -2
  216. package/dist/utilities/extractImageData.js.map +1 -1
  217. package/dist/utilities/fetchImages.d.ts +14 -0
  218. package/dist/utilities/fetchImages.js +38 -0
  219. package/dist/utilities/fetchImages.js.map +1 -0
  220. package/dist/utilities/fieldToJsonSchema.d.ts +2 -1
  221. package/dist/utilities/fieldToJsonSchema.js +66 -3
  222. package/dist/utilities/fieldToJsonSchema.js.map +1 -1
  223. package/dist/utilities/getFieldBySchemaPath.js +15 -0
  224. package/dist/utilities/getFieldBySchemaPath.js.map +1 -1
  225. package/dist/utilities/getProviderOptionsFields.d.ts +16 -0
  226. package/dist/utilities/getProviderOptionsFields.js +80 -0
  227. package/dist/utilities/getProviderOptionsFields.js.map +1 -0
  228. package/dist/utilities/isPluginActivated.js +1 -2
  229. package/dist/utilities/isPluginActivated.js.map +1 -1
  230. package/dist/utilities/lexicalToHTML.js.map +1 -1
  231. package/dist/utilities/resolveImageReferences.d.ts +28 -0
  232. package/dist/utilities/resolveImageReferences.js +148 -0
  233. package/dist/utilities/resolveImageReferences.js.map +1 -0
  234. package/dist/utilities/schemaConverter.d.ts +3 -0
  235. package/dist/utilities/schemaConverter.js +93 -0
  236. package/dist/utilities/schemaConverter.js.map +1 -0
  237. package/dist/utilities/setSafeLexicalState.d.ts +1 -3
  238. package/dist/utilities/setSafeLexicalState.js +1 -1
  239. package/dist/utilities/setSafeLexicalState.js.map +1 -1
  240. package/package.json +19 -21
  241. package/dist/ai/models/anthropic/index.d.ts +0 -2
  242. package/dist/ai/models/anthropic/index.js +0 -129
  243. package/dist/ai/models/anthropic/index.js.map +0 -1
  244. package/dist/ai/models/elevenLabs/generateVoice.d.ts +0 -8
  245. package/dist/ai/models/elevenLabs/generateVoice.js +0 -20
  246. package/dist/ai/models/elevenLabs/generateVoice.js.map +0 -1
  247. package/dist/ai/models/elevenLabs/index.d.ts +0 -2
  248. package/dist/ai/models/elevenLabs/index.js +0 -133
  249. package/dist/ai/models/elevenLabs/index.js.map +0 -1
  250. package/dist/ai/models/elevenLabs/voices.d.ts +0 -8
  251. package/dist/ai/models/elevenLabs/voices.js +0 -24
  252. package/dist/ai/models/elevenLabs/voices.js.map +0 -1
  253. package/dist/ai/models/generateObject.d.ts +0 -11
  254. package/dist/ai/models/generateObject.js +0 -22
  255. package/dist/ai/models/generateObject.js.map +0 -1
  256. package/dist/ai/models/google/generateImage.d.ts +0 -9
  257. package/dist/ai/models/google/generateImage.js +0 -27
  258. package/dist/ai/models/google/generateImage.js.map +0 -1
  259. package/dist/ai/models/google/index.d.ts +0 -2
  260. package/dist/ai/models/google/index.js +0 -201
  261. package/dist/ai/models/google/index.js.map +0 -1
  262. package/dist/ai/models/index.d.ts +0 -2
  263. package/dist/ai/models/index.js +0 -13
  264. package/dist/ai/models/index.js.map +0 -1
  265. package/dist/ai/models/openai/generateImage.d.ts +0 -5
  266. package/dist/ai/models/openai/generateImage.js +0 -31
  267. package/dist/ai/models/openai/generateImage.js.map +0 -1
  268. package/dist/ai/models/openai/generateVoice.d.ts +0 -6
  269. package/dist/ai/models/openai/generateVoice.js +0 -19
  270. package/dist/ai/models/openai/generateVoice.js.map +0 -1
  271. package/dist/ai/models/openai/index.d.ts +0 -2
  272. package/dist/ai/models/openai/index.js +0 -428
  273. package/dist/ai/models/openai/index.js.map +0 -1
  274. package/dist/ai/models/openai/openai.d.ts +0 -1
  275. package/dist/ai/models/openai/openai.js +0 -8
  276. package/dist/ai/models/openai/openai.js.map +0 -1
  277. package/dist/ai/utils/editImagesWithOpenAI.d.ts +0 -10
  278. package/dist/ai/utils/editImagesWithOpenAI.js +0 -37
  279. package/dist/ai/utils/editImagesWithOpenAI.js.map +0 -1
  280. package/dist/types.d.js +0 -3
  281. package/dist/types.d.js.map +0 -1
  282. package/dist/utilities/getGenerationModels.d.ts +0 -2
  283. package/dist/utilities/getGenerationModels.js +0 -10
  284. package/dist/utilities/getGenerationModels.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/fieldToJsonSchema.ts"],"sourcesContent":["/**\n * fieldToJsonSchema\n * Convert a Payload Field (server or client) into a minimal JSON Schema object,\n * wrapped as { type: 'object', properties: { [name]: valueSchema }, required: [...] }\n *\n * Supported types:\n * - text, textarea, select, number, date, code, email, json\n * Arrays are emitted only when field.hasMany is true and the field type supports hasMany\n * (text, textarea, select; for others only if your config truly sets hasMany).\n */\n\nexport type JsonSchema = Record<string, any>;\n\n// Narrowed minimal typing to avoid anywhere possible without pulling the full payload types at runtime.\n// In a Payload project, you can import type { Field, ClientField } from 'payload' and use those instead.\ntype BaseField = {\n admin?: {\n description?: unknown;\n language?: unknown;\n };\n hasMany?: boolean;\n // json\n jsonSchema?: unknown;\n max?: number;\n maxRows?: number;\n // number\n min?: number;\n // text/textarea\n minRows?: number;\n name?: string;\n // select\n options?: Array<\n | {\n label?: unknown;\n value: number | string;\n }\n | number\n | string\n >;\n required?: boolean;\n schema?: unknown;\n type?: string;\n typescriptSchema?: unknown;\n};\n\nfunction isString(s: unknown): s is string {\n return typeof s === 'string';\n}\n\nfunction isPlainObject(o: unknown): o is Record<string, unknown> {\n return !!o && typeof o === 'object' && !Array.isArray(o);\n}\n\nfunction getDescription(field: BaseField): string | undefined {\n const d = field?.admin?.description;\n return typeof d === 'string' ? d : undefined;\n}\n\nfunction stringWithDescription(field: BaseField) {\n const out: Record<string, any> = { type: 'string' };\n const description = getDescription(field);\n if (description) {out.description = description;}\n return out;\n}\n\nfunction numberWithBounds(field: BaseField) {\n const out: Record<string, any> = { type: 'number' };\n if (typeof field.min === 'number') {out.minimum = field.min;}\n if (typeof field.max === 'number') {out.maximum = field.max;}\n const description = getDescription(field);\n if (description) {out.description = description;}\n return out;\n}\n\nfunction dateSchema(field: BaseField) {\n const out: Record<string, any> = { type: 'string', format: 'date-time' };\n const description = getDescription(field);\n if (description) {out.description = description;}\n return out;\n}\n\nfunction codeSchema(field: BaseField) {\n const out: Record<string, any> = { type: 'string' };\n let description = getDescription(field);\n const lang = field?.admin?.language;\n if (typeof lang === 'string' && lang.trim()) {\n description = description ? `${description} (language: ${lang})` : `language: ${lang}`;\n }\n if (description) {out.description = description;}\n return out;\n}\n\nfunction emailSchema(field: BaseField) {\n const out: Record<string, any> = { type: 'string', format: 'email' };\n const description = getDescription(field);\n if (description) {out.description = description;}\n return out;\n}\n\nfunction jsonValueSchema(field: BaseField) {\n // Prefer a provided JSON Schema object\n if (isPlainObject(field.jsonSchema)) {return field.jsonSchema as object;}\n if (isPlainObject(field.schema)) {return field.schema as object;}\n\n // typescriptSchema cannot be executed here; default to object\n return { type: 'object' };\n}\n\nfunction normalizeSelectOptions(field: BaseField): { values: Array<number | string>; valueType: 'number' | 'string' } {\n const raw = field.options || [];\n const values: Array<number | string> = [];\n\n for (const opt of raw) {\n if (typeof opt === 'string' || typeof opt === 'number') {\n values.push(opt);\n } else if (isPlainObject(opt) && ('value' in opt)) {\n const v = (opt as any).value;\n if (typeof v === 'string' || typeof v === 'number') {\n values.push(v);\n }\n }\n }\n\n // Infer primitive type\n const allNumbers = values.length > 0 && values.every((v) => typeof v === 'number');\n const valueType: 'number' | 'string' = allNumbers ? 'number' : 'string';\n return { values, valueType };\n}\n\nfunction supportsHasMany(fieldType: string | undefined): boolean {\n // Out of the box: text, textarea, select support hasMany\n // Others can be arrays only if your config truly sets hasMany; we return boolean based on type here.\n return fieldType === 'text' || fieldType === 'textarea' || fieldType === 'select';\n}\n\nexport function fieldToJsonSchema(\n fieldInput: BaseField,\n opts?: { nameOverride?: string; wrapObject?: boolean },\n): JsonSchema {\n const field: BaseField = fieldInput || {};\n const name = isString(opts?.nameOverride) && opts?.nameOverride.length ? opts.nameOverride : (field.name || 'value');\n const type = field.type;\n\n let valueSchema: null | Record<string, any> = null;\n\n switch (type) {\n case 'code': {\n const base = codeSchema(field);\n if (field.hasMany) {\n valueSchema = { type: 'array', items: base };\n } else {\n valueSchema = base;\n }\n break;\n }\n case 'date': {\n const base = dateSchema(field);\n if (field.hasMany) {\n valueSchema = { type: 'array', items: base };\n } else {\n valueSchema = base;\n }\n break;\n }\n\n case 'email': {\n const base = emailSchema(field);\n if (field.hasMany) {\n valueSchema = { type: 'array', items: base };\n } else {\n valueSchema = base;\n }\n break;\n }\n\n case 'json': {\n const base = jsonValueSchema(field);\n if (field.hasMany) {\n valueSchema = { type: 'array', items: base };\n } else {\n valueSchema = base as Record<string, any>;\n }\n break;\n }\n\n case 'number': {\n const base = numberWithBounds(field);\n if (field.hasMany) {\n // Respect hasMany only if truly configured; Payload rarely uses hasMany for number, but allow if present.\n valueSchema = { type: 'array', items: base };\n } else {\n valueSchema = base;\n }\n break;\n }\n\n case 'select': {\n const { values, valueType } = normalizeSelectOptions(field);\n const baseSingle: Record<string, any> = { type: valueType, enum: values };\n const description = getDescription(field);\n if (description) {baseSingle.description = description;}\n\n if (field.hasMany && supportsHasMany(type)) {\n valueSchema = {\n type: 'array',\n items: { type: valueType, enum: values },\n ...(description ? { description } : {}),\n };\n } else {\n valueSchema = baseSingle;\n }\n break;\n }\n\n case 'text':\n case 'textarea': {\n const base = stringWithDescription(field);\n if (field.hasMany && supportsHasMany(type)) {\n const arr: Record<string, any> = {\n type: 'array',\n items: { type: 'string' },\n };\n if (typeof field.minRows === 'number') {arr.minItems = field.minRows;}\n if (typeof field.maxRows === 'number') {arr.maxItems = field.maxRows;}\n if (base.description) {arr.description = base.description;}\n valueSchema = arr;\n } else {\n valueSchema = base;\n }\n break;\n }\n\n default: {\n // Unsupported type: return null to allow caller to decide how to proceed (e.g., no schema)\n valueSchema = null;\n break;\n }\n }\n\n const wrap = opts?.wrapObject !== false;\n\n if (!wrap) {\n return (valueSchema || {}) as JsonSchema;\n }\n\n if (!valueSchema) {\n // Return undefined-like schema if not supported; caller may choose to skip passing schema\n return {} as JsonSchema;\n }\n\n const schema: JsonSchema = {\n type: 'object',\n additionalProperties: false,\n properties: {\n [name]: valueSchema,\n },\n required: [name]\n };\n\n return schema;\n}\n"],"names":["isString","s","isPlainObject","o","Array","isArray","getDescription","field","d","admin","description","undefined","stringWithDescription","out","type","numberWithBounds","min","minimum","max","maximum","dateSchema","format","codeSchema","lang","language","trim","emailSchema","jsonValueSchema","jsonSchema","schema","normalizeSelectOptions","raw","options","values","opt","push","v","value","allNumbers","length","every","valueType","supportsHasMany","fieldType","fieldToJsonSchema","fieldInput","opts","name","nameOverride","valueSchema","base","hasMany","items","baseSingle","enum","arr","minRows","minItems","maxRows","maxItems","wrap","wrapObject","additionalProperties","properties","required"],"mappings":"AAAA;;;;;;;;;CASC,GAoCD,SAASA,SAASC,CAAU;IAC1B,OAAO,OAAOA,MAAM;AACtB;AAEA,SAASC,cAAcC,CAAU;IAC/B,OAAO,CAAC,CAACA,KAAK,OAAOA,MAAM,YAAY,CAACC,MAAMC,OAAO,CAACF;AACxD;AAEA,SAASG,eAAeC,KAAgB;IACtC,MAAMC,IAAID,OAAOE,OAAOC;IACxB,OAAO,OAAOF,MAAM,WAAWA,IAAIG;AACrC;AAEA,SAASC,sBAAsBL,KAAgB;IAC7C,MAAMM,MAA2B;QAAEC,MAAM;IAAS;IAClD,MAAMJ,cAAcJ,eAAeC;IACnC,IAAIG,aAAa;QAACG,IAAIH,WAAW,GAAGA;IAAY;IAChD,OAAOG;AACT;AAEA,SAASE,iBAAiBR,KAAgB;IACxC,MAAMM,MAA2B;QAAEC,MAAM;IAAS;IAClD,IAAI,OAAOP,MAAMS,GAAG,KAAK,UAAU;QAACH,IAAII,OAAO,GAAGV,MAAMS,GAAG;IAAC;IAC5D,IAAI,OAAOT,MAAMW,GAAG,KAAK,UAAU;QAACL,IAAIM,OAAO,GAAGZ,MAAMW,GAAG;IAAC;IAC5D,MAAMR,cAAcJ,eAAeC;IACnC,IAAIG,aAAa;QAACG,IAAIH,WAAW,GAAGA;IAAY;IAChD,OAAOG;AACT;AAEA,SAASO,WAAWb,KAAgB;IAClC,MAAMM,MAA2B;QAAEC,MAAM;QAAUO,QAAQ;IAAY;IACvE,MAAMX,cAAcJ,eAAeC;IACnC,IAAIG,aAAa;QAACG,IAAIH,WAAW,GAAGA;IAAY;IAChD,OAAOG;AACT;AAEA,SAASS,WAAWf,KAAgB;IAClC,MAAMM,MAA2B;QAAEC,MAAM;IAAS;IAClD,IAAIJ,cAAcJ,eAAeC;IACjC,MAAMgB,OAAOhB,OAAOE,OAAOe;IAC3B,IAAI,OAAOD,SAAS,YAAYA,KAAKE,IAAI,IAAI;QAC3Cf,cAAcA,cAAc,CAAC,EAAEA,YAAY,YAAY,EAAEa,KAAK,CAAC,CAAC,GAAG,CAAC,UAAU,EAAEA,KAAK,CAAC;IACxF;IACA,IAAIb,aAAa;QAACG,IAAIH,WAAW,GAAGA;IAAY;IAChD,OAAOG;AACT;AAEA,SAASa,YAAYnB,KAAgB;IACnC,MAAMM,MAA2B;QAAEC,MAAM;QAAUO,QAAQ;IAAQ;IACnE,MAAMX,cAAcJ,eAAeC;IACnC,IAAIG,aAAa;QAACG,IAAIH,WAAW,GAAGA;IAAY;IAChD,OAAOG;AACT;AAEA,SAASc,gBAAgBpB,KAAgB;IACvC,uCAAuC;IACvC,IAAIL,cAAcK,MAAMqB,UAAU,GAAG;QAAC,OAAOrB,MAAMqB,UAAU;IAAW;IACxE,IAAI1B,cAAcK,MAAMsB,MAAM,GAAG;QAAC,OAAOtB,MAAMsB,MAAM;IAAW;IAEhE,8DAA8D;IAC9D,OAAO;QAAEf,MAAM;IAAS;AAC1B;AAEA,SAASgB,uBAAuBvB,KAAgB;IAC9C,MAAMwB,MAAMxB,MAAMyB,OAAO,IAAI,EAAE;IAC/B,MAAMC,SAAiC,EAAE;IAEzC,KAAK,MAAMC,OAAOH,IAAK;QACrB,IAAI,OAAOG,QAAQ,YAAY,OAAOA,QAAQ,UAAU;YACtDD,OAAOE,IAAI,CAACD;QACd,OAAO,IAAIhC,cAAcgC,QAAS,WAAWA,KAAM;YACjD,MAAME,IAAI,AAACF,IAAYG,KAAK;YAC5B,IAAI,OAAOD,MAAM,YAAY,OAAOA,MAAM,UAAU;gBAClDH,OAAOE,IAAI,CAACC;YACd;QACF;IACF;IAEA,uBAAuB;IACvB,MAAME,aAAaL,OAAOM,MAAM,GAAG,KAAKN,OAAOO,KAAK,CAAC,CAACJ,IAAM,OAAOA,MAAM;IACzE,MAAMK,YAAiCH,aAAa,WAAW;IAC/D,OAAO;QAAEL;QAAQQ;IAAU;AAC7B;AAEA,SAASC,gBAAgBC,SAA6B;IACpD,yDAAyD;IACzD,qGAAqG;IACrG,OAAOA,cAAc,UAAUA,cAAc,cAAcA,cAAc;AAC3E;AAEA,OAAO,SAASC,kBACdC,UAAqB,EACrBC,IAAsD;IAEtD,MAAMvC,QAAmBsC,cAAc,CAAC;IACxC,MAAME,OAAO/C,SAAS8C,MAAME,iBAAiBF,MAAME,aAAaT,SAASO,KAAKE,YAAY,GAAIzC,MAAMwC,IAAI,IAAI;IAC5G,MAAMjC,OAAOP,MAAMO,IAAI;IAEvB,IAAImC,cAA0C;IAE9C,OAAQnC;QACN,KAAK;YAAQ;gBACX,MAAMoC,OAAO5B,WAAWf;gBACxB,IAAIA,MAAM4C,OAAO,EAAE;oBACjBF,cAAc;wBAAEnC,MAAM;wBAASsC,OAAOF;oBAAK;gBAC7C,OAAO;oBACLD,cAAcC;gBAChB;gBACA;YACF;QACA,KAAK;YAAQ;gBACX,MAAMA,OAAO9B,WAAWb;gBACxB,IAAIA,MAAM4C,OAAO,EAAE;oBACjBF,cAAc;wBAAEnC,MAAM;wBAASsC,OAAOF;oBAAK;gBAC7C,OAAO;oBACLD,cAAcC;gBAChB;gBACA;YACF;QAEA,KAAK;YAAS;gBACZ,MAAMA,OAAOxB,YAAYnB;gBACzB,IAAIA,MAAM4C,OAAO,EAAE;oBACjBF,cAAc;wBAAEnC,MAAM;wBAASsC,OAAOF;oBAAK;gBAC7C,OAAO;oBACLD,cAAcC;gBAChB;gBACA;YACF;QAEA,KAAK;YAAQ;gBACX,MAAMA,OAAOvB,gBAAgBpB;gBAC7B,IAAIA,MAAM4C,OAAO,EAAE;oBACjBF,cAAc;wBAAEnC,MAAM;wBAASsC,OAAOF;oBAAK;gBAC7C,OAAO;oBACLD,cAAcC;gBAChB;gBACA;YACF;QAEA,KAAK;YAAU;gBACb,MAAMA,OAAOnC,iBAAiBR;gBAC9B,IAAIA,MAAM4C,OAAO,EAAE;oBACjB,0GAA0G;oBAC1GF,cAAc;wBAAEnC,MAAM;wBAASsC,OAAOF;oBAAK;gBAC7C,OAAO;oBACLD,cAAcC;gBAChB;gBACA;YACF;QAEA,KAAK;YAAU;gBACb,MAAM,EAAEjB,MAAM,EAAEQ,SAAS,EAAE,GAAGX,uBAAuBvB;gBACrD,MAAM8C,aAAkC;oBAAEvC,MAAM2B;oBAAWa,MAAMrB;gBAAO;gBACxE,MAAMvB,cAAcJ,eAAeC;gBACnC,IAAIG,aAAa;oBAAC2C,WAAW3C,WAAW,GAAGA;gBAAY;gBAEvD,IAAIH,MAAM4C,OAAO,IAAIT,gBAAgB5B,OAAO;oBAC1CmC,cAAc;wBACZnC,MAAM;wBACNsC,OAAO;4BAAEtC,MAAM2B;4BAAWa,MAAMrB;wBAAO;wBACvC,GAAIvB,cAAc;4BAAEA;wBAAY,IAAI,CAAC,CAAC;oBACxC;gBACF,OAAO;oBACLuC,cAAcI;gBAChB;gBACA;YACF;QAEA,KAAK;QACL,KAAK;YAAY;gBACf,MAAMH,OAAOtC,sBAAsBL;gBACnC,IAAIA,MAAM4C,OAAO,IAAIT,gBAAgB5B,OAAO;oBAC1C,MAAMyC,MAA2B;wBAC/BzC,MAAM;wBACNsC,OAAO;4BAAEtC,MAAM;wBAAS;oBAC1B;oBACA,IAAI,OAAOP,MAAMiD,OAAO,KAAK,UAAU;wBAACD,IAAIE,QAAQ,GAAGlD,MAAMiD,OAAO;oBAAC;oBACrE,IAAI,OAAOjD,MAAMmD,OAAO,KAAK,UAAU;wBAACH,IAAII,QAAQ,GAAGpD,MAAMmD,OAAO;oBAAC;oBACrE,IAAIR,KAAKxC,WAAW,EAAE;wBAAC6C,IAAI7C,WAAW,GAAGwC,KAAKxC,WAAW;oBAAC;oBAC1DuC,cAAcM;gBAChB,OAAO;oBACLN,cAAcC;gBAChB;gBACA;YACF;QAEA;YAAS;gBACP,2FAA2F;gBAC3FD,cAAc;gBACd;YACF;IACF;IAEA,MAAMW,OAAOd,MAAMe,eAAe;IAElC,IAAI,CAACD,MAAM;QACT,OAAQX,eAAe,CAAC;IAC1B;IAEA,IAAI,CAACA,aAAa;QAChB,0FAA0F;QAC1F,OAAO,CAAC;IACV;IAEA,MAAMpB,SAAqB;QACzBf,MAAM;QACNgD,sBAAsB;QACtBC,YAAY;YACV,CAAChB,KAAK,EAAEE;QACV;QACAe,UAAU;YAACjB;SAAK;IAClB;IAEA,OAAOlB;AACT"}
1
+ {"version":3,"sources":["../../src/utilities/fieldToJsonSchema.ts"],"sourcesContent":["/**\n * fieldToJsonSchema\n * Convert a Payload Field (server or client) into a minimal JSON Schema object,\n * wrapped as { type: 'object', properties: { [name]: valueSchema }, required: [...] }\n *\n * Supported types:\n * - text, textarea, select, number, date, code, email, json\n * Arrays are emitted only when field.hasMany is true and the field type supports hasMany\n * (text, textarea, select; for others only if your config truly sets hasMany).\n */\nimport type { Field } from 'payload'\n\nexport type JsonSchema = Record<string, any>;\n\n// Narrowed minimal typing to avoid anywhere possible without pulling the full payload types at runtime.\n// In a Payload project, you can import type { Field, ClientField } from 'payload' and use those instead.\ntype BaseField = {\n admin?: {\n description?: unknown;\n language?: unknown;\n };\n hasMany?: boolean;\n // json\n jsonSchema?: unknown;\n max?: number;\n maxRows?: number;\n // number\n min?: number;\n // text/textarea\n minRows?: number;\n name?: string;\n // select\n options?: Array<\n | {\n label?: unknown;\n value: number | string;\n }\n | number\n | string\n >;\n required?: boolean;\n schema?: unknown;\n type?: string;\n typescriptSchema?: unknown;\n};\n\nfunction isString(s: unknown): s is string {\n return typeof s === 'string';\n}\n\nfunction isPlainObject(o: unknown): o is Record<string, unknown> {\n return !!o && typeof o === 'object' && !Array.isArray(o);\n}\n\nfunction getDescription(field: BaseField): string | undefined {\n const d = field?.admin?.description;\n return typeof d === 'string' ? d : undefined;\n}\n\nfunction stringWithDescription(field: BaseField) {\n const out: Record<string, any> = { type: 'string' };\n const description = getDescription(field);\n if (description) {out.description = description;}\n return out;\n}\n\nfunction numberWithBounds(field: BaseField) {\n const out: Record<string, any> = { type: 'number' };\n if (typeof field.min === 'number') {out.minimum = field.min;}\n if (typeof field.max === 'number') {out.maximum = field.max;}\n const description = getDescription(field);\n if (description) {out.description = description;}\n return out;\n}\n\nfunction dateSchema(field: BaseField) {\n const out: Record<string, any> = { type: 'string', format: 'date-time' };\n const description = getDescription(field);\n if (description) {out.description = description;}\n return out;\n}\n\nfunction codeSchema(field: BaseField) {\n const out: Record<string, any> = { type: 'string' };\n let description = getDescription(field);\n const lang = field?.admin?.language;\n if (typeof lang === 'string' && lang.trim()) {\n description = description ? `${description} (language: ${lang})` : `language: ${lang}`;\n }\n if (description) {out.description = description;}\n return out;\n}\n\nfunction emailSchema(field: BaseField) {\n const out: Record<string, any> = { type: 'string', format: 'email' };\n const description = getDescription(field);\n if (description) {out.description = description;}\n return out;\n}\n\nfunction jsonValueSchema(field: BaseField) {\n // Prefer a provided JSON Schema object\n if (isPlainObject(field.jsonSchema)) {return field.jsonSchema as object;}\n if (isPlainObject(field.schema)) {return field.schema as object;}\n\n // typescriptSchema cannot be executed here; default to object\n return { type: 'object' };\n}\n\nfunction normalizeSelectOptions(field: BaseField): { values: Array<number | string>; valueType: 'number' | 'string' } {\n const raw = field.options || [];\n const values: Array<number | string> = [];\n\n for (const opt of raw) {\n if (typeof opt === 'string' || typeof opt === 'number') {\n values.push(opt);\n } else if (isPlainObject(opt) && ('value' in opt)) {\n const v = (opt as any).value;\n if (typeof v === 'string' || typeof v === 'number') {\n values.push(v);\n }\n }\n }\n\n // Infer primitive type\n const allNumbers = values.length > 0 && values.every((v) => typeof v === 'number');\n const valueType: 'number' | 'string' = allNumbers ? 'number' : 'string';\n return { values, valueType };\n}\n\nfunction supportsHasMany(fieldType: string | undefined): boolean {\n // Out of the box: text, textarea, select support hasMany\n // Others can be arrays only if your config truly sets hasMany; we return boolean based on type here.\n return fieldType === 'text' || fieldType === 'textarea' || fieldType === 'select';\n}\n\nexport function fieldToJsonSchema(\n fieldInput: BaseField & Field,\n opts?: { nameOverride?: string; wrapObject?: boolean },\n): JsonSchema {\n const field = fieldInput || {};\n const name = isString(opts?.nameOverride) && opts?.nameOverride.length ? opts.nameOverride : (field.name || 'value');\n const type = field.type;\n\n let valueSchema: null | Record<string, any> = null;\n\n switch (type) {\n case 'array':\n case 'group': {\n if ('fields' in field && Array.isArray(field.fields)) {\n const properties: Record<string, any> = {}\n const required: string[] = []\n \n const processFields = (fields: any[]) => {\n for (const subField of fields) {\n if (subField.type === 'row' || subField.type === 'collapsible') {\n if (subField.fields) {processFields(subField.fields)}\n continue\n }\n if (!subField.name) {continue}\n\n const subSchema = fieldToJsonSchema(subField, { wrapObject: false })\n if (subSchema && Object.keys(subSchema).length > 0) {\n properties[subField.name] = subSchema\n if (subField.required) {required.push(subField.name)}\n }\n }\n }\n \n processFields(field.fields)\n\n const objSchema = {\n type: 'object',\n additionalProperties: false,\n properties,\n required: required.length ? required : undefined\n }\n\n if (type === 'array') {\n valueSchema = {\n type: 'array',\n items: objSchema\n }\n } else {\n valueSchema = objSchema\n }\n \n const description = getDescription(field);\n if (description) {valueSchema.description = description;}\n }\n break;\n }\n\n case 'checkbox': {\n valueSchema = { type: 'boolean' };\n const description = getDescription(field);\n if (description) {valueSchema.description = description;}\n break;\n }\n\n case 'code': {\n const base = codeSchema(field);\n if (field.hasMany) {\n valueSchema = { type: 'array', items: base };\n } else {\n valueSchema = base;\n }\n break;\n }\n\n case 'date': {\n const base = dateSchema(field);\n if (field.hasMany) {\n valueSchema = { type: 'array', items: base };\n } else {\n valueSchema = base;\n }\n break;\n }\n\n case 'email': {\n const base = emailSchema(field);\n if (field.hasMany) {\n valueSchema = { type: 'array', items: base };\n } else {\n valueSchema = base;\n }\n break;\n }\n\n case 'json': {\n const base = jsonValueSchema(field);\n if (field.hasMany) {\n valueSchema = { type: 'array', items: base };\n } else {\n valueSchema = base as Record<string, any>;\n }\n break;\n }\n\n case 'number': {\n const base = numberWithBounds(field);\n if (field.hasMany) {\n valueSchema = { type: 'array', items: base };\n } else {\n valueSchema = base;\n }\n break;\n }\n case 'select': {\n const { values, valueType } = normalizeSelectOptions(field);\n const baseSingle: Record<string, any> = { type: valueType, enum: values };\n const description = getDescription(field);\n if (description) {baseSingle.description = description;}\n\n if (field.hasMany && supportsHasMany(type)) {\n valueSchema = {\n type: 'array',\n items: { type: valueType, enum: values },\n ...(description ? { description } : {}),\n };\n } else {\n valueSchema = baseSingle;\n }\n break;\n }\n\n case 'text':\n case 'textarea': {\n const base = stringWithDescription(field);\n if (field.hasMany && supportsHasMany(type)) {\n const arr: Record<string, any> = {\n type: 'array',\n items: { type: 'string' },\n };\n if (typeof field.minRows === 'number') {arr.minItems = field.minRows;}\n if (typeof field.maxRows === 'number') {arr.maxItems = field.maxRows;}\n if (base.description) {arr.description = base.description;}\n valueSchema = arr;\n } else {\n valueSchema = base;\n }\n break;\n }\n \n // Explicitly handle organizational types to avoid default breakage if passed directly\n // though usually they are handled by parent recursion in group/array case above.\n // If passed as root, we can't really return a meaningful single-value schema without a wrapper?\n // But let's leave default for them or handle if necessary. \n // For now, if someone passes a 'row' as root, it will fall to default (null).\n\n default: {\n valueSchema = null;\n break;\n }\n }\n\n const wrap = opts?.wrapObject !== false;\n\n if (!wrap) {\n return (valueSchema || {}) as JsonSchema;\n }\n\n if (!valueSchema) {\n return {} as JsonSchema;\n }\n\n const schema: JsonSchema = {\n type: 'object',\n additionalProperties: false,\n properties: {\n [name]: valueSchema,\n },\n required: [name]\n };\n\n return schema;\n}\n"],"names":["isString","s","isPlainObject","o","Array","isArray","getDescription","field","d","admin","description","undefined","stringWithDescription","out","type","numberWithBounds","min","minimum","max","maximum","dateSchema","format","codeSchema","lang","language","trim","emailSchema","jsonValueSchema","jsonSchema","schema","normalizeSelectOptions","raw","options","values","opt","push","v","value","allNumbers","length","every","valueType","supportsHasMany","fieldType","fieldToJsonSchema","fieldInput","opts","name","nameOverride","valueSchema","fields","properties","required","processFields","subField","subSchema","wrapObject","Object","keys","objSchema","additionalProperties","items","base","hasMany","baseSingle","enum","arr","minRows","minItems","maxRows","maxItems","wrap"],"mappings":"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"}
@@ -37,6 +37,21 @@
37
37
  }
38
38
  }
39
39
  }
40
+ // Handle unnamed groups and collapsibles (they don't contribute to path)
41
+ // Groups without names are just wrappers, their children are at the same path level
42
+ if (field.type === 'group' && !field.name && field.fields) {
43
+ const foundInUnnamedGroup = findInFields(field.fields, segments);
44
+ if (foundInUnnamedGroup) {
45
+ return foundInUnnamedGroup;
46
+ }
47
+ }
48
+ // Handle unnamed collapsibles similarly
49
+ if (field.type === 'collapsible' && field.fields) {
50
+ const foundInCollapsible = findInFields(field.fields, segments);
51
+ if (foundInCollapsible) {
52
+ return foundInCollapsible;
53
+ }
54
+ }
40
55
  if (field.name === current) {
41
56
  // If this is the last segment, we found the target field
42
57
  if (remaining.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getFieldBySchemaPath.ts"],"sourcesContent":["import type { ClientCollectionConfig, CollectionConfig, Field } from 'payload'\n\ntype AnyCollectionConfig = ClientCollectionConfig | CollectionConfig\n\n/**\n * Resolve a Payload field definition by a full schemaPath like:\n * \"{collectionSlug}.fieldA.subFieldB.blockSlug.innerField\"\n *\n * Notes:\n * - Tabs are a UI construct and are not part of schemaPath (fields inside tabs are at the same level).\n * - Blocks include the block slug as part of the path (we must consume it between the block field and its inner fields).\n * - Rows are skipped by this plugin&#39;s schema path mapping; support added defensively.\n */\nexport const getFieldBySchemaPath = (\n collectionConfig: AnyCollectionConfig,\n schemaPath: string,\n): Field | null => {\n if (!collectionConfig || !schemaPath) {\n return null\n }\n\n const parts = schemaPath.split('.')\n if (!parts.length) {\n return null\n }\n\n // Strip the collection slug prefix if present\n const [collectionSlug, ...rest] = parts\n const pathParts =\n collectionSlug === collectionConfig.slug ? rest.filter(Boolean) : parts.filter(Boolean)\n\n if (!pathParts.length) {\n return null\n }\n\n const findInFields = (fields: Field[], segments: string[]): Field | null => {\n if (!segments.length) {\n return null\n }\n\n const [current, ...remaining] = segments\n\n // First, try to match a field by name\n for (const field of fields) {\n // Tabs do not contribute to path segments; search inside all tabs with the same segments\n if ((field as any).tabs) {\n const tabs = (field as any).tabs as Array<{ fields?: Field[] }>\n for (const tab of tabs) {\n const foundInTab =\n tab.fields && tab.fields.length ? findInFields(tab.fields, segments) : null\n if (foundInTab) {\n return foundInTab\n }\n }\n }\n\n if ((field as any).name === current) {\n // If this is the last segment, we found the target field\n if (remaining.length === 0) {\n return field\n }\n\n // Recurse into composite field types\n if ((field as any).fields && Array.isArray((field as any).fields)) {\n const found = findInFields((field as any).fields, remaining)\n if (found) {\n return found\n }\n }\n\n if ((field as any).blocks && Array.isArray((field as any).blocks)) {\n // Next segment should be a block slug, then continue into block fields\n if (!remaining.length) {\n return field\n } // path stops at block container (unlikely for our mapping)\n const [blockSlug, ...afterBlock] = remaining\n const blocks = (field as any).blocks as Array<{ fields: Field[]; slug: string }>\n const block = blocks.find((b) => b.slug === blockSlug)\n if (block) {\n const found = findInFields(block.fields, afterBlock)\n if (found) {\n return found\n }\n }\n }\n }\n }\n\n // Not found at this level\n return null\n }\n\n const rootFields = (collectionConfig as any).fields as Field[] | undefined\n if (!rootFields || !Array.isArray(rootFields)) {\n return null\n }\n\n return findInFields(rootFields, pathParts)\n}\n"],"names":["getFieldBySchemaPath","collectionConfig","schemaPath","parts","split","length","collectionSlug","rest","pathParts","slug","filter","Boolean","findInFields","fields","segments","current","remaining","field","tabs","tab","foundInTab","name","Array","isArray","found","blocks","blockSlug","afterBlock","block","find","b","rootFields"],"mappings":"AAIA;;;;;;;;CAQC,GACD,OAAO,MAAMA,uBAAuB,CAClCC,kBACAC;IAEA,IAAI,CAACD,oBAAoB,CAACC,YAAY;QACpC,OAAO;IACT;IAEA,MAAMC,QAAQD,WAAWE,KAAK,CAAC;IAC/B,IAAI,CAACD,MAAME,MAAM,EAAE;QACjB,OAAO;IACT;IAEA,8CAA8C;IAC9C,MAAM,CAACC,gBAAgB,GAAGC,KAAK,GAAGJ;IAClC,MAAMK,YACJF,mBAAmBL,iBAAiBQ,IAAI,GAAGF,KAAKG,MAAM,CAACC,WAAWR,MAAMO,MAAM,CAACC;IAEjF,IAAI,CAACH,UAAUH,MAAM,EAAE;QACrB,OAAO;IACT;IAEA,MAAMO,eAAe,CAACC,QAAiBC;QACrC,IAAI,CAACA,SAAST,MAAM,EAAE;YACpB,OAAO;QACT;QAEA,MAAM,CAACU,SAAS,GAAGC,UAAU,GAAGF;QAEhC,sCAAsC;QACtC,KAAK,MAAMG,SAASJ,OAAQ;YAC1B,yFAAyF;YACzF,IAAI,AAACI,MAAcC,IAAI,EAAE;gBACvB,MAAMA,OAAO,AAACD,MAAcC,IAAI;gBAChC,KAAK,MAAMC,OAAOD,KAAM;oBACtB,MAAME,aACJD,IAAIN,MAAM,IAAIM,IAAIN,MAAM,CAACR,MAAM,GAAGO,aAAaO,IAAIN,MAAM,EAAEC,YAAY;oBACzE,IAAIM,YAAY;wBACd,OAAOA;oBACT;gBACF;YACF;YAEA,IAAI,AAACH,MAAcI,IAAI,KAAKN,SAAS;gBACnC,yDAAyD;gBACzD,IAAIC,UAAUX,MAAM,KAAK,GAAG;oBAC1B,OAAOY;gBACT;gBAEA,qCAAqC;gBACrC,IAAI,AAACA,MAAcJ,MAAM,IAAIS,MAAMC,OAAO,CAAC,AAACN,MAAcJ,MAAM,GAAG;oBACjE,MAAMW,QAAQZ,aAAa,AAACK,MAAcJ,MAAM,EAAEG;oBAClD,IAAIQ,OAAO;wBACT,OAAOA;oBACT;gBACF;gBAEA,IAAI,AAACP,MAAcQ,MAAM,IAAIH,MAAMC,OAAO,CAAC,AAACN,MAAcQ,MAAM,GAAG;oBACjE,uEAAuE;oBACvE,IAAI,CAACT,UAAUX,MAAM,EAAE;wBACrB,OAAOY;oBACT,EAAE,2DAA2D;oBAC7D,MAAM,CAACS,WAAW,GAAGC,WAAW,GAAGX;oBACnC,MAAMS,SAAS,AAACR,MAAcQ,MAAM;oBACpC,MAAMG,QAAQH,OAAOI,IAAI,CAAC,CAACC,IAAMA,EAAErB,IAAI,KAAKiB;oBAC5C,IAAIE,OAAO;wBACT,MAAMJ,QAAQZ,aAAagB,MAAMf,MAAM,EAAEc;wBACzC,IAAIH,OAAO;4BACT,OAAOA;wBACT;oBACF;gBACF;YACF;QACF;QAEA,0BAA0B;QAC1B,OAAO;IACT;IAEA,MAAMO,aAAa,AAAC9B,iBAAyBY,MAAM;IACnD,IAAI,CAACkB,cAAc,CAACT,MAAMC,OAAO,CAACQ,aAAa;QAC7C,OAAO;IACT;IAEA,OAAOnB,aAAamB,YAAYvB;AAClC,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/getFieldBySchemaPath.ts"],"sourcesContent":["import type { ClientCollectionConfig, CollectionConfig, Field } from 'payload'\n\ntype AnyCollectionConfig = ClientCollectionConfig | CollectionConfig\n\n/**\n * Resolve a Payload field definition by a full schemaPath like:\n * \"{collectionSlug}.fieldA.subFieldB.blockSlug.innerField\"\n *\n * Notes:\n * - Tabs are a UI construct and are not part of schemaPath (fields inside tabs are at the same level).\n * - Blocks include the block slug as part of the path (we must consume it between the block field and its inner fields).\n * - Rows are skipped by this plugin&#39;s schema path mapping; support added defensively.\n */\nexport const getFieldBySchemaPath = (\n collectionConfig: AnyCollectionConfig,\n schemaPath: string,\n): Field | null => {\n if (!collectionConfig || !schemaPath) {\n return null\n }\n\n const parts = schemaPath.split('.')\n if (!parts.length) {\n return null\n }\n\n // Strip the collection slug prefix if present\n const [collectionSlug, ...rest] = parts\n const pathParts =\n collectionSlug === collectionConfig.slug ? rest.filter(Boolean) : parts.filter(Boolean)\n\n if (!pathParts.length) {\n return null\n }\n\n const findInFields = (fields: Field[], segments: string[]): Field | null => {\n if (!segments.length) {\n return null\n }\n\n const [current, ...remaining] = segments\n\n // First, try to match a field by name\n for (const field of fields) {\n // Tabs do not contribute to path segments; search inside all tabs with the same segments\n if ((field as any).tabs) {\n const tabs = (field as any).tabs as Array<{ fields?: Field[] }>\n for (const tab of tabs) {\n const foundInTab =\n tab.fields && tab.fields.length ? findInFields(tab.fields, segments) : null\n if (foundInTab) {\n return foundInTab\n }\n }\n }\n\n // Handle unnamed groups and collapsibles (they don't contribute to path)\n // Groups without names are just wrappers, their children are at the same path level\n if ((field as any).type === 'group' && !(field as any).name && (field as any).fields) {\n const foundInUnnamedGroup = findInFields((field as any).fields, segments)\n if (foundInUnnamedGroup) {\n return foundInUnnamedGroup\n }\n }\n\n // Handle unnamed collapsibles similarly\n if ((field as any).type === 'collapsible' && (field as any).fields) {\n const foundInCollapsible = findInFields((field as any).fields, segments)\n if (foundInCollapsible) {\n return foundInCollapsible\n }\n }\n\n if ((field as any).name === current) {\n // If this is the last segment, we found the target field\n if (remaining.length === 0) {\n return field\n }\n\n // Recurse into composite field types\n if ((field as any).fields && Array.isArray((field as any).fields)) {\n const found = findInFields((field as any).fields, remaining)\n if (found) {\n return found\n }\n }\n\n if ((field as any).blocks && Array.isArray((field as any).blocks)) {\n // Next segment should be a block slug, then continue into block fields\n if (!remaining.length) {\n return field\n } // path stops at block container (unlikely for our mapping)\n const [blockSlug, ...afterBlock] = remaining\n const blocks = (field as any).blocks as Array<{ fields: Field[]; slug: string }>\n const block = blocks.find((b) => b.slug === blockSlug)\n if (block) {\n const found = findInFields(block.fields, afterBlock)\n if (found) {\n return found\n }\n }\n }\n }\n }\n\n // Not found at this level\n return null\n }\n\n const rootFields = (collectionConfig as any).fields as Field[] | undefined\n if (!rootFields || !Array.isArray(rootFields)) {\n return null\n }\n\n return findInFields(rootFields, pathParts)\n}\n"],"names":["getFieldBySchemaPath","collectionConfig","schemaPath","parts","split","length","collectionSlug","rest","pathParts","slug","filter","Boolean","findInFields","fields","segments","current","remaining","field","tabs","tab","foundInTab","type","name","foundInUnnamedGroup","foundInCollapsible","Array","isArray","found","blocks","blockSlug","afterBlock","block","find","b","rootFields"],"mappings":"AAIA;;;;;;;;CAQC,GACD,OAAO,MAAMA,uBAAuB,CAClCC,kBACAC;IAEA,IAAI,CAACD,oBAAoB,CAACC,YAAY;QACpC,OAAO;IACT;IAEA,MAAMC,QAAQD,WAAWE,KAAK,CAAC;IAC/B,IAAI,CAACD,MAAME,MAAM,EAAE;QACjB,OAAO;IACT;IAEA,8CAA8C;IAC9C,MAAM,CAACC,gBAAgB,GAAGC,KAAK,GAAGJ;IAClC,MAAMK,YACJF,mBAAmBL,iBAAiBQ,IAAI,GAAGF,KAAKG,MAAM,CAACC,WAAWR,MAAMO,MAAM,CAACC;IAEjF,IAAI,CAACH,UAAUH,MAAM,EAAE;QACrB,OAAO;IACT;IAEA,MAAMO,eAAe,CAACC,QAAiBC;QACrC,IAAI,CAACA,SAAST,MAAM,EAAE;YACpB,OAAO;QACT;QAEA,MAAM,CAACU,SAAS,GAAGC,UAAU,GAAGF;QAEhC,sCAAsC;QACtC,KAAK,MAAMG,SAASJ,OAAQ;YAC1B,yFAAyF;YACzF,IAAI,AAACI,MAAcC,IAAI,EAAE;gBACvB,MAAMA,OAAO,AAACD,MAAcC,IAAI;gBAChC,KAAK,MAAMC,OAAOD,KAAM;oBACtB,MAAME,aACJD,IAAIN,MAAM,IAAIM,IAAIN,MAAM,CAACR,MAAM,GAAGO,aAAaO,IAAIN,MAAM,EAAEC,YAAY;oBACzE,IAAIM,YAAY;wBACd,OAAOA;oBACT;gBACF;YACF;YAEA,yEAAyE;YACzE,oFAAoF;YACpF,IAAI,AAACH,MAAcI,IAAI,KAAK,WAAW,CAAC,AAACJ,MAAcK,IAAI,IAAI,AAACL,MAAcJ,MAAM,EAAE;gBACpF,MAAMU,sBAAsBX,aAAa,AAACK,MAAcJ,MAAM,EAAEC;gBAChE,IAAIS,qBAAqB;oBACvB,OAAOA;gBACT;YACF;YAEA,wCAAwC;YACxC,IAAI,AAACN,MAAcI,IAAI,KAAK,iBAAiB,AAACJ,MAAcJ,MAAM,EAAE;gBAClE,MAAMW,qBAAqBZ,aAAa,AAACK,MAAcJ,MAAM,EAAEC;gBAC/D,IAAIU,oBAAoB;oBACtB,OAAOA;gBACT;YACF;YAEA,IAAI,AAACP,MAAcK,IAAI,KAAKP,SAAS;gBACnC,yDAAyD;gBACzD,IAAIC,UAAUX,MAAM,KAAK,GAAG;oBAC1B,OAAOY;gBACT;gBAEA,qCAAqC;gBACrC,IAAI,AAACA,MAAcJ,MAAM,IAAIY,MAAMC,OAAO,CAAC,AAACT,MAAcJ,MAAM,GAAG;oBACjE,MAAMc,QAAQf,aAAa,AAACK,MAAcJ,MAAM,EAAEG;oBAClD,IAAIW,OAAO;wBACT,OAAOA;oBACT;gBACF;gBAEA,IAAI,AAACV,MAAcW,MAAM,IAAIH,MAAMC,OAAO,CAAC,AAACT,MAAcW,MAAM,GAAG;oBACjE,uEAAuE;oBACvE,IAAI,CAACZ,UAAUX,MAAM,EAAE;wBACrB,OAAOY;oBACT,EAAE,2DAA2D;oBAC7D,MAAM,CAACY,WAAW,GAAGC,WAAW,GAAGd;oBACnC,MAAMY,SAAS,AAACX,MAAcW,MAAM;oBACpC,MAAMG,QAAQH,OAAOI,IAAI,CAAC,CAACC,IAAMA,EAAExB,IAAI,KAAKoB;oBAC5C,IAAIE,OAAO;wBACT,MAAMJ,QAAQf,aAAamB,MAAMlB,MAAM,EAAEiB;wBACzC,IAAIH,OAAO;4BACT,OAAOA;wBACT;oBACF;gBACF;YACF;QACF;QAEA,0BAA0B;QAC1B,OAAO;IACT;IAEA,MAAMO,aAAa,AAACjC,iBAAyBY,MAAM;IACnD,IAAI,CAACqB,cAAc,CAACT,MAAMC,OAAO,CAACQ,aAAa;QAC7C,OAAO;IACT;IAEA,OAAOtB,aAAasB,YAAY1B;AAClC,EAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Field } from 'payload';
2
+ type UseCase = 'image' | 'text' | 'tts' | 'video';
3
+ /**
4
+ * Extract provider options fields for a given provider and use case.
5
+ * Returns the inner fields of the {useCase}ProviderOptions group.
6
+ */
7
+ export declare function getProviderOptionsFields(providerSlug: string, useCase: UseCase): Field[];
8
+ /**
9
+ * Get the default values from provider options fields
10
+ */
11
+ export declare function getProviderOptionsDefaults(providerSlug: string, useCase: UseCase): Record<string, unknown>;
12
+ /**
13
+ * Check if a provider supports a given use case
14
+ */
15
+ export declare function providerSupportsUseCase(providerSlug: string, useCase: UseCase): boolean;
16
+ export {};
@@ -0,0 +1,80 @@
1
+ import { allProviderBlocks } from '../ai/providers/blocks/index.js';
2
+ /**
3
+ * Get the provider options field group name for a given use case
4
+ */ function getOptionsGroupName(useCase) {
5
+ return `${useCase}ProviderOptions`;
6
+ }
7
+ /**
8
+ * Find a field by name within a block's fields, searching through tabs
9
+ */ function findFieldInBlock(block, fieldName) {
10
+ const searchFields = (fields)=>{
11
+ for (const field of fields){
12
+ if ('name' in field && field.name === fieldName) {
13
+ return field;
14
+ }
15
+ if (field.type === 'tabs' && 'tabs' in field) {
16
+ for (const tab of field.tabs){
17
+ const found = searchFields(tab.fields);
18
+ if (found) {
19
+ return found;
20
+ }
21
+ }
22
+ }
23
+ if (field.type === 'group' && 'fields' in field) {
24
+ const found = searchFields(field.fields);
25
+ if (found) {
26
+ return found;
27
+ }
28
+ }
29
+ }
30
+ return undefined;
31
+ };
32
+ return searchFields(block.fields);
33
+ }
34
+ /**
35
+ * Extract provider options fields for a given provider and use case.
36
+ * Returns the inner fields of the {useCase}ProviderOptions group.
37
+ */ export function getProviderOptionsFields(providerSlug, useCase) {
38
+ const block = allProviderBlocks.find((b)=>b.slug === providerSlug);
39
+ if (!block) {
40
+ return [];
41
+ }
42
+ const groupName = getOptionsGroupName(useCase);
43
+ const optionsGroup = findFieldInBlock(block, groupName);
44
+ if (optionsGroup && optionsGroup.type === 'group' && 'fields' in optionsGroup) {
45
+ return optionsGroup.fields;
46
+ }
47
+ return [];
48
+ }
49
+ /**
50
+ * Get the default values from provider options fields
51
+ */ export function getProviderOptionsDefaults(providerSlug, useCase) {
52
+ const fields = getProviderOptionsFields(providerSlug, useCase);
53
+ const defaults = {};
54
+ for (const field of fields){
55
+ if ('name' in field && 'defaultValue' in field && field.defaultValue !== undefined) {
56
+ defaults[field.name] = field.defaultValue;
57
+ }
58
+ // Handle nested groups (like voice_settings in ElevenLabs)
59
+ if (field.type === 'group' && 'fields' in field && 'name' in field) {
60
+ const nestedDefaults = {};
61
+ for (const nestedField of field.fields){
62
+ if ('name' in nestedField && 'defaultValue' in nestedField && nestedField.defaultValue !== undefined) {
63
+ nestedDefaults[nestedField.name] = nestedField.defaultValue;
64
+ }
65
+ }
66
+ if (Object.keys(nestedDefaults).length > 0) {
67
+ defaults[field.name] = nestedDefaults;
68
+ }
69
+ }
70
+ }
71
+ return defaults;
72
+ }
73
+ /**
74
+ * Check if a provider supports a given use case
75
+ */ export function providerSupportsUseCase(providerSlug, useCase) {
76
+ const fields = getProviderOptionsFields(providerSlug, useCase);
77
+ return fields.length > 0;
78
+ }
79
+
80
+ //# sourceMappingURL=getProviderOptionsFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/getProviderOptionsFields.ts"],"sourcesContent":["import type { Block, ClientField, Field } from 'payload'\n\nimport { allProviderBlocks } from '../ai/providers/blocks/index.js'\n\ntype UseCase = 'image' | 'text' | 'tts' | 'video'\n\n/**\n * Get the provider options field group name for a given use case\n */\nfunction getOptionsGroupName(useCase: UseCase): string {\n return `${useCase}ProviderOptions`\n}\n\n/**\n * Find a field by name within a block's fields, searching through tabs\n */\nfunction findFieldInBlock(block: Block, fieldName: string): Field | undefined {\n const searchFields = (fields: Field[]): Field | undefined => {\n for (const field of fields) {\n if ('name' in field && field.name === fieldName) {\n return field\n }\n if (field.type === 'tabs' && 'tabs' in field) {\n for (const tab of field.tabs) {\n const found = searchFields(tab.fields)\n if (found) {return found}\n }\n }\n if (field.type === 'group' && 'fields' in field) {\n const found = searchFields(field.fields)\n if (found) {return found}\n }\n }\n return undefined\n }\n \n return searchFields(block.fields)\n}\n\n/**\n * Extract provider options fields for a given provider and use case.\n * Returns the inner fields of the {useCase}ProviderOptions group.\n */\nexport function getProviderOptionsFields(\n providerSlug: string,\n useCase: UseCase\n): Field[] {\n const block = allProviderBlocks.find((b) => b.slug === providerSlug)\n if (!block) {\n return []\n }\n\n const groupName = getOptionsGroupName(useCase)\n const optionsGroup = findFieldInBlock(block, groupName)\n\n if (optionsGroup && optionsGroup.type === 'group' && 'fields' in optionsGroup) {\n return optionsGroup.fields\n }\n\n return []\n}\n\n/**\n * Get the default values from provider options fields\n */\nexport function getProviderOptionsDefaults(\n providerSlug: string,\n useCase: UseCase\n): Record<string, unknown> {\n const fields = getProviderOptionsFields(providerSlug, useCase)\n const defaults: Record<string, unknown> = {}\n\n for (const field of fields) {\n if ('name' in field && 'defaultValue' in field && field.defaultValue !== undefined) {\n defaults[field.name] = field.defaultValue\n }\n // Handle nested groups (like voice_settings in ElevenLabs)\n if (field.type === 'group' && 'fields' in field && 'name' in field) {\n const nestedDefaults: Record<string, unknown> = {}\n for (const nestedField of field.fields) {\n if ('name' in nestedField && 'defaultValue' in nestedField && nestedField.defaultValue !== undefined) {\n nestedDefaults[nestedField.name] = nestedField.defaultValue\n }\n }\n if (Object.keys(nestedDefaults).length > 0) {\n defaults[field.name] = nestedDefaults\n }\n }\n }\n\n return defaults\n}\n\n/**\n * Check if a provider supports a given use case\n */\nexport function providerSupportsUseCase(providerSlug: string, useCase: UseCase): boolean {\n const fields = getProviderOptionsFields(providerSlug, useCase)\n return fields.length > 0\n}\n"],"names":["allProviderBlocks","getOptionsGroupName","useCase","findFieldInBlock","block","fieldName","searchFields","fields","field","name","type","tab","tabs","found","undefined","getProviderOptionsFields","providerSlug","find","b","slug","groupName","optionsGroup","getProviderOptionsDefaults","defaults","defaultValue","nestedDefaults","nestedField","Object","keys","length","providerSupportsUseCase"],"mappings":"AAEA,SAASA,iBAAiB,QAAQ,kCAAiC;AAInE;;CAEC,GACD,SAASC,oBAAoBC,OAAgB;IAC3C,OAAO,CAAC,EAAEA,QAAQ,eAAe,CAAC;AACpC;AAEA;;CAEC,GACD,SAASC,iBAAiBC,KAAY,EAAEC,SAAiB;IACvD,MAAMC,eAAe,CAACC;QACpB,KAAK,MAAMC,SAASD,OAAQ;YAC1B,IAAI,UAAUC,SAASA,MAAMC,IAAI,KAAKJ,WAAW;gBAC/C,OAAOG;YACT;YACA,IAAIA,MAAME,IAAI,KAAK,UAAU,UAAUF,OAAO;gBAC5C,KAAK,MAAMG,OAAOH,MAAMI,IAAI,CAAE;oBAC5B,MAAMC,QAAQP,aAAaK,IAAIJ,MAAM;oBACrC,IAAIM,OAAO;wBAAC,OAAOA;oBAAK;gBAC1B;YACF;YACA,IAAIL,MAAME,IAAI,KAAK,WAAW,YAAYF,OAAO;gBAC/C,MAAMK,QAAQP,aAAaE,MAAMD,MAAM;gBACvC,IAAIM,OAAO;oBAAC,OAAOA;gBAAK;YAC1B;QACF;QACA,OAAOC;IACT;IAEA,OAAOR,aAAaF,MAAMG,MAAM;AAClC;AAEA;;;CAGC,GACD,OAAO,SAASQ,yBACdC,YAAoB,EACpBd,OAAgB;IAEhB,MAAME,QAAQJ,kBAAkBiB,IAAI,CAAC,CAACC,IAAMA,EAAEC,IAAI,KAAKH;IACvD,IAAI,CAACZ,OAAO;QACV,OAAO,EAAE;IACX;IAEA,MAAMgB,YAAYnB,oBAAoBC;IACtC,MAAMmB,eAAelB,iBAAiBC,OAAOgB;IAE7C,IAAIC,gBAAgBA,aAAaX,IAAI,KAAK,WAAW,YAAYW,cAAc;QAC7E,OAAOA,aAAad,MAAM;IAC5B;IAEA,OAAO,EAAE;AACX;AAEA;;CAEC,GACD,OAAO,SAASe,2BACdN,YAAoB,EACpBd,OAAgB;IAEhB,MAAMK,SAASQ,yBAAyBC,cAAcd;IACtD,MAAMqB,WAAoC,CAAC;IAE3C,KAAK,MAAMf,SAASD,OAAQ;QAC1B,IAAI,UAAUC,SAAS,kBAAkBA,SAASA,MAAMgB,YAAY,KAAKV,WAAW;YAClFS,QAAQ,CAACf,MAAMC,IAAI,CAAC,GAAGD,MAAMgB,YAAY;QAC3C;QACA,2DAA2D;QAC3D,IAAIhB,MAAME,IAAI,KAAK,WAAW,YAAYF,SAAS,UAAUA,OAAO;YAClE,MAAMiB,iBAA0C,CAAC;YACjD,KAAK,MAAMC,eAAelB,MAAMD,MAAM,CAAE;gBACtC,IAAI,UAAUmB,eAAe,kBAAkBA,eAAeA,YAAYF,YAAY,KAAKV,WAAW;oBACpGW,cAAc,CAACC,YAAYjB,IAAI,CAAC,GAAGiB,YAAYF,YAAY;gBAC7D;YACF;YACA,IAAIG,OAAOC,IAAI,CAACH,gBAAgBI,MAAM,GAAG,GAAG;gBAC1CN,QAAQ,CAACf,MAAMC,IAAI,CAAC,GAAGgB;YACzB;QACF;IACF;IAEA,OAAOF;AACT;AAEA;;CAEC,GACD,OAAO,SAASO,wBAAwBd,YAAoB,EAAEd,OAAgB;IAC5E,MAAMK,SAASQ,yBAAyBC,cAAcd;IACtD,OAAOK,OAAOsB,MAAM,GAAG;AACzB"}
@@ -1,6 +1,5 @@
1
- import { getGenerationModels } from './getGenerationModels.js';
2
1
  export const isPluginActivated = (pluginConfig)=>{
3
- return (getGenerationModels(pluginConfig) ?? []).length > 0;
2
+ return !!pluginConfig;
4
3
  };
5
4
 
6
5
  //# sourceMappingURL=isPluginActivated.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/isPluginActivated.ts"],"sourcesContent":["import type { PluginConfig } from '../types.js'\n\nimport { getGenerationModels } from './getGenerationModels.js'\n\nexport const isPluginActivated = (pluginConfig: PluginConfig) => {\n return (getGenerationModels(pluginConfig) ?? []).length > 0\n}\n"],"names":["getGenerationModels","isPluginActivated","pluginConfig","length"],"mappings":"AAEA,SAASA,mBAAmB,QAAQ,2BAA0B;AAE9D,OAAO,MAAMC,oBAAoB,CAACC;IAChC,OAAO,AAACF,CAAAA,oBAAoBE,iBAAiB,EAAE,AAAD,EAAGC,MAAM,GAAG;AAC5D,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/isPluginActivated.ts"],"sourcesContent":["import type { PluginConfig } from '../types.js'\n\nexport const isPluginActivated = (pluginConfig: PluginConfig) => {\n return !!pluginConfig\n}\n"],"names":["isPluginActivated","pluginConfig"],"mappings":"AAEA,OAAO,MAAMA,oBAAoB,CAACC;IAChC,OAAO,CAAC,CAACA;AACX,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/lexicalToHTML.ts"],"sourcesContent":["import type { SerializedEditorState } from 'lexical'\n\nimport {\n type SanitizedServerEditorConfig,\n consolidateHTMLConverters,\n convertLexicalToHTML,\n} from '@payloadcms/richtext-lexical'\n\nexport async function lexicalToHTML(\n editorData: SerializedEditorState,\n editorConfig: SanitizedServerEditorConfig,\n) {\n return await convertLexicalToHTML({\n converters: consolidateHTMLConverters({ editorConfig }),\n data: editorData,\n })\n}\n"],"names":["consolidateHTMLConverters","convertLexicalToHTML","lexicalToHTML","editorData","editorConfig","converters","data"],"mappings":"AAEA,SAEEA,yBAAyB,EACzBC,oBAAoB,QACf,+BAA8B;AAErC,OAAO,eAAeC,cACpBC,UAAiC,EACjCC,YAAyC;IAEzC,OAAO,MAAMH,qBAAqB;QAChCI,YAAYL,0BAA0B;YAAEI;QAAa;QACrDE,MAAMH;IACR;AACF"}
1
+ {"version":3,"sources":["../../src/utilities/lexicalToHTML.ts"],"sourcesContent":["import type { SerializedEditorState } from 'lexical'\n\nimport {\n consolidateHTMLConverters,\n convertLexicalToHTML,\n type SanitizedServerEditorConfig,\n} from '@payloadcms/richtext-lexical'\n\nexport async function lexicalToHTML(\n editorData: SerializedEditorState,\n editorConfig: SanitizedServerEditorConfig,\n) {\n return await convertLexicalToHTML({\n converters: consolidateHTMLConverters({ editorConfig }),\n data: editorData,\n })\n}\n"],"names":["consolidateHTMLConverters","convertLexicalToHTML","lexicalToHTML","editorData","editorConfig","converters","data"],"mappings":"AAEA,SACEA,yBAAyB,EACzBC,oBAAoB,QAEf,+BAA8B;AAErC,OAAO,eAAeC,cACpBC,UAAiC,EACjCC,YAAyC;IAEzC,OAAO,MAAMH,qBAAqB;QAChCI,YAAYL,0BAA0B;YAAEI;QAAa;QACrDE,MAAMH;IACR;AACF"}
@@ -0,0 +1,28 @@
1
+ import type { PayloadRequest } from 'payload';
2
+ export interface ResolvedImage {
3
+ image: {
4
+ mimeType?: string;
5
+ name: string;
6
+ thumbnailURL?: string;
7
+ type: string;
8
+ url: string;
9
+ };
10
+ }
11
+ interface ResolveImageReferencesResult {
12
+ images: ResolvedImage[];
13
+ processedPrompt: string;
14
+ }
15
+ /**
16
+ * Parses and resolves image references in prompts.
17
+ *
18
+ * Supports two formats:
19
+ * - @fieldName - for single upload fields
20
+ * - @fieldName:filename.jpg - for specific images in hasMany fields
21
+ *
22
+ * @param prompt - The prompt text containing @field references
23
+ * @param contextData - The document data to resolve field values from
24
+ * @param req - Payload request object for fetching media
25
+ * @returns Processed prompt with references removed and array of resolved images
26
+ */
27
+ export declare function resolveImageReferences(prompt: string, contextData: Record<string, unknown>, req: PayloadRequest): Promise<ResolveImageReferencesResult>;
28
+ export {};
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Parses and resolves image references in prompts.
3
+ *
4
+ * Supports two formats:
5
+ * - @fieldName - for single upload fields
6
+ * - @fieldName:filename.jpg - for specific images in hasMany fields
7
+ *
8
+ * @param prompt - The prompt text containing @field references
9
+ * @param contextData - The document data to resolve field values from
10
+ * @param req - Payload request object for fetching media
11
+ * @returns Processed prompt with references removed and array of resolved images
12
+ */ export async function resolveImageReferences(prompt, contextData, req) {
13
+ // Pattern matches: @fieldName or @fieldName:filename.ext (filename can have spaces)
14
+ // The filename part matches everything up to and including an image extension
15
+ const pattern = /@([\w.]+)(?::(.+?\.(?:png|jpe?g|webp|gif)))?/gi;
16
+ const references = [];
17
+ let match;
18
+ // Extract all image references
19
+ while((match = pattern.exec(prompt)) !== null){
20
+ references.push({
21
+ fieldName: match[1],
22
+ filename: match[2],
23
+ fullMatch: match[0]
24
+ });
25
+ }
26
+ if (references.length === 0) {
27
+ return {
28
+ images: [],
29
+ processedPrompt: prompt
30
+ };
31
+ }
32
+ const resolvedImages = [];
33
+ let processedPrompt = prompt;
34
+ // Resolve each reference
35
+ for (const ref of references){
36
+ try {
37
+ const fieldValue = contextData[ref.fieldName];
38
+ if (!fieldValue) {
39
+ req.payload.logger.warn(`Image reference @${ref.fieldName} not found in document context`);
40
+ continue;
41
+ }
42
+ // Handle single upload field (value is an ID or object)
43
+ if (!ref.filename) {
44
+ const mediaDoc = await resolveMediaDocument(fieldValue, req);
45
+ if (mediaDoc) {
46
+ resolvedImages.push(formatImageData(mediaDoc));
47
+ }
48
+ } else {
49
+ const mediaDoc = await resolveMediaFromArray(fieldValue, ref.filename, req);
50
+ if (mediaDoc) {
51
+ resolvedImages.push(formatImageData(mediaDoc));
52
+ }
53
+ }
54
+ // Remove the reference from the prompt
55
+ processedPrompt = processedPrompt.replace(ref.fullMatch, '');
56
+ } catch (error) {
57
+ req.payload.logger.error(error, `Error resolving image reference: ${ref.fullMatch}`);
58
+ }
59
+ }
60
+ // Clean up extra whitespace from removed references
61
+ processedPrompt = processedPrompt.replace(/\s+/g, ' ').trim();
62
+ return {
63
+ images: resolvedImages,
64
+ processedPrompt
65
+ };
66
+ }
67
+ /**
68
+ * Resolves a single media document from an ID or populated object
69
+ */ async function resolveMediaDocument(value, req) {
70
+ // If it's already a populated object with required fields
71
+ if (typeof value === 'object' && value !== null && 'url' in value) {
72
+ return value;
73
+ }
74
+ // If it's an ID string, fetch the media document
75
+ if (typeof value === 'string' || typeof value === 'number') {
76
+ try {
77
+ // Try to find which collection this media belongs to
78
+ // First, check the common 'media' collection
79
+ const collections = [
80
+ 'media',
81
+ 'uploads'
82
+ ];
83
+ for (const collectionSlug of collections){
84
+ try {
85
+ const mediaDoc = await req.payload.findByID({
86
+ id: value,
87
+ collection: collectionSlug,
88
+ req
89
+ });
90
+ if (mediaDoc) {
91
+ return mediaDoc;
92
+ }
93
+ } catch (_ignore) {
94
+ continue;
95
+ }
96
+ }
97
+ } catch (error) {
98
+ req.payload.logger.error(error, 'Error fetching media document');
99
+ }
100
+ }
101
+ return null;
102
+ }
103
+ /**
104
+ * Resolves a specific media document from an array by matching filename
105
+ */ async function resolveMediaFromArray(arrayValue, filename, req) {
106
+ if (!Array.isArray(arrayValue)) {
107
+ return null;
108
+ }
109
+ // Search through array for matching filename
110
+ for (const item of arrayValue){
111
+ const mediaDoc = await resolveMediaDocument(item, req);
112
+ if (mediaDoc && matchesFilename(mediaDoc, filename)) {
113
+ return mediaDoc;
114
+ }
115
+ }
116
+ return null;
117
+ }
118
+ /**
119
+ * Checks if a media document matches the given filename
120
+ */ function matchesFilename(mediaDoc, filename) {
121
+ const docFilename = mediaDoc.filename || mediaDoc.name;
122
+ if (!docFilename) {
123
+ return false;
124
+ }
125
+ // Case-insensitive match
126
+ return docFilename.toLowerCase() === filename.toLowerCase();
127
+ }
128
+ /**
129
+ * Formats media document into the expected image data structure
130
+ */ function formatImageData(mediaDoc) {
131
+ return {
132
+ image: {
133
+ name: mediaDoc.filename || mediaDoc.name || 'unknown',
134
+ type: extractFileExtension(mediaDoc.filename || mediaDoc.name || ''),
135
+ mimeType: mediaDoc.mimeType || mediaDoc.mimetype,
136
+ thumbnailURL: mediaDoc.thumbnailURL,
137
+ url: mediaDoc.url
138
+ }
139
+ };
140
+ }
141
+ /**
142
+ * Extracts file extension from filename
143
+ */ function extractFileExtension(filename) {
144
+ const match = filename.match(/\.([^.]+)$/);
145
+ return match ? match[1].toLowerCase() : 'unknown';
146
+ }
147
+
148
+ //# sourceMappingURL=resolveImageReferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/resolveImageReferences.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\ninterface ImageReference {\n fieldName: string\n filename?: string\n fullMatch: string\n}\n\nexport interface ResolvedImage {\n image: {\n mimeType?: string\n name: string\n thumbnailURL?: string\n type: string\n url: string\n }\n}\n\ninterface ResolveImageReferencesResult {\n images: ResolvedImage[]\n processedPrompt: string\n}\n\n/**\n * Parses and resolves image references in prompts.\n * \n * Supports two formats:\n * - @fieldName - for single upload fields\n * - @fieldName:filename.jpg - for specific images in hasMany fields\n * \n * @param prompt - The prompt text containing @field references\n * @param contextData - The document data to resolve field values from\n * @param req - Payload request object for fetching media\n * @returns Processed prompt with references removed and array of resolved images\n */\nexport async function resolveImageReferences(\n prompt: string,\n contextData: Record<string, unknown>,\n req: PayloadRequest,\n): Promise<ResolveImageReferencesResult> {\n // Pattern matches: @fieldName or @fieldName:filename.ext (filename can have spaces)\n // The filename part matches everything up to and including an image extension\n const pattern = /@([\\w.]+)(?::(.+?\\.(?:png|jpe?g|webp|gif)))?/gi\n const references: ImageReference[] = []\n let match: null | RegExpExecArray\n\n // Extract all image references\n while ((match = pattern.exec(prompt)) !== null) {\n references.push({\n fieldName: match[1],\n filename: match[2],\n fullMatch: match[0],\n })\n }\n\n if (references.length === 0) {\n return { images: [], processedPrompt: prompt }\n }\n\n const resolvedImages: ResolvedImage[] = []\n let processedPrompt = prompt\n\n // Resolve each reference\n for (const ref of references) {\n try {\n const fieldValue = contextData[ref.fieldName]\n\n if (!fieldValue) {\n req.payload.logger.warn(\n `Image reference @${ref.fieldName} not found in document context`,\n )\n continue\n }\n\n // Handle single upload field (value is an ID or object)\n if (!ref.filename) {\n const mediaDoc = await resolveMediaDocument(fieldValue, req)\n if (mediaDoc) {\n resolvedImages.push(formatImageData(mediaDoc))\n }\n }\n // Handle hasMany field with filename\n else {\n const mediaDoc = await resolveMediaFromArray(fieldValue, ref.filename, req)\n if (mediaDoc) {\n resolvedImages.push(formatImageData(mediaDoc))\n }\n }\n\n // Remove the reference from the prompt\n processedPrompt = processedPrompt.replace(ref.fullMatch, '')\n } catch (error) {\n req.payload.logger.error(\n error,\n `Error resolving image reference: ${ref.fullMatch}`,\n )\n }\n }\n\n // Clean up extra whitespace from removed references\n processedPrompt = processedPrompt.replace(/\\s+/g, ' ').trim()\n\n return {\n images: resolvedImages,\n processedPrompt,\n }\n}\n\n/**\n * Resolves a single media document from an ID or populated object\n */\nasync function resolveMediaDocument(\n value: unknown,\n req: PayloadRequest,\n): Promise<null | Record<string, unknown>> {\n // If it's already a populated object with required fields\n if (typeof value === 'object' && value !== null && 'url' in value) {\n return value as Record<string, unknown>\n }\n\n // If it's an ID string, fetch the media document\n if (typeof value === 'string' || typeof value === 'number') {\n try {\n // Try to find which collection this media belongs to\n // First, check the common 'media' collection\n const collections = ['media', 'uploads']\n\n for (const collectionSlug of collections) {\n try {\n const mediaDoc = await req.payload.findByID({\n id: value,\n collection: collectionSlug,\n req,\n })\n if (mediaDoc) {\n return mediaDoc as Record<string, unknown>\n }\n } catch (_ignore) {\n // Continue to next collection\n continue\n }\n }\n } catch (error) {\n req.payload.logger.error(error, 'Error fetching media document')\n }\n }\n\n return null\n}\n\n/**\n * Resolves a specific media document from an array by matching filename\n */\nasync function resolveMediaFromArray(\n arrayValue: unknown,\n filename: string,\n req: PayloadRequest,\n): Promise<null | Record<string, unknown>> {\n if (!Array.isArray(arrayValue)) {\n return null\n }\n\n // Search through array for matching filename\n for (const item of arrayValue) {\n const mediaDoc = await resolveMediaDocument(item, req)\n\n if (mediaDoc && matchesFilename(mediaDoc, filename)) {\n return mediaDoc\n }\n }\n\n return null\n}\n\n/**\n * Checks if a media document matches the given filename\n */\nfunction matchesFilename(mediaDoc: Record<string, unknown>, filename: string): boolean {\n const docFilename = mediaDoc.filename || mediaDoc.name\n\n if (!docFilename) {\n return false\n }\n\n // Case-insensitive match\n return (docFilename as string).toLowerCase() === filename.toLowerCase()\n}\n\n/**\n * Formats media document into the expected image data structure\n */\nfunction formatImageData(mediaDoc: Record<string, unknown>): ResolvedImage {\n return {\n image: {\n name: (mediaDoc.filename || mediaDoc.name || 'unknown') as string,\n type: extractFileExtension((mediaDoc.filename || mediaDoc.name || '') as string),\n mimeType: (mediaDoc.mimeType || mediaDoc.mimetype) as string | undefined,\n thumbnailURL: mediaDoc.thumbnailURL as string | undefined,\n url: mediaDoc.url as string,\n },\n }\n}\n\n/**\n * Extracts file extension from filename\n */\nfunction extractFileExtension(filename: string): string {\n const match = filename.match(/\\.([^.]+)$/)\n return match ? match[1].toLowerCase() : 'unknown'\n}\n"],"names":["resolveImageReferences","prompt","contextData","req","pattern","references","match","exec","push","fieldName","filename","fullMatch","length","images","processedPrompt","resolvedImages","ref","fieldValue","payload","logger","warn","mediaDoc","resolveMediaDocument","formatImageData","resolveMediaFromArray","replace","error","trim","value","collections","collectionSlug","findByID","id","collection","_ignore","arrayValue","Array","isArray","item","matchesFilename","docFilename","name","toLowerCase","image","type","extractFileExtension","mimeType","mimetype","thumbnailURL","url"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Field } from 'payload';
2
+ import { z } from 'zod';
3
+ export declare function convertPayloadSchemaToZod(fields: Field[]): z.ZodObject<any>;
@@ -0,0 +1,93 @@
1
+ import { z } from 'zod';
2
+ export function convertPayloadSchemaToZod(fields) {
3
+ const shape = {};
4
+ for (const field of fields){
5
+ if ('name' in field && field.name) {
6
+ // Handle simple fields with names
7
+ switch(field.type){
8
+ case 'array':
9
+ if (field.fields) {
10
+ shape[field.name] = z.array(convertPayloadSchemaToZod(field.fields));
11
+ if (!field.required) {
12
+ shape[field.name] = shape[field.name].optional();
13
+ }
14
+ if (field.admin?.description) {
15
+ shape[field.name] = shape[field.name].describe(field.admin.description);
16
+ }
17
+ }
18
+ break;
19
+ case 'checkbox':
20
+ shape[field.name] = z.boolean();
21
+ if (!field.required) {
22
+ shape[field.name] = shape[field.name].optional();
23
+ }
24
+ if (field.admin?.description) {
25
+ shape[field.name] = shape[field.name].describe(field.admin.description);
26
+ }
27
+ break;
28
+ case 'code':
29
+ case 'email':
30
+ case 'radio':
31
+ case 'select':
32
+ case 'text':
33
+ case 'textarea':
34
+ shape[field.name] = z.string();
35
+ if (field.required) {
36
+ // keep it required
37
+ } else {
38
+ shape[field.name] = shape[field.name].optional();
39
+ }
40
+ // Add description if available
41
+ if (field.admin?.description) {
42
+ shape[field.name] = shape[field.name].describe(field.admin.description);
43
+ }
44
+ break;
45
+ case 'date':
46
+ shape[field.name] = z.string().datetime();
47
+ if (!field.required) {
48
+ shape[field.name] = shape[field.name].optional();
49
+ }
50
+ if (field.admin?.description) {
51
+ shape[field.name] = shape[field.name].describe(field.admin.description);
52
+ }
53
+ break;
54
+ case 'group':
55
+ if (field.fields) {
56
+ shape[field.name] = convertPayloadSchemaToZod(field.fields);
57
+ if (!field.required) {
58
+ shape[field.name] = shape[field.name].optional();
59
+ }
60
+ if (field.admin?.description) {
61
+ shape[field.name] = shape[field.name].describe(field.admin.description);
62
+ }
63
+ }
64
+ break;
65
+ case 'json':
66
+ shape[field.name] = z.any();
67
+ if (field.admin?.description) {
68
+ shape[field.name] = shape[field.name].describe(field.admin.description);
69
+ }
70
+ break;
71
+ case 'number':
72
+ shape[field.name] = z.number();
73
+ if (!field.required) {
74
+ shape[field.name] = shape[field.name].optional();
75
+ }
76
+ if (field.admin?.description) {
77
+ shape[field.name] = shape[field.name].describe(field.admin.description);
78
+ }
79
+ break;
80
+ }
81
+ } else {
82
+ // Handle fields without names (row, collapsible, etc.) that flatten into parent
83
+ if (field.type === 'row' || field.type === 'collapsible') {
84
+ const subSchema = convertPayloadSchemaToZod(field.fields);
85
+ // Merge subSchema shape into current shape
86
+ Object.assign(shape, subSchema.shape);
87
+ }
88
+ }
89
+ }
90
+ return z.object(shape);
91
+ }
92
+
93
+ //# sourceMappingURL=schemaConverter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/schemaConverter.ts"],"sourcesContent":["import type { Field } from 'payload'\n\nimport { z } from 'zod'\n\nexport function convertPayloadSchemaToZod(fields: Field[]): z.ZodObject<any> {\n const shape: Record<string, z.ZodTypeAny> = {}\n\n for (const field of fields) {\n if ('name' in field && field.name) {\n // Handle simple fields with names\n switch (field.type) {\n case 'array':\n if (field.fields) {\n shape[field.name] = z.array(convertPayloadSchemaToZod(field.fields))\n if (!field.required) {\n shape[field.name] = shape[field.name].optional()\n }\n if (field.admin?.description) {\n shape[field.name] = shape[field.name].describe(field.admin.description as string)\n }\n }\n break\n case 'checkbox':\n shape[field.name] = z.boolean()\n if (!field.required) {\n shape[field.name] = shape[field.name].optional()\n }\n if (field.admin?.description) {\n shape[field.name] = shape[field.name].describe(field.admin.description as string)\n }\n break\n case 'code':\n case 'email':\n case 'radio':\n case 'select':\n case 'text':\n case 'textarea':\n shape[field.name] = z.string()\n if (field.required) {\n // keep it required\n } else {\n shape[field.name] = shape[field.name].optional()\n }\n // Add description if available\n if (field.admin?.description) {\n shape[field.name] = shape[field.name].describe(field.admin.description as string)\n }\n break\n case 'date':\n shape[field.name] = z.string().datetime()\n if (!field.required) {\n shape[field.name] = shape[field.name].optional()\n }\n if (field.admin?.description) {\n shape[field.name] = shape[field.name].describe(field.admin.description as string)\n }\n break\n case 'group':\n if (field.fields) {\n shape[field.name] = convertPayloadSchemaToZod(field.fields)\n if (!field.required) {\n shape[field.name] = shape[field.name].optional()\n }\n if (field.admin?.description) {\n shape[field.name] = shape[field.name].describe(field.admin.description as string)\n }\n }\n break\n case 'json':\n shape[field.name] = z.any()\n if (field.admin?.description) {\n shape[field.name] = shape[field.name].describe(field.admin.description as string)\n }\n break\n case 'number':\n shape[field.name] = z.number()\n if (!field.required) {\n shape[field.name] = shape[field.name].optional()\n }\n if (field.admin?.description) {\n shape[field.name] = shape[field.name].describe(field.admin.description as string)\n }\n break\n // Add more types as needed\n }\n } else {\n // Handle fields without names (row, collapsible, etc.) that flatten into parent\n if (field.type === 'row' || field.type === 'collapsible') {\n const subSchema = convertPayloadSchemaToZod(field.fields)\n // Merge subSchema shape into current shape\n Object.assign(shape, subSchema.shape)\n }\n }\n }\n\n return z.object(shape)\n}\n"],"names":["z","convertPayloadSchemaToZod","fields","shape","field","name","type","array","required","optional","admin","description","describe","boolean","string","datetime","any","number","subSchema","Object","assign","object"],"mappings":"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"}
@@ -1,4 +1,2 @@
1
1
  import type { LexicalEditor } from 'lexical';
2
- type EditorAction = 'replace' | 'update';
3
- export declare const setSafeLexicalState: (state: unknown, editorInstance: LexicalEditor, action?: EditorAction) => void;
4
- export {};
2
+ export declare const setSafeLexicalState: (state: unknown, editorInstance: LexicalEditor) => void;
@@ -1,4 +1,4 @@
1
- export const setSafeLexicalState = (state, editorInstance, action = 'replace')=>{
1
+ export const setSafeLexicalState = (state, editorInstance)=>{
2
2
  try {
3
3
  const editorState = editorInstance.parseEditorState(state);
4
4
  if (editorState.isEmpty()) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/setSafeLexicalState.ts"],"sourcesContent":["import type { LexicalEditor } from 'lexical'\n\ntype EditorAction = 'replace' | 'update'\n\nexport const setSafeLexicalState = (\n state: unknown,\n editorInstance: LexicalEditor,\n action: EditorAction = 'replace',\n) => {\n try {\n const editorState = editorInstance.parseEditorState(state as any)\n if (editorState.isEmpty()) {\n return\n }\n\n editorInstance.setEditorState(editorState)\n } catch (error) {\n console.error('Error setting editor state: ', { error, state })\n }\n}\n"],"names":["setSafeLexicalState","state","editorInstance","action","editorState","parseEditorState","isEmpty","setEditorState","error","console"],"mappings":"AAIA,OAAO,MAAMA,sBAAsB,CACjCC,OACAC,gBACAC,SAAuB,SAAS;IAEhC,IAAI;QACF,MAAMC,cAAcF,eAAeG,gBAAgB,CAACJ;QACpD,IAAIG,YAAYE,OAAO,IAAI;YACzB;QACF;QAEAJ,eAAeK,cAAc,CAACH;IAChC,EAAE,OAAOI,OAAO;QACdC,QAAQD,KAAK,CAAC,gCAAgC;YAAEA;YAAOP;QAAM;IAC/D;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/setSafeLexicalState.ts"],"sourcesContent":["import type { LexicalEditor } from 'lexical'\n\ntype EditorAction = 'replace' | 'update'\n\nexport const setSafeLexicalState = (\n state: unknown,\n editorInstance: LexicalEditor,\n // action: EditorAction = 'replace',\n) => {\n try {\n const editorState = editorInstance.parseEditorState(state as any)\n if (editorState.isEmpty()) {\n return\n }\n\n editorInstance.setEditorState(editorState)\n } catch (error) {\n console.error('Error setting editor state: ', { error, state })\n }\n}\n"],"names":["setSafeLexicalState","state","editorInstance","editorState","parseEditorState","isEmpty","setEditorState","error","console"],"mappings":"AAIA,OAAO,MAAMA,sBAAsB,CACjCC,OACAC;IAGA,IAAI;QACF,MAAMC,cAAcD,eAAeE,gBAAgB,CAACH;QACpD,IAAIE,YAAYE,OAAO,IAAI;YACzB;QACF;QAEAH,eAAeI,cAAc,CAACH;IAChC,EAAE,OAAOI,OAAO;QACdC,QAAQD,KAAK,CAAC,gCAAgC;YAAEA;YAAON;QAAM;IAC/D;AACF,EAAC"}