sanity-plugin-internationalized-array 2.0.0 → 2.0.1-canary.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.d.mts CHANGED
@@ -136,7 +136,7 @@ export declare type PluginConfig = {
136
136
 
137
137
  export declare type Value = {
138
138
  _key: string
139
- value?: string
139
+ value?: unknown
140
140
  }
141
141
 
142
142
  export {}
package/lib/index.d.ts CHANGED
@@ -136,7 +136,7 @@ export declare type PluginConfig = {
136
136
 
137
137
  export declare type Value = {
138
138
  _key: string
139
- value?: string
139
+ value?: unknown
140
140
  }
141
141
 
142
142
  export {}
package/lib/index.esm.js CHANGED
@@ -1,15 +1,15 @@
1
1
  import * as suspend from "suspend-react";
2
2
  import { suspend as suspend$1 } from "suspend-react";
3
3
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
4
- import { isSanityDocument, setIfMissing, insert, PatchEvent, useClient, useWorkspace, useFormBuilder, defineDocumentFieldAction, useFormValue, set, ArrayOfObjectsItem, MemberItemError, defineField, unset, isDocumentSchemaType, definePlugin, isObjectInputProps } from "sanity";
4
+ import { isSanityDocument, setIfMissing, insert, PatchEvent, useClient, useWorkspace, defineDocumentFieldAction, useFormValue, set, ArrayOfObjectsItem, MemberItemError, defineField, unset, isDocumentSchemaType, definePlugin, isObjectInputProps } from "sanity";
5
5
  import { useLanguageFilterStudioContext } from "@sanity/language-filter";
6
6
  import { Grid, Button, useToast, Stack, Box, Text, Card, Code, Label, MenuButton, Menu, MenuItem, Flex, Spinner } from "@sanity/ui";
7
7
  import equal from "fast-deep-equal";
8
- import { useMemo, useCallback, createContext, useContext, useDeferredValue, memo, useRef, useEffect, createElement } from "react";
8
+ import { memo, useCallback, createContext, useContext, useDeferredValue, useMemo, useRef, useEffect, createElement } from "react";
9
9
  import { useDocumentPane } from "sanity/structure";
10
10
  import { AddIcon, TranslateIcon, RemoveCircleIcon } from "@sanity/icons";
11
11
  import get from "lodash/get.js";
12
- const namespace = "sanity-plugin-internationalized-array", version = "v0", preload = (fn) => suspend.preload(() => fn(), [version, namespace]), clear = () => suspend.clear([version, namespace]), peek = (selectedValue) => suspend.peek([version, namespace, selectedValue]), MAX_COLUMNS = 7, CONFIG_DEFAULT = {
12
+ const namespace = "sanity-plugin-internationalized-array", version = "v1", preload = (fn) => suspend.preload(() => fn(), [version, namespace]), clear = () => suspend.clear([version, namespace]), peek = (selectedValue) => suspend.peek([version, namespace, selectedValue]), MAX_COLUMNS = 7, CONFIG_DEFAULT = {
13
13
  languages: [],
14
14
  select: {},
15
15
  defaultLanguages: [],
@@ -17,10 +17,35 @@ const namespace = "sanity-plugin-internationalized-array", version = "v0", prelo
17
17
  apiVersion: "2022-11-27",
18
18
  buttonLocations: ["field"],
19
19
  buttonAddAll: !0
20
+ }, getDocumentsToTranslate = (value, rootPath = []) => {
21
+ if (Array.isArray(value)) {
22
+ const arrayRootPath = [...rootPath], internationalizedValues = value.filter((item) => {
23
+ if (Array.isArray(item)) return !1;
24
+ if (typeof item == "object") {
25
+ const type = item?._type;
26
+ return type?.startsWith("internationalizedArray") && type?.endsWith("Value");
27
+ }
28
+ return !1;
29
+ });
30
+ return internationalizedValues.length > 0 ? internationalizedValues.map((internationalizedValue) => ({
31
+ ...internationalizedValue,
32
+ path: arrayRootPath,
33
+ pathString: arrayRootPath.join(".")
34
+ })) : value.length > 0 ? value.map(
35
+ (item, index) => getDocumentsToTranslate(item, [...arrayRootPath, index])
36
+ ).flat() : [];
37
+ }
38
+ if (typeof value == "object" && value) {
39
+ const startsWithUnderscoreRegex = /^_/;
40
+ return Object.keys(value).filter(
41
+ (key) => !key.match(startsWithUnderscoreRegex)
42
+ ).map((item) => {
43
+ const selectedValue = value[item], path = [...rootPath, item];
44
+ return getDocumentsToTranslate(selectedValue, path);
45
+ }).flat();
46
+ }
47
+ return [];
20
48
  };
21
- function createValueSchemaTypeName(schemaType) {
22
- return `${schemaType.name}Value`;
23
- }
24
49
  function AddButtons(props) {
25
50
  const { languages, readOnly, value, onClick } = props;
26
51
  return languages.length > 0 ? /* @__PURE__ */ jsx(Grid, { columns: Math.min(languages.length, MAX_COLUMNS), gap: 2, children: languages.map((language) => /* @__PURE__ */ jsx(
@@ -29,7 +54,7 @@ function AddButtons(props) {
29
54
  tone: "primary",
30
55
  mode: "ghost",
31
56
  fontSize: 1,
32
- disabled: readOnly || !!(value != null && value.find((item) => item._key === language.id)),
57
+ disabled: readOnly || !!value?.find((item) => item._key === language.id),
33
58
  text: language.id.toUpperCase(),
34
59
  icon: languages.length > MAX_COLUMNS ? void 0 : AddIcon,
35
60
  value: language.id,
@@ -38,14 +63,10 @@ function AddButtons(props) {
38
63
  language.id
39
64
  )) }) : null;
40
65
  }
66
+ var AddButtons$1 = memo(AddButtons);
41
67
  function DocumentAddButtons(props) {
42
- const { filteredLanguages } = useInternationalizedArrayContext(), { fields } = props.schemaType, value = isSanityDocument(props.value) ? props.value : void 0, toast = useToast(), { onChange } = useDocumentPane(), internationalizedArrayFields = useMemo(
43
- () => fields.filter(
44
- (field) => field.type.name.startsWith("internationalizedArray")
45
- ),
46
- [fields]
47
- ), handleDocumentButtonClick = useCallback(
48
- (event) => {
68
+ const { filteredLanguages } = useInternationalizedArrayContext(), value = isSanityDocument(props.value) ? props.value : void 0, toast = useToast(), { onChange } = useDocumentPane(), documentsToTranslation = getDocumentsToTranslate(value, []), handleDocumentButtonClick = useCallback(
69
+ async (event) => {
49
70
  const languageId = event.currentTarget.value;
50
71
  if (!languageId) {
51
72
  toast.push({
@@ -54,42 +75,43 @@ function DocumentAddButtons(props) {
54
75
  });
55
76
  return;
56
77
  }
57
- if (internationalizedArrayFields.length === 0) {
78
+ const alreadyTranslated = documentsToTranslation.filter(
79
+ (translation) => translation?._key === languageId
80
+ ), removeDuplicates = documentsToTranslation.reduce((filteredTranslations, translation) => alreadyTranslated.filter(
81
+ (alreadyTranslation) => alreadyTranslation.pathString === translation.pathString
82
+ ).length > 0 || filteredTranslations.filter(
83
+ (filteredTranslation) => filteredTranslation.path === translation.path
84
+ ).length > 0 ? filteredTranslations : [...filteredTranslations, translation], []);
85
+ if (removeDuplicates.length === 0) {
58
86
  toast.push({
59
87
  status: "error",
60
88
  title: "No internationalizedArray fields found in document root"
61
89
  });
62
90
  return;
63
91
  }
64
- const patches = internationalizedArrayFields.filter(
65
- (field) => {
66
- const fieldValue = value == null ? void 0 : value[field.name];
67
- return !(fieldValue && Array.isArray(fieldValue) && fieldValue.find((v) => v._key === languageId));
68
- }
69
- ).map((field) => {
70
- const fieldKey = field.name;
71
- return [
72
- setIfMissing([], [fieldKey]),
73
- insert(
74
- [
75
- {
76
- _key: languageId,
77
- _type: createValueSchemaTypeName(field.type)
78
- }
79
- ],
80
- "after",
81
- [fieldKey, -1]
82
- )
83
- ];
84
- }).flat();
85
- onChange(PatchEvent.from(patches));
92
+ const patches = [];
93
+ for (const toTranslate of removeDuplicates) {
94
+ const path = toTranslate.path, ifMissing = setIfMissing([], path), insertValue = insert(
95
+ [
96
+ {
97
+ _key: languageId,
98
+ _type: toTranslate._type,
99
+ value: void 0
100
+ }
101
+ ],
102
+ "after",
103
+ [...path, -1]
104
+ );
105
+ patches.push(ifMissing), patches.push(insertValue);
106
+ }
107
+ onChange(PatchEvent.from(patches.flat()));
86
108
  },
87
- [internationalizedArrayFields, onChange, toast, value]
109
+ [documentsToTranslation, onChange, toast]
88
110
  );
89
111
  return /* @__PURE__ */ jsxs(Stack, { space: 3, children: [
90
112
  /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { size: 1, weight: "semibold", children: "Add translation to internationalized fields" }) }),
91
113
  /* @__PURE__ */ jsx(
92
- AddButtons,
114
+ AddButtons$1,
93
115
  {
94
116
  languages: filteredLanguages,
95
117
  readOnly: !1,
@@ -106,7 +128,7 @@ const getSelectedValue = (select, document) => {
106
128
  for (const [key, path] of Object.entries(selection)) {
107
129
  let value = get(document, path);
108
130
  Array.isArray(value) && (value = value.filter(
109
- (item) => typeof item == "object" ? (item == null ? void 0 : item._type) === "reference" && "_ref" in item : !0
131
+ (item) => typeof item == "object" ? item?._type === "reference" && "_ref" in item : !0
110
132
  )), selectedValue[key] = value;
111
133
  }
112
134
  return selectedValue;
@@ -119,7 +141,7 @@ function useInternationalizedArrayContext() {
119
141
  return useContext(InternationalizedArrayContext);
120
142
  }
121
143
  function InternationalizedArrayProvider(props) {
122
- const { internationalizedArray: internationalizedArray2 } = props, client = useClient({ apiVersion: internationalizedArray2.apiVersion }), workspace = useWorkspace(), { value: document } = useFormBuilder(), deferredDocument = useDeferredValue(document), selectedValue = useMemo(
144
+ const { internationalizedArray: internationalizedArray2 } = props, client = useClient({ apiVersion: internationalizedArray2.apiVersion }), workspace = useWorkspace(), { formState } = useDocumentPane(), deferredDocument = useDeferredValue(formState?.value), selectedValue = useMemo(
123
145
  () => getSelectedValue(internationalizedArray2.select, deferredDocument),
124
146
  [internationalizedArray2.select, deferredDocument]
125
147
  ), languages = Array.isArray(internationalizedArray2.languages) ? internationalizedArray2.languages : suspend$1(
@@ -132,27 +154,14 @@ function InternationalizedArrayProvider(props) {
132
154
  return typeof documentType == "string" && languageFilterOptions.documentTypes.includes(documentType) ? languages.filter(
133
155
  (language) => selectedLanguageIds.includes(language.id)
134
156
  ) : languages;
135
- }, [deferredDocument, languageFilterOptions, languages, selectedLanguageIds]), showDocumentButtons = internationalizedArray2.buttonLocations.includes("document");
136
- return /* @__PURE__ */ jsx(
137
- InternationalizedArrayContext.Provider,
138
- {
139
- value: {
140
- ...internationalizedArray2,
141
- languages,
142
- filteredLanguages
143
- },
144
- children: showDocumentButtons ? /* @__PURE__ */ jsxs(Stack, { space: 5, children: [
145
- /* @__PURE__ */ jsx(
146
- DocumentAddButtons,
147
- {
148
- schemaType: props.schemaType,
149
- value: props.value
150
- }
151
- ),
152
- props.renderDefault(props)
153
- ] }) : props.renderDefault(props)
154
- }
157
+ }, [deferredDocument, languageFilterOptions, languages, selectedLanguageIds]), showDocumentButtons = internationalizedArray2.buttonLocations.includes("document"), context = useMemo(
158
+ () => ({ ...internationalizedArray2, languages, filteredLanguages }),
159
+ [filteredLanguages, internationalizedArray2, languages]
155
160
  );
161
+ return /* @__PURE__ */ jsx(InternationalizedArrayContext.Provider, { value: context, children: showDocumentButtons ? /* @__PURE__ */ jsxs(Stack, { space: 5, children: [
162
+ /* @__PURE__ */ jsx(DocumentAddButtons, { value: props.value }),
163
+ props.renderDefault(props)
164
+ ] }) : props.renderDefault(props) });
156
165
  }
157
166
  var Preload = memo(function(props) {
158
167
  const client = useClient({ apiVersion: props.apiVersion });
@@ -165,7 +174,10 @@ function checkAllLanguagesArePresent(languages, value) {
165
174
  return languagesInUseIds.length === filteredLanguageIds.length && languagesInUseIds.every((l) => filteredLanguageIds.includes(l));
166
175
  }
167
176
  function createAddAllTitle(value, languages) {
168
- return value != null && value.length ? `Add missing ${languages.length - value.length === 1 ? "language" : "languages"}` : languages.length === 1 ? `Add ${languages[0].title} Field` : "Add all languages";
177
+ return value?.length ? `Add missing ${languages.length - value.length === 1 ? "language" : "languages"}` : languages.length === 1 ? `Add ${languages[0].title} Field` : "Add all languages";
178
+ }
179
+ function createValueSchemaTypeName(schemaType) {
180
+ return `${schemaType.name}Value`;
169
181
  }
170
182
  function createAddLanguagePatches(config) {
171
183
  const {
@@ -175,15 +187,15 @@ function createAddLanguagePatches(config) {
175
187
  filteredLanguages,
176
188
  value,
177
189
  path = []
178
- } = config, itemBase = { _type: createValueSchemaTypeName(schemaType) }, newItems = Array.isArray(addLanguageKeys) && addLanguageKeys.length > 0 ? (
179
- // Just one for this language
180
- addLanguageKeys.map((id) => ({ ...itemBase, _key: id }))
181
- ) : (
182
- // Or one for every missing language
183
- filteredLanguages.filter(
184
- (language) => value != null && value.length ? !value.find((v) => v._key === language.id) : !0
185
- ).map((language) => ({ ...itemBase, _key: language.id }))
186
- ), languagesInUse = value != null && value.length ? value.map((v) => v) : [];
190
+ } = config, itemBase = { _type: createValueSchemaTypeName(schemaType) }, newItems = Array.isArray(addLanguageKeys) && addLanguageKeys.length > 0 ? addLanguageKeys.map((id) => ({
191
+ ...itemBase,
192
+ _key: id
193
+ })) : filteredLanguages.filter(
194
+ (language) => value?.length ? !value.find((v) => v._key === language.id) : !0
195
+ ).map((language) => ({
196
+ ...itemBase,
197
+ _key: language.id
198
+ })), languagesInUse = value?.length ? value.map((v) => v) : [];
187
199
  return newItems.map((item) => {
188
200
  const languageIndex = languages.findIndex((l) => item._key === l.id), remainingLanguages = languages.slice(languageIndex + 1), nextLanguageIndex = languagesInUse.findIndex(
189
201
  (l) => (
@@ -201,7 +213,7 @@ function createAddLanguagePatches(config) {
201
213
  });
202
214
  }
203
215
  const createTranslateFieldActions = (fieldActionProps, { languages, filteredLanguages }) => languages.map((language) => {
204
- const value = useFormValue(fieldActionProps.path), disabled = value && Array.isArray(value) ? !!(value != null && value.find((item) => item._key === language.id)) : !1, hidden = !filteredLanguages.some((f) => f.id === language.id), { onChange } = useDocumentPane(), onAction = useCallback(() => {
216
+ const value = useFormValue(fieldActionProps.path), disabled = value && Array.isArray(value) ? !!value?.find((item) => item._key === language.id) : !1, hidden = !filteredLanguages.some((f) => f.id === language.id), { onChange } = useDocumentPane(), onAction = useCallback(() => {
205
217
  const { schemaType, path } = fieldActionProps, addLanguageKeys = [language.id], patches = createAddLanguagePatches({
206
218
  addLanguageKeys,
207
219
  schemaType,
@@ -243,8 +255,7 @@ const createTranslateFieldActions = (fieldActionProps, { languages, filteredLang
243
255
  }, internationalizedArrayFieldAction = defineDocumentFieldAction({
244
256
  name: "internationalizedArray",
245
257
  useAction(fieldActionProps) {
246
- var _a, _b;
247
- const isInternationalizedArrayField = (_b = (_a = fieldActionProps == null ? void 0 : fieldActionProps.schemaType) == null ? void 0 : _a.type) == null ? void 0 : _b.name.startsWith(
258
+ const isInternationalizedArrayField = fieldActionProps?.schemaType?.type?.name.startsWith(
248
259
  "internationalizedArray"
249
260
  ), { languages, filteredLanguages } = useInternationalizedArrayContext(), translateFieldActions = createTranslateFieldActions(
250
261
  fieldActionProps,
@@ -320,11 +331,10 @@ function InternationalizedArray(props) {
320
331
  }) : members,
321
332
  [languageFilterEnabled, members, languageFilterOptions, selectedLanguageIds]
322
333
  ), handleAddLanguage = useCallback(
323
- (param) => {
324
- var _a;
325
- if (!(filteredLanguages != null && filteredLanguages.length))
334
+ async (param) => {
335
+ if (!filteredLanguages?.length)
326
336
  return;
327
- const addLanguageKeys = Array.isArray(param) ? param : [(_a = param == null ? void 0 : param.currentTarget) == null ? void 0 : _a.value].filter(Boolean), patches = createAddLanguagePatches({
337
+ const addLanguageKeys = Array.isArray(param) ? param : [param?.currentTarget?.value].filter(Boolean), patches = createAddLanguagePatches({
328
338
  addLanguageKeys,
329
339
  schemaType,
330
340
  languages,
@@ -342,23 +352,23 @@ function InternationalizedArray(props) {
342
352
  };
343
353
  }, [defaultLanguages, documentCreatedAt, handleAddLanguage, value]);
344
354
  const handleRestoreOrder = useCallback(() => {
345
- if (!(value != null && value.length) || !(languages != null && languages.length))
355
+ if (!value?.length || !languages?.length)
346
356
  return;
347
357
  const updatedValue = value.reduce((acc, v) => {
348
- const newIndex = languages.findIndex((l) => l.id === (v == null ? void 0 : v._key));
358
+ const newIndex = languages.findIndex((l) => l.id === v?._key);
349
359
  return newIndex > -1 && (acc[newIndex] = v), acc;
350
360
  }, []).filter(Boolean);
351
- (value == null ? void 0 : value.length) !== updatedValue.length && toast.push({
361
+ value?.length !== updatedValue.length && toast.push({
352
362
  title: "There was an error reordering languages",
353
363
  status: "warning"
354
364
  }), onChange(set(updatedValue));
355
- }, [toast, languages, onChange, value]), allKeysAreLanguages = useMemo(() => !(value != null && value.length) || !(languages != null && languages.length) ? !0 : value == null ? void 0 : value.every((v) => languages.find((l) => (l == null ? void 0 : l.id) === (v == null ? void 0 : v._key))), [value, languages]), languagesInUse = useMemo(
356
- () => languages && languages.length > 1 ? languages.filter((l) => value == null ? void 0 : value.find((v) => v._key === l.id)) : [],
365
+ }, [toast, languages, onChange, value]), allKeysAreLanguages = useMemo(() => !value?.length || !languages?.length ? !0 : value?.every((v) => languages.find((l) => l?.id === v?._key)), [value, languages]), languagesInUse = useMemo(
366
+ () => languages && languages.length > 1 ? languages.filter((l) => value?.find((v) => v._key === l.id)) : [],
357
367
  [languages, value]
358
- ), languagesOutOfOrder = useMemo(() => !(value != null && value.length) || !languagesInUse.length ? [] : value.map(
368
+ ), languagesOutOfOrder = useMemo(() => !value?.length || !languagesInUse.length ? [] : value.map(
359
369
  (v, vIndex) => vIndex === languagesInUse.findIndex((l) => l.id === v._key) ? null : v
360
370
  ).filter(Boolean), [value, languagesInUse]), languagesAreValid = useMemo(
361
- () => !(languages != null && languages.length) || (languages == null ? void 0 : languages.length) && languages.every((item) => item.id && item.title),
371
+ () => !languages?.length || languages?.length && languages.every((item) => item.id && item.title),
362
372
  [languages]
363
373
  );
364
374
  useEffect(() => {
@@ -373,9 +383,9 @@ function InternationalizedArray(props) {
373
383
  const addButtonsAreVisible = (
374
384
  // Plugin was configured to display buttons here (default!)
375
385
  buttonLocations.includes("field") && // There's at least one language visible
376
- (filteredLanguages == null ? void 0 : filteredLanguages.length) > 0 && // Not every language has a value yet
386
+ filteredLanguages?.length > 0 && // Not every language has a value yet
377
387
  !allLanguagesArePresent
378
- ), fieldHasMembers = (members == null ? void 0 : members.length) > 0;
388
+ ), fieldHasMembers = members?.length > 0;
379
389
  return /* @__PURE__ */ jsxs(Stack, { space: 2, children: [
380
390
  fieldHasMembers ? /* @__PURE__ */ jsx(Fragment, { children: filteredMembers.map((member) => member.kind === "item" ? /* @__PURE__ */ createElement(
381
391
  ArrayOfObjectsItem,
@@ -388,7 +398,7 @@ function InternationalizedArray(props) {
388
398
  !addButtonsAreVisible && !fieldHasMembers ? /* @__PURE__ */ jsx(Card, { border: !0, tone: "transparent", padding: 3, radius: 2, children: /* @__PURE__ */ jsx(Text, { size: 1, children: "This internationalized field currently has no translations." }) }) : null,
389
399
  addButtonsAreVisible ? /* @__PURE__ */ jsxs(Stack, { space: 2, children: [
390
400
  /* @__PURE__ */ jsx(
391
- AddButtons,
401
+ AddButtons$1,
392
402
  {
393
403
  languages: filteredLanguages,
394
404
  value,
@@ -411,8 +421,7 @@ function InternationalizedArray(props) {
411
421
  ] });
412
422
  }
413
423
  function getLanguagesFieldOption(schemaType) {
414
- var _a;
415
- return schemaType ? ((_a = schemaType.options) == null ? void 0 : _a.languages) || getLanguagesFieldOption(schemaType.type) : void 0;
424
+ return schemaType ? schemaType.options?.languages || getLanguagesFieldOption(schemaType.type) : void 0;
416
425
  }
417
426
  var array = (config) => {
418
427
  const { apiVersion, select, languages, type } = config, typeName = typeof type == "string" ? type : type.name, arrayName = createFieldName(typeName), objectName = createFieldName(typeName, !0);
@@ -424,7 +433,12 @@ var array = (config) => {
424
433
  input: InternationalizedArray
425
434
  },
426
435
  // These options are required for validation rules – not the custom input component
427
- options: { apiVersion, select, languages },
436
+ options: {
437
+ // @ts-expect-error - find out why it fails
438
+ apiVersion,
439
+ select,
440
+ languages
441
+ },
428
442
  of: [
429
443
  defineField({
430
444
  ...typeof type == "string" ? {} : type,
@@ -432,15 +446,16 @@ var array = (config) => {
432
446
  type: objectName
433
447
  })
434
448
  ],
449
+ // @ts-expect-error - find out why it fails
435
450
  validation: (rule) => rule.custom(async (value, context) => {
436
451
  if (!value)
437
452
  return !0;
438
453
  const selectedValue = getSelectedValue(select, context.document), client = context.getClient({ apiVersion });
439
454
  let contextLanguages = [];
440
- const languagesFieldOption = getLanguagesFieldOption(context == null ? void 0 : context.type);
455
+ const languagesFieldOption = getLanguagesFieldOption(context?.type);
441
456
  if (Array.isArray(languagesFieldOption) ? contextLanguages = languagesFieldOption : Array.isArray(peek(selectedValue)) ? contextLanguages = peek(selectedValue) || [] : typeof languagesFieldOption == "function" && (contextLanguages = await languagesFieldOption(client, selectedValue)), value && value.length > contextLanguages.length)
442
457
  return `Cannot be more than ${contextLanguages.length === 1 ? "1 item" : `${contextLanguages.length} items`}`;
443
- const nonLanguageKeys = value != null && value.length ? value.filter(
458
+ const nonLanguageKeys = value?.length ? value.filter(
444
459
  (item) => !contextLanguages.find((language) => item._key === language.id)
445
460
  ) : [];
446
461
  if (nonLanguageKeys.length)
@@ -448,10 +463,10 @@ var array = (config) => {
448
463
  message: "Array item keys must be valid languages registered to the field type",
449
464
  paths: nonLanguageKeys.map((item) => [{ _key: item._key }])
450
465
  };
451
- const valuesByLanguage = value != null && value.length ? value.filter((item) => !!(item != null && item._key)).reduce((acc, cur) => acc[cur._key] ? { ...acc, [cur._key]: [...acc[cur._key], cur] } : {
466
+ const valuesByLanguage = value?.length ? value.filter((item) => !!item?._key).reduce((acc, cur) => acc[cur._key] ? { ...acc, [cur._key]: [...acc[cur._key], cur] } : {
452
467
  ...acc,
453
468
  [cur._key]: [cur]
454
- }, {}) : {}, duplicateValues = Object.values(valuesByLanguage).filter((item) => (item == null ? void 0 : item.length) > 1).flat();
469
+ }, {}) : {}, duplicateValues = Object.values(valuesByLanguage).filter((item) => item?.length > 1).flat();
455
470
  return duplicateValues.length ? {
456
471
  message: "There can only be one field per language",
457
472
  paths: duplicateValues.map((item) => [{ _key: item._key }])
@@ -467,7 +482,7 @@ function InternationalizedField(props) {
467
482
  }) : props.children;
468
483
  }
469
484
  function getToneFromValidation(validations) {
470
- if (!(validations != null && validations.length))
485
+ if (!validations?.length)
471
486
  return;
472
487
  const validationLevels = validations.map((v) => v.level);
473
488
  if (validationLevels.includes("error"))
@@ -488,16 +503,12 @@ function InternationalizedInput(props) {
488
503
  // TODO: Remove this as it shouldn't be necessary?
489
504
  value: props.value
490
505
  }, { validation, value, onChange, readOnly } = inlineProps, { languages } = useInternationalizedArrayContext(), languageKeysInUse = useMemo(
491
- () => {
492
- var _a;
493
- return (_a = parentValue == null ? void 0 : parentValue.map((v) => v._key)) != null ? _a : [];
494
- },
506
+ () => parentValue?.map((v) => v._key) ?? [],
495
507
  [parentValue]
496
- ), keyIsValid = languages != null && languages.length ? languages.find((l) => l.id === value._key) : !1, handleKeyChange = useCallback(
508
+ ), keyIsValid = languages?.length ? languages.find((l) => l.id === value._key) : !1, handleKeyChange = useCallback(
497
509
  (event) => {
498
- var _a;
499
- const languageId = (_a = event == null ? void 0 : event.currentTarget) == null ? void 0 : _a.value;
500
- !value || !(languages != null && languages.length) || !languages.find((l) => l.id === languageId) || onChange([set(languageId, ["_key"])]);
510
+ const languageId = event?.currentTarget?.value;
511
+ !value || !languages?.length || !languages.find((l) => l.id === languageId) || onChange([set(languageId, ["_key"])]);
501
512
  },
502
513
  [onChange, value, languages]
503
514
  ), handleUnset = useCallback(() => {
@@ -545,9 +556,9 @@ var object = (config) => {
545
556
  title: `Internationalized array ${type}`,
546
557
  type: "object",
547
558
  components: {
559
+ // @ts-expect-error - find out why it fails
548
560
  item: InternationalizedInput
549
561
  },
550
- // @ts-expect-error - Address this typing issue with the inner object
551
562
  fields: [
552
563
  typeof type == "string" ? (
553
564
  // Define a simple field if all we have is the name as a string
@@ -633,10 +644,13 @@ const internationalizedArray = definePlugin((config) => {
633
644
  (field) => field.type.name
634
645
  ).some(
635
646
  (name) => name.startsWith("internationalizedArray")
636
- ) ? props.renderDefault(props) : InternationalizedArrayProvider({
637
- ...props,
638
- internationalizedArray: pluginConfig
639
- })
647
+ ) ? props.renderDefault(props) : /* @__PURE__ */ jsx(
648
+ InternationalizedArrayProvider,
649
+ {
650
+ ...props,
651
+ internationalizedArray: pluginConfig
652
+ }
653
+ )
640
654
  }
641
655
  },
642
656
  // Register custom schema types for the outer array and the inner object