payload-intl 0.0.1

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 (101) hide show
  1. package/README.md +67 -0
  2. package/dist/components/MessageController.d.ts +14 -0
  3. package/dist/components/MessageController.js +64 -0
  4. package/dist/components/MessageController.js.map +1 -0
  5. package/dist/components/MessagesForm.d.ts +11 -0
  6. package/dist/components/MessagesForm.js +91 -0
  7. package/dist/components/MessagesForm.js.map +1 -0
  8. package/dist/components/actions/JsonImport.d.ts +1 -0
  9. package/dist/components/actions/Move.d.ts +3 -0
  10. package/dist/components/inputs/InputWrapper.d.ts +7 -0
  11. package/dist/components/inputs/InputWrapper.js +23 -0
  12. package/dist/components/inputs/InputWrapper.js.map +1 -0
  13. package/dist/components/inputs/MessageInput.d.ts +10 -0
  14. package/dist/components/inputs/MessageInput.js +52 -0
  15. package/dist/components/inputs/MessageInput.js.map +1 -0
  16. package/dist/components/inputs/RichTextInput.d.ts +8 -0
  17. package/dist/components/inputs/RichTextInput.js +81 -0
  18. package/dist/components/inputs/RichTextInput.js.map +1 -0
  19. package/dist/components/inputs/toolbar/AlignmentControls.d.ts +5 -0
  20. package/dist/components/inputs/toolbar/AlignmentControls.js +59 -0
  21. package/dist/components/inputs/toolbar/AlignmentControls.js.map +1 -0
  22. package/dist/components/inputs/toolbar/BlockElementSelect.d.ts +5 -0
  23. package/dist/components/inputs/toolbar/BlockElementSelect.js +129 -0
  24. package/dist/components/inputs/toolbar/BlockElementSelect.js.map +1 -0
  25. package/dist/components/inputs/toolbar/LinkEditor.d.ts +58 -0
  26. package/dist/components/inputs/toolbar/LinkEditor.js +230 -0
  27. package/dist/components/inputs/toolbar/LinkEditor.js.map +1 -0
  28. package/dist/components/inputs/toolbar/MarkControls.d.ts +5 -0
  29. package/dist/components/inputs/toolbar/MarkControls.js +47 -0
  30. package/dist/components/inputs/toolbar/MarkControls.js.map +1 -0
  31. package/dist/components/inputs/toolbar/RichTextToolbar.d.ts +6 -0
  32. package/dist/components/inputs/toolbar/RichTextToolbar.js +32 -0
  33. package/dist/components/inputs/toolbar/RichTextToolbar.js.map +1 -0
  34. package/dist/components/inputs/variables/VariableChip.d.ts +2 -0
  35. package/dist/components/inputs/variables/VariableChip.js +60 -0
  36. package/dist/components/inputs/variables/VariableChip.js.map +1 -0
  37. package/dist/components/inputs/variables/VariableSuggestion.d.ts +8 -0
  38. package/dist/components/inputs/variables/VariableSuggestion.js +40 -0
  39. package/dist/components/inputs/variables/VariableSuggestion.js.map +1 -0
  40. package/dist/components/inputs/variables/editors/DateVariableEditor.d.ts +9 -0
  41. package/dist/components/inputs/variables/editors/PluralVariableEditor.d.ts +9 -0
  42. package/dist/components/inputs/variables/editors/PluralVariableEditor.js +149 -0
  43. package/dist/components/inputs/variables/editors/PluralVariableEditor.js.map +1 -0
  44. package/dist/components/inputs/variables/editors/SelectVariableEditor.d.ts +6 -0
  45. package/dist/components/inputs/variables/editors/SelectVariableEditor.js +42 -0
  46. package/dist/components/inputs/variables/editors/SelectVariableEditor.js.map +1 -0
  47. package/dist/components/inputs/variables/editors/TagVariableEditor.d.ts +6 -0
  48. package/dist/components/inputs/variables/editors/TagVariableEditor.js +32 -0
  49. package/dist/components/inputs/variables/editors/TagVariableEditor.js.map +1 -0
  50. package/dist/components/inputs/variables/editors/TimeVariableEditor.d.ts +9 -0
  51. package/dist/components/inputs/variables/extension.d.ts +3 -0
  52. package/dist/components/inputs/variables/extension.js +93 -0
  53. package/dist/components/inputs/variables/extension.js.map +1 -0
  54. package/dist/components/inputs/variables/pickers/NumericVariablePicker.d.ts +6 -0
  55. package/dist/components/inputs/variables/pickers/NumericVariablePicker.js +49 -0
  56. package/dist/components/inputs/variables/pickers/NumericVariablePicker.js.map +1 -0
  57. package/dist/components/inputs/variables/pickers/TemporalElementEditor.d.ts +6 -0
  58. package/dist/components/layout/MessageField.d.ts +9 -0
  59. package/dist/components/layout/MessageField.js +46 -0
  60. package/dist/components/layout/MessageField.js.map +1 -0
  61. package/dist/components/layout/MessagesTabs.d.ts +8 -0
  62. package/dist/components/layout/MessagesTabs.js +43 -0
  63. package/dist/components/layout/MessagesTabs.js.map +1 -0
  64. package/dist/components/layout/MessagesTree.d.ts +9 -0
  65. package/dist/components/layout/MessagesTree.js +67 -0
  66. package/dist/components/layout/MessagesTree.js.map +1 -0
  67. package/dist/context/messages-form.d.ts +30 -0
  68. package/dist/endpoints/get-messages.d.ts +2 -0
  69. package/dist/endpoints/get-messages.js +13 -0
  70. package/dist/endpoints/get-messages.js.map +1 -0
  71. package/dist/endpoints/set-messages.d.ts +2 -0
  72. package/dist/endpoints/set-messages.js +47 -0
  73. package/dist/endpoints/set-messages.js.map +1 -0
  74. package/dist/exports/link.d.ts +7 -0
  75. package/dist/exports/link.js +20 -0
  76. package/dist/exports/link.js.map +1 -0
  77. package/dist/exports/rsc.d.ts +2 -0
  78. package/dist/exports/rsc.js +7 -0
  79. package/dist/exports/rsc.js.map +1 -0
  80. package/dist/exports/view.d.ts +10 -0
  81. package/dist/exports/view.js +56 -0
  82. package/dist/exports/view.js.map +1 -0
  83. package/dist/index.d.ts +5 -0
  84. package/dist/index.js +76 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/requests/fetchMessages.d.ts +3 -0
  87. package/dist/requests/fetchMessages.js +29 -0
  88. package/dist/requests/fetchMessages.js.map +1 -0
  89. package/dist/styles.css +1 -0
  90. package/dist/types.d.ts +48 -0
  91. package/dist/utils/cn.d.ts +2 -0
  92. package/dist/utils/config.d.ts +11 -0
  93. package/dist/utils/config.js +19 -0
  94. package/dist/utils/config.js.map +1 -0
  95. package/dist/utils/format.d.ts +3 -0
  96. package/dist/utils/guards.d.ts +4 -0
  97. package/dist/utils/icu-tranform.d.ts +30 -0
  98. package/dist/utils/sanitize.d.ts +15 -0
  99. package/dist/utils/schema.d.ts +9 -0
  100. package/dist/utils/validate.d.ts +5 -0
  101. package/package.json +131 -0
@@ -0,0 +1,6 @@
1
+ import { DateElement, TimeElement } from '../../../../types.ts';
2
+ export interface TemporalElementEditorProps {
3
+ element: DateElement | TimeElement;
4
+ onUpdate: (value: string) => void;
5
+ }
6
+ export declare function TemporalElementEditor({ element, onUpdate, }: TemporalElementEditorProps): import("react").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import { MessageSchema } from '../../types.ts';
2
+ interface MessageFieldProps {
3
+ schema: MessageSchema;
4
+ messageKey: string;
5
+ path: string;
6
+ className?: string;
7
+ }
8
+ export declare function MessageField({ schema, messageKey, path, className, }: MessageFieldProps): React.ReactNode;
9
+ export {};
@@ -0,0 +1,46 @@
1
+ import { useMemo as s } from "react";
2
+ import { useMessagesForm as c } from "@/context/messages-form";
3
+ import { cn as p } from "@/utils/cn";
4
+ import { toWords as v } from "@/utils/format";
5
+ import { parseMessageSchema as f } from "@/utils/schema";
6
+ import { createValidator as d } from "@/utils/validate";
7
+ import { MessageController as n } from "../MessageController.js";
8
+ function y({
9
+ schema: o,
10
+ messageKey: r,
11
+ path: l,
12
+ className: i
13
+ }) {
14
+ const { locales: a } = c(), e = s(() => f(o), [o]), m = s(
15
+ () => d(e.variables),
16
+ [e.variables]
17
+ );
18
+ return /* @__PURE__ */ React.createElement("div", { className: p("", i) }, e.description && /* @__PURE__ */ React.createElement("p", null, e.description), a.length === 1 ? /* @__PURE__ */ React.createElement(
19
+ n,
20
+ {
21
+ className: i,
22
+ type: e.type,
23
+ variables: e.variables,
24
+ label: v(r),
25
+ locale: a[0],
26
+ name: [a[0], l, r].join("."),
27
+ validate: m
28
+ }
29
+ ) : /* @__PURE__ */ React.createElement("div", { className: "-mx-3 flex min-w-0 gap-4 overflow-x-auto overscroll-x-none px-3" }, a.map((t) => /* @__PURE__ */ React.createElement(
30
+ n,
31
+ {
32
+ key: t,
33
+ className: "flex-1",
34
+ type: e.type,
35
+ label: t.toUpperCase(),
36
+ locale: t,
37
+ variables: e.variables,
38
+ name: [t, l, r].join("."),
39
+ validate: m
40
+ }
41
+ ))));
42
+ }
43
+ export {
44
+ y as MessageField
45
+ };
46
+ //# sourceMappingURL=MessageField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageField.js","sources":["../../../src/components/layout/MessageField.tsx"],"sourcesContent":["import type { MessageSchema } from \"@/types\";\nimport { useMemo } from \"react\";\n\nimport { useMessagesForm } from \"@/context/messages-form\";\nimport { cn } from \"@/utils/cn\";\nimport { toWords } from \"@/utils/format\";\nimport { parseMessageSchema } from \"@/utils/schema\";\nimport { createValidator } from \"@/utils/validate\";\n\nimport { MessageController } from \"../MessageController\";\n\ninterface MessageFieldProps {\n schema: MessageSchema;\n messageKey: string;\n path: string;\n className?: string;\n}\n\nexport function MessageField({\n schema,\n messageKey,\n path,\n className,\n}: MessageFieldProps): React.ReactNode {\n const { locales } = useMessagesForm();\n\n const config = useMemo(() => parseMessageSchema(schema), [schema]);\n\n const validator = useMemo(\n () => createValidator(config.variables),\n [config.variables],\n );\n\n return (\n <div className={cn(\"\", className)}>\n {config.description && <p>{config.description}</p>}\n\n {locales.length === 1 ? (\n <MessageController\n className={className}\n type={config.type}\n variables={config.variables}\n label={toWords(messageKey)}\n locale={locales[0]}\n name={[locales[0], path, messageKey].join(\".\")}\n validate={validator}\n />\n ) : (\n <div className=\"-mx-3 flex min-w-0 gap-4 overflow-x-auto overscroll-x-none px-3\">\n {locales.map((locale) => (\n <MessageController\n key={locale}\n className=\"flex-1\"\n type={config.type}\n label={locale.toUpperCase()}\n locale={locale}\n variables={config.variables}\n name={[locale, path, messageKey].join(\".\")}\n validate={validator}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"names":["MessageField","schema","messageKey","path","className","locales","useMessagesForm","config","useMemo","parseMessageSchema","validator","createValidator","cn","MessageController","toWords","locale"],"mappings":";;;;;;;AAkBO,SAASA,EAAa;AAAA,EAC3B,QAAAC;AAAA,EACA,YAAAC;AAAA,EACA,MAAAC;AAAA,EACA,WAAAC;AACF,GAAuC;AACrC,QAAM,EAAE,SAAAC,EAAA,IAAYC,EAAA,GAEdC,IAASC,EAAQ,MAAMC,EAAmBR,CAAM,GAAG,CAACA,CAAM,CAAC,GAE3DS,IAAYF;AAAA,IAChB,MAAMG,EAAgBJ,EAAO,SAAS;AAAA,IACtC,CAACA,EAAO,SAAS;AAAA,EAAA;AAGnB,6CACG,OAAA,EAAI,WAAWK,EAAG,IAAIR,CAAS,EAAA,GAC7BG,EAAO,eAAe,sBAAA,cAAC,WAAGA,EAAO,WAAY,GAE7CF,EAAQ,WAAW,IAClB,sBAAA;AAAA,IAACQ;AAAA,IAAA;AAAA,MACC,WAAAT;AAAA,MACA,MAAMG,EAAO;AAAA,MACb,WAAWA,EAAO;AAAA,MAClB,OAAOO,EAAQZ,CAAU;AAAA,MACzB,QAAQG,EAAQ,CAAC;AAAA,MACjB,MAAM,CAACA,EAAQ,CAAC,GAAGF,GAAMD,CAAU,EAAE,KAAK,GAAG;AAAA,MAC7C,UAAUQ;AAAA,IAAA;AAAA,EAAA,wCAGX,OAAA,EAAI,WAAU,qEACZL,EAAQ,IAAI,CAACU,MACZ,sBAAA;AAAA,IAACF;AAAA,IAAA;AAAA,MACC,KAAKE;AAAA,MACL,WAAU;AAAA,MACV,MAAMR,EAAO;AAAA,MACb,OAAOQ,EAAO,YAAA;AAAA,MACd,QAAAA;AAAA,MACA,WAAWR,EAAO;AAAA,MAClB,MAAM,CAACQ,GAAQZ,GAAMD,CAAU,EAAE,KAAK,GAAG;AAAA,MACzC,UAAUQ;AAAA,IAAA;AAAA,EAAA,CAEb,CACH,CAEJ;AAEJ;"}
@@ -0,0 +1,8 @@
1
+ import { MessagesSchema } from '../../types.ts';
2
+ interface MessagesTabsProps {
3
+ schema: MessagesSchema;
4
+ activeTab: string | undefined;
5
+ setActiveTab: (tab: string) => void;
6
+ }
7
+ export declare function MessagesTabs({ schema, activeTab, setActiveTab, }: MessagesTabsProps): React.ReactNode;
8
+ export {};
@@ -0,0 +1,43 @@
1
+ import { Button as c } from "@payloadcms/ui";
2
+ import { get as i } from "lodash-es";
3
+ import { useCallback as p } from "react";
4
+ import { useFormState as b } from "react-hook-form";
5
+ import { useMessagesForm as u } from "@/context/messages-form";
6
+ import { cn as d } from "@/utils/cn";
7
+ import { toWords as f } from "@/utils/format";
8
+ function M({
9
+ schema: s,
10
+ activeTab: o,
11
+ setActiveTab: m
12
+ }) {
13
+ const { locales: t, control: a } = u(), { errors: e } = b({ control: a }), n = p(
14
+ (r) => t.some((l) => i(e, [l, r]) !== void 0),
15
+ [e, t]
16
+ );
17
+ return /* @__PURE__ */ React.createElement(
18
+ "div",
19
+ {
20
+ role: "tablist",
21
+ className: "overflow-x-auto border-b-2 border-border px-4 text-nowrap"
22
+ },
23
+ Object.keys(s).map((r) => /* @__PURE__ */ React.createElement(
24
+ c,
25
+ {
26
+ key: r,
27
+ size: "large",
28
+ className: d(
29
+ "my-0 rounded-b-none text-lg",
30
+ n(r) ? o === r ? "bg-error" : "text-error" : void 0
31
+ ),
32
+ buttonStyle: o === r ? "pill" : "tab",
33
+ onClick: () => m(r),
34
+ type: "button"
35
+ },
36
+ f(r)
37
+ ))
38
+ );
39
+ }
40
+ export {
41
+ M as MessagesTabs
42
+ };
43
+ //# sourceMappingURL=MessagesTabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessagesTabs.js","sources":["../../../src/components/layout/MessagesTabs.tsx"],"sourcesContent":["import type { MessagesSchema } from \"@/types\";\nimport { Button } from \"@payloadcms/ui\";\nimport { get } from \"lodash-es\";\nimport { useCallback } from \"react\";\nimport { useFormState } from \"react-hook-form\";\n\nimport { useMessagesForm } from \"@/context/messages-form\";\nimport { cn } from \"@/utils/cn\";\nimport { toWords } from \"@/utils/format\";\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\n role=\"tablist\"\n className=\"overflow-x-auto border-b-2 border-border px-4 text-nowrap\"\n >\n {Object.keys(schema).map((key) => (\n <Button\n key={key}\n size=\"large\"\n className={cn(\n \"my-0 rounded-b-none text-lg\",\n hasErrors(key)\n ? activeTab === key\n ? \"bg-error\"\n : \"text-error\"\n : undefined,\n )}\n buttonStyle={activeTab === key ? \"pill\" : \"tab\"}\n onClick={() => setActiveTab(key)}\n type=\"button\"\n >\n {toWords(key)}\n </Button>\n ))}\n </div>\n );\n}\n"],"names":["MessagesTabs","schema","activeTab","setActiveTab","locales","control","useMessagesForm","errors","useFormState","hasErrors","useCallback","key","locale","get","Button","cn","toWords"],"mappings":";;;;;;;AAiBO,SAASA,EAAa;AAAA,EAC3B,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,cAAAC;AACF,GAAuC;AACrC,QAAM,EAAE,SAAAC,GAAS,SAAAC,EAAA,IAAYC,EAAA,GACvB,EAAE,QAAAC,EAAA,IAAWC,EAAa,EAAE,SAAAH,GAAS,GAErCI,IAAYC;AAAA,IAChB,CAACC,MACQP,EAAQ,KAAK,CAACQ,MAAWC,EAAIN,GAAQ,CAACK,GAAQD,CAAG,CAAC,MAAM,MAAS;AAAA,IAE1E,CAACJ,GAAQH,CAAO;AAAA,EAAA;AAGlB,SACE,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,IAAA;AAAA,IAET,OAAO,KAAKH,CAAM,EAAE,IAAI,CAACU,MACxB,sBAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,KAAAH;AAAA,QACA,MAAK;AAAA,QACL,WAAWI;AAAA,UACT;AAAA,UACAN,EAAUE,CAAG,IACTT,MAAcS,IACZ,aACA,eACF;AAAA,QAAA;AAAA,QAEN,aAAaT,MAAcS,IAAM,SAAS;AAAA,QAC1C,SAAS,MAAMR,EAAaQ,CAAG;AAAA,QAC/B,MAAK;AAAA,MAAA;AAAA,MAEJK,EAAQL,CAAG;AAAA,IAAA,CAEf;AAAA,EAAA;AAGP;"}
@@ -0,0 +1,9 @@
1
+ import { Messages } from '../../types.ts';
2
+ interface MessagesTreeProps {
3
+ path: string;
4
+ nestingLevel: number;
5
+ schema: Messages;
6
+ className?: string;
7
+ }
8
+ export declare function MessagesTree({ path, schema, nestingLevel, className, }: MessagesTreeProps): React.ReactNode;
9
+ export {};
@@ -0,0 +1,67 @@
1
+ import { Collapsible as p } from "@payloadcms/ui";
2
+ import { get as g } from "lodash-es";
3
+ import { useCallback as f } from "react";
4
+ import { useFormState as d } from "react-hook-form";
5
+ import { useMessagesForm as E } from "@/context/messages-form";
6
+ import { cn as a } from "@/utils/cn";
7
+ import { toWords as R } from "@/utils/format";
8
+ import { MessageField as N } from "./MessageField.js";
9
+ function b({
10
+ path: t,
11
+ schema: c,
12
+ nestingLevel: s = 0,
13
+ className: i
14
+ }) {
15
+ const { control: l, locales: m } = E(), { errors: o } = d({ control: l }), n = f(
16
+ (e) => m.some(
17
+ (r) => g(o, [r, t, e].join(".")) !== void 0
18
+ ),
19
+ [o, m, t]
20
+ );
21
+ return /* @__PURE__ */ React.createElement("div", { className: a("grid gap-6", i) }, Object.entries(c).map(([e, r]) => /* @__PURE__ */ React.createElement(
22
+ "div",
23
+ {
24
+ key: e,
25
+ className: "grid min-w-0",
26
+ style: {
27
+ "--nesting-level": s
28
+ }
29
+ },
30
+ /* @__PURE__ */ React.createElement(
31
+ p,
32
+ {
33
+ className: "messages-tree-collapsible min-w-0",
34
+ header: /* @__PURE__ */ React.createElement(
35
+ "span",
36
+ {
37
+ className: a("text-xl", {
38
+ "text-error": n(e)
39
+ })
40
+ },
41
+ R(e)
42
+ )
43
+ },
44
+ typeof r == "string" ? /* @__PURE__ */ React.createElement(
45
+ N,
46
+ {
47
+ className: "min-w-0",
48
+ schema: r,
49
+ key: e,
50
+ messageKey: e,
51
+ path: t
52
+ }
53
+ ) : /* @__PURE__ */ React.createElement(
54
+ b,
55
+ {
56
+ nestingLevel: s + 1,
57
+ path: [t, e].join("."),
58
+ schema: r
59
+ }
60
+ )
61
+ )
62
+ )));
63
+ }
64
+ export {
65
+ b as MessagesTree
66
+ };
67
+ //# sourceMappingURL=MessagesTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessagesTree.js","sources":["../../../src/components/layout/MessagesTree.tsx"],"sourcesContent":["import type { Messages } from \"@/types\";\nimport { Collapsible } from \"@payloadcms/ui\";\nimport { get } from \"lodash-es\";\nimport { useCallback } from \"react\";\nimport { useFormState } from \"react-hook-form\";\n\nimport { useMessagesForm } from \"@/context/messages-form\";\nimport { cn } from \"@/utils/cn\";\nimport { toWords } from \"@/utils/format\";\n\nimport { MessageField } from \"./MessageField\";\n\ninterface MessagesTreeProps {\n path: string;\n nestingLevel: number;\n schema: Messages;\n className?: string;\n}\n\nexport function MessagesTree({\n path,\n schema,\n nestingLevel = 0,\n className,\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 className={cn(\"grid gap-6\", className)}>\n {Object.entries(schema).map(([key, value]) => (\n <div\n key={key}\n className=\"grid min-w-0\"\n style={\n {\n [\"--nesting-level\"]: nestingLevel,\n } as React.CSSProperties\n }\n >\n <Collapsible\n className=\"messages-tree-collapsible min-w-0\"\n header={\n <span\n className={cn(\"text-xl\", {\n \"text-error\": hasErrors(key),\n })}\n >\n {toWords(key)}\n </span>\n }\n >\n {typeof value === \"string\" ? (\n <MessageField\n className=\"min-w-0\"\n schema={value}\n key={key}\n messageKey={key}\n path={path}\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":["MessagesTree","path","schema","nestingLevel","className","control","locales","useMessagesForm","errors","useFormState","hasErrors","useCallback","key","locale","get","cn","value","Collapsible","toWords","MessageField"],"mappings":";;;;;;;;AAmBO,SAASA,EAAa;AAAA,EAC3B,MAAAC;AAAA,EACA,QAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,WAAAC;AACF,GAAuC;AACrC,QAAM,EAAE,SAAAC,GAAS,SAAAC,EAAA,IAAYC,EAAA,GACvB,EAAE,QAAAC,EAAA,IAAWC,EAAa,EAAE,SAAAJ,GAAS,GAErCK,IAAYC;AAAA,IAChB,CAACC,MACQN,EAAQ;AAAA,MACb,CAACO,MAAWC,EAAIN,GAAQ,CAACK,GAAQZ,GAAMW,CAAG,EAAE,KAAK,GAAG,CAAC,MAAM;AAAA,IAAA;AAAA,IAG/D,CAACJ,GAAQF,GAASL,CAAI;AAAA,EAAA;AAGxB,6CACG,OAAA,EAAI,WAAWc,EAAG,cAAcX,CAAS,EAAA,GACvC,OAAO,QAAQF,CAAM,EAAE,IAAI,CAAC,CAACU,GAAKI,CAAK,MACtC,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAJ;AAAA,MACA,WAAU;AAAA,MACV,OACE;AAAA,QACG,mBAAoBT;AAAA,MAAA;AAAA,IACvB;AAAA,IAGF,sBAAA;AAAA,MAACc;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,QACE,sBAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWF,EAAG,WAAW;AAAA,cACvB,cAAcL,EAAUE,CAAG;AAAA,YAAA,CAC5B;AAAA,UAAA;AAAA,UAEAM,EAAQN,CAAG;AAAA,QAAA;AAAA,MACd;AAAA,MAGD,OAAOI,KAAU,WAChB,sBAAA;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,QAAQH;AAAA,UACR,KAAAJ;AAAA,UACA,YAAYA;AAAA,UACZ,MAAAX;AAAA,QAAA;AAAA,MAAA,IAGF,sBAAA;AAAA,QAACD;AAAA,QAAA;AAAA,UACC,cAAcG,IAAe;AAAA,UAC7B,MAAM,CAACF,GAAMW,CAAG,EAAE,KAAK,GAAG;AAAA,UAC1B,QAAQI;AAAA,QAAA;AAAA,MAAA;AAAA,IACV;AAAA,EAEJ,CAEH,CACH;AAEJ;"}
@@ -0,0 +1,30 @@
1
+ import { Locales, Messages, RichTextEditorOptions, Translations } from '../types.ts';
2
+ import { UseFormReturn } from 'react-hook-form';
3
+ export type FormValues = Translations<Messages>;
4
+ interface MessagesFormProviderProps {
5
+ locales: Locales;
6
+ form: UseFormReturn<FormValues>;
7
+ richTextEditorOptions?: RichTextEditorOptions;
8
+ }
9
+ export declare function MessagesFormProvider({ locales, form, richTextEditorOptions, children, }: React.PropsWithChildren<MessagesFormProviderProps>): import("react").JSX.Element;
10
+ export declare const useMessagesForm: () => {
11
+ watch: import('react-hook-form').UseFormWatch<FormValues>;
12
+ getValues: import('react-hook-form').UseFormGetValues<FormValues>;
13
+ getFieldState: import('react-hook-form').UseFormGetFieldState<FormValues>;
14
+ setError: import('react-hook-form').UseFormSetError<FormValues>;
15
+ clearErrors: import('react-hook-form').UseFormClearErrors<FormValues>;
16
+ setValue: import('react-hook-form').UseFormSetValue<FormValues>;
17
+ trigger: import('react-hook-form').UseFormTrigger<FormValues>;
18
+ formState: import('react-hook-form').FormState<FormValues>;
19
+ resetField: import('react-hook-form').UseFormResetField<FormValues>;
20
+ reset: import('react-hook-form').UseFormReset<FormValues>;
21
+ handleSubmit: import('react-hook-form').UseFormHandleSubmit<FormValues, FormValues>;
22
+ unregister: import('react-hook-form').UseFormUnregister<FormValues>;
23
+ control: import('react-hook-form').Control<FormValues, any, FormValues>;
24
+ register: import('react-hook-form').UseFormRegister<FormValues>;
25
+ setFocus: import('react-hook-form').UseFormSetFocus<FormValues>;
26
+ subscribe: import('react-hook-form').UseFormSubscribe<FormValues>;
27
+ locales: Locales;
28
+ richTextEditorOptions?: RichTextEditorOptions;
29
+ };
30
+ export {};
@@ -0,0 +1,2 @@
1
+ import { Endpoint } from 'payload';
2
+ export declare const getMessagesEndpoint: Endpoint;
@@ -0,0 +1,13 @@
1
+ import { fetchMessages as a } from "../requests/fetchMessages.js";
2
+ const n = {
3
+ handler: async (e) => {
4
+ const { locale: s } = e.routeParams, t = await a(e.payload, s);
5
+ return Response.json(t);
6
+ },
7
+ method: "get",
8
+ path: "/intl-plugin/:locale"
9
+ };
10
+ export {
11
+ n as getMessagesEndpoint
12
+ };
13
+ //# sourceMappingURL=get-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-messages.js","sources":["../../src/endpoints/get-messages.ts"],"sourcesContent":["import type { Endpoint, PayloadRequest } from \"payload\";\n\nimport { fetchMessages } from \"../requests/fetchMessages\";\n\nexport const getMessagesEndpoint: Endpoint = {\n handler: async (req: PayloadRequest) => {\n const { locale } = req.routeParams as { locale: string };\n const messages = await fetchMessages(req.payload, locale);\n return Response.json(messages);\n },\n method: \"get\",\n path: \"/intl-plugin/:locale\",\n};\n"],"names":["getMessagesEndpoint","req","locale","messages","fetchMessages"],"mappings":";AAIO,MAAMA,IAAgC;AAAA,EAC3C,SAAS,OAAOC,MAAwB;AACtC,UAAM,EAAE,QAAAC,MAAWD,EAAI,aACjBE,IAAW,MAAMC,EAAcH,EAAI,SAASC,CAAM;AACxD,WAAO,SAAS,KAAKC,CAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,EACR,MAAM;AACR;"}
@@ -0,0 +1,2 @@
1
+ import { Endpoint } from 'payload';
2
+ export declare const setMessagesEndpoint: Endpoint;
@@ -0,0 +1,47 @@
1
+ import { getSupportedLocales as p, getPluginContext as d } from "@/utils/config";
2
+ const f = {
3
+ handler: async (a) => {
4
+ const { user: c } = await a.payload.auth({ headers: a.headers });
5
+ if (!c)
6
+ throw new Error("Unauthorized");
7
+ const e = await a.json?.();
8
+ if (!e)
9
+ throw new Error("No data provided");
10
+ const l = p(
11
+ a.payload.config.localization
12
+ ), { collectionSlug: n } = d(a.payload.config);
13
+ for (const o of l) {
14
+ const s = e[o];
15
+ if (!s) continue;
16
+ const t = new File(
17
+ [JSON.stringify(s)],
18
+ `${o}-${Date.now()}.json`,
19
+ {
20
+ type: "application/json"
21
+ }
22
+ ), i = {
23
+ name: t.name,
24
+ data: Buffer.from(await t.arrayBuffer()),
25
+ mimetype: t.type,
26
+ size: t.size
27
+ }, { docs: r } = await a.payload.update({
28
+ collection: n,
29
+ data: {},
30
+ file: i,
31
+ where: { locale: { equals: o } }
32
+ });
33
+ r.length === 0 && await a.payload.create({
34
+ collection: n,
35
+ data: { locale: o },
36
+ file: i
37
+ });
38
+ }
39
+ return Response.json({ success: !0 });
40
+ },
41
+ method: "put",
42
+ path: "/intl-plugin"
43
+ };
44
+ export {
45
+ f as setMessagesEndpoint
46
+ };
47
+ //# sourceMappingURL=set-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-messages.js","sources":["../../src/endpoints/set-messages.ts"],"sourcesContent":["import type { Messages, Translations } from \"@/types\";\nimport type { Endpoint, File, PayloadRequest } from \"payload\";\n\nimport { getPluginContext, getSupportedLocales } from \"@/utils/config\";\n\nexport const setMessagesEndpoint: Endpoint = {\n handler: async (req: PayloadRequest) => {\n const { user } = await req.payload.auth({ headers: req.headers });\n if (!user) {\n throw new Error(\"Unauthorized\");\n }\n\n const data = (await req.json?.()) as Translations<Messages> | undefined;\n if (!data) {\n throw new Error(\"No data provided\");\n }\n\n const supportedLocales = getSupportedLocales(\n req.payload.config.localization,\n );\n const { collectionSlug } = getPluginContext(req.payload.config);\n\n for (const locale of supportedLocales) {\n const messages = data[locale];\n if (!messages) continue;\n\n const rawFile = new File(\n [JSON.stringify(messages)],\n `${locale}-${Date.now()}.json`,\n {\n type: \"application/json\",\n },\n );\n\n const file: File = {\n name: rawFile.name,\n data: Buffer.from(await rawFile.arrayBuffer()),\n mimetype: rawFile.type,\n size: rawFile.size,\n };\n\n const { docs } = await req.payload.update({\n collection: collectionSlug,\n data: {},\n file,\n where: { locale: { equals: locale } },\n });\n if (docs.length === 0) {\n await req.payload.create({\n collection: collectionSlug,\n data: { locale },\n file,\n });\n }\n }\n\n return Response.json({ success: true });\n },\n method: \"put\",\n path: \"/intl-plugin\",\n};\n"],"names":["setMessagesEndpoint","req","user","data","supportedLocales","getSupportedLocales","collectionSlug","getPluginContext","locale","messages","rawFile","file","docs"],"mappings":";AAKO,MAAMA,IAAgC;AAAA,EAC3C,SAAS,OAAOC,MAAwB;AACtC,UAAM,EAAE,MAAAC,MAAS,MAAMD,EAAI,QAAQ,KAAK,EAAE,SAASA,EAAI,SAAS;AAChE,QAAI,CAACC;AACH,YAAM,IAAI,MAAM,cAAc;AAGhC,UAAMC,IAAQ,MAAMF,EAAI,OAAA;AACxB,QAAI,CAACE;AACH,YAAM,IAAI,MAAM,kBAAkB;AAGpC,UAAMC,IAAmBC;AAAA,MACvBJ,EAAI,QAAQ,OAAO;AAAA,IAAA,GAEf,EAAE,gBAAAK,EAAA,IAAmBC,EAAiBN,EAAI,QAAQ,MAAM;AAE9D,eAAWO,KAAUJ,GAAkB;AACrC,YAAMK,IAAWN,EAAKK,CAAM;AAC5B,UAAI,CAACC,EAAU;AAEf,YAAMC,IAAU,IAAI;AAAA,QAClB,CAAC,KAAK,UAAUD,CAAQ,CAAC;AAAA,QACzB,GAAGD,CAAM,IAAI,KAAK,KAAK;AAAA,QACvB;AAAA,UACE,MAAM;AAAA,QAAA;AAAA,MACR,GAGIG,IAAa;AAAA,QACjB,MAAMD,EAAQ;AAAA,QACd,MAAM,OAAO,KAAK,MAAMA,EAAQ,aAAa;AAAA,QAC7C,UAAUA,EAAQ;AAAA,QAClB,MAAMA,EAAQ;AAAA,MAAA,GAGV,EAAE,MAAAE,EAAA,IAAS,MAAMX,EAAI,QAAQ,OAAO;AAAA,QACxC,YAAYK;AAAA,QACZ,MAAM,CAAA;AAAA,QACN,MAAAK;AAAA,QACA,OAAO,EAAE,QAAQ,EAAE,QAAQH,IAAO;AAAA,MAAE,CACrC;AACD,MAAII,EAAK,WAAW,KAClB,MAAMX,EAAI,QAAQ,OAAO;AAAA,QACvB,YAAYK;AAAA,QACZ,MAAM,EAAE,QAAAE,EAAA;AAAA,QACR,MAAAG;AAAA,MAAA,CACD;AAAA,IAEL;AAEA,WAAO,SAAS,KAAK,EAAE,SAAS,IAAM;AAAA,EACxC;AAAA,EACA,QAAQ;AAAA,EACR,MAAM;AACR;"}
@@ -0,0 +1,7 @@
1
+ import { PayloadRequest } from 'payload';
2
+ import { MessagesGuard } from '../types.ts';
3
+ export interface MessagesLinkProps {
4
+ access?: MessagesGuard;
5
+ req: PayloadRequest;
6
+ }
7
+ export declare function MessagesLink({ access, req, }: MessagesLinkProps): Promise<import("react").JSX.Element | null>;
@@ -0,0 +1,20 @@
1
+ import { Button as n } from "@payloadcms/ui";
2
+ import { IconWorld as a } from "@tabler/icons-react";
3
+ async function r({
4
+ access: e = () => !0,
5
+ req: t
6
+ }) {
7
+ return await e(t) ? /* @__PURE__ */ React.createElement(
8
+ n,
9
+ {
10
+ buttonStyle: "tab",
11
+ el: "link",
12
+ to: `${t.payload.getAdminURL()}/intl`
13
+ },
14
+ /* @__PURE__ */ React.createElement(a, null)
15
+ ) : null;
16
+ }
17
+ export {
18
+ r as MessagesLink
19
+ };
20
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sources":["../../src/exports/link.tsx"],"sourcesContent":["import type { PayloadRequest } from \"payload\";\nimport { Button } from \"@payloadcms/ui\";\nimport { IconWorld } from \"@tabler/icons-react\";\n\nimport { type MessagesGuard } from \"@/types\";\n\nexport interface MessagesLinkProps {\n access?: MessagesGuard;\n req: PayloadRequest;\n}\n\nexport async function MessagesLink({\n access = () => true,\n req,\n}: MessagesLinkProps) {\n const hasAccess = await access(req);\n if (!hasAccess) return null;\n\n return (\n <Button\n buttonStyle=\"tab\"\n el=\"link\"\n to={`${req.payload.getAdminURL()}/intl`}\n >\n <IconWorld />\n </Button>\n );\n}\n"],"names":["MessagesLink","access","req","Button","IconWorld"],"mappings":";;AAWA,eAAsBA,EAAa;AAAA,EACjC,QAAAC,IAAS,MAAM;AAAA,EACf,KAAAC;AACF,GAAsB;AAEpB,SADkB,MAAMD,EAAOC,CAAG,IAIhC,sBAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,aAAY;AAAA,MACZ,IAAG;AAAA,MACH,IAAI,GAAGD,EAAI,QAAQ,aAAa;AAAA,IAAA;AAAA,wCAE/BE,GAAA,IAAU;AAAA,EAAA,IARQ;AAWzB;"}
@@ -0,0 +1,2 @@
1
+ export { MessagesLink } from './link';
2
+ export { MessagesView } from './view';
@@ -0,0 +1,7 @@
1
+ import { MessagesLink as o } from "./link.js";
2
+ import { MessagesView as a } from "./view.js";
3
+ export {
4
+ o as MessagesLink,
5
+ a as MessagesView
6
+ };
7
+ //# sourceMappingURL=rsc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsc.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -0,0 +1,10 @@
1
+ import { Locales, Messages, MessagesGuard, RichTextEditorOptions } from '../types.ts';
2
+ import { AdminViewServerProps } from 'payload';
3
+ export interface MessagesViewProps {
4
+ locales: Locales;
5
+ schema: Messages;
6
+ tabs: boolean | undefined;
7
+ access: MessagesGuard;
8
+ richTextEditorOptions?: RichTextEditorOptions;
9
+ }
10
+ export declare function MessagesView({ access, initPageResult, locales, params, payload, schema, searchParams, tabs, richTextEditorOptions, }: AdminViewServerProps & MessagesViewProps): Promise<import("react").JSX.Element>;
@@ -0,0 +1,56 @@
1
+ import l from "path";
2
+ import { DefaultTemplate as u } from "@payloadcms/next/templates";
3
+ import { Gutter as E } from "@payloadcms/ui";
4
+ import { redirect as d, RedirectType as g } from "next/navigation";
5
+ import { Toaster as v } from "sonner";
6
+ import { sanitizeMessages as A } from "@/utils/sanitize";
7
+ import { MessagesForm as M } from "../components/MessagesForm.js";
8
+ import { fetchMessages as h } from "../requests/fetchMessages.js";
9
+ async function k({
10
+ access: n,
11
+ initPageResult: e,
12
+ locales: o,
13
+ params: m,
14
+ payload: t,
15
+ schema: s,
16
+ searchParams: c,
17
+ tabs: a = !1,
18
+ richTextEditorOptions: p
19
+ }) {
20
+ await n(e.req) || d(t.getAdminURL(), g.replace);
21
+ const i = {};
22
+ for (const r of o) {
23
+ const f = await h(t, r);
24
+ i[r] = A(s, f);
25
+ }
26
+ return /* @__PURE__ */ React.createElement(
27
+ u,
28
+ {
29
+ i18n: e.req.i18n,
30
+ locale: e.locale,
31
+ params: m,
32
+ payload: e.req.payload,
33
+ permissions: e.permissions,
34
+ searchParams: c,
35
+ user: e.req.user || void 0,
36
+ viewActions: t.config.admin.components.actions.filter((r) => typeof r != "object" ? !0 : r.exportName !== "MessagesLink"),
37
+ visibleEntities: e.visibleEntities
38
+ },
39
+ /* @__PURE__ */ React.createElement(E, null, /* @__PURE__ */ React.createElement(
40
+ M,
41
+ {
42
+ locales: o,
43
+ schema: s,
44
+ tabs: a,
45
+ values: i,
46
+ endpointUrl: l.join(t.getAPIURL(), "intl-plugin"),
47
+ richTextEditorOptions: p
48
+ }
49
+ )),
50
+ /* @__PURE__ */ React.createElement(v, { position: "top-right" })
51
+ );
52
+ }
53
+ export {
54
+ k as MessagesView
55
+ };
56
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sources":["../../src/exports/view.tsx"],"sourcesContent":["import path from \"path\";\nimport type {\n DeepPartial,\n Locales,\n Messages,\n MessagesGuard,\n RichTextEditorOptions,\n Translations,\n} from \"@/types\";\nimport type { AdminViewServerProps } from \"payload\";\nimport { DefaultTemplate } from \"@payloadcms/next/templates\";\nimport { Gutter } from \"@payloadcms/ui\";\nimport { redirect, RedirectType } from \"next/navigation\";\nimport { Toaster } from \"sonner\";\n\nimport { sanitizeMessages } from \"@/utils/sanitize\";\n\nimport { MessagesForm } from \"../components/MessagesForm\";\nimport { fetchMessages } from \"../requests/fetchMessages\";\n\nexport interface MessagesViewProps {\n locales: Locales;\n schema: Messages;\n tabs: boolean | undefined;\n access: MessagesGuard;\n richTextEditorOptions?: RichTextEditorOptions;\n}\n\nexport async function MessagesView({\n access,\n initPageResult,\n locales,\n params,\n payload,\n schema,\n searchParams,\n tabs = false,\n richTextEditorOptions,\n}: AdminViewServerProps & MessagesViewProps) {\n const hasAccess = await access(initPageResult.req);\n if (!hasAccess) redirect(payload.getAdminURL(), RedirectType.replace);\n\n const translations: Translations<DeepPartial<Messages>> = {};\n\n for (const locale of locales) {\n const messages = await fetchMessages(payload, locale);\n translations[locale] = sanitizeMessages(schema, messages);\n }\n return (\n <DefaultTemplate\n i18n={initPageResult.req.i18n}\n locale={initPageResult.locale}\n params={params}\n payload={initPageResult.req.payload}\n permissions={initPageResult.permissions}\n searchParams={searchParams}\n user={initPageResult.req.user || undefined}\n viewActions={payload.config.admin.components.actions.filter((action) => {\n if (typeof action !== \"object\") {\n return true;\n }\n return action.exportName !== \"MessagesLink\";\n })}\n visibleEntities={initPageResult.visibleEntities}\n >\n <Gutter>\n <MessagesForm\n locales={locales}\n schema={schema}\n tabs={tabs}\n values={translations}\n endpointUrl={path.join(payload.getAPIURL(), \"intl-plugin\")}\n richTextEditorOptions={richTextEditorOptions}\n />\n </Gutter>\n <Toaster position=\"top-right\" />\n </DefaultTemplate>\n );\n}\n"],"names":["MessagesView","access","initPageResult","locales","params","payload","schema","searchParams","tabs","richTextEditorOptions","redirect","RedirectType","translations","locale","messages","fetchMessages","sanitizeMessages","DefaultTemplate","action","Gutter","MessagesForm","path","Toaster"],"mappings":";;;;;;;;AA4BA,eAAsBA,EAAa;AAAA,EACjC,QAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,cAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,uBAAAC;AACF,GAA6C;AAE3C,EADkB,MAAMR,EAAOC,EAAe,GAAG,KACjCQ,EAASL,EAAQ,YAAA,GAAeM,EAAa,OAAO;AAEpE,QAAMC,IAAoD,CAAA;AAE1D,aAAWC,KAAUV,GAAS;AAC5B,UAAMW,IAAW,MAAMC,EAAcV,GAASQ,CAAM;AACpD,IAAAD,EAAaC,CAAM,IAAIG,EAAiBV,GAAQQ,CAAQ;AAAA,EAC1D;AACA,SACE,sBAAA;AAAA,IAACG;AAAA,IAAA;AAAA,MACC,MAAMf,EAAe,IAAI;AAAA,MACzB,QAAQA,EAAe;AAAA,MACvB,QAAAE;AAAA,MACA,SAASF,EAAe,IAAI;AAAA,MAC5B,aAAaA,EAAe;AAAA,MAC5B,cAAAK;AAAA,MACA,MAAML,EAAe,IAAI,QAAQ;AAAA,MACjC,aAAaG,EAAQ,OAAO,MAAM,WAAW,QAAQ,OAAO,CAACa,MACvD,OAAOA,KAAW,WACb,KAEFA,EAAO,eAAe,cAC9B;AAAA,MACD,iBAAiBhB,EAAe;AAAA,IAAA;AAAA,wCAE/BiB,GAAA,MACC,sBAAA;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,SAAAjB;AAAA,QACA,QAAAG;AAAA,QACA,MAAAE;AAAA,QACA,QAAQI;AAAA,QACR,aAAaS,EAAK,KAAKhB,EAAQ,UAAA,GAAa,aAAa;AAAA,QACzD,uBAAAI;AAAA,MAAA;AAAA,IAAA,CAEJ;AAAA,IACA,sBAAA,cAACa,GAAA,EAAQ,UAAS,YAAA,CAAY;AAAA,EAAA;AAGpC;"}
@@ -0,0 +1,5 @@
1
+ import { Plugin } from 'payload';
2
+ import { MessagesPluginConfig } from './types.ts';
3
+ export declare const intlPlugin: ({ schema, tabs, collectionSlug, hooks, editorAccess, richTextEditorOptions, }: MessagesPluginConfig) => Plugin;
4
+ export { fetchMessages } from './requests/fetchMessages';
5
+ export type { MessagesPluginConfig, MessagesSchema, Messages, } from './types.ts';
package/dist/index.js ADDED
@@ -0,0 +1,76 @@
1
+ /* empty css */
2
+ import { getMessagesEndpoint as p } from "./endpoints/get-messages.js";
3
+ import { setMessagesEndpoint as r } from "./endpoints/set-messages.js";
4
+ import { getSupportedLocales as l, attachPluginContext as m } from "./utils/config.js";
5
+ import { fetchMessages as w } from "./requests/fetchMessages.js";
6
+ const y = ({
7
+ schema: s,
8
+ tabs: n,
9
+ collectionSlug: t = "messages",
10
+ hooks: a,
11
+ editorAccess: o = (e) => e.user !== null,
12
+ richTextEditorOptions: i
13
+ }) => (e) => {
14
+ const d = l(e.localization);
15
+ return e.admin ??= {}, e.admin.components ??= {}, e.admin.components.actions ??= [], e.admin.components.actions.push({
16
+ exportName: "MessagesLink",
17
+ path: "payload-intl/rsc#MessagesLink"
18
+ }), e.admin.components.views = {
19
+ ...e.admin.components.views,
20
+ intl: {
21
+ Component: {
22
+ path: "payload-intl/rsc#MessagesView",
23
+ serverProps: {
24
+ access: o,
25
+ locales: d,
26
+ schema: s,
27
+ tabs: n,
28
+ richTextEditorOptions: i
29
+ }
30
+ },
31
+ path: "/intl"
32
+ }
33
+ }, m(e, {
34
+ collectionSlug: t
35
+ }), e.collections ??= [], e.collections.push({
36
+ slug: t,
37
+ admin: {
38
+ hidden: !0
39
+ },
40
+ endpoints: [r, p],
41
+ fields: [
42
+ {
43
+ name: "locale",
44
+ type: "text",
45
+ required: !0
46
+ }
47
+ ],
48
+ hooks: u(a),
49
+ indexes: [
50
+ {
51
+ fields: ["locale"]
52
+ }
53
+ ],
54
+ upload: {
55
+ mimeTypes: ["application/json"]
56
+ }
57
+ }), e.endpoints ??= [], e.endpoints.push(p), e.endpoints.push(r), e;
58
+ }, u = (s) => {
59
+ if (!s)
60
+ return;
61
+ const { afterUpdate: n, ...t } = s;
62
+ if (!n)
63
+ return t;
64
+ const a = async ({ operation: o }) => {
65
+ o === "update" && await n();
66
+ };
67
+ return {
68
+ ...t,
69
+ afterChange: [...t.afterChange ?? [], a]
70
+ };
71
+ };
72
+ export {
73
+ w as fetchMessages,
74
+ y as intlPlugin
75
+ };
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import \"./styles.css\";\n\nimport type {\n CollectionAfterChangeHook,\n CollectionConfig,\n LocalizationConfig,\n Plugin,\n} from \"payload\";\n\nimport type { MessagesViewProps } from \"./exports/view\";\nimport type { Locales, MessagesPluginConfig } from \"./types.ts\";\nimport { getMessagesEndpoint } from \"./endpoints/get-messages\";\nimport { setMessagesEndpoint } from \"./endpoints/set-messages\";\nimport { attachPluginContext, getSupportedLocales } from \"./utils/config\";\n\nexport const intlPlugin =\n ({\n schema,\n tabs,\n collectionSlug = \"messages\",\n hooks,\n editorAccess = (req) => req.user !== null,\n richTextEditorOptions,\n }: MessagesPluginConfig): Plugin =>\n (config) => {\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 richTextEditorOptions,\n } satisfies MessagesViewProps,\n },\n path: \"/intl\",\n },\n };\n\n attachPluginContext(config, {\n collectionSlug,\n });\n\n config.collections ??= [];\n config.collections.push({\n slug: collectionSlug,\n admin: {\n hidden: true,\n },\n endpoints: [setMessagesEndpoint, getMessagesEndpoint],\n fields: [\n {\n name: \"locale\",\n type: \"text\",\n required: true,\n },\n ],\n hooks: createHooks(hooks),\n indexes: [\n {\n fields: [\"locale\"],\n },\n ],\n upload: {\n mimeTypes: [\"application/json\"],\n },\n });\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 MessagesPluginConfig,\n MessagesSchema,\n Messages,\n} from \"./types.ts\";\n\nconst createHooks = (\n hooks: MessagesPluginConfig[\"hooks\"],\n): CollectionConfig[\"hooks\"] => {\n if (!hooks) {\n return undefined;\n }\n const { afterUpdate, ...rest } = hooks;\n if (!afterUpdate) {\n return rest;\n }\n\n const afterUpdateHook: CollectionAfterChangeHook = async ({ operation }) => {\n if (operation === \"update\") {\n await afterUpdate();\n }\n return;\n };\n return {\n ...rest,\n afterChange: [...(rest.afterChange ?? []), afterUpdateHook],\n };\n};\n"],"names":["intlPlugin","schema","tabs","collectionSlug","hooks","editorAccess","req","richTextEditorOptions","config","locales","getSupportedLocales","attachPluginContext","setMessagesEndpoint","getMessagesEndpoint","createHooks","afterUpdate","rest","afterUpdateHook","operation"],"mappings":";;;;;AAeO,MAAMA,IACX,CAAC;AAAA,EACC,QAAAC;AAAA,EACA,MAAAC;AAAA,EACA,gBAAAC,IAAiB;AAAA,EACjB,OAAAC;AAAA,EACA,cAAAC,IAAe,CAACC,MAAQA,EAAI,SAAS;AAAA,EACrC,uBAAAC;AACF,MACA,CAACC,MAAW;AACV,QAAMC,IAAUC,EAAoBF,EAAO,YAAY;AAEvD,SAAAA,EAAO,UAAU,CAAA,GACjBA,EAAO,MAAM,eAAe,CAAA,GAC5BA,EAAO,MAAM,WAAW,YAAY,CAAA,GACpCA,EAAO,MAAM,WAAW,QAAQ,KAAK;AAAA,IACnC,YAAY;AAAA,IACZ,MAAM;AAAA,EAAA,CACP,GAEDA,EAAO,MAAM,WAAW,QAAQ;AAAA,IAC9B,GAAGA,EAAO,MAAM,WAAW;AAAA,IAC3B,MAAM;AAAA,MACJ,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,UACX,QAAQH;AAAA,UACR,SAAAI;AAAA,UACA,QAAAR;AAAA,UACA,MAAAC;AAAA,UACA,uBAAAK;AAAA,QAAA;AAAA,MACF;AAAA,MAEF,MAAM;AAAA,IAAA;AAAA,EACR,GAGFI,EAAoBH,GAAQ;AAAA,IAC1B,gBAAAL;AAAA,EAAA,CACD,GAEDK,EAAO,gBAAgB,CAAA,GACvBA,EAAO,YAAY,KAAK;AAAA,IACtB,MAAML;AAAA,IACN,OAAO;AAAA,MACL,QAAQ;AAAA,IAAA;AAAA,IAEV,WAAW,CAACS,GAAqBC,CAAmB;AAAA,IACpD,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,IAEF,OAAOC,EAAYV,CAAK;AAAA,IACxB,SAAS;AAAA,MACP;AAAA,QACE,QAAQ,CAAC,QAAQ;AAAA,MAAA;AAAA,IACnB;AAAA,IAEF,QAAQ;AAAA,MACN,WAAW,CAAC,kBAAkB;AAAA,IAAA;AAAA,EAChC,CACD,GAEDI,EAAO,cAAc,CAAA,GACrBA,EAAO,UAAU,KAAKK,CAAmB,GACzCL,EAAO,UAAU,KAAKI,CAAmB,GAElCJ;AACT,GAUIM,IAAc,CAClBV,MAC8B;AAC9B,MAAI,CAACA;AACH;AAEF,QAAM,EAAE,aAAAW,GAAa,GAAGC,EAAA,IAASZ;AACjC,MAAI,CAACW;AACH,WAAOC;AAGT,QAAMC,IAA6C,OAAO,EAAE,WAAAC,QAAgB;AAC1E,IAAIA,MAAc,YAChB,MAAMH,EAAA;AAAA,EAGV;AACA,SAAO;AAAA,IACL,GAAGC;AAAA,IACH,aAAa,CAAC,GAAIA,EAAK,eAAe,CAAA,GAAKC,CAAe;AAAA,EAAA;AAE9D;"}
@@ -0,0 +1,3 @@
1
+ import { BasePayload } from 'payload';
2
+ import { Messages } from '../types';
3
+ export declare function fetchMessages(payload: BasePayload, locale: string): Promise<Messages>;
@@ -0,0 +1,29 @@
1
+ import { getPluginContext as s } from "@/utils/config";
2
+ async function a(n, e) {
3
+ const {
4
+ docs: [r]
5
+ } = await n.find({
6
+ collection: s(n.config).collectionSlug,
7
+ where: { locale: { equals: e } }
8
+ });
9
+ if (!r)
10
+ return console.warn(`No messages found for locale ${e}`), {};
11
+ const { url: o } = r, t = await fetch(o);
12
+ if (!t.ok)
13
+ throw new Error(
14
+ `Could not fetch messages for locale "${e}": The page returned an error.
15
+
16
+ ${o}`
17
+ );
18
+ if (t.headers.get("content-type") !== "application/json")
19
+ throw new Error(
20
+ `Could not fetch messages for locale "${e}": The page did not return a JSON file.
21
+
22
+ ${o}`
23
+ );
24
+ return await t.json();
25
+ }
26
+ export {
27
+ a as fetchMessages
28
+ };
29
+ //# sourceMappingURL=fetchMessages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchMessages.js","sources":["../../src/requests/fetchMessages.ts"],"sourcesContent":["import type { BasePayload } from \"payload\";\n\nimport { getPluginContext } from \"@/utils/config\";\n\nimport type { Messages } from \"../types\";\n\nexport async function fetchMessages(\n payload: BasePayload,\n locale: string,\n): Promise<Messages> {\n const {\n docs: [doc],\n } = await payload.find({\n collection: getPluginContext(payload.config).collectionSlug,\n where: { locale: { equals: locale } },\n });\n\n if (!doc) {\n console.warn(`No messages found for locale ${locale}`);\n return {};\n }\n\n const { url } = doc as unknown as { url: string };\n\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(\n `Could not fetch messages for locale \"${locale}\": The page returned an error.\\n\\n${url}`,\n );\n }\n\n if (response.headers.get(\"content-type\") !== \"application/json\") {\n throw new Error(\n `Could not fetch messages for locale \"${locale}\": The page did not return a JSON file.\\n\\n${url}`,\n );\n }\n\n return await response.json();\n}\n"],"names":["fetchMessages","payload","locale","doc","getPluginContext","url","response"],"mappings":";AAMA,eAAsBA,EACpBC,GACAC,GACmB;AACnB,QAAM;AAAA,IACJ,MAAM,CAACC,CAAG;AAAA,EAAA,IACR,MAAMF,EAAQ,KAAK;AAAA,IACrB,YAAYG,EAAiBH,EAAQ,MAAM,EAAE;AAAA,IAC7C,OAAO,EAAE,QAAQ,EAAE,QAAQC,IAAO;AAAA,EAAE,CACrC;AAED,MAAI,CAACC;AACH,mBAAQ,KAAK,gCAAgCD,CAAM,EAAE,GAC9C,CAAA;AAGT,QAAM,EAAE,KAAAG,MAAQF,GAEVG,IAAW,MAAM,MAAMD,CAAG;AAEhC,MAAI,CAACC,EAAS;AACZ,UAAM,IAAI;AAAA,MACR,wCAAwCJ,CAAM;AAAA;AAAA,EAAqCG,CAAG;AAAA,IAAA;AAI1F,MAAIC,EAAS,QAAQ,IAAI,cAAc,MAAM;AAC3C,UAAM,IAAI;AAAA,MACR,wCAAwCJ,CAAM;AAAA;AAAA,EAA8CG,CAAG;AAAA,IAAA;AAInG,SAAO,MAAMC,EAAS,KAAA;AACxB;"}