@ai-stack/payloadcms 3.0.0-beta.95.2 → 3.2.3-beta

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 (195) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +25 -16
  3. package/dist/ai/models/anthropic/generateRichText.d.ts.map +1 -1
  4. package/dist/ai/models/anthropic/generateRichText.js +2 -2
  5. package/dist/ai/models/anthropic/generateRichText.js.map +1 -1
  6. package/dist/ai/models/anthropic/index.d.ts.map +1 -1
  7. package/dist/ai/models/anthropic/index.js +8 -32
  8. package/dist/ai/models/anthropic/index.js.map +1 -1
  9. package/dist/ai/models/elevenLabs/generateVoice.d.ts +1 -1
  10. package/dist/ai/models/elevenLabs/index.d.ts.map +1 -1
  11. package/dist/ai/models/elevenLabs/index.js +4 -3
  12. package/dist/ai/models/elevenLabs/index.js.map +1 -1
  13. package/dist/ai/models/openai/generateImage.d.ts +1 -1
  14. package/dist/ai/models/openai/generateImage.d.ts.map +1 -1
  15. package/dist/ai/models/openai/generateImage.js +0 -1
  16. package/dist/ai/models/openai/generateImage.js.map +1 -1
  17. package/dist/ai/models/openai/generateRichText.d.ts +1 -1
  18. package/dist/ai/models/openai/generateRichText.d.ts.map +1 -1
  19. package/dist/ai/models/openai/generateRichText.js +16 -9
  20. package/dist/ai/models/openai/generateRichText.js.map +1 -1
  21. package/dist/ai/models/openai/generateVoice.d.ts +1 -1
  22. package/dist/ai/models/openai/index.d.ts.map +1 -1
  23. package/dist/ai/models/openai/index.js +9 -35
  24. package/dist/ai/models/openai/index.js.map +1 -1
  25. package/dist/ai/prompts.d.ts +1 -1
  26. package/dist/ai/prompts.d.ts.map +1 -1
  27. package/dist/ai/prompts.js +6 -3
  28. package/dist/ai/prompts.js.map +1 -1
  29. package/dist/ai/schemas/lexicalJsonSchema.d.ts +371 -0
  30. package/dist/ai/schemas/lexicalJsonSchema.d.ts.map +1 -0
  31. package/dist/ai/schemas/lexicalJsonSchema.js +650 -0
  32. package/dist/ai/schemas/lexicalJsonSchema.js.map +1 -0
  33. package/dist/ai/utils/generateFileNameByPrompt.js.map +1 -1
  34. package/dist/ai/utils/systemGenerate.d.ts +5 -0
  35. package/dist/ai/utils/systemGenerate.d.ts.map +1 -0
  36. package/dist/ai/utils/{generateSeedPrompt.js → systemGenerate.js} +2 -2
  37. package/dist/ai/utils/systemGenerate.js.map +1 -0
  38. package/dist/collections/Instructions.d.ts +1 -1
  39. package/dist/collections/Instructions.d.ts.map +1 -1
  40. package/dist/collections/Instructions.js +177 -85
  41. package/dist/collections/Instructions.js.map +1 -1
  42. package/dist/defaults.d.ts +1 -1
  43. package/dist/defaults.d.ts.map +1 -1
  44. package/dist/defaults.js +1 -1
  45. package/dist/defaults.js.map +1 -1
  46. package/dist/endpoints/fetchFields.d.ts +3 -0
  47. package/dist/endpoints/fetchFields.d.ts.map +1 -0
  48. package/dist/endpoints/fetchFields.js +21 -0
  49. package/dist/endpoints/fetchFields.js.map +1 -0
  50. package/dist/endpoints/index.d.ts.map +1 -1
  51. package/dist/endpoints/index.js +12 -18
  52. package/dist/endpoints/index.js.map +1 -1
  53. package/dist/exports/fields.d.ts +2 -1
  54. package/dist/exports/fields.d.ts.map +1 -1
  55. package/dist/exports/fields.js +2 -1
  56. package/dist/exports/fields.js.map +1 -1
  57. package/dist/fields/ComposeField/ComposeField.d.ts +3 -0
  58. package/dist/fields/ComposeField/ComposeField.d.ts.map +1 -0
  59. package/dist/fields/ComposeField/ComposeField.js +24 -0
  60. package/dist/fields/ComposeField/ComposeField.js.map +1 -0
  61. package/dist/fields/LexicalEditor/ComposeFeatureComponent.d.ts +2 -0
  62. package/dist/fields/LexicalEditor/ComposeFeatureComponent.d.ts.map +1 -0
  63. package/dist/fields/LexicalEditor/ComposeFeatureComponent.js +28 -0
  64. package/dist/fields/LexicalEditor/ComposeFeatureComponent.js.map +1 -0
  65. package/dist/fields/LexicalEditor/feature.client.d.ts +4 -1
  66. package/dist/fields/LexicalEditor/feature.client.d.ts.map +1 -1
  67. package/dist/fields/LexicalEditor/feature.client.js +19 -7
  68. package/dist/fields/LexicalEditor/feature.client.js.map +1 -1
  69. package/dist/fields/PromptEditorField/PromptEditorField.d.ts +2 -2
  70. package/dist/fields/PromptEditorField/PromptEditorField.d.ts.map +1 -1
  71. package/dist/fields/PromptEditorField/PromptEditorField.js +4 -8
  72. package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
  73. package/dist/fields/SelectField/SelectField.d.ts +3 -2
  74. package/dist/fields/SelectField/SelectField.d.ts.map +1 -1
  75. package/dist/fields/SelectField/SelectField.js +2 -3
  76. package/dist/fields/SelectField/SelectField.js.map +1 -1
  77. package/dist/index.d.ts +1 -6
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +1 -6
  80. package/dist/index.js.map +1 -1
  81. package/dist/init.d.ts +2 -1
  82. package/dist/init.d.ts.map +1 -1
  83. package/dist/init.js +22 -21
  84. package/dist/init.js.map +1 -1
  85. package/dist/libraries/autocomplete/AutocompleteTextArea.js +9 -7
  86. package/dist/libraries/autocomplete/AutocompleteTextArea.js.map +1 -1
  87. package/dist/libraries/handlebars/asyncHandlebars.js +1 -1
  88. package/dist/libraries/handlebars/asyncHandlebars.js.map +1 -1
  89. package/dist/libraries/handlebars/helpers.js.map +1 -1
  90. package/dist/plugin.d.ts.map +1 -1
  91. package/dist/plugin.js +56 -41
  92. package/dist/plugin.js.map +1 -1
  93. package/dist/providers/FieldProvider/FieldProvider.d.ts +15 -0
  94. package/dist/providers/FieldProvider/FieldProvider.d.ts.map +1 -0
  95. package/dist/providers/FieldProvider/FieldProvider.js +33 -0
  96. package/dist/providers/FieldProvider/FieldProvider.js.map +1 -0
  97. package/dist/providers/FieldProvider/useFieldProps.d.ts +6 -0
  98. package/dist/providers/FieldProvider/useFieldProps.d.ts.map +1 -0
  99. package/dist/providers/FieldProvider/useFieldProps.js +12 -0
  100. package/dist/providers/FieldProvider/useFieldProps.js.map +1 -0
  101. package/dist/providers/InstructionsProvider/InstructionsProvider.d.ts +5 -1
  102. package/dist/providers/InstructionsProvider/InstructionsProvider.d.ts.map +1 -1
  103. package/dist/providers/InstructionsProvider/InstructionsProvider.js +12 -7
  104. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  105. package/dist/providers/InstructionsProvider/useInstructions.d.ts +2 -2
  106. package/dist/providers/InstructionsProvider/useInstructions.d.ts.map +1 -1
  107. package/dist/providers/InstructionsProvider/useInstructions.js +17 -4
  108. package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
  109. package/dist/types.d.ts +11 -41
  110. package/dist/types.d.ts.map +1 -1
  111. package/dist/types.js +1 -4
  112. package/dist/types.js.map +1 -1
  113. package/dist/ui/Compose/Compose.d.ts +9 -0
  114. package/dist/ui/Compose/Compose.d.ts.map +1 -0
  115. package/dist/ui/{Actions/Actions.js → Compose/Compose.js} +51 -40
  116. package/dist/ui/Compose/Compose.js.map +1 -0
  117. package/dist/ui/{Actions → Compose}/UndoRedoActions.d.ts.map +1 -1
  118. package/dist/ui/{Actions → Compose}/UndoRedoActions.js +15 -2
  119. package/dist/ui/Compose/UndoRedoActions.js.map +1 -0
  120. package/dist/ui/{Actions/actions.module.scss → Compose/compose.module.css} +7 -7
  121. package/dist/ui/{Actions → Compose}/hooks/menu/Item.d.ts +1 -1
  122. package/dist/ui/{Actions → Compose}/hooks/menu/Item.d.ts.map +1 -1
  123. package/dist/ui/{Actions → Compose}/hooks/menu/Item.js +2 -2
  124. package/dist/ui/{Actions → Compose}/hooks/menu/Item.js.map +1 -1
  125. package/dist/ui/Compose/hooks/menu/TranslateMenu.d.ts.map +1 -0
  126. package/dist/ui/{Actions → Compose}/hooks/menu/TranslateMenu.js +11 -11
  127. package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -0
  128. package/dist/ui/{Actions → Compose}/hooks/menu/items.d.ts +8 -8
  129. package/dist/ui/{Actions → Compose}/hooks/menu/items.d.ts.map +1 -1
  130. package/dist/ui/{Actions → Compose}/hooks/menu/items.js.map +1 -1
  131. package/dist/ui/{Actions → Compose}/hooks/menu/itemsMap.d.ts +1 -1
  132. package/dist/ui/Compose/hooks/menu/itemsMap.d.ts.map +1 -0
  133. package/dist/ui/{Actions → Compose}/hooks/menu/itemsMap.js +1 -2
  134. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -0
  135. package/dist/ui/{Actions → Compose}/hooks/menu/useMenu.d.ts +2 -1
  136. package/dist/ui/Compose/hooks/menu/useMenu.d.ts.map +1 -0
  137. package/dist/ui/{Actions → Compose}/hooks/menu/useMenu.js +16 -4
  138. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -0
  139. package/dist/ui/{Actions → Compose}/hooks/useGenerate.d.ts +4 -1
  140. package/dist/ui/Compose/hooks/useGenerate.d.ts.map +1 -0
  141. package/dist/ui/{Actions → Compose}/hooks/useGenerate.js +58 -34
  142. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -0
  143. package/dist/ui/Compose/hooks/useHistory.d.ts.map +1 -0
  144. package/dist/ui/{Actions → Compose}/hooks/useHistory.js +6 -3
  145. package/dist/ui/Compose/hooks/useHistory.js.map +1 -0
  146. package/dist/utilities/editorSchemaValidator.d.ts +3 -0
  147. package/dist/utilities/editorSchemaValidator.d.ts.map +1 -0
  148. package/dist/utilities/editorSchemaValidator.js +31 -0
  149. package/dist/utilities/editorSchemaValidator.js.map +1 -0
  150. package/dist/utilities/setSafeLexicalState.d.ts +2 -2
  151. package/dist/utilities/setSafeLexicalState.d.ts.map +1 -1
  152. package/dist/utilities/setSafeLexicalState.js +5 -12
  153. package/dist/utilities/setSafeLexicalState.js.map +1 -1
  154. package/dist/utilities/updateFieldsConfig.d.ts.map +1 -1
  155. package/dist/utilities/updateFieldsConfig.js +18 -6
  156. package/dist/utilities/updateFieldsConfig.js.map +1 -1
  157. package/package.json +35 -64
  158. package/dist/ai/schemas/lexical.schema.d.ts +0 -31
  159. package/dist/ai/schemas/lexical.schema.d.ts.map +0 -1
  160. package/dist/ai/schemas/lexical.schema.js +0 -102
  161. package/dist/ai/schemas/lexical.schema.js.map +0 -1
  162. package/dist/ai/utils/generateSeedPrompt.d.ts +0 -5
  163. package/dist/ai/utils/generateSeedPrompt.d.ts.map +0 -1
  164. package/dist/ai/utils/generateSeedPrompt.js.map +0 -1
  165. package/dist/fields/DescriptionField/DescriptionField.d.ts +0 -4
  166. package/dist/fields/DescriptionField/DescriptionField.d.ts.map +0 -1
  167. package/dist/fields/DescriptionField/DescriptionField.js +0 -18
  168. package/dist/fields/DescriptionField/DescriptionField.js.map +0 -1
  169. package/dist/fields/LexicalEditor/ActionsFeatureComponent.d.ts +0 -2
  170. package/dist/fields/LexicalEditor/ActionsFeatureComponent.d.ts.map +0 -1
  171. package/dist/fields/LexicalEditor/ActionsFeatureComponent.js +0 -15
  172. package/dist/fields/LexicalEditor/ActionsFeatureComponent.js.map +0 -1
  173. package/dist/ui/Actions/Actions.d.ts +0 -5
  174. package/dist/ui/Actions/Actions.d.ts.map +0 -1
  175. package/dist/ui/Actions/Actions.js.map +0 -1
  176. package/dist/ui/Actions/UndoRedoActions.js.map +0 -1
  177. package/dist/ui/Actions/hooks/menu/TranslateMenu.d.ts.map +0 -1
  178. package/dist/ui/Actions/hooks/menu/TranslateMenu.js.map +0 -1
  179. package/dist/ui/Actions/hooks/menu/itemsMap.d.ts.map +0 -1
  180. package/dist/ui/Actions/hooks/menu/itemsMap.js.map +0 -1
  181. package/dist/ui/Actions/hooks/menu/useMenu.d.ts.map +0 -1
  182. package/dist/ui/Actions/hooks/menu/useMenu.js.map +0 -1
  183. package/dist/ui/Actions/hooks/useGenerate.d.ts.map +0 -1
  184. package/dist/ui/Actions/hooks/useGenerate.js.map +0 -1
  185. package/dist/ui/Actions/hooks/useHistory.d.ts.map +0 -1
  186. package/dist/ui/Actions/hooks/useHistory.js.map +0 -1
  187. package/dist/utilities/jsonToZod.d.ts +0 -3
  188. package/dist/utilities/jsonToZod.d.ts.map +0 -1
  189. package/dist/utilities/jsonToZod.js +0 -33
  190. package/dist/utilities/jsonToZod.js.map +0 -1
  191. /package/dist/ui/{Actions → Compose}/UndoRedoActions.d.ts +0 -0
  192. /package/dist/ui/{Actions → Compose}/hooks/menu/TranslateMenu.d.ts +0 -0
  193. /package/dist/ui/{Actions → Compose}/hooks/menu/items.js +0 -0
  194. /package/dist/ui/{Actions → Compose}/hooks/menu/menu.module.scss +0 -0
  195. /package/dist/ui/{Actions → Compose}/hooks/useHistory.d.ts +0 -0
@@ -1,7 +1,8 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import { useField, useFieldProps } from '@payloadcms/ui';
3
+ import { useField } from '@payloadcms/ui';
4
4
  import React, { useEffect, useMemo, useState } from 'react';
5
+ import { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js';
5
6
  import { Compose, Proofread, Rephrase } from './items.js';
6
7
  import { menuItemsMap } from './itemsMap.js';
7
8
  import styles from './menu.module.scss';
@@ -44,13 +45,24 @@ export const useMenu = (menuEvents)=>{
44
45
  fieldType
45
46
  ]);
46
47
  const MemoizedActiveComponent = useMemo(()=>{
47
- return ({ isLoading })=>{
48
+ return ({ isLoading, stop })=>{
48
49
  const ActiveComponent = getActiveComponent(activeComponent);
49
50
  const activeItem = menuItemsMap.find((i)=>i.name === activeComponent);
50
51
  return /*#__PURE__*/ _jsx(ActiveComponent, {
51
- disabled: isLoading,
52
52
  hideIcon: true,
53
- onClick: menuEvents[`on${activeComponent}`],
53
+ onClick: (data)=>{
54
+ if (!isLoading) {
55
+ const trigger = menuEvents[`on${activeComponent}`];
56
+ if (typeof trigger === 'function') {
57
+ trigger(data);
58
+ } else {
59
+ console.error('No trigger found for', activeComponent);
60
+ }
61
+ } else {
62
+ stop();
63
+ }
64
+ },
65
+ title: isLoading ? 'Click to stop' : activeItem.name,
54
66
  children: isLoading && activeItem.loadingText
55
67
  });
56
68
  };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/useMenu.tsx"],"sourcesContent":["'use client'\n\nimport { useField } from '@payloadcms/ui'\nimport React, { useEffect, useMemo, useState } from 'react'\n\nimport type { ActionMenuItems, UseMenuEvents } from '../../../../types.js'\n\nimport { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js'\nimport { Compose, Proofread, Rephrase } from './items.js'\nimport { menuItemsMap } from './itemsMap.js'\nimport styles from './menu.module.scss'\n\nconst getActiveComponent = (ac) => {\n switch (ac) {\n case 'Proofread':\n return Proofread\n case 'Rephrase':\n return Rephrase\n case 'Compose':\n return Compose\n default:\n return Rephrase\n }\n}\n\nexport const useMenu = (menuEvents: UseMenuEvents) => {\n const { type: fieldType, path: pathFromContext } = useFieldProps()\n const field = useField({ path: pathFromContext })\n const [activeComponent, setActiveComponent] = useState<ActionMenuItems>('Rephrase')\n\n const { initialValue, value } = field\n\n useEffect(() => {\n if (!value) {\n setActiveComponent('Compose')\n return\n }\n\n if (menuItemsMap.some((i) => i.excludedFor?.includes(fieldType))) {\n setActiveComponent('Compose')\n return\n }\n\n if (typeof value === 'string' && value !== initialValue) {\n setActiveComponent('Proofread')\n } else {\n setActiveComponent('Rephrase')\n }\n }, [initialValue, value, fieldType])\n\n const MemoizedActiveComponent = useMemo(() => {\n return ({ isLoading, stop }) => {\n const ActiveComponent = getActiveComponent(activeComponent)\n const activeItem = menuItemsMap.find((i) => i.name === activeComponent)\n return (\n <ActiveComponent\n hideIcon\n onClick={(data) => {\n if (!isLoading) {\n const trigger = menuEvents[`on${activeComponent}`]\n if (typeof trigger === 'function') {\n trigger(data)\n } else {\n console.error('No trigger found for', activeComponent)\n }\n } else {\n stop()\n }\n }}\n title={isLoading ? 'Click to stop' : activeItem.name}\n >\n {isLoading && activeItem.loadingText}\n </ActiveComponent>\n )\n }\n }, [activeComponent, menuEvents])\n\n const filteredMenuItems = useMemo(\n () =>\n menuItemsMap.filter((i) => i.name !== activeComponent && !i.excludedFor?.includes(fieldType)),\n [activeComponent, fieldType],\n )\n\n const MemoizedMenu = useMemo(() => {\n return ({ isLoading, onClose }) => (\n <div className={styles.menu}>\n {filteredMenuItems.map((i) => {\n const Action = i.component\n return (\n <Action\n disabled={isLoading}\n key={i.name}\n onClick={(data) => {\n if (i.name !== 'Settings') {\n setActiveComponent(i.name)\n }\n\n menuEvents[`on${i.name}`](data)\n onClose()\n }}\n >\n {isLoading && i.loadingText}\n </Action>\n )\n })}\n </div>\n )\n }, [filteredMenuItems, menuEvents])\n\n return {\n ActiveComponent: MemoizedActiveComponent,\n Menu: MemoizedMenu,\n }\n}\n"],"names":["useField","React","useEffect","useMemo","useState","useFieldProps","Compose","Proofread","Rephrase","menuItemsMap","styles","getActiveComponent","ac","useMenu","menuEvents","type","fieldType","path","pathFromContext","field","activeComponent","setActiveComponent","initialValue","value","some","i","excludedFor","includes","MemoizedActiveComponent","isLoading","stop","ActiveComponent","activeItem","find","name","hideIcon","onClick","data","trigger","console","error","title","loadingText","filteredMenuItems","filter","MemoizedMenu","onClose","div","className","menu","map","Action","component","disabled","Menu"],"mappings":"AAAA;;AAEA,SAASA,QAAQ,QAAQ,iBAAgB;AACzC,OAAOC,SAASC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAO;AAI3D,SAASC,aAAa,QAAQ,uDAAsD;AACpF,SAASC,OAAO,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,aAAY;AACzD,SAASC,YAAY,QAAQ,gBAAe;AAC5C,OAAOC,YAAY,qBAAoB;AAEvC,MAAMC,qBAAqB,CAACC;IAC1B,OAAQA;QACN,KAAK;YACH,OAAOL;QACT,KAAK;YACH,OAAOC;QACT,KAAK;YACH,OAAOF;QACT;YACE,OAAOE;IACX;AACF;AAEA,OAAO,MAAMK,UAAU,CAACC;IACtB,MAAM,EAAEC,MAAMC,SAAS,EAAEC,MAAMC,eAAe,EAAE,GAAGb;IACnD,MAAMc,QAAQnB,SAAS;QAAEiB,MAAMC;IAAgB;IAC/C,MAAM,CAACE,iBAAiBC,mBAAmB,GAAGjB,SAA0B;IAExE,MAAM,EAAEkB,YAAY,EAAEC,KAAK,EAAE,GAAGJ;IAEhCjB,UAAU;QACR,IAAI,CAACqB,OAAO;YACVF,mBAAmB;YACnB;QACF;QAEA,IAAIZ,aAAae,IAAI,CAAC,CAACC,IAAMA,EAAEC,WAAW,EAAEC,SAASX,aAAa;YAChEK,mBAAmB;YACnB;QACF;QAEA,IAAI,OAAOE,UAAU,YAAYA,UAAUD,cAAc;YACvDD,mBAAmB;QACrB,OAAO;YACLA,mBAAmB;QACrB;IACF,GAAG;QAACC;QAAcC;QAAOP;KAAU;IAEnC,MAAMY,0BAA0BzB,QAAQ;QACtC,OAAO,CAAC,EAAE0B,SAAS,EAAEC,IAAI,EAAE;YACzB,MAAMC,kBAAkBpB,mBAAmBS;YAC3C,MAAMY,aAAavB,aAAawB,IAAI,CAAC,CAACR,IAAMA,EAAES,IAAI,KAAKd;YACvD,qBACE,KAACW;gBACCI,QAAQ;gBACRC,SAAS,CAACC;oBACR,IAAI,CAACR,WAAW;wBACd,MAAMS,UAAUxB,UAAU,CAAC,CAAC,EAAE,EAAEM,iBAAiB,CAAC;wBAClD,IAAI,OAAOkB,YAAY,YAAY;4BACjCA,QAAQD;wBACV,OAAO;4BACLE,QAAQC,KAAK,CAAC,wBAAwBpB;wBACxC;oBACF,OAAO;wBACLU;oBACF;gBACF;gBACAW,OAAOZ,YAAY,kBAAkBG,WAAWE,IAAI;0BAEnDL,aAAaG,WAAWU,WAAW;;QAG1C;IACF,GAAG;QAACtB;QAAiBN;KAAW;IAEhC,MAAM6B,oBAAoBxC,QACxB,IACEM,aAAamC,MAAM,CAAC,CAACnB,IAAMA,EAAES,IAAI,KAAKd,mBAAmB,CAACK,EAAEC,WAAW,EAAEC,SAASX,aACpF;QAACI;QAAiBJ;KAAU;IAG9B,MAAM6B,eAAe1C,QAAQ;QAC3B,OAAO,CAAC,EAAE0B,SAAS,EAAEiB,OAAO,EAAE,iBAC5B,KAACC;gBAAIC,WAAWtC,OAAOuC,IAAI;0BACxBN,kBAAkBO,GAAG,CAAC,CAACzB;oBACtB,MAAM0B,SAAS1B,EAAE2B,SAAS;oBAC1B,qBACE,KAACD;wBACCE,UAAUxB;wBAEVO,SAAS,CAACC;4BACR,IAAIZ,EAAES,IAAI,KAAK,YAAY;gCACzBb,mBAAmBI,EAAES,IAAI;4BAC3B;4BAEApB,UAAU,CAAC,CAAC,EAAE,EAAEW,EAAES,IAAI,EAAE,CAAC,CAACG;4BAC1BS;wBACF;kCAECjB,aAAaJ,EAAEiB,WAAW;uBAVtBjB,EAAES,IAAI;gBAajB;;IAGN,GAAG;QAACS;QAAmB7B;KAAW;IAElC,OAAO;QACLiB,iBAAiBH;QACjB0B,MAAMT;IACR;AACF,EAAC"}
@@ -3,9 +3,12 @@ type ActionCallbackParams = {
3
3
  action: ActionMenuItems;
4
4
  params?: unknown;
5
5
  };
6
- export declare const useGenerate: () => {
6
+ export declare const useGenerate: ({ instructionId }: {
7
+ instructionId: string;
8
+ }) => {
7
9
  generate: (options?: ActionCallbackParams) => Promise<void | Response>;
8
10
  isLoading: boolean;
11
+ stop: () => void;
9
12
  };
10
13
  export {};
11
14
  //# sourceMappingURL=useGenerate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGenerate.d.ts","sourceRoot":"","sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,mBAAmB,CAAA;AAa1E,KAAK,oBAAoB,GAAG;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAEzE,eAAO,MAAM,WAAW,sBAAuB;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE;yBA0LnD,oBAAoB;;;CA2BxC,CAAA"}
@@ -1,34 +1,53 @@
1
1
  import { useEditorConfigContext } from '@payloadcms/richtext-lexical/client';
2
- import { useConfig, useDocumentInfo, useField, useFieldProps, useForm, useLocale } from '@payloadcms/ui';
2
+ import { useConfig, useField, useForm, useLocale } from '@payloadcms/ui';
3
+ import { jsonSchema } from 'ai';
3
4
  import { useCompletion, experimental_useObject as useObject } from 'ai/react';
4
- import { useCallback, useEffect } from 'react';
5
- import { PLUGIN_API_ENDPOINT_GENERATE, PLUGIN_API_ENDPOINT_GENERATE_UPLOAD, PLUGIN_INSTRUCTIONS_TABLE } from '../../../defaults.js';
6
- import { useInstructions } from '../../../providers/InstructionsProvider/useInstructions.js';
7
- import { getFieldBySchemaPath } from '../../../utilities/getFieldBySchemaPath.js';
8
- import { jsonSchemaToZod } from '../../../utilities/jsonToZod.js';
5
+ import { useCallback, useEffect, useMemo } from 'react';
6
+ import { PLUGIN_API_ENDPOINT_GENERATE, PLUGIN_API_ENDPOINT_GENERATE_UPLOAD, PLUGIN_INSTRUCTIONS_TABLE, PLUGIN_NAME } from '../../../defaults.js';
7
+ import { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js';
8
+ import { editorSchemaValidator } from '../../../utilities/editorSchemaValidator.js';
9
9
  import { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js';
10
10
  import { useHistory } from './useHistory.js';
11
- //TODO: DONATION IDEA - Add a url to donate in cli when user installs the plugin and uses it for couple of times.
12
- export const useGenerate = ()=>{
13
- const { type, path: pathFromContext, schemaPath } = useFieldProps();
11
+ export const useGenerate = ({ instructionId })=>{
12
+ const { type, path: pathFromContext } = useFieldProps();
14
13
  const editorConfigContext = useEditorConfigContext();
15
14
  const { editor } = editorConfigContext;
16
- const { docConfig } = useDocumentInfo();
15
+ const { config } = useConfig();
16
+ const { routes: { api }, serverURL } = config;
17
17
  const { setValue } = useField({
18
18
  path: pathFromContext
19
19
  });
20
20
  const { set: setHistory } = useHistory();
21
- const { id: instructionId } = useInstructions({
22
- path: schemaPath
23
- });
24
21
  const { getData } = useForm();
25
22
  const localFromContext = useLocale();
26
23
  const { config: { collections } } = useConfig();
27
24
  const collection = collections.find((collection)=>collection.slug === PLUGIN_INSTRUCTIONS_TABLE);
28
- const { custom: { editorConfig } = {} } = collection.admin;
29
- const { schema: DocumentSchema = {} } = editorConfig || {};
30
- const lexicalZodSchema = jsonSchemaToZod(DocumentSchema);
31
- const { isLoading: loadingObject, object, stop, submit } = useObject({
25
+ const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin;
26
+ const { schema: editorSchema = {} } = editorConfig;
27
+ const memoizedValidator = useMemo(()=>{
28
+ return editorSchemaValidator(editorSchema);
29
+ }, [
30
+ editorSchema
31
+ ]);
32
+ const memoizedSchema = useMemo(()=>jsonSchema(editorSchema, {
33
+ validate: (value)=>{
34
+ const isValid = memoizedValidator(value);
35
+ if (isValid) {
36
+ return {
37
+ success: true,
38
+ value
39
+ };
40
+ } else {
41
+ return {
42
+ error: new Error('Invalid schema'),
43
+ success: false
44
+ };
45
+ }
46
+ }
47
+ }), [
48
+ memoizedValidator
49
+ ]);
50
+ const { isLoading: loadingObject, object, stop: objectStop, submit } = useObject({
32
51
  api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,
33
52
  onError: (error)=>{
34
53
  console.error('Error generating object:', error);
@@ -41,23 +60,22 @@ export const useGenerate = ()=>{
41
60
  console.log('onFinish: result ', result);
42
61
  }
43
62
  },
44
- schema: lexicalZodSchema
63
+ schema: memoizedSchema
45
64
  });
46
65
  useEffect(()=>{
47
66
  if (!object) return;
48
67
  requestAnimationFrame(()=>{
49
- if (!editor) {
50
- setValue(object);
51
- return;
68
+ const validateObject = memoizedSchema.validate(object);
69
+ if (validateObject?.success) {
70
+ setSafeLexicalState(object, editor);
52
71
  }
53
- // Currently this is being used as setValue for RichText component does not render new changes right away.
54
- setSafeLexicalState(object, editor);
55
72
  });
56
73
  }, [
57
- object
74
+ object,
75
+ editorSchema
58
76
  ]);
59
- const { complete, completion, isLoading: loadingCompletion } = useCompletion({
60
- api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,
77
+ const { complete, completion, isLoading: loadingCompletion, stop: completionStop } = useCompletion({
78
+ api: `${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE}`,
61
79
  onError: (error)=>{
62
80
  console.error('Error generating text:', error);
63
81
  },
@@ -112,14 +130,12 @@ export const useGenerate = ()=>{
112
130
  ]);
113
131
  const generateUpload = useCallback(async ()=>{
114
132
  const doc = getData();
115
- const fieldInfo = getFieldBySchemaPath(docConfig, schemaPath);
116
- return fetch(`/api${PLUGIN_API_ENDPOINT_GENERATE_UPLOAD}`, {
133
+ return fetch(`${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE_UPLOAD}`, {
117
134
  body: JSON.stringify({
118
135
  doc,
119
136
  locale: localFromContext?.code,
120
137
  options: {
121
- instructionId,
122
- uploadCollectionSlug: fieldInfo.relationTo || 'media'
138
+ instructionId
123
139
  }
124
140
  }),
125
141
  credentials: 'include',
@@ -140,13 +156,12 @@ export const useGenerate = ()=>{
140
156
  }
141
157
  return uploadResponse;
142
158
  }).catch((error)=>{
143
- console.error('Error generating your upload', error);
159
+ console.error('Error generating or setting your upload, please set it manually if its saved in your media files: ', error);
144
160
  });
145
161
  }, [
146
162
  getData,
147
163
  localFromContext?.code,
148
- instructionId,
149
- setValue
164
+ instructionId
150
165
  ]);
151
166
  const generate = useCallback(async (options)=>{
152
167
  if (type === 'richText') {
@@ -167,9 +182,18 @@ export const useGenerate = ()=>{
167
182
  streamText,
168
183
  type
169
184
  ]);
185
+ const stop = useCallback(()=>{
186
+ console.log('Stopping...');
187
+ objectStop();
188
+ completionStop();
189
+ }, [
190
+ objectStop,
191
+ completionStop
192
+ ]);
170
193
  return {
171
194
  generate,
172
- isLoading: loadingCompletion || loadingObject
195
+ isLoading: loadingCompletion || loadingObject,
196
+ stop
173
197
  };
174
198
  };
175
199
 
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"sourcesContent":["import { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { useConfig, useField, useForm, useLocale } from '@payloadcms/ui'\nimport { jsonSchema } from 'ai'\nimport { useCompletion, experimental_useObject as useObject } from 'ai/react'\nimport { useCallback, useEffect, useMemo } from 'react'\n\nimport type { ActionMenuItems, GenerateTextarea } from '../../../types.js'\n\nimport {\n PLUGIN_API_ENDPOINT_GENERATE,\n PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n PLUGIN_INSTRUCTIONS_TABLE,\n PLUGIN_NAME,\n} from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { editorSchemaValidator } from '../../../utilities/editorSchemaValidator.js'\nimport { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js'\nimport { useHistory } from './useHistory.js'\n\ntype ActionCallbackParams = { action: ActionMenuItems; params?: unknown }\n\nexport const useGenerate = ({ instructionId }: { instructionId: string }) => {\n const { type, path: pathFromContext } = useFieldProps()\n const editorConfigContext = useEditorConfigContext()\n\n const { editor } = editorConfigContext\n\n const { config } = useConfig()\n const {\n routes: { api },\n serverURL,\n } = config\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const { set: setHistory } = useHistory()\n\n const { getData } = useForm()\n const localFromContext = useLocale()\n const {\n config: { collections },\n } = useConfig()\n\n const collection = collections.find((collection) => collection.slug === PLUGIN_INSTRUCTIONS_TABLE)\n const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin\n const { schema: editorSchema = {} } = editorConfig\n\n const memoizedValidator = useMemo(() => {\n return editorSchemaValidator(editorSchema)\n }, [editorSchema])\n\n const memoizedSchema = useMemo(\n () =>\n jsonSchema(editorSchema, {\n validate: (value) => {\n const isValid = memoizedValidator(value)\n\n if (isValid) {\n return {\n success: true,\n value,\n }\n } else {\n return {\n error: new Error('Invalid schema'),\n success: false,\n }\n }\n },\n }),\n [memoizedValidator],\n )\n\n const {\n isLoading: loadingObject,\n object,\n stop: objectStop,\n submit,\n } = useObject({\n api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,\n onError: (error) => {\n console.error('Error generating object:', error)\n },\n onFinish: (result) => {\n if (result.object) {\n setHistory(result.object)\n setValue(result.object)\n } else {\n console.log('onFinish: result ', result)\n }\n },\n schema: memoizedSchema,\n })\n\n useEffect(() => {\n if (!object) return\n\n requestAnimationFrame(() => {\n const validateObject = memoizedSchema.validate(object)\n if (validateObject?.success) {\n setSafeLexicalState(object, editor)\n }\n })\n }, [object, editorSchema])\n\n const {\n complete,\n completion,\n isLoading: loadingCompletion,\n stop: completionStop,\n } = useCompletion({\n api: `${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE}`,\n onError: (error) => {\n console.error('Error generating text:', error)\n },\n onFinish: (prompt, result) => {\n setHistory(result)\n },\n streamProtocol: 'data',\n })\n\n useEffect(() => {\n if (!completion) return\n\n requestAnimationFrame(() => {\n setValue(completion)\n })\n }, [completion])\n\n const streamObject = useCallback(\n ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n const options = {\n action,\n actionParams: params,\n instructionId,\n }\n\n submit({\n doc,\n locale: localFromContext?.code,\n options,\n })\n },\n [getData, localFromContext?.code, instructionId],\n )\n\n const streamText = useCallback(\n async ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n\n const options = {\n action,\n actionParams: params,\n instructionId,\n }\n\n await complete('', {\n body: {\n doc,\n locale: localFromContext?.code,\n options,\n },\n })\n },\n [getData, localFromContext?.code, instructionId],\n )\n\n const generateUpload = useCallback(async () => {\n const doc = getData()\n\n return fetch(`${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE_UPLOAD}`, {\n body: JSON.stringify({\n doc,\n locale: localFromContext?.code,\n options: {\n instructionId,\n },\n } satisfies Parameters<GenerateTextarea>[0]),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n .then(async (uploadResponse) => {\n if (uploadResponse.ok) {\n const { result } = await uploadResponse.json()\n if (!result) throw new Error('generateUpload: Something went wrong')\n\n setValue(result?.id)\n setHistory(result?.id)\n } else {\n const { errors = [] } = await uploadResponse.json()\n const errStr = errors.map((error) => error.message).join(', ')\n throw new Error(errStr)\n }\n return uploadResponse\n })\n .catch((error) => {\n console.error('Error generating or setting your upload, please set it manually if its saved in your media files: ', error)\n })\n }, [getData, localFromContext?.code, instructionId])\n\n const generate = useCallback(\n async (options?: ActionCallbackParams) => {\n if (type === 'richText') {\n return streamObject(options)\n }\n\n if (['text', 'textarea'].includes(type)) {\n return streamText(options)\n }\n\n if (type === 'upload') {\n return generateUpload()\n }\n },\n [generateUpload, streamObject, streamText, type],\n )\n\n const stop = useCallback(() => {\n console.log('Stopping...')\n objectStop()\n completionStop()\n }, [objectStop, completionStop])\n\n return {\n generate,\n isLoading: loadingCompletion || loadingObject,\n stop\n }\n}\n"],"names":["useEditorConfigContext","useConfig","useField","useForm","useLocale","jsonSchema","useCompletion","experimental_useObject","useObject","useCallback","useEffect","useMemo","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","useFieldProps","editorSchemaValidator","setSafeLexicalState","useHistory","useGenerate","instructionId","type","path","pathFromContext","editorConfigContext","editor","config","routes","api","serverURL","setValue","set","setHistory","getData","localFromContext","collections","collection","find","slug","custom","editorConfig","admin","schema","editorSchema","memoizedValidator","memoizedSchema","validate","value","isValid","success","error","Error","isLoading","loadingObject","object","stop","objectStop","submit","onError","console","onFinish","result","log","requestAnimationFrame","validateObject","complete","completion","loadingCompletion","completionStop","prompt","streamProtocol","streamObject","action","params","doc","options","actionParams","locale","code","streamText","body","generateUpload","fetch","JSON","stringify","credentials","headers","method","then","uploadResponse","ok","json","id","errors","errStr","map","message","join","catch","generate","includes"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHistory.d.ts","sourceRoot":"","sources":["../../../../src/ui/Compose/hooks/useHistory.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,UAAU;;;;;gBAkEZ,GAAG;;CAoEb,CAAA"}
@@ -1,7 +1,8 @@
1
1
  'use client';
2
- import { useDocumentInfo, useField, useFieldProps } from '@payloadcms/ui';
2
+ import { useDocumentInfo, useField } from '@payloadcms/ui';
3
3
  import { useCallback, useEffect } from 'react';
4
4
  import { PLUGIN_NAME } from '../../../defaults.js';
5
+ import { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js';
5
6
  const STORAGE_KEY = `${PLUGIN_NAME}-fields-history`;
6
7
  export const useHistory = ()=>{
7
8
  const { id } = useDocumentInfo();
@@ -23,7 +24,9 @@ export const useHistory = ()=>{
23
24
  }
24
25
  }, []);
25
26
  const saveToLocalStorage = useCallback((newGlobalHistory)=>{
26
- localStorage.setItem(STORAGE_KEY, JSON.stringify(newGlobalHistory));
27
+ if (typeof localStorage !== 'undefined') {
28
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(newGlobalHistory));
29
+ }
27
30
  }, []);
28
31
  // Clear previous history
29
32
  const clearHistory = useCallback(()=>{
@@ -31,7 +34,7 @@ export const useHistory = ()=>{
31
34
  ...getLatestHistory()
32
35
  };
33
36
  Object.keys(latestHistory).forEach((k)=>{
34
- if (!k.startsWith(id.toString())) {
37
+ if (!k.startsWith(id?.toString())) {
35
38
  delete latestHistory[k];
36
39
  }
37
40
  });
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/ui/Compose/hooks/useHistory.ts"],"sourcesContent":["'use client'\n\nimport { useDocumentInfo, useField } from '@payloadcms/ui'\nimport { useCallback, useEffect } from 'react'\n\nimport { PLUGIN_NAME } from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\n\nconst STORAGE_KEY = `${PLUGIN_NAME}-fields-history`\n\ninterface HistoryState {\n [path: string]: {\n currentIndex: number\n history: any[]\n }\n}\n\nexport const useHistory = () => {\n const { id } = useDocumentInfo()\n const { path: pathFromContext, schemaPath } = useFieldProps()\n const { value: currentFieldValue } = useField<string>({\n path: pathFromContext,\n })\n\n const fieldKey = `${id}.${schemaPath}`\n\n const getLatestHistory = useCallback((): HistoryState => {\n try {\n // This condition is applied, as it was somehow triggering on server side\n if (typeof localStorage !== 'undefined') {\n return JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}')\n }\n return {}\n } catch (e) {\n console.error('Error parsing history:', e)\n return {}\n }\n }, [])\n\n const saveToLocalStorage = useCallback((newGlobalHistory: HistoryState) => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(newGlobalHistory))\n }\n }, [])\n\n // Clear previous history\n const clearHistory = useCallback(() => {\n const latestHistory = { ...getLatestHistory() }\n Object.keys(latestHistory).forEach((k) => {\n if (!k.startsWith(id?.toString())) {\n delete latestHistory[k]\n }\n })\n saveToLocalStorage(latestHistory)\n }, [id, fieldKey, getLatestHistory, saveToLocalStorage])\n\n useEffect(() => {\n // This is applied to clear out the document history which is not currently in use\n clearHistory()\n\n const latestHistory = getLatestHistory()\n const { currentIndex, history } = latestHistory[fieldKey] || {\n currentIndex: -1,\n history: [],\n }\n\n let newIndex = currentIndex\n if (currentIndex == -1) {\n newIndex = 0\n if (currentFieldValue) {\n history[newIndex] = currentFieldValue\n }\n }\n\n const newGlobalHistory = {\n ...latestHistory,\n [fieldKey]: { currentIndex: newIndex, history },\n }\n\n saveToLocalStorage(newGlobalHistory)\n }, [fieldKey])\n\n const set = useCallback(\n (data: any) => {\n const latestHistory = getLatestHistory()\n const { currentIndex, history } = latestHistory[fieldKey] || {\n currentIndex: -1,\n history: [],\n }\n const newHistory = [...history.slice(0, currentIndex + 1), data]\n const newGlobalHistory = {\n ...latestHistory,\n [fieldKey]: { currentIndex: newHistory.length - 1, history: newHistory },\n }\n saveToLocalStorage(newGlobalHistory)\n return data\n },\n [fieldKey, getLatestHistory, saveToLocalStorage],\n )\n\n const undo = useCallback(() => {\n const latestHistory = getLatestHistory()\n const { currentIndex, history } = latestHistory[fieldKey] || { currentIndex: -1, history: [] }\n if (currentIndex > 0) {\n const newIndex = currentIndex - 1\n const newValue = history[newIndex]\n const newGlobalHistory = {\n ...latestHistory,\n [fieldKey]: { currentIndex: newIndex, history },\n }\n saveToLocalStorage(newGlobalHistory)\n return newValue\n }\n return undefined\n }, [fieldKey, getLatestHistory, saveToLocalStorage])\n\n const redo = useCallback(() => {\n const latestHistory = getLatestHistory()\n const { currentIndex, history } = latestHistory[fieldKey] || { currentIndex: -1, history: [] }\n if (currentIndex < history.length - 1) {\n const newIndex = currentIndex + 1\n const newValue = history[newIndex]\n const newGlobalHistory = {\n ...latestHistory,\n [fieldKey]: { currentIndex: newIndex, history },\n }\n saveToLocalStorage(newGlobalHistory)\n return newValue\n }\n return undefined\n }, [fieldKey, getLatestHistory, saveToLocalStorage])\n\n const getLatestFieldHistory = useCallback(() => {\n const latestHistory = getLatestHistory()\n return latestHistory[fieldKey] || { currentIndex: -1, history: [] }\n }, [getLatestHistory, fieldKey])\n\n const fieldHistory = getLatestFieldHistory()\n\n const canUndo = fieldHistory.currentIndex > 0\n const canRedo = fieldHistory.currentIndex < fieldHistory.history.length - 1\n const currentValue = fieldHistory.history[fieldHistory.currentIndex]\n\n return {\n canRedo,\n canUndo,\n currentValue,\n redo,\n set,\n undo,\n }\n}\n"],"names":["useDocumentInfo","useField","useCallback","useEffect","PLUGIN_NAME","useFieldProps","STORAGE_KEY","useHistory","id","path","pathFromContext","schemaPath","value","currentFieldValue","fieldKey","getLatestHistory","localStorage","JSON","parse","getItem","e","console","error","saveToLocalStorage","newGlobalHistory","setItem","stringify","clearHistory","latestHistory","Object","keys","forEach","k","startsWith","toString","currentIndex","history","newIndex","set","data","newHistory","slice","length","undo","newValue","undefined","redo","getLatestFieldHistory","fieldHistory","canUndo","canRedo","currentValue"],"mappings":"AAAA;AAEA,SAASA,eAAe,EAAEC,QAAQ,QAAQ,iBAAgB;AAC1D,SAASC,WAAW,EAAEC,SAAS,QAAQ,QAAO;AAE9C,SAASC,WAAW,QAAQ,uBAAsB;AAClD,SAASC,aAAa,QAAQ,oDAAmD;AAEjF,MAAMC,cAAc,GAAGF,YAAY,eAAe,CAAC;AASnD,OAAO,MAAMG,aAAa;IACxB,MAAM,EAAEC,EAAE,EAAE,GAAGR;IACf,MAAM,EAAES,MAAMC,eAAe,EAAEC,UAAU,EAAE,GAAGN;IAC9C,MAAM,EAAEO,OAAOC,iBAAiB,EAAE,GAAGZ,SAAiB;QACpDQ,MAAMC;IACR;IAEA,MAAMI,WAAW,GAAGN,GAAG,CAAC,EAAEG,YAAY;IAEtC,MAAMI,mBAAmBb,YAAY;QACnC,IAAI;YACF,yEAAyE;YACzE,IAAI,OAAOc,iBAAiB,aAAa;gBACvC,OAAOC,KAAKC,KAAK,CAACF,aAAaG,OAAO,CAACb,gBAAgB;YACzD;YACA,OAAO,CAAC;QACV,EAAE,OAAOc,GAAG;YACVC,QAAQC,KAAK,CAAC,0BAA0BF;YACxC,OAAO,CAAC;QACV;IACF,GAAG,EAAE;IAEL,MAAMG,qBAAqBrB,YAAY,CAACsB;QACtC,IAAI,OAAOR,iBAAiB,aAAa;YACvCA,aAAaS,OAAO,CAACnB,aAAaW,KAAKS,SAAS,CAACF;QACnD;IACF,GAAG,EAAE;IAEL,yBAAyB;IACzB,MAAMG,eAAezB,YAAY;QAC/B,MAAM0B,gBAAgB;YAAE,GAAGb,kBAAkB;QAAC;QAC9Cc,OAAOC,IAAI,CAACF,eAAeG,OAAO,CAAC,CAACC;YAClC,IAAI,CAACA,EAAEC,UAAU,CAACzB,IAAI0B,aAAa;gBACjC,OAAON,aAAa,CAACI,EAAE;YACzB;QACF;QACAT,mBAAmBK;IACrB,GAAG;QAACpB;QAAIM;QAAUC;QAAkBQ;KAAmB;IAEvDpB,UAAU;QACR,kFAAkF;QAClFwB;QAEA,MAAMC,gBAAgBb;QACtB,MAAM,EAAEoB,YAAY,EAAEC,OAAO,EAAE,GAAGR,aAAa,CAACd,SAAS,IAAI;YAC3DqB,cAAc,CAAC;YACfC,SAAS,EAAE;QACb;QAEA,IAAIC,WAAWF;QACf,IAAIA,gBAAgB,CAAC,GAAG;YACtBE,WAAW;YACX,IAAIxB,mBAAmB;gBACrBuB,OAAO,CAACC,SAAS,GAAGxB;YACtB;QACF;QAEA,MAAMW,mBAAmB;YACvB,GAAGI,aAAa;YAChB,CAACd,SAAS,EAAE;gBAAEqB,cAAcE;gBAAUD;YAAQ;QAChD;QAEAb,mBAAmBC;IACrB,GAAG;QAACV;KAAS;IAEb,MAAMwB,MAAMpC,YACV,CAACqC;QACC,MAAMX,gBAAgBb;QACtB,MAAM,EAAEoB,YAAY,EAAEC,OAAO,EAAE,GAAGR,aAAa,CAACd,SAAS,IAAI;YAC3DqB,cAAc,CAAC;YACfC,SAAS,EAAE;QACb;QACA,MAAMI,aAAa;eAAIJ,QAAQK,KAAK,CAAC,GAAGN,eAAe;YAAII;SAAK;QAChE,MAAMf,mBAAmB;YACvB,GAAGI,aAAa;YAChB,CAACd,SAAS,EAAE;gBAAEqB,cAAcK,WAAWE,MAAM,GAAG;gBAAGN,SAASI;YAAW;QACzE;QACAjB,mBAAmBC;QACnB,OAAOe;IACT,GACA;QAACzB;QAAUC;QAAkBQ;KAAmB;IAGlD,MAAMoB,OAAOzC,YAAY;QACvB,MAAM0B,gBAAgBb;QACtB,MAAM,EAAEoB,YAAY,EAAEC,OAAO,EAAE,GAAGR,aAAa,CAACd,SAAS,IAAI;YAAEqB,cAAc,CAAC;YAAGC,SAAS,EAAE;QAAC;QAC7F,IAAID,eAAe,GAAG;YACpB,MAAME,WAAWF,eAAe;YAChC,MAAMS,WAAWR,OAAO,CAACC,SAAS;YAClC,MAAMb,mBAAmB;gBACvB,GAAGI,aAAa;gBAChB,CAACd,SAAS,EAAE;oBAAEqB,cAAcE;oBAAUD;gBAAQ;YAChD;YACAb,mBAAmBC;YACnB,OAAOoB;QACT;QACA,OAAOC;IACT,GAAG;QAAC/B;QAAUC;QAAkBQ;KAAmB;IAEnD,MAAMuB,OAAO5C,YAAY;QACvB,MAAM0B,gBAAgBb;QACtB,MAAM,EAAEoB,YAAY,EAAEC,OAAO,EAAE,GAAGR,aAAa,CAACd,SAAS,IAAI;YAAEqB,cAAc,CAAC;YAAGC,SAAS,EAAE;QAAC;QAC7F,IAAID,eAAeC,QAAQM,MAAM,GAAG,GAAG;YACrC,MAAML,WAAWF,eAAe;YAChC,MAAMS,WAAWR,OAAO,CAACC,SAAS;YAClC,MAAMb,mBAAmB;gBACvB,GAAGI,aAAa;gBAChB,CAACd,SAAS,EAAE;oBAAEqB,cAAcE;oBAAUD;gBAAQ;YAChD;YACAb,mBAAmBC;YACnB,OAAOoB;QACT;QACA,OAAOC;IACT,GAAG;QAAC/B;QAAUC;QAAkBQ;KAAmB;IAEnD,MAAMwB,wBAAwB7C,YAAY;QACxC,MAAM0B,gBAAgBb;QACtB,OAAOa,aAAa,CAACd,SAAS,IAAI;YAAEqB,cAAc,CAAC;YAAGC,SAAS,EAAE;QAAC;IACpE,GAAG;QAACrB;QAAkBD;KAAS;IAE/B,MAAMkC,eAAeD;IAErB,MAAME,UAAUD,aAAab,YAAY,GAAG;IAC5C,MAAMe,UAAUF,aAAab,YAAY,GAAGa,aAAaZ,OAAO,CAACM,MAAM,GAAG;IAC1E,MAAMS,eAAeH,aAAaZ,OAAO,CAACY,aAAab,YAAY,CAAC;IAEpE,OAAO;QACLe;QACAD;QACAE;QACAL;QACAR;QACAK;IACF;AACF,EAAC"}
@@ -0,0 +1,3 @@
1
+ import ajvModule from 'ajv';
2
+ export declare const editorSchemaValidator: (schema: any) => ajvModule.ValidateFunction<unknown>;
3
+ //# sourceMappingURL=editorSchemaValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editorSchemaValidator.d.ts","sourceRoot":"","sources":["../../src/utilities/editorSchemaValidator.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,KAAK,CAAA;AAE3B,eAAO,MAAM,qBAAqB,sDAkCjC,CAAA"}
@@ -0,0 +1,31 @@
1
+ import ajvModule from 'ajv';
2
+ export const editorSchemaValidator = (schema)=>{
3
+ const modifiedSchema = JSON.parse(JSON.stringify(schema), function(key, value) {
4
+ if (key === 'required' && Array.isArray(value)) {
5
+ // Safely access properties from parent
6
+ const parent = this;
7
+ const parentProperties = parent.properties;
8
+ if (parentProperties) {
9
+ const requiredFields = [
10
+ 'type'
11
+ ]; // type is always required
12
+ // Check if this node has children property
13
+ if ('children' in parentProperties) {
14
+ requiredFields.push('children');
15
+ }
16
+ // Check if this node has text property
17
+ if ('text' in parentProperties) {
18
+ requiredFields.push('text');
19
+ }
20
+ const filteredRequired = value.filter((field)=>requiredFields.includes(field));
21
+ return filteredRequired.length ? filteredRequired : undefined;
22
+ }
23
+ }
24
+ return value;
25
+ });
26
+ const Ajv = ajvModule.default;
27
+ const ajv = new Ajv();
28
+ return ajv.compile(modifiedSchema);
29
+ };
30
+
31
+ //# sourceMappingURL=editorSchemaValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/editorSchemaValidator.ts"],"sourcesContent":["import ajvModule from 'ajv'\n\nexport const editorSchemaValidator = (schema) => {\n const modifiedSchema = JSON.parse(\n JSON.stringify(schema),\n function (key: string, value: any) {\n if (key === 'required' && Array.isArray(value)) {\n // Safely access properties from parent\n const parent = this as { properties?: Record<string, any> };\n const parentProperties = parent.properties;\n\n if (parentProperties) {\n const requiredFields = ['type']; // type is always required\n\n // Check if this node has children property\n if ('children' in parentProperties) {\n requiredFields.push('children');\n }\n\n // Check if this node has text property\n if ('text' in parentProperties) {\n requiredFields.push('text');\n }\n\n const filteredRequired = value.filter((field) => requiredFields.includes(field));\n return filteredRequired.length ? filteredRequired : undefined;\n }\n }\n return value;\n },\n );\n\n const Ajv = ajvModule.default\n const ajv = new Ajv()\n\n return ajv.compile(modifiedSchema)\n}"],"names":["ajvModule","editorSchemaValidator","schema","modifiedSchema","JSON","parse","stringify","key","value","Array","isArray","parent","parentProperties","properties","requiredFields","push","filteredRequired","filter","field","includes","length","undefined","Ajv","default","ajv","compile"],"mappings":"AAAA,OAAOA,eAAe,MAAK;AAE3B,OAAO,MAAMC,wBAAwB,CAACC;IACpC,MAAMC,iBAAiBC,KAAKC,KAAK,CAC/BD,KAAKE,SAAS,CAACJ,SACf,SAAUK,GAAW,EAAEC,KAAU;QAC/B,IAAID,QAAQ,cAAcE,MAAMC,OAAO,CAACF,QAAQ;YAC9C,uCAAuC;YACvC,MAAMG,SAAS,IAAI;YACnB,MAAMC,mBAAmBD,OAAOE,UAAU;YAE1C,IAAID,kBAAkB;gBACpB,MAAME,iBAAiB;oBAAC;iBAAO,EAAE,0BAA0B;gBAE3D,2CAA2C;gBAC3C,IAAI,cAAcF,kBAAkB;oBAClCE,eAAeC,IAAI,CAAC;gBACtB;gBAEA,uCAAuC;gBACvC,IAAI,UAAUH,kBAAkB;oBAC9BE,eAAeC,IAAI,CAAC;gBACtB;gBAEA,MAAMC,mBAAmBR,MAAMS,MAAM,CAAC,CAACC,QAAUJ,eAAeK,QAAQ,CAACD;gBACzE,OAAOF,iBAAiBI,MAAM,GAAGJ,mBAAmBK;YACtD;QACF;QACA,OAAOb;IACT;IAGF,MAAMc,MAAMtB,UAAUuB,OAAO;IAC7B,MAAMC,MAAM,IAAIF;IAEhB,OAAOE,IAAIC,OAAO,CAACtB;AACrB,EAAC"}
@@ -1,5 +1,5 @@
1
- import { LexicalEditor } from 'lexical';
2
- type EditorAction = 'update' | 'replace';
1
+ import type { LexicalEditor } from 'lexical';
2
+ type EditorAction = 'replace' | 'update';
3
3
  export declare const setSafeLexicalState: (state: any, editorInstance: LexicalEditor, action?: EditorAction) => void;
4
4
  export {};
5
5
  //# sourceMappingURL=setSafeLexicalState.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setSafeLexicalState.d.ts","sourceRoot":"","sources":["../../src/utilities/setSafeLexicalState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAIvC,KAAK,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAA;AAExC,eAAO,MAAM,mBAAmB,+BAEd,aAAa,WACrB,YAAY,SAoBrB,CAAA"}
1
+ {"version":3,"file":"setSafeLexicalState.d.ts","sourceRoot":"","sources":["../../src/utilities/setSafeLexicalState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C,KAAK,YAAY,GAAG,SAAS,GAAG,QAAQ,CAAA;AAExC,eAAO,MAAM,mBAAmB,+BAEd,aAAa,WACrB,YAAY,SAYrB,CAAA"}
@@ -1,19 +1,12 @@
1
- import { $getRoot } from 'lexical';
2
1
  export const setSafeLexicalState = (state, editorInstance, action = 'replace')=>{
3
2
  try {
4
3
  const editorState = editorInstance.parseEditorState(state);
5
- if (editorState.isEmpty()) return;
6
- editorInstance.update(()=>{
7
- const root = $getRoot();
8
- root.clear() //TODO: this is hack to prevent reconciliation error - find a way
9
- ;
10
- editorInstance.setEditorState(editorState);
11
- }, {
12
- discrete: true
13
- });
4
+ if (editorState.isEmpty()) {
5
+ return;
6
+ }
7
+ editorInstance.setEditorState(editorState);
14
8
  } catch (e) {
15
- // console.error('Error setting object:', e)
16
- // setValue(object) //TODO: This breaks the editor find a better way to handle objects that are not valid
9
+ // console.error('Shh....:', e)
17
10
  }
18
11
  };
19
12
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/setSafeLexicalState.ts"],"sourcesContent":["import { LexicalEditor } from 'lexical'\n\nimport { $getRoot } from 'lexical'\n\ntype EditorAction = 'update' | 'replace'\n\nexport const setSafeLexicalState = (\n state,\n editorInstance: LexicalEditor,\n action: EditorAction = 'replace',\n) => {\n try {\n const editorState = editorInstance.parseEditorState(state)\n if (editorState.isEmpty()) return\n\n editorInstance.update(\n () => {\n const root = $getRoot()\n root.clear() //TODO: this is hack to prevent reconciliation error - find a way\n editorInstance.setEditorState(editorState)\n },\n {\n discrete: true,\n },\n )\n } catch (e) {\n // console.error('Error setting object:', e)\n // setValue(object) //TODO: This breaks the editor find a better way to handle objects that are not valid\n }\n}\n"],"names":["$getRoot","setSafeLexicalState","state","editorInstance","action","editorState","parseEditorState","isEmpty","update","root","clear","setEditorState","discrete","e"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,UAAS;AAIlC,OAAO,MAAMC,sBAAsB,CACjCC,OACAC,gBACAC,SAAuB,SAAS;IAEhC,IAAI;QACF,MAAMC,cAAcF,eAAeG,gBAAgB,CAACJ;QACpD,IAAIG,YAAYE,OAAO,IAAI;QAE3BJ,eAAeK,MAAM,CACnB;YACE,MAAMC,OAAOT;YACbS,KAAKC,KAAK,GAAG,iEAAiE;;YAC9EP,eAAeQ,cAAc,CAACN;QAChC,GACA;YACEO,UAAU;QACZ;IAEJ,EAAE,OAAOC,GAAG;IACV,4CAA4C;IAC5C,yGAAyG;IAC3G;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,\n editorInstance: LexicalEditor,\n action: EditorAction = 'replace',\n) => {\n try {\n const editorState = editorInstance.parseEditorState(state)\n if (editorState.isEmpty()) {\n return\n }\n\n editorInstance.setEditorState(editorState)\n } catch (e) {\n // console.error('Shh....:', e)\n }\n}\n"],"names":["setSafeLexicalState","state","editorInstance","action","editorState","parseEditorState","isEmpty","setEditorState","e"],"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,GAAG;IACV,+BAA+B;IACjC;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"updateFieldsConfig.d.ts","sourceRoot":"","sources":["../../src/utilities/updateFieldsConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,UAAU,kBAAkB;IAC1B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,uBAAuB,EAAE,gBAAgB,CAAA;CAC1C;AAED,eAAO,MAAM,kBAAkB,qBAAsB,gBAAgB,KAAG,kBAiFvE,CAAA"}
1
+ {"version":3,"file":"updateFieldsConfig.d.ts","sourceRoot":"","sources":["../../src/utilities/updateFieldsConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,UAAU,kBAAkB;IAC1B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,uBAAuB,EAAE,gBAAgB,CAAA;CAC1C;AAED,eAAO,MAAM,kBAAkB,qBAAsB,gBAAgB,KAAG,kBAkGvE,CAAA"}
@@ -3,7 +3,8 @@ export const updateFieldsConfig = (collectionConfig)=>{
3
3
  function updateField(field, parentPath = '') {
4
4
  const currentPath = parentPath ? `${parentPath}.${field.name}` : field.name;
5
5
  const currentSchemaPath = `${collectionConfig.slug}.${currentPath}`;
6
- if (field.admin?.disabled || field.admin?.readOnly || field.admin?.hidden) {
6
+ // Disabled fields/ field types
7
+ if (field.admin?.disabled || field.admin?.readOnly || field.admin?.hidden || field.type === 'row') {
7
8
  return field;
8
9
  }
9
10
  // Map field path for global fieldInstructionsMap to load related instructions
@@ -19,7 +20,8 @@ export const updateFieldsConfig = (collectionConfig)=>{
19
20
  ...schemaPathMap,
20
21
  [currentSchemaPath]: {
21
22
  type: field.type,
22
- label: field.label || field.name
23
+ label: field.label || field.name,
24
+ relationTo: field.relationTo
23
25
  }
24
26
  };
25
27
  }
@@ -29,13 +31,21 @@ export const updateFieldsConfig = (collectionConfig)=>{
29
31
  'textarea',
30
32
  'upload'
31
33
  ].includes(field.type)) {
34
+ let customField = {};
35
+ // Custom fields don't fully adhere to the Payload schema, making it difficult to
36
+ // determine which components support injecting ComposeField as a Description.
37
+ if (field.admin?.components?.Field || field.admin?.components?.Description) {
38
+ // TODO: Do something?
39
+ customField = {};
40
+ }
32
41
  return {
33
42
  ...field,
34
43
  admin: {
35
44
  ...field.admin,
36
45
  components: {
37
46
  ...field.admin?.components || {},
38
- Description: '@ai-stack/payloadcms/fields#DescriptionField'
47
+ Description: '@ai-stack/payloadcms/fields#ComposeField',
48
+ ...customField
39
49
  }
40
50
  }
41
51
  };
@@ -49,10 +59,12 @@ export const updateFieldsConfig = (collectionConfig)=>{
49
59
  if (field.tabs) {
50
60
  return {
51
61
  ...field,
52
- tabs: field.tabs.map((tab)=>({
62
+ tabs: field.tabs.map((tab)=>{
63
+ return {
53
64
  ...tab,
54
- fields: tab.fields.map((subField)=>updateField(subField, currentPath))
55
- }))
65
+ fields: tab.fields.map((subField)=>updateField(subField, tab.name))
66
+ };
67
+ })
56
68
  };
57
69
  }
58
70
  if (field.blocks) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/updateFieldsConfig.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\ninterface UpdateFieldsConfig {\n schemaPathMap: Record<string, string>\n updatedCollectionConfig: CollectionConfig\n}\n\nexport const updateFieldsConfig = (collectionConfig: CollectionConfig): UpdateFieldsConfig => {\n let schemaPathMap = {}\n function updateField(field: any, parentPath = ''): any {\n const currentPath = parentPath ? `${parentPath}.${field.name}` : field.name\n const currentSchemaPath = `${collectionConfig.slug}.${currentPath}`\n\n if (field.admin?.disabled || field.admin?.readOnly || field.admin?.hidden) {\n return field\n }\n\n // Map field path for global fieldInstructionsMap to load related instructions\n // This is done due to save extra API call to get instructions when Field components are loaded in admin\n // Doing is will only call instructions data when user clicks on settings\n if (['richText', 'text', 'textarea', 'upload'].includes(field.type)) {\n schemaPathMap = {\n ...schemaPathMap,\n [currentSchemaPath]: {\n type: field.type,\n label: field.label || field.name,\n },\n }\n }\n\n // Inject AI actions, richText is not included here as it has to be explicitly defined by user\n if (['text', 'textarea', 'upload'].includes(field.type)) {\n return {\n ...field,\n admin: {\n ...field.admin,\n components: {\n ...(field.admin?.components || {}),\n Description: '@ai-stack/payloadcms/fields#DescriptionField',\n // Description: DescriptionField({\n // Description: field.admin?.components?.Description,\n // }),\n },\n },\n }\n }\n\n if (field.fields) {\n return {\n ...field,\n fields: field.fields.map((subField: any) => updateField(subField, currentPath)),\n }\n }\n\n if (field.tabs) {\n return {\n ...field,\n tabs: field.tabs.map((tab: any) => ({\n ...tab,\n fields: tab.fields.map((subField: any) => updateField(subField, currentPath)),\n })),\n }\n }\n\n if (field.blocks) {\n return {\n ...field,\n blocks: field.blocks.map((block: any) => ({\n ...block,\n fields: block.fields.map((subField: any) =>\n updateField(subField, `${currentPath}.${block.slug}`),\n ),\n })),\n }\n }\n\n return field\n }\n\n const updatedCollectionConfig = {\n ...collectionConfig,\n fields: collectionConfig.fields.map((field) => updateField(field)),\n }\n\n return {\n schemaPathMap,\n updatedCollectionConfig,\n }\n}\n"],"names":["updateFieldsConfig","collectionConfig","schemaPathMap","updateField","field","parentPath","currentPath","name","currentSchemaPath","slug","admin","disabled","readOnly","hidden","includes","type","label","components","Description","fields","map","subField","tabs","tab","blocks","block","updatedCollectionConfig"],"mappings":"AAOA,OAAO,MAAMA,qBAAqB,CAACC;IACjC,IAAIC,gBAAgB,CAAC;IACrB,SAASC,YAAYC,KAAU,EAAEC,aAAa,EAAE;QAC9C,MAAMC,cAAcD,aAAa,CAAC,EAAEA,WAAW,CAAC,EAAED,MAAMG,IAAI,CAAC,CAAC,GAAGH,MAAMG,IAAI;QAC3E,MAAMC,oBAAoB,CAAC,EAAEP,iBAAiBQ,IAAI,CAAC,CAAC,EAAEH,YAAY,CAAC;QAEnE,IAAIF,MAAMM,KAAK,EAAEC,YAAYP,MAAMM,KAAK,EAAEE,YAAYR,MAAMM,KAAK,EAAEG,QAAQ;YACzE,OAAOT;QACT;QAEA,8EAA8E;QAC9E,wGAAwG;QACxG,yEAAyE;QACzE,IAAI;YAAC;YAAY;YAAQ;YAAY;SAAS,CAACU,QAAQ,CAACV,MAAMW,IAAI,GAAG;YACnEb,gBAAgB;gBACd,GAAGA,aAAa;gBAChB,CAACM,kBAAkB,EAAE;oBACnBO,MAAMX,MAAMW,IAAI;oBAChBC,OAAOZ,MAAMY,KAAK,IAAIZ,MAAMG,IAAI;gBAClC;YACF;QACF;QAEA,8FAA8F;QAC9F,IAAI;YAAC;YAAQ;YAAY;SAAS,CAACO,QAAQ,CAACV,MAAMW,IAAI,GAAG;YACvD,OAAO;gBACL,GAAGX,KAAK;gBACRM,OAAO;oBACL,GAAGN,MAAMM,KAAK;oBACdO,YAAY;wBACV,GAAIb,MAAMM,KAAK,EAAEO,cAAc,CAAC,CAAC;wBACjCC,aAAa;oBAIf;gBACF;YACF;QACF;QAEA,IAAId,MAAMe,MAAM,EAAE;YAChB,OAAO;gBACL,GAAGf,KAAK;gBACRe,QAAQf,MAAMe,MAAM,CAACC,GAAG,CAAC,CAACC,WAAkBlB,YAAYkB,UAAUf;YACpE;QACF;QAEA,IAAIF,MAAMkB,IAAI,EAAE;YACd,OAAO;gBACL,GAAGlB,KAAK;gBACRkB,MAAMlB,MAAMkB,IAAI,CAACF,GAAG,CAAC,CAACG,MAAc,CAAA;wBAClC,GAAGA,GAAG;wBACNJ,QAAQI,IAAIJ,MAAM,CAACC,GAAG,CAAC,CAACC,WAAkBlB,YAAYkB,UAAUf;oBAClE,CAAA;YACF;QACF;QAEA,IAAIF,MAAMoB,MAAM,EAAE;YAChB,OAAO;gBACL,GAAGpB,KAAK;gBACRoB,QAAQpB,MAAMoB,MAAM,CAACJ,GAAG,CAAC,CAACK,QAAgB,CAAA;wBACxC,GAAGA,KAAK;wBACRN,QAAQM,MAAMN,MAAM,CAACC,GAAG,CAAC,CAACC,WACxBlB,YAAYkB,UAAU,CAAC,EAAEf,YAAY,CAAC,EAAEmB,MAAMhB,IAAI,CAAC,CAAC;oBAExD,CAAA;YACF;QACF;QAEA,OAAOL;IACT;IAEA,MAAMsB,0BAA0B;QAC9B,GAAGzB,gBAAgB;QACnBkB,QAAQlB,iBAAiBkB,MAAM,CAACC,GAAG,CAAC,CAAChB,QAAUD,YAAYC;IAC7D;IAEA,OAAO;QACLF;QACAwB;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/updateFieldsConfig.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\ninterface UpdateFieldsConfig {\n schemaPathMap: Record<string, string>\n updatedCollectionConfig: CollectionConfig\n}\n\nexport const updateFieldsConfig = (collectionConfig: CollectionConfig): UpdateFieldsConfig => {\n let schemaPathMap = {}\n\n function updateField(field: any, parentPath = ''): any {\n const currentPath = parentPath ? `${parentPath}.${field.name}` : field.name\n const currentSchemaPath = `${collectionConfig.slug}.${currentPath}`\n\n // Disabled fields/ field types\n if (\n field.admin?.disabled ||\n field.admin?.readOnly ||\n field.admin?.hidden ||\n field.type === 'row'\n ) {\n return field\n }\n\n // Map field path for global fieldInstructionsMap to load related instructions\n // This is done due to save extra API call to get instructions when Field components are loaded in admin\n // Doing is will only call instructions data when user clicks on settings\n if (['richText', 'text', 'textarea', 'upload'].includes(field.type)) {\n schemaPathMap = {\n ...schemaPathMap,\n [currentSchemaPath]: {\n type: field.type,\n label: field.label || field.name,\n relationTo: field.relationTo,\n },\n }\n }\n\n // Inject AI actions, richText is not included here as it has to be explicitly defined by user\n if (['text', 'textarea', 'upload'].includes(field.type)) {\n let customField = {}\n\n // Custom fields don't fully adhere to the Payload schema, making it difficult to\n // determine which components support injecting ComposeField as a Description.\n if (field.admin?.components?.Field || field.admin?.components?.Description) {\n // TODO: Do something?\n customField = {}\n }\n\n return {\n ...field,\n admin: {\n ...field.admin,\n components: {\n ...(field.admin?.components || {}),\n Description: '@ai-stack/payloadcms/fields#ComposeField',\n ...customField,\n },\n },\n }\n }\n\n if (field.fields) {\n return {\n ...field,\n fields: field.fields.map((subField: any) => updateField(subField, currentPath)),\n }\n }\n\n if (field.tabs) {\n return {\n ...field,\n tabs: field.tabs.map((tab: any) => {\n return {\n ...tab,\n fields: tab.fields.map((subField: any) => updateField(subField, tab.name)),\n }\n }),\n }\n }\n\n if (field.blocks) {\n return {\n ...field,\n blocks: field.blocks.map((block: any) => ({\n ...block,\n fields: block.fields.map((subField: any) =>\n updateField(subField, `${currentPath}.${block.slug}`),\n ),\n })),\n }\n }\n\n return field\n }\n\n const updatedCollectionConfig = {\n ...collectionConfig,\n fields: collectionConfig.fields.map((field) => updateField(field)),\n }\n\n return {\n schemaPathMap,\n updatedCollectionConfig,\n }\n}\n"],"names":["updateFieldsConfig","collectionConfig","schemaPathMap","updateField","field","parentPath","currentPath","name","currentSchemaPath","slug","admin","disabled","readOnly","hidden","type","includes","label","relationTo","customField","components","Field","Description","fields","map","subField","tabs","tab","blocks","block","updatedCollectionConfig"],"mappings":"AAOA,OAAO,MAAMA,qBAAqB,CAACC;IACjC,IAAIC,gBAAgB,CAAC;IAErB,SAASC,YAAYC,KAAU,EAAEC,aAAa,EAAE;QAC9C,MAAMC,cAAcD,aAAa,GAAGA,WAAW,CAAC,EAAED,MAAMG,IAAI,EAAE,GAAGH,MAAMG,IAAI;QAC3E,MAAMC,oBAAoB,GAAGP,iBAAiBQ,IAAI,CAAC,CAAC,EAAEH,aAAa;QAEnE,+BAA+B;QAC/B,IACEF,MAAMM,KAAK,EAAEC,YACbP,MAAMM,KAAK,EAAEE,YACbR,MAAMM,KAAK,EAAEG,UACbT,MAAMU,IAAI,KAAK,OACf;YACA,OAAOV;QACT;QAEA,8EAA8E;QAC9E,wGAAwG;QACxG,yEAAyE;QACzE,IAAI;YAAC;YAAY;YAAQ;YAAY;SAAS,CAACW,QAAQ,CAACX,MAAMU,IAAI,GAAG;YACnEZ,gBAAgB;gBACd,GAAGA,aAAa;gBAChB,CAACM,kBAAkB,EAAE;oBACnBM,MAAMV,MAAMU,IAAI;oBAChBE,OAAOZ,MAAMY,KAAK,IAAIZ,MAAMG,IAAI;oBAChCU,YAAYb,MAAMa,UAAU;gBAC9B;YACF;QACF;QAEA,8FAA8F;QAC9F,IAAI;YAAC;YAAQ;YAAY;SAAS,CAACF,QAAQ,CAACX,MAAMU,IAAI,GAAG;YACvD,IAAII,cAAc,CAAC;YAEnB,iFAAiF;YACjF,8EAA8E;YAC9E,IAAId,MAAMM,KAAK,EAAES,YAAYC,SAAShB,MAAMM,KAAK,EAAES,YAAYE,aAAa;gBAC1E,sBAAsB;gBACtBH,cAAc,CAAC;YACjB;YAEA,OAAO;gBACL,GAAGd,KAAK;gBACRM,OAAO;oBACL,GAAGN,MAAMM,KAAK;oBACdS,YAAY;wBACV,GAAIf,MAAMM,KAAK,EAAES,cAAc,CAAC,CAAC;wBACjCE,aAAa;wBACb,GAAGH,WAAW;oBAChB;gBACF;YACF;QACF;QAEA,IAAId,MAAMkB,MAAM,EAAE;YAChB,OAAO;gBACL,GAAGlB,KAAK;gBACRkB,QAAQlB,MAAMkB,MAAM,CAACC,GAAG,CAAC,CAACC,WAAkBrB,YAAYqB,UAAUlB;YACpE;QACF;QAEA,IAAIF,MAAMqB,IAAI,EAAE;YACd,OAAO;gBACL,GAAGrB,KAAK;gBACRqB,MAAMrB,MAAMqB,IAAI,CAACF,GAAG,CAAC,CAACG;oBACpB,OAAO;wBACL,GAAGA,GAAG;wBACNJ,QAAQI,IAAIJ,MAAM,CAACC,GAAG,CAAC,CAACC,WAAkBrB,YAAYqB,UAAUE,IAAInB,IAAI;oBAC1E;gBACF;YACF;QACF;QAEA,IAAIH,MAAMuB,MAAM,EAAE;YAChB,OAAO;gBACL,GAAGvB,KAAK;gBACRuB,QAAQvB,MAAMuB,MAAM,CAACJ,GAAG,CAAC,CAACK,QAAgB,CAAA;wBACxC,GAAGA,KAAK;wBACRN,QAAQM,MAAMN,MAAM,CAACC,GAAG,CAAC,CAACC,WACxBrB,YAAYqB,UAAU,GAAGlB,YAAY,CAAC,EAAEsB,MAAMnB,IAAI,EAAE;oBAExD,CAAA;YACF;QACF;QAEA,OAAOL;IACT;IAEA,MAAMyB,0BAA0B;QAC9B,GAAG5B,gBAAgB;QACnBqB,QAAQrB,iBAAiBqB,MAAM,CAACC,GAAG,CAAC,CAACnB,QAAUD,YAAYC;IAC7D;IAEA,OAAO;QACLF;QACA2B;IACF;AACF,EAAC"}