payload-intl 1.2.2 → 1.2.4

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 (171) hide show
  1. package/README.md +21 -18
  2. package/dist/components/MessageFormField.d.ts +15 -0
  3. package/dist/components/MessageFormField.d.ts.map +1 -0
  4. package/dist/components/{MessageController.js → MessageFormField.js} +5 -3
  5. package/dist/components/MessageFormField.js.map +1 -0
  6. package/dist/components/MessagesForm.d.ts +3 -1
  7. package/dist/components/MessagesForm.d.ts.map +1 -1
  8. package/dist/components/MessagesForm.js +25 -36
  9. package/dist/components/MessagesForm.js.map +1 -1
  10. package/dist/components/{MessageFormContext.d.ts → MessagesFormProvider.d.ts} +6 -2
  11. package/dist/components/MessagesFormProvider.d.ts.map +1 -0
  12. package/dist/components/{MessageFormContext.js → MessagesFormProvider.js} +8 -4
  13. package/dist/components/MessagesFormProvider.js.map +1 -0
  14. package/dist/components/MessagesLink.js +5 -2
  15. package/dist/components/MessagesLink.js.map +1 -1
  16. package/dist/components/MessagesView.d.ts +1 -1
  17. package/dist/components/MessagesView.d.ts.map +1 -1
  18. package/dist/components/MessagesView.js +13 -4
  19. package/dist/components/MessagesView.js.map +1 -1
  20. package/dist/components/actions/CopyMessages.d.ts +2 -0
  21. package/dist/components/actions/CopyMessages.d.ts.map +1 -0
  22. package/dist/components/actions/{Move.js → CopyMessages.js} +6 -6
  23. package/dist/components/actions/CopyMessages.js.map +1 -0
  24. package/dist/components/actions/JsonImport.d.ts +4 -1
  25. package/dist/components/actions/JsonImport.d.ts.map +1 -1
  26. package/dist/components/actions/JsonImport.js +7 -25
  27. package/dist/components/actions/JsonImport.js.map +1 -1
  28. package/dist/components/hooks/useHtmlLexicalAdapter.d.ts +12 -0
  29. package/dist/components/hooks/useHtmlLexicalAdapter.d.ts.map +1 -0
  30. package/dist/components/hooks/useHtmlLexicalAdapter.js +63 -0
  31. package/dist/components/hooks/useHtmlLexicalAdapter.js.map +1 -0
  32. package/dist/components/hooks/useMessagesFormSubmit.d.ts +11 -0
  33. package/dist/components/hooks/useMessagesFormSubmit.d.ts.map +1 -0
  34. package/dist/components/hooks/useMessagesFormSubmit.js +44 -0
  35. package/dist/components/hooks/useMessagesFormSubmit.js.map +1 -0
  36. package/dist/components/inputs/FieldWrapper.d.ts +9 -0
  37. package/dist/components/inputs/FieldWrapper.d.ts.map +1 -0
  38. package/dist/components/inputs/FieldWrapper.js +24 -0
  39. package/dist/components/inputs/FieldWrapper.js.map +1 -0
  40. package/dist/components/inputs/{InputWrapper.module.css → FieldWrapper.module.css} +2 -12
  41. package/dist/components/inputs/LexicalInput.d.ts +2 -13
  42. package/dist/components/inputs/LexicalInput.d.ts.map +1 -1
  43. package/dist/components/inputs/LexicalInput.js +4 -63
  44. package/dist/components/inputs/LexicalInput.js.map +1 -1
  45. package/dist/components/inputs/MessageInput.d.ts +6 -3
  46. package/dist/components/inputs/MessageInput.d.ts.map +1 -1
  47. package/dist/components/inputs/MessageInput.js +47 -43
  48. package/dist/components/inputs/MessageInput.js.map +1 -1
  49. package/dist/components/inputs/MessageInput.module.css +23 -4
  50. package/dist/components/inputs/ReferencePopover.d.ts +7 -0
  51. package/dist/components/inputs/ReferencePopover.d.ts.map +1 -0
  52. package/dist/components/inputs/ReferencePopover.js +42 -0
  53. package/dist/components/inputs/ReferencePopover.js.map +1 -0
  54. package/dist/components/inputs/ReferencePopover.module.css +70 -0
  55. package/dist/components/inputs/SingleLinePlugin.d.ts +2 -0
  56. package/dist/components/inputs/SingleLinePlugin.d.ts.map +1 -0
  57. package/dist/components/inputs/SingleLinePlugin.js +24 -0
  58. package/dist/components/inputs/SingleLinePlugin.js.map +1 -0
  59. package/dist/components/inputs/variables/VariableChip.d.ts.map +1 -1
  60. package/dist/components/inputs/variables/VariableChip.js +31 -32
  61. package/dist/components/inputs/variables/VariableChip.js.map +1 -1
  62. package/dist/components/inputs/variables/VariableChip.module.css +3 -3
  63. package/dist/components/inputs/variables/VariableSuggestion.d.ts +4 -0
  64. package/dist/components/inputs/variables/VariableSuggestion.d.ts.map +1 -0
  65. package/dist/components/inputs/variables/VariableSuggestion.js +24 -0
  66. package/dist/components/inputs/variables/VariableSuggestion.js.map +1 -0
  67. package/dist/components/inputs/variables/editors/PluralVariableEditor.d.ts.map +1 -1
  68. package/dist/components/inputs/variables/editors/PluralVariableEditor.js +62 -60
  69. package/dist/components/inputs/variables/editors/PluralVariableEditor.js.map +1 -1
  70. package/dist/components/inputs/variables/editors/PluralVariableEditor.module.css +4 -4
  71. package/dist/components/inputs/variables/editors/TemporalVariableEditor.d.ts +11 -0
  72. package/dist/components/inputs/variables/editors/TemporalVariableEditor.d.ts.map +1 -0
  73. package/dist/components/inputs/variables/editors/{DateVariableEditor.js → TemporalVariableEditor.js} +3 -3
  74. package/dist/components/inputs/variables/editors/TemporalVariableEditor.js.map +1 -0
  75. package/dist/components/inputs/variables/pickers/NumericVariableEditor.d.ts +7 -0
  76. package/dist/components/inputs/variables/pickers/{NumericVariablePicker.d.ts.map → NumericVariableEditor.d.ts.map} +1 -1
  77. package/dist/components/inputs/variables/pickers/{NumericVariablePicker.js → NumericVariableEditor.js} +15 -9
  78. package/dist/components/inputs/variables/pickers/NumericVariableEditor.js.map +1 -0
  79. package/dist/components/inputs/variables/pickers/{NumericVariablePicker.module.css → NumericVariableEditor.module.css} +3 -3
  80. package/dist/components/inputs/variables/pickers/TemporalVariablePicker.d.ts +7 -0
  81. package/dist/components/inputs/variables/pickers/TemporalVariablePicker.d.ts.map +1 -0
  82. package/dist/components/inputs/variables/pickers/TemporalVariablePicker.js +57 -0
  83. package/dist/components/inputs/variables/pickers/TemporalVariablePicker.js.map +1 -0
  84. package/dist/components/inputs/variables/pickers/{TemporalElementEditor.module.css → TemporalVariablePicker.module.css} +3 -3
  85. package/dist/components/layout/GroupStatusDot.d.ts +6 -0
  86. package/dist/components/layout/GroupStatusDot.d.ts.map +1 -0
  87. package/dist/components/layout/GroupStatusDot.js +24 -0
  88. package/dist/components/layout/GroupStatusDot.js.map +1 -0
  89. package/dist/components/layout/MessageField.d.ts +2 -1
  90. package/dist/components/layout/MessageField.d.ts.map +1 -1
  91. package/dist/components/layout/MessageField.js +52 -33
  92. package/dist/components/layout/MessageField.js.map +1 -1
  93. package/dist/components/layout/MessageField.module.css +21 -10
  94. package/dist/components/layout/MessagesTabs.d.ts.map +1 -1
  95. package/dist/components/layout/MessagesTabs.js +3 -5
  96. package/dist/components/layout/MessagesTabs.js.map +1 -1
  97. package/dist/components/layout/MessagesTree.d.ts +1 -1
  98. package/dist/components/layout/MessagesTree.d.ts.map +1 -1
  99. package/dist/components/layout/MessagesTree.js +33 -43
  100. package/dist/components/layout/MessagesTree.js.map +1 -1
  101. package/dist/components/layout/MessagesTree.module.css +10 -5
  102. package/dist/components/layout/StatusDot.d.ts +7 -0
  103. package/dist/components/layout/StatusDot.d.ts.map +1 -0
  104. package/dist/components/layout/StatusDot.js +12 -0
  105. package/dist/components/layout/StatusDot.js.map +1 -0
  106. package/dist/components/layout/StatusDot.module.css +16 -0
  107. package/dist/const.d.ts +2 -2
  108. package/dist/const.js +1 -1
  109. package/dist/entities.d.ts +1 -1
  110. package/dist/entities.js +1 -1
  111. package/dist/index.d.ts +2 -2
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js.map +1 -1
  114. package/dist/internals/index.d.ts +30 -0
  115. package/dist/internals/index.d.ts.map +1 -0
  116. package/dist/internals/index.js +81 -0
  117. package/dist/internals/index.js.map +1 -0
  118. package/dist/internals/procedure.d.ts.map +1 -0
  119. package/dist/{_common → internals}/procedure.js +1 -0
  120. package/dist/internals/procedure.js.map +1 -0
  121. package/dist/internals/urls.d.ts.map +1 -0
  122. package/dist/internals/urls.js.map +1 -0
  123. package/dist/internals/utils.d.ts +8 -0
  124. package/dist/internals/utils.d.ts.map +1 -0
  125. package/dist/{_common → internals}/utils.js +20 -5
  126. package/dist/internals/utils.js.map +1 -0
  127. package/dist/utils/sanitize.d.ts +7 -6
  128. package/dist/utils/sanitize.d.ts.map +1 -1
  129. package/dist/utils/sanitize.js +11 -8
  130. package/dist/utils/sanitize.js.map +1 -1
  131. package/package.json +4 -3
  132. package/dist/_common/index.d.ts +0 -17
  133. package/dist/_common/index.d.ts.map +0 -1
  134. package/dist/_common/index.js +0 -27
  135. package/dist/_common/index.js.map +0 -1
  136. package/dist/_common/procedure.d.ts.map +0 -1
  137. package/dist/_common/procedure.js.map +0 -1
  138. package/dist/_common/urls.d.ts.map +0 -1
  139. package/dist/_common/urls.js.map +0 -1
  140. package/dist/_common/utils.d.ts +0 -5
  141. package/dist/_common/utils.d.ts.map +0 -1
  142. package/dist/_common/utils.js.map +0 -1
  143. package/dist/components/MessageController.d.ts +0 -13
  144. package/dist/components/MessageController.d.ts.map +0 -1
  145. package/dist/components/MessageController.js.map +0 -1
  146. package/dist/components/MessageFormContext.d.ts.map +0 -1
  147. package/dist/components/MessageFormContext.js.map +0 -1
  148. package/dist/components/actions/Move.d.ts +0 -2
  149. package/dist/components/actions/Move.d.ts.map +0 -1
  150. package/dist/components/actions/Move.js.map +0 -1
  151. package/dist/components/inputs/InputWrapper.d.ts +0 -8
  152. package/dist/components/inputs/InputWrapper.d.ts.map +0 -1
  153. package/dist/components/inputs/InputWrapper.js +0 -34
  154. package/dist/components/inputs/InputWrapper.js.map +0 -1
  155. package/dist/components/inputs/variables/editors/DateVariableEditor.d.ts +0 -10
  156. package/dist/components/inputs/variables/editors/DateVariableEditor.d.ts.map +0 -1
  157. package/dist/components/inputs/variables/editors/DateVariableEditor.js.map +0 -1
  158. package/dist/components/inputs/variables/editors/TimeVariableEditor.d.ts +0 -10
  159. package/dist/components/inputs/variables/editors/TimeVariableEditor.d.ts.map +0 -1
  160. package/dist/components/inputs/variables/editors/TimeVariableEditor.js +0 -15
  161. package/dist/components/inputs/variables/editors/TimeVariableEditor.js.map +0 -1
  162. package/dist/components/inputs/variables/pickers/NumericVariablePicker.d.ts +0 -7
  163. package/dist/components/inputs/variables/pickers/NumericVariablePicker.js.map +0 -1
  164. package/dist/components/inputs/variables/pickers/TemporalElementEditor.d.ts +0 -7
  165. package/dist/components/inputs/variables/pickers/TemporalElementEditor.d.ts.map +0 -1
  166. package/dist/components/inputs/variables/pickers/TemporalElementEditor.js +0 -58
  167. package/dist/components/inputs/variables/pickers/TemporalElementEditor.js.map +0 -1
  168. /package/dist/components/actions/{Move.module.css → CopyMessages.module.css} +0 -0
  169. /package/dist/{_common → internals}/procedure.d.ts +0 -0
  170. /package/dist/{_common → internals}/urls.d.ts +0 -0
  171. /package/dist/{_common → internals}/urls.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/layout/MessagesTabs.tsx"],"sourcesContent":["import { Button } from '@payloadcms/ui';\nimport { get } from 'lodash-es';\nimport { useCallback } from 'react';\nimport { useFormState } from 'react-hook-form';\nimport { useMessagesForm } from '@/components/MessageFormContext';\nimport type { MessagesSchema } from '@/types';\nimport { toWords } from '@/utils/format';\nimport styles from './MessagesTabs.module.css';\n\ninterface MessagesTabsProps {\n schema: MessagesSchema;\n activeTab: string | undefined;\n setActiveTab: (tab: string) => void;\n}\n\n// TODO add hash for current tab to url\nexport function MessagesTabs({\n schema,\n activeTab,\n setActiveTab,\n}: MessagesTabsProps): React.ReactNode {\n const { locales, control } = useMessagesForm();\n const { errors } = useFormState({ control });\n\n const hasErrors = useCallback(\n (key: string) => {\n return locales.some((locale) => get(errors, [locale, key]) !== undefined);\n },\n [errors, locales],\n );\n\n return (\n <div className={styles.tabs} role=\"tablist\">\n {Object.keys(schema).map((key) => (\n <Button\n buttonStyle={activeTab === key ? 'pill' : 'tab'}\n className={[\n styles.tab,\n hasErrors(key)\n ? activeTab === key\n ? styles.tabError\n : styles.tabErrorInactive\n : undefined,\n ]\n .filter(Boolean)\n .join(' ')}\n key={key}\n onClick={() => setActiveTab(key)}\n size=\"large\"\n type=\"button\"\n >\n {toWords(key)}\n </Button>\n ))}\n </div>\n );\n}\n"],"names":["Button","get","useCallback","useFormState","useMessagesForm","toWords","styles","MessagesTabs","schema","activeTab","setActiveTab","locales","control","errors","hasErrors","key","some","locale","undefined","div","className","tabs","role","Object","keys","map","buttonStyle","tab","tabError","tabErrorInactive","filter","Boolean","join","onClick","size","type"],"mappings":";AAAA,SAASA,MAAM,QAAQ,iBAAiB;AACxC,SAASC,GAAG,QAAQ,YAAY;AAChC,SAASC,WAAW,QAAQ,QAAQ;AACpC,SAASC,YAAY,QAAQ,kBAAkB;AAC/C,SAASC,eAAe,QAAQ,kCAAkC;AAElE,SAASC,OAAO,QAAQ,iBAAiB;AACzC,OAAOC,YAAY,4BAA4B;AAQ/C,uCAAuC;AACvC,OAAO,SAASC,aAAa,EAC3BC,MAAM,EACNC,SAAS,EACTC,YAAY,EACM;IAClB,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAE,GAAGR;IAC7B,MAAM,EAAES,MAAM,EAAE,GAAGV,aAAa;QAAES;IAAQ;IAE1C,MAAME,YAAYZ,YAChB,CAACa;QACC,OAAOJ,QAAQK,IAAI,CAAC,CAACC,SAAWhB,IAAIY,QAAQ;gBAACI;gBAAQF;aAAI,MAAMG;IACjE,GACA;QAACL;QAAQF;KAAQ;IAGnB,qBACE,KAACQ;QAAIC,WAAWd,OAAOe,IAAI;QAAEC,MAAK;kBAC/BC,OAAOC,IAAI,CAAChB,QAAQiB,GAAG,CAAC,CAACV,oBACxB,KAACf;gBACC0B,aAAajB,cAAcM,MAAM,SAAS;gBAC1CK,WAAW;oBACTd,OAAOqB,GAAG;oBACVb,UAAUC,OACNN,cAAcM,MACZT,OAAOsB,QAAQ,GACftB,OAAOuB,gBAAgB,GACzBX;iBACL,CACEY,MAAM,CAACC,SACPC,IAAI,CAAC;gBAERC,SAAS,IAAMvB,aAAaK;gBAC5BmB,MAAK;gBACLC,MAAK;0BAEJ9B,QAAQU;eALJA;;AAUf"}
1
+ {"version":3,"sources":["../../../src/components/layout/MessagesTabs.tsx"],"sourcesContent":["import { Button } from '@payloadcms/ui';\nimport clsx from 'clsx';\nimport { get } from 'lodash-es';\nimport { useCallback } from 'react';\nimport { useFormState } from 'react-hook-form';\nimport { useMessagesForm } from '@/components/MessagesFormProvider';\nimport type { MessagesSchema } from '@/types';\nimport { toWords } from '@/utils/format';\nimport styles from './MessagesTabs.module.css';\n\ninterface MessagesTabsProps {\n schema: MessagesSchema;\n activeTab: string | undefined;\n setActiveTab: (tab: string) => void;\n}\n\n// TODO add hash for current tab to url\nexport function MessagesTabs({\n schema,\n activeTab,\n setActiveTab,\n}: MessagesTabsProps): React.ReactNode {\n const { locales, control } = useMessagesForm();\n const { errors } = useFormState({ control });\n\n const hasErrors = useCallback(\n (key: string) => {\n return locales.some((locale) => get(errors, [locale, key]) !== undefined);\n },\n [errors, locales],\n );\n\n return (\n <div className={styles.tabs} role=\"tablist\">\n {Object.keys(schema).map((key) => (\n <Button\n buttonStyle={activeTab === key ? 'pill' : 'tab'}\n className={clsx(\n styles.tab,\n hasErrors(key) && activeTab === key && styles.tabError,\n hasErrors(key) && activeTab !== key && styles.tabErrorInactive,\n )}\n key={key}\n onClick={() => setActiveTab(key)}\n size=\"large\"\n type=\"button\"\n >\n {toWords(key)}\n </Button>\n ))}\n </div>\n );\n}\n"],"names":["Button","clsx","get","useCallback","useFormState","useMessagesForm","toWords","styles","MessagesTabs","schema","activeTab","setActiveTab","locales","control","errors","hasErrors","key","some","locale","undefined","div","className","tabs","role","Object","keys","map","buttonStyle","tab","tabError","tabErrorInactive","onClick","size","type"],"mappings":";AAAA,SAASA,MAAM,QAAQ,iBAAiB;AACxC,OAAOC,UAAU,OAAO;AACxB,SAASC,GAAG,QAAQ,YAAY;AAChC,SAASC,WAAW,QAAQ,QAAQ;AACpC,SAASC,YAAY,QAAQ,kBAAkB;AAC/C,SAASC,eAAe,QAAQ,oCAAoC;AAEpE,SAASC,OAAO,QAAQ,iBAAiB;AACzC,OAAOC,YAAY,4BAA4B;AAQ/C,uCAAuC;AACvC,OAAO,SAASC,aAAa,EAC3BC,MAAM,EACNC,SAAS,EACTC,YAAY,EACM;IAClB,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAE,GAAGR;IAC7B,MAAM,EAAES,MAAM,EAAE,GAAGV,aAAa;QAAES;IAAQ;IAE1C,MAAME,YAAYZ,YAChB,CAACa;QACC,OAAOJ,QAAQK,IAAI,CAAC,CAACC,SAAWhB,IAAIY,QAAQ;gBAACI;gBAAQF;aAAI,MAAMG;IACjE,GACA;QAACL;QAAQF;KAAQ;IAGnB,qBACE,KAACQ;QAAIC,WAAWd,OAAOe,IAAI;QAAEC,MAAK;kBAC/BC,OAAOC,IAAI,CAAChB,QAAQiB,GAAG,CAAC,CAACV,oBACxB,KAAChB;gBACC2B,aAAajB,cAAcM,MAAM,SAAS;gBAC1CK,WAAWpB,KACTM,OAAOqB,GAAG,EACVb,UAAUC,QAAQN,cAAcM,OAAOT,OAAOsB,QAAQ,EACtDd,UAAUC,QAAQN,cAAcM,OAAOT,OAAOuB,gBAAgB;gBAGhEC,SAAS,IAAMpB,aAAaK;gBAC5BgB,MAAK;gBACLC,MAAK;0BAEJ3B,QAAQU;eALJA;;AAUf"}
@@ -6,6 +6,6 @@ interface MessagesTreeProps {
6
6
  className?: string;
7
7
  hidden?: boolean;
8
8
  }
9
- export declare function MessagesTree({ path, schema, nestingLevel, className, hidden, }: MessagesTreeProps): React.ReactNode;
9
+ export declare const MessagesTree: import("react").NamedExoticComponent<MessagesTreeProps>;
10
10
  export {};
11
11
  //# sourceMappingURL=MessagesTree.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessagesTree.d.ts","sourceRoot":"","sources":["../../../src/components/layout/MessagesTree.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMxC,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAID,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,MAAM,EACN,YAAgB,EAChB,SAAS,EACT,MAAM,GACP,EAAE,iBAAiB,GAAG,KAAK,CAAC,SAAS,CA8DrC"}
1
+ {"version":3,"file":"MessagesTree.d.ts","sourceRoot":"","sources":["../../../src/components/layout/MessagesTree.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAOxC,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAID,eAAO,MAAM,YAAY,yDAwDvB,CAAC"}
@@ -1,66 +1,56 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Collapsible } from '@payloadcms/ui';
3
- import { get } from 'lodash-es';
4
- import { useCallback } from 'react';
5
- import { useFormState } from 'react-hook-form';
6
- import { useMessagesForm } from '../../components/MessageFormContext';
3
+ import clsx from 'clsx';
4
+ import { memo } from 'react';
5
+ import { useMessagesForm } from '../../components/MessagesFormProvider';
7
6
  import { toWords } from '../../utils/format';
7
+ import { GroupStatusDot } from './GroupStatusDot';
8
8
  import { MessageField } from './MessageField';
9
9
  import styles from './MessagesTree.module.css';
10
10
  // TODO fix sticky position on single locale form
11
- export function MessagesTree({ path, schema, nestingLevel = 0, className, hidden }) {
12
- const { control, locales } = useMessagesForm();
13
- const { errors } = useFormState({
14
- control
15
- });
16
- const hasErrors = useCallback((key)=>{
17
- return locales.some((locale)=>get(errors, [
18
- locale,
19
- path,
20
- key
21
- ].join('.')) !== undefined);
22
- }, [
23
- errors,
24
- locales,
25
- path
26
- ]);
11
+ export const MessagesTree = /*#__PURE__*/ memo(function MessagesTree({ path, schema, nestingLevel = 0, className, hidden }) {
12
+ const { activeLocale, defaultLocale } = useMessagesForm();
13
+ const showStatus = activeLocale !== defaultLocale;
27
14
  return /*#__PURE__*/ _jsx("div", {
28
- className: [
29
- styles.grid,
30
- className
31
- ].filter(Boolean).join(' '),
15
+ className: clsx(styles.grid, className),
32
16
  style: {
33
17
  display: hidden ? 'none' : undefined
34
18
  },
35
- children: Object.entries(schema).map(([key, value])=>/*#__PURE__*/ _jsx("div", {
19
+ children: Object.entries(schema).map(([key, value])=>{
20
+ const fullPath = path ? [
21
+ path,
22
+ key
23
+ ].join('.') : key;
24
+ return typeof value === 'string' ? /*#__PURE__*/ _jsx(MessageField, {
25
+ messageKey: key,
26
+ path: path,
27
+ schema: value,
28
+ showStatus: showStatus
29
+ }, key) : /*#__PURE__*/ _jsx("div", {
36
30
  className: styles.item,
37
31
  style: {
38
32
  '--nesting-level': nestingLevel
39
33
  },
40
34
  children: /*#__PURE__*/ _jsx(Collapsible, {
41
35
  className: styles.collapsible,
42
- header: /*#__PURE__*/ _jsx("span", {
43
- className: [
44
- styles.header,
45
- hasErrors(key) ? styles.headerError : undefined
46
- ].filter(Boolean).join(' '),
47
- children: toWords(key)
36
+ header: /*#__PURE__*/ _jsxs("span", {
37
+ className: styles.header,
38
+ children: [
39
+ toWords(key),
40
+ showStatus && /*#__PURE__*/ _jsx(GroupStatusDot, {
41
+ path: fullPath
42
+ })
43
+ ]
48
44
  }),
49
- children: typeof value === 'string' ? /*#__PURE__*/ _jsx(MessageField, {
50
- messageKey: key,
51
- path: path,
52
- schema: value
53
- }, key) : /*#__PURE__*/ _jsx(MessagesTree, {
45
+ children: /*#__PURE__*/ _jsx(MessagesTree, {
54
46
  nestingLevel: nestingLevel + 1,
55
- path: [
56
- path,
57
- key
58
- ].join('.'),
47
+ path: fullPath,
59
48
  schema: value
60
49
  })
61
50
  })
62
- }, key))
51
+ }, key);
52
+ })
63
53
  });
64
- }
54
+ });
65
55
 
66
56
  //# sourceMappingURL=MessagesTree.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/layout/MessagesTree.tsx"],"sourcesContent":["import { Collapsible } from '@payloadcms/ui';\nimport { get } from 'lodash-es';\nimport { useCallback } from 'react';\nimport { useFormState } from 'react-hook-form';\nimport { useMessagesForm } from '@/components/MessageFormContext';\nimport type { Messages } from '@/types';\nimport { toWords } from '@/utils/format';\n\nimport { MessageField } from './MessageField';\nimport styles from './MessagesTree.module.css';\n\ninterface MessagesTreeProps {\n path: string;\n nestingLevel: number;\n schema: Messages;\n className?: string;\n hidden?: boolean;\n}\n\n// TODO fix sticky position on single locale form\n\nexport function MessagesTree({\n path,\n schema,\n nestingLevel = 0,\n className,\n hidden,\n}: MessagesTreeProps): React.ReactNode {\n const { control, locales } = useMessagesForm();\n const { errors } = useFormState({ control });\n\n const hasErrors = useCallback(\n (key: string) => {\n return locales.some(\n (locale) => get(errors, [locale, path, key].join('.')) !== undefined,\n );\n },\n [errors, locales, path],\n );\n\n return (\n <div\n className={[styles.grid, className].filter(Boolean).join(' ')}\n style={{ display: hidden ? 'none' : undefined }}\n >\n {Object.entries(schema).map(([key, value]) => (\n <div\n className={styles.item}\n key={key}\n style={\n {\n '--nesting-level': nestingLevel,\n } as React.CSSProperties\n }\n >\n <Collapsible\n className={styles.collapsible}\n header={\n <span\n className={[\n styles.header,\n hasErrors(key) ? styles.headerError : undefined,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {toWords(key)}\n </span>\n }\n >\n {typeof value === 'string' ? (\n <MessageField\n key={key}\n messageKey={key}\n path={path}\n schema={value}\n />\n ) : (\n <MessagesTree\n nestingLevel={nestingLevel + 1}\n path={[path, key].join('.')}\n schema={value}\n />\n )}\n </Collapsible>\n </div>\n ))}\n </div>\n );\n}\n"],"names":["Collapsible","get","useCallback","useFormState","useMessagesForm","toWords","MessageField","styles","MessagesTree","path","schema","nestingLevel","className","hidden","control","locales","errors","hasErrors","key","some","locale","join","undefined","div","grid","filter","Boolean","style","display","Object","entries","map","value","item","collapsible","header","span","headerError","messageKey"],"mappings":";AAAA,SAASA,WAAW,QAAQ,iBAAiB;AAC7C,SAASC,GAAG,QAAQ,YAAY;AAChC,SAASC,WAAW,QAAQ,QAAQ;AACpC,SAASC,YAAY,QAAQ,kBAAkB;AAC/C,SAASC,eAAe,QAAQ,kCAAkC;AAElE,SAASC,OAAO,QAAQ,iBAAiB;AAEzC,SAASC,YAAY,QAAQ,iBAAiB;AAC9C,OAAOC,YAAY,4BAA4B;AAU/C,iDAAiD;AAEjD,OAAO,SAASC,aAAa,EAC3BC,IAAI,EACJC,MAAM,EACNC,eAAe,CAAC,EAChBC,SAAS,EACTC,MAAM,EACY;IAClB,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAE,GAAGX;IAC7B,MAAM,EAAEY,MAAM,EAAE,GAAGb,aAAa;QAAEW;IAAQ;IAE1C,MAAMG,YAAYf,YAChB,CAACgB;QACC,OAAOH,QAAQI,IAAI,CACjB,CAACC,SAAWnB,IAAIe,QAAQ;gBAACI;gBAAQX;gBAAMS;aAAI,CAACG,IAAI,CAAC,UAAUC;IAE/D,GACA;QAACN;QAAQD;QAASN;KAAK;IAGzB,qBACE,KAACc;QACCX,WAAW;YAACL,OAAOiB,IAAI;YAAEZ;SAAU,CAACa,MAAM,CAACC,SAASL,IAAI,CAAC;QACzDM,OAAO;YAAEC,SAASf,SAAS,SAASS;QAAU;kBAE7CO,OAAOC,OAAO,CAACpB,QAAQqB,GAAG,CAAC,CAAC,CAACb,KAAKc,MAAM,iBACvC,KAACT;gBACCX,WAAWL,OAAO0B,IAAI;gBAEtBN,OACE;oBACE,mBAAmBhB;gBACrB;0BAGF,cAAA,KAACX;oBACCY,WAAWL,OAAO2B,WAAW;oBAC7BC,sBACE,KAACC;wBACCxB,WAAW;4BACTL,OAAO4B,MAAM;4BACblB,UAAUC,OAAOX,OAAO8B,WAAW,GAAGf;yBACvC,CACEG,MAAM,CAACC,SACPL,IAAI,CAAC;kCAEPhB,QAAQa;;8BAIZ,OAAOc,UAAU,yBAChB,KAAC1B;wBAECgC,YAAYpB;wBACZT,MAAMA;wBACNC,QAAQsB;uBAHHd,qBAMP,KAACV;wBACCG,cAAcA,eAAe;wBAC7BF,MAAM;4BAACA;4BAAMS;yBAAI,CAACG,IAAI,CAAC;wBACvBX,QAAQsB;;;eAjCTd;;AAyCf"}
1
+ {"version":3,"sources":["../../../src/components/layout/MessagesTree.tsx"],"sourcesContent":["import { Collapsible } from '@payloadcms/ui';\nimport clsx from 'clsx';\nimport { memo } from 'react';\nimport { useMessagesForm } from '@/components/MessagesFormProvider';\nimport type { Messages } from '@/types';\nimport { toWords } from '@/utils/format';\n\nimport { GroupStatusDot } from './GroupStatusDot';\nimport { MessageField } from './MessageField';\nimport styles from './MessagesTree.module.css';\n\ninterface MessagesTreeProps {\n path: string;\n nestingLevel: number;\n schema: Messages;\n className?: string;\n hidden?: boolean;\n}\n\n// TODO fix sticky position on single locale form\n\nexport const MessagesTree = memo(function MessagesTree({\n path,\n schema,\n nestingLevel = 0,\n className,\n hidden,\n}: MessagesTreeProps): React.ReactNode {\n const { activeLocale, defaultLocale } = useMessagesForm();\n const showStatus = activeLocale !== defaultLocale;\n\n return (\n <div\n className={clsx(styles.grid, className)}\n style={{ display: hidden ? 'none' : undefined }}\n >\n {Object.entries(schema).map(([key, value]) => {\n const fullPath = path ? [path, key].join('.') : key;\n\n return typeof value === 'string' ? (\n <MessageField\n key={key}\n messageKey={key}\n path={path}\n schema={value}\n showStatus={showStatus}\n />\n ) : (\n <div\n className={styles.item}\n key={key}\n style={\n {\n '--nesting-level': nestingLevel,\n } as React.CSSProperties\n }\n >\n <Collapsible\n className={styles.collapsible}\n header={\n <span className={styles.header}>\n {toWords(key)}\n {showStatus && <GroupStatusDot path={fullPath} />}\n </span>\n }\n >\n <MessagesTree\n nestingLevel={nestingLevel + 1}\n path={fullPath}\n schema={value}\n />\n </Collapsible>\n </div>\n );\n })}\n </div>\n );\n});\n"],"names":["Collapsible","clsx","memo","useMessagesForm","toWords","GroupStatusDot","MessageField","styles","MessagesTree","path","schema","nestingLevel","className","hidden","activeLocale","defaultLocale","showStatus","div","grid","style","display","undefined","Object","entries","map","key","value","fullPath","join","messageKey","item","collapsible","header","span"],"mappings":";AAAA,SAASA,WAAW,QAAQ,iBAAiB;AAC7C,OAAOC,UAAU,OAAO;AACxB,SAASC,IAAI,QAAQ,QAAQ;AAC7B,SAASC,eAAe,QAAQ,oCAAoC;AAEpE,SAASC,OAAO,QAAQ,iBAAiB;AAEzC,SAASC,cAAc,QAAQ,mBAAmB;AAClD,SAASC,YAAY,QAAQ,iBAAiB;AAC9C,OAAOC,YAAY,4BAA4B;AAU/C,iDAAiD;AAEjD,OAAO,MAAMC,6BAAeN,KAAK,SAASM,aAAa,EACrDC,IAAI,EACJC,MAAM,EACNC,eAAe,CAAC,EAChBC,SAAS,EACTC,MAAM,EACY;IAClB,MAAM,EAAEC,YAAY,EAAEC,aAAa,EAAE,GAAGZ;IACxC,MAAMa,aAAaF,iBAAiBC;IAEpC,qBACE,KAACE;QACCL,WAAWX,KAAKM,OAAOW,IAAI,EAAEN;QAC7BO,OAAO;YAAEC,SAASP,SAAS,SAASQ;QAAU;kBAE7CC,OAAOC,OAAO,CAACb,QAAQc,GAAG,CAAC,CAAC,CAACC,KAAKC,MAAM;YACvC,MAAMC,WAAWlB,OAAO;gBAACA;gBAAMgB;aAAI,CAACG,IAAI,CAAC,OAAOH;YAEhD,OAAO,OAAOC,UAAU,yBACtB,KAACpB;gBAECuB,YAAYJ;gBACZhB,MAAMA;gBACNC,QAAQgB;gBACRV,YAAYA;eAJPS,qBAOP,KAACR;gBACCL,WAAWL,OAAOuB,IAAI;gBAEtBX,OACE;oBACE,mBAAmBR;gBACrB;0BAGF,cAAA,KAACX;oBACCY,WAAWL,OAAOwB,WAAW;oBAC7BC,sBACE,MAACC;wBAAKrB,WAAWL,OAAOyB,MAAM;;4BAC3B5B,QAAQqB;4BACRT,4BAAc,KAACX;gCAAeI,MAAMkB;;;;8BAIzC,cAAA,KAACnB;wBACCG,cAAcA,eAAe;wBAC7BF,MAAMkB;wBACNjB,QAAQgB;;;eAnBPD;QAwBX;;AAGN,GAAG"}
@@ -1,6 +1,6 @@
1
1
  .grid {
2
2
  display: grid;
3
- gap: 1.5rem;
3
+ gap: 1rem;
4
4
  }
5
5
 
6
6
  .item {
@@ -8,6 +8,8 @@
8
8
  min-width: 0;
9
9
  }
10
10
 
11
+ /* Group accordion */
12
+
11
13
  .collapsible {
12
14
  min-width: 0;
13
15
  }
@@ -16,18 +18,21 @@
16
18
  border-color: var(--theme-border-color);
17
19
  }
18
20
 
19
- .collapsible > .collapsible__toggle-wrap {
21
+ .collapsible > :global(.collapsible__toggle-wrap) {
20
22
  position: sticky;
21
23
  border-bottom: 1px solid var(--theme-border-color);
22
- top: calc(var(--nesting-level) * 40px - 26px);
24
+ top: calc(var(--nesting-level) * 36px - 26px);
23
25
  z-index: calc(9 - var(--nesting-level));
26
+ padding-block: 0.5rem;
24
27
  }
25
28
 
26
- .collapsible .collapsible__content {
27
- padding: 0.75rem;
29
+ .collapsible :global(.collapsible__content) {
30
+ padding: 1rem;
28
31
  }
29
32
 
30
33
  .header {
34
+ display: inline-flex;
35
+ align-items: center;
31
36
  font-size: var(--font-size-large);
32
37
  }
33
38
 
@@ -0,0 +1,7 @@
1
+ type TranslationStatus = 'translated' | 'missing';
2
+ interface StatusDotProps {
3
+ status: TranslationStatus;
4
+ }
5
+ export declare function StatusDot({ status }: StatusDotProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=StatusDot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusDot.d.ts","sourceRoot":"","sources":["../../../src/components/layout/StatusDot.tsx"],"names":[],"mappings":"AAGA,KAAK,iBAAiB,GAAG,YAAY,GAAG,SAAS,CAAC;AAElD,UAAU,cAAc;IACtB,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,cAAc,2CAanD"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import clsx from 'clsx';
3
+ import styles from './StatusDot.module.css';
4
+ export function StatusDot({ status }) {
5
+ return /*#__PURE__*/ _jsx("span", {
6
+ "aria-label": status === 'translated' ? 'Translated' : 'Missing translation',
7
+ className: clsx(styles.dot, status === 'translated' ? styles.translated : styles.missing),
8
+ role: "img"
9
+ });
10
+ }
11
+
12
+ //# sourceMappingURL=StatusDot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/layout/StatusDot.tsx"],"sourcesContent":["import clsx from 'clsx';\nimport styles from './StatusDot.module.css';\n\ntype TranslationStatus = 'translated' | 'missing';\n\ninterface StatusDotProps {\n status: TranslationStatus;\n}\n\nexport function StatusDot({ status }: StatusDotProps) {\n return (\n <span\n aria-label={\n status === 'translated' ? 'Translated' : 'Missing translation'\n }\n className={clsx(\n styles.dot,\n status === 'translated' ? styles.translated : styles.missing,\n )}\n role=\"img\"\n />\n );\n}\n"],"names":["clsx","styles","StatusDot","status","span","aria-label","className","dot","translated","missing","role"],"mappings":";AAAA,OAAOA,UAAU,OAAO;AACxB,OAAOC,YAAY,yBAAyB;AAQ5C,OAAO,SAASC,UAAU,EAAEC,MAAM,EAAkB;IAClD,qBACE,KAACC;QACCC,cACEF,WAAW,eAAe,eAAe;QAE3CG,WAAWN,KACTC,OAAOM,GAAG,EACVJ,WAAW,eAAeF,OAAOO,UAAU,GAAGP,OAAOQ,OAAO;QAE9DC,MAAK;;AAGX"}
@@ -0,0 +1,16 @@
1
+ .dot {
2
+ width: 8px;
3
+ height: 8px;
4
+ border-radius: 50%;
5
+ display: inline-block;
6
+ flex-shrink: 0;
7
+ margin-left: 0.5rem;
8
+ }
9
+
10
+ .translated {
11
+ background-color: var(--theme-success-500);
12
+ }
13
+
14
+ .missing {
15
+ background-color: var(--theme-error-500);
16
+ }
package/dist/const.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import type { Messages } from './types';
2
2
  export declare const ENDPOINTS: {
3
- getMessages: import("./_common/index.js").Procedure<{
3
+ getMessages: import("./internals/index.js").Procedure<{
4
4
  locale: string;
5
5
  }, Messages>;
6
- setMessages: import("./_common/index.js").Procedure<void, {
6
+ setMessages: import("./internals/index.js").Procedure<void, {
7
7
  success: boolean;
8
8
  }>;
9
9
  };
package/dist/const.js CHANGED
@@ -1,4 +1,4 @@
1
- import { defineProcedure } from './_common/index.js';
1
+ import { defineProcedure } from './internals/index.js';
2
2
  import { z } from 'zod';
3
3
  export const ENDPOINTS = {
4
4
  getMessages: defineProcedure({
@@ -1,5 +1,5 @@
1
1
  import type { ResolvedPluginOptions } from './types';
2
2
  export declare const Messages: (options: ResolvedPluginOptions<"hooks"> & {
3
- slug: import("payload").CollectionSlug;
3
+ slug: string;
4
4
  }) => import("payload").CollectionConfig;
5
5
  //# sourceMappingURL=entities.d.ts.map
package/dist/entities.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createCollectionConfigFactory } from './_common/index.js';
1
+ import { createCollectionConfigFactory } from './internals/index.js';
2
2
  import { getMessagesEndpoint } from './endpoints/get-messages';
3
3
  import { setMessagesEndpoint } from './endpoints/set-messages';
4
4
  import { createHooks } from './hooks';
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { CollectionSlug, Plugin } from 'payload';
1
+ import type { Plugin } from 'payload';
2
2
  import type { MessagesGuard, MessagesHooks, MessagesSchema } from './types.ts';
3
3
  export interface MessagesPluginConfig {
4
4
  schema: MessagesSchema;
@@ -7,7 +7,7 @@ export interface MessagesPluginConfig {
7
7
  *
8
8
  * @default `messages`
9
9
  */
10
- collectionSlug?: CollectionSlug;
10
+ collectionSlug?: string;
11
11
  /**
12
12
  * Access control for allowing to edit the messages.
13
13
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAKtD,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG/E,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,cAAc,CAAC;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;;;OAIG;IACH,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,UAAU,2DAOlB,oBAAoB,KAAG,MAgEzB,CAAC;AAEJ,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,YAAY,EACV,QAAQ,EACR,cAAc,GACf,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAKtC,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG/E,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,cAAc,CAAC;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,UAAU,2DAOlB,oBAAoB,KAAG,MAgEzB,CAAC;AAEJ,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,YAAY,EACV,QAAQ,EACR,cAAc,GACf,MAAM,YAAY,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionSlug, Plugin } from 'payload';\nimport type { MessagesViewProps } from './components/MessagesView';\nimport { getMessagesEndpoint } from './endpoints/get-messages';\nimport { setMessagesEndpoint } from './endpoints/set-messages';\nimport { Messages } from './entities';\nimport type { MessagesGuard, MessagesHooks, MessagesSchema } from './types.ts';\nimport { attachPluginContext, getSupportedLocales } from './utils/config';\n\nexport interface MessagesPluginConfig {\n schema: MessagesSchema;\n /**\n * The slug of the collection to use for the messages.\n *\n * @default `messages`\n */\n collectionSlug?: CollectionSlug;\n /**\n * Access control for allowing to edit the messages.\n *\n * @default `(req) => req.user !== null // Authenticated users only`\n */\n editorAccess?: MessagesGuard;\n hooks?: MessagesHooks;\n tabs?: boolean;\n}\n\nexport const intlPlugin =\n ({\n schema,\n tabs,\n collectionSlug = 'messages',\n hooks = {},\n editorAccess = (req) => req.user !== null,\n }: MessagesPluginConfig): Plugin =>\n (config) => {\n if (!config.localization) {\n console.warn(\n '[payload-intl] You have not set the localization option in your Payload config, so this plugin will have no effect.',\n );\n return config;\n }\n\n const locales = getSupportedLocales(config.localization);\n\n config.admin ??= {};\n config.admin.components ??= {};\n config.admin.components.actions ??= [];\n config.admin.components.actions.push({\n exportName: 'MessagesLink',\n path: 'payload-intl/rsc#MessagesLink',\n });\n\n config.admin.components.views = {\n ...config.admin.components.views,\n intl: {\n Component: {\n path: 'payload-intl/rsc#MessagesView',\n serverProps: {\n access: editorAccess,\n locales,\n schema,\n tabs,\n } satisfies MessagesViewProps,\n },\n path: '/intl',\n },\n };\n\n attachPluginContext(config, {\n collectionSlug,\n });\n // config.globals ??= [];\n // config.globals.push({\n // slug: 'intl-plugin',\n // fields: [\n // {\n // name: 'editorTemplate',\n // type: 'richText',\n // editor: lexicalEditor({\n // features: ({ defaultFeatures }) =>\n // defaultFeatures.filter(\n // ({ key }) => !['relationship', 'upload'].includes(key),\n // ),\n // }),\n // admin: { hidden: true },\n // },\n // ],\n // });\n\n config.collections ??= [];\n config.collections.push(Messages({ slug: collectionSlug, hooks }));\n\n config.endpoints ??= [];\n config.endpoints.push(getMessagesEndpoint);\n config.endpoints.push(setMessagesEndpoint);\n\n return config;\n };\n\nexport { fetchMessages } from './requests/fetchMessages';\n\nexport type {\n Messages,\n MessagesSchema,\n} from './types.ts';\n"],"names":["getMessagesEndpoint","setMessagesEndpoint","Messages","attachPluginContext","getSupportedLocales","intlPlugin","schema","tabs","collectionSlug","hooks","editorAccess","req","user","config","localization","console","warn","locales","admin","components","actions","push","exportName","path","views","intl","Component","serverProps","access","collections","slug","endpoints","fetchMessages"],"mappings":"AAEA,SAASA,mBAAmB,QAAQ,2BAA2B;AAC/D,SAASC,mBAAmB,QAAQ,2BAA2B;AAC/D,SAASC,QAAQ,QAAQ,aAAa;AAEtC,SAASC,mBAAmB,EAAEC,mBAAmB,QAAQ,iBAAiB;AAoB1E,OAAO,MAAMC,aACX,CAAC,EACCC,MAAM,EACNC,IAAI,EACJC,iBAAiB,UAAU,EAC3BC,QAAQ,CAAC,CAAC,EACVC,eAAe,CAACC,MAAQA,IAAIC,IAAI,KAAK,IAAI,EACpB,GACvB,CAACC;QACC,IAAI,CAACA,OAAOC,YAAY,EAAE;YACxBC,QAAQC,IAAI,CACV;YAEF,OAAOH;QACT;QAEA,MAAMI,UAAUb,oBAAoBS,OAAOC,YAAY;QAEvDD,OAAOK,KAAK,KAAK,CAAC;QAClBL,OAAOK,KAAK,CAACC,UAAU,KAAK,CAAC;QAC7BN,OAAOK,KAAK,CAACC,UAAU,CAACC,OAAO,KAAK,EAAE;QACtCP,OAAOK,KAAK,CAACC,UAAU,CAACC,OAAO,CAACC,IAAI,CAAC;YACnCC,YAAY;YACZC,MAAM;QACR;QAEAV,OAAOK,KAAK,CAACC,UAAU,CAACK,KAAK,GAAG;YAC9B,GAAGX,OAAOK,KAAK,CAACC,UAAU,CAACK,KAAK;YAChCC,MAAM;gBACJC,WAAW;oBACTH,MAAM;oBACNI,aAAa;wBACXC,QAAQlB;wBACRO;wBACAX;wBACAC;oBACF;gBACF;gBACAgB,MAAM;YACR;QACF;QAEApB,oBAAoBU,QAAQ;YAC1BL;QACF;QACA,yBAAyB;QACzB,wBAAwB;QACxB,yBAAyB;QACzB,cAAc;QACd,QAAQ;QACR,gCAAgC;QAChC,0BAA0B;QAC1B,gCAAgC;QAChC,6CAA6C;QAC7C,oCAAoC;QACpC,sEAAsE;QACtE,eAAe;QACf,YAAY;QACZ,iCAAiC;QACjC,SAAS;QACT,OAAO;QACP,MAAM;QAENK,OAAOgB,WAAW,KAAK,EAAE;QACzBhB,OAAOgB,WAAW,CAACR,IAAI,CAACnB,SAAS;YAAE4B,MAAMtB;YAAgBC;QAAM;QAE/DI,OAAOkB,SAAS,KAAK,EAAE;QACvBlB,OAAOkB,SAAS,CAACV,IAAI,CAACrB;QACtBa,OAAOkB,SAAS,CAACV,IAAI,CAACpB;QAEtB,OAAOY;IACT,EAAE;AAEJ,SAASmB,aAAa,QAAQ,2BAA2B"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Plugin } from 'payload';\nimport type { MessagesViewProps } from './components/MessagesView';\nimport { getMessagesEndpoint } from './endpoints/get-messages';\nimport { setMessagesEndpoint } from './endpoints/set-messages';\nimport { Messages } from './entities';\nimport type { MessagesGuard, MessagesHooks, MessagesSchema } from './types.ts';\nimport { attachPluginContext, getSupportedLocales } from './utils/config';\n\nexport interface MessagesPluginConfig {\n schema: MessagesSchema;\n /**\n * The slug of the collection to use for the messages.\n *\n * @default `messages`\n */\n collectionSlug?: string;\n /**\n * Access control for allowing to edit the messages.\n *\n * @default `(req) => req.user !== null // Authenticated users only`\n */\n editorAccess?: MessagesGuard;\n hooks?: MessagesHooks;\n tabs?: boolean;\n}\n\nexport const intlPlugin =\n ({\n schema,\n tabs,\n collectionSlug = 'messages',\n hooks = {},\n editorAccess = (req) => req.user !== null,\n }: MessagesPluginConfig): Plugin =>\n (config) => {\n if (!config.localization) {\n console.warn(\n '[payload-intl] You have not set the localization option in your Payload config, so this plugin will have no effect.',\n );\n return config;\n }\n\n const locales = getSupportedLocales(config.localization);\n\n config.admin ??= {};\n config.admin.components ??= {};\n config.admin.components.actions ??= [];\n config.admin.components.actions.push({\n exportName: 'MessagesLink',\n path: 'payload-intl/rsc#MessagesLink',\n });\n\n config.admin.components.views = {\n ...config.admin.components.views,\n intl: {\n Component: {\n path: 'payload-intl/rsc#MessagesView',\n serverProps: {\n access: editorAccess,\n locales,\n schema,\n tabs,\n } satisfies MessagesViewProps,\n },\n path: '/intl',\n },\n };\n\n attachPluginContext(config, {\n collectionSlug,\n });\n // config.globals ??= [];\n // config.globals.push({\n // slug: 'intl-plugin',\n // fields: [\n // {\n // name: 'editorTemplate',\n // type: 'richText',\n // editor: lexicalEditor({\n // features: ({ defaultFeatures }) =>\n // defaultFeatures.filter(\n // ({ key }) => !['relationship', 'upload'].includes(key),\n // ),\n // }),\n // admin: { hidden: true },\n // },\n // ],\n // });\n\n config.collections ??= [];\n config.collections.push(Messages({ slug: collectionSlug, hooks }));\n\n config.endpoints ??= [];\n config.endpoints.push(getMessagesEndpoint);\n config.endpoints.push(setMessagesEndpoint);\n\n return config;\n };\n\nexport { fetchMessages } from './requests/fetchMessages';\n\nexport type {\n Messages,\n MessagesSchema,\n} from './types.ts';\n"],"names":["getMessagesEndpoint","setMessagesEndpoint","Messages","attachPluginContext","getSupportedLocales","intlPlugin","schema","tabs","collectionSlug","hooks","editorAccess","req","user","config","localization","console","warn","locales","admin","components","actions","push","exportName","path","views","intl","Component","serverProps","access","collections","slug","endpoints","fetchMessages"],"mappings":"AAEA,SAASA,mBAAmB,QAAQ,2BAA2B;AAC/D,SAASC,mBAAmB,QAAQ,2BAA2B;AAC/D,SAASC,QAAQ,QAAQ,aAAa;AAEtC,SAASC,mBAAmB,EAAEC,mBAAmB,QAAQ,iBAAiB;AAoB1E,OAAO,MAAMC,aACX,CAAC,EACCC,MAAM,EACNC,IAAI,EACJC,iBAAiB,UAAU,EAC3BC,QAAQ,CAAC,CAAC,EACVC,eAAe,CAACC,MAAQA,IAAIC,IAAI,KAAK,IAAI,EACpB,GACvB,CAACC;QACC,IAAI,CAACA,OAAOC,YAAY,EAAE;YACxBC,QAAQC,IAAI,CACV;YAEF,OAAOH;QACT;QAEA,MAAMI,UAAUb,oBAAoBS,OAAOC,YAAY;QAEvDD,OAAOK,KAAK,KAAK,CAAC;QAClBL,OAAOK,KAAK,CAACC,UAAU,KAAK,CAAC;QAC7BN,OAAOK,KAAK,CAACC,UAAU,CAACC,OAAO,KAAK,EAAE;QACtCP,OAAOK,KAAK,CAACC,UAAU,CAACC,OAAO,CAACC,IAAI,CAAC;YACnCC,YAAY;YACZC,MAAM;QACR;QAEAV,OAAOK,KAAK,CAACC,UAAU,CAACK,KAAK,GAAG;YAC9B,GAAGX,OAAOK,KAAK,CAACC,UAAU,CAACK,KAAK;YAChCC,MAAM;gBACJC,WAAW;oBACTH,MAAM;oBACNI,aAAa;wBACXC,QAAQlB;wBACRO;wBACAX;wBACAC;oBACF;gBACF;gBACAgB,MAAM;YACR;QACF;QAEApB,oBAAoBU,QAAQ;YAC1BL;QACF;QACA,yBAAyB;QACzB,wBAAwB;QACxB,yBAAyB;QACzB,cAAc;QACd,QAAQ;QACR,gCAAgC;QAChC,0BAA0B;QAC1B,gCAAgC;QAChC,6CAA6C;QAC7C,oCAAoC;QACpC,sEAAsE;QACtE,eAAe;QACf,YAAY;QACZ,iCAAiC;QACjC,SAAS;QACT,OAAO;QACP,MAAM;QAENK,OAAOgB,WAAW,KAAK,EAAE;QACzBhB,OAAOgB,WAAW,CAACR,IAAI,CAACnB,SAAS;YAAE4B,MAAMtB;YAAgBC;QAAM;QAE/DI,OAAOkB,SAAS,KAAK,EAAE;QACvBlB,OAAOkB,SAAS,CAACV,IAAI,CAACrB;QACtBa,OAAOkB,SAAS,CAACV,IAAI,CAACpB;QAEtB,OAAOY;IACT,EAAE;AAEJ,SAASmB,aAAa,QAAQ,2BAA2B"}
@@ -0,0 +1,30 @@
1
+ import type { BasePayload, CollectionConfig, CollectionSlug, JsonObject, TypeWithID } from 'payload';
2
+ import z from 'zod';
3
+ export declare const documentIdSchema: z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>;
4
+ export type DocumentID = TypeWithID['id'] & z.infer<typeof documentIdSchema>;
5
+ export declare const documentReferenceSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6
+ entity: z.ZodLiteral<"collection">;
7
+ slug: z.ZodString;
8
+ id: z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>;
9
+ }, z.core.$strip>, z.ZodObject<{
10
+ entity: z.ZodLiteral<"global">;
11
+ slug: z.ZodString;
12
+ }, z.core.$strip>], "entity">;
13
+ export type DocumentReference = z.infer<typeof documentReferenceSchema>;
14
+ export declare const isPopulated: <T extends TypeWithID>(relationship: T | DocumentID) => relationship is T;
15
+ export declare function assertPopulated<T extends TypeWithID | null>(docsOrIds: (T | DocumentID)[], errorMessage?: (id: DocumentID) => string): T[];
16
+ export declare function assertPopulated<T extends TypeWithID | null>(docOrId: T | DocumentID, errorMessage?: (id: DocumentID) => string): T;
17
+ export declare const createCollectionConfigFactory: <T extends Record<string, unknown>>(factory: Omit<CollectionConfig, "slug"> | ((options: T & {
18
+ slug: string;
19
+ }) => Omit<CollectionConfig, "slug">)) => (options: T & {
20
+ slug: string;
21
+ }) => CollectionConfig;
22
+ export type IdentifiableDocument = TypeWithID['id'] | TypeWithID;
23
+ export declare function isIdentifiableDocument(value: unknown): value is IdentifiableDocument;
24
+ export declare const resolveDocumentID: (entity: IdentifiableDocument) => DocumentID;
25
+ export declare function fetchDocumentByReference(payload: BasePayload, ref: DocumentReference): Promise<JsonObject>;
26
+ export declare function updateDocumentByReference(payload: BasePayload, ref: DocumentReference, data: JsonObject): Promise<import("payload").DataFromCollectionSlug<CollectionSlug>>;
27
+ export { defineProcedure, type Procedure, type ProcedureBuilder, } from './procedure';
28
+ export { getAdminURL, getApiURL, getServerURL } from './urls';
29
+ export { findFields, uncaughtSwitchCase } from './utils';
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/internals/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,cAAc,EAEd,UAAU,EACV,UAAU,EACX,MAAM,SAAS,CAAC;AACjB,OAAO,CAAC,MAAM,KAAK,CAAC;AAKpB,eAAO,MAAM,gBAAgB,iDAAoC,CAAC;AAClE,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE7E,eAAO,MAAM,uBAAuB;;;;;;;6BAUlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAIxE,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,UAAU,gBAChC,CAAC,GAAG,UAAU,KAC3B,YAAY,IAAI,CAAqC,CAAC;AAEzD,wBAAgB,eAAe,CAAC,CAAC,SAAS,UAAU,GAAG,IAAI,EACzD,SAAS,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,EAAE,EAC7B,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,KAAK,MAAM,GACxC,CAAC,EAAE,CAAC;AACP,wBAAgB,eAAe,CAAC,CAAC,SAAS,UAAU,GAAG,IAAI,EACzD,OAAO,EAAE,CAAC,GAAG,UAAU,EACvB,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,KAAK,MAAM,GACxC,CAAC,CAAC;AAeL,eAAO,MAAM,6BAA6B,GACvC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAE5B,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,GAC9B,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,eAE/D,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,KAAG,gBAG/B,CAAC;AAEL,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;AAEjE,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,oBAAoB,CAO/B;AAED,eAAO,MAAM,iBAAiB,WAAY,oBAAoB,KAAG,UAChB,CAAC;AAElD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,UAAU,CAAC,CAgBrB;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,iBAAiB,EACtB,IAAI,EAAE,UAAU,qEAiBjB;AAED,OAAO,EACL,eAAe,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,81 @@
1
+ import z from 'zod';
2
+ import { uncaughtSwitchCase } from './utils';
3
+ // MARK: Types
4
+ export const documentIdSchema = z.union([
5
+ z.number(),
6
+ z.string()
7
+ ]);
8
+ export const documentReferenceSchema = z.discriminatedUnion('entity', [
9
+ z.object({
10
+ entity: z.literal('collection'),
11
+ slug: z.string(),
12
+ id: documentIdSchema
13
+ }),
14
+ z.object({
15
+ entity: z.literal('global'),
16
+ slug: z.string()
17
+ })
18
+ ]);
19
+ // MARK: Type Guards
20
+ export const isPopulated = (relationship)=>typeof relationship === 'object';
21
+ export function assertPopulated(value, errorMessage = (id)=>`Doc is not populated: [${id}]`) {
22
+ if (value === null) return value;
23
+ if (Array.isArray(value)) {
24
+ return value.map((item)=>assertPopulated(item, errorMessage));
25
+ }
26
+ if (isPopulated(value)) return value;
27
+ throw new Error(errorMessage(value));
28
+ }
29
+ // MARK: Utilities
30
+ export const createCollectionConfigFactory = (factory)=>(options)=>({
31
+ slug: options.slug,
32
+ ...typeof factory === 'function' ? factory(options) : factory
33
+ });
34
+ export function isIdentifiableDocument(value) {
35
+ if (typeof value === 'string') return true;
36
+ if (typeof value === 'number') return true;
37
+ if (value === null) return false;
38
+ if (typeof value !== 'object') return true;
39
+ if (!('id' in value)) return false;
40
+ return isIdentifiableDocument(value.id);
41
+ }
42
+ export const resolveDocumentID = (entity)=>typeof entity === 'object' ? entity.id : entity;
43
+ export function fetchDocumentByReference(payload, ref) {
44
+ switch(ref.entity){
45
+ case 'collection':
46
+ return payload.findByID({
47
+ collection: ref.slug,
48
+ id: ref.id,
49
+ depth: 0
50
+ });
51
+ case 'global':
52
+ return payload.findGlobal({
53
+ slug: ref.slug,
54
+ depth: 0
55
+ });
56
+ default:
57
+ return uncaughtSwitchCase(ref);
58
+ }
59
+ }
60
+ export async function updateDocumentByReference(payload, ref, data) {
61
+ switch(ref.entity){
62
+ case 'collection':
63
+ return payload.update({
64
+ collection: ref.slug,
65
+ id: ref.id,
66
+ data: data
67
+ });
68
+ case 'global':
69
+ return payload.updateGlobal({
70
+ slug: ref.slug,
71
+ data: data
72
+ });
73
+ default:
74
+ return uncaughtSwitchCase(ref);
75
+ }
76
+ }
77
+ export { defineProcedure } from './procedure';
78
+ export { getAdminURL, getApiURL, getServerURL } from './urls';
79
+ export { findFields, uncaughtSwitchCase } from './utils';
80
+
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/internals/index.ts"],"sourcesContent":["import type {\n BasePayload,\n CollectionConfig,\n CollectionSlug,\n GlobalSlug,\n JsonObject,\n TypeWithID,\n} from 'payload';\nimport z from 'zod';\nimport { uncaughtSwitchCase } from './utils';\n\n// MARK: Types\n\nexport const documentIdSchema = z.union([z.number(), z.string()]);\nexport type DocumentID = TypeWithID['id'] & z.infer<typeof documentIdSchema>;\n\nexport const documentReferenceSchema = z.discriminatedUnion('entity', [\n z.object({\n entity: z.literal('collection'),\n slug: z.string(),\n id: documentIdSchema,\n }),\n z.object({\n entity: z.literal('global'),\n slug: z.string(),\n }),\n]);\n\nexport type DocumentReference = z.infer<typeof documentReferenceSchema>;\n\n// MARK: Type Guards\n\nexport const isPopulated = <T extends TypeWithID>(\n relationship: T | DocumentID,\n): relationship is T => typeof relationship === 'object';\n\nexport function assertPopulated<T extends TypeWithID | null>(\n docsOrIds: (T | DocumentID)[],\n errorMessage?: (id: DocumentID) => string,\n): T[];\nexport function assertPopulated<T extends TypeWithID | null>(\n docOrId: T | DocumentID,\n errorMessage?: (id: DocumentID) => string,\n): T;\nexport function assertPopulated<T extends TypeWithID | null>(\n value: T | DocumentID | (T | DocumentID)[],\n errorMessage = (id: DocumentID) => `Doc is not populated: [${id}]`,\n): T | T[] {\n if (value === null) return value;\n if (Array.isArray(value)) {\n return value.map((item) => assertPopulated(item, errorMessage));\n }\n if (isPopulated(value)) return value;\n throw new Error(errorMessage(value as DocumentID));\n}\n\n// MARK: Utilities\n\nexport const createCollectionConfigFactory =\n <T extends Record<string, unknown>>(\n factory:\n | Omit<CollectionConfig, 'slug'>\n | ((options: T & { slug: string }) => Omit<CollectionConfig, 'slug'>),\n ) =>\n (options: T & { slug: string }): CollectionConfig => ({\n slug: options.slug,\n ...(typeof factory === 'function' ? factory(options) : factory),\n });\n\nexport type IdentifiableDocument = TypeWithID['id'] | TypeWithID;\n\nexport function isIdentifiableDocument(\n value: unknown,\n): value is IdentifiableDocument {\n if (typeof value === 'string') return true;\n if (typeof value === 'number') return true;\n if (value === null) return false;\n if (typeof value !== 'object') return true;\n if (!('id' in value)) return false;\n return isIdentifiableDocument(value.id);\n}\n\nexport const resolveDocumentID = (entity: IdentifiableDocument): DocumentID =>\n typeof entity === 'object' ? entity.id : entity;\n\nexport function fetchDocumentByReference(\n payload: BasePayload,\n ref: DocumentReference,\n): Promise<JsonObject> {\n switch (ref.entity) {\n case 'collection':\n return payload.findByID({\n collection: ref.slug as CollectionSlug,\n id: ref.id,\n depth: 0,\n });\n case 'global':\n return payload.findGlobal({\n slug: ref.slug as GlobalSlug,\n depth: 0,\n });\n default:\n return uncaughtSwitchCase(ref);\n }\n}\n\nexport async function updateDocumentByReference(\n payload: BasePayload,\n ref: DocumentReference,\n data: JsonObject,\n) {\n switch (ref.entity) {\n case 'collection':\n return payload.update({\n collection: ref.slug as CollectionSlug,\n id: ref.id,\n data: data,\n });\n case 'global':\n return payload.updateGlobal({\n slug: ref.slug as GlobalSlug,\n data: data as any,\n });\n default:\n return uncaughtSwitchCase(ref);\n }\n}\n\nexport {\n defineProcedure,\n type Procedure,\n type ProcedureBuilder,\n} from './procedure';\nexport { getAdminURL, getApiURL, getServerURL } from './urls';\nexport { findFields, uncaughtSwitchCase } from './utils';\n"],"names":["z","uncaughtSwitchCase","documentIdSchema","union","number","string","documentReferenceSchema","discriminatedUnion","object","entity","literal","slug","id","isPopulated","relationship","assertPopulated","value","errorMessage","Array","isArray","map","item","Error","createCollectionConfigFactory","factory","options","isIdentifiableDocument","resolveDocumentID","fetchDocumentByReference","payload","ref","findByID","collection","depth","findGlobal","updateDocumentByReference","data","update","updateGlobal","defineProcedure","getAdminURL","getApiURL","getServerURL","findFields"],"mappings":"AAQA,OAAOA,OAAO,MAAM;AACpB,SAASC,kBAAkB,QAAQ,UAAU;AAE7C,cAAc;AAEd,OAAO,MAAMC,mBAAmBF,EAAEG,KAAK,CAAC;IAACH,EAAEI,MAAM;IAAIJ,EAAEK,MAAM;CAAG,EAAE;AAGlE,OAAO,MAAMC,0BAA0BN,EAAEO,kBAAkB,CAAC,UAAU;IACpEP,EAAEQ,MAAM,CAAC;QACPC,QAAQT,EAAEU,OAAO,CAAC;QAClBC,MAAMX,EAAEK,MAAM;QACdO,IAAIV;IACN;IACAF,EAAEQ,MAAM,CAAC;QACPC,QAAQT,EAAEU,OAAO,CAAC;QAClBC,MAAMX,EAAEK,MAAM;IAChB;CACD,EAAE;AAIH,oBAAoB;AAEpB,OAAO,MAAMQ,cAAc,CACzBC,eACsB,OAAOA,iBAAiB,SAAS;AAUzD,OAAO,SAASC,gBACdC,KAA0C,EAC1CC,eAAe,CAACL,KAAmB,CAAC,uBAAuB,EAAEA,GAAG,CAAC,CAAC;IAElE,IAAII,UAAU,MAAM,OAAOA;IAC3B,IAAIE,MAAMC,OAAO,CAACH,QAAQ;QACxB,OAAOA,MAAMI,GAAG,CAAC,CAACC,OAASN,gBAAgBM,MAAMJ;IACnD;IACA,IAAIJ,YAAYG,QAAQ,OAAOA;IAC/B,MAAM,IAAIM,MAAML,aAAaD;AAC/B;AAEA,kBAAkB;AAElB,OAAO,MAAMO,gCACX,CACEC,UAIF,CAACC,UAAqD,CAAA;YACpDd,MAAMc,QAAQd,IAAI;YAClB,GAAI,OAAOa,YAAY,aAAaA,QAAQC,WAAWD,OAAO;QAChE,CAAA,EAAG;AAIL,OAAO,SAASE,uBACdV,KAAc;IAEd,IAAI,OAAOA,UAAU,UAAU,OAAO;IACtC,IAAI,OAAOA,UAAU,UAAU,OAAO;IACtC,IAAIA,UAAU,MAAM,OAAO;IAC3B,IAAI,OAAOA,UAAU,UAAU,OAAO;IACtC,IAAI,CAAE,CAAA,QAAQA,KAAI,GAAI,OAAO;IAC7B,OAAOU,uBAAuBV,MAAMJ,EAAE;AACxC;AAEA,OAAO,MAAMe,oBAAoB,CAAClB,SAChC,OAAOA,WAAW,WAAWA,OAAOG,EAAE,GAAGH,OAAO;AAElD,OAAO,SAASmB,yBACdC,OAAoB,EACpBC,GAAsB;IAEtB,OAAQA,IAAIrB,MAAM;QAChB,KAAK;YACH,OAAOoB,QAAQE,QAAQ,CAAC;gBACtBC,YAAYF,IAAInB,IAAI;gBACpBC,IAAIkB,IAAIlB,EAAE;gBACVqB,OAAO;YACT;QACF,KAAK;YACH,OAAOJ,QAAQK,UAAU,CAAC;gBACxBvB,MAAMmB,IAAInB,IAAI;gBACdsB,OAAO;YACT;QACF;YACE,OAAOhC,mBAAmB6B;IAC9B;AACF;AAEA,OAAO,eAAeK,0BACpBN,OAAoB,EACpBC,GAAsB,EACtBM,IAAgB;IAEhB,OAAQN,IAAIrB,MAAM;QAChB,KAAK;YACH,OAAOoB,QAAQQ,MAAM,CAAC;gBACpBL,YAAYF,IAAInB,IAAI;gBACpBC,IAAIkB,IAAIlB,EAAE;gBACVwB,MAAMA;YACR;QACF,KAAK;YACH,OAAOP,QAAQS,YAAY,CAAC;gBAC1B3B,MAAMmB,IAAInB,IAAI;gBACdyB,MAAMA;YACR;QACF;YACE,OAAOnC,mBAAmB6B;IAC9B;AACF;AAEA,SACES,eAAe,QAGV,cAAc;AACrB,SAASC,WAAW,EAAEC,SAAS,EAAEC,YAAY,QAAQ,SAAS;AAC9D,SAASC,UAAU,EAAE1C,kBAAkB,QAAQ,UAAU"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"procedure.d.ts","sourceRoot":"","sources":["../../src/internals/procedure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAExD,KAAK,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE1D,6DAA6D;AAC7D,UAAU,OAAO,CAAC,OAAO,GAAG,OAAO;IACjC,SAAS,CACP,IAAI,EAAE,OAAO,GACZ;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1E;AAED,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAE7D,UAAU,eAAe,CAAC,OAAO,SAAS,OAAO,GAAG,SAAS,GAAG,SAAS;IACvE,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,SAAS,CAAC,MAAM,EAAE,OAAO;IACxC,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CACN,OAAO,EAAE,CACP,GAAG,EAAE,cAAc,EACnB,GAAG,IAAI,EAAE,MAAM,SAAS,IAAI,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,KAChD,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,GAC/B,QAAQ,CAAC;IACZ,IAAI,CACF,MAAM,EAAE,MAAM,EACd,GAAG,IAAI,EAAE,MAAM,SAAS,IAAI,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAClD,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB,CAAC,MAAM;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,QAAQ,CACN,OAAO,EAAE,CACP,GAAG,EAAE,cAAc,EACnB,GAAG,IAAI,EAAE,MAAM,SAAS,IAAI,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,KAChD,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,GAC/B,QAAQ,CAAC;IACZ,IAAI,CACF,MAAM,EAAE,MAAM,EACd,GAAG,IAAI,EAAE,MAAM,SAAS,IAAI,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAClD,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AA4GD,wBAAgB,eAAe,CAC7B,OAAO,SAAS,OAAO,GAAG,SAAS,GAAG,SAAS,EAE/C,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,GAC/B,gBAAgB,CAAC,OAAO,SAAS,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAazE"}
@@ -58,6 +58,7 @@ function createProcedure(config, inputSchema) {
58
58
  const queryParams = {};
59
59
  if (input) {
60
60
  for (const [key, value] of Object.entries(input)){
61
+ if (value == null) continue;
61
62
  if (resolvedPath.includes(`:${key}`)) {
62
63
  resolvedPath = resolvedPath.replace(`:${key}`, encodeURIComponent(String(value)));
63
64
  } else {
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/internals/procedure.ts"],"sourcesContent":["import type { Endpoint, PayloadRequest } from 'payload';\n\ntype Method = 'get' | 'post' | 'put' | 'patch' | 'delete';\n\n/** Any Zod-like schema with safeParse and inferred output */\ninterface ZodLike<TOutput = unknown> {\n safeParse(\n data: unknown,\n ): { success: true; data: TOutput } | { success: false; error: unknown };\n}\n\ntype InferOutput<T> = T extends ZodLike<infer O> ? O : never;\n\ninterface ProcedureConfig<TSchema extends ZodLike | undefined = undefined> {\n path: `/${string}`;\n method: Method;\n input?: TSchema;\n}\n\nexport interface Procedure<TInput, TOutput> {\n path: `/${string}`;\n method: Method;\n endpoint(\n handler: (\n req: PayloadRequest,\n ...args: TInput extends void ? [] : [input: TInput]\n ) => Promise<unknown | Response>,\n ): Endpoint;\n call(\n apiUrl: string,\n ...args: TInput extends void ? [] : [input: TInput]\n ): Promise<TOutput>;\n}\n\nexport interface ProcedureBuilder<TInput> {\n path: string;\n method: Method;\n returns<TOutput>(): Procedure<TInput, TOutput>;\n endpoint(\n handler: (\n req: PayloadRequest,\n ...args: TInput extends void ? [] : [input: TInput]\n ) => Promise<unknown | Response>,\n ): Endpoint;\n call(\n apiUrl: string,\n ...args: TInput extends void ? [] : [input: TInput]\n ): Promise<unknown>;\n}\n\nfunction wrapOutput(output: unknown): Response {\n if (output instanceof Response) return output;\n return Response.json(output);\n}\n\nfunction createProcedure<TInput, TOutput>(\n config: ProcedureConfig<ZodLike | undefined>,\n inputSchema: ZodLike | undefined,\n): Procedure<TInput, TOutput> {\n return {\n path: config.path,\n method: config.method,\n endpoint(handler) {\n return {\n path: config.path,\n method: config.method,\n handler: async (req) => {\n if (inputSchema) {\n if (config.method === 'get') {\n const routeParams = req.routeParams ?? {};\n const searchParams = req.searchParams\n ? Object.fromEntries(req.searchParams.entries())\n : {};\n const merged = { ...searchParams, ...routeParams };\n const result = inputSchema.safeParse(merged);\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n // biome-ignore lint/complexity/noBannedTypes: ugly type cast\n const output = await (handler as Function)(req, result.data);\n return wrapOutput(output);\n }\n\n const { addDataAndFileToRequest } = await import(\n /* webpackIgnore: true */ 'payload'\n );\n await addDataAndFileToRequest(req);\n const result = inputSchema.safeParse(req.data);\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n // biome-ignore lint/complexity/noBannedTypes: ugly type cast\n const output = await (handler as Function)(req, result.data);\n return wrapOutput(output);\n }\n // biome-ignore lint/complexity/noBannedTypes: ugly type cast\n const output = await (handler as Function)(req);\n return wrapOutput(output);\n },\n };\n },\n call(apiUrl, ...args) {\n const input = args[0] as Record<string, unknown> | undefined;\n\n if (config.method === 'get') {\n let resolvedPath = config.path;\n const queryParams: Record<string, string> = {};\n\n if (input) {\n for (const [key, value] of Object.entries(input)) {\n if (value == null) continue;\n if (resolvedPath.includes(`:${key}`)) {\n resolvedPath = resolvedPath.replace(\n `:${key}`,\n encodeURIComponent(String(value)),\n ) as `/${string}`;\n } else {\n queryParams[key] = String(value);\n }\n }\n }\n\n const queryString = new URLSearchParams(queryParams).toString();\n const url = `${apiUrl}${resolvedPath}${queryString ? `?${queryString}` : ''}`;\n\n return fetch(url, {\n method: 'GET',\n credentials: 'include',\n }).then(async (response) => {\n if (!response.ok) {\n throw new Error(\n `Request failed: ${response.status} ${response.statusText}`,\n );\n }\n return response.json();\n }) as Promise<TOutput>;\n }\n\n const url = `${apiUrl}${config.path}`;\n return fetch(url, {\n method: config.method.toUpperCase(),\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n body: input ? JSON.stringify(input) : undefined,\n }).then(async (response) => {\n if (!response.ok) {\n throw new Error(\n `Request failed: ${response.status} ${response.statusText}`,\n );\n }\n return response.json();\n }) as Promise<TOutput>;\n },\n };\n}\n\nexport function defineProcedure<\n TSchema extends ZodLike | undefined = undefined,\n>(\n config: ProcedureConfig<TSchema>,\n): ProcedureBuilder<TSchema extends ZodLike ? InferOutput<TSchema> : void> {\n type TInput = TSchema extends ZodLike ? InferOutput<TSchema> : undefined;\n const proc = createProcedure<TInput, unknown>(config, config.input);\n\n return {\n path: config.path,\n method: config.method,\n returns<TOutput>(): Procedure<TInput, TOutput> {\n return createProcedure<TInput, TOutput>(config, config.input);\n },\n endpoint: proc.endpoint as unknown as ProcedureBuilder<TInput>['endpoint'],\n call: proc.call as ProcedureBuilder<TInput>['call'],\n };\n}\n"],"names":["wrapOutput","output","Response","json","createProcedure","config","inputSchema","path","method","endpoint","handler","req","routeParams","searchParams","Object","fromEntries","entries","merged","result","safeParse","success","error","status","data","addDataAndFileToRequest","call","apiUrl","args","input","resolvedPath","queryParams","key","value","includes","replace","encodeURIComponent","String","queryString","URLSearchParams","toString","url","fetch","credentials","then","response","ok","Error","statusText","toUpperCase","headers","body","JSON","stringify","undefined","defineProcedure","proc","returns"],"mappings":"AAkDA,SAASA,WAAWC,MAAe;IACjC,IAAIA,kBAAkBC,UAAU,OAAOD;IACvC,OAAOC,SAASC,IAAI,CAACF;AACvB;AAEA,SAASG,gBACPC,MAA4C,EAC5CC,WAAgC;IAEhC,OAAO;QACLC,MAAMF,OAAOE,IAAI;QACjBC,QAAQH,OAAOG,MAAM;QACrBC,UAASC,OAAO;YACd,OAAO;gBACLH,MAAMF,OAAOE,IAAI;gBACjBC,QAAQH,OAAOG,MAAM;gBACrBE,SAAS,OAAOC;oBACd,IAAIL,aAAa;wBACf,IAAID,OAAOG,MAAM,KAAK,OAAO;4BAC3B,MAAMI,cAAcD,IAAIC,WAAW,IAAI,CAAC;4BACxC,MAAMC,eAAeF,IAAIE,YAAY,GACjCC,OAAOC,WAAW,CAACJ,IAAIE,YAAY,CAACG,OAAO,MAC3C,CAAC;4BACL,MAAMC,SAAS;gCAAE,GAAGJ,YAAY;gCAAE,GAAGD,WAAW;4BAAC;4BACjD,MAAMM,SAASZ,YAAYa,SAAS,CAACF;4BACrC,IAAI,CAACC,OAAOE,OAAO,EAAE;gCACnB,OAAOlB,SAASC,IAAI,CAAC;oCAAEkB,OAAOH,OAAOG,KAAK;gCAAC,GAAG;oCAAEC,QAAQ;gCAAI;4BAC9D;4BACA,6DAA6D;4BAC7D,MAAMrB,SAAS,MAAM,AAACS,QAAqBC,KAAKO,OAAOK,IAAI;4BAC3D,OAAOvB,WAAWC;wBACpB;wBAEA,MAAM,EAAEuB,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAC9C,uBAAuB,GAAG;wBAE5B,MAAMA,wBAAwBb;wBAC9B,MAAMO,SAASZ,YAAYa,SAAS,CAACR,IAAIY,IAAI;wBAC7C,IAAI,CAACL,OAAOE,OAAO,EAAE;4BACnB,OAAOlB,SAASC,IAAI,CAAC;gCAAEkB,OAAOH,OAAOG,KAAK;4BAAC,GAAG;gCAAEC,QAAQ;4BAAI;wBAC9D;wBACA,6DAA6D;wBAC7D,MAAMrB,SAAS,MAAM,AAACS,QAAqBC,KAAKO,OAAOK,IAAI;wBAC3D,OAAOvB,WAAWC;oBACpB;oBACA,6DAA6D;oBAC7D,MAAMA,SAAS,MAAM,AAACS,QAAqBC;oBAC3C,OAAOX,WAAWC;gBACpB;YACF;QACF;QACAwB,MAAKC,MAAM,EAAE,GAAGC,IAAI;YAClB,MAAMC,QAAQD,IAAI,CAAC,EAAE;YAErB,IAAItB,OAAOG,MAAM,KAAK,OAAO;gBAC3B,IAAIqB,eAAexB,OAAOE,IAAI;gBAC9B,MAAMuB,cAAsC,CAAC;gBAE7C,IAAIF,OAAO;oBACT,KAAK,MAAM,CAACG,KAAKC,MAAM,IAAIlB,OAAOE,OAAO,CAACY,OAAQ;wBAChD,IAAII,SAAS,MAAM;wBACnB,IAAIH,aAAaI,QAAQ,CAAC,CAAC,CAAC,EAAEF,KAAK,GAAG;4BACpCF,eAAeA,aAAaK,OAAO,CACjC,CAAC,CAAC,EAAEH,KAAK,EACTI,mBAAmBC,OAAOJ;wBAE9B,OAAO;4BACLF,WAAW,CAACC,IAAI,GAAGK,OAAOJ;wBAC5B;oBACF;gBACF;gBAEA,MAAMK,cAAc,IAAIC,gBAAgBR,aAAaS,QAAQ;gBAC7D,MAAMC,MAAM,GAAGd,SAASG,eAAeQ,cAAc,CAAC,CAAC,EAAEA,aAAa,GAAG,IAAI;gBAE7E,OAAOI,MAAMD,KAAK;oBAChBhC,QAAQ;oBACRkC,aAAa;gBACf,GAAGC,IAAI,CAAC,OAAOC;oBACb,IAAI,CAACA,SAASC,EAAE,EAAE;wBAChB,MAAM,IAAIC,MACR,CAAC,gBAAgB,EAAEF,SAAStB,MAAM,CAAC,CAAC,EAAEsB,SAASG,UAAU,EAAE;oBAE/D;oBACA,OAAOH,SAASzC,IAAI;gBACtB;YACF;YAEA,MAAMqC,MAAM,GAAGd,SAASrB,OAAOE,IAAI,EAAE;YACrC,OAAOkC,MAAMD,KAAK;gBAChBhC,QAAQH,OAAOG,MAAM,CAACwC,WAAW;gBACjCN,aAAa;gBACbO,SAAS;oBAAE,gBAAgB;gBAAmB;gBAC9CC,MAAMtB,QAAQuB,KAAKC,SAAS,CAACxB,SAASyB;YACxC,GAAGV,IAAI,CAAC,OAAOC;gBACb,IAAI,CAACA,SAASC,EAAE,EAAE;oBAChB,MAAM,IAAIC,MACR,CAAC,gBAAgB,EAAEF,SAAStB,MAAM,CAAC,CAAC,EAAEsB,SAASG,UAAU,EAAE;gBAE/D;gBACA,OAAOH,SAASzC,IAAI;YACtB;QACF;IACF;AACF;AAEA,OAAO,SAASmD,gBAGdjD,MAAgC;IAGhC,MAAMkD,OAAOnD,gBAAiCC,QAAQA,OAAOuB,KAAK;IAElE,OAAO;QACLrB,MAAMF,OAAOE,IAAI;QACjBC,QAAQH,OAAOG,MAAM;QACrBgD;YACE,OAAOpD,gBAAiCC,QAAQA,OAAOuB,KAAK;QAC9D;QACAnB,UAAU8C,KAAK9C,QAAQ;QACvBgB,MAAM8B,KAAK9B,IAAI;IACjB;AACF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../../src/internals/urls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAWxD;AAED,wBAAgB,WAAW,CAAC,EAC1B,GAAG,EACH,IAAI,GACL,EAAE;IACD,GAAG,EAAE,cAAc,CAAC;IACpB,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,CAAC;CACjC,GAAG,MAAM,CAMT;AAED,wBAAgB,SAAS,CAAC,EACxB,GAAG,EACH,IAAI,GACL,EAAE;IACD,GAAG,EAAE,cAAc,CAAC;IACpB,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,CAAC;CACjC,GAAG,MAAM,CAMT"}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/internals/urls.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload';\nimport { formatAdminURL } from 'payload/shared';\n\nexport function getServerURL(req: PayloadRequest): string {\n if (!req.url)\n throw new Error(\n 'Could not get serverURL, since request URL is not available',\n );\n\n const { config } = req.payload;\n\n if (config.serverURL) return config.serverURL;\n\n return `${new URL(req.url).protocol}//${req.headers.get('host')}`;\n}\n\nexport function getAdminURL({\n req,\n path,\n}: {\n req: PayloadRequest;\n path?: '' | `/${string}` | null;\n}): string {\n return formatAdminURL({\n adminRoute: req.payload.config.routes.admin,\n serverURL: getServerURL(req),\n path,\n });\n}\n\nexport function getApiURL({\n req,\n path,\n}: {\n req: PayloadRequest;\n path?: '' | `/${string}` | null;\n}): string {\n return formatAdminURL({\n apiRoute: req.payload.config.routes.api,\n serverURL: getServerURL(req),\n path,\n });\n}\n"],"names":["formatAdminURL","getServerURL","req","url","Error","config","payload","serverURL","URL","protocol","headers","get","getAdminURL","path","adminRoute","routes","admin","getApiURL","apiRoute","api"],"mappings":"AACA,SAASA,cAAc,QAAQ,iBAAiB;AAEhD,OAAO,SAASC,aAAaC,GAAmB;IAC9C,IAAI,CAACA,IAAIC,GAAG,EACV,MAAM,IAAIC,MACR;IAGJ,MAAM,EAAEC,MAAM,EAAE,GAAGH,IAAII,OAAO;IAE9B,IAAID,OAAOE,SAAS,EAAE,OAAOF,OAAOE,SAAS;IAE7C,OAAO,GAAG,IAAIC,IAAIN,IAAIC,GAAG,EAAEM,QAAQ,CAAC,EAAE,EAAEP,IAAIQ,OAAO,CAACC,GAAG,CAAC,SAAS;AACnE;AAEA,OAAO,SAASC,YAAY,EAC1BV,GAAG,EACHW,IAAI,EAIL;IACC,OAAOb,eAAe;QACpBc,YAAYZ,IAAII,OAAO,CAACD,MAAM,CAACU,MAAM,CAACC,KAAK;QAC3CT,WAAWN,aAAaC;QACxBW;IACF;AACF;AAEA,OAAO,SAASI,UAAU,EACxBf,GAAG,EACHW,IAAI,EAIL;IACC,OAAOb,eAAe;QACpBkB,UAAUhB,IAAII,OAAO,CAACD,MAAM,CAACU,MAAM,CAACI,GAAG;QACvCZ,WAAWN,aAAaC;QACxBW;IACF;AACF"}
@@ -0,0 +1,8 @@
1
+ import type { Field } from 'payload';
2
+ export declare const uncaughtSwitchCase: (value: never) => never;
3
+ export type FieldWithPath<T extends Field> = T & {
4
+ path: string[];
5
+ };
6
+ export declare function findFields<T extends Field>(fields: Field[], condition: (field: Field) => field is T, path?: string[]): FieldWithPath<T>[];
7
+ export declare function findFields(fields: Field[], condition: (field: Field) => boolean, path?: string[]): FieldWithPath<Field>[];
8
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/internals/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,eAAO,MAAM,kBAAkB,UAAW,KAAK,UAE9C,CAAC;AAEF,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,GAAG;IAC/C,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAAC;AAEF,wBAAgB,UAAU,CAAC,CAAC,SAAS,KAAK,EACxC,MAAM,EAAE,KAAK,EAAE,EACf,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,IAAI,CAAC,EACvC,IAAI,CAAC,EAAE,MAAM,EAAE,GACd,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;AACtB,wBAAgB,UAAU,CACxB,MAAM,EAAE,KAAK,EAAE,EACf,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,EACpC,IAAI,CAAC,EAAE,MAAM,EAAE,GACd,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC"}
@@ -1,21 +1,36 @@
1
1
  export const uncaughtSwitchCase = (value)=>{
2
2
  throw new Error(`Unhandled switch case: ${value}`);
3
3
  };
4
- export function findFields(fields, condition) {
4
+ export function findFields(fields, condition, path = []) {
5
5
  return fields.flatMap((field)=>{
6
6
  if (condition(field)) {
7
7
  return [
8
- field
8
+ {
9
+ ...field,
10
+ path: 'name' in field ? [
11
+ ...path,
12
+ field.name
13
+ ] : path
14
+ }
9
15
  ];
10
16
  }
11
17
  if ('fields' in field) {
12
- return findFields(field.fields, condition);
18
+ return findFields(field.fields, condition, 'name' in field ? [
19
+ ...path,
20
+ field.name
21
+ ] : path);
13
22
  }
14
23
  switch(field.type){
15
24
  case 'blocks':
16
- return field.blocks.flatMap((block)=>findFields(block.fields, condition));
25
+ return field.blocks.flatMap((block)=>findFields(block.fields, condition, [
26
+ ...path,
27
+ field.name
28
+ ]));
17
29
  case 'tabs':
18
- return field.tabs.flatMap((tab)=>findFields(tab.fields, condition));
30
+ return field.tabs.flatMap((tab)=>findFields(tab.fields, condition, 'name' in tab ? [
31
+ ...path,
32
+ tab.name
33
+ ] : path));
19
34
  case 'text':
20
35
  case 'richText':
21
36
  case 'number':
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/internals/utils.ts"],"sourcesContent":["import type { Field } from 'payload';\n\nexport const uncaughtSwitchCase = (value: never) => {\n throw new Error(`Unhandled switch case: ${value}`);\n};\n\nexport type FieldWithPath<T extends Field> = T & {\n path: string[];\n};\n\nexport function findFields<T extends Field>(\n fields: Field[],\n condition: (field: Field) => field is T,\n path?: string[],\n): FieldWithPath<T>[];\nexport function findFields(\n fields: Field[],\n condition: (field: Field) => boolean,\n path?: string[],\n): FieldWithPath<Field>[];\nexport function findFields(\n fields: Field[],\n condition: (field: Field) => boolean,\n path: string[] = [],\n): FieldWithPath<Field>[] {\n return fields.flatMap((field) => {\n if (condition(field)) {\n return [\n { ...field, path: 'name' in field ? [...path, field.name] : path },\n ];\n }\n\n if ('fields' in field) {\n return findFields(\n field.fields,\n condition,\n 'name' in field ? [...path, field.name] : path,\n );\n }\n\n switch (field.type) {\n case 'blocks':\n return field.blocks.flatMap((block) =>\n findFields(block.fields, condition, [...path, field.name]),\n );\n case 'tabs':\n return field.tabs.flatMap((tab) =>\n findFields(\n tab.fields,\n condition,\n 'name' in tab ? [...path, tab.name] : path,\n ),\n );\n case 'text':\n case 'richText':\n case 'number':\n case 'checkbox':\n case 'date':\n case 'email':\n case 'select':\n case 'json':\n case 'code':\n case 'join':\n case 'point':\n case 'radio':\n case 'textarea':\n case 'ui':\n case 'relationship':\n case 'upload':\n return [];\n default:\n return uncaughtSwitchCase(field);\n }\n });\n}\n"],"names":["uncaughtSwitchCase","value","Error","findFields","fields","condition","path","flatMap","field","name","type","blocks","block","tabs","tab"],"mappings":"AAEA,OAAO,MAAMA,qBAAqB,CAACC;IACjC,MAAM,IAAIC,MAAM,CAAC,uBAAuB,EAAED,OAAO;AACnD,EAAE;AAgBF,OAAO,SAASE,WACdC,MAAe,EACfC,SAAoC,EACpCC,OAAiB,EAAE;IAEnB,OAAOF,OAAOG,OAAO,CAAC,CAACC;QACrB,IAAIH,UAAUG,QAAQ;YACpB,OAAO;gBACL;oBAAE,GAAGA,KAAK;oBAAEF,MAAM,UAAUE,QAAQ;2BAAIF;wBAAME,MAAMC,IAAI;qBAAC,GAAGH;gBAAK;aAClE;QACH;QAEA,IAAI,YAAYE,OAAO;YACrB,OAAOL,WACLK,MAAMJ,MAAM,EACZC,WACA,UAAUG,QAAQ;mBAAIF;gBAAME,MAAMC,IAAI;aAAC,GAAGH;QAE9C;QAEA,OAAQE,MAAME,IAAI;YAChB,KAAK;gBACH,OAAOF,MAAMG,MAAM,CAACJ,OAAO,CAAC,CAACK,QAC3BT,WAAWS,MAAMR,MAAM,EAAEC,WAAW;2BAAIC;wBAAME,MAAMC,IAAI;qBAAC;YAE7D,KAAK;gBACH,OAAOD,MAAMK,IAAI,CAACN,OAAO,CAAC,CAACO,MACzBX,WACEW,IAAIV,MAAM,EACVC,WACA,UAAUS,MAAM;2BAAIR;wBAAMQ,IAAIL,IAAI;qBAAC,GAAGH;YAG5C,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;gBACH,OAAO,EAAE;YACX;gBACE,OAAON,mBAAmBQ;QAC9B;IACF;AACF"}