@ai-stack/payloadcms 3.76.0-beta.1 → 3.76.0-beta.2

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 (337) hide show
  1. package/dist/ai/core/generateObject.js +1 -4
  2. package/dist/ai/core/generateObject.js.map +1 -1
  3. package/dist/ai/core/generateText.js +1 -5
  4. package/dist/ai/core/generateText.js.map +1 -1
  5. package/dist/ai/core/media/generateMedia.js +1 -4
  6. package/dist/ai/core/media/generateMedia.js.map +1 -1
  7. package/dist/ai/core/media/image/generateImage.js +4 -14
  8. package/dist/ai/core/media/image/generateImage.js.map +1 -1
  9. package/dist/ai/core/media/image/handlers/multimodal.js +8 -25
  10. package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -1
  11. package/dist/ai/core/media/image/handlers/standard.js +7 -2
  12. package/dist/ai/core/media/image/handlers/standard.js.map +1 -1
  13. package/dist/ai/core/media/speech/generateSpeech.js +2 -3
  14. package/dist/ai/core/media/speech/generateSpeech.js.map +1 -1
  15. package/dist/ai/core/media/types.d.ts +2 -3
  16. package/dist/ai/core/media/types.js.map +1 -1
  17. package/dist/ai/core/streamObject.js +0 -3
  18. package/dist/ai/core/streamObject.js.map +1 -1
  19. package/dist/ai/core/streamText.js +1 -4
  20. package/dist/ai/core/streamText.js.map +1 -1
  21. package/dist/ai/core/types.d.ts +2 -2
  22. package/dist/ai/core/types.js.map +1 -1
  23. package/dist/ai/providers/blocks/anthropic.js +0 -42
  24. package/dist/ai/providers/blocks/anthropic.js.map +1 -1
  25. package/dist/ai/providers/blocks/elevenlabs.js +1 -106
  26. package/dist/ai/providers/blocks/elevenlabs.js.map +1 -1
  27. package/dist/ai/providers/blocks/fal.js +0 -118
  28. package/dist/ai/providers/blocks/fal.js.map +1 -1
  29. package/dist/ai/providers/blocks/google.js +2 -237
  30. package/dist/ai/providers/blocks/google.js.map +1 -1
  31. package/dist/ai/providers/blocks/openai-compatible.js +0 -144
  32. package/dist/ai/providers/blocks/openai-compatible.js.map +1 -1
  33. package/dist/ai/providers/blocks/openai.js +0 -200
  34. package/dist/ai/providers/blocks/openai.js.map +1 -1
  35. package/dist/ai/providers/blocks/xai.js +0 -53
  36. package/dist/ai/providers/blocks/xai.js.map +1 -1
  37. package/dist/ai/providers/index.d.ts +1 -1
  38. package/dist/ai/providers/index.js +0 -2
  39. package/dist/ai/providers/index.js.map +1 -1
  40. package/dist/ai/providers/registry.d.ts +24 -28
  41. package/dist/ai/providers/registry.js +184 -138
  42. package/dist/ai/providers/registry.js.map +1 -1
  43. package/dist/ai/providers/types.d.ts +12 -33
  44. package/dist/ai/providers/types.js +0 -1
  45. package/dist/ai/providers/types.js.map +1 -1
  46. package/dist/ai/schemas/lexicalJsonSchema.js +1 -1
  47. package/dist/ai/schemas/lexicalJsonSchema.js.map +1 -1
  48. package/dist/ai/utilities/filterEditorSchemaByNodes.js.map +1 -0
  49. package/dist/ai/utilities/generateFileNameByPrompt.js.map +1 -0
  50. package/dist/ai/utilities/isObjectSchema.js.map +1 -0
  51. package/dist/ai/utilities/nodeToSchemaMap.js.map +1 -0
  52. package/dist/ai/{prompts.d.ts → utilities/prompts.d.ts} +1 -1
  53. package/dist/ai/utilities/prompts.js.map +1 -0
  54. package/dist/ai/utilities/systemGenerate.js.map +1 -0
  55. package/dist/collections/AIJobs.js +3 -12
  56. package/dist/collections/AIJobs.js.map +1 -1
  57. package/dist/collections/AIProviders.js +47 -20
  58. package/dist/collections/AIProviders.js.map +1 -1
  59. package/dist/collections/Instructions.js +86 -54
  60. package/dist/collections/Instructions.js.map +1 -1
  61. package/dist/collections/shared.d.ts +30 -0
  62. package/dist/collections/shared.js +15 -0
  63. package/dist/collections/shared.js.map +1 -0
  64. package/dist/endpoints/fetchFields.js +14 -6
  65. package/dist/endpoints/fetchFields.js.map +1 -1
  66. package/dist/endpoints/fetchVoices.js +1 -1
  67. package/dist/endpoints/fetchVoices.js.map +1 -1
  68. package/dist/endpoints/generate.d.ts +7 -0
  69. package/dist/endpoints/generate.js +268 -0
  70. package/dist/endpoints/generate.js.map +1 -0
  71. package/dist/endpoints/index.js +9 -639
  72. package/dist/endpoints/index.js.map +1 -1
  73. package/dist/endpoints/promptMentions.d.ts +2 -0
  74. package/dist/endpoints/promptMentions.js +166 -0
  75. package/dist/endpoints/promptMentions.js.map +1 -0
  76. package/dist/endpoints/upload.d.ts +7 -0
  77. package/dist/endpoints/upload.js +294 -0
  78. package/dist/endpoints/upload.js.map +1 -0
  79. package/dist/endpoints/videogenWebhook.d.ts +7 -0
  80. package/dist/endpoints/videogenWebhook.js +132 -0
  81. package/dist/endpoints/videogenWebhook.js.map +1 -0
  82. package/dist/exports/client.d.ts +2 -1
  83. package/dist/exports/client.js +2 -1
  84. package/dist/exports/client.js.map +1 -1
  85. package/dist/exports/fields.d.ts +2 -1
  86. package/dist/exports/fields.js +2 -1
  87. package/dist/exports/fields.js.map +1 -1
  88. package/dist/fields/ArrayComposeField/ArrayComposeField.js +1 -1
  89. package/dist/fields/ArrayComposeField/ArrayComposeField.js.map +1 -1
  90. package/dist/fields/ArrayComposeField/ArrayComposeField.jsx +1 -1
  91. package/dist/fields/ComposeField/ComposeField.d.ts +1 -0
  92. package/dist/fields/ComposeField/ComposeField.js +18 -8
  93. package/dist/fields/ComposeField/ComposeField.js.map +1 -1
  94. package/dist/fields/ComposeField/ComposeField.jsx +12 -7
  95. package/dist/fields/PromptEditorField/feature.client.d.ts +1 -0
  96. package/dist/fields/PromptEditorField/feature.client.js +173 -0
  97. package/dist/fields/PromptEditorField/feature.client.js.map +1 -0
  98. package/dist/fields/PromptEditorField/feature.client.jsx +148 -0
  99. package/dist/fields/PromptEditorField/feature.server.d.ts +1 -0
  100. package/dist/fields/PromptEditorField/feature.server.js +30 -0
  101. package/dist/fields/PromptEditorField/feature.server.js.map +1 -0
  102. package/dist/fields/PromptField.d.ts +4 -0
  103. package/dist/fields/PromptField.js +18 -0
  104. package/dist/fields/PromptField.js.map +1 -0
  105. package/dist/fields/SelectField/SelectField.js +0 -1
  106. package/dist/fields/SelectField/SelectField.js.map +1 -1
  107. package/dist/fields/SelectField/SelectField.jsx +0 -1
  108. package/dist/index.d.ts +4 -3
  109. package/dist/index.js +4 -2
  110. package/dist/index.js.map +1 -1
  111. package/dist/libraries/handlebars/helpers.js +2 -2
  112. package/dist/libraries/handlebars/helpers.js.map +1 -1
  113. package/dist/libraries/handlebars/replacePlaceholders.js +5 -1
  114. package/dist/libraries/handlebars/replacePlaceholders.js.map +1 -1
  115. package/dist/payload-ai.d.ts +5 -19
  116. package/dist/plugin.js +17 -20
  117. package/dist/plugin.js.map +1 -1
  118. package/dist/providers/FieldProvider/FieldProvider.js +10 -19
  119. package/dist/providers/FieldProvider/FieldProvider.js.map +1 -1
  120. package/dist/providers/FieldProvider/FieldProvider.jsx +7 -17
  121. package/dist/providers/InstructionsProvider/InstructionsProvider.js +4 -1
  122. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  123. package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +3 -0
  124. package/dist/translations/de.json +47 -0
  125. package/dist/translations/en.json +45 -2
  126. package/dist/translations/es.json +45 -2
  127. package/dist/translations/fa.json +45 -2
  128. package/dist/translations/fr.json +46 -3
  129. package/dist/translations/hi.json +47 -0
  130. package/dist/translations/index.d.ts +88 -26
  131. package/dist/translations/index.js +18 -32
  132. package/dist/translations/index.js.map +1 -1
  133. package/dist/translations/ja.json +47 -0
  134. package/dist/translations/nb.json +47 -0
  135. package/dist/translations/nl.json +47 -0
  136. package/dist/translations/pl.json +45 -2
  137. package/dist/translations/pt.json +47 -0
  138. package/dist/translations/ru.json +45 -2
  139. package/dist/translations/th.json +47 -0
  140. package/dist/translations/translation-schema.json +184 -11
  141. package/dist/translations/uk.json +45 -2
  142. package/dist/translations/zh.json +47 -0
  143. package/dist/types.d.ts +54 -28
  144. package/dist/types.js.map +1 -1
  145. package/dist/ui/Compose/Compose.js +42 -79
  146. package/dist/ui/Compose/Compose.js.map +1 -1
  147. package/dist/ui/Compose/Compose.jsx +32 -86
  148. package/dist/ui/Compose/ComposePlaceholder.js +1 -1
  149. package/dist/ui/Compose/ComposePlaceholder.js.map +1 -1
  150. package/dist/ui/Compose/ComposePlaceholder.jsx +1 -1
  151. package/dist/ui/Compose/{compose.module.css → compose.module.scss} +3 -5
  152. package/dist/ui/Compose/hooks/menu/Item.d.ts +1 -1
  153. package/dist/ui/Compose/hooks/menu/Item.js +7 -3
  154. package/dist/ui/Compose/hooks/menu/Item.js.map +1 -1
  155. package/dist/ui/Compose/hooks/menu/Item.jsx +11 -5
  156. package/dist/ui/Compose/hooks/menu/TranslateMenu.js +3 -1
  157. package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -1
  158. package/dist/ui/Compose/hooks/menu/TranslateMenu.jsx +3 -1
  159. package/dist/ui/Compose/hooks/menu/items.d.ts +8 -8
  160. package/dist/ui/Compose/hooks/menu/itemsMap.d.ts +2 -1
  161. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
  162. package/dist/ui/Compose/hooks/menu/types.d.ts +21 -0
  163. package/dist/ui/Compose/hooks/menu/types.js +3 -0
  164. package/dist/ui/Compose/hooks/menu/types.js.map +1 -0
  165. package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -2
  166. package/dist/ui/Compose/hooks/menu/useMenu.js +45 -23
  167. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  168. package/dist/ui/Compose/hooks/menu/useMenu.jsx +43 -23
  169. package/dist/ui/Compose/hooks/mergeGeneratedValue.d.ts +14 -0
  170. package/dist/ui/Compose/hooks/mergeGeneratedValue.js +38 -0
  171. package/dist/ui/Compose/hooks/mergeGeneratedValue.js.map +1 -0
  172. package/dist/ui/Compose/hooks/useGenerate.js +37 -12
  173. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
  174. package/dist/ui/Compose/hooks/useGenerateUpload.js +66 -24
  175. package/dist/ui/Compose/hooks/useGenerateUpload.js.map +1 -1
  176. package/dist/ui/Compose/hooks/useStreamingUpdate.js +4 -4
  177. package/dist/ui/Compose/hooks/useStreamingUpdate.js.map +1 -1
  178. package/dist/ui/ConfigDashboard/configDashboard.module.css +94 -0
  179. package/dist/ui/ConfigDashboard/index.js +27 -92
  180. package/dist/ui/ConfigDashboard/index.js.map +1 -1
  181. package/dist/ui/ConfigDashboard/index.jsx +24 -77
  182. package/dist/ui/DynamicModelSelect/index.js +6 -27
  183. package/dist/ui/DynamicModelSelect/index.js.map +1 -1
  184. package/dist/ui/DynamicModelSelect/index.jsx +6 -29
  185. package/dist/ui/DynamicProviderSelect/index.js +6 -27
  186. package/dist/ui/DynamicProviderSelect/index.js.map +1 -1
  187. package/dist/ui/DynamicProviderSelect/index.jsx +6 -29
  188. package/dist/ui/DynamicVoiceSelect/index.js +34 -83
  189. package/dist/ui/DynamicVoiceSelect/index.js.map +1 -1
  190. package/dist/ui/DynamicVoiceSelect/index.jsx +16 -53
  191. package/dist/ui/GlobalProviderOptions/index.d.ts +2 -0
  192. package/dist/ui/GlobalProviderOptions/index.js +118 -0
  193. package/dist/ui/GlobalProviderOptions/index.js.map +1 -0
  194. package/dist/ui/GlobalProviderOptions/index.jsx +60 -0
  195. package/dist/ui/Icons/Icons.js +1 -1
  196. package/dist/ui/Icons/Icons.js.map +1 -1
  197. package/dist/ui/Icons/Icons.jsx +1 -1
  198. package/dist/ui/Icons/LottieAnimation.js +1 -1
  199. package/dist/ui/Icons/LottieAnimation.js.map +1 -1
  200. package/dist/ui/Icons/LottieAnimation.jsx +1 -1
  201. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.d.ts +12 -0
  202. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.js +166 -0
  203. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.js.map +1 -0
  204. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.jsx +83 -0
  205. package/dist/ui/InstructionProviderOptions/index.d.ts +2 -0
  206. package/dist/ui/InstructionProviderOptions/index.js +157 -0
  207. package/dist/ui/InstructionProviderOptions/index.js.map +1 -0
  208. package/dist/ui/InstructionProviderOptions/index.jsx +92 -0
  209. package/dist/ui/VoicesFetcher/index.js.map +1 -1
  210. package/dist/ui/hooks/useAISettings.d.ts +26 -0
  211. package/dist/ui/hooks/useAISettings.js +73 -0
  212. package/dist/ui/hooks/useAISettings.js.map +1 -0
  213. package/dist/ui/providerOptions/updateProviderOptionsValue.d.ts +6 -0
  214. package/dist/ui/providerOptions/updateProviderOptionsValue.js +50 -0
  215. package/dist/ui/providerOptions/updateProviderOptionsValue.js.map +1 -0
  216. package/dist/ui/shared/handleSelectChange.d.ts +5 -0
  217. package/dist/ui/shared/handleSelectChange.js +12 -0
  218. package/dist/ui/shared/handleSelectChange.js.map +1 -0
  219. package/dist/ui/shared/types.d.ts +11 -0
  220. package/dist/ui/shared/types.js +5 -0
  221. package/dist/ui/shared/types.js.map +1 -0
  222. package/dist/utilities/ai/resolveEffectiveInstructionSettings.d.ts +15 -0
  223. package/dist/utilities/ai/resolveEffectiveInstructionSettings.js +136 -0
  224. package/dist/utilities/ai/resolveEffectiveInstructionSettings.js.map +1 -0
  225. package/dist/{endpoints → utilities}/buildPromptUtils.js +14 -5
  226. package/dist/utilities/buildPromptUtils.js.map +1 -0
  227. package/dist/utilities/buildSmartPrompt.js +3 -3
  228. package/dist/utilities/buildSmartPrompt.js.map +1 -1
  229. package/dist/utilities/fields/fieldToJsonSchema.js.map +1 -0
  230. package/dist/utilities/fields/getFieldBySchemaPath.js.map +1 -0
  231. package/dist/utilities/fields/getFieldInfo.js.map +1 -0
  232. package/dist/utilities/{updateFieldsConfig.js → fields/updateFieldsConfig.js} +7 -2
  233. package/dist/utilities/fields/updateFieldsConfig.js.map +1 -0
  234. package/dist/utilities/images/extractImageData.js.map +1 -0
  235. package/dist/utilities/images/extractPromptAttachments.js.map +1 -0
  236. package/dist/utilities/{fetchImages.d.ts → images/fetchImages.d.ts} +1 -1
  237. package/dist/utilities/images/fetchImages.js +49 -0
  238. package/dist/utilities/images/fetchImages.js.map +1 -0
  239. package/dist/utilities/images/resolveImageReferences.js +183 -0
  240. package/dist/utilities/images/resolveImageReferences.js.map +1 -0
  241. package/dist/utilities/init/autoSetupProviders.d.ts +3 -0
  242. package/dist/utilities/init/autoSetupProviders.js +216 -0
  243. package/dist/utilities/init/autoSetupProviders.js.map +1 -0
  244. package/dist/utilities/lexical/editorSchemaValidator.js.map +1 -0
  245. package/dist/utilities/lexical/lexicalToHTML.js.map +1 -0
  246. package/dist/utilities/lexical/lexicalToPromptTemplate.d.ts +2 -0
  247. package/dist/utilities/lexical/lexicalToPromptTemplate.js +50 -0
  248. package/dist/utilities/lexical/lexicalToPromptTemplate.js.map +1 -0
  249. package/dist/utilities/lexical/setSafeLexicalState.js.map +1 -0
  250. package/dist/utilities/lexical/stringToLexicalJSON.d.ts +2 -0
  251. package/dist/utilities/lexical/stringToLexicalJSON.js +39 -0
  252. package/dist/utilities/lexical/stringToLexicalJSON.js.map +1 -0
  253. package/dist/utilities/sanitizeLog.d.ts +1 -0
  254. package/dist/utilities/sanitizeLog.js +39 -0
  255. package/dist/utilities/sanitizeLog.js.map +1 -0
  256. package/dist/utilities/seedProperties.js +37 -22
  257. package/dist/utilities/seedProperties.js.map +1 -1
  258. package/package.json +5 -2
  259. package/dist/ai/analyse.d.ts +0 -1
  260. package/dist/ai/analyse.js +0 -3
  261. package/dist/ai/analyse.js.map +0 -1
  262. package/dist/ai/index.d.ts +0 -11
  263. package/dist/ai/index.js +0 -25
  264. package/dist/ai/index.js.map +0 -1
  265. package/dist/ai/prompts.js.map +0 -1
  266. package/dist/ai/utils/filterEditorSchemaByNodes.js.map +0 -1
  267. package/dist/ai/utils/generateFileNameByPrompt.js.map +0 -1
  268. package/dist/ai/utils/isObjectSchema.js.map +0 -1
  269. package/dist/ai/utils/nodeToSchemaMap.js.map +0 -1
  270. package/dist/ai/utils/systemGenerate.js.map +0 -1
  271. package/dist/endpoints/buildPromptUtils.js.map +0 -1
  272. package/dist/endpoints/chat.d.ts +0 -4
  273. package/dist/fields/PromptEditorField/PromptEditorField.d.ts +0 -3
  274. package/dist/fields/PromptEditorField/PromptEditorField.js +0 -217
  275. package/dist/fields/PromptEditorField/PromptEditorField.js.map +0 -1
  276. package/dist/fields/PromptEditorField/PromptEditorField.jsx +0 -160
  277. package/dist/ui/AIConfigDashboard/index.d.ts +0 -2
  278. package/dist/ui/AIConfigDashboard/index.js +0 -224
  279. package/dist/ui/AIConfigDashboard/index.js.map +0 -1
  280. package/dist/ui/AIConfigDashboard/index.jsx +0 -175
  281. package/dist/ui/ProviderOptionsEditor/index.d.ts +0 -7
  282. package/dist/ui/ProviderOptionsEditor/index.js +0 -291
  283. package/dist/ui/ProviderOptionsEditor/index.js.map +0 -1
  284. package/dist/ui/ProviderOptionsEditor/index.jsx +0 -210
  285. package/dist/utilities/editorSchemaValidator.js.map +0 -1
  286. package/dist/utilities/extractImageData.js.map +0 -1
  287. package/dist/utilities/extractPromptAttachments.js.map +0 -1
  288. package/dist/utilities/fetchImages.js +0 -38
  289. package/dist/utilities/fetchImages.js.map +0 -1
  290. package/dist/utilities/fieldToJsonSchema.js.map +0 -1
  291. package/dist/utilities/getFieldBySchemaPath.js.map +0 -1
  292. package/dist/utilities/getFieldInfo.js.map +0 -1
  293. package/dist/utilities/getProviderOptionsFields.d.ts +0 -16
  294. package/dist/utilities/getProviderOptionsFields.js +0 -80
  295. package/dist/utilities/getProviderOptionsFields.js.map +0 -1
  296. package/dist/utilities/isPluginActivated.d.ts +0 -2
  297. package/dist/utilities/isPluginActivated.js +0 -5
  298. package/dist/utilities/isPluginActivated.js.map +0 -1
  299. package/dist/utilities/lexicalToHTML.js.map +0 -1
  300. package/dist/utilities/resolveImageReferences.js +0 -167
  301. package/dist/utilities/resolveImageReferences.js.map +0 -1
  302. package/dist/utilities/schemaConverter.d.ts +0 -3
  303. package/dist/utilities/schemaConverter.js +0 -93
  304. package/dist/utilities/schemaConverter.js.map +0 -1
  305. package/dist/utilities/setSafeLexicalState.js.map +0 -1
  306. package/dist/utilities/updateFieldsConfig.js.map +0 -1
  307. /package/dist/ai/{utils → utilities}/filterEditorSchemaByNodes.d.ts +0 -0
  308. /package/dist/ai/{utils → utilities}/filterEditorSchemaByNodes.js +0 -0
  309. /package/dist/ai/{utils → utilities}/generateFileNameByPrompt.d.ts +0 -0
  310. /package/dist/ai/{utils → utilities}/generateFileNameByPrompt.js +0 -0
  311. /package/dist/ai/{utils → utilities}/isObjectSchema.d.ts +0 -0
  312. /package/dist/ai/{utils → utilities}/isObjectSchema.js +0 -0
  313. /package/dist/ai/{utils → utilities}/nodeToSchemaMap.d.ts +0 -0
  314. /package/dist/ai/{utils → utilities}/nodeToSchemaMap.js +0 -0
  315. /package/dist/ai/{prompts.js → utilities/prompts.js} +0 -0
  316. /package/dist/ai/{utils → utilities}/systemGenerate.d.ts +0 -0
  317. /package/dist/ai/{utils → utilities}/systemGenerate.js +0 -0
  318. /package/dist/ui/Icons/{icons.module.css → icons.module.scss} +0 -0
  319. /package/dist/{endpoints → utilities}/buildPromptUtils.d.ts +0 -0
  320. /package/dist/utilities/{fieldToJsonSchema.d.ts → fields/fieldToJsonSchema.d.ts} +0 -0
  321. /package/dist/utilities/{fieldToJsonSchema.js → fields/fieldToJsonSchema.js} +0 -0
  322. /package/dist/utilities/{getFieldBySchemaPath.d.ts → fields/getFieldBySchemaPath.d.ts} +0 -0
  323. /package/dist/utilities/{getFieldBySchemaPath.js → fields/getFieldBySchemaPath.js} +0 -0
  324. /package/dist/utilities/{getFieldInfo.d.ts → fields/getFieldInfo.d.ts} +0 -0
  325. /package/dist/utilities/{getFieldInfo.js → fields/getFieldInfo.js} +0 -0
  326. /package/dist/utilities/{updateFieldsConfig.d.ts → fields/updateFieldsConfig.d.ts} +0 -0
  327. /package/dist/utilities/{extractImageData.d.ts → images/extractImageData.d.ts} +0 -0
  328. /package/dist/utilities/{extractImageData.js → images/extractImageData.js} +0 -0
  329. /package/dist/utilities/{extractPromptAttachments.d.ts → images/extractPromptAttachments.d.ts} +0 -0
  330. /package/dist/utilities/{extractPromptAttachments.js → images/extractPromptAttachments.js} +0 -0
  331. /package/dist/utilities/{resolveImageReferences.d.ts → images/resolveImageReferences.d.ts} +0 -0
  332. /package/dist/utilities/{editorSchemaValidator.d.ts → lexical/editorSchemaValidator.d.ts} +0 -0
  333. /package/dist/utilities/{editorSchemaValidator.js → lexical/editorSchemaValidator.js} +0 -0
  334. /package/dist/utilities/{lexicalToHTML.d.ts → lexical/lexicalToHTML.d.ts} +0 -0
  335. /package/dist/utilities/{lexicalToHTML.js → lexical/lexicalToHTML.js} +0 -0
  336. /package/dist/utilities/{setSafeLexicalState.d.ts → lexical/setSafeLexicalState.d.ts} +0 -0
  337. /package/dist/utilities/{setSafeLexicalState.js → lexical/setSafeLexicalState.js} +0 -0
@@ -0,0 +1,73 @@
1
+ 'use client';
2
+ import { useEffect, useState } from 'react';
3
+ /**
4
+ * Cached AI settings per depth.
5
+ * We still cache to avoid duplicate requests during a single render/mount cycle,
6
+ * but we always revalidate on mount so changes made in AI Providers appear in Instructions.
7
+ */ const cachedDataByDepth = new Map();
8
+ const fetchPromiseByDepth = new Map();
9
+ /**
10
+ * Shared hook for fetching AI settings from `/api/globals/ai-providers`.
11
+ *
12
+ * Features:
13
+ * - Module-level cache to prevent redundant fetches across components
14
+ * - Deduplicates in-flight requests (if 3 components mount at once, only 1 fetch fires)
15
+ * - Optional `depth` parameter for controlling response depth
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * const { data, isLoading } = useAISettings()
20
+ * const providers = data?.providers ?? []
21
+ * ```
22
+ */ export function useAISettings(options) {
23
+ const depth = options?.depth ?? 1;
24
+ const initialCached = cachedDataByDepth.get(depth) ?? null;
25
+ const [data, setData] = useState(initialCached);
26
+ const [isLoading, setIsLoading] = useState(!initialCached);
27
+ useEffect(()=>{
28
+ const cached = cachedDataByDepth.get(depth) ?? null;
29
+ if (cached) {
30
+ setData(cached);
31
+ setIsLoading(false);
32
+ } else {
33
+ setIsLoading(true);
34
+ }
35
+ // Deduplicate in-flight requests per depth and always revalidate on mount.
36
+ let fetchPromise = fetchPromiseByDepth.get(depth) ?? null;
37
+ if (!fetchPromise) {
38
+ fetchPromise = fetch(`/api/globals/ai-providers?depth=${depth}`, {
39
+ cache: 'no-store',
40
+ credentials: 'include'
41
+ }).then(async (res)=>{
42
+ if (res.ok) {
43
+ const json = await res.json();
44
+ cachedDataByDepth.set(depth, json);
45
+ return json;
46
+ }
47
+ return null;
48
+ }).catch(()=>null).finally(()=>{
49
+ fetchPromiseByDepth.delete(depth);
50
+ });
51
+ fetchPromiseByDepth.set(depth, fetchPromise);
52
+ }
53
+ void fetchPromise.then((result)=>{
54
+ setData(result);
55
+ setIsLoading(false);
56
+ });
57
+ }, [
58
+ depth
59
+ ]);
60
+ return {
61
+ data,
62
+ isLoading
63
+ };
64
+ }
65
+ /**
66
+ * Invalidate the cached AI settings, forcing the next `useAISettings` call to re-fetch.
67
+ * Useful after saving settings.
68
+ */ export function invalidateAISettings() {
69
+ cachedDataByDepth.clear();
70
+ fetchPromiseByDepth.clear();
71
+ }
72
+
73
+ //# sourceMappingURL=useAISettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/ui/hooks/useAISettings.ts"],"sourcesContent":["'use client'\n\nimport type { AISettingsData } from '../../ai/providers/types.js'\n\nimport { useEffect, useState } from 'react'\n\n/**\n * Cached AI settings per depth.\n * We still cache to avoid duplicate requests during a single render/mount cycle,\n * but we always revalidate on mount so changes made in AI Providers appear in Instructions.\n */\nconst cachedDataByDepth = new Map<number, AISettingsData | null>()\nconst fetchPromiseByDepth = new Map<number, Promise<AISettingsData | null>>()\n\n/**\n * Shared hook for fetching AI settings from `/api/globals/ai-providers`.\n *\n * Features:\n * - Module-level cache to prevent redundant fetches across components\n * - Deduplicates in-flight requests (if 3 components mount at once, only 1 fetch fires)\n * - Optional `depth` parameter for controlling response depth\n *\n * @example\n * ```ts\n * const { data, isLoading } = useAISettings()\n * const providers = data?.providers ?? []\n * ```\n */\nexport function useAISettings(options?: { depth?: number }) {\n const depth = options?.depth ?? 1\n const initialCached = cachedDataByDepth.get(depth) ?? null\n const [data, setData] = useState<AISettingsData | null>(initialCached)\n const [isLoading, setIsLoading] = useState(!initialCached)\n\n useEffect(() => {\n const cached = cachedDataByDepth.get(depth) ?? null\n if (cached) {\n setData(cached)\n setIsLoading(false)\n } else {\n setIsLoading(true)\n }\n\n // Deduplicate in-flight requests per depth and always revalidate on mount.\n let fetchPromise = fetchPromiseByDepth.get(depth) ?? null\n if (!fetchPromise) {\n fetchPromise = fetch(`/api/globals/ai-providers?depth=${depth}`, {\n cache: 'no-store',\n credentials: 'include',\n })\n .then(async (res) => {\n if (res.ok) {\n const json = await res.json()\n cachedDataByDepth.set(depth, json as AISettingsData)\n return json as AISettingsData\n }\n return null\n })\n .catch(() => null)\n .finally(() => {\n fetchPromiseByDepth.delete(depth)\n })\n\n fetchPromiseByDepth.set(depth, fetchPromise)\n }\n\n void fetchPromise.then((result) => {\n setData(result)\n setIsLoading(false)\n })\n }, [depth])\n\n return { data, isLoading }\n}\n\n/**\n * Invalidate the cached AI settings, forcing the next `useAISettings` call to re-fetch.\n * Useful after saving settings.\n */\nexport function invalidateAISettings(): void {\n cachedDataByDepth.clear()\n fetchPromiseByDepth.clear()\n}\n"],"names":["useEffect","useState","cachedDataByDepth","Map","fetchPromiseByDepth","useAISettings","options","depth","initialCached","get","data","setData","isLoading","setIsLoading","cached","fetchPromise","fetch","cache","credentials","then","res","ok","json","set","catch","finally","delete","result","invalidateAISettings","clear"],"mappings":"AAAA;AAIA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAE3C;;;;CAIC,GACD,MAAMC,oBAAoB,IAAIC;AAC9B,MAAMC,sBAAsB,IAAID;AAEhC;;;;;;;;;;;;;CAaC,GACD,OAAO,SAASE,cAAcC,OAA4B;IACxD,MAAMC,QAAQD,SAASC,SAAS;IAChC,MAAMC,gBAAgBN,kBAAkBO,GAAG,CAACF,UAAU;IACtD,MAAM,CAACG,MAAMC,QAAQ,GAAGV,SAAgCO;IACxD,MAAM,CAACI,WAAWC,aAAa,GAAGZ,SAAS,CAACO;IAE5CR,UAAU;QACR,MAAMc,SAASZ,kBAAkBO,GAAG,CAACF,UAAU;QAC/C,IAAIO,QAAQ;YACVH,QAAQG;YACRD,aAAa;QACf,OAAO;YACLA,aAAa;QACf;QAEA,2EAA2E;QAC3E,IAAIE,eAAeX,oBAAoBK,GAAG,CAACF,UAAU;QACrD,IAAI,CAACQ,cAAc;YACjBA,eAAeC,MAAM,CAAC,gCAAgC,EAAET,MAAM,CAAC,EAAE;gBAC/DU,OAAO;gBACPC,aAAa;YACf,GACGC,IAAI,CAAC,OAAOC;gBACX,IAAIA,IAAIC,EAAE,EAAE;oBACV,MAAMC,OAAO,MAAMF,IAAIE,IAAI;oBAC3BpB,kBAAkBqB,GAAG,CAAChB,OAAOe;oBAC7B,OAAOA;gBACT;gBACA,OAAO;YACT,GACCE,KAAK,CAAC,IAAM,MACZC,OAAO,CAAC;gBACPrB,oBAAoBsB,MAAM,CAACnB;YAC7B;YAEFH,oBAAoBmB,GAAG,CAAChB,OAAOQ;QACjC;QAEA,KAAKA,aAAaI,IAAI,CAAC,CAACQ;YACtBhB,QAAQgB;YACRd,aAAa;QACf;IACF,GAAG;QAACN;KAAM;IAEV,OAAO;QAAEG;QAAME;IAAU;AAC3B;AAEA;;;CAGC,GACD,OAAO,SAASgB;IACd1B,kBAAkB2B,KAAK;IACvBzB,oBAAoByB,KAAK;AAC3B"}
@@ -0,0 +1,6 @@
1
+ export declare function updateProviderOptionsValue({ currentValue, keyPath, provider, targetValue, }: {
2
+ currentValue: unknown;
3
+ keyPath: string[];
4
+ provider?: string;
5
+ targetValue: unknown;
6
+ }): Record<string, unknown> | null;
@@ -0,0 +1,50 @@
1
+ function isRecord(value) {
2
+ return !!value && typeof value === 'object' && !Array.isArray(value);
3
+ }
4
+ function cloneRecord(value) {
5
+ if (!isRecord(value)) {
6
+ return {};
7
+ }
8
+ return JSON.parse(JSON.stringify(value));
9
+ }
10
+ function pruneEmptyObjects(node) {
11
+ for (const [key, value] of Object.entries(node)){
12
+ if (!isRecord(value)) {
13
+ continue;
14
+ }
15
+ pruneEmptyObjects(value);
16
+ if (Object.keys(value).length === 0) {
17
+ delete node[key];
18
+ }
19
+ }
20
+ }
21
+ export function updateProviderOptionsValue({ currentValue, keyPath, provider, targetValue }) {
22
+ if (!provider || keyPath.length === 0) {
23
+ return isRecord(currentValue) ? cloneRecord(currentValue) : null;
24
+ }
25
+ const nextProviderOptions = cloneRecord(currentValue);
26
+ const currentProviderOptions = isRecord(nextProviderOptions[provider]) ? cloneRecord(nextProviderOptions[provider]) : {};
27
+ let targetNode = currentProviderOptions;
28
+ for(let i = 0; i < keyPath.length - 1; i++){
29
+ const segment = keyPath[i];
30
+ if (!isRecord(targetNode[segment])) {
31
+ targetNode[segment] = {};
32
+ }
33
+ targetNode = targetNode[segment];
34
+ }
35
+ const finalKey = keyPath[keyPath.length - 1];
36
+ if (targetValue === undefined) {
37
+ delete targetNode[finalKey];
38
+ } else {
39
+ targetNode[finalKey] = targetValue;
40
+ }
41
+ pruneEmptyObjects(currentProviderOptions);
42
+ if (Object.keys(currentProviderOptions).length === 0) {
43
+ delete nextProviderOptions[provider];
44
+ } else {
45
+ nextProviderOptions[provider] = currentProviderOptions;
46
+ }
47
+ return Object.keys(nextProviderOptions).length > 0 ? nextProviderOptions : null;
48
+ }
49
+
50
+ //# sourceMappingURL=updateProviderOptionsValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/ui/providerOptions/updateProviderOptionsValue.ts"],"sourcesContent":["function isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction cloneRecord(value: unknown): Record<string, unknown> {\n if (!isRecord(value)) {\n return {}\n }\n\n return JSON.parse(JSON.stringify(value)) as Record<string, unknown>\n}\n\nfunction pruneEmptyObjects(node: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(node)) {\n if (!isRecord(value)) {\n continue\n }\n\n pruneEmptyObjects(value)\n if (Object.keys(value).length === 0) {\n delete node[key]\n }\n }\n}\n\nexport function updateProviderOptionsValue({\n currentValue,\n keyPath,\n provider,\n targetValue,\n}: {\n currentValue: unknown\n keyPath: string[]\n provider?: string\n targetValue: unknown\n}): Record<string, unknown> | null {\n if (!provider || keyPath.length === 0) {\n return isRecord(currentValue) ? cloneRecord(currentValue) : null\n }\n\n const nextProviderOptions = cloneRecord(currentValue)\n const currentProviderOptions = isRecord(nextProviderOptions[provider])\n ? cloneRecord(nextProviderOptions[provider])\n : {}\n\n let targetNode = currentProviderOptions\n for (let i = 0; i < keyPath.length - 1; i++) {\n const segment = keyPath[i]\n if (!isRecord(targetNode[segment])) {\n targetNode[segment] = {}\n }\n targetNode = targetNode[segment] as Record<string, unknown>\n }\n\n const finalKey = keyPath[keyPath.length - 1]\n if (targetValue === undefined) {\n delete targetNode[finalKey]\n } else {\n targetNode[finalKey] = targetValue\n }\n\n pruneEmptyObjects(currentProviderOptions)\n\n if (Object.keys(currentProviderOptions).length === 0) {\n delete nextProviderOptions[provider]\n } else {\n nextProviderOptions[provider] = currentProviderOptions\n }\n\n return Object.keys(nextProviderOptions).length > 0 ? nextProviderOptions : null\n}\n"],"names":["isRecord","value","Array","isArray","cloneRecord","JSON","parse","stringify","pruneEmptyObjects","node","key","Object","entries","keys","length","updateProviderOptionsValue","currentValue","keyPath","provider","targetValue","nextProviderOptions","currentProviderOptions","targetNode","i","segment","finalKey","undefined"],"mappings":"AAAA,SAASA,SAASC,KAAc;IAC9B,OAAO,CAAC,CAACA,SAAS,OAAOA,UAAU,YAAY,CAACC,MAAMC,OAAO,CAACF;AAChE;AAEA,SAASG,YAAYH,KAAc;IACjC,IAAI,CAACD,SAASC,QAAQ;QACpB,OAAO,CAAC;IACV;IAEA,OAAOI,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACN;AACnC;AAEA,SAASO,kBAAkBC,IAA6B;IACtD,KAAK,MAAM,CAACC,KAAKT,MAAM,IAAIU,OAAOC,OAAO,CAACH,MAAO;QAC/C,IAAI,CAACT,SAASC,QAAQ;YACpB;QACF;QAEAO,kBAAkBP;QAClB,IAAIU,OAAOE,IAAI,CAACZ,OAAOa,MAAM,KAAK,GAAG;YACnC,OAAOL,IAAI,CAACC,IAAI;QAClB;IACF;AACF;AAEA,OAAO,SAASK,2BAA2B,EACzCC,YAAY,EACZC,OAAO,EACPC,QAAQ,EACRC,WAAW,EAMZ;IACC,IAAI,CAACD,YAAYD,QAAQH,MAAM,KAAK,GAAG;QACrC,OAAOd,SAASgB,gBAAgBZ,YAAYY,gBAAgB;IAC9D;IAEA,MAAMI,sBAAsBhB,YAAYY;IACxC,MAAMK,yBAAyBrB,SAASoB,mBAAmB,CAACF,SAAS,IACjEd,YAAYgB,mBAAmB,CAACF,SAAS,IACzC,CAAC;IAEL,IAAII,aAAaD;IACjB,IAAK,IAAIE,IAAI,GAAGA,IAAIN,QAAQH,MAAM,GAAG,GAAGS,IAAK;QAC3C,MAAMC,UAAUP,OAAO,CAACM,EAAE;QAC1B,IAAI,CAACvB,SAASsB,UAAU,CAACE,QAAQ,GAAG;YAClCF,UAAU,CAACE,QAAQ,GAAG,CAAC;QACzB;QACAF,aAAaA,UAAU,CAACE,QAAQ;IAClC;IAEA,MAAMC,WAAWR,OAAO,CAACA,QAAQH,MAAM,GAAG,EAAE;IAC5C,IAAIK,gBAAgBO,WAAW;QAC7B,OAAOJ,UAAU,CAACG,SAAS;IAC7B,OAAO;QACLH,UAAU,CAACG,SAAS,GAAGN;IACzB;IAEAX,kBAAkBa;IAElB,IAAIV,OAAOE,IAAI,CAACQ,wBAAwBP,MAAM,KAAK,GAAG;QACpD,OAAOM,mBAAmB,CAACF,SAAS;IACtC,OAAO;QACLE,mBAAmB,CAACF,SAAS,GAAGG;IAClC;IAEA,OAAOV,OAAOE,IAAI,CAACO,qBAAqBN,MAAM,GAAG,IAAIM,sBAAsB;AAC7E"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shared onChange handler for Payload SelectInput components.
3
+ * Handles both object options `{ value: string }` and raw string values.
4
+ */
5
+ export declare function handleSelectChange(setValue: (value: unknown) => void, option: unknown): void;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Shared onChange handler for Payload SelectInput components.
3
+ * Handles both object options `{ value: string }` and raw string values.
4
+ */ export function handleSelectChange(setValue, option) {
5
+ if (option && typeof option === 'object' && 'value' in option) {
6
+ setValue(option.value);
7
+ } else {
8
+ setValue(option);
9
+ }
10
+ }
11
+
12
+ //# sourceMappingURL=handleSelectChange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/ui/shared/handleSelectChange.ts"],"sourcesContent":["/**\n * Shared onChange handler for Payload SelectInput components.\n * Handles both object options `{ value: string }` and raw string values.\n */\nexport function handleSelectChange(\n setValue: (value: unknown) => void,\n option: unknown,\n): void {\n if (option && typeof option === 'object' && 'value' in option) {\n setValue((option as { value: string }).value)\n } else {\n setValue(option)\n }\n}\n"],"names":["handleSelectChange","setValue","option","value"],"mappings":"AAAA;;;CAGC,GACD,OAAO,SAASA,mBACdC,QAAkC,EAClCC,MAAe;IAEf,IAAIA,UAAU,OAAOA,WAAW,YAAY,WAAWA,QAAQ;QAC7DD,SAAS,AAACC,OAA6BC,KAAK;IAC9C,OAAO;QACLF,SAASC;IACX;AACF"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Shared UI types used across multiple components.
3
+ */
4
+ export interface Voice {
5
+ category?: string;
6
+ enabled?: boolean;
7
+ id: string;
8
+ labels?: Record<string, unknown>;
9
+ name: string;
10
+ preview_url?: string;
11
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shared UI types used across multiple components.
3
+ */ export { };
4
+
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/ui/shared/types.ts"],"sourcesContent":["/**\n * Shared UI types used across multiple components.\n */\nexport interface Voice {\n category?: string\n enabled?: boolean\n id: string\n labels?: Record<string, unknown>\n name: string\n preview_url?: string\n}\n\n"],"names":[],"mappings":"AAAA;;CAEC,GACD,WAOC"}
@@ -0,0 +1,15 @@
1
+ export type InstructionUseCase = 'image' | 'text' | 'tts' | 'video';
2
+ export declare function getInstructionSettingsName(modelId: unknown): string | undefined;
3
+ export declare function getInstructionUseCase(modelId: unknown): InstructionUseCase | undefined;
4
+ export declare function resolveEffectiveInstructionSettings({ defaults, instructions, }: {
5
+ defaults?: Record<string, any>;
6
+ instructions: Record<string, any>;
7
+ }): {
8
+ effectiveSettings: Record<string, unknown>;
9
+ settingsName?: string;
10
+ useCase?: InstructionUseCase;
11
+ };
12
+ export declare function applyInstructionDefaultsForDisplay({ defaults, instructions, }: {
13
+ defaults?: Record<string, any>;
14
+ instructions: Record<string, any>;
15
+ }): Record<string, any>;
@@ -0,0 +1,136 @@
1
+ const hasMeaningfulValue = (value)=>{
2
+ if (value === null || value === undefined) {
3
+ return false;
4
+ }
5
+ if (typeof value === 'string') {
6
+ return value.trim() !== '';
7
+ }
8
+ return true;
9
+ };
10
+ function isRecord(value) {
11
+ return !!value && typeof value === 'object' && !Array.isArray(value);
12
+ }
13
+ function deepMergeRecords(base, override) {
14
+ const merged = {
15
+ ...base
16
+ };
17
+ for (const [key, value] of Object.entries(override)){
18
+ const current = merged[key];
19
+ if (isRecord(current) && isRecord(value)) {
20
+ merged[key] = deepMergeRecords(current, value);
21
+ continue;
22
+ }
23
+ merged[key] = value;
24
+ }
25
+ return merged;
26
+ }
27
+ export function getInstructionSettingsName(modelId) {
28
+ if (modelId === 'text') {
29
+ return 'text-settings';
30
+ }
31
+ if (modelId === 'richtext') {
32
+ return 'richtext-settings';
33
+ }
34
+ if (modelId === 'array') {
35
+ return 'array-settings';
36
+ }
37
+ if (modelId === 'image') {
38
+ return 'image-settings';
39
+ }
40
+ if (modelId === 'tts') {
41
+ return 'tts-settings';
42
+ }
43
+ if (modelId === 'video') {
44
+ return 'video-settings';
45
+ }
46
+ return undefined;
47
+ }
48
+ export function getInstructionUseCase(modelId) {
49
+ if (modelId === 'text' || modelId === 'richtext' || modelId === 'array') {
50
+ return 'text';
51
+ }
52
+ if (modelId === 'image') {
53
+ return 'image';
54
+ }
55
+ if (modelId === 'tts') {
56
+ return 'tts';
57
+ }
58
+ if (modelId === 'video') {
59
+ return 'video';
60
+ }
61
+ return undefined;
62
+ }
63
+ export function resolveEffectiveInstructionSettings({ defaults, instructions }) {
64
+ const modelId = instructions['model-id'];
65
+ const settingsName = getInstructionSettingsName(modelId);
66
+ const useCase = getInstructionUseCase(modelId);
67
+ if (!settingsName || !useCase) {
68
+ return {
69
+ effectiveSettings: {},
70
+ settingsName,
71
+ useCase
72
+ };
73
+ }
74
+ const defaultsForUseCase = defaults?.[useCase] || {};
75
+ const instructionSettings = instructions[settingsName] || {};
76
+ const effectiveSettings = {
77
+ ...defaultsForUseCase
78
+ };
79
+ for (const [key, value] of Object.entries(instructionSettings)){
80
+ if (key === 'providerOptions') {
81
+ const selectedProvider = typeof instructionSettings.provider === 'string' ? instructionSettings.provider : typeof defaultsForUseCase.provider === 'string' ? defaultsForUseCase.provider : undefined;
82
+ if (selectedProvider && isRecord(value) && isRecord(value[selectedProvider])) {
83
+ const existingOpts = isRecord(effectiveSettings.providerOptions) ? effectiveSettings.providerOptions : {};
84
+ const existingProviderOpts = isRecord(existingOpts[selectedProvider]) ? existingOpts[selectedProvider] : {};
85
+ const incomingProviderOpts = value[selectedProvider];
86
+ effectiveSettings.providerOptions = {
87
+ ...existingOpts,
88
+ [selectedProvider]: {
89
+ ...deepMergeRecords(existingProviderOpts, incomingProviderOpts)
90
+ }
91
+ };
92
+ }
93
+ continue;
94
+ }
95
+ if (hasMeaningfulValue(value)) {
96
+ effectiveSettings[key] = value;
97
+ }
98
+ }
99
+ return {
100
+ effectiveSettings,
101
+ settingsName,
102
+ useCase
103
+ };
104
+ }
105
+ export function applyInstructionDefaultsForDisplay({ defaults, instructions }) {
106
+ const { settingsName, useCase } = resolveEffectiveInstructionSettings({
107
+ defaults,
108
+ instructions
109
+ });
110
+ if (!settingsName || !useCase) {
111
+ return instructions;
112
+ }
113
+ const defaultsForUseCase = defaults?.[useCase] || {};
114
+ const group = instructions[settingsName] || {};
115
+ const updatedGroup = {
116
+ ...group
117
+ };
118
+ if (!hasMeaningfulValue(updatedGroup.provider) && hasMeaningfulValue(defaultsForUseCase.provider)) {
119
+ updatedGroup.provider = defaultsForUseCase.provider;
120
+ }
121
+ if (!hasMeaningfulValue(updatedGroup.model) && hasMeaningfulValue(defaultsForUseCase.model)) {
122
+ updatedGroup.model = defaultsForUseCase.model;
123
+ }
124
+ if (useCase === 'tts' && !hasMeaningfulValue(updatedGroup.voice) && hasMeaningfulValue(defaultsForUseCase.voice)) {
125
+ updatedGroup.voice = defaultsForUseCase.voice;
126
+ }
127
+ if (JSON.stringify(group) === JSON.stringify(updatedGroup)) {
128
+ return instructions;
129
+ }
130
+ return {
131
+ ...instructions,
132
+ [settingsName]: updatedGroup
133
+ };
134
+ }
135
+
136
+ //# sourceMappingURL=resolveEffectiveInstructionSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utilities/ai/resolveEffectiveInstructionSettings.ts"],"sourcesContent":["export type InstructionUseCase = 'image' | 'text' | 'tts' | 'video'\n\nconst hasMeaningfulValue = (value: unknown): boolean => {\n if (value === null || value === undefined) {\n return false\n }\n\n if (typeof value === 'string') {\n return value.trim() !== ''\n }\n\n return true\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction deepMergeRecords(\n base: Record<string, unknown>,\n override: Record<string, unknown>,\n): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...base }\n\n for (const [key, value] of Object.entries(override)) {\n const current = merged[key]\n if (isRecord(current) && isRecord(value)) {\n merged[key] = deepMergeRecords(current, value)\n continue\n }\n merged[key] = value\n }\n\n return merged\n}\n\nexport function getInstructionSettingsName(modelId: unknown): string | undefined {\n if (modelId === 'text') {\n return 'text-settings'\n }\n if (modelId === 'richtext') {\n return 'richtext-settings'\n }\n if (modelId === 'array') {\n return 'array-settings'\n }\n if (modelId === 'image') {\n return 'image-settings'\n }\n if (modelId === 'tts') {\n return 'tts-settings'\n }\n if (modelId === 'video') {\n return 'video-settings'\n }\n\n return undefined\n}\n\nexport function getInstructionUseCase(modelId: unknown): InstructionUseCase | undefined {\n if (modelId === 'text' || modelId === 'richtext' || modelId === 'array') {\n return 'text'\n }\n if (modelId === 'image') {\n return 'image'\n }\n if (modelId === 'tts') {\n return 'tts'\n }\n if (modelId === 'video') {\n return 'video'\n }\n\n return undefined\n}\nexport function resolveEffectiveInstructionSettings({\n defaults,\n instructions,\n}: {\n defaults?: Record<string, any>\n instructions: Record<string, any>\n}): {\n effectiveSettings: Record<string, unknown>\n settingsName?: string\n useCase?: InstructionUseCase\n} {\n const modelId = instructions['model-id']\n const settingsName = getInstructionSettingsName(modelId)\n const useCase = getInstructionUseCase(modelId)\n\n if (!settingsName || !useCase) {\n return { effectiveSettings: {}, settingsName, useCase }\n }\n\n const defaultsForUseCase = (defaults?.[useCase] || {}) as Record<string, unknown>\n const instructionSettings = (instructions[settingsName] || {}) as Record<string, unknown>\n const effectiveSettings: Record<string, unknown> = {\n ...defaultsForUseCase,\n }\n\n for (const [key, value] of Object.entries(instructionSettings)) {\n if (key === 'providerOptions') {\n const selectedProvider =\n typeof instructionSettings.provider === 'string'\n ? instructionSettings.provider\n : typeof defaultsForUseCase.provider === 'string'\n ? defaultsForUseCase.provider\n : undefined\n\n if (selectedProvider && isRecord(value) && isRecord(value[selectedProvider])) {\n const existingOpts = isRecord(effectiveSettings.providerOptions)\n ? effectiveSettings.providerOptions\n : {}\n const existingProviderOpts = isRecord(existingOpts[selectedProvider])\n ? existingOpts[selectedProvider]\n : {}\n const incomingProviderOpts = value[selectedProvider] as Record<string, unknown>\n\n effectiveSettings.providerOptions = {\n ...existingOpts,\n [selectedProvider]: {\n ...deepMergeRecords(existingProviderOpts, incomingProviderOpts),\n },\n }\n }\n continue\n }\n\n if (hasMeaningfulValue(value)) {\n effectiveSettings[key] = value\n }\n }\n\n return {\n effectiveSettings,\n settingsName,\n useCase,\n }\n}\n\nexport function applyInstructionDefaultsForDisplay({\n defaults,\n instructions,\n}: {\n defaults?: Record<string, any>\n instructions: Record<string, any>\n}): Record<string, any> {\n const { settingsName, useCase } = resolveEffectiveInstructionSettings({ defaults, instructions })\n\n if (!settingsName || !useCase) {\n return instructions\n }\n\n const defaultsForUseCase = (defaults?.[useCase] || {}) as Record<string, unknown>\n const group = ((instructions[settingsName] || {}) as Record<string, unknown>)\n const updatedGroup: Record<string, unknown> = {\n ...group,\n }\n\n if (!hasMeaningfulValue(updatedGroup.provider) && hasMeaningfulValue(defaultsForUseCase.provider)) {\n updatedGroup.provider = defaultsForUseCase.provider\n }\n\n if (!hasMeaningfulValue(updatedGroup.model) && hasMeaningfulValue(defaultsForUseCase.model)) {\n updatedGroup.model = defaultsForUseCase.model\n }\n\n if (useCase === 'tts' && !hasMeaningfulValue(updatedGroup.voice) && hasMeaningfulValue(defaultsForUseCase.voice)) {\n updatedGroup.voice = defaultsForUseCase.voice\n }\n\n if (JSON.stringify(group) === JSON.stringify(updatedGroup)) {\n return instructions\n }\n\n return {\n ...instructions,\n [settingsName]: updatedGroup,\n }\n}\n"],"names":["hasMeaningfulValue","value","undefined","trim","isRecord","Array","isArray","deepMergeRecords","base","override","merged","key","Object","entries","current","getInstructionSettingsName","modelId","getInstructionUseCase","resolveEffectiveInstructionSettings","defaults","instructions","settingsName","useCase","effectiveSettings","defaultsForUseCase","instructionSettings","selectedProvider","provider","existingOpts","providerOptions","existingProviderOpts","incomingProviderOpts","applyInstructionDefaultsForDisplay","group","updatedGroup","model","voice","JSON","stringify"],"mappings":"AAEA,MAAMA,qBAAqB,CAACC;IAC1B,IAAIA,UAAU,QAAQA,UAAUC,WAAW;QACzC,OAAO;IACT;IAEA,IAAI,OAAOD,UAAU,UAAU;QAC7B,OAAOA,MAAME,IAAI,OAAO;IAC1B;IAEA,OAAO;AACT;AAEA,SAASC,SAASH,KAAc;IAC9B,OAAO,CAAC,CAACA,SAAS,OAAOA,UAAU,YAAY,CAACI,MAAMC,OAAO,CAACL;AAChE;AAEA,SAASM,iBACPC,IAA6B,EAC7BC,QAAiC;IAEjC,MAAMC,SAAkC;QAAE,GAAGF,IAAI;IAAC;IAElD,KAAK,MAAM,CAACG,KAAKV,MAAM,IAAIW,OAAOC,OAAO,CAACJ,UAAW;QACnD,MAAMK,UAAUJ,MAAM,CAACC,IAAI;QAC3B,IAAIP,SAASU,YAAYV,SAASH,QAAQ;YACxCS,MAAM,CAACC,IAAI,GAAGJ,iBAAiBO,SAASb;YACxC;QACF;QACAS,MAAM,CAACC,IAAI,GAAGV;IAChB;IAEA,OAAOS;AACT;AAEA,OAAO,SAASK,2BAA2BC,OAAgB;IACzD,IAAIA,YAAY,QAAQ;QACtB,OAAO;IACT;IACA,IAAIA,YAAY,YAAY;QAC1B,OAAO;IACT;IACA,IAAIA,YAAY,SAAS;QACvB,OAAO;IACT;IACA,IAAIA,YAAY,SAAS;QACvB,OAAO;IACT;IACA,IAAIA,YAAY,OAAO;QACrB,OAAO;IACT;IACA,IAAIA,YAAY,SAAS;QACvB,OAAO;IACT;IAEA,OAAOd;AACT;AAEA,OAAO,SAASe,sBAAsBD,OAAgB;IACpD,IAAIA,YAAY,UAAUA,YAAY,cAAcA,YAAY,SAAS;QACvE,OAAO;IACT;IACA,IAAIA,YAAY,SAAS;QACvB,OAAO;IACT;IACA,IAAIA,YAAY,OAAO;QACrB,OAAO;IACT;IACA,IAAIA,YAAY,SAAS;QACvB,OAAO;IACT;IAEA,OAAOd;AACT;AACA,OAAO,SAASgB,oCAAoC,EAClDC,QAAQ,EACRC,YAAY,EAIb;IAKC,MAAMJ,UAAUI,YAAY,CAAC,WAAW;IACxC,MAAMC,eAAeN,2BAA2BC;IAChD,MAAMM,UAAUL,sBAAsBD;IAEtC,IAAI,CAACK,gBAAgB,CAACC,SAAS;QAC7B,OAAO;YAAEC,mBAAmB,CAAC;YAAGF;YAAcC;QAAQ;IACxD;IAEA,MAAME,qBAAsBL,UAAU,CAACG,QAAQ,IAAI,CAAC;IACpD,MAAMG,sBAAuBL,YAAY,CAACC,aAAa,IAAI,CAAC;IAC5D,MAAME,oBAA6C;QACjD,GAAGC,kBAAkB;IACvB;IAEA,KAAK,MAAM,CAACb,KAAKV,MAAM,IAAIW,OAAOC,OAAO,CAACY,qBAAsB;QAC9D,IAAId,QAAQ,mBAAmB;YAC7B,MAAMe,mBACJ,OAAOD,oBAAoBE,QAAQ,KAAK,WACpCF,oBAAoBE,QAAQ,GAC5B,OAAOH,mBAAmBG,QAAQ,KAAK,WACrCH,mBAAmBG,QAAQ,GAC3BzB;YAER,IAAIwB,oBAAoBtB,SAASH,UAAUG,SAASH,KAAK,CAACyB,iBAAiB,GAAG;gBAC5E,MAAME,eAAexB,SAASmB,kBAAkBM,eAAe,IAC3DN,kBAAkBM,eAAe,GACjC,CAAC;gBACL,MAAMC,uBAAuB1B,SAASwB,YAAY,CAACF,iBAAiB,IAChEE,YAAY,CAACF,iBAAiB,GAC9B,CAAC;gBACL,MAAMK,uBAAuB9B,KAAK,CAACyB,iBAAiB;gBAEpDH,kBAAkBM,eAAe,GAAG;oBAClC,GAAGD,YAAY;oBACf,CAACF,iBAAiB,EAAE;wBAClB,GAAGnB,iBAAiBuB,sBAAsBC,qBAAqB;oBACjE;gBACF;YACF;YACA;QACF;QAEA,IAAI/B,mBAAmBC,QAAQ;YAC7BsB,iBAAiB,CAACZ,IAAI,GAAGV;QAC3B;IACF;IAEA,OAAO;QACLsB;QACAF;QACAC;IACF;AACF;AAEA,OAAO,SAASU,mCAAmC,EACjDb,QAAQ,EACRC,YAAY,EAIb;IACC,MAAM,EAAEC,YAAY,EAAEC,OAAO,EAAE,GAAGJ,oCAAoC;QAAEC;QAAUC;IAAa;IAE/F,IAAI,CAACC,gBAAgB,CAACC,SAAS;QAC7B,OAAOF;IACT;IAEA,MAAMI,qBAAsBL,UAAU,CAACG,QAAQ,IAAI,CAAC;IACpD,MAAMW,QAAUb,YAAY,CAACC,aAAa,IAAI,CAAC;IAC/C,MAAMa,eAAwC;QAC5C,GAAGD,KAAK;IACV;IAEA,IAAI,CAACjC,mBAAmBkC,aAAaP,QAAQ,KAAK3B,mBAAmBwB,mBAAmBG,QAAQ,GAAG;QACjGO,aAAaP,QAAQ,GAAGH,mBAAmBG,QAAQ;IACrD;IAEA,IAAI,CAAC3B,mBAAmBkC,aAAaC,KAAK,KAAKnC,mBAAmBwB,mBAAmBW,KAAK,GAAG;QAC3FD,aAAaC,KAAK,GAAGX,mBAAmBW,KAAK;IAC/C;IAEA,IAAIb,YAAY,SAAS,CAACtB,mBAAmBkC,aAAaE,KAAK,KAAKpC,mBAAmBwB,mBAAmBY,KAAK,GAAG;QAChHF,aAAaE,KAAK,GAAGZ,mBAAmBY,KAAK;IAC/C;IAEA,IAAIC,KAAKC,SAAS,CAACL,WAAWI,KAAKC,SAAS,CAACJ,eAAe;QAC1D,OAAOd;IACT;IAEA,OAAO;QACL,GAAGA,YAAY;QACf,CAACC,aAAa,EAAEa;IAClB;AACF"}
@@ -1,7 +1,8 @@
1
- import { defaultPrompts } from '../ai/prompts.js';
1
+ import { defaultPrompts } from '../ai/utilities/prompts.js';
2
2
  import { asyncHandlebars } from '../libraries/handlebars/asyncHandlebars.js';
3
3
  import { handlebarsHelpersMap } from '../libraries/handlebars/helpersMap.js';
4
4
  import { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js';
5
+ import { lexicalToPromptTemplate } from '../utilities/lexical/lexicalToPromptTemplate.js';
5
6
  const buildRichTextSystem = (baseSystem, layout)=>{
6
7
  return `${baseSystem}
7
8
 
@@ -65,7 +66,7 @@ export const assignPrompt = async (action, { type, actionParams, collection, con
65
66
  systemPrompt
66
67
  }) : '';
67
68
  return {
68
- layout: updatedLayout,
69
+ layout: type === 'richText' ? updatedLayout : undefined,
69
70
  // TODO: revisit this toLexicalHTML
70
71
  prompt: await replacePlaceholders(`{{${toLexicalHTML} ${field}}}`, extendedContext),
71
72
  system: type === 'richText' ? buildRichTextSystem(system, updatedLayout) : system
@@ -73,19 +74,27 @@ export const assignPrompt = async (action, { type, actionParams, collection, con
73
74
  };
74
75
  export const extendContextWithPromptFields = (data, ctx, pluginConfig)=>{
75
76
  const { promptFields = [] } = pluginConfig;
76
- const fieldsMap = new Map(promptFields.filter((f)=>!f.collections || f.collections.includes(ctx.collection)).map((f)=>[
77
+ const fieldsMap = new Map((promptFields || []).filter((f)=>!f.collections || f.collections.includes(ctx.collection)).map((f)=>[
77
78
  f.name,
78
79
  f
79
80
  ]));
80
81
  return new Proxy(data, {
81
82
  get: (target, prop)=>{
82
83
  const field = fieldsMap.get(prop);
83
- if (field?.getter) {
84
+ if (field && 'getter' in field && typeof field.getter === 'function') {
84
85
  const value = field.getter(data, ctx);
85
86
  return Promise.resolve(value).then((v)=>new asyncHandlebars.SafeString(v));
86
87
  }
87
88
  // {{prop}} escapes content by default. Here we make sure it won't be escaped.
88
89
  const value = typeof target === 'object' ? target[prop] : undefined;
90
+ // If the value is a Lexical JSON object (e.g. a PromptField / richText field),
91
+ // convert it to a template string AND resolve any internal mention variables
92
+ // (like {{name}}) against the raw document data to avoid unresolved placeholders.
93
+ if (value && typeof value === 'object' && value.root && Array.isArray(value.root.children)) {
94
+ const template = lexicalToPromptTemplate(value);
95
+ // Resolve inner variables using the raw target (not the Proxy) to avoid recursion
96
+ return replacePlaceholders(template, target).then((resolved)=>new asyncHandlebars.SafeString(resolved));
97
+ }
89
98
  return typeof value === 'string' ? new asyncHandlebars.SafeString(value) : value;
90
99
  },
91
100
  // It's used by the handlebars library to determine if the property is enumerable
@@ -104,7 +113,7 @@ export const extendContextWithPromptFields = (data, ctx, pluginConfig)=>{
104
113
  },
105
114
  ownKeys: (target)=>{
106
115
  return [
107
- ...fieldsMap.keys(),
116
+ ...Array.from(fieldsMap.keys()),
108
117
  ...Object.keys(target || {})
109
118
  ];
110
119
  }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/buildPromptUtils.ts"],"sourcesContent":["import type { CollectionSlug } from 'payload'\n\nimport type { ActionMenuItems, PluginConfig, PromptFieldGetterContext } from '../types.js'\n\nimport { defaultPrompts } from '../ai/utilities/prompts.js'\nimport { asyncHandlebars } from '../libraries/handlebars/asyncHandlebars.js'\nimport { handlebarsHelpersMap } from '../libraries/handlebars/helpersMap.js'\nimport { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js'\nimport { lexicalToPromptTemplate } from '../utilities/lexical/lexicalToPromptTemplate.js'\n\nconst buildRichTextSystem = (baseSystem: string, layout: string) => {\n return `${baseSystem}\n\nRULES:\n- Generate original and unique content based on the given topic.\n- Strictly adhere to the specified layout and formatting instructions.\n- Utilize the provided rich text editor tools for appropriate formatting.\n- Ensure the output follows the structure of the sample output object.\n- Produce valid JSON with no undefined or null values.\n---\nLAYOUT INSTRUCTIONS:\n${layout}\n\n---\nADDITIONAL GUIDELINES:\n- Ensure coherence and logical flow between all sections.\n- Maintain a consistent tone and style throughout the content.\n- Use clear and concise language appropriate for the target audience.\n`\n}\n\nexport const assignPrompt = async (\n action: ActionMenuItems,\n {\n type,\n actionParams,\n collection,\n context,\n field,\n layout,\n locale,\n pluginConfig,\n systemPrompt = '',\n template,\n }: {\n actionParams: Record<any, any>\n collection: CollectionSlug\n context: object\n field: string\n layout: string\n locale: string\n pluginConfig: PluginConfig\n systemPrompt: string\n template: string\n type: string\n },\n) => {\n const extendedContext = extendContextWithPromptFields(context, { type, collection }, pluginConfig)\n const prompt = await replacePlaceholders(template, extendedContext)\n const toLexicalHTML = type === 'richText' ? handlebarsHelpersMap.toHTML.name : ''\n\n const assignedPrompts = {\n layout: type === 'richText' ? layout : undefined,\n prompt,\n //TODO: Define only once on a collection level\n system: type === 'richText' ? buildRichTextSystem(systemPrompt, layout) : undefined,\n }\n\n if (action === 'Compose') {\n if (locale && locale !== 'en') {\n /**\n * NOTE: Avoid using the \"system prompt\" for setting the output language,\n * as it causes quotation marks to appear in the output (Currently only tested with openai models).\n * Appending the language instruction directly to the prompt resolves this issue. - revalidate\n **/\n assignedPrompts.prompt += `\n --- \n OUTPUT LANGUAGE: ${locale}\n `\n }\n\n return assignedPrompts\n }\n\n const prompts = [...(pluginConfig.prompts || []), ...defaultPrompts]\n const foundPrompt = prompts.find((p) => p.name === action)\n const getLayout = foundPrompt?.layout\n const getSystemPrompt = foundPrompt?.system\n\n let updatedLayout = layout\n if (getLayout) {\n updatedLayout = getLayout()\n }\n\n const system = getSystemPrompt\n ? getSystemPrompt({\n ...(actionParams || {}),\n prompt,\n systemPrompt,\n })\n : ''\n\n return {\n layout: type === 'richText' ? updatedLayout : undefined,\n // TODO: revisit this toLexicalHTML\n prompt: await replacePlaceholders(`{{${toLexicalHTML} ${field}}}`, extendedContext),\n system: type === 'richText' ? buildRichTextSystem(system, updatedLayout) : system,\n }\n}\n\nexport const extendContextWithPromptFields = (\n data: object,\n ctx: PromptFieldGetterContext,\n pluginConfig: PluginConfig,\n) => {\n const { promptFields = [] } = pluginConfig\n const fieldsMap = new Map(\n (promptFields || [])\n .filter((f: any) => !f.collections || f.collections.includes(ctx.collection))\n .map((f: any) => [f.name, f]),\n )\n return new Proxy(data, {\n get: (target, prop: string) => {\n const field = fieldsMap.get(prop)\n if (field && 'getter' in field && typeof field.getter === 'function') {\n const value = field.getter(data, ctx)\n return Promise.resolve(value).then((v) => new asyncHandlebars.SafeString(v))\n }\n // {{prop}} escapes content by default. Here we make sure it won't be escaped.\n const value = typeof target === 'object' ? (target as any)[prop] : undefined\n\n // If the value is a Lexical JSON object (e.g. a PromptField / richText field),\n // convert it to a template string AND resolve any internal mention variables\n // (like {{name}}) against the raw document data to avoid unresolved placeholders.\n if (value && typeof value === 'object' && value.root && Array.isArray(value.root.children)) {\n const template = lexicalToPromptTemplate(value)\n // Resolve inner variables using the raw target (not the Proxy) to avoid recursion\n return replacePlaceholders(template, target).then(\n (resolved) => new asyncHandlebars.SafeString(resolved),\n )\n }\n\n return typeof value === 'string' ? new asyncHandlebars.SafeString(value) : value\n },\n // It's used by the handlebars library to determine if the property is enumerable\n getOwnPropertyDescriptor: (target, prop) => {\n const field = fieldsMap.get(prop as string)\n if (field) {\n return {\n configurable: true,\n enumerable: true,\n }\n }\n return Object.getOwnPropertyDescriptor(target, prop)\n },\n has: (target, prop) => {\n return fieldsMap.has(prop as string) || (target && prop in target)\n },\n ownKeys: (target) => {\n return [...Array.from(fieldsMap.keys()), ...Object.keys(target || {})]\n },\n })\n}\n"],"names":["defaultPrompts","asyncHandlebars","handlebarsHelpersMap","replacePlaceholders","lexicalToPromptTemplate","buildRichTextSystem","baseSystem","layout","assignPrompt","action","type","actionParams","collection","context","field","locale","pluginConfig","systemPrompt","template","extendedContext","extendContextWithPromptFields","prompt","toLexicalHTML","toHTML","name","assignedPrompts","undefined","system","prompts","foundPrompt","find","p","getLayout","getSystemPrompt","updatedLayout","data","ctx","promptFields","fieldsMap","Map","filter","f","collections","includes","map","Proxy","get","target","prop","getter","value","Promise","resolve","then","v","SafeString","root","Array","isArray","children","resolved","getOwnPropertyDescriptor","configurable","enumerable","Object","has","ownKeys","from","keys"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
- import { getFieldBySchemaPath } from './getFieldBySchemaPath.js';
2
+ import { getFieldBySchemaPath } from './fields/getFieldBySchemaPath.js';
3
3
  /**
4
4
  * Extract field information from a schema path
5
- */ const getFieldInfo = (schemaPath, payload)=>{
5
+ */ const extractFieldInfo = (schemaPath, payload)=>{
6
6
  const parts = schemaPath.split('.');
7
7
  const collectionSlug = parts[0];
8
8
  const fieldPath = parts.slice(1);
@@ -97,7 +97,7 @@ import { getFieldBySchemaPath } from './getFieldBySchemaPath.js';
97
97
  * @returns A contextual prompt string that can be used for AI generation
98
98
  */ export const buildSmartPrompt = (context)=>{
99
99
  const { documentData, payload, schemaPath } = context;
100
- const fieldInfo = getFieldInfo(schemaPath, payload);
100
+ const fieldInfo = extractFieldInfo(schemaPath, payload);
101
101
  const { name, type, field, label, parentContext } = fieldInfo;
102
102
  // Start with the field's own description if available
103
103
  const description = getFieldDescription(field);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/buildSmartPrompt.ts"],"sourcesContent":["'use strict'\n\nimport type { Field, Payload } from 'payload'\n\nimport { getFieldBySchemaPath } from './getFieldBySchemaPath.js'\n\nexport interface SmartPromptContext {\n /** The document data for template interpolation */\n documentData?: Record<string, unknown>\n /** The Payload instance to access collection config */\n payload: Payload\n /** The schema path like 'array-test-cases.teamMembers.contact.email' */\n schemaPath: string\n}\n\ninterface FieldInfo {\n /** The field configuration */\n field: Field | null\n /** Human-readable field label */\n label: string\n /** Field name from the path */\n name: string\n /** Parent field name if nested (e.g., 'teamMembers' for 'teamMembers.name') */\n parentContext: null | string\n /** The field type */\n type: string\n}\n\n/**\n * Extract field information from a schema path\n */\nconst getFieldInfo = (schemaPath: string, payload: Payload): FieldInfo => {\n const parts = schemaPath.split('.')\n const collectionSlug = parts[0]\n const fieldPath = parts.slice(1)\n const fieldName = fieldPath[fieldPath.length - 1] || ''\n\n // Get parent context (e.g., 'teamMembers' for 'teamMembers.name')\n let parentContext: null | string = null\n if (fieldPath.length > 1) {\n parentContext = fieldPath[fieldPath.length - 2]\n }\n\n // Try to get the actual field configuration from the collection\n let field: Field | null = null\n const collection = payload.config.collections.find((c) => c.slug === collectionSlug)\n if (collection) {\n field = getFieldBySchemaPath(collection, schemaPath)\n }\n\n return {\n name: fieldName,\n type: field?.type || 'text',\n field,\n label: (field as { label?: string })?.label || fieldName,\n parentContext,\n }\n}\n\n/**\n * Humanize a camelCase or snake_case field name\n * e.g., 'teamMembers' -> 'team members', 'first_name' -> 'first name'\n */\nconst humanize = (str: string): string => {\n return str\n .replace(/([a-z])([A-Z])/g, '$1 $2') // camelCase to spaces\n .replace(/[_-]/g, ' ') // underscores/dashes to spaces\n .toLowerCase()\n .trim()\n}\n\n/**\n * Get a description snippet from field admin config\n */\nconst getFieldDescription = (field: Field | null): null | string => {\n if (!field) {\n return null\n }\n const admin = (field as { admin?: { description?: string } }).admin\n if (admin?.description && typeof admin.description === 'string') {\n return admin.description\n }\n return null\n}\n\n/**\n * Build type-specific prompt guidance\n */\nconst getTypeGuidance = (type: string, fieldName: string): string => {\n const nameHint = humanize(fieldName)\n\n switch (type) {\n case 'code':\n return `Generate code for ${nameHint}`\n case 'date':\n return `Generate an appropriate date for ${nameHint}`\n case 'email':\n return `Generate a valid professional email address`\n case 'json':\n return `Generate valid JSON data for ${nameHint}`\n case 'number':\n return `Generate an appropriate numeric value for ${nameHint}`\n case 'select':\n return `Select an appropriate option for ${nameHint}`\n case 'text':\n return `Generate appropriate text for ${nameHint}`\n case 'textarea':\n return `Write detailed content for ${nameHint}`\n case 'upload':\n // Explicit image generation instruction for multimodal models\n return `Generate an image of ${nameHint}`\n default:\n return `Generate content for ${nameHint}`\n }\n}\n\n/**\n * Build context from parent field name using generic humanization.\n * Works universally for any collection structure.\n */\nconst getParentContextPhrase = (parentContext: null | string): string => {\n if (!parentContext) {\n return ''\n }\n\n const humanized = humanize(parentContext)\n\n // Use singular form if the name ends with 's' (common for arrays)\n // e.g., \"teamMembers\" → \"team member\", \"products\" → \"product\"\n if (humanized.endsWith('s') && humanized.length > 2) {\n return `for a ${humanized.slice(0, -1)} entry`\n }\n\n return `for ${humanized}`\n}\n\n/**\n * Build a smart contextual prompt based on field metadata.\n * This is used as a fallback when the user hasn't set a custom prompt.\n *\n * @param context - The context containing schema path and document data\n * @returns A contextual prompt string that can be used for AI generation\n */\nexport const buildSmartPrompt = (context: SmartPromptContext): string => {\n const { documentData, payload, schemaPath } = context\n\n const fieldInfo = getFieldInfo(schemaPath, payload)\n const { name, type, field, label, parentContext } = fieldInfo\n\n // Start with the field's own description if available\n const description = getFieldDescription(field)\n\n // Build the prompt components\n const parts: string[] = []\n\n // Use description as primary guidance if available\n if (description) {\n parts.push(`Field description for user: ${description}\\n`)\n }\n\n parts.push(getTypeGuidance(type, label || name))\n\n // Add parent context if nested\n const parentPhrase = getParentContextPhrase(parentContext)\n if (parentPhrase) {\n parts.push(parentPhrase)\n }\n\n // Add document title context if available\n const title = documentData?.title || documentData?.name\n\n if (title && typeof title === 'string') {\n parts.push(`in the context of \"${title}\"`)\n }\n\n // Build the final prompt\n let prompt = parts.join(' ')\n\n // Ensure first letter is capitalized\n prompt = prompt.charAt(0).toUpperCase() + prompt.slice(1)\n\n // Add instruction suffix for clarity\n if (!prompt.endsWith('.')) {\n prompt += '.'\n }\n\n return prompt\n}\n\n/**\n * Check if a prompt template is empty and should be replaced with a smart prompt.\n * Only triggers when the prompt is completely empty or whitespace-only.\n */\nexport const isGenericPrompt = (template: null | string | undefined): boolean => {\n if (!template) {\n return true\n }\n return template.trim() === ''\n}\n"],"names":["getFieldBySchemaPath","getFieldInfo","schemaPath","payload","parts","split","collectionSlug","fieldPath","slice","fieldName","length","parentContext","field","collection","config","collections","find","c","slug","name","type","label","humanize","str","replace","toLowerCase","trim","getFieldDescription","admin","description","getTypeGuidance","nameHint","getParentContextPhrase","humanized","endsWith","buildSmartPrompt","context","documentData","fieldInfo","push","parentPhrase","title","prompt","join","charAt","toUpperCase","isGenericPrompt","template"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/buildSmartPrompt.ts"],"sourcesContent":["'use strict'\n\nimport type { Field, Payload } from 'payload'\n\nimport { getFieldBySchemaPath } from './fields/getFieldBySchemaPath.js'\nimport { stringToLexicalJSON } from './lexical/stringToLexicalJSON.js'\n\nexport interface SmartPromptContext {\n /** The document data for template interpolation */\n documentData?: Record<string, unknown>\n /** The Payload instance to access collection config */\n payload: Payload\n /** The schema path like 'array-test-cases.teamMembers.contact.email' */\n schemaPath: string\n}\n\ninterface FieldInfo {\n /** The field configuration */\n field: Field | null\n /** Human-readable field label */\n label: string\n /** Field name from the path */\n name: string\n /** Parent field name if nested (e.g., 'teamMembers' for 'teamMembers.name') */\n parentContext: null | string\n /** The field type */\n type: string\n}\n\n/**\n * Extract field information from a schema path\n */\nconst extractFieldInfo = (schemaPath: string, payload: Payload): FieldInfo => {\n const parts = schemaPath.split('.')\n const collectionSlug = parts[0]\n const fieldPath = parts.slice(1)\n const fieldName = fieldPath[fieldPath.length - 1] || ''\n\n // Get parent context (e.g., 'teamMembers' for 'teamMembers.name')\n let parentContext: null | string = null\n if (fieldPath.length > 1) {\n parentContext = fieldPath[fieldPath.length - 2]\n }\n\n // Try to get the actual field configuration from the collection\n let field: Field | null = null\n const collection = payload.config.collections.find((c) => c.slug === collectionSlug)\n if (collection) {\n field = getFieldBySchemaPath(collection, schemaPath)\n }\n\n return {\n name: fieldName,\n type: field?.type || 'text',\n field,\n label: (field as { label?: string })?.label || fieldName,\n parentContext,\n }\n}\n\n/**\n * Humanize a camelCase or snake_case field name\n * e.g., 'teamMembers' -> 'team members', 'first_name' -> 'first name'\n */\nconst humanize = (str: string): string => {\n return str\n .replace(/([a-z])([A-Z])/g, '$1 $2') // camelCase to spaces\n .replace(/[_-]/g, ' ') // underscores/dashes to spaces\n .toLowerCase()\n .trim()\n}\n\n/**\n * Get a description snippet from field admin config\n */\nconst getFieldDescription = (field: Field | null): null | string => {\n if (!field) {\n return null\n }\n const admin = (field as { admin?: { description?: string } }).admin\n if (admin?.description && typeof admin.description === 'string') {\n return admin.description\n }\n return null\n}\n\n/**\n * Build type-specific prompt guidance\n */\nconst getTypeGuidance = (type: string, fieldName: string): string => {\n const nameHint = humanize(fieldName)\n\n switch (type) {\n case 'code':\n return `Generate code for ${nameHint}`\n case 'date':\n return `Generate an appropriate date for ${nameHint}`\n case 'email':\n return `Generate a valid professional email address`\n case 'json':\n return `Generate valid JSON data for ${nameHint}`\n case 'number':\n return `Generate an appropriate numeric value for ${nameHint}`\n case 'select':\n return `Select an appropriate option for ${nameHint}`\n case 'text':\n return `Generate appropriate text for ${nameHint}`\n case 'textarea':\n return `Write detailed content for ${nameHint}`\n case 'upload':\n // Explicit image generation instruction for multimodal models\n return `Generate an image of ${nameHint}`\n default:\n return `Generate content for ${nameHint}`\n }\n}\n\n/**\n * Build context from parent field name using generic humanization.\n * Works universally for any collection structure.\n */\nconst getParentContextPhrase = (parentContext: null | string): string => {\n if (!parentContext) {\n return ''\n }\n\n const humanized = humanize(parentContext)\n\n // Use singular form if the name ends with 's' (common for arrays)\n // e.g., \"teamMembers\" → \"team member\", \"products\" → \"product\"\n if (humanized.endsWith('s') && humanized.length > 2) {\n return `for a ${humanized.slice(0, -1)} entry`\n }\n\n return `for ${humanized}`\n}\n\n/**\n * Build a smart contextual prompt based on field metadata.\n * This is used as a fallback when the user hasn't set a custom prompt.\n *\n * @param context - The context containing schema path and document data\n * @returns A contextual prompt string that can be used for AI generation\n */\nexport const buildSmartPrompt = (context: SmartPromptContext): string => {\n const { documentData, payload, schemaPath } = context\n\n const fieldInfo = extractFieldInfo(schemaPath, payload)\n const { name, type, field, label, parentContext } = fieldInfo\n\n // Start with the field's own description if available\n const description = getFieldDescription(field)\n\n // Build the prompt components\n const parts: string[] = []\n\n // Use description as primary guidance if available\n if (description) {\n parts.push(`Field description for user: ${description}\\n`)\n }\n\n parts.push(getTypeGuidance(type, label || name))\n\n // Add parent context if nested\n const parentPhrase = getParentContextPhrase(parentContext)\n if (parentPhrase) {\n parts.push(parentPhrase)\n }\n\n // Add document title context if available\n const title = documentData?.title || documentData?.name\n\n if (title && typeof title === 'string') {\n parts.push(`in the context of \"${title}\"`)\n }\n\n // Build the final prompt\n let prompt = parts.join(' ')\n\n // Ensure first letter is capitalized\n prompt = prompt.charAt(0).toUpperCase() + prompt.slice(1)\n\n // Add instruction suffix for clarity\n if (!prompt.endsWith('.')) {\n prompt += '.'\n }\n\n return prompt\n}\n\n/**\n * Check if a prompt template is empty and should be replaced with a smart prompt.\n * Only triggers when the prompt is completely empty or whitespace-only.\n */\nexport const isGenericPrompt = (template: null | string | undefined): boolean => {\n if (!template) {\n return true\n }\n return template.trim() === ''\n}\n"],"names":["getFieldBySchemaPath","extractFieldInfo","schemaPath","payload","parts","split","collectionSlug","fieldPath","slice","fieldName","length","parentContext","field","collection","config","collections","find","c","slug","name","type","label","humanize","str","replace","toLowerCase","trim","getFieldDescription","admin","description","getTypeGuidance","nameHint","getParentContextPhrase","humanized","endsWith","buildSmartPrompt","context","documentData","fieldInfo","push","parentPhrase","title","prompt","join","charAt","toUpperCase","isGenericPrompt","template"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utilities/fields/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 || subField.name === 'id') {continue}\n\n const subSchema = fieldToJsonSchema(subField, { wrapObject: false })\n if (subSchema && Object.keys(subSchema).length > 0) {\n properties[subField.name] = subSchema\n // OpenAI Strict Mode: All fields must be required\n required.push(subField.name)\n \n // If field is optional in Payload, allow null in schema\n if (!subField.required) {\n // Arrays usually default to empty array [], so we don't make them nullable\n // Groups and other types can be null\n if (subSchema.type !== 'array') {\n if (Array.isArray(subSchema.type)) {\n if (!subSchema.type.includes('null')) {\n subSchema.type.push('null')\n }\n } else if (typeof subSchema.type === 'string' && subSchema.type !== 'null') {\n subSchema.type = [subSchema.type, 'null']\n }\n \n // If enum is present, we must allow null in enum or use anyOf? \n // OpenAI strict mode: \"enum values must be consistent with type\". \n // If type is [string, null], null is a valid value for the type, but if enum is [\"a\"], null is not in enum.\n // valid: { type: [\"string\", \"null\"], enum: [\"a\", null] } \n if (Array.isArray(subSchema.enum) && !subSchema.enum.includes(null)) {\n subSchema.enum.push(null)\n }\n }\n }\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 if (typeof field.maxRows === 'number') {\n valueSchema.maxItems = field.maxRows\n }\n if (typeof field.minRows === 'number') {\n valueSchema.minItems = field.minRows\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","includes","enum","objSchema","additionalProperties","items","maxRows","maxItems","minRows","minItems","base","hasMany","baseSingle","arr","wrap"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utilities/fields/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":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utilities/fields/getFieldInfo.ts"],"sourcesContent":["import type { BasePayload } from 'payload'\n\nimport { getFieldBySchemaPath } from './getFieldBySchemaPath.js'\n\nexport const getFieldInfo = (collections: BasePayload['collections'], schemaPath: string) => {\n let fieldInfo = null\n //TODO: Only run below for enabled collections\n for (const collectionsKey in collections) {\n const collection = collections[collectionsKey]\n fieldInfo = getFieldBySchemaPath(collection.config, schemaPath)\n if (fieldInfo) {\n return fieldInfo\n }\n }\n}\n"],"names":["getFieldBySchemaPath","getFieldInfo","collections","schemaPath","fieldInfo","collectionsKey","collection","config"],"mappings":"AAEA,SAASA,oBAAoB,QAAQ,4BAA2B;AAEhE,OAAO,MAAMC,eAAe,CAACC,aAAyCC;IACpE,IAAIC,YAAY;IAChB,8CAA8C;IAC9C,IAAK,MAAMC,kBAAkBH,YAAa;QACxC,MAAMI,aAAaJ,WAAW,CAACG,eAAe;QAC9CD,YAAYJ,qBAAqBM,WAAWC,MAAM,EAAEJ;QACpD,IAAIC,WAAW;YACb,OAAOA;QACT;IACF;AACF,EAAC"}