sanity-plugin-media 4.3.1 → 4.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/LICENSE +4 -4
  2. package/README.md +12 -12
  3. package/dist/{index.mjs → index.cjs} +1115 -1242
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +462 -0
  6. package/dist/index.d.ts +263 -195
  7. package/dist/index.js +1125 -1237
  8. package/dist/index.js.map +1 -1
  9. package/package.json +45 -68
  10. package/src/__tests__/fixtures/createEpicTestStore.ts +5 -4
  11. package/src/__tests__/fixtures/mockSanityClient.ts +8 -8
  12. package/src/__tests__/fixtures/renderWithProviders.tsx +8 -7
  13. package/src/__tests__/fixtures/rootState.ts +4 -4
  14. package/src/components/AssetGridVirtualized/index.tsx +8 -7
  15. package/src/components/AssetMetadata/index.tsx +6 -5
  16. package/src/components/AssetTableVirtualized/index.tsx +7 -6
  17. package/src/components/AutoTagInputWrapper/index.tsx +9 -4
  18. package/src/components/Browser/Browser.test.tsx +9 -8
  19. package/src/components/Browser/index.tsx +2 -1
  20. package/src/components/Browser/useBrowserInit.ts +9 -9
  21. package/src/components/ButtonAssetCopy/index.tsx +1 -0
  22. package/src/components/ButtonViewGroup/index.tsx +4 -3
  23. package/src/components/CardAsset/CardAsset.test.tsx +53 -52
  24. package/src/components/CardAsset/index.tsx +52 -49
  25. package/src/components/CardUpload/index.tsx +7 -6
  26. package/src/components/Controls/index.tsx +7 -6
  27. package/src/components/DebugControls/index.tsx +5 -4
  28. package/src/components/DialogAssetEdit/Details.tsx +3 -2
  29. package/src/components/DialogAssetEdit/DialogAssetEdit.test.tsx +28 -27
  30. package/src/components/DialogAssetEdit/index.tsx +37 -37
  31. package/src/components/DialogConfirm/index.tsx +2 -1
  32. package/src/components/DialogSearchFacets/index.tsx +3 -2
  33. package/src/components/DialogTagCreate/DialogTagCreate.test.tsx +16 -15
  34. package/src/components/DialogTagCreate/index.tsx +11 -10
  35. package/src/components/DialogTagEdit/DialogTagEdit.test.tsx +28 -27
  36. package/src/components/DialogTagEdit/index.tsx +17 -16
  37. package/src/components/DialogTags/index.tsx +4 -3
  38. package/src/components/Dialogs/index.tsx +2 -3
  39. package/src/components/DocumentList/index.tsx +2 -3
  40. package/src/components/FileAssetPreview/index.tsx +2 -2
  41. package/src/components/FormBuilderTool/FormBuilderTool.test.tsx +12 -11
  42. package/src/components/FormBuilderTool/index.tsx +2 -1
  43. package/src/components/FormFieldInputLabel/index.tsx +1 -2
  44. package/src/components/FormFieldInputTags/index.tsx +4 -3
  45. package/src/components/FormSubmitButton/index.tsx +1 -1
  46. package/src/components/Header/index.tsx +3 -3
  47. package/src/components/Image/index.tsx +10 -4
  48. package/src/components/Items/index.tsx +5 -4
  49. package/src/components/Notifications/index.tsx +3 -2
  50. package/src/components/OrderSelect/index.tsx +4 -3
  51. package/src/components/PickedBar/index.tsx +2 -1
  52. package/src/components/Progress/index.tsx +3 -3
  53. package/src/components/ReduxProvider/index.tsx +15 -12
  54. package/src/components/SearchFacet/index.tsx +3 -2
  55. package/src/components/SearchFacetNumber/index.tsx +8 -8
  56. package/src/components/SearchFacetSelect/index.tsx +7 -8
  57. package/src/components/SearchFacetString/index.tsx +1 -1
  58. package/src/components/SearchFacetTags/index.tsx +13 -12
  59. package/src/components/SearchFacets/index.tsx +2 -3
  60. package/src/components/SearchFacetsControl/index.tsx +13 -12
  61. package/src/components/TableHeader/index.tsx +18 -17
  62. package/src/components/TableHeaderItem/index.tsx +4 -4
  63. package/src/components/TableRowAsset/index.tsx +37 -36
  64. package/src/components/TableRowUpload/index.tsx +7 -6
  65. package/src/components/Tag/index.tsx +8 -7
  66. package/src/components/TagView/index.tsx +2 -2
  67. package/src/components/TagViewHeader/index.tsx +5 -4
  68. package/src/components/TagsPanel/index.tsx +3 -3
  69. package/src/components/TagsVirtualized/index.tsx +25 -24
  70. package/src/components/TextInputSearch/index.tsx +3 -2
  71. package/src/components/UploadDropzone/UploadDropzone.test.tsx +8 -7
  72. package/src/components/UploadDropzone/index.tsx +14 -13
  73. package/src/config/orders.ts +6 -6
  74. package/src/config/searchFacets.ts +56 -55
  75. package/src/constants.ts +15 -14
  76. package/src/contexts/AssetSourceDispatchContext.tsx +1 -1
  77. package/src/contexts/ToolOptionsContext.tsx +6 -5
  78. package/src/formSchema/index.test.ts +6 -5
  79. package/src/formSchema/index.ts +5 -5
  80. package/src/hooks/useBreakpointIndex.ts +6 -6
  81. package/src/hooks/useKeyPress.ts +2 -2
  82. package/src/hooks/usePortalPopoverProps.ts +1 -1
  83. package/src/modules/assets/actions.ts +8 -7
  84. package/src/modules/assets/deleteAndUpdateEpics.test.ts +18 -17
  85. package/src/modules/assets/fetchEpic.test.ts +12 -11
  86. package/src/modules/assets/index.ts +134 -133
  87. package/src/modules/assets/reducer.test.ts +9 -8
  88. package/src/modules/assets/tagsAndListenerEpics.test.ts +36 -35
  89. package/src/modules/debug/index.ts +3 -3
  90. package/src/modules/dialog/actions.ts +2 -2
  91. package/src/modules/dialog/epics.test.ts +29 -28
  92. package/src/modules/dialog/index.ts +36 -35
  93. package/src/modules/dialog/reducer.test.ts +31 -30
  94. package/src/modules/index.ts +9 -9
  95. package/src/modules/notifications/epics.test.ts +71 -70
  96. package/src/modules/notifications/index.ts +50 -49
  97. package/src/modules/notifications/reducer.test.ts +8 -7
  98. package/src/modules/search/index.test.ts +2 -1
  99. package/src/modules/search/index.ts +22 -22
  100. package/src/modules/selected/index.ts +2 -2
  101. package/src/modules/selectors.test.ts +4 -3
  102. package/src/modules/selectors.ts +5 -5
  103. package/src/modules/tags/epics.test.ts +16 -15
  104. package/src/modules/tags/index.test.ts +2 -1
  105. package/src/modules/tags/index.ts +82 -81
  106. package/src/modules/uploads/actions.ts +3 -3
  107. package/src/modules/uploads/epics.test.ts +13 -12
  108. package/src/modules/uploads/index.test.ts +8 -7
  109. package/src/modules/uploads/index.ts +48 -47
  110. package/src/operators/checkTagName.test.ts +7 -6
  111. package/src/operators/checkTagName.ts +6 -5
  112. package/src/operators/debugThrottle.ts +4 -4
  113. package/src/plugin.tsx +18 -18
  114. package/src/schemas/tag.ts +7 -7
  115. package/src/styled/react-select/creatable.tsx +40 -39
  116. package/src/styled/react-select/single.tsx +39 -38
  117. package/src/types/index.ts +4 -3
  118. package/src/utils/applyMediaTags.ts +11 -10
  119. package/src/utils/blocksToText.test.ts +5 -4
  120. package/src/utils/blocksToText.ts +2 -2
  121. package/src/utils/constructFilter.test.ts +15 -14
  122. package/src/utils/constructFilter.ts +7 -7
  123. package/src/utils/generatePreviewBlobUrl.test.ts +6 -5
  124. package/src/utils/generatePreviewBlobUrl.ts +2 -2
  125. package/src/utils/getAssetResolution.test.ts +3 -2
  126. package/src/utils/getDocumentAssetIds.test.ts +7 -6
  127. package/src/utils/getDocumentAssetIds.ts +2 -2
  128. package/src/utils/getSchemeColor.test.ts +1 -0
  129. package/src/utils/getSchemeColor.ts +9 -9
  130. package/src/utils/getTagSelectOptions.test.ts +6 -5
  131. package/src/utils/getTagSelectOptions.ts +1 -1
  132. package/src/utils/getUniqueDocuments.test.ts +4 -3
  133. package/src/utils/getUniqueDocuments.ts +2 -2
  134. package/src/utils/imageDprUrl.test.ts +4 -3
  135. package/src/utils/imageDprUrl.ts +1 -1
  136. package/src/utils/isSupportedAssetType.test.ts +1 -0
  137. package/src/utils/mediaField.ts +4 -3
  138. package/src/utils/sanitizeFormData.test.ts +14 -13
  139. package/src/utils/typeGuards.test.ts +2 -1
  140. package/src/utils/uploadSanityAsset.test.ts +5 -4
  141. package/src/utils/uploadSanityAsset.ts +17 -16
  142. package/src/utils/withMaxConcurrency.test.ts +5 -4
  143. package/src/utils/withMaxConcurrency.ts +4 -4
  144. package/src/utils/zodFormResolver.ts +17 -0
  145. package/v2-incompatible.js +2 -2
  146. package/dist/index.d.mts +0 -394
  147. package/dist/index.mjs.map +0 -1
@@ -0,0 +1,462 @@
1
+ import { AssetSourceComponentProps } from "sanity";
2
+ import type { ComponentType } from "react";
3
+ import { Control } from "react-hook-form";
4
+ import type { FieldDefinitionBase } from "sanity";
5
+ import { FieldErrors } from "react-hook-form";
6
+ import type { FileDefinition } from "sanity";
7
+ import { ForwardRefExoticComponent } from "react";
8
+ import type { ImageDefinition } from "sanity";
9
+ import { InputProps } from "sanity";
10
+ import { JSX } from "react";
11
+ import { Plugin as Plugin_2 } from "sanity";
12
+ import { RefAttributes } from "react";
13
+ import type { SanityAssetDocument } from "@sanity/client";
14
+ import type { SanityImageAssetDocument } from "@sanity/client";
15
+ import { SVGProps } from "react";
16
+ import { UseFormRegister } from "react-hook-form";
17
+ import type { WidenInitialValue } from "sanity";
18
+ import type { WidenValidation } from "sanity";
19
+ import * as z from "zod";
20
+
21
+ declare type Asset = FileAsset | ImageAsset;
22
+
23
+ declare type AssetFormData = z.infer<ReturnType<typeof getAssetFormSchema>>;
24
+
25
+ /**
26
+ * Input component that automatically applies media tags when an asset is selected or uploaded.
27
+ *
28
+ * Apply explicitly to image/file fields that should be auto-tagged:
29
+ * ```ts
30
+ * import {AutoTagInput} from 'sanity-plugin-media'
31
+ *
32
+ * defineField({
33
+ * type: 'image',
34
+ * options: { mediaTags: ['product'] }, // also pre-filters the media browser
35
+ * components: { input: AutoTagInput },
36
+ * })
37
+ * ```
38
+ *
39
+ * Pass `mediaTags` as a prop to override or use without `options`:
40
+ * ```ts
41
+ * components: { input: (props) => <AutoTagInput {...props} mediaTags={['product']} /> }
42
+ * ```
43
+ */
44
+ export declare function AutoTagInput(props: AutoTagInputProps): JSX;
45
+
46
+ export declare type AutoTagInputProps = InputProps & {
47
+ mediaTags?: string[];
48
+ };
49
+
50
+ declare type CustomFields = {
51
+ altText?: LocalizedString;
52
+ description?: LocalizedString;
53
+ opt?: {
54
+ media?: {
55
+ tags?: SanityReference[];
56
+ };
57
+ };
58
+ title?: LocalizedString;
59
+ };
60
+
61
+ declare type DetailsProps = {
62
+ formUpdating: boolean;
63
+ handleCreateTag: (title: string) => void;
64
+ control: Control<AssetFormData>;
65
+ errors: FieldErrors<AssetFormData>;
66
+ register: UseFormRegister<AssetFormData>;
67
+ allTagOptions: TagSelectOption[];
68
+ assetTagOptions: TagSelectOption[] | null;
69
+ currentAsset: Asset;
70
+ creditLine?: {
71
+ enabled: boolean;
72
+ excludeSources?: string | string[] | undefined;
73
+ };
74
+ locales?: Locale[];
75
+ };
76
+
77
+ declare type FileAsset = SanityAssetDocument &
78
+ CustomFields & {
79
+ _type: "sanity.fileAsset";
80
+ };
81
+
82
+ declare type FileMediaFieldConfig = Omit<FileDefinition, "options"> &
83
+ FieldDefinitionBase & {
84
+ name: string;
85
+ mediaTags: string[];
86
+ options?: FileDefinition["options"];
87
+ };
88
+
89
+ declare type FileMediaFieldResult = Omit<FileDefinition, "options"> &
90
+ FieldDefinitionBase & {
91
+ options?: FileDefinition["options"] & {
92
+ mediaTags: string[];
93
+ };
94
+ components: {
95
+ input: typeof AutoTagInput;
96
+ };
97
+ } & WidenValidation &
98
+ WidenInitialValue;
99
+
100
+ declare function getAssetFormSchema(
101
+ locales?: {
102
+ id: string;
103
+ }[],
104
+ ): z.ZodObject<
105
+ {
106
+ altText:
107
+ | z.ZodOptional<z.ZodString>
108
+ | z.ZodObject<
109
+ Record<string, z.ZodTypeAny>,
110
+ "passthrough",
111
+ z.ZodTypeAny,
112
+ z.objectOutputType<
113
+ Record<string, z.ZodTypeAny>,
114
+ z.ZodTypeAny,
115
+ "passthrough"
116
+ >,
117
+ z.objectInputType<
118
+ Record<string, z.ZodTypeAny>,
119
+ z.ZodTypeAny,
120
+ "passthrough"
121
+ >
122
+ >;
123
+ creditLine:
124
+ | z.ZodOptional<z.ZodString>
125
+ | z.ZodObject<
126
+ Record<string, z.ZodTypeAny>,
127
+ "passthrough",
128
+ z.ZodTypeAny,
129
+ z.objectOutputType<
130
+ Record<string, z.ZodTypeAny>,
131
+ z.ZodTypeAny,
132
+ "passthrough"
133
+ >,
134
+ z.objectInputType<
135
+ Record<string, z.ZodTypeAny>,
136
+ z.ZodTypeAny,
137
+ "passthrough"
138
+ >
139
+ >;
140
+ description:
141
+ | z.ZodOptional<z.ZodString>
142
+ | z.ZodObject<
143
+ Record<string, z.ZodTypeAny>,
144
+ "passthrough",
145
+ z.ZodTypeAny,
146
+ z.objectOutputType<
147
+ Record<string, z.ZodTypeAny>,
148
+ z.ZodTypeAny,
149
+ "passthrough"
150
+ >,
151
+ z.objectInputType<
152
+ Record<string, z.ZodTypeAny>,
153
+ z.ZodTypeAny,
154
+ "passthrough"
155
+ >
156
+ >;
157
+ opt: z.ZodObject<
158
+ {
159
+ media: z.ZodObject<
160
+ {
161
+ tags: z.ZodNullable<
162
+ z.ZodArray<
163
+ z.ZodObject<
164
+ {
165
+ label: z.ZodString;
166
+ value: z.ZodString;
167
+ },
168
+ "strip",
169
+ z.ZodTypeAny,
170
+ {
171
+ value: string;
172
+ label: string;
173
+ },
174
+ {
175
+ value: string;
176
+ label: string;
177
+ }
178
+ >,
179
+ "many"
180
+ >
181
+ >;
182
+ },
183
+ "strip",
184
+ z.ZodTypeAny,
185
+ {
186
+ tags:
187
+ | {
188
+ value: string;
189
+ label: string;
190
+ }[]
191
+ | null;
192
+ },
193
+ {
194
+ tags:
195
+ | {
196
+ value: string;
197
+ label: string;
198
+ }[]
199
+ | null;
200
+ }
201
+ >;
202
+ },
203
+ "strip",
204
+ z.ZodTypeAny,
205
+ {
206
+ media: {
207
+ tags:
208
+ | {
209
+ value: string;
210
+ label: string;
211
+ }[]
212
+ | null;
213
+ };
214
+ },
215
+ {
216
+ media: {
217
+ tags:
218
+ | {
219
+ value: string;
220
+ label: string;
221
+ }[]
222
+ | null;
223
+ };
224
+ }
225
+ >;
226
+ originalFilename: z.ZodString;
227
+ title:
228
+ | z.ZodOptional<z.ZodString>
229
+ | z.ZodObject<
230
+ Record<string, z.ZodTypeAny>,
231
+ "passthrough",
232
+ z.ZodTypeAny,
233
+ z.objectOutputType<
234
+ Record<string, z.ZodTypeAny>,
235
+ z.ZodTypeAny,
236
+ "passthrough"
237
+ >,
238
+ z.objectInputType<
239
+ Record<string, z.ZodTypeAny>,
240
+ z.ZodTypeAny,
241
+ "passthrough"
242
+ >
243
+ >;
244
+ },
245
+ "strip",
246
+ z.ZodTypeAny,
247
+ {
248
+ originalFilename: string;
249
+ opt: {
250
+ media: {
251
+ tags:
252
+ | {
253
+ value: string;
254
+ label: string;
255
+ }[]
256
+ | null;
257
+ };
258
+ };
259
+ altText?:
260
+ | string
261
+ | z.objectOutputType<
262
+ Record<string, z.ZodTypeAny>,
263
+ z.ZodTypeAny,
264
+ "passthrough"
265
+ >
266
+ | undefined;
267
+ description?:
268
+ | string
269
+ | z.objectOutputType<
270
+ Record<string, z.ZodTypeAny>,
271
+ z.ZodTypeAny,
272
+ "passthrough"
273
+ >
274
+ | undefined;
275
+ title?:
276
+ | string
277
+ | z.objectOutputType<
278
+ Record<string, z.ZodTypeAny>,
279
+ z.ZodTypeAny,
280
+ "passthrough"
281
+ >
282
+ | undefined;
283
+ creditLine?:
284
+ | string
285
+ | z.objectOutputType<
286
+ Record<string, z.ZodTypeAny>,
287
+ z.ZodTypeAny,
288
+ "passthrough"
289
+ >
290
+ | undefined;
291
+ },
292
+ {
293
+ originalFilename: string;
294
+ opt: {
295
+ media: {
296
+ tags:
297
+ | {
298
+ value: string;
299
+ label: string;
300
+ }[]
301
+ | null;
302
+ };
303
+ };
304
+ altText?:
305
+ | string
306
+ | z.objectInputType<
307
+ Record<string, z.ZodTypeAny>,
308
+ z.ZodTypeAny,
309
+ "passthrough"
310
+ >
311
+ | undefined;
312
+ description?:
313
+ | string
314
+ | z.objectInputType<
315
+ Record<string, z.ZodTypeAny>,
316
+ z.ZodTypeAny,
317
+ "passthrough"
318
+ >
319
+ | undefined;
320
+ title?:
321
+ | string
322
+ | z.objectInputType<
323
+ Record<string, z.ZodTypeAny>,
324
+ z.ZodTypeAny,
325
+ "passthrough"
326
+ >
327
+ | undefined;
328
+ creditLine?:
329
+ | string
330
+ | z.objectInputType<
331
+ Record<string, z.ZodTypeAny>,
332
+ z.ZodTypeAny,
333
+ "passthrough"
334
+ >
335
+ | undefined;
336
+ }
337
+ >;
338
+
339
+ declare type ImageAsset = SanityImageAssetDocument &
340
+ CustomFields & {
341
+ _type: "sanity.imageAsset";
342
+ creditLine?: LocalizedString;
343
+ };
344
+
345
+ declare type ImageMediaFieldConfig = Omit<ImageDefinition, "options"> &
346
+ FieldDefinitionBase & {
347
+ name: string;
348
+ mediaTags: string[];
349
+ options?: ImageDefinition["options"];
350
+ };
351
+
352
+ declare type ImageMediaFieldResult = Omit<ImageDefinition, "options"> &
353
+ FieldDefinitionBase & {
354
+ options?: ImageDefinition["options"] & {
355
+ mediaTags: string[];
356
+ };
357
+ components: {
358
+ input: typeof AutoTagInput;
359
+ };
360
+ } & WidenValidation &
361
+ WidenInitialValue;
362
+
363
+ declare type Locale = {
364
+ title: string;
365
+ id: string;
366
+ [key: string]: unknown;
367
+ };
368
+
369
+ declare type LocalizedString = string | Record<string, string>;
370
+
371
+ export declare const media: Plugin_2<void | MediaToolOptions>;
372
+
373
+ export declare const mediaAssetSource: {
374
+ component: (props: AssetSourceComponentProps) => JSX;
375
+ icon: ForwardRefExoticComponent<
376
+ Omit<SVGProps<SVGSVGElement>, "ref"> & RefAttributes<SVGSVGElement>
377
+ >;
378
+ name: string;
379
+ title: string;
380
+ };
381
+
382
+ /**
383
+ * Defines an image or file field with automatic media tag application when an asset is selected.
384
+ *
385
+ * Pass `mediaTags` at the top level — they are moved into `options.mediaTags` (for media browser
386
+ * pre-filtering) and wire up {@link AutoTagInput} as the field component automatically:
387
+ * ```ts
388
+ * import {mediaField} from 'sanity-plugin-media'
389
+ *
390
+ * mediaField({
391
+ * name: 'coverImage',
392
+ * type: 'image',
393
+ * mediaTags: ['product-cover'],
394
+ * options: { hotspot: true },
395
+ * })
396
+ * ```
397
+ *
398
+ * For file fields, set `type: 'file'`:
399
+ * ```ts
400
+ * mediaField({ name: 'drawing', type: 'file', mediaTags: ['model-drawing'] })
401
+ * ```
402
+ */
403
+ export declare function mediaField(
404
+ config: ImageMediaFieldConfig,
405
+ ): ImageMediaFieldResult;
406
+
407
+ export declare function mediaField(
408
+ config: FileMediaFieldConfig,
409
+ ): FileMediaFieldResult;
410
+
411
+ export declare type MediaTagsOptions = {
412
+ mediaTags?: string[];
413
+ };
414
+
415
+ export declare type MediaToolOptions = {
416
+ maximumUploadSize?: number;
417
+ createTagsOnUpload?: boolean;
418
+ components?: {
419
+ details?: ComponentType<
420
+ DetailsProps & {
421
+ renderDefaultDetails: (props: DetailsProps) => JSX.Element;
422
+ }
423
+ >;
424
+ };
425
+ creditLine?: {
426
+ enabled: boolean;
427
+ excludeSources?: string | string[];
428
+ };
429
+ directUploads?: boolean;
430
+ /**
431
+ * Optional locales following Sanity recommended scheme: [{ id, title }]
432
+ * https://www.sanity.io/docs/studio/localization#k4da239411955
433
+ */
434
+ locales?: Locale[];
435
+ };
436
+
437
+ declare type SanityReference = {
438
+ _ref: string;
439
+ _type: "reference";
440
+ _weak?: boolean;
441
+ };
442
+
443
+ declare const tagOptionSchema: z.ZodObject<
444
+ {
445
+ label: z.ZodString;
446
+ value: z.ZodString;
447
+ },
448
+ "strip",
449
+ z.ZodTypeAny,
450
+ {
451
+ value: string;
452
+ label: string;
453
+ },
454
+ {
455
+ value: string;
456
+ label: string;
457
+ }
458
+ >;
459
+
460
+ declare type TagSelectOption = z.infer<typeof tagOptionSchema>;
461
+
462
+ export {};