payload-intl 0.2.4 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -12
- package/dist/components/MessageController.d.ts +2 -1
- package/dist/components/MessageController.d.ts.map +1 -0
- package/dist/components/MessageController.js +26 -48
- package/dist/components/MessageController.js.map +1 -1
- package/dist/components/MessagesForm.d.ts +2 -1
- package/dist/components/MessagesForm.d.ts.map +1 -0
- package/dist/components/MessagesForm.js +28 -32
- package/dist/components/MessagesForm.js.map +1 -1
- package/dist/components/actions/JsonImport.d.ts +1 -0
- package/dist/components/actions/JsonImport.d.ts.map +1 -0
- package/dist/components/actions/JsonImport.js +4 -4
- package/dist/components/actions/JsonImport.js.map +1 -1
- package/dist/components/actions/Move.d.ts +2 -3
- package/dist/components/actions/Move.d.ts.map +1 -0
- package/dist/components/inputs/InputWrapper.d.ts +1 -0
- package/dist/components/inputs/InputWrapper.d.ts.map +1 -0
- package/dist/components/inputs/InputWrapper.js.map +1 -1
- package/dist/components/inputs/LexicalInput.d.ts +1 -0
- package/dist/components/inputs/LexicalInput.d.ts.map +1 -0
- package/dist/components/inputs/MessageInput.d.ts +2 -1
- package/dist/components/inputs/MessageInput.d.ts.map +1 -0
- package/dist/components/inputs/MessageInput.js +1 -1
- package/dist/components/inputs/MessageInput.js.map +1 -1
- package/dist/components/inputs/variables/VariableChip.d.ts +1 -0
- package/dist/components/inputs/variables/VariableChip.d.ts.map +1 -0
- package/dist/components/inputs/variables/VariableChip.js +3 -3
- package/dist/components/inputs/variables/VariableChip.js.map +1 -1
- package/dist/components/inputs/variables/VariableIcon.d.ts +3 -2
- package/dist/components/inputs/variables/VariableIcon.d.ts.map +1 -0
- package/dist/components/inputs/variables/VariableSuggestion.d.ts +2 -1
- package/dist/components/inputs/variables/VariableSuggestion.d.ts.map +1 -0
- package/dist/components/inputs/variables/VariableSuggestion.js +2 -2
- package/dist/components/inputs/variables/VariableSuggestion.js.map +1 -1
- package/dist/components/inputs/variables/editors/DateVariableEditor.d.ts +2 -1
- package/dist/components/inputs/variables/editors/DateVariableEditor.d.ts.map +1 -0
- package/dist/components/inputs/variables/editors/PluralVariableEditor.d.ts +2 -1
- package/dist/components/inputs/variables/editors/PluralVariableEditor.d.ts.map +1 -0
- package/dist/components/inputs/variables/editors/PluralVariableEditor.js +31 -34
- package/dist/components/inputs/variables/editors/PluralVariableEditor.js.map +1 -1
- package/dist/components/inputs/variables/editors/SelectVariableEditor.d.ts +2 -1
- package/dist/components/inputs/variables/editors/SelectVariableEditor.d.ts.map +1 -0
- package/dist/components/inputs/variables/editors/SelectVariableEditor.js +17 -10
- package/dist/components/inputs/variables/editors/SelectVariableEditor.js.map +1 -1
- package/dist/components/inputs/variables/editors/TagVariableEditor.d.ts +2 -1
- package/dist/components/inputs/variables/editors/TagVariableEditor.d.ts.map +1 -0
- package/dist/components/inputs/variables/editors/TagVariableEditor.js.map +1 -1
- package/dist/components/inputs/variables/editors/TimeVariableEditor.d.ts +2 -1
- package/dist/components/inputs/variables/editors/TimeVariableEditor.d.ts.map +1 -0
- package/dist/components/inputs/variables/extension.d.ts +2 -1
- package/dist/components/inputs/variables/extension.d.ts.map +1 -0
- package/dist/components/inputs/variables/extension.js.map +1 -1
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.d.ts +2 -1
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.d.ts.map +1 -0
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.js +4 -4
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.js.map +1 -1
- package/dist/components/inputs/variables/pickers/TemporalElementEditor.d.ts +2 -1
- package/dist/components/inputs/variables/pickers/TemporalElementEditor.d.ts.map +1 -0
- package/dist/components/layout/MessageField.d.ts +2 -1
- package/dist/components/layout/MessageField.d.ts.map +1 -0
- package/dist/components/layout/MessageField.js +12 -12
- package/dist/components/layout/MessageField.js.map +1 -1
- package/dist/components/layout/MessagesTabs.d.ts +2 -1
- package/dist/components/layout/MessagesTabs.d.ts.map +1 -0
- package/dist/components/layout/MessagesTabs.js +3 -3
- package/dist/components/layout/MessagesTabs.js.map +1 -1
- package/dist/components/layout/MessagesTree.d.ts +2 -1
- package/dist/components/layout/MessagesTree.d.ts.map +1 -0
- package/dist/components/layout/MessagesTree.js +2 -2
- package/dist/components/layout/MessagesTree.js.map +1 -1
- package/dist/context/messages-form.d.ts +2 -1
- package/dist/context/messages-form.d.ts.map +1 -0
- package/dist/context/messages-form.js.map +1 -1
- package/dist/endpoints/get-messages.d.ts +1 -0
- package/dist/endpoints/get-messages.d.ts.map +1 -0
- package/dist/endpoints/get-messages.js.map +1 -1
- package/dist/endpoints/set-messages.d.ts +1 -0
- package/dist/endpoints/set-messages.d.ts.map +1 -0
- package/dist/endpoints/set-messages.js.map +1 -1
- package/dist/exports/link.d.ts +2 -1
- package/dist/exports/link.d.ts.map +1 -0
- package/dist/exports/link.js.map +1 -1
- package/dist/exports/rsc.d.ts +1 -0
- package/dist/exports/rsc.d.ts.map +1 -0
- package/dist/exports/view.d.ts +2 -1
- package/dist/exports/view.d.ts.map +1 -0
- package/dist/exports/view.js +26 -30
- package/dist/exports/view.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -34
- package/dist/index.js.map +1 -1
- package/dist/requests/fetchMessages.d.ts +1 -0
- package/dist/requests/fetchMessages.d.ts.map +1 -0
- package/dist/requests/fetchMessages.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types.d.ts +5 -4
- package/dist/types.d.ts.map +1 -0
- package/dist/utils/cn.d.ts +1 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/config.d.ts +2 -1
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/error-handling.d.ts +1 -0
- package/dist/utils/error-handling.d.ts.map +1 -0
- package/dist/utils/error-handling.js.map +1 -1
- package/dist/utils/format.d.ts +2 -1
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/guards.d.ts +2 -0
- package/dist/utils/guards.d.ts.map +1 -0
- package/dist/utils/guards.js +14 -11
- package/dist/utils/guards.js.map +1 -1
- package/dist/utils/icu-tranform.d.ts +6 -5
- package/dist/utils/icu-tranform.d.ts.map +1 -0
- package/dist/utils/icu-tranform.js +32 -27
- package/dist/utils/icu-tranform.js.map +1 -1
- package/dist/utils/sanitize.d.ts +2 -1
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js.map +1 -1
- package/dist/utils/schema.d.ts +3 -2
- package/dist/utils/schema.d.ts.map +1 -0
- package/dist/utils/schema.js +10 -9
- package/dist/utils/schema.js.map +1 -1
- package/dist/utils/validate.d.ts +2 -1
- package/dist/utils/validate.d.ts.map +1 -0
- package/dist/utils/validate.js.map +1 -1
- package/package.json +57 -72
- package/dist/components/inputs/LexicalInput.js +0 -80
- package/dist/components/inputs/LexicalInput.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { jsxs as
|
|
1
|
+
import { jsxs as d, jsx as i } from "react/jsx-runtime";
|
|
2
2
|
import { useMemo as p } from "react";
|
|
3
|
-
import { useMessagesForm as
|
|
3
|
+
import { useMessagesForm as f } from "../../context/messages-form.js";
|
|
4
4
|
import { cn as n } from "../../utils/cn.js";
|
|
5
5
|
import { parseMessageSchema as v } from "../../utils/schema.js";
|
|
6
6
|
import { createValidator as x } from "../../utils/validate.js";
|
|
@@ -11,39 +11,39 @@ function w({
|
|
|
11
11
|
path: t,
|
|
12
12
|
className: l
|
|
13
13
|
}) {
|
|
14
|
-
const { locales: r } =
|
|
14
|
+
const { locales: r } = f(), e = p(() => v(o), [o]), m = p(
|
|
15
15
|
() => x(e.variables),
|
|
16
16
|
[e.variables]
|
|
17
17
|
);
|
|
18
|
-
return /* @__PURE__ */
|
|
18
|
+
return /* @__PURE__ */ d("div", { className: n("", l), children: [
|
|
19
19
|
e.description && /* @__PURE__ */ i("p", { children: e.description }),
|
|
20
20
|
r.length === 1 ? /* @__PURE__ */ i(
|
|
21
21
|
c,
|
|
22
22
|
{
|
|
23
23
|
className: l,
|
|
24
|
-
type: e.type,
|
|
25
|
-
variables: e.variables,
|
|
26
24
|
locale: r[0],
|
|
27
25
|
name: [r[0], t, s].join("."),
|
|
28
|
-
|
|
26
|
+
type: e.type,
|
|
27
|
+
validate: m,
|
|
28
|
+
variables: e.variables
|
|
29
29
|
}
|
|
30
30
|
) : /* @__PURE__ */ i(
|
|
31
31
|
"div",
|
|
32
32
|
{
|
|
33
33
|
className: n("-mx-3 flex min-w-0 gap-4 px-3", {
|
|
34
|
-
"overflow-x-auto": e.type === "icu"
|
|
35
|
-
"flex-col":
|
|
34
|
+
"overflow-x-auto": e.type === "icu"
|
|
35
|
+
// "flex-col": config.type === "rich",
|
|
36
36
|
}),
|
|
37
37
|
children: r.map((a) => /* @__PURE__ */ i(
|
|
38
38
|
c,
|
|
39
39
|
{
|
|
40
40
|
className: "flex-1",
|
|
41
|
-
type: e.type,
|
|
42
41
|
label: a.toUpperCase(),
|
|
43
42
|
locale: a,
|
|
44
|
-
variables: e.variables,
|
|
45
43
|
name: [a, t, s].join("."),
|
|
46
|
-
|
|
44
|
+
type: e.type,
|
|
45
|
+
validate: m,
|
|
46
|
+
variables: e.variables
|
|
47
47
|
},
|
|
48
48
|
a
|
|
49
49
|
))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageField.js","sources":["../../../src/components/layout/MessageField.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"MessageField.js","sources":["../../../src/components/layout/MessageField.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useMessagesForm } from '@/context/messages-form';\nimport type { MessageSchema } from '@/types';\nimport { cn } from '@/utils/cn';\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 locale={locales[0]}\n name={[locales[0], path, messageKey].join('.')}\n type={config.type}\n validate={validator}\n variables={config.variables}\n />\n ) : (\n <div\n className={cn('-mx-3 flex min-w-0 gap-4 px-3', {\n 'overflow-x-auto': config.type === 'icu',\n // \"flex-col\": config.type === \"rich\",\n })}\n >\n {locales.map((locale) => (\n <MessageController\n className=\"flex-1\"\n key={locale}\n label={locale.toUpperCase()}\n locale={locale}\n name={[locale, path, messageKey].join('.')}\n type={config.type}\n validate={validator}\n variables={config.variables}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"names":["MessageField","schema","messageKey","path","className","locales","useMessagesForm","config","useMemo","parseMessageSchema","validator","createValidator","cn","jsx","MessageController","locale"],"mappings":";;;;;;;AAgBO,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,2BACG,OAAA,EAAI,WAAWK,EAAG,IAAIR,CAAS,GAC7B,UAAA;AAAA,IAAAG,EAAO,eAAe,gBAAAM,EAAC,KAAA,EAAG,UAAAN,EAAO,aAAY;AAAA,IAE7CF,EAAQ,WAAW,IAClB,gBAAAQ;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,WAAAV;AAAA,QACA,QAAQC,EAAQ,CAAC;AAAA,QACjB,MAAM,CAACA,EAAQ,CAAC,GAAGF,GAAMD,CAAU,EAAE,KAAK,GAAG;AAAA,QAC7C,MAAMK,EAAO;AAAA,QACb,UAAUG;AAAA,QACV,WAAWH,EAAO;AAAA,MAAA;AAAA,IAAA,IAGpB,gBAAAM;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWD,EAAG,iCAAiC;AAAA,UAC7C,mBAAmBL,EAAO,SAAS;AAAA;AAAA,QAAA,CAEpC;AAAA,QAEA,UAAAF,EAAQ,IAAI,CAACU,MACZ,gBAAAF;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YAEV,OAAOC,EAAO,YAAA;AAAA,YACd,QAAAA;AAAA,YACA,MAAM,CAACA,GAAQZ,GAAMD,CAAU,EAAE,KAAK,GAAG;AAAA,YACzC,MAAMK,EAAO;AAAA,YACb,UAAUG;AAAA,YACV,WAAWH,EAAO;AAAA,UAAA;AAAA,UANbQ;AAAA,QAAA,CAQR;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GAEJ;AAEJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MessagesSchema } from '../../types
|
|
1
|
+
import { MessagesSchema } from '../../types';
|
|
2
2
|
interface MessagesTabsProps {
|
|
3
3
|
schema: MessagesSchema;
|
|
4
4
|
activeTab: string | undefined;
|
|
@@ -6,3 +6,4 @@ interface MessagesTabsProps {
|
|
|
6
6
|
}
|
|
7
7
|
export declare function MessagesTabs({ schema, activeTab, setActiveTab, }: MessagesTabsProps): React.ReactNode;
|
|
8
8
|
export {};
|
|
9
|
+
//# sourceMappingURL=MessagesTabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessagesTabs.d.ts","sourceRoot":"","sources":["../../../src/components/layout/MessagesTabs.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAI9C,UAAU,iBAAiB;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAGD,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,SAAS,EACT,YAAY,GACb,EAAE,iBAAiB,GAAG,KAAK,CAAC,SAAS,CAqCrC"}
|
|
@@ -18,18 +18,18 @@ function N({
|
|
|
18
18
|
return /* @__PURE__ */ s(
|
|
19
19
|
"div",
|
|
20
20
|
{
|
|
21
|
+
className: "overflow-x-auto text-nowrap border-border border-b-2 px-4",
|
|
21
22
|
role: "tablist",
|
|
22
|
-
className: "overflow-x-auto border-b-2 border-border px-4 text-nowrap",
|
|
23
23
|
children: Object.keys(m).map((r) => /* @__PURE__ */ s(
|
|
24
24
|
p,
|
|
25
25
|
{
|
|
26
|
-
|
|
26
|
+
buttonStyle: o === r ? "pill" : "tab",
|
|
27
27
|
className: f(
|
|
28
28
|
"my-0 rounded-b-none text-lg",
|
|
29
29
|
i(r) ? o === r ? "bg-error" : "text-error" : void 0
|
|
30
30
|
),
|
|
31
|
-
buttonStyle: o === r ? "pill" : "tab",
|
|
32
31
|
onClick: () => n(r),
|
|
32
|
+
size: "large",
|
|
33
33
|
type: "button",
|
|
34
34
|
children: x(r)
|
|
35
35
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessagesTabs.js","sources":["../../../src/components/layout/MessagesTabs.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"MessagesTabs.js","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 '@/context/messages-form';\nimport type { MessagesSchema } from '@/types';\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 className=\"overflow-x-auto text-nowrap border-border border-b-2 px-4\"\n role=\"tablist\"\n >\n {Object.keys(schema).map((key) => (\n <Button\n buttonStyle={activeTab === key ? 'pill' : 'tab'}\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 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":["MessagesTabs","schema","activeTab","setActiveTab","locales","control","useMessagesForm","errors","useFormState","hasErrors","useCallback","key","locale","get","jsx","Button","cn"],"mappings":";;;;;;;;AAgBO,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,gBAAAU;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MAEJ,iBAAO,KAAKb,CAAM,EAAE,IAAI,CAACU,MACxB,gBAAAG;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,aAAab,MAAcS,IAAM,SAAS;AAAA,UAC1C,WAAWK;AAAA,YACT;AAAA,YACAP,EAAUE,CAAG,IACTT,MAAcS,IACZ,aACA,eACF;AAAA,UAAA;AAAA,UAGN,SAAS,MAAMR,EAAaQ,CAAG;AAAA,UAC/B,MAAK;AAAA,UACL,MAAK;AAAA,UAEJ,YAAQA,CAAG;AAAA,QAAA;AAAA,QALPA;AAAA,MAAA,CAOR;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Messages } from '../../types
|
|
1
|
+
import { Messages } from '../../types';
|
|
2
2
|
interface MessagesTreeProps {
|
|
3
3
|
path: string;
|
|
4
4
|
nestingLevel: number;
|
|
@@ -7,3 +7,4 @@ interface MessagesTreeProps {
|
|
|
7
7
|
}
|
|
8
8
|
export declare function MessagesTree({ path, schema, nestingLevel, className, }: MessagesTreeProps): React.ReactNode;
|
|
9
9
|
export {};
|
|
10
|
+
//# sourceMappingURL=MessagesTree.d.ts.map
|
|
@@ -0,0 +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;CACpB;AAID,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,MAAM,EACN,YAAgB,EAChB,SAAS,GACV,EAAE,iBAAiB,GAAG,KAAK,CAAC,SAAS,CAyDrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessagesTree.js","sources":["../../../src/components/layout/MessagesTree.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"MessagesTree.js","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 '@/context/messages-form';\nimport type { Messages } from '@/types';\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\n// TODO fix sticky position on single locale form\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 className=\"grid min-w-0\"\n key={key}\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 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":["MessagesTree","path","schema","nestingLevel","className","control","locales","useMessagesForm","errors","useFormState","hasErrors","useCallback","key","locale","get","cn","value","jsx","Collapsible","MessageField"],"mappings":";;;;;;;;;AAoBO,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,2BACG,OAAA,EAAI,WAAWc,EAAG,cAAcX,CAAS,GACvC,UAAA,OAAO,QAAQF,CAAM,EAAE,IAAI,CAAC,CAACU,GAAKI,CAAK,MACtC,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MAEV,OACE;AAAA,QACG,mBAAoBd;AAAA,MAAA;AAAA,MAIzB,UAAA,gBAAAc;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,QACE,gBAAAD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWF,EAAG,WAAW;AAAA,gBACvB,cAAcL,EAAUE,CAAG;AAAA,cAAA,CAC5B;AAAA,cAEA,YAAQA,CAAG;AAAA,YAAA;AAAA,UAAA;AAAA,UAIf,UAAA,OAAOI,KAAU,WAChB,gBAAAC;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cAEV,YAAYP;AAAA,cACZ,MAAAX;AAAA,cACA,QAAQe;AAAA,YAAA;AAAA,YAHHJ;AAAA,UAAA,IAMP,gBAAAK;AAAA,YAACjB;AAAA,YAAA;AAAA,cACC,cAAcG,IAAe;AAAA,cAC7B,MAAM,CAACF,GAAMW,CAAG,EAAE,KAAK,GAAG;AAAA,cAC1B,QAAQI;AAAA,YAAA;AAAA,UAAA;AAAA,QACV;AAAA,MAAA;AAAA,IAEJ;AAAA,IAlCKJ;AAAA,EAAA,CAoCR,GACH;AAEJ;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Locales, Messages, Translations } from '../types.ts';
|
|
2
1
|
import { UseFormReturn } from 'react-hook-form';
|
|
2
|
+
import { Locales, Messages, Translations } from '../types';
|
|
3
3
|
export type FormValues = Translations<Messages>;
|
|
4
4
|
interface MessagesFormProviderProps {
|
|
5
5
|
locales: Locales;
|
|
@@ -26,3 +26,4 @@ export declare const useMessagesForm: () => {
|
|
|
26
26
|
locales: Locales;
|
|
27
27
|
};
|
|
28
28
|
export {};
|
|
29
|
+
//# sourceMappingURL=messages-form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages-form.d.ts","sourceRoot":"","sources":["../../src/context/messages-form.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE/D,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AAQhD,UAAU,yBAAyB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CACjC;AAED,wBAAgB,oBAAoB,CAAC,EACnC,OAAO,EACP,IAAI,EACJ,QAAQ,GACT,EAAE,KAAK,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,2CAMpD;AAED,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;aAtBjB,OAAO;CA6BjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages-form.js","sources":["../../src/context/messages-form.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"messages-form.js","sources":["../../src/context/messages-form.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, use } from 'react';\nimport type { UseFormReturn } from 'react-hook-form';\nimport { FormProvider, useFormContext } from 'react-hook-form';\nimport type { Locales, Messages, Translations } from '@/types';\n\nexport type FormValues = Translations<Messages>;\n\nconst MessagesFormContext = createContext<{\n locales: Locales;\n}>({\n locales: ['en'],\n});\n\ninterface MessagesFormProviderProps {\n locales: Locales;\n form: UseFormReturn<FormValues>;\n}\n\nexport function MessagesFormProvider({\n locales,\n form,\n children,\n}: React.PropsWithChildren<MessagesFormProviderProps>) {\n return (\n <MessagesFormContext value={{ locales }}>\n <FormProvider {...form}>{children}</FormProvider>\n </MessagesFormContext>\n );\n}\n\nexport const useMessagesForm = () => {\n const context = use(MessagesFormContext);\n const form = useFormContext<FormValues>();\n return {\n ...context,\n ...form,\n };\n};\n"],"names":["MessagesFormContext","createContext","MessagesFormProvider","locales","form","children","jsx","FormProvider","useMessagesForm","context","use","useFormContext"],"mappings":";;;;AASA,MAAMA,IAAsBC,EAEzB;AAAA,EACD,SAAS,CAAC,IAAI;AAChB,CAAC;AAOM,SAASC,EAAqB;AAAA,EACnC,SAAAC;AAAA,EACA,MAAAC;AAAA,EACA,UAAAC;AACF,GAAuD;AACrD,SACE,gBAAAC,EAACN,GAAA,EAAoB,OAAO,EAAE,SAAAG,EAAA,GAC5B,UAAA,gBAAAG,EAACC,GAAA,EAAc,GAAGH,GAAO,UAAAC,EAAA,CAAS,EAAA,CACpC;AAEJ;AAEO,MAAMG,IAAkB,MAAM;AACnC,QAAMC,IAAUC,EAAIV,CAAmB,GACjCI,IAAOO,EAAA;AACb,SAAO;AAAA,IACL,GAAGF;AAAA,IACH,GAAGL;AAAA,EAAA;AAEP;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-messages.d.ts","sourceRoot":"","sources":["../../src/endpoints/get-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,SAAS,CAAC;AAIxD,eAAO,MAAM,mBAAmB,EAAE,QAQjC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-messages.js","sources":["../../src/endpoints/get-messages.ts"],"sourcesContent":["import type { Endpoint, PayloadRequest } from
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"set-messages.d.ts","sourceRoot":"","sources":["../../src/endpoints/set-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAwB,MAAM,SAAS,CAAC;AAK9D,eAAO,MAAM,mBAAmB,EAAE,QAuDjC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-messages.js","sources":["../../src/endpoints/set-messages.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"set-messages.js","sources":["../../src/endpoints/set-messages.ts"],"sourcesContent":["import type { Endpoint, File, PayloadRequest } from 'payload';\nimport type { Messages, Translations } from '@/types';\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;"}
|
package/dist/exports/link.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { PayloadRequest } from 'payload';
|
|
2
|
-
import { MessagesGuard } from '../types
|
|
2
|
+
import { MessagesGuard } from '../types';
|
|
3
3
|
export interface MessagesLinkProps {
|
|
4
4
|
access?: MessagesGuard;
|
|
5
5
|
req: PayloadRequest;
|
|
6
6
|
}
|
|
7
7
|
export declare function MessagesLink({ access, req, }: MessagesLinkProps): Promise<import("react/jsx-runtime").JSX.Element | null>;
|
|
8
|
+
//# sourceMappingURL=link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/exports/link.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,GAAG,EAAE,cAAc,CAAC;CACrB;AAED,wBAAsB,YAAY,CAAC,EACjC,MAAmB,EACnB,GAAG,GACJ,EAAE,iBAAiB,2DAanB"}
|
package/dist/exports/link.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","sources":["../../src/exports/link.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"link.js","sources":["../../src/exports/link.tsx"],"sourcesContent":["import { Button } from '@payloadcms/ui';\nimport { IconWorld } from '@tabler/icons-react';\nimport type { PayloadRequest } from 'payload';\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","jsx","Button","IconWorld"],"mappings":";;;AAWA,eAAsBA,EAAa;AAAA,EACjC,QAAAC,IAAS,MAAM;AAAA,EACf,KAAAC;AACF,GAAsB;AAEpB,SADkB,MAAMD,EAAOC,CAAG,IAIhC,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,aAAY;AAAA,MACZ,IAAG;AAAA,MACH,IAAI,GAAGF,EAAI,QAAQ,aAAa;AAAA,MAEhC,4BAACG,GAAA,CAAA,CAAU;AAAA,IAAA;AAAA,EAAA,IARQ;AAWzB;"}
|
package/dist/exports/rsc.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsc.d.ts","sourceRoot":"","sources":["../../src/exports/rsc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC"}
|
package/dist/exports/view.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Locales, Messages, MessagesGuard } from '../types.ts';
|
|
2
1
|
import { AdminViewServerProps } from 'payload';
|
|
2
|
+
import { Locales, Messages, MessagesGuard } from '../types';
|
|
3
3
|
export interface MessagesViewProps {
|
|
4
4
|
locales: Locales;
|
|
5
5
|
schema: Messages;
|
|
@@ -7,3 +7,4 @@ export interface MessagesViewProps {
|
|
|
7
7
|
access: MessagesGuard;
|
|
8
8
|
}
|
|
9
9
|
export declare function MessagesView({ access, initPageResult, locales, params, payload, schema, searchParams, tabs, }: AdminViewServerProps & MessagesViewProps): Promise<import("react/jsx-runtime").JSX.Element>;
|
|
10
|
+
//# sourceMappingURL=view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/exports/view.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,KAAK,EAEV,OAAO,EACP,QAAQ,EACR,aAAa,EAEd,MAAM,SAAS,CAAC;AAOjB,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,wBAAsB,YAAY,CAAC,EACjC,MAAM,EACN,cAAc,EACd,OAAO,EACP,MAAM,EACN,OAAO,EACP,MAAM,EACN,YAAY,EACZ,IAAY,GACb,EAAE,oBAAoB,GAAG,iBAAiB,oDA6C1C"}
|
package/dist/exports/view.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DefaultTemplate as
|
|
3
|
-
import { Gutter as
|
|
4
|
-
import { redirect as
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
access: c,
|
|
1
|
+
import { jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import { DefaultTemplate as u } from "@payloadcms/next/templates";
|
|
3
|
+
import { Gutter as g } from "@payloadcms/ui";
|
|
4
|
+
import { redirect as h, RedirectType as v } from "next/navigation";
|
|
5
|
+
import { sanitizeMessages as A } from "../utils/sanitize.js";
|
|
6
|
+
import { MessagesForm as M } from "../components/MessagesForm.js";
|
|
7
|
+
import { fetchMessages as q } from "../requests/fetchMessages.js";
|
|
8
|
+
async function T({
|
|
9
|
+
access: m,
|
|
11
10
|
initPageResult: e,
|
|
12
11
|
locales: t,
|
|
13
12
|
params: p,
|
|
@@ -17,14 +16,14 @@ async function z({
|
|
|
17
16
|
tabs: a = !1
|
|
18
17
|
}) {
|
|
19
18
|
const o = r.getAPIURL(), l = o.endsWith("/") ? `${o}intl-plugin` : `${o}/intl-plugin`;
|
|
20
|
-
await
|
|
21
|
-
const
|
|
19
|
+
await m(e.req) || h(r.getAdminURL(), v.replace);
|
|
20
|
+
const c = {};
|
|
22
21
|
for (const s of t) {
|
|
23
|
-
const d = await
|
|
24
|
-
|
|
22
|
+
const d = await q(r, s);
|
|
23
|
+
c[s] = A(n, d);
|
|
25
24
|
}
|
|
26
|
-
return /* @__PURE__ */
|
|
27
|
-
|
|
25
|
+
return /* @__PURE__ */ i(
|
|
26
|
+
u,
|
|
28
27
|
{
|
|
29
28
|
i18n: e.req.i18n,
|
|
30
29
|
locale: e.locale,
|
|
@@ -35,23 +34,20 @@ async function z({
|
|
|
35
34
|
user: e.req.user || void 0,
|
|
36
35
|
viewActions: r.config.admin.components.actions.filter((s) => typeof s != "object" ? !0 : s.exportName !== "MessagesLink"),
|
|
37
36
|
visibleEntities: e.visibleEntities,
|
|
38
|
-
children:
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
) }),
|
|
49
|
-
/* @__PURE__ */ i(M, { position: "top-right" })
|
|
50
|
-
]
|
|
37
|
+
children: /* @__PURE__ */ i(g, { children: /* @__PURE__ */ i(
|
|
38
|
+
M,
|
|
39
|
+
{
|
|
40
|
+
endpointUrl: l,
|
|
41
|
+
locales: t,
|
|
42
|
+
schema: n,
|
|
43
|
+
tabs: a,
|
|
44
|
+
values: c
|
|
45
|
+
}
|
|
46
|
+
) })
|
|
51
47
|
}
|
|
52
48
|
);
|
|
53
49
|
}
|
|
54
50
|
export {
|
|
55
|
-
|
|
51
|
+
T as MessagesView
|
|
56
52
|
};
|
|
57
53
|
//# sourceMappingURL=view.js.map
|
package/dist/exports/view.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.js","sources":["../../src/exports/view.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"view.js","sources":["../../src/exports/view.tsx"],"sourcesContent":["import { DefaultTemplate } from '@payloadcms/next/templates';\nimport { Gutter } from '@payloadcms/ui';\nimport { RedirectType, redirect } from 'next/navigation';\nimport type { AdminViewServerProps } from 'payload';\nimport type {\n DeepPartial,\n Locales,\n Messages,\n MessagesGuard,\n Translations,\n} from '@/types';\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}\n\nexport async function MessagesView({\n access,\n initPageResult,\n locales,\n params,\n payload,\n schema,\n searchParams,\n tabs = false,\n}: AdminViewServerProps & MessagesViewProps) {\n const apiUrl = payload.getAPIURL();\n const endpointUrl = apiUrl.endsWith('/')\n ? `${apiUrl}intl-plugin`\n : `${apiUrl}/intl-plugin`;\n\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\n translations[locale] = sanitizeMessages(schema, messages);\n }\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 endpointUrl={endpointUrl}\n locales={locales}\n schema={schema}\n tabs={tabs}\n values={translations}\n />\n </Gutter>\n </DefaultTemplate>\n );\n}\n"],"names":["MessagesView","access","initPageResult","locales","params","payload","schema","searchParams","tabs","apiUrl","endpointUrl","redirect","RedirectType","translations","locale","messages","fetchMessages","sanitizeMessages","jsx","DefaultTemplate","action","Gutter","MessagesForm"],"mappings":";;;;;;;AAwBA,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;AACT,GAA6C;AAC3C,QAAMC,IAASJ,EAAQ,UAAA,GACjBK,IAAcD,EAAO,SAAS,GAAG,IACnC,GAAGA,CAAM,gBACT,GAAGA,CAAM;AAGb,EADkB,MAAMR,EAAOC,EAAe,GAAG,KACjCS,EAASN,EAAQ,YAAA,GAAeO,EAAa,OAAO;AAEpE,QAAMC,IAAoD,CAAA;AAE1D,aAAWC,KAAUX,GAAS;AAC5B,UAAMY,IAAW,MAAMC,EAAcX,GAASS,CAAM;AAEpD,IAAAD,EAAaC,CAAM,IAAIG,EAAiBX,GAAQS,CAAQ;AAAA,EAC1D;AAEA,SACE,gBAAAG;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAMjB,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,CAACe,MACvD,OAAOA,KAAW,WACb,KAEFA,EAAO,eAAe,cAC9B;AAAA,MACD,iBAAiBlB,EAAe;AAAA,MAEhC,4BAACmB,GAAA,EACC,UAAA,gBAAAH;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,aAAAZ;AAAA,UACA,SAAAP;AAAA,UACA,QAAAG;AAAA,UACA,MAAAE;AAAA,UACA,QAAQK;AAAA,QAAA;AAAA,MAAA,EACV,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,4 +2,5 @@ import { Plugin } from 'payload';
|
|
|
2
2
|
import { MessagesPluginConfig } from './types.ts';
|
|
3
3
|
export declare const intlPlugin: ({ schema, tabs, collectionSlug, hooks, editorAccess, }: MessagesPluginConfig) => Plugin;
|
|
4
4
|
export { fetchMessages } from './requests/fetchMessages';
|
|
5
|
-
export type { MessagesPluginConfig, MessagesSchema,
|
|
5
|
+
export type { Messages, MessagesPluginConfig, MessagesSchema, } from './types.ts';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAC;AAEtB,OAAO,KAAK,EAGV,MAAM,EACP,MAAM,SAAS,CAAC;AAIjB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGvD,eAAO,MAAM,UAAU,2DAOlB,oBAAoB,KAAG,MAwFzB,CAAC;AAEJ,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,YAAY,EACV,QAAQ,EACR,oBAAoB,EACpB,cAAc,GACf,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
/* empty css */
|
|
2
|
-
import { lexicalEditor as m } from "@payloadcms/richtext-lexical";
|
|
3
2
|
import { getMessagesEndpoint as o } from "./endpoints/get-messages.js";
|
|
4
|
-
import { setMessagesEndpoint as
|
|
5
|
-
import { getSupportedLocales as
|
|
6
|
-
import { fetchMessages as
|
|
7
|
-
const
|
|
3
|
+
import { setMessagesEndpoint as p } from "./endpoints/set-messages.js";
|
|
4
|
+
import { getSupportedLocales as d, attachPluginContext as l } from "./utils/config.js";
|
|
5
|
+
import { fetchMessages as M } from "./requests/fetchMessages.js";
|
|
6
|
+
const w = ({
|
|
8
7
|
schema: s,
|
|
9
8
|
tabs: a,
|
|
10
9
|
collectionSlug: t = "messages",
|
|
11
|
-
hooks:
|
|
12
|
-
editorAccess:
|
|
10
|
+
hooks: n,
|
|
11
|
+
editorAccess: r = (e) => e.user !== null
|
|
13
12
|
}) => (e) => {
|
|
14
|
-
const
|
|
13
|
+
const i = d(e.localization);
|
|
15
14
|
if (!e.serverURL)
|
|
16
15
|
throw new Error(
|
|
17
16
|
"serverURL is required in your payload.config.ts file for payload-intl to work."
|
|
@@ -25,30 +24,16 @@ const M = ({
|
|
|
25
24
|
Component: {
|
|
26
25
|
path: "payload-intl/rsc#MessagesView",
|
|
27
26
|
serverProps: {
|
|
28
|
-
access:
|
|
29
|
-
locales:
|
|
27
|
+
access: r,
|
|
28
|
+
locales: i,
|
|
30
29
|
schema: s,
|
|
31
30
|
tabs: a
|
|
32
31
|
}
|
|
33
32
|
},
|
|
34
33
|
path: "/intl"
|
|
35
34
|
}
|
|
36
|
-
},
|
|
35
|
+
}, l(e, {
|
|
37
36
|
collectionSlug: t
|
|
38
|
-
}), e.globals ??= [], e.globals.push({
|
|
39
|
-
slug: "intl-plugin",
|
|
40
|
-
fields: [
|
|
41
|
-
{
|
|
42
|
-
name: "editorTemplate",
|
|
43
|
-
type: "richText",
|
|
44
|
-
editor: m({
|
|
45
|
-
features: ({ defaultFeatures: l }) => l.filter(
|
|
46
|
-
({ key: d }) => !["relationship", "upload"].includes(d)
|
|
47
|
-
)
|
|
48
|
-
}),
|
|
49
|
-
admin: { hidden: !0 }
|
|
50
|
-
}
|
|
51
|
-
]
|
|
52
37
|
}), e.collections ??= [], e.collections.push({
|
|
53
38
|
slug: t,
|
|
54
39
|
admin: {
|
|
@@ -57,7 +42,7 @@ const M = ({
|
|
|
57
42
|
access: {
|
|
58
43
|
read: () => !0
|
|
59
44
|
},
|
|
60
|
-
endpoints: [
|
|
45
|
+
endpoints: [p, o],
|
|
61
46
|
fields: [
|
|
62
47
|
{
|
|
63
48
|
name: "locale",
|
|
@@ -65,7 +50,7 @@ const M = ({
|
|
|
65
50
|
required: !0
|
|
66
51
|
}
|
|
67
52
|
],
|
|
68
|
-
hooks:
|
|
53
|
+
hooks: m(n),
|
|
69
54
|
indexes: [
|
|
70
55
|
{
|
|
71
56
|
fields: ["locale"]
|
|
@@ -74,23 +59,23 @@ const M = ({
|
|
|
74
59
|
upload: {
|
|
75
60
|
mimeTypes: ["application/json"]
|
|
76
61
|
}
|
|
77
|
-
}), e.endpoints ??= [], e.endpoints.push(o), e.endpoints.push(
|
|
78
|
-
},
|
|
62
|
+
}), e.endpoints ??= [], e.endpoints.push(o), e.endpoints.push(p), e;
|
|
63
|
+
}, m = (s) => {
|
|
79
64
|
if (!s)
|
|
80
65
|
return;
|
|
81
66
|
const { afterUpdate: a, ...t } = s;
|
|
82
67
|
if (!a)
|
|
83
68
|
return t;
|
|
84
|
-
const
|
|
85
|
-
|
|
69
|
+
const n = async ({ operation: r }) => {
|
|
70
|
+
r === "update" && await a();
|
|
86
71
|
};
|
|
87
72
|
return {
|
|
88
73
|
...t,
|
|
89
|
-
afterChange: [...t.afterChange ?? [],
|
|
74
|
+
afterChange: [...t.afterChange ?? [], n]
|
|
90
75
|
};
|
|
91
76
|
};
|
|
92
77
|
export {
|
|
93
|
-
|
|
94
|
-
|
|
78
|
+
M as fetchMessages,
|
|
79
|
+
w as intlPlugin
|
|
95
80
|
};
|
|
96
81
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import './styles.css';\n\nimport type {\n CollectionAfterChangeHook,\n CollectionConfig,\n Plugin,\n} from 'payload';\nimport { getMessagesEndpoint } from './endpoints/get-messages';\nimport { setMessagesEndpoint } from './endpoints/set-messages';\nimport type { MessagesViewProps } from './exports/view';\nimport type { MessagesPluginConfig } from './types.ts';\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 }: MessagesPluginConfig): Plugin =>\n (config) => {\n const locales = getSupportedLocales(config.localization);\n\n if (!config.serverURL) {\n throw new Error(\n 'serverURL is required in your payload.config.ts file for payload-intl to work.',\n );\n }\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({\n slug: collectionSlug,\n admin: {\n hidden: true,\n },\n access: {\n read: () => 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 Messages,\n MessagesPluginConfig,\n MessagesSchema,\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","config","locales","getSupportedLocales","attachPluginContext","setMessagesEndpoint","getMessagesEndpoint","createHooks","afterUpdate","rest","afterUpdateHook","operation"],"mappings":";;;;;AAaO,MAAMA,IACX,CAAC;AAAA,EACC,QAAAC;AAAA,EACA,MAAAC;AAAA,EACA,gBAAAC,IAAiB;AAAA,EACjB,OAAAC;AAAA,EACA,cAAAC,IAAe,CAACC,MAAQA,EAAI,SAAS;AACvC,MACA,CAACC,MAAW;AACV,QAAMC,IAAUC,EAAoBF,EAAO,YAAY;AAEvD,MAAI,CAACA,EAAO;AACV,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAIJ,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,QAAQF;AAAA,UACR,SAAAG;AAAA,UACA,QAAAP;AAAA,UACA,MAAAC;AAAA,QAAA;AAAA,MACF;AAAA,MAEF,MAAM;AAAA,IAAA;AAAA,EACR,GAGFQ,EAAoBH,GAAQ;AAAA,IAC1B,gBAAAJ;AAAA,EAAA,CACD,GAmBDI,EAAO,gBAAgB,CAAA,GACvBA,EAAO,YAAY,KAAK;AAAA,IACtB,MAAMJ;AAAA,IACN,OAAO;AAAA,MACL,QAAQ;AAAA,IAAA;AAAA,IAEV,QAAQ;AAAA,MACN,MAAM,MAAM;AAAA,IAAA;AAAA,IAEd,WAAW,CAACQ,GAAqBC,CAAmB;AAAA,IACpD,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,IAEF,OAAOC,EAAYT,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,GAEDG,EAAO,cAAc,CAAA,GACrBA,EAAO,UAAU,KAAKK,CAAmB,GACzCL,EAAO,UAAU,KAAKI,CAAmB,GAElCJ;AACT,GAUIM,IAAc,CAClBT,MAC8B;AAC9B,MAAI,CAACA;AACH;AAEF,QAAM,EAAE,aAAAU,GAAa,GAAGC,EAAA,IAASX;AACjC,MAAI,CAACU;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 @@
|
|
|
1
|
+
{"version":3,"file":"fetchMessages.d.ts","sourceRoot":"","sources":["../../src/requests/fetchMessages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAK3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,wBAAsB,aAAa,CACjC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,CAqCnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchMessages.js","sources":["../../src/requests/fetchMessages.ts"],"sourcesContent":["import type { BasePayload } from
|
|
1
|
+
{"version":3,"file":"fetchMessages.js","sources":["../../src/requests/fetchMessages.ts"],"sourcesContent":["import type { BasePayload } from 'payload';\n\nimport { getPluginContext } from '@/utils/config';\nimport { getErrorMessage } from '@/utils/error-handling';\n\nimport type { Messages } from '../types';\n\nexport async function fetchMessages(\n payload: BasePayload,\n locale: string,\n): Promise<Messages> {\n if (!payload.config.serverURL) {\n throw new Error(\n 'serverURL is required in your payload.config.ts file for payload-intl to work.',\n );\n }\n\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 const error = await getErrorMessage(response);\n throw new Error(\n `Could not fetch messages for locale \"${locale}\": ${error}`,\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 }\n\n return await response.json();\n}\n\n/*\ntry {\n const response = await fetch(endpointUrl, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(changes),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(\n \"message\" in error ? error.message : \"Unknown error\"\n );\n }\n\n form.reset(currentValues);\n toast.success(\"Saved\", { id: toastId });\n } catch (error) {\n toast.error(\n `Failed to save: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n { id: toastId },\n );\n }\n };\n\n*/\n"],"names":["fetchMessages","payload","locale","doc","getPluginContext","url","response","error","getErrorMessage"],"mappings":";;AAOA,eAAsBA,EACpBC,GACAC,GACmB;AACnB,MAAI,CAACD,EAAQ,OAAO;AAClB,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAIJ,QAAM;AAAA,IACJ,MAAM,CAACE,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,IAAI;AAChB,UAAMC,IAAQ,MAAMC,EAAgBF,CAAQ;AAC5C,UAAM,IAAI;AAAA,MACR,wCAAwCJ,CAAM,MAAMK,CAAK;AAAA,IAAA;AAAA,EAE7D;AAEA,MAAID,EAAS,QAAQ,IAAI,cAAc,MAAM;AAC3C,UAAM,IAAI;AAAA,MACR,wCAAwCJ,CAAM;AAAA,IAAA;AAIlD,SAAO,MAAMI,EAAS,KAAA;AACxB;"}
|