sanity-plugin-internationalized-array 2.0.1-canary.1 → 2.1.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/lib/index.js CHANGED
@@ -5,7 +5,8 @@ function _interopDefaultCompat(e) {
5
5
  return e && typeof e == "object" && "default" in e ? e : { default: e };
6
6
  }
7
7
  function _interopNamespaceCompat(e) {
8
- if (e && typeof e == "object" && "default" in e) return e;
8
+ if (e && typeof e == "object" && "default" in e)
9
+ return e;
9
10
  var n = /* @__PURE__ */ Object.create(null);
10
11
  return e && Object.keys(e).forEach(function(k) {
11
12
  if (k !== "default") {
@@ -20,7 +21,7 @@ function _interopNamespaceCompat(e) {
20
21
  }), n.default = e, Object.freeze(n);
21
22
  }
22
23
  var suspend__namespace = /* @__PURE__ */ _interopNamespaceCompat(suspend), equal__default = /* @__PURE__ */ _interopDefaultCompat(equal), get__default = /* @__PURE__ */ _interopDefaultCompat(get);
23
- const namespace = "sanity-plugin-internationalized-array", version = "v1", preload = (fn) => suspend__namespace.preload(() => fn(), [version, namespace]), clear = () => suspend__namespace.clear([version, namespace]), peek = (selectedValue) => suspend__namespace.peek([version, namespace, selectedValue]), MAX_COLUMNS = 7, CONFIG_DEFAULT = {
24
+ const namespace = "sanity-plugin-internationalized-array", version = "v0", preload = (fn) => suspend__namespace.preload(() => fn(), [version, namespace]), clear = () => suspend__namespace.clear([version, namespace]), peek = (selectedValue) => suspend__namespace.peek([version, namespace, selectedValue]), MAX_COLUMNS = 7, CONFIG_DEFAULT = {
24
25
  languages: [],
25
26
  select: {},
26
27
  defaultLanguages: [],
@@ -31,10 +32,11 @@ const namespace = "sanity-plugin-internationalized-array", version = "v1", prelo
31
32
  }, getDocumentsToTranslate = (value, rootPath = []) => {
32
33
  if (Array.isArray(value)) {
33
34
  const arrayRootPath = [...rootPath], internationalizedValues = value.filter((item) => {
34
- if (Array.isArray(item)) return !1;
35
+ if (Array.isArray(item))
36
+ return !1;
35
37
  if (typeof item == "object") {
36
- const type = item?._type;
37
- return type?.startsWith("internationalizedArray") && type?.endsWith("Value");
38
+ const type = item == null ? void 0 : item._type;
39
+ return (type == null ? void 0 : type.startsWith("internationalizedArray")) && (type == null ? void 0 : type.endsWith("Value"));
38
40
  }
39
41
  return !1;
40
42
  });
@@ -65,7 +67,7 @@ function AddButtons(props) {
65
67
  tone: "primary",
66
68
  mode: "ghost",
67
69
  fontSize: 1,
68
- disabled: readOnly || !!value?.find((item) => item._key === language.id),
70
+ disabled: readOnly || !!(value != null && value.find((item) => item._key === language.id)),
69
71
  text: language.id.toUpperCase(),
70
72
  icon: languages.length > MAX_COLUMNS ? void 0 : icons.AddIcon,
71
73
  value: language.id,
@@ -74,7 +76,6 @@ function AddButtons(props) {
74
76
  language.id
75
77
  )) }) : null;
76
78
  }
77
- var AddButtons$1 = react.memo(AddButtons);
78
79
  function DocumentAddButtons(props) {
79
80
  const { filteredLanguages } = useInternationalizedArrayContext(), value = sanity.isSanityDocument(props.value) ? props.value : void 0, toast = ui.useToast(), { onChange } = structure.useDocumentPane(), documentsToTranslation = getDocumentsToTranslate(value, []), handleDocumentButtonClick = react.useCallback(
80
81
  async (event) => {
@@ -87,7 +88,7 @@ function DocumentAddButtons(props) {
87
88
  return;
88
89
  }
89
90
  const alreadyTranslated = documentsToTranslation.filter(
90
- (translation) => translation?._key === languageId
91
+ (translation) => (translation == null ? void 0 : translation._key) === languageId
91
92
  ), removeDuplicates = documentsToTranslation.reduce((filteredTranslations, translation) => alreadyTranslated.filter(
92
93
  (alreadyTranslation) => alreadyTranslation.pathString === translation.pathString
93
94
  ).length > 0 || filteredTranslations.filter(
@@ -122,7 +123,7 @@ function DocumentAddButtons(props) {
122
123
  return /* @__PURE__ */ jsxRuntime.jsxs(ui.Stack, { space: 3, children: [
123
124
  /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: 1, weight: "semibold", children: "Add translation to internationalized fields" }) }),
124
125
  /* @__PURE__ */ jsxRuntime.jsx(
125
- AddButtons$1,
126
+ AddButtons,
126
127
  {
127
128
  languages: filteredLanguages,
128
129
  readOnly: !1,
@@ -139,7 +140,7 @@ const getSelectedValue = (select, document) => {
139
140
  for (const [key, path] of Object.entries(selection)) {
140
141
  let value = get__default.default(document, path);
141
142
  Array.isArray(value) && (value = value.filter(
142
- (item) => typeof item == "object" ? item?._type === "reference" && "_ref" in item : !0
143
+ (item) => typeof item == "object" ? (item == null ? void 0 : item._type) === "reference" && "_ref" in item : !0
143
144
  )), selectedValue[key] = value;
144
145
  }
145
146
  return selectedValue;
@@ -152,7 +153,7 @@ function useInternationalizedArrayContext() {
152
153
  return react.useContext(InternationalizedArrayContext);
153
154
  }
154
155
  function InternationalizedArrayProvider(props) {
155
- const { internationalizedArray: internationalizedArray2 } = props, client = sanity.useClient({ apiVersion: internationalizedArray2.apiVersion }), workspace = sanity.useWorkspace(), { formState } = structure.useDocumentPane(), deferredDocument = react.useDeferredValue(formState?.value), selectedValue = react.useMemo(
156
+ const { internationalizedArray: internationalizedArray2 } = props, client = sanity.useClient({ apiVersion: internationalizedArray2.apiVersion }), workspace = sanity.useWorkspace(), { value: document } = sanity.useFormBuilder(), deferredDocument = react.useDeferredValue(document), selectedValue = react.useMemo(
156
157
  () => getSelectedValue(internationalizedArray2.select, deferredDocument),
157
158
  [internationalizedArray2.select, deferredDocument]
158
159
  ), languages = Array.isArray(internationalizedArray2.languages) ? internationalizedArray2.languages : suspend.suspend(
@@ -165,14 +166,21 @@ function InternationalizedArrayProvider(props) {
165
166
  return typeof documentType == "string" && languageFilterOptions.documentTypes.includes(documentType) ? languages.filter(
166
167
  (language) => selectedLanguageIds.includes(language.id)
167
168
  ) : languages;
168
- }, [deferredDocument, languageFilterOptions, languages, selectedLanguageIds]), showDocumentButtons = internationalizedArray2.buttonLocations.includes("document"), context = react.useMemo(
169
- () => ({ ...internationalizedArray2, languages, filteredLanguages }),
170
- [filteredLanguages, internationalizedArray2, languages]
169
+ }, [deferredDocument, languageFilterOptions, languages, selectedLanguageIds]), showDocumentButtons = internationalizedArray2.buttonLocations.includes("document");
170
+ return /* @__PURE__ */ jsxRuntime.jsx(
171
+ InternationalizedArrayContext.Provider,
172
+ {
173
+ value: {
174
+ ...internationalizedArray2,
175
+ languages,
176
+ filteredLanguages
177
+ },
178
+ children: showDocumentButtons ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Stack, { space: 5, children: [
179
+ /* @__PURE__ */ jsxRuntime.jsx(DocumentAddButtons, { value: props.value }),
180
+ props.renderDefault(props)
181
+ ] }) : props.renderDefault(props)
182
+ }
171
183
  );
172
- return /* @__PURE__ */ jsxRuntime.jsx(InternationalizedArrayContext.Provider, { value: context, children: showDocumentButtons ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Stack, { space: 5, children: [
173
- /* @__PURE__ */ jsxRuntime.jsx(DocumentAddButtons, { value: props.value }),
174
- props.renderDefault(props)
175
- ] }) : props.renderDefault(props) });
176
184
  }
177
185
  var Preload = react.memo(function(props) {
178
186
  const client = sanity.useClient({ apiVersion: props.apiVersion });
@@ -185,7 +193,7 @@ function checkAllLanguagesArePresent(languages, value) {
185
193
  return languagesInUseIds.length === filteredLanguageIds.length && languagesInUseIds.every((l) => filteredLanguageIds.includes(l));
186
194
  }
187
195
  function createAddAllTitle(value, languages) {
188
- return value?.length ? `Add missing ${languages.length - value.length === 1 ? "language" : "languages"}` : languages.length === 1 ? `Add ${languages[0].title} Field` : "Add all languages";
196
+ 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";
189
197
  }
190
198
  function createValueSchemaTypeName(schemaType) {
191
199
  return `${schemaType.name}Value`;
@@ -202,11 +210,11 @@ function createAddLanguagePatches(config) {
202
210
  ...itemBase,
203
211
  _key: id
204
212
  })) : filteredLanguages.filter(
205
- (language) => value?.length ? !value.find((v) => v._key === language.id) : !0
213
+ (language) => value != null && value.length ? !value.find((v) => v._key === language.id) : !0
206
214
  ).map((language) => ({
207
215
  ...itemBase,
208
216
  _key: language.id
209
- })), languagesInUse = value?.length ? value.map((v) => v) : [];
217
+ })), languagesInUse = value != null && value.length ? value.map((v) => v) : [];
210
218
  return newItems.map((item) => {
211
219
  const languageIndex = languages.findIndex((l) => item._key === l.id), remainingLanguages = languages.slice(languageIndex + 1), nextLanguageIndex = languagesInUse.findIndex(
212
220
  (l) => (
@@ -224,7 +232,7 @@ function createAddLanguagePatches(config) {
224
232
  });
225
233
  }
226
234
  const createTranslateFieldActions = (fieldActionProps, { languages, filteredLanguages }) => languages.map((language) => {
227
- const value = sanity.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 } = structure.useDocumentPane(), onAction = react.useCallback(() => {
235
+ const value = sanity.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 } = structure.useDocumentPane(), onAction = react.useCallback(() => {
228
236
  const { schemaType, path } = fieldActionProps, addLanguageKeys = [language.id], patches = createAddLanguagePatches({
229
237
  addLanguageKeys,
230
238
  schemaType,
@@ -266,7 +274,8 @@ const createTranslateFieldActions = (fieldActionProps, { languages, filteredLang
266
274
  }, internationalizedArrayFieldAction = sanity.defineDocumentFieldAction({
267
275
  name: "internationalizedArray",
268
276
  useAction(fieldActionProps) {
269
- const isInternationalizedArrayField = fieldActionProps?.schemaType?.type?.name.startsWith(
277
+ var _a, _b;
278
+ const isInternationalizedArrayField = (_b = (_a = fieldActionProps == null ? void 0 : fieldActionProps.schemaType) == null ? void 0 : _a.type) == null ? void 0 : _b.name.startsWith(
270
279
  "internationalizedArray"
271
280
  ), { languages, filteredLanguages } = useInternationalizedArrayContext(), translateFieldActions = createTranslateFieldActions(
272
281
  fieldActionProps,
@@ -343,9 +352,10 @@ function InternationalizedArray(props) {
343
352
  [languageFilterEnabled, members, languageFilterOptions, selectedLanguageIds]
344
353
  ), handleAddLanguage = react.useCallback(
345
354
  async (param) => {
346
- if (!filteredLanguages?.length)
355
+ var _a;
356
+ if (!(filteredLanguages != null && filteredLanguages.length))
347
357
  return;
348
- const addLanguageKeys = Array.isArray(param) ? param : [param?.currentTarget?.value].filter(Boolean), patches = createAddLanguagePatches({
358
+ const addLanguageKeys = Array.isArray(param) ? param : [(_a = param == null ? void 0 : param.currentTarget) == null ? void 0 : _a.value].filter(Boolean), patches = createAddLanguagePatches({
349
359
  addLanguageKeys,
350
360
  schemaType,
351
361
  languages,
@@ -363,23 +373,23 @@ function InternationalizedArray(props) {
363
373
  };
364
374
  }, [defaultLanguages, documentCreatedAt, handleAddLanguage, value]);
365
375
  const handleRestoreOrder = react.useCallback(() => {
366
- if (!value?.length || !languages?.length)
376
+ if (!(value != null && value.length) || !(languages != null && languages.length))
367
377
  return;
368
378
  const updatedValue = value.reduce((acc, v) => {
369
- const newIndex = languages.findIndex((l) => l.id === v?._key);
379
+ const newIndex = languages.findIndex((l) => l.id === (v == null ? void 0 : v._key));
370
380
  return newIndex > -1 && (acc[newIndex] = v), acc;
371
381
  }, []).filter(Boolean);
372
- value?.length !== updatedValue.length && toast.push({
382
+ (value == null ? void 0 : value.length) !== updatedValue.length && toast.push({
373
383
  title: "There was an error reordering languages",
374
384
  status: "warning"
375
385
  }), onChange(sanity.set(updatedValue));
376
- }, [toast, languages, onChange, value]), allKeysAreLanguages = react.useMemo(() => !value?.length || !languages?.length ? !0 : value?.every((v) => languages.find((l) => l?.id === v?._key)), [value, languages]), languagesInUse = react.useMemo(
377
- () => languages && languages.length > 1 ? languages.filter((l) => value?.find((v) => v._key === l.id)) : [],
386
+ }, [toast, languages, onChange, value]), allKeysAreLanguages = react.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 = react.useMemo(
387
+ () => languages && languages.length > 1 ? languages.filter((l) => value == null ? void 0 : value.find((v) => v._key === l.id)) : [],
378
388
  [languages, value]
379
- ), languagesOutOfOrder = react.useMemo(() => !value?.length || !languagesInUse.length ? [] : value.map(
389
+ ), languagesOutOfOrder = react.useMemo(() => !(value != null && value.length) || !languagesInUse.length ? [] : value.map(
380
390
  (v, vIndex) => vIndex === languagesInUse.findIndex((l) => l.id === v._key) ? null : v
381
391
  ).filter(Boolean), [value, languagesInUse]), languagesAreValid = react.useMemo(
382
- () => !languages?.length || languages?.length && languages.every((item) => item.id && item.title),
392
+ () => !(languages != null && languages.length) || (languages == null ? void 0 : languages.length) && languages.every((item) => item.id && item.title),
383
393
  [languages]
384
394
  );
385
395
  react.useEffect(() => {
@@ -394,9 +404,9 @@ function InternationalizedArray(props) {
394
404
  const addButtonsAreVisible = (
395
405
  // Plugin was configured to display buttons here (default!)
396
406
  buttonLocations.includes("field") && // There's at least one language visible
397
- filteredLanguages?.length > 0 && // Not every language has a value yet
407
+ (filteredLanguages == null ? void 0 : filteredLanguages.length) > 0 && // Not every language has a value yet
398
408
  !allLanguagesArePresent
399
- ), fieldHasMembers = members?.length > 0;
409
+ ), fieldHasMembers = (members == null ? void 0 : members.length) > 0;
400
410
  return /* @__PURE__ */ jsxRuntime.jsxs(ui.Stack, { space: 2, children: [
401
411
  fieldHasMembers ? /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: filteredMembers.map((member) => member.kind === "item" ? /* @__PURE__ */ react.createElement(
402
412
  sanity.ArrayOfObjectsItem,
@@ -409,7 +419,7 @@ function InternationalizedArray(props) {
409
419
  !addButtonsAreVisible && !fieldHasMembers ? /* @__PURE__ */ jsxRuntime.jsx(ui.Card, { border: !0, tone: "transparent", padding: 3, radius: 2, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: 1, children: "This internationalized field currently has no translations." }) }) : null,
410
420
  addButtonsAreVisible ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Stack, { space: 2, children: [
411
421
  /* @__PURE__ */ jsxRuntime.jsx(
412
- AddButtons$1,
422
+ AddButtons,
413
423
  {
414
424
  languages: filteredLanguages,
415
425
  value,
@@ -432,7 +442,8 @@ function InternationalizedArray(props) {
432
442
  ] });
433
443
  }
434
444
  function getLanguagesFieldOption(schemaType) {
435
- return schemaType ? schemaType.options?.languages || getLanguagesFieldOption(schemaType.type) : void 0;
445
+ var _a;
446
+ return schemaType ? ((_a = schemaType.options) == null ? void 0 : _a.languages) || getLanguagesFieldOption(schemaType.type) : void 0;
436
447
  }
437
448
  var array = (config) => {
438
449
  const { apiVersion, select, languages, type } = config, typeName = typeof type == "string" ? type : type.name, arrayName = createFieldName(typeName), objectName = createFieldName(typeName, !0);
@@ -444,12 +455,7 @@ var array = (config) => {
444
455
  input: InternationalizedArray
445
456
  },
446
457
  // These options are required for validation rules – not the custom input component
447
- options: {
448
- // @ts-expect-error - find out why it fails
449
- apiVersion,
450
- select,
451
- languages
452
- },
458
+ options: { apiVersion, select, languages },
453
459
  of: [
454
460
  sanity.defineField({
455
461
  ...typeof type == "string" ? {} : type,
@@ -457,16 +463,15 @@ var array = (config) => {
457
463
  type: objectName
458
464
  })
459
465
  ],
460
- // @ts-expect-error - find out why it fails
461
466
  validation: (rule) => rule.custom(async (value, context) => {
462
467
  if (!value)
463
468
  return !0;
464
469
  const selectedValue = getSelectedValue(select, context.document), client = context.getClient({ apiVersion });
465
470
  let contextLanguages = [];
466
- const languagesFieldOption = getLanguagesFieldOption(context?.type);
471
+ const languagesFieldOption = getLanguagesFieldOption(context == null ? void 0 : context.type);
467
472
  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)
468
473
  return `Cannot be more than ${contextLanguages.length === 1 ? "1 item" : `${contextLanguages.length} items`}`;
469
- const nonLanguageKeys = value?.length ? value.filter(
474
+ const nonLanguageKeys = value != null && value.length ? value.filter(
470
475
  (item) => !contextLanguages.find((language) => item._key === language.id)
471
476
  ) : [];
472
477
  if (nonLanguageKeys.length)
@@ -474,10 +479,10 @@ var array = (config) => {
474
479
  message: "Array item keys must be valid languages registered to the field type",
475
480
  paths: nonLanguageKeys.map((item) => [{ _key: item._key }])
476
481
  };
477
- const valuesByLanguage = value?.length ? value.filter((item) => !!item?._key).reduce((acc, cur) => acc[cur._key] ? { ...acc, [cur._key]: [...acc[cur._key], cur] } : {
482
+ 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] } : {
478
483
  ...acc,
479
484
  [cur._key]: [cur]
480
- }, {}) : {}, duplicateValues = Object.values(valuesByLanguage).filter((item) => item?.length > 1).flat();
485
+ }, {}) : {}, duplicateValues = Object.values(valuesByLanguage).filter((item) => (item == null ? void 0 : item.length) > 1).flat();
481
486
  return duplicateValues.length ? {
482
487
  message: "There can only be one field per language",
483
488
  paths: duplicateValues.map((item) => [{ _key: item._key }])
@@ -493,7 +498,7 @@ function InternationalizedField(props) {
493
498
  }) : props.children;
494
499
  }
495
500
  function getToneFromValidation(validations) {
496
- if (!validations?.length)
501
+ if (!(validations != null && validations.length))
497
502
  return;
498
503
  const validationLevels = validations.map((v) => v.level);
499
504
  if (validationLevels.includes("error"))
@@ -514,12 +519,16 @@ function InternationalizedInput(props) {
514
519
  // TODO: Remove this as it shouldn't be necessary?
515
520
  value: props.value
516
521
  }, { validation, value, onChange, readOnly } = inlineProps, { languages } = useInternationalizedArrayContext(), languageKeysInUse = react.useMemo(
517
- () => parentValue?.map((v) => v._key) ?? [],
522
+ () => {
523
+ var _a;
524
+ return (_a = parentValue == null ? void 0 : parentValue.map((v) => v._key)) != null ? _a : [];
525
+ },
518
526
  [parentValue]
519
- ), keyIsValid = languages?.length ? languages.find((l) => l.id === value._key) : !1, handleKeyChange = react.useCallback(
527
+ ), keyIsValid = languages != null && languages.length ? languages.find((l) => l.id === value._key) : !1, handleKeyChange = react.useCallback(
520
528
  (event) => {
521
- const languageId = event?.currentTarget?.value;
522
- !value || !languages?.length || !languages.find((l) => l.id === languageId) || onChange([sanity.set(languageId, ["_key"])]);
529
+ var _a;
530
+ const languageId = (_a = event == null ? void 0 : event.currentTarget) == null ? void 0 : _a.value;
531
+ !value || !(languages != null && languages.length) || !languages.find((l) => l.id === languageId) || onChange([sanity.set(languageId, ["_key"])]);
523
532
  },
524
533
  [onChange, value, languages]
525
534
  ), handleUnset = react.useCallback(() => {
@@ -567,9 +576,9 @@ var object = (config) => {
567
576
  title: `Internationalized array ${type}`,
568
577
  type: "object",
569
578
  components: {
570
- // @ts-expect-error - find out why it fails
571
579
  item: InternationalizedInput
572
580
  },
581
+ // @ts-expect-error - Address this typing issue with the inner object
573
582
  fields: [
574
583
  typeof type == "string" ? (
575
584
  // Define a simple field if all we have is the name as a string
@@ -655,13 +664,10 @@ const internationalizedArray = sanity.definePlugin((config) => {
655
664
  (field) => field.type.name
656
665
  ).some(
657
666
  (name) => name.startsWith("internationalizedArray")
658
- ) ? props.renderDefault(props) : /* @__PURE__ */ jsxRuntime.jsx(
659
- InternationalizedArrayProvider,
660
- {
661
- ...props,
662
- internationalizedArray: pluginConfig
663
- }
664
- )
667
+ ) ? props.renderDefault(props) : InternationalizedArrayProvider({
668
+ ...props,
669
+ internationalizedArray: pluginConfig
670
+ })
665
671
  }
666
672
  },
667
673
  // Register custom schema types for the outer array and the inner object