payload-intl 1.1.2 → 1.2.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 +62 -221
- package/dist/components/MessageController.d.ts +4 -6
- package/dist/components/MessageController.d.ts.map +1 -1
- package/dist/components/MessageController.js +25 -41
- package/dist/components/MessageController.js.map +1 -1
- package/dist/components/MessageFormContext.d.ts +29 -0
- package/dist/components/MessageFormContext.d.ts.map +1 -0
- package/dist/components/MessageFormContext.js +30 -0
- package/dist/components/MessageFormContext.js.map +1 -0
- package/dist/components/MessagesForm.d.ts +2 -2
- package/dist/components/MessagesForm.d.ts.map +1 -1
- package/dist/components/MessagesForm.js +126 -112
- package/dist/components/MessagesForm.js.map +1 -1
- package/dist/components/MessagesForm.module.css +41 -0
- package/dist/{exports/link.d.ts → components/MessagesLink.d.ts} +3 -3
- package/dist/components/MessagesLink.d.ts.map +1 -0
- package/dist/components/MessagesLink.js +19 -0
- package/dist/components/MessagesLink.js.map +1 -0
- package/dist/components/MessagesView.d.ts +10 -0
- package/dist/components/MessagesView.d.ts.map +1 -0
- package/dist/components/MessagesView.js +48 -0
- package/dist/components/MessagesView.js.map +1 -0
- package/dist/components/actions/JsonImport.d.ts.map +1 -1
- package/dist/components/actions/JsonImport.js +68 -61
- package/dist/components/actions/JsonImport.js.map +1 -1
- package/dist/components/actions/JsonImport.module.css +14 -0
- package/dist/components/actions/Move.d.ts.map +1 -1
- package/dist/components/actions/Move.js +41 -0
- package/dist/components/actions/Move.js.map +1 -0
- package/dist/components/actions/Move.module.css +8 -0
- package/dist/components/inputs/InputWrapper.d.ts +1 -1
- package/dist/components/inputs/InputWrapper.d.ts.map +1 -1
- package/dist/components/inputs/InputWrapper.js +31 -29
- package/dist/components/inputs/InputWrapper.js.map +1 -1
- package/dist/components/inputs/InputWrapper.module.css +34 -0
- package/dist/components/inputs/LexicalInput.d.ts +3 -3
- package/dist/components/inputs/LexicalInput.js +86 -0
- package/dist/components/inputs/LexicalInput.js.map +1 -0
- package/dist/components/inputs/MessageInput.d.ts +2 -2
- package/dist/components/inputs/MessageInput.d.ts.map +1 -1
- package/dist/components/inputs/MessageInput.js +110 -37
- package/dist/components/inputs/MessageInput.js.map +1 -1
- package/dist/components/inputs/MessageInput.module.css +25 -0
- package/dist/components/inputs/variables/VariableChip.d.ts +8 -2
- package/dist/components/inputs/variables/VariableChip.d.ts.map +1 -1
- package/dist/components/inputs/variables/VariableChip.js +86 -64
- package/dist/components/inputs/variables/VariableChip.js.map +1 -1
- package/dist/components/inputs/variables/VariableChip.module.css +66 -0
- package/dist/components/inputs/variables/VariableIcon.d.ts +1 -1
- package/dist/components/inputs/variables/VariableIcon.d.ts.map +1 -1
- package/dist/components/inputs/variables/VariableIcon.js +35 -0
- package/dist/components/inputs/variables/VariableIcon.js.map +1 -0
- package/dist/components/inputs/variables/VariableNode.d.ts +11 -0
- package/dist/components/inputs/variables/VariableNode.d.ts.map +1 -0
- package/dist/components/inputs/variables/VariableNode.js +36 -0
- package/dist/components/inputs/variables/VariableNode.js.map +1 -0
- package/dist/components/inputs/variables/VariableSuggestion.module.css +34 -0
- package/dist/components/inputs/variables/editors/DateVariableEditor.d.ts +2 -2
- package/dist/components/inputs/variables/editors/DateVariableEditor.d.ts.map +1 -1
- package/dist/components/inputs/variables/editors/DateVariableEditor.js +15 -0
- package/dist/components/inputs/variables/editors/DateVariableEditor.js.map +1 -0
- package/dist/components/inputs/variables/editors/PluralVariableEditor.d.ts +1 -1
- package/dist/components/inputs/variables/editors/PluralVariableEditor.d.ts.map +1 -1
- package/dist/components/inputs/variables/editors/PluralVariableEditor.js +191 -172
- package/dist/components/inputs/variables/editors/PluralVariableEditor.js.map +1 -1
- package/dist/components/inputs/variables/editors/PluralVariableEditor.module.css +149 -0
- package/dist/components/inputs/variables/editors/SelectVariableEditor.d.ts +1 -1
- package/dist/components/inputs/variables/editors/SelectVariableEditor.d.ts.map +1 -1
- package/dist/components/inputs/variables/editors/SelectVariableEditor.js +58 -52
- package/dist/components/inputs/variables/editors/SelectVariableEditor.js.map +1 -1
- package/dist/components/inputs/variables/editors/SelectVariableEditor.module.css +25 -0
- package/dist/components/inputs/variables/editors/TagVariableEditor.d.ts +1 -1
- package/dist/components/inputs/variables/editors/TagVariableEditor.d.ts.map +1 -1
- package/dist/components/inputs/variables/editors/TagVariableEditor.js +36 -32
- package/dist/components/inputs/variables/editors/TagVariableEditor.js.map +1 -1
- package/dist/components/inputs/variables/editors/TagVariableEditor.module.css +7 -0
- package/dist/components/inputs/variables/editors/TimeVariableEditor.d.ts +2 -2
- package/dist/components/inputs/variables/editors/TimeVariableEditor.d.ts.map +1 -1
- package/dist/components/inputs/variables/editors/TimeVariableEditor.js +15 -0
- package/dist/components/inputs/variables/editors/TimeVariableEditor.js.map +1 -0
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.d.ts +1 -1
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.d.ts.map +1 -1
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.js +48 -51
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.js.map +1 -1
- package/dist/components/inputs/variables/pickers/NumericVariablePicker.module.css +27 -0
- package/dist/components/inputs/variables/pickers/TemporalElementEditor.d.ts +1 -1
- package/dist/components/inputs/variables/pickers/TemporalElementEditor.d.ts.map +1 -1
- package/dist/components/inputs/variables/pickers/TemporalElementEditor.js +58 -0
- package/dist/components/inputs/variables/pickers/TemporalElementEditor.js.map +1 -0
- package/dist/components/inputs/variables/pickers/TemporalElementEditor.module.css +27 -0
- package/dist/components/layout/MessageField.d.ts +3 -3
- package/dist/components/layout/MessageField.d.ts.map +1 -1
- package/dist/components/layout/MessageField.js +56 -56
- package/dist/components/layout/MessageField.js.map +1 -1
- package/dist/components/layout/MessageField.module.css +19 -0
- package/dist/components/layout/MessagesTabs.d.ts +1 -1
- package/dist/components/layout/MessagesTabs.d.ts.map +1 -1
- package/dist/components/layout/MessagesTabs.js +40 -43
- package/dist/components/layout/MessagesTabs.js.map +1 -1
- package/dist/components/layout/MessagesTabs.module.css +21 -0
- package/dist/components/layout/MessagesTree.d.ts +3 -2
- package/dist/components/layout/MessagesTree.d.ts.map +1 -1
- package/dist/components/layout/MessagesTree.js +65 -67
- package/dist/components/layout/MessagesTree.js.map +1 -1
- package/dist/components/layout/MessagesTree.module.css +36 -0
- package/dist/const.d.ts +8 -9
- package/dist/const.d.ts.map +1 -1
- package/dist/const.js +16 -13
- package/dist/const.js.map +1 -1
- package/dist/endpoints/get-messages.d.ts +1 -1
- package/dist/endpoints/get-messages.d.ts.map +1 -1
- package/dist/endpoints/get-messages.js +7 -13
- package/dist/endpoints/get-messages.js.map +1 -1
- package/dist/endpoints/set-messages.d.ts +1 -1
- package/dist/endpoints/set-messages.d.ts.map +1 -1
- package/dist/endpoints/set-messages.js +61 -45
- package/dist/endpoints/set-messages.js.map +1 -1
- package/dist/entities.d.ts +5 -0
- package/dist/entities.d.ts.map +1 -0
- package/dist/entities.js +38 -0
- package/dist/entities.js.map +1 -0
- package/dist/exports/client.d.ts +2 -0
- package/dist/exports/client.d.ts.map +1 -0
- package/dist/exports/client.js +3 -0
- package/dist/exports/client.js.map +1 -0
- package/dist/exports/rsc.d.ts +2 -2
- package/dist/exports/rsc.d.ts.map +1 -1
- package/dist/exports/rsc.js +4 -7
- package/dist/exports/rsc.js.map +1 -1
- package/dist/hooks.d.ts +4 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +24 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +20 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +64 -80
- package/dist/index.js.map +1 -1
- package/dist/payload-types.d.ts +258 -0
- package/dist/payload-types.d.ts.map +1 -0
- package/dist/payload-types.js +15 -0
- package/dist/payload-types.js.map +1 -0
- package/dist/requests/fetchMessageFromAPI.d.ts +10 -0
- package/dist/requests/fetchMessageFromAPI.d.ts.map +1 -0
- package/dist/requests/fetchMessageFromAPI.js +15 -0
- package/dist/requests/fetchMessageFromAPI.js.map +1 -0
- package/dist/requests/fetchMessageFromPayload.d.ts +3 -0
- package/dist/requests/fetchMessageFromPayload.d.ts.map +1 -0
- package/dist/requests/fetchMessageFromPayload.js +29 -0
- package/dist/requests/fetchMessageFromPayload.js.map +1 -0
- package/dist/requests/fetchMessages.d.ts +3 -11
- package/dist/requests/fetchMessages.d.ts.map +1 -1
- package/dist/requests/fetchMessages.js +10 -40
- package/dist/requests/fetchMessages.js.map +1 -1
- package/dist/types.d.ts +7 -23
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/config.d.ts +3 -3
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +27 -17
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/error-handling.js +14 -12
- package/dist/utils/error-handling.js.map +1 -1
- package/dist/utils/format.d.ts +1 -1
- package/dist/utils/format.js +21 -13
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/guards.d.ts +2 -1
- package/dist/utils/guards.js +8 -18
- package/dist/utils/guards.js.map +1 -1
- package/dist/utils/icu-tranform.d.ts +13 -18
- package/dist/utils/icu-tranform.d.ts.map +1 -1
- package/dist/utils/icu-tranform.js +140 -108
- package/dist/utils/icu-tranform.js.map +1 -1
- package/dist/utils/sanitize.d.ts +1 -1
- package/dist/utils/sanitize.js +36 -17
- package/dist/utils/sanitize.js.map +1 -1
- package/dist/utils/schema.d.ts +1 -3
- package/dist/utils/schema.d.ts.map +1 -1
- package/dist/utils/schema.js +42 -34
- package/dist/utils/schema.js.map +1 -1
- package/dist/utils/validate.d.ts +2 -2
- package/dist/utils/validate.js +52 -53
- package/dist/utils/validate.js.map +1 -1
- package/package.json +35 -52
- package/dist/components/inputs/variables/VariableSuggestion.d.ts +0 -9
- package/dist/components/inputs/variables/VariableSuggestion.d.ts.map +0 -1
- package/dist/components/inputs/variables/VariableSuggestion.js +0 -41
- package/dist/components/inputs/variables/VariableSuggestion.js.map +0 -1
- package/dist/components/inputs/variables/extension.d.ts +0 -4
- package/dist/components/inputs/variables/extension.d.ts.map +0 -1
- package/dist/components/inputs/variables/extension.js +0 -93
- package/dist/components/inputs/variables/extension.js.map +0 -1
- package/dist/context/messages-form.d.ts +0 -29
- package/dist/context/messages-form.d.ts.map +0 -1
- package/dist/context/messages-form.js +0 -26
- package/dist/context/messages-form.js.map +0 -1
- package/dist/exports/link.d.ts.map +0 -1
- package/dist/exports/link.js +0 -21
- package/dist/exports/link.js.map +0 -1
- package/dist/exports/view.d.ts +0 -10
- package/dist/exports/view.d.ts.map +0 -1
- package/dist/exports/view.js +0 -53
- package/dist/exports/view.js.map +0 -1
- package/dist/styles.css +0 -1
- package/dist/utils/cn.d.ts +0 -3
- package/dist/utils/cn.d.ts.map +0 -1
- package/dist/utils/cn.js +0 -9
- package/dist/utils/cn.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/utils/schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE/D,eAAO,MAAM,kBAAkB,WAAY,aAAa,KAAG,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/utils/schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE/D,eAAO,MAAM,kBAAkB,WAAY,aAAa,KAAG,aAU1D,CAAC;AAEF,eAAO,MAAM,wBAAwB,WAC3B,aAAa,KACpB,gBAAgB,EAA6C,CAAC;AAgCjE,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B,CAAC"}
|
package/dist/utils/schema.js
CHANGED
|
@@ -1,35 +1,43 @@
|
|
|
1
|
-
import { parse
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return [];
|
|
12
|
-
case e.argument:
|
|
13
|
-
case e.number:
|
|
14
|
-
case e.date:
|
|
15
|
-
case e.time:
|
|
16
|
-
return [t];
|
|
17
|
-
case e.plural:
|
|
18
|
-
case e.select:
|
|
19
|
-
return [
|
|
20
|
-
t,
|
|
21
|
-
...s(
|
|
22
|
-
Object.values(t.options).flatMap(({ value: c }) => c)
|
|
23
|
-
)
|
|
24
|
-
];
|
|
25
|
-
case e.tag:
|
|
26
|
-
return [t, ...s(t.children)];
|
|
27
|
-
default:
|
|
28
|
-
return [t];
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
export {
|
|
32
|
-
l as extractTemplateVariables,
|
|
33
|
-
i as parseMessageSchema
|
|
1
|
+
import { parse, TYPE } from '@formatjs/icu-messageformat-parser';
|
|
2
|
+
export const parseMessageSchema = (schema)=>{
|
|
3
|
+
const description = schema.match(/^\[.+\]/)?.[0];
|
|
4
|
+
// TODO add support for variables description
|
|
5
|
+
// const withoutDescription = schema.replace(description || "", "").trim();
|
|
6
|
+
// const withoutOptional = withoutDescription.split(" | ")[0]?.trim();
|
|
7
|
+
return {
|
|
8
|
+
description: description?.slice(1, -1),
|
|
9
|
+
variables: extractTemplateVariables(schema)
|
|
10
|
+
};
|
|
34
11
|
};
|
|
35
|
-
|
|
12
|
+
export const extractTemplateVariables = (schema)=>collectTemplateVariables(parse(schema));
|
|
13
|
+
const collectTemplateVariables = (parts)=>parts.flatMap((part)=>{
|
|
14
|
+
switch(part.type){
|
|
15
|
+
case TYPE.literal:
|
|
16
|
+
case TYPE.pound:
|
|
17
|
+
return [];
|
|
18
|
+
case TYPE.argument:
|
|
19
|
+
case TYPE.number:
|
|
20
|
+
case TYPE.date:
|
|
21
|
+
case TYPE.time:
|
|
22
|
+
return [
|
|
23
|
+
part
|
|
24
|
+
];
|
|
25
|
+
case TYPE.plural:
|
|
26
|
+
case TYPE.select:
|
|
27
|
+
return [
|
|
28
|
+
part,
|
|
29
|
+
...collectTemplateVariables(Object.values(part.options).flatMap(({ value })=>value))
|
|
30
|
+
];
|
|
31
|
+
case TYPE.tag:
|
|
32
|
+
return [
|
|
33
|
+
part,
|
|
34
|
+
...collectTemplateVariables(part.children)
|
|
35
|
+
];
|
|
36
|
+
default:
|
|
37
|
+
return [
|
|
38
|
+
part
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=schema.js.map
|
package/dist/utils/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../src/utils/schema.ts"],"sourcesContent":["import type { MessageFormatElement } from '@formatjs/icu-messageformat-parser';\nimport { parse, TYPE } from '@formatjs/icu-messageformat-parser';\nimport type { MessageSchema, TemplateVariable } from '@/types';\n\nexport const parseMessageSchema = (schema: MessageSchema): MessageConfig => {\n const description = schema.match(/^\\[.+\\]/)?.[0];\n // TODO add support for variables description\n // const withoutDescription = schema.replace(description || \"\", \"\").trim();\n // const withoutOptional = withoutDescription.split(\" | \")[0]?.trim();\n\n return {\n description: description?.slice(1, -1),\n variables: extractTemplateVariables(schema),\n };\n};\n\nexport const extractTemplateVariables = (\n schema: MessageSchema,\n): TemplateVariable[] => collectTemplateVariables(parse(schema));\n\nconst collectTemplateVariables = (\n parts: MessageFormatElement[],\n): TemplateVariable[] =>\n parts.flatMap<TemplateVariable>((part) => {\n switch (part.type) {\n case TYPE.literal:\n case TYPE.pound:\n return [];\n case TYPE.argument:\n case TYPE.number:\n case TYPE.date:\n case TYPE.time:\n return [part];\n case TYPE.plural:\n case TYPE.select:\n return [\n part,\n ...collectTemplateVariables(\n Object.values(part.options).flatMap(({ value }) => value),\n ),\n ];\n case TYPE.tag:\n return [part, ...collectTemplateVariables(part.children)];\n default:\n return [part];\n }\n });\n\n// MARK: Types\n\nexport type MessageConfig = {\n description: string | undefined;\n variables: TemplateVariable[];\n};\n"],"names":["parse","TYPE","parseMessageSchema","schema","description","match","slice","variables","extractTemplateVariables","collectTemplateVariables","parts","flatMap","part","type","literal","pound","argument","number","date","time","plural","select","Object","values","options","value","tag","children"],"mappings":"AACA,SAASA,KAAK,EAAEC,IAAI,QAAQ,qCAAqC;AAGjE,OAAO,MAAMC,qBAAqB,CAACC;IACjC,MAAMC,cAAcD,OAAOE,KAAK,CAAC,YAAY,CAAC,EAAE;IAChD,6CAA6C;IAC7C,2EAA2E;IAC3E,sEAAsE;IAEtE,OAAO;QACLD,aAAaA,aAAaE,MAAM,GAAG,CAAC;QACpCC,WAAWC,yBAAyBL;IACtC;AACF,EAAE;AAEF,OAAO,MAAMK,2BAA2B,CACtCL,SACuBM,yBAAyBT,MAAMG,SAAS;AAEjE,MAAMM,2BAA2B,CAC/BC,QAEAA,MAAMC,OAAO,CAAmB,CAACC;QAC/B,OAAQA,KAAKC,IAAI;YACf,KAAKZ,KAAKa,OAAO;YACjB,KAAKb,KAAKc,KAAK;gBACb,OAAO,EAAE;YACX,KAAKd,KAAKe,QAAQ;YAClB,KAAKf,KAAKgB,MAAM;YAChB,KAAKhB,KAAKiB,IAAI;YACd,KAAKjB,KAAKkB,IAAI;gBACZ,OAAO;oBAACP;iBAAK;YACf,KAAKX,KAAKmB,MAAM;YAChB,KAAKnB,KAAKoB,MAAM;gBACd,OAAO;oBACLT;uBACGH,yBACDa,OAAOC,MAAM,CAACX,KAAKY,OAAO,EAAEb,OAAO,CAAC,CAAC,EAAEc,KAAK,EAAE,GAAKA;iBAEtD;YACH,KAAKxB,KAAKyB,GAAG;gBACX,OAAO;oBAACd;uBAASH,yBAAyBG,KAAKe,QAAQ;iBAAE;YAC3D;gBACE,OAAO;oBAACf;iBAAK;QACjB;IACF"}
|
package/dist/utils/validate.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ValidateResult } from 'react-hook-form';
|
|
2
|
-
import { TemplateVariable } from '../types';
|
|
1
|
+
import type { ValidateResult } from 'react-hook-form';
|
|
2
|
+
import type { TemplateVariable } from '../types';
|
|
3
3
|
export declare const validateMessage: (value: unknown, variables: TemplateVariable[]) => ValidateResult;
|
|
4
4
|
export declare const createValidator: (variables: TemplateVariable[]) => MessageValidator;
|
|
5
5
|
export type MessageValidator = (value: unknown) => ValidateResult;
|
package/dist/utils/validate.js
CHANGED
|
@@ -1,57 +1,56 @@
|
|
|
1
|
-
import { TYPE
|
|
2
|
-
import { isNumericElement
|
|
3
|
-
import { extractTemplateVariables
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
1
|
+
import { TYPE } from '@formatjs/icu-messageformat-parser';
|
|
2
|
+
import { isNumericElement, isTemporalElement } from './guards';
|
|
3
|
+
import { extractTemplateVariables } from './schema';
|
|
4
|
+
export const validateMessage = (value, variables)=>{
|
|
5
|
+
if (typeof value !== 'string') return 'Invalid value';
|
|
6
|
+
try {
|
|
7
|
+
const variableUsages = extractTemplateVariables(value);
|
|
8
|
+
for (const allowedVariable of variables){
|
|
9
|
+
const variableUsage = variableUsages.find((placeholder)=>placeholder.value === allowedVariable.value);
|
|
10
|
+
if (!variableUsage) continue;
|
|
11
|
+
if (isNumericElement(allowedVariable)) {
|
|
12
|
+
if (isNumericElement(variableUsage)) continue;
|
|
13
|
+
return `{${allowedVariable.value}} has invalid type`;
|
|
14
|
+
}
|
|
15
|
+
if (isTemporalElement(allowedVariable)) {
|
|
16
|
+
if (isTemporalElement(variableUsage)) continue;
|
|
17
|
+
return `{${allowedVariable.value}} has invalid type`;
|
|
18
|
+
}
|
|
19
|
+
switch(allowedVariable.type){
|
|
20
|
+
case TYPE.argument:
|
|
21
|
+
if (variableUsage.type === TYPE.argument) continue;
|
|
22
|
+
return `{${allowedVariable.value}} has invalid type`;
|
|
23
|
+
case TYPE.select:
|
|
24
|
+
{
|
|
25
|
+
if (variableUsage.type !== TYPE.select) return `{${allowedVariable.value}} has invalid type`;
|
|
26
|
+
const allowedOptions = Object.keys(allowedVariable.options);
|
|
27
|
+
for (const option of allowedOptions){
|
|
28
|
+
if (variableUsage.options[option]) continue;
|
|
29
|
+
return `{${allowedVariable.value}} has missing option: ${option}`;
|
|
30
|
+
}
|
|
31
|
+
const usedOptions = Object.keys(variableUsage.options);
|
|
32
|
+
for (const option of usedOptions){
|
|
33
|
+
if (allowedOptions.includes(option)) continue;
|
|
34
|
+
return `{${allowedVariable.value}} has unsupported option: ${option}`;
|
|
35
|
+
}
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
case TYPE.tag:
|
|
39
|
+
if (variableUsage.type === TYPE.tag) continue;
|
|
40
|
+
return `{${allowedVariable.value}} has invalid type`;
|
|
41
|
+
}
|
|
16
42
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
43
|
+
const supportedVariables = new Set(variables.map(({ value })=>value));
|
|
44
|
+
for (const variableUsage of variableUsages){
|
|
45
|
+
if (supportedVariables.has(variableUsage.value)) continue;
|
|
46
|
+
return `{${variableUsage.value}} is not supported`;
|
|
20
47
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
case n.select: {
|
|
26
|
-
if (t.type !== n.select)
|
|
27
|
-
return `{${e.value}} has invalid type`;
|
|
28
|
-
const s = Object.keys(e.options);
|
|
29
|
-
for (const i of s)
|
|
30
|
-
if (!t.options[i])
|
|
31
|
-
return `{${e.value}} has missing option: ${i}`;
|
|
32
|
-
const p = Object.keys(t.options);
|
|
33
|
-
for (const i of p)
|
|
34
|
-
if (!s.includes(i))
|
|
35
|
-
return `{${e.value}} has unsupported option: ${i}`;
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
case n.tag:
|
|
39
|
-
if (t.type === n.tag) continue;
|
|
40
|
-
return `{${e.value}} has invalid type`;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
48
|
+
return true;
|
|
49
|
+
} catch (error) {
|
|
50
|
+
if (!(error instanceof Error)) return false;
|
|
51
|
+
return `Invalid syntax: ${error.message}`;
|
|
43
52
|
}
|
|
44
|
-
const c = new Set(r.map(({ value: e }) => e));
|
|
45
|
-
for (const e of a)
|
|
46
|
-
if (!c.has(e.value))
|
|
47
|
-
return `{${e.value}} is not supported`;
|
|
48
|
-
return !0;
|
|
49
|
-
} catch (a) {
|
|
50
|
-
return a instanceof Error ? `Invalid syntax: ${a.message}` : !1;
|
|
51
|
-
}
|
|
52
|
-
}, g = (o) => (r) => v(r, o);
|
|
53
|
-
export {
|
|
54
|
-
g as createValidator,
|
|
55
|
-
v as validateMessage
|
|
56
53
|
};
|
|
57
|
-
|
|
54
|
+
export const createValidator = (variables)=>(value)=>validateMessage(value, variables);
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../src/utils/validate.ts"],"sourcesContent":["import { TYPE } from '@formatjs/icu-messageformat-parser';\nimport type { ValidateResult } from 'react-hook-form';\nimport type { TemplateVariable } from '@/types';\n\nimport { isNumericElement, isTemporalElement } from './guards';\nimport { extractTemplateVariables } from './schema';\n\nexport const validateMessage = (\n value: unknown,\n variables: TemplateVariable[],\n): ValidateResult => {\n if (typeof value !== 'string') return 'Invalid value';\n\n try {\n const variableUsages = extractTemplateVariables(value);\n\n for (const allowedVariable of variables) {\n const variableUsage = variableUsages.find(\n (placeholder) => placeholder.value === allowedVariable.value,\n );\n\n if (!variableUsage) continue;\n\n if (isNumericElement(allowedVariable)) {\n if (isNumericElement(variableUsage)) continue;\n return `{${allowedVariable.value}} has invalid type`;\n }\n\n if (isTemporalElement(allowedVariable)) {\n if (isTemporalElement(variableUsage)) continue;\n return `{${allowedVariable.value}} has invalid type`;\n }\n\n switch (allowedVariable.type) {\n case TYPE.argument:\n if (variableUsage.type === TYPE.argument) continue;\n return `{${allowedVariable.value}} has invalid type`;\n case TYPE.select: {\n if (variableUsage.type !== TYPE.select)\n return `{${allowedVariable.value}} has invalid type`;\n\n const allowedOptions = Object.keys(allowedVariable.options);\n for (const option of allowedOptions) {\n if (variableUsage.options[option]) continue;\n return `{${allowedVariable.value}} has missing option: ${option}`;\n }\n const usedOptions = Object.keys(variableUsage.options);\n for (const option of usedOptions) {\n if (allowedOptions.includes(option)) continue;\n return `{${allowedVariable.value}} has unsupported option: ${option}`;\n }\n continue;\n }\n case TYPE.tag:\n if (variableUsage.type === TYPE.tag) continue;\n return `{${allowedVariable.value}} has invalid type`;\n }\n }\n\n const supportedVariables = new Set(variables.map(({ value }) => value));\n\n for (const variableUsage of variableUsages) {\n if (supportedVariables.has(variableUsage.value)) continue;\n return `{${variableUsage.value}} is not supported`;\n }\n\n return true;\n } catch (error) {\n if (!(error instanceof Error)) return false;\n return `Invalid syntax: ${error.message}`;\n }\n};\n\nexport const createValidator =\n (variables: TemplateVariable[]): MessageValidator =>\n (value: unknown) =>\n validateMessage(value, variables);\n\nexport type MessageValidator = (value: unknown) => ValidateResult;\n"],"names":["TYPE","isNumericElement","isTemporalElement","extractTemplateVariables","validateMessage","value","variables","variableUsages","allowedVariable","variableUsage","find","placeholder","type","argument","select","allowedOptions","Object","keys","options","option","usedOptions","includes","tag","supportedVariables","Set","map","has","error","Error","message","createValidator"],"mappings":"AAAA,SAASA,IAAI,QAAQ,qCAAqC;AAI1D,SAASC,gBAAgB,EAAEC,iBAAiB,QAAQ,WAAW;AAC/D,SAASC,wBAAwB,QAAQ,WAAW;AAEpD,OAAO,MAAMC,kBAAkB,CAC7BC,OACAC;IAEA,IAAI,OAAOD,UAAU,UAAU,OAAO;IAEtC,IAAI;QACF,MAAME,iBAAiBJ,yBAAyBE;QAEhD,KAAK,MAAMG,mBAAmBF,UAAW;YACvC,MAAMG,gBAAgBF,eAAeG,IAAI,CACvC,CAACC,cAAgBA,YAAYN,KAAK,KAAKG,gBAAgBH,KAAK;YAG9D,IAAI,CAACI,eAAe;YAEpB,IAAIR,iBAAiBO,kBAAkB;gBACrC,IAAIP,iBAAiBQ,gBAAgB;gBACrC,OAAO,CAAC,CAAC,EAAED,gBAAgBH,KAAK,CAAC,kBAAkB,CAAC;YACtD;YAEA,IAAIH,kBAAkBM,kBAAkB;gBACtC,IAAIN,kBAAkBO,gBAAgB;gBACtC,OAAO,CAAC,CAAC,EAAED,gBAAgBH,KAAK,CAAC,kBAAkB,CAAC;YACtD;YAEA,OAAQG,gBAAgBI,IAAI;gBAC1B,KAAKZ,KAAKa,QAAQ;oBAChB,IAAIJ,cAAcG,IAAI,KAAKZ,KAAKa,QAAQ,EAAE;oBAC1C,OAAO,CAAC,CAAC,EAAEL,gBAAgBH,KAAK,CAAC,kBAAkB,CAAC;gBACtD,KAAKL,KAAKc,MAAM;oBAAE;wBAChB,IAAIL,cAAcG,IAAI,KAAKZ,KAAKc,MAAM,EACpC,OAAO,CAAC,CAAC,EAAEN,gBAAgBH,KAAK,CAAC,kBAAkB,CAAC;wBAEtD,MAAMU,iBAAiBC,OAAOC,IAAI,CAACT,gBAAgBU,OAAO;wBAC1D,KAAK,MAAMC,UAAUJ,eAAgB;4BACnC,IAAIN,cAAcS,OAAO,CAACC,OAAO,EAAE;4BACnC,OAAO,CAAC,CAAC,EAAEX,gBAAgBH,KAAK,CAAC,sBAAsB,EAAEc,QAAQ;wBACnE;wBACA,MAAMC,cAAcJ,OAAOC,IAAI,CAACR,cAAcS,OAAO;wBACrD,KAAK,MAAMC,UAAUC,YAAa;4BAChC,IAAIL,eAAeM,QAAQ,CAACF,SAAS;4BACrC,OAAO,CAAC,CAAC,EAAEX,gBAAgBH,KAAK,CAAC,0BAA0B,EAAEc,QAAQ;wBACvE;wBACA;oBACF;gBACA,KAAKnB,KAAKsB,GAAG;oBACX,IAAIb,cAAcG,IAAI,KAAKZ,KAAKsB,GAAG,EAAE;oBACrC,OAAO,CAAC,CAAC,EAAEd,gBAAgBH,KAAK,CAAC,kBAAkB,CAAC;YACxD;QACF;QAEA,MAAMkB,qBAAqB,IAAIC,IAAIlB,UAAUmB,GAAG,CAAC,CAAC,EAAEpB,KAAK,EAAE,GAAKA;QAEhE,KAAK,MAAMI,iBAAiBF,eAAgB;YAC1C,IAAIgB,mBAAmBG,GAAG,CAACjB,cAAcJ,KAAK,GAAG;YACjD,OAAO,CAAC,CAAC,EAAEI,cAAcJ,KAAK,CAAC,kBAAkB,CAAC;QACpD;QAEA,OAAO;IACT,EAAE,OAAOsB,OAAO;QACd,IAAI,CAAEA,CAAAA,iBAAiBC,KAAI,GAAI,OAAO;QACtC,OAAO,CAAC,gBAAgB,EAAED,MAAME,OAAO,EAAE;IAC3C;AACF,EAAE;AAEF,OAAO,MAAMC,kBACX,CAACxB,YACD,CAACD,QACCD,gBAAgBC,OAAOC,WAAW"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "payload-intl",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Payload Plugin for I18N using ICU Messages",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"payload",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"directory": "packages/intl"
|
|
21
21
|
},
|
|
22
22
|
"license": "MIT",
|
|
23
|
-
"author": "
|
|
23
|
+
"author": "DAVINCI CODING GmbH",
|
|
24
24
|
"type": "module",
|
|
25
25
|
"exports": {
|
|
26
26
|
".": {
|
|
@@ -33,63 +33,57 @@
|
|
|
33
33
|
"import": "./dist/exports/rsc.js",
|
|
34
34
|
"default": "./dist/exports/rsc.js"
|
|
35
35
|
},
|
|
36
|
-
"./
|
|
36
|
+
"./client": {
|
|
37
|
+
"types": "./dist/exports/client.d.ts",
|
|
38
|
+
"import": "./dist/exports/client.js",
|
|
39
|
+
"default": "./dist/exports/client.js"
|
|
40
|
+
}
|
|
37
41
|
},
|
|
38
42
|
"main": "./dist/index.js",
|
|
39
43
|
"types": "./dist/index.d.ts",
|
|
40
44
|
"files": [
|
|
41
45
|
"dist"
|
|
42
46
|
],
|
|
47
|
+
"scripts": {
|
|
48
|
+
"prebuild": "pnpm typecheck",
|
|
49
|
+
"build": "plugin-build",
|
|
50
|
+
"clean": "rm -rf dist && rm -rf node_modules",
|
|
51
|
+
"dev": "plugin-build --watch",
|
|
52
|
+
"generate:types": "generate-types",
|
|
53
|
+
"lint": "biome check .",
|
|
54
|
+
"lint:fix": "biome check --write .",
|
|
55
|
+
"test": "vitest run",
|
|
56
|
+
"test:watch": "vitest",
|
|
57
|
+
"typecheck": "tsc --noEmit"
|
|
58
|
+
},
|
|
43
59
|
"dependencies": {
|
|
44
|
-
"@floating-ui/dom": "^1.7.3",
|
|
45
60
|
"@formatjs/icu-messageformat-parser": "^2.11.2",
|
|
46
|
-
"@radix-ui/react-dropdown-menu": "^2.1.15",
|
|
47
|
-
"@radix-ui/react-hover-card": "^1.1.14",
|
|
48
|
-
"@radix-ui/react-popover": "^1.1.14",
|
|
49
|
-
"@radix-ui/react-select": "^2.2.5",
|
|
50
|
-
"@radix-ui/react-toggle-group": "^1.1.10",
|
|
51
|
-
"@radix-ui/react-toolbar": "^1.1.10",
|
|
52
61
|
"@tabler/icons-react": "^3.36.1",
|
|
53
|
-
"
|
|
54
|
-
"@tiptap/extension-document": "^3.16.0",
|
|
55
|
-
"@tiptap/extension-mention": "^3.16.0",
|
|
56
|
-
"@tiptap/extension-paragraph": "^3.16.0",
|
|
57
|
-
"@tiptap/extension-text": "^3.16.0",
|
|
58
|
-
"@tiptap/pm": "^3.16.0",
|
|
59
|
-
"@tiptap/react": "^3.16.0",
|
|
60
|
-
"@tiptap/suggestion": "^3.16.0",
|
|
61
|
-
"clsx": "^2.1.1",
|
|
62
|
+
"lexical-beautiful-mentions": "^0.1.48",
|
|
62
63
|
"lodash-es": "^4.17.21",
|
|
63
64
|
"radix-ui": "^1.4.2",
|
|
64
65
|
"react-hook-form": "^7.58.1",
|
|
65
|
-
"
|
|
66
|
-
"zod": "^4.0.14"
|
|
66
|
+
"zod": "catalog:"
|
|
67
67
|
},
|
|
68
68
|
"devDependencies": {
|
|
69
|
-
"@payloadcms/richtext-lexical": "
|
|
70
|
-
"@payloadcms/ui": "
|
|
71
|
-
"@
|
|
72
|
-
"@tailwindcss/vite": "^4.1.11",
|
|
69
|
+
"@payloadcms/richtext-lexical": "catalog:payload-stack",
|
|
70
|
+
"@payloadcms/ui": "catalog:payload-stack",
|
|
71
|
+
"@repo/common": "workspace:*",
|
|
73
72
|
"@types/lodash-es": "^4.17.12",
|
|
74
73
|
"@types/node": "^22.5.4",
|
|
75
|
-
"@types/react": "
|
|
76
|
-
"@types/react-dom": "
|
|
77
|
-
"next": "
|
|
78
|
-
"payload": "
|
|
79
|
-
"react": "
|
|
80
|
-
"react-dom": "
|
|
81
|
-
"
|
|
82
|
-
"
|
|
83
|
-
"
|
|
84
|
-
"typescript": "5.7.3",
|
|
85
|
-
"vite": "7.0.6",
|
|
86
|
-
"vite-plugin-dts": "4.5.4",
|
|
87
|
-
"vite-tsconfig-paths": "5.1.4",
|
|
88
|
-
"vitest": "^3.1.2",
|
|
89
|
-
"@repo/configs": "0.0.1"
|
|
74
|
+
"@types/react": "catalog:payload-stack",
|
|
75
|
+
"@types/react-dom": "catalog:payload-stack",
|
|
76
|
+
"next": "catalog:payload-stack",
|
|
77
|
+
"payload": "catalog:payload-stack",
|
|
78
|
+
"react": "catalog:payload-stack",
|
|
79
|
+
"react-dom": "catalog:payload-stack",
|
|
80
|
+
"typescript": "catalog:payload-stack",
|
|
81
|
+
"vite": "catalog:vite",
|
|
82
|
+
"vitest": "^3.1.2"
|
|
90
83
|
},
|
|
91
84
|
"peerDependencies": {
|
|
92
85
|
"@payloadcms/next": ">=3.72.0",
|
|
86
|
+
"@payloadcms/richtext-lexical": ">=3.72.0",
|
|
93
87
|
"@payloadcms/ui": ">=3.72.0",
|
|
94
88
|
"next": ">=15.2.3",
|
|
95
89
|
"payload": ">=3.72.0"
|
|
@@ -100,16 +94,5 @@
|
|
|
100
94
|
},
|
|
101
95
|
"publishConfig": {
|
|
102
96
|
"access": "public"
|
|
103
|
-
},
|
|
104
|
-
"scripts": {
|
|
105
|
-
"prebuild": "pnpm typecheck",
|
|
106
|
-
"build": "vite build",
|
|
107
|
-
"clean": "rm -rf dist && rm -rf node_modules",
|
|
108
|
-
"dev": "vite build --watch",
|
|
109
|
-
"lint": "biome check .",
|
|
110
|
-
"lint:fix": "biome check --write .",
|
|
111
|
-
"test": "vitest run",
|
|
112
|
-
"test:watch": "vitest",
|
|
113
|
-
"typecheck": "tsc --noEmit"
|
|
114
97
|
}
|
|
115
|
-
}
|
|
98
|
+
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { SuggestionKeyDownProps, SuggestionProps } from '@tiptap/suggestion';
|
|
2
|
-
import { VariableMentionNodeAttrs } from '../../../types';
|
|
3
|
-
export interface VariableSuggestionProps extends SuggestionProps<VariableMentionNodeAttrs, VariableMentionNodeAttrs> {
|
|
4
|
-
ref: React.RefObject<{
|
|
5
|
-
onKeyDown: (props: SuggestionKeyDownProps) => boolean;
|
|
6
|
-
}>;
|
|
7
|
-
}
|
|
8
|
-
export declare function VariableSuggestion({ items, command, ref, }: VariableSuggestionProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
-
//# sourceMappingURL=VariableSuggestion.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VariableSuggestion.d.ts","sourceRoot":"","sources":["../../../../src/components/inputs/variables/VariableSuggestion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAIxD,MAAM,WAAW,uBACf,SAAQ,eAAe,CAAC,wBAAwB,EAAE,wBAAwB,CAAC;IAC3E,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC;QACnB,SAAS,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC;KACvD,CAAC,CAAC;CACJ;AAED,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,OAAO,EACP,GAAG,GACJ,EAAE,uBAAuB,2CAiEzB"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { jsx as a } from "react/jsx-runtime";
|
|
2
|
-
import { useState as i, useEffect as f, useImperativeHandle as g } from "react";
|
|
3
|
-
import { cn as b } from "../../../utils/cn.js";
|
|
4
|
-
function x({
|
|
5
|
-
items: n,
|
|
6
|
-
command: c,
|
|
7
|
-
ref: u
|
|
8
|
-
}) {
|
|
9
|
-
const [r, o] = i(0), l = (e) => {
|
|
10
|
-
const t = n[e];
|
|
11
|
-
t && c(t);
|
|
12
|
-
}, d = () => {
|
|
13
|
-
o((r + n.length - 1) % n.length);
|
|
14
|
-
}, p = () => {
|
|
15
|
-
o((r + 1) % n.length);
|
|
16
|
-
}, s = () => {
|
|
17
|
-
l(r);
|
|
18
|
-
};
|
|
19
|
-
return f(() => o(0), [n]), g(u, () => ({
|
|
20
|
-
onKeyDown: ({ event: e }) => e.key === "ArrowUp" ? (d(), !0) : e.key === "ArrowDown" ? (p(), !0) : e.key === "Enter" ? (s(), !0) : !1
|
|
21
|
-
})), /* @__PURE__ */ a("div", { className: "flex flex-col overflow-clip rounded-md bg-elevation-100 empty:hidden", children: n.map((e, t) => /* @__PURE__ */ a(
|
|
22
|
-
"button",
|
|
23
|
-
{
|
|
24
|
-
className: b(
|
|
25
|
-
"cursor-pointer text-nowrap rounded-none border-none bg-transparent px-3 py-1 text-lg",
|
|
26
|
-
{
|
|
27
|
-
"bg-elevation-800 text-elevation-0": t === r,
|
|
28
|
-
"hover:bg-elevation-250": t !== r
|
|
29
|
-
}
|
|
30
|
-
),
|
|
31
|
-
onClick: () => l(t),
|
|
32
|
-
type: "button",
|
|
33
|
-
children: e.label
|
|
34
|
-
},
|
|
35
|
-
t
|
|
36
|
-
)) });
|
|
37
|
-
}
|
|
38
|
-
export {
|
|
39
|
-
x as VariableSuggestion
|
|
40
|
-
};
|
|
41
|
-
//# sourceMappingURL=VariableSuggestion.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VariableSuggestion.js","sources":["../../../../src/components/inputs/variables/VariableSuggestion.tsx"],"sourcesContent":["import type {\n SuggestionKeyDownProps,\n SuggestionProps,\n} from '@tiptap/suggestion';\nimport { useEffect, useImperativeHandle, useState } from 'react';\nimport type { VariableMentionNodeAttrs } from '@/types';\n\nimport { cn } from '@/utils/cn';\n\nexport interface VariableSuggestionProps\n extends SuggestionProps<VariableMentionNodeAttrs, VariableMentionNodeAttrs> {\n ref: React.RefObject<{\n onKeyDown: (props: SuggestionKeyDownProps) => boolean;\n }>;\n}\n\nexport function VariableSuggestion({\n items,\n command,\n ref,\n}: VariableSuggestionProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const selectItem = (index: number) => {\n const item = items[index];\n\n if (item) command(item);\n };\n\n const upHandler = () => {\n setSelectedIndex((selectedIndex + items.length - 1) % items.length);\n };\n\n const downHandler = () => {\n setSelectedIndex((selectedIndex + 1) % items.length);\n };\n\n const enterHandler = () => {\n selectItem(selectedIndex);\n };\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: <explanation>\n useEffect(() => setSelectedIndex(0), [items]);\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }) => {\n if (event.key === 'ArrowUp') {\n upHandler();\n return true;\n }\n\n if (event.key === 'ArrowDown') {\n downHandler();\n return true;\n }\n\n if (event.key === 'Enter') {\n enterHandler();\n return true;\n }\n\n return false;\n },\n }));\n\n return (\n <div className=\"flex flex-col overflow-clip rounded-md bg-elevation-100 empty:hidden\">\n {items.map((item, index) => (\n <button\n className={cn(\n 'cursor-pointer text-nowrap rounded-none border-none bg-transparent px-3 py-1 text-lg',\n {\n 'bg-elevation-800 text-elevation-0': index === selectedIndex,\n 'hover:bg-elevation-250': index !== selectedIndex,\n },\n )}\n key={index}\n onClick={() => selectItem(index)}\n type=\"button\"\n >\n {item.label}\n </button>\n ))}\n </div>\n );\n}\n"],"names":["VariableSuggestion","items","command","ref","selectedIndex","setSelectedIndex","useState","selectItem","index","item","upHandler","downHandler","enterHandler","useEffect","useImperativeHandle","event","jsx","cn"],"mappings":";;;AAgBO,SAASA,EAAmB;AAAA,EACjC,OAAAC;AAAA,EACA,SAAAC;AAAA,EACA,KAAAC;AACF,GAA4B;AAC1B,QAAM,CAACC,GAAeC,CAAgB,IAAIC,EAAS,CAAC,GAE9CC,IAAa,CAACC,MAAkB;AACpC,UAAMC,IAAOR,EAAMO,CAAK;AAExB,IAAIC,OAAcA,CAAI;AAAA,EACxB,GAEMC,IAAY,MAAM;AACtB,IAAAL,GAAkBD,IAAgBH,EAAM,SAAS,KAAKA,EAAM,MAAM;AAAA,EACpE,GAEMU,IAAc,MAAM;AACxB,IAAAN,GAAkBD,IAAgB,KAAKH,EAAM,MAAM;AAAA,EACrD,GAEMW,IAAe,MAAM;AACzB,IAAAL,EAAWH,CAAa;AAAA,EAC1B;AAGA,SAAAS,EAAU,MAAMR,EAAiB,CAAC,GAAG,CAACJ,CAAK,CAAC,GAE5Ca,EAAoBX,GAAK,OAAO;AAAA,IAC9B,WAAW,CAAC,EAAE,OAAAY,QACRA,EAAM,QAAQ,aAChBL,EAAA,GACO,MAGLK,EAAM,QAAQ,eAChBJ,EAAA,GACO,MAGLI,EAAM,QAAQ,WAChBH,EAAA,GACO,MAGF;AAAA,EACT,EACA,GAGA,gBAAAI,EAAC,SAAI,WAAU,wEACZ,YAAM,IAAI,CAACP,GAAMD,MAChB,gBAAAQ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACA;AAAA,UACE,qCAAqCT,MAAUJ;AAAA,UAC/C,0BAA0BI,MAAUJ;AAAA,QAAA;AAAA,MACtC;AAAA,MAGF,SAAS,MAAMG,EAAWC,CAAK;AAAA,MAC/B,MAAK;AAAA,MAEJ,UAAAC,EAAK;AAAA,IAAA;AAAA,IAJDD;AAAA,EAAA,CAMR,GACH;AAEJ;"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { MentionOptions } from '@tiptap/extension-mention';
|
|
2
|
-
import { TemplateVariable, VariableMentionNodeAttrs } from '../../../types';
|
|
3
|
-
export declare function VariableMention(variables: TemplateVariable[]): import('@tiptap/core').Node<MentionOptions<VariableMentionNodeAttrs, VariableMentionNodeAttrs>, any>;
|
|
4
|
-
//# sourceMappingURL=extension.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../../src/components/inputs/variables/extension.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAShE,OAAO,KAAK,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAS1E,wBAAgB,eAAe,CAAC,SAAS,EAAE,gBAAgB,EAAE,wGA6B5D"}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { computePosition as f, shift as c, flip as p } from "@floating-ui/dom";
|
|
2
|
-
import y from "@tiptap/extension-mention";
|
|
3
|
-
import { ReactNodeViewRenderer as g, ReactRenderer as b, posToDOMRect as w } from "@tiptap/react";
|
|
4
|
-
import { formatVariableLabel as R } from "../../../utils/format.js";
|
|
5
|
-
import { isTagElement as s } from "@formatjs/icu-messageformat-parser";
|
|
6
|
-
import { serializeICUMessage as h } from "../../../utils/icu-tranform.js";
|
|
7
|
-
import { VariableChip as v } from "./VariableChip.js";
|
|
8
|
-
import { VariableSuggestion as x } from "./VariableSuggestion.js";
|
|
9
|
-
function S(r) {
|
|
10
|
-
return y.extend({
|
|
11
|
-
name: "variable",
|
|
12
|
-
addNodeView: () => g(v),
|
|
13
|
-
addAttributes: () => ({
|
|
14
|
-
name: { default: null },
|
|
15
|
-
icu: { default: null },
|
|
16
|
-
label: { default: null }
|
|
17
|
-
}),
|
|
18
|
-
renderText: ({ node: n }) => n.attrs.icu
|
|
19
|
-
}).configure({
|
|
20
|
-
HTMLAttributes: {
|
|
21
|
-
class: "variable"
|
|
22
|
-
},
|
|
23
|
-
suggestions: [
|
|
24
|
-
l("@", r),
|
|
25
|
-
l(
|
|
26
|
-
"{",
|
|
27
|
-
r.filter((n) => !s(n))
|
|
28
|
-
),
|
|
29
|
-
l(
|
|
30
|
-
"<",
|
|
31
|
-
r.filter((n) => s(n))
|
|
32
|
-
)
|
|
33
|
-
]
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
function l(r, n) {
|
|
37
|
-
const m = n.map((e) => ({
|
|
38
|
-
name: e.value,
|
|
39
|
-
label: R(e),
|
|
40
|
-
icu: h([e])
|
|
41
|
-
}));
|
|
42
|
-
function a(e, o) {
|
|
43
|
-
f({
|
|
44
|
-
getBoundingClientRect: () => w(
|
|
45
|
-
e.view,
|
|
46
|
-
e.state.selection.from,
|
|
47
|
-
e.state.selection.to
|
|
48
|
-
)
|
|
49
|
-
}, o, {
|
|
50
|
-
placement: "bottom-start",
|
|
51
|
-
strategy: "absolute",
|
|
52
|
-
middleware: [c(), p()]
|
|
53
|
-
}).then(({ x: i, y: u, strategy: d }) => {
|
|
54
|
-
o.style.width = "max-content", o.style.position = d, o.style.left = `${i}px`, o.style.top = `${u}px`;
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
return {
|
|
58
|
-
char: r,
|
|
59
|
-
items: ({ query: e }) => m.filter(
|
|
60
|
-
(o) => o.name.toLowerCase().startsWith(e.toLowerCase())
|
|
61
|
-
),
|
|
62
|
-
render: () => {
|
|
63
|
-
let e;
|
|
64
|
-
const o = document.getElementById(
|
|
65
|
-
"messages-form-content"
|
|
66
|
-
);
|
|
67
|
-
return {
|
|
68
|
-
onStart: (t) => {
|
|
69
|
-
if (e = new b(x, {
|
|
70
|
-
props: t,
|
|
71
|
-
editor: t.editor
|
|
72
|
-
}), !t.clientRect) return;
|
|
73
|
-
o.style.overflow = "hidden";
|
|
74
|
-
const i = e.element;
|
|
75
|
-
i.style.position = "absolute", document.body.appendChild(i), a(t.editor, i);
|
|
76
|
-
},
|
|
77
|
-
onUpdate(t) {
|
|
78
|
-
e.updateProps(t), t.clientRect && a(t.editor, e.element);
|
|
79
|
-
},
|
|
80
|
-
onKeyDown(t) {
|
|
81
|
-
return t.event.key === "Escape" ? (e.destroy(), !0) : e.ref ? e.ref.onKeyDown(t) : !1;
|
|
82
|
-
},
|
|
83
|
-
onExit() {
|
|
84
|
-
e.element.remove(), e.destroy(), o.style.overflow = "";
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
export {
|
|
91
|
-
S as VariableMention
|
|
92
|
-
};
|
|
93
|
-
//# sourceMappingURL=extension.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extension.js","sources":["../../../../src/components/inputs/variables/extension.ts"],"sourcesContent":["import type { VirtualElement } from '@floating-ui/dom';\nimport { computePosition, flip, shift } from '@floating-ui/dom';\nimport type { MentionOptions } from '@tiptap/extension-mention';\nimport Mention from '@tiptap/extension-mention';\nimport type { Attribute, Editor } from '@tiptap/react';\nimport {\n posToDOMRect,\n ReactNodeViewRenderer,\n ReactRenderer,\n} from '@tiptap/react';\nimport type { SuggestionKeyDownProps } from '@tiptap/suggestion';\nimport type { TemplateVariable, VariableMentionNodeAttrs } from '@/types';\n\nimport { formatVariableLabel } from '@/utils/format';\nimport { isTagElement, isTemporalElement } from '@/utils/guards';\nimport { serializeICUMessage } from '@/utils/icu-tranform';\nimport { VariableChip } from './VariableChip';\nimport type { VariableSuggestionProps } from './VariableSuggestion';\nimport { VariableSuggestion } from './VariableSuggestion';\n\nexport function VariableMention(variables: TemplateVariable[]) {\n return Mention.extend<\n MentionOptions<VariableMentionNodeAttrs, VariableMentionNodeAttrs>\n >({\n name: 'variable',\n addNodeView: () => ReactNodeViewRenderer(VariableChip),\n addAttributes: () =>\n ({\n name: { default: null },\n icu: { default: null },\n label: { default: null },\n }) satisfies Record<keyof VariableMentionNodeAttrs, Attribute>,\n renderText: ({ node }) => node.attrs.icu,\n }).configure({\n HTMLAttributes: {\n class: 'variable',\n },\n suggestions: [\n createSuggestion('@', variables),\n createSuggestion(\n '{',\n variables.filter((variable) => !isTagElement(variable)),\n ),\n createSuggestion(\n '<',\n variables.filter((variable) => isTagElement(variable)),\n ),\n ],\n });\n}\n\nfunction createSuggestion(\n char: string,\n variables: TemplateVariable[],\n): MentionOptions<\n VariableMentionNodeAttrs,\n VariableMentionNodeAttrs\n>['suggestion'] {\n const items = variables.map((variable) => ({\n name: variable.value,\n label: formatVariableLabel(variable),\n icu: serializeICUMessage([variable]),\n }));\n\n function updatePosition(editor: Editor, element: HTMLElement): void {\n const virtualElement: VirtualElement = {\n getBoundingClientRect: () =>\n posToDOMRect(\n editor.view,\n editor.state.selection.from,\n editor.state.selection.to,\n ),\n };\n\n void computePosition(virtualElement, element, {\n placement: 'bottom-start',\n strategy: 'absolute',\n middleware: [shift(), flip()],\n }).then(({ x, y, strategy }) => {\n element.style.width = 'max-content';\n element.style.position = strategy;\n element.style.left = `${x}px`;\n element.style.top = `${y}px`;\n });\n }\n\n return {\n char,\n items: ({ query }) =>\n items.filter((item) =>\n item.name.toLowerCase().startsWith(query.toLowerCase()),\n ),\n render: () => {\n let component: ReactRenderer<\n { onKeyDown(props: SuggestionKeyDownProps): boolean },\n VariableSuggestionProps\n >;\n\n const scrollableElement = document.getElementById(\n 'messages-form-content',\n );\n\n return {\n onStart: (props) => {\n component = new ReactRenderer<\n { onKeyDown(props: SuggestionKeyDownProps): boolean },\n VariableSuggestionProps\n >(VariableSuggestion, {\n props,\n editor: props.editor,\n });\n\n if (!props.clientRect) return;\n\n scrollableElement!.style.overflow = 'hidden';\n\n const element = component.element;\n element.style.position = 'absolute';\n document.body.appendChild(element);\n\n updatePosition(props.editor, element);\n },\n\n onUpdate(props) {\n component.updateProps(props);\n\n if (!props.clientRect) return;\n\n updatePosition(props.editor, component.element);\n },\n\n onKeyDown(props) {\n if (props.event.key === 'Escape') {\n component.destroy();\n return true;\n }\n if (!component.ref) return false;\n\n return component.ref.onKeyDown(props);\n },\n\n onExit() {\n component.element.remove();\n component.destroy();\n scrollableElement!.style.overflow = '';\n },\n };\n },\n };\n}\n"],"names":["VariableMention","variables","Mention","ReactNodeViewRenderer","VariableChip","node","createSuggestion","variable","isTagElement","char","items","formatVariableLabel","serializeICUMessage","updatePosition","editor","element","computePosition","posToDOMRect","shift","flip","x","y","strategy","query","item","component","scrollableElement","props","ReactRenderer","VariableSuggestion"],"mappings":"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"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { UseFormReturn } from 'react-hook-form';
|
|
2
|
-
import { Locales, Messages, Translations } from '../types';
|
|
3
|
-
export type FormValues = Translations<Messages>;
|
|
4
|
-
interface MessagesFormProviderProps {
|
|
5
|
-
locales: Locales;
|
|
6
|
-
form: UseFormReturn<FormValues>;
|
|
7
|
-
}
|
|
8
|
-
export declare function MessagesFormProvider({ locales, form, children, }: React.PropsWithChildren<MessagesFormProviderProps>): import("react/jsx-runtime").JSX.Element;
|
|
9
|
-
export declare const useMessagesForm: () => {
|
|
10
|
-
watch: import('react-hook-form').UseFormWatch<FormValues>;
|
|
11
|
-
getValues: import('react-hook-form').UseFormGetValues<FormValues>;
|
|
12
|
-
getFieldState: import('react-hook-form').UseFormGetFieldState<FormValues>;
|
|
13
|
-
setError: import('react-hook-form').UseFormSetError<FormValues>;
|
|
14
|
-
clearErrors: import('react-hook-form').UseFormClearErrors<FormValues>;
|
|
15
|
-
setValue: import('react-hook-form').UseFormSetValue<FormValues>;
|
|
16
|
-
trigger: import('react-hook-form').UseFormTrigger<FormValues>;
|
|
17
|
-
formState: import('react-hook-form').FormState<FormValues>;
|
|
18
|
-
resetField: import('react-hook-form').UseFormResetField<FormValues>;
|
|
19
|
-
reset: import('react-hook-form').UseFormReset<FormValues>;
|
|
20
|
-
handleSubmit: import('react-hook-form').UseFormHandleSubmit<FormValues, FormValues>;
|
|
21
|
-
unregister: import('react-hook-form').UseFormUnregister<FormValues>;
|
|
22
|
-
control: import('react-hook-form').Control<FormValues, any, FormValues>;
|
|
23
|
-
register: import('react-hook-form').UseFormRegister<FormValues>;
|
|
24
|
-
setFocus: import('react-hook-form').UseFormSetFocus<FormValues>;
|
|
25
|
-
subscribe: import('react-hook-form').UseFormSubscribe<FormValues>;
|
|
26
|
-
locales: Locales;
|
|
27
|
-
};
|
|
28
|
-
export {};
|
|
29
|
-
//# sourceMappingURL=messages-form.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|