@sanity/client 8.0.0 → 8.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.
Files changed (58) hide show
  1. package/README.md +265 -0
  2. package/dist/{browserUpload-CQgx9YYo.js → browserUpload-2tz6Sdqp.js} +4 -3
  3. package/dist/browserUpload-2tz6Sdqp.js.map +1 -0
  4. package/dist/{browserUpload-icWlVP15.js → browserUpload-CwpNx7Vl.js} +4 -3
  5. package/dist/browserUpload-CwpNx7Vl.js.map +1 -0
  6. package/dist/{config-a8VajuEY.js → config-3wiPP-sZ.js} +2 -2
  7. package/dist/config-3wiPP-sZ.js.map +1 -0
  8. package/dist/csm.js +2 -2
  9. package/dist/csm.js.map +1 -1
  10. package/dist/index.d.ts +17 -11
  11. package/dist/index.js +610 -136
  12. package/dist/index.js.map +1 -1
  13. package/dist/index.node.d.ts +918 -26
  14. package/dist/index.node.js +559 -66
  15. package/dist/index.node.js.map +1 -1
  16. package/dist/media-library.d.ts +1 -1
  17. package/dist/{request-CJxcN16k.js → request-BhMuKj0D.js} +10 -9
  18. package/dist/request-BhMuKj0D.js.map +1 -0
  19. package/dist/{request-k7VS_NnC.js → request-SnMg7nUX.js} +10 -9
  20. package/dist/request-SnMg7nUX.js.map +1 -0
  21. package/dist/{resolveEditInfo-sq7yF78q.js → resolveEditInfo-Cz-smq3a.js} +17 -3
  22. package/dist/resolveEditInfo-Cz-smq3a.js.map +1 -0
  23. package/dist/stega.js +1 -1
  24. package/dist/{stegaEncodeSourceMap-DkoIlutY.js → stegaEncodeSourceMap-DbM2fTN4.js} +8 -2
  25. package/dist/stegaEncodeSourceMap-DbM2fTN4.js.map +1 -0
  26. package/dist/{stegaEncodeSourceMap-B2fGArSf.js → stegaEncodeSourceMap-YR3NQ3iz.js} +2 -2
  27. package/dist/{stegaEncodeSourceMap-B2fGArSf.js.map → stegaEncodeSourceMap-YR3NQ3iz.js.map} +1 -1
  28. package/dist/{types-CUxZSgB2.d.ts → types-nJhm5Nyq.d.ts} +910 -24
  29. package/package.json +26 -11
  30. package/src/SanityClient.ts +39 -20
  31. package/src/assets/AssetsClient.ts +54 -5
  32. package/src/collaboration/CollaborationCommentsClient.ts +387 -0
  33. package/src/collaboration/comments.ts +313 -0
  34. package/src/collaboration/types.ts +252 -0
  35. package/src/csm/applySourceDocuments.ts +2 -4
  36. package/src/csm/draftUtils.ts +23 -4
  37. package/src/data/dataMethods.ts +9 -20
  38. package/src/data/eventsource.ts +71 -41
  39. package/src/data/listen.ts +20 -5
  40. package/src/data/live.ts +17 -9
  41. package/src/data/resolveEventSourceFetch.ts +9 -1
  42. package/src/defineCreateClient.ts +5 -1
  43. package/src/functions/FunctionsClient.ts +66 -0
  44. package/src/functions/invoke.ts +176 -0
  45. package/src/http/browserUpload.ts +1 -0
  46. package/src/http/errors.ts +2 -1
  47. package/src/http/request.ts +8 -14
  48. package/src/mediaLibrary/MediaLibraryVideoClient.ts +1 -1
  49. package/src/types.ts +420 -4
  50. package/src/validators.ts +1 -1
  51. package/src/warnings.ts +7 -1
  52. package/dist/browserUpload-CQgx9YYo.js.map +0 -1
  53. package/dist/browserUpload-icWlVP15.js.map +0 -1
  54. package/dist/config-a8VajuEY.js.map +0 -1
  55. package/dist/request-CJxcN16k.js.map +0 -1
  56. package/dist/request-k7VS_NnC.js.map +0 -1
  57. package/dist/resolveEditInfo-sq7yF78q.js.map +0 -1
  58. package/dist/stegaEncodeSourceMap-DkoIlutY.js.map +0 -1
package/src/types.ts CHANGED
@@ -1,13 +1,14 @@
1
1
  // deno-lint-ignore-file no-empty-interface
2
2
 
3
- import type {FetchFunction} from 'get-it'
3
+ import type {FetchFunction, RequestOptions as GetItRequestOptions} from 'get-it'
4
4
  import type {Observable} from 'rxjs'
5
5
 
6
6
  import type {InitializedStegaConfig, StegaConfig} from './stega/types'
7
7
 
8
8
  /**
9
- * Low-level requester returned by `defineHttpRequest`. Surfaces as
10
- * `client.config().requester` and as the named `requester` export.
9
+ * Low-level requester returned by `defineRequester(...).observable`.
10
+ * Surfaces as `client.config().requester` and as the named `requester`
11
+ * export.
11
12
  *
12
13
  * Defined locally rather than imported from `http/request` so api-extractor
13
14
  * inlines it into the bundled `.d.ts` instead of emitting a relative import
@@ -45,6 +46,30 @@ export interface RequestOptions {
45
46
  signal?: AbortSignal
46
47
  }
47
48
 
49
+ /**
50
+ * The fully resolved request passed to a {@link RequestHandler}.
51
+ *
52
+ * @public
53
+ */
54
+ export type RequestHandlerOptions = GetItRequestOptions
55
+
56
+ /**
57
+ * Intercepts a client request around the normal HTTP pipeline.
58
+ *
59
+ * Call `next(request)` to execute the request. It resolves to the parsed
60
+ * response body and rejects with the same errors the client normally exposes,
61
+ * including {@link ClientError} and {@link ServerError}. A handler can modify
62
+ * the request, retry it by calling `next` again, or return a synthetic body.
63
+ *
64
+ * Browser asset uploads and server-sent event connections do not use this handler.
65
+ *
66
+ * @public
67
+ */
68
+ export type RequestHandler = (
69
+ request: RequestHandlerOptions,
70
+ next: (request: RequestHandlerOptions) => Promise<unknown>,
71
+ ) => Promise<unknown>
72
+
48
73
  /**
49
74
  * @public
50
75
  * @deprecated – The `r`-prefix is not required, use `string` instead
@@ -159,6 +184,20 @@ export interface ClientConfig {
159
184
  */
160
185
  requestTagPrefix?: string
161
186
 
187
+ /**
188
+ * Intercepts requests after the client has resolved their URL, headers, and
189
+ * transport options. The handler wraps the normal client pipeline, so errors
190
+ * from `next` are already converted to {@link ClientError} or
191
+ * {@link ServerError}.
192
+ *
193
+ * A handler supplied through `withConfig()` replaces the current handler.
194
+ * To compose handlers, read the current handler from `client.config()` and
195
+ * call it from the replacement.
196
+ *
197
+ * Browser asset uploads and server-sent event connections are not intercepted.
198
+ */
199
+ requestHandler?: RequestHandler
200
+
162
201
  /**
163
202
  * Optional default headers to include with all requests
164
203
  *
@@ -256,6 +295,25 @@ export interface ClientConfig {
256
295
  * Lineage token for recursion control
257
296
  */
258
297
  lineage?: string
298
+ /**
299
+ * ID of the blueprints stack that `functions.invoke()` resolves function
300
+ * names against. Function names are unique within a stack
301
+ */
302
+ stackId?: string
303
+ /**
304
+ * ID of the organization owning the blueprints stack
305
+ */
306
+ organizationId?: string
307
+ /**
308
+ * Organization-scoped configuration for collaboration APIs.
309
+ *
310
+ * Currently this is used by `collaboration.comments` methods.
311
+ *
312
+ * @alpha
313
+ */
314
+ collaboration?: {
315
+ organizationId?: string
316
+ }
259
317
  }
260
318
 
261
319
  /** @public */
@@ -484,7 +542,7 @@ export interface ErrorProps {
484
542
  * @internal
485
543
  */
486
544
  export type HttpRequest = {
487
- (options: Any): Promise<unknown>
545
+ (options: Any, requestHandler?: RequestHandler): Promise<unknown>
488
546
  }
489
547
 
490
548
  /**
@@ -776,6 +834,15 @@ export type ReleaseAction =
776
834
  | DeleteReleaseAction
777
835
  | ImportReleaseAction
778
836
 
837
+ /**
838
+ * @public
839
+ * @beta
840
+ */
841
+ export type VariantDefinitionAction =
842
+ | CreateVariantDefinitionAction
843
+ | EditVariantDefinitionAction
844
+ | DeleteVariantDefinitionAction
845
+
779
846
  /** @public */
780
847
  export type VersionAction =
781
848
  | CreateVersionAction
@@ -783,6 +850,17 @@ export type VersionAction =
783
850
  | ReplaceVersionAction
784
851
  | UnpublishVersionAction
785
852
 
853
+ /**
854
+ * @public
855
+ * @beta
856
+ */
857
+ export type VariantAction =
858
+ | CreateVariantAction
859
+ | EditVariantAction
860
+ | DeleteVariantAction
861
+ | PublishVariantAction
862
+ | UnpublishVariantAction
863
+
786
864
  /** @public */
787
865
  export type Action =
788
866
  | CreateAction
@@ -793,7 +871,9 @@ export type Action =
793
871
  | PublishAction
794
872
  | UnpublishAction
795
873
  | VersionAction
874
+ | VariantAction
796
875
  | ReleaseAction
876
+ | VariantDefinitionAction
797
877
 
798
878
  /** @public */
799
879
  export type ImportReleaseAction =
@@ -951,6 +1031,285 @@ export interface UnpublishVersionAction {
951
1031
  publishedId: string
952
1032
  }
953
1033
 
1034
+ /**
1035
+ * Creates a variant of a document, either by supplying the full document
1036
+ * content, or the base ID of a document to copy.
1037
+ *
1038
+ * @public
1039
+ * @beta
1040
+ */
1041
+ export type CreateVariantAction = {
1042
+ actionType: 'sanity.action.document.variant.create'
1043
+
1044
+ /**
1045
+ * ID of the document group to create a variant in. Must be a published
1046
+ * document ID, without a `drafts.` or `versions.` prefix.
1047
+ */
1048
+ publishedId: string
1049
+
1050
+ /**
1051
+ * Name of the variant definition this document belongs to, as in
1052
+ * `_.variants.{variantName}`. Must be a bare name, not a full document ID.
1053
+ */
1054
+ variantId: string
1055
+
1056
+ /**
1057
+ * Source bundle: `'drafts'`, or a release id.
1058
+ *
1059
+ * Defaults to the published bundle.
1060
+ */
1061
+ bundleId?: 'drafts' | (string & {})
1062
+ } & (
1063
+ | {
1064
+ /**
1065
+ * The full document content. Requires a `_type` property.
1066
+ */
1067
+ document: SanityDocumentStub
1068
+ baseId?: never
1069
+ ifBaseRevisionId?: never
1070
+ }
1071
+ | {
1072
+ /**
1073
+ * ID of an existing document to copy the content from.
1074
+ */
1075
+ baseId: string
1076
+
1077
+ /**
1078
+ * When set, the action fails unless the current revision of the base
1079
+ * document matches this value.
1080
+ */
1081
+ ifBaseRevisionId?: string
1082
+ document?: never
1083
+ }
1084
+ )
1085
+
1086
+ /**
1087
+ * Modifies a variant version of a document by applying a patch.
1088
+ *
1089
+ * If no such variant document exists it is first created, by copying the
1090
+ * variant's published sibling, or the published document if the variant was
1091
+ * never published.
1092
+ *
1093
+ * @public
1094
+ * @beta
1095
+ */
1096
+ export interface EditVariantAction {
1097
+ actionType: 'sanity.action.document.variant.edit'
1098
+
1099
+ /**
1100
+ * ID of the document group the variant belongs to. Must be a published
1101
+ * document ID, without a `drafts.` or `versions.` prefix.
1102
+ */
1103
+ publishedId: string
1104
+
1105
+ /**
1106
+ * Name of the variant definition this document belongs to, as in
1107
+ * `_.variants.{variantName}`. Must be a bare name, not a full document ID.
1108
+ */
1109
+ variantId: string
1110
+
1111
+ /**
1112
+ * Source bundle: `'drafts'`, or a release id.
1113
+ *
1114
+ * Defaults to the published bundle.
1115
+ */
1116
+ bundleId?: 'drafts' | (string & {})
1117
+
1118
+ /**
1119
+ * Patch operations to apply.
1120
+ */
1121
+ patch: PatchOperations
1122
+ }
1123
+
1124
+ /**
1125
+ * Deletes a variant of a document.
1126
+ *
1127
+ * @public
1128
+ * @beta
1129
+ */
1130
+ export interface DeleteVariantAction {
1131
+ actionType: 'sanity.action.document.variant.delete'
1132
+
1133
+ /**
1134
+ * ID of the document group the variant belongs to. Must be a published
1135
+ * document ID, without a `drafts.` or `versions.` prefix.
1136
+ */
1137
+ publishedId: string
1138
+
1139
+ /**
1140
+ * Name of the variant definition this document belongs to, as in
1141
+ * `_.variants.{variantName}`. Must be a bare name, not a full document ID.
1142
+ */
1143
+ variantId: string
1144
+
1145
+ /**
1146
+ * Source bundle: `'drafts'`, or a release id.
1147
+ *
1148
+ * Defaults to the published bundle.
1149
+ */
1150
+ bundleId?: 'drafts' | (string & {})
1151
+
1152
+ /**
1153
+ * Delete document history.
1154
+ */
1155
+ purge?: boolean
1156
+ }
1157
+
1158
+ /**
1159
+ * Publishes a variant version of a document, replacing the published variant
1160
+ * and removing the source variant document.
1161
+ *
1162
+ * @public
1163
+ * @beta
1164
+ */
1165
+ export interface PublishVariantAction {
1166
+ actionType: 'sanity.action.document.variant.publish'
1167
+
1168
+ /**
1169
+ * ID of the document group the variant belongs to. Must be a published
1170
+ * document ID, without a `drafts.` or `versions.` prefix.
1171
+ */
1172
+ publishedId: string
1173
+
1174
+ /**
1175
+ * Name of the variant definition this document belongs to, as in
1176
+ * `_.variants.{variantName}`. Must be a bare name, not a full document ID.
1177
+ */
1178
+ variantId: string
1179
+
1180
+ /**
1181
+ * Bundle to publish from: `'drafts'`, or a release id.
1182
+ */
1183
+ bundleId: 'drafts' | (string & {})
1184
+
1185
+ /**
1186
+ * When set, publishing fails unless the current revision of the source
1187
+ * variant document matches this value.
1188
+ */
1189
+ ifVersionRevisionId?: string
1190
+
1191
+ /**
1192
+ * When set, publishing fails unless the current revision of the published
1193
+ * variant document matches this value.
1194
+ */
1195
+ ifPublishedVariantRevisionId?: string
1196
+ }
1197
+
1198
+ /**
1199
+ * Unpublishes a variant version of a document.
1200
+ *
1201
+ * By default the published variant is removed and preserved as a draft
1202
+ * variant. When a release id is given as the `bundleId`, the deletion is
1203
+ * instead staged in that release, and takes effect when it is published.
1204
+ *
1205
+ * @public
1206
+ * @beta
1207
+ */
1208
+ export interface UnpublishVariantAction {
1209
+ actionType: 'sanity.action.document.variant.unpublish'
1210
+
1211
+ /**
1212
+ * ID of the document group the variant belongs to. Must be a published
1213
+ * document ID, without a `drafts.` or `versions.` prefix.
1214
+ */
1215
+ publishedId: string
1216
+
1217
+ /**
1218
+ * Name of the variant definition this document belongs to, as in
1219
+ * `_.variants.{variantName}`. Must be a bare name, not a full document ID.
1220
+ */
1221
+ variantId: string
1222
+
1223
+ /**
1224
+ * The content release in which to stage the unpublish.
1225
+ *
1226
+ * By default, the currently published document is unpublished immediately.
1227
+ */
1228
+ bundleId?: string
1229
+ }
1230
+
1231
+ /**
1232
+ * Creates a new `system.variant` definition document.
1233
+ *
1234
+ * @public
1235
+ * @beta
1236
+ */
1237
+ export interface CreateVariantDefinitionAction {
1238
+ actionType: 'sanity.action.variant.definition.create'
1239
+
1240
+ /**
1241
+ * Name of the variant definition to create, as in
1242
+ * `_.variants.{variantName}`. Must be a bare name, not a full document ID.
1243
+ */
1244
+ variantId: string
1245
+
1246
+ /**
1247
+ * Conditions used to select this variant.
1248
+ */
1249
+ conditions?: ClientVariantConditions
1250
+
1251
+ /**
1252
+ * Selection priority. Higher values are preferred when multiple variants
1253
+ * match.
1254
+ *
1255
+ * Defaults to `0`.
1256
+ */
1257
+ priority?: number
1258
+
1259
+ metadata?: Record<string, Any>
1260
+ }
1261
+
1262
+ /**
1263
+ * Edits an existing variant definition.
1264
+ *
1265
+ * @public
1266
+ * @beta
1267
+ */
1268
+ export interface EditVariantDefinitionAction {
1269
+ actionType: 'sanity.action.variant.definition.edit'
1270
+
1271
+ /**
1272
+ * Name of the variant definition to edit, as in `_.variants.{variantName}`.
1273
+ * Must be a bare name, not a full document ID.
1274
+ */
1275
+ variantId: string
1276
+
1277
+ /**
1278
+ * Patch operations to apply.
1279
+ */
1280
+ patch: PatchOperations
1281
+
1282
+ /**
1283
+ * When set, the action fails unless the current revision of the variant
1284
+ * definition matches this value.
1285
+ */
1286
+ ifRevisionId?: string
1287
+ }
1288
+
1289
+ /**
1290
+ * Deletes a variant definition.
1291
+ *
1292
+ * Deletion fails if any document holds a strong reference to this variant.
1293
+ *
1294
+ * @public
1295
+ * @beta
1296
+ */
1297
+ export interface DeleteVariantDefinitionAction {
1298
+ actionType: 'sanity.action.variant.definition.delete'
1299
+
1300
+ /**
1301
+ * Name of the variant definition to delete, as in
1302
+ * `_.variants.{variantName}`. Must be a bare name, not a full document ID.
1303
+ */
1304
+ variantId: string
1305
+
1306
+ /**
1307
+ * When set, the action fails unless the current revision of the variant
1308
+ * definition matches this value.
1309
+ */
1310
+ ifRevisionId?: string
1311
+ }
1312
+
954
1313
  /**
955
1314
  * Creates a new draft document. The published version of the document must not already exist.
956
1315
  * If the draft version of the document already exists the action will fail by default, but
@@ -1938,6 +2297,22 @@ export type {
1938
2297
  TranslateTarget,
1939
2298
  TranslateTargetInclude,
1940
2299
  } from './agent/actions/translate'
2300
+ export type {InvokeFunctionEvent, InvokeFunctionRequest} from './functions/invoke'
2301
+ export type {
2302
+ CollaborationCommentCreate,
2303
+ CollaborationCommentDocument,
2304
+ CollaborationCommentMessage,
2305
+ CollaborationCommentPortableTextBlock,
2306
+ CollaborationCommentReactionShortName,
2307
+ CollaborationCommentSelection,
2308
+ CollaborationCommentsListenOptions,
2309
+ CollaborationCommentsRequestOptions,
2310
+ CollaborationCommentStatus,
2311
+ CollaborationCommentsWriteOptions,
2312
+ CollaborationCommentTarget,
2313
+ CollaborationCommentUpdate,
2314
+ CollaborationCommentRange,
2315
+ } from './collaboration/types'
1941
2316
  export type {
1942
2317
  ContentSourceMapParsedPath,
1943
2318
  ContentSourceMapParsedPathKeyedSegment,
@@ -2159,3 +2534,44 @@ export interface VideoPlaybackTokens {
2159
2534
 
2160
2535
  /** @public */
2161
2536
  export type MediaLibraryAssetInstanceIdentifier = string | SanityReference
2537
+
2538
+ /**
2539
+ * A single tracked version of a Media Library asset - one uploaded instance,
2540
+ * referencing the underlying (Content Lake shaped) asset document it wraps.
2541
+ *
2542
+ * @public
2543
+ */
2544
+ export interface MediaLibraryAssetVersion {
2545
+ _key: string
2546
+ _type: 'sanity.asset.version'
2547
+ title?: string
2548
+ instance: SanityReference
2549
+ }
2550
+
2551
+ /**
2552
+ * The document returned by the Media Library upload endpoint
2553
+ * (`POST /media-libraries/:id/upload`).
2554
+ *
2555
+ * This is _not_ the same shape as {@link SanityAssetDocument} /
2556
+ * {@link SanityImageAssetDocument}: a Media Library asset is a `sanity.asset`
2557
+ * document that tracks one or more uploaded versions, each pointing at its
2558
+ * own underlying Content Lake asset document via `currentVersion`/`versions`.
2559
+ *
2560
+ * Modelled directly on an observed API response. Fields whose full shape has
2561
+ * not been confirmed (`parent`, `rootDirectory`, `aspects`) are typed loosely
2562
+ * on purpose - widen them once their shape is confirmed.
2563
+ *
2564
+ * @public
2565
+ */
2566
+ export interface MediaLibraryAssetDocument {
2567
+ _id: string
2568
+ _type: 'sanity.asset'
2569
+ assetType: string
2570
+ title?: string
2571
+ cdnAccessPolicy?: string
2572
+ currentVersion: SanityReference
2573
+ versions: MediaLibraryAssetVersion[]
2574
+ aspects?: Record<string, Any>
2575
+ parent?: SanityReference | null
2576
+ rootDirectory?: Any
2577
+ }
package/src/validators.ts CHANGED
@@ -43,7 +43,7 @@ export const requireDocumentId = (op: string, doc: Record<string, Any>) => {
43
43
  validateDocumentId(op, doc._id)
44
44
  }
45
45
 
46
- export const validateDocumentType = (op: string, type: string) => {
46
+ const validateDocumentType = (op: string, type: string) => {
47
47
  if (typeof type !== 'string') {
48
48
  throw new Error(`\`${op}()\`: \`${type}\` is not a valid document type`)
49
49
  }
package/src/warnings.ts CHANGED
@@ -47,8 +47,14 @@ export const printNoDefaultExport = createWarningPrinter([
47
47
  'The default export of @sanity/client has been deprecated. Use the named export `createClient` instead.',
48
48
  ])
49
49
 
50
+ // Phrased as a condition rather than as a correction, because the client cannot
51
+ // tell the two cases apart. `baseId` creates a version of a document that
52
+ // already exists, so a caller creating a genuinely new document inside a release
53
+ // has no alternative to `document` - and the previous wording told them they had
54
+ // picked the wrong approach when they had not.
50
55
  export const printCreateVersionWithBaseIdWarning = createWarningPrinter([
51
- 'You have called `createVersion()` with a defined `document`. The recommended approach is to provide a `baseId` and `releaseId` instead.',
56
+ 'You have called `createVersion()` with a defined `document`.',
57
+ 'If you are creating a version of a document that already exists, prefer providing `baseId` and `releaseId` instead.',
52
58
  ])
53
59
 
54
60
  export const printDeprecatedUriOptionWarning = createWarningPrinter([
@@ -1 +0,0 @@
1
- {"version":3,"file":"browserUpload-CQgx9YYo.js","names":[],"sources":["../src/http/browserUpload.ts"],"sourcesContent":["import {createDebug} from 'obug'\nimport {Observable} from 'rxjs'\n\nimport type {UploadEvent} from '../types'\nimport {ClientError, httpResponseFromFetch, ServerError} from './errors'\nimport {parseJsonText} from './request'\n\nconst log = createDebug('sanity:client')\n\nlet nextRequestId = 1\n\n/**\n * Options for a browser-side asset upload that needs progress events.\n *\n * @internal\n */\nexport interface BrowserUploadOptions {\n url: string\n method: string\n headers: Record<string, string>\n body: unknown\n withCredentials: boolean\n /** Milliseconds before the upload is aborted; `false` and `0` both disable the timeout. */\n timeout?: number | false\n signal?: AbortSignal\n}\n\n/**\n * Run an asset upload through `XMLHttpRequest` so we can surface per-chunk\n * upload progress events. get-it v9 / fetch has no equivalent hook in the\n * browser, so the observable asset-upload API falls back to this path when\n * `XMLHttpRequest` is available.\n *\n * @internal\n */\nexport function uploadWithProgress<T>(options: BrowserUploadOptions): Observable<UploadEvent<T>> {\n return new Observable<UploadEvent<T>>((subscriber) => {\n const xhr = new XMLHttpRequest()\n const requestId = nextRequestId++\n const {url, method, headers, body, withCredentials, timeout, signal} = options\n\n log('[%d] %s %s (XHR upload with progress)', requestId, method, url)\n\n xhr.open(method, url)\n xhr.withCredentials = withCredentials\n if (typeof timeout === 'number' && timeout > 0) {\n xhr.timeout = timeout\n }\n\n for (const [key, value] of Object.entries(headers)) {\n xhr.setRequestHeader(key, value)\n }\n\n xhr.upload.onprogress = (e) => {\n subscriber.next({\n type: 'progress',\n stage: 'upload',\n percent: e.lengthComputable ? Math.round((e.loaded / e.total) * 100) : 0,\n total: e.total || undefined,\n loaded: e.loaded,\n lengthComputable: e.lengthComputable,\n })\n }\n\n xhr.onload = () => {\n log('[%d] %s %s — %d', requestId, method, url, xhr.status)\n\n if (xhr.status >= 400) {\n // Same typed errors as the fetch transport, so consumers can keep\n // detecting `ClientError`/`ServerError` and reading `statusCode`,\n // `responseBody` and the structured API `details` on failed uploads.\n const errorHeaders = parseXhrResponseHeaders(xhr.getAllResponseHeaders())\n const canonical = httpResponseFromFetch(\n {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: errorHeaders,\n body: parseJsonText(xhr.responseText, errorHeaders),\n },\n url,\n method,\n )\n subscriber.error(\n xhr.status >= 500 ? new ServerError(canonical) : new ClientError(canonical),\n )\n return\n }\n\n let responseBody: T\n try {\n responseBody = JSON.parse(xhr.responseText) as T\n } catch {\n subscriber.error(new Error('Failed to parse upload response as JSON'))\n return\n }\n\n subscriber.next({type: 'response', body: responseBody})\n subscriber.complete()\n }\n\n xhr.onerror = () => {\n log('[%d] %s %s — network error', requestId, method, url)\n subscriber.error(new Error('XHR upload network error'))\n }\n\n xhr.ontimeout = () => {\n log('[%d] %s %s — timed out after %dms', requestId, method, url, timeout)\n // Same error shape as the fetch transport's timeout rejection.\n subscriber.error(\n new DOMException(\n `The operation timed out after ${timeout}ms while attempting to reach ${url}`,\n 'TimeoutError',\n ),\n )\n }\n\n xhr.onabort = () => {\n subscriber.error(new DOMException('Upload aborted', 'AbortError'))\n }\n\n const onSignalAbort = () => xhr.abort()\n if (signal) {\n if (signal.aborted) {\n // `xhr.abort()` before `send()` fires no `abort` event per spec, so\n // error out directly instead of relying on `onabort`.\n subscriber.error(new DOMException('Upload aborted', 'AbortError'))\n return undefined\n }\n signal.addEventListener('abort', onSignalAbort, {once: true})\n }\n\n xhr.send(body as XMLHttpRequestBodyInit)\n\n // Unsubscribing cancels the in-flight upload, mirroring how the fetch\n // path aborts its request (`_observe`). After settle this is a no-op —\n // except for detaching from the caller's signal, which may be long-lived\n // and must not accumulate a listener per upload.\n return () => {\n signal?.removeEventListener('abort', onSignalAbort)\n xhr.abort()\n }\n })\n}\n\n/**\n * Parse `XMLHttpRequest.getAllResponseHeaders()` output (CRLF-separated\n * `name: value` lines) into a `Headers` instance.\n */\nfunction parseXhrResponseHeaders(raw: string): Headers {\n const headers = new Headers()\n for (const line of raw.split('\\r\\n')) {\n const separator = line.indexOf(':')\n if (separator <= 0) continue\n try {\n headers.append(line.slice(0, separator).trim(), line.slice(separator + 1).trim())\n } catch {\n // Skip header lines the Headers constructor rejects — better a partial\n // header record on the error than no error details at all.\n }\n }\n return headers\n}\n"],"mappings":";;;AAOA,MAAM,MAAM,YAAY,eAAe;AAEvC,IAAI,gBAAgB;;;;;;;;;AA0BpB,SAAgB,mBAAsB,SAA2D;CAC/F,OAAO,IAAI,YAA4B,eAAe;EACpD,IAAM,MAAM,IAAI,eAAe,GACzB,YAAY,iBACZ,EAAC,KAAK,QAAQ,SAAS,MAAM,iBAAiB,SAAS,WAAU;EAMvE,AAJA,IAAI,yCAAyC,WAAW,QAAQ,GAAG,GAEnE,IAAI,KAAK,QAAQ,GAAG,GACpB,IAAI,kBAAkB,iBAClB,OAAO,WAAY,YAAY,UAAU,MAC3C,IAAI,UAAU;EAGhB,KAAK,IAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,GAC/C,IAAI,iBAAiB,KAAK,KAAK;EAkEjC,AA/DA,IAAI,OAAO,cAAc,MAAM;GAC7B,WAAW,KAAK;IACd,MAAM;IACN,OAAO;IACP,SAAS,EAAE,mBAAmB,KAAK,MAAO,EAAE,SAAS,EAAE,QAAS,GAAG,IAAI;IACvE,OAAO,EAAE,SAAS,KAAA;IAClB,QAAQ,EAAE;IACV,kBAAkB,EAAE;GACtB,CAAC;EACH,GAEA,IAAI,eAAe;GAGjB,IAFA,IAAI,mBAAmB,WAAW,QAAQ,KAAK,IAAI,MAAM,GAErD,IAAI,UAAU,KAAK;IAIrB,IAAM,eAAe,wBAAwB,IAAI,sBAAsB,CAAC,GAClE,YAAY,sBAChB;KACE,QAAQ,IAAI;KACZ,YAAY,IAAI;KAChB,SAAS;KACT,MAAM,cAAc,IAAI,cAAc,YAAY;IACpD,GACA,KACA,MACF;IACA,WAAW,MACT,IAAI,UAAU,MAAM,IAAI,YAAY,SAAS,IAAI,IAAI,YAAY,SAAS,CAC5E;IACA;GACF;GAEA,IAAI;GACJ,IAAI;IACF,eAAe,KAAK,MAAM,IAAI,YAAY;GAC5C,QAAQ;IACN,WAAW,MAAM,gBAAI,MAAM,yCAAyC,CAAC;IACrE;GACF;GAGA,AADA,WAAW,KAAK;IAAC,MAAM;IAAY,MAAM;GAAY,CAAC,GACtD,WAAW,SAAS;EACtB,GAEA,IAAI,gBAAgB;GAElB,AADA,IAAI,8BAA8B,WAAW,QAAQ,GAAG,GACxD,WAAW,MAAM,gBAAI,MAAM,0BAA0B,CAAC;EACxD,GAEA,IAAI,kBAAkB;GAGpB,AAFA,IAAI,qCAAqC,WAAW,QAAQ,KAAK,OAAO,GAExE,WAAW,MACT,IAAI,aACF,iCAAiC,QAAQ,+BAA+B,OACxE,cACF,CACF;EACF,GAEA,IAAI,gBAAgB;GAClB,WAAW,MAAM,IAAI,aAAa,kBAAkB,YAAY,CAAC;EACnE;EAEA,IAAM,sBAAsB,IAAI,MAAM;EACtC,IAAI,QAAQ;GACV,IAAI,OAAO,SAAS;IAGlB,WAAW,MAAM,IAAI,aAAa,kBAAkB,YAAY,CAAC;IACjE;GACF;GACA,OAAO,iBAAiB,SAAS,eAAe,EAAC,MAAM,GAAI,CAAC;EAC9D;EAQA,OANA,IAAI,KAAK,IAA8B,SAM1B;GAEX,AADA,QAAQ,oBAAoB,SAAS,aAAa,GAClD,IAAI,MAAM;EACZ;CACF,CAAC;AACH;;;;;AAMA,SAAS,wBAAwB,KAAsB;CACrD,IAAM,UAAU,IAAI,QAAQ;CAC5B,KAAK,IAAM,QAAQ,IAAI,MAAM,MAAM,GAAG;EACpC,IAAM,YAAY,KAAK,QAAQ,GAAG;EAC9B,mBAAa,IACjB,IAAI;GACF,QAAQ,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC,CAAC,KAAK,GAAG,KAAK,MAAM,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;EAClF,QAAQ,CAGR;CACF;CACA,OAAO;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"browserUpload-icWlVP15.js","names":[],"sources":["../src/http/browserUpload.ts"],"sourcesContent":["import {createDebug} from 'obug'\nimport {Observable} from 'rxjs'\n\nimport type {UploadEvent} from '../types'\nimport {ClientError, httpResponseFromFetch, ServerError} from './errors'\nimport {parseJsonText} from './request'\n\nconst log = createDebug('sanity:client')\n\nlet nextRequestId = 1\n\n/**\n * Options for a browser-side asset upload that needs progress events.\n *\n * @internal\n */\nexport interface BrowserUploadOptions {\n url: string\n method: string\n headers: Record<string, string>\n body: unknown\n withCredentials: boolean\n /** Milliseconds before the upload is aborted; `false` and `0` both disable the timeout. */\n timeout?: number | false\n signal?: AbortSignal\n}\n\n/**\n * Run an asset upload through `XMLHttpRequest` so we can surface per-chunk\n * upload progress events. get-it v9 / fetch has no equivalent hook in the\n * browser, so the observable asset-upload API falls back to this path when\n * `XMLHttpRequest` is available.\n *\n * @internal\n */\nexport function uploadWithProgress<T>(options: BrowserUploadOptions): Observable<UploadEvent<T>> {\n return new Observable<UploadEvent<T>>((subscriber) => {\n const xhr = new XMLHttpRequest()\n const requestId = nextRequestId++\n const {url, method, headers, body, withCredentials, timeout, signal} = options\n\n log('[%d] %s %s (XHR upload with progress)', requestId, method, url)\n\n xhr.open(method, url)\n xhr.withCredentials = withCredentials\n if (typeof timeout === 'number' && timeout > 0) {\n xhr.timeout = timeout\n }\n\n for (const [key, value] of Object.entries(headers)) {\n xhr.setRequestHeader(key, value)\n }\n\n xhr.upload.onprogress = (e) => {\n subscriber.next({\n type: 'progress',\n stage: 'upload',\n percent: e.lengthComputable ? Math.round((e.loaded / e.total) * 100) : 0,\n total: e.total || undefined,\n loaded: e.loaded,\n lengthComputable: e.lengthComputable,\n })\n }\n\n xhr.onload = () => {\n log('[%d] %s %s — %d', requestId, method, url, xhr.status)\n\n if (xhr.status >= 400) {\n // Same typed errors as the fetch transport, so consumers can keep\n // detecting `ClientError`/`ServerError` and reading `statusCode`,\n // `responseBody` and the structured API `details` on failed uploads.\n const errorHeaders = parseXhrResponseHeaders(xhr.getAllResponseHeaders())\n const canonical = httpResponseFromFetch(\n {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: errorHeaders,\n body: parseJsonText(xhr.responseText, errorHeaders),\n },\n url,\n method,\n )\n subscriber.error(\n xhr.status >= 500 ? new ServerError(canonical) : new ClientError(canonical),\n )\n return\n }\n\n let responseBody: T\n try {\n responseBody = JSON.parse(xhr.responseText) as T\n } catch {\n subscriber.error(new Error('Failed to parse upload response as JSON'))\n return\n }\n\n subscriber.next({type: 'response', body: responseBody})\n subscriber.complete()\n }\n\n xhr.onerror = () => {\n log('[%d] %s %s — network error', requestId, method, url)\n subscriber.error(new Error('XHR upload network error'))\n }\n\n xhr.ontimeout = () => {\n log('[%d] %s %s — timed out after %dms', requestId, method, url, timeout)\n // Same error shape as the fetch transport's timeout rejection.\n subscriber.error(\n new DOMException(\n `The operation timed out after ${timeout}ms while attempting to reach ${url}`,\n 'TimeoutError',\n ),\n )\n }\n\n xhr.onabort = () => {\n subscriber.error(new DOMException('Upload aborted', 'AbortError'))\n }\n\n const onSignalAbort = () => xhr.abort()\n if (signal) {\n if (signal.aborted) {\n // `xhr.abort()` before `send()` fires no `abort` event per spec, so\n // error out directly instead of relying on `onabort`.\n subscriber.error(new DOMException('Upload aborted', 'AbortError'))\n return undefined\n }\n signal.addEventListener('abort', onSignalAbort, {once: true})\n }\n\n xhr.send(body as XMLHttpRequestBodyInit)\n\n // Unsubscribing cancels the in-flight upload, mirroring how the fetch\n // path aborts its request (`_observe`). After settle this is a no-op —\n // except for detaching from the caller's signal, which may be long-lived\n // and must not accumulate a listener per upload.\n return () => {\n signal?.removeEventListener('abort', onSignalAbort)\n xhr.abort()\n }\n })\n}\n\n/**\n * Parse `XMLHttpRequest.getAllResponseHeaders()` output (CRLF-separated\n * `name: value` lines) into a `Headers` instance.\n */\nfunction parseXhrResponseHeaders(raw: string): Headers {\n const headers = new Headers()\n for (const line of raw.split('\\r\\n')) {\n const separator = line.indexOf(':')\n if (separator <= 0) continue\n try {\n headers.append(line.slice(0, separator).trim(), line.slice(separator + 1).trim())\n } catch {\n // Skip header lines the Headers constructor rejects — better a partial\n // header record on the error than no error details at all.\n }\n }\n return headers\n}\n"],"mappings":";;;AAOA,MAAM,MAAM,YAAY,eAAe;AAEvC,IAAI,gBAAgB;;;;;;;;;AA0BpB,SAAgB,mBAAsB,SAA2D;CAC/F,OAAO,IAAI,YAA4B,eAAe;EACpD,IAAM,MAAM,IAAI,eAAe,GACzB,YAAY,iBACZ,EAAC,KAAK,QAAQ,SAAS,MAAM,iBAAiB,SAAS,WAAU;EAMvE,AAJA,IAAI,yCAAyC,WAAW,QAAQ,GAAG,GAEnE,IAAI,KAAK,QAAQ,GAAG,GACpB,IAAI,kBAAkB,iBAClB,OAAO,WAAY,YAAY,UAAU,MAC3C,IAAI,UAAU;EAGhB,KAAK,IAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,GAC/C,IAAI,iBAAiB,KAAK,KAAK;EAkEjC,AA/DA,IAAI,OAAO,cAAc,MAAM;GAC7B,WAAW,KAAK;IACd,MAAM;IACN,OAAO;IACP,SAAS,EAAE,mBAAmB,KAAK,MAAO,EAAE,SAAS,EAAE,QAAS,GAAG,IAAI;IACvE,OAAO,EAAE,SAAS,KAAA;IAClB,QAAQ,EAAE;IACV,kBAAkB,EAAE;GACtB,CAAC;EACH,GAEA,IAAI,eAAe;GAGjB,IAFA,IAAI,mBAAmB,WAAW,QAAQ,KAAK,IAAI,MAAM,GAErD,IAAI,UAAU,KAAK;IAIrB,IAAM,eAAe,wBAAwB,IAAI,sBAAsB,CAAC,GAClE,YAAY,sBAChB;KACE,QAAQ,IAAI;KACZ,YAAY,IAAI;KAChB,SAAS;KACT,MAAM,cAAc,IAAI,cAAc,YAAY;IACpD,GACA,KACA,MACF;IACA,WAAW,MACT,IAAI,UAAU,MAAM,IAAI,YAAY,SAAS,IAAI,IAAI,YAAY,SAAS,CAC5E;IACA;GACF;GAEA,IAAI;GACJ,IAAI;IACF,eAAe,KAAK,MAAM,IAAI,YAAY;GAC5C,QAAQ;IACN,WAAW,MAAM,gBAAI,MAAM,yCAAyC,CAAC;IACrE;GACF;GAGA,AADA,WAAW,KAAK;IAAC,MAAM;IAAY,MAAM;GAAY,CAAC,GACtD,WAAW,SAAS;EACtB,GAEA,IAAI,gBAAgB;GAElB,AADA,IAAI,8BAA8B,WAAW,QAAQ,GAAG,GACxD,WAAW,MAAM,gBAAI,MAAM,0BAA0B,CAAC;EACxD,GAEA,IAAI,kBAAkB;GAGpB,AAFA,IAAI,qCAAqC,WAAW,QAAQ,KAAK,OAAO,GAExE,WAAW,MACT,IAAI,aACF,iCAAiC,QAAQ,+BAA+B,OACxE,cACF,CACF;EACF,GAEA,IAAI,gBAAgB;GAClB,WAAW,MAAM,IAAI,aAAa,kBAAkB,YAAY,CAAC;EACnE;EAEA,IAAM,sBAAsB,IAAI,MAAM;EACtC,IAAI,QAAQ;GACV,IAAI,OAAO,SAAS;IAGlB,WAAW,MAAM,IAAI,aAAa,kBAAkB,YAAY,CAAC;IACjE;GACF;GACA,OAAO,iBAAiB,SAAS,eAAe,EAAC,MAAM,GAAI,CAAC;EAC9D;EAQA,OANA,IAAI,KAAK,IAA8B,SAM1B;GAEX,AADA,QAAQ,oBAAoB,SAAS,aAAa,GAClD,IAAI,MAAM;EACZ;CACF,CAAC;AACH;;;;;AAMA,SAAS,wBAAwB,KAAsB;CACrD,IAAM,UAAU,IAAI,QAAQ;CAC5B,KAAK,IAAM,QAAQ,IAAI,MAAM,MAAM,GAAG;EACpC,IAAM,YAAY,KAAK,QAAQ,GAAG;EAC9B,mBAAa,IACjB,IAAI;GACF,QAAQ,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC,CAAC,KAAK,GAAG,KAAK,MAAM,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;EAClF,QAAQ,CAGR;CACF;CACA,OAAO;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-a8VajuEY.js","names":["resourceConfig","validate.requestTag"],"sources":["../src/generateHelpUrl.ts","../src/validators.ts","../src/util/once.ts","../src/warnings.ts","../src/config.ts"],"sourcesContent":["const BASE_URL = 'https://www.sanity.io/help/'\n\nexport function generateHelpUrl(slug: string) {\n return BASE_URL + slug\n}\n","import type {Any, InitializedClientConfig, SanityDocumentStub} from './types'\n\nconst VALID_ASSET_TYPES = ['image', 'file']\nconst VALID_INSERT_LOCATIONS = ['before', 'after', 'replace']\n\nexport const dataset = (name: string) => {\n if (!/^(~[a-z0-9]{1}[-\\w]{0,63}|[a-z0-9]{1}[-\\w]{0,63})$/.test(name)) {\n throw new Error(\n 'Datasets can only contain lowercase characters, numbers, underscores and dashes, and start with tilde, and be maximum 64 characters',\n )\n }\n}\n\nexport const projectId = (id: string) => {\n if (!/^[-a-z0-9]+$/i.test(id)) {\n throw new Error('`projectId` can only contain only a-z, 0-9 and dashes')\n }\n}\n\nexport const validateAssetType = (type: string) => {\n if (VALID_ASSET_TYPES.indexOf(type) === -1) {\n throw new Error(`Invalid asset type: ${type}. Must be one of ${VALID_ASSET_TYPES.join(', ')}`)\n }\n}\n\nexport const validateObject = (op: string, val: Any) => {\n if (val === null || typeof val !== 'object' || Array.isArray(val)) {\n throw new Error(`${op}() takes an object of properties`)\n }\n}\n\nexport const validateDocumentId = (op: string, id: string) => {\n if (typeof id !== 'string' || !/^[a-z0-9_][a-z0-9_.-]{0,127}$/i.test(id) || id.includes('..')) {\n throw new Error(`${op}(): \"${id}\" is not a valid document ID`)\n }\n}\n\nexport const requireDocumentId = (op: string, doc: Record<string, Any>) => {\n if (!doc._id) {\n throw new Error(`${op}() requires that the document contains an ID (\"_id\" property)`)\n }\n\n validateDocumentId(op, doc._id)\n}\n\nexport const validateDocumentType = (op: string, type: string) => {\n if (typeof type !== 'string') {\n throw new Error(`\\`${op}()\\`: \\`${type}\\` is not a valid document type`)\n }\n}\n\nexport const requireDocumentType = (op: string, doc: Record<string, Any>) => {\n if (!doc._type) {\n throw new Error(`\\`${op}()\\` requires that the document contains a type (\\`_type\\` property)`)\n }\n\n validateDocumentType(op, doc._type)\n}\n\nexport const validateVersionIdMatch = (builtVersionId: string, document: SanityDocumentStub) => {\n if (document._id && document._id !== builtVersionId) {\n throw new Error(\n `The provided document ID (\\`${document._id}\\`) does not match the generated version ID (\\`${builtVersionId}\\`)`,\n )\n }\n}\n\nexport const validateInsert = (at: string, selector: string, items: Any[]) => {\n const signature = 'insert(at, selector, items)'\n if (VALID_INSERT_LOCATIONS.indexOf(at) === -1) {\n const valid = VALID_INSERT_LOCATIONS.map((loc) => `\"${loc}\"`).join(', ')\n throw new Error(`${signature} takes an \"at\"-argument which is one of: ${valid}`)\n }\n\n if (typeof selector !== 'string') {\n throw new Error(`${signature} takes a \"selector\"-argument which must be a string`)\n }\n\n if (!Array.isArray(items)) {\n throw new Error(`${signature} takes an \"items\"-argument which must be an array`)\n }\n}\n\nexport const hasDataset = (config: InitializedClientConfig): string => {\n // Check if dataset is directly on the config\n if (config.dataset) {\n return config.dataset\n }\n\n // Check if dataset is in resource configuration\n // Note: ~experimental_resource is normalized to resource during client initialization\n const resource = config.resource\n if (resource && resource.type === 'dataset') {\n const segments = resource.id.split('.')\n if (segments.length !== 2) {\n throw new Error('Dataset resource ID must be in the format \"project.dataset\"')\n }\n return segments[1]\n }\n\n throw new Error('`dataset` must be provided to perform queries')\n}\n\nexport const requestTag = (tag: string) => {\n if (typeof tag !== 'string' || !/^[a-z0-9._-]{1,75}$/i.test(tag)) {\n throw new Error(\n `Tag can only contain alphanumeric characters, underscores, dashes and dots, and be between one and 75 characters long.`,\n )\n }\n\n return tag\n}\n\nexport const resourceConfig = (config: InitializedClientConfig): void => {\n // Note: ~experimental_resource is normalized to resource during client initialization\n const resource = config.resource\n if (!resource) {\n throw new Error('`resource` must be provided to perform resource queries')\n }\n const {type, id} = resource\n\n switch (type) {\n case 'dataset': {\n const segments = id.split('.')\n if (segments.length !== 2) {\n throw new Error('Dataset resource ID must be in the format \"project.dataset\"')\n }\n return\n }\n case 'dashboard':\n case 'media-library':\n case 'canvas': {\n return\n }\n default:\n // @ts-expect-error - handle all supported resource types\n throw new Error(`Unsupported resource type: ${type.toString()}`)\n }\n}\n\nexport const resourceGuard = (service: string, config: InitializedClientConfig): void => {\n // Note: ~experimental_resource is normalized to resource during client initialization\n const resource = config.resource\n if (resource) {\n throw new Error(`\\`${service}\\` does not support resource-based operations`)\n }\n}\n","import type {Any} from '../types'\n\nexport function once(fn: Any) {\n let didCall = false\n let returnValue: Any\n return (...args: Any[]) => {\n if (didCall) {\n return returnValue\n }\n returnValue = fn(...args)\n didCall = true\n return returnValue\n }\n}\n","import {generateHelpUrl} from './generateHelpUrl'\nimport {type Any} from './types'\nimport {once} from './util/once'\n\nconst createWarningPrinter = (message: string[]) =>\n // oxlint-disable-next-line no-console\n once((...args: Any[]) => console.warn(message.join(' '), ...args))\n\nexport const printCdnAndWithCredentialsWarning = createWarningPrinter([\n `Because you set \\`withCredentials\\` to true, we will override your \\`useCdn\\``,\n `setting to be false since (cookie-based) credentials are never set on the CDN`,\n])\n\nexport const printCdnWarning = createWarningPrinter([\n `Since you haven't set a value for \\`useCdn\\`, we will deliver content using our`,\n `global, edge-cached API-CDN. If you wish to have content delivered faster, set`,\n `\\`useCdn: false\\` to use the Live API. Note: You may incur higher costs using the live API.`,\n])\n\nexport const printCdnPreviewDraftsWarning = createWarningPrinter([\n `The Sanity client is configured with the \\`perspective\\` set to \\`drafts\\` or \\`previewDrafts\\`, which doesn't support the API-CDN.`,\n `The Live API will be used instead. Set \\`useCdn: false\\` in your configuration to hide this warning.`,\n])\n\nexport const printPreviewDraftsDeprecationWarning = createWarningPrinter([\n `The \\`previewDrafts\\` perspective has been renamed to \\`drafts\\` and will be removed in a future API version`,\n])\n\nexport const printBrowserTokenWarning = createWarningPrinter([\n 'You have configured Sanity client to use a token in the browser. This may cause unintentional security issues.',\n `See ${generateHelpUrl(\n 'js-client-browser-token',\n )} for more information and how to hide this warning.`,\n])\n\nexport const printCredentialedTokenWarning = createWarningPrinter([\n 'You have configured Sanity client to use a token, but also provided `withCredentials: true`.',\n 'This is no longer supported - only token will be used - remove `withCredentials: true`.',\n])\n\nexport const printNoApiVersionSpecifiedWarning = createWarningPrinter([\n 'Using the Sanity client without specifying an API version is deprecated.',\n `See ${generateHelpUrl('js-client-api-version')}`,\n])\n\nexport const printNoDefaultExport = createWarningPrinter([\n 'The default export of @sanity/client has been deprecated. Use the named export `createClient` instead.',\n])\n\nexport const printCreateVersionWithBaseIdWarning = createWarningPrinter([\n 'You have called `createVersion()` with a defined `document`. The recommended approach is to provide a `baseId` and `releaseId` instead.',\n])\n\nexport const printDeprecatedUriOptionWarning = createWarningPrinter([\n 'The `uri` request option has been renamed to `url`.',\n 'Please update your code to use `url` instead. Support for `uri` will be removed in a future version.',\n])\n\nexport const printDeprecatedResourceConfigWarning = createWarningPrinter([\n 'The `~experimental_resource` configuration property has been renamed to `resource`.',\n 'Please update your client configuration to use `resource` instead. Support for `~experimental_resource` will be removed in a future version.',\n])\n","import {generateHelpUrl} from './generateHelpUrl'\nimport type {ClientConfig, ClientPerspective, InitializedClientConfig} from './types'\nimport * as validate from './validators'\nimport * as warnings from './warnings'\n\nconst defaultCdnHost = 'apicdn.sanity.io'\nexport const defaultConfig = {\n apiHost: 'https://api.sanity.io',\n apiVersion: '1',\n useProjectHostname: true,\n stega: {enabled: false},\n} satisfies ClientConfig\n\nconst LOCALHOSTS = ['localhost', '127.0.0.1', '0.0.0.0']\nconst isLocal = (host: string) => LOCALHOSTS.indexOf(host) !== -1\n\nfunction validateApiVersion(apiVersion: string) {\n if (apiVersion === '1' || apiVersion === 'X') {\n return\n }\n\n const apiDate = new Date(apiVersion)\n const apiVersionValid =\n /^\\d{4}-\\d{2}-\\d{2}$/.test(apiVersion) && apiDate instanceof Date && apiDate.getTime() > 0\n\n if (!apiVersionValid) {\n throw new Error('Invalid API version string, expected `1` or date in format `YYYY-MM-DD`')\n }\n}\n\n/**\n * @internal - it may have breaking changes in any release\n */\nexport function validateApiPerspective(\n perspective: unknown,\n): asserts perspective is ClientPerspective {\n if (Array.isArray(perspective) && perspective.length > 1 && perspective.includes('raw')) {\n throw new TypeError(\n `Invalid API perspective value: \"raw\". The raw-perspective can not be combined with other perspectives`,\n )\n }\n}\n\nexport const initConfig = (\n config: Partial<ClientConfig>,\n prevConfig: Partial<ClientConfig>,\n): InitializedClientConfig => {\n const specifiedConfig = {\n ...prevConfig,\n ...config,\n stega: {\n ...(typeof prevConfig.stega === 'boolean'\n ? {enabled: prevConfig.stega}\n : prevConfig.stega || defaultConfig.stega),\n ...(typeof config.stega === 'boolean' ? {enabled: config.stega} : config.stega || {}),\n },\n }\n if (!specifiedConfig.apiVersion) {\n warnings.printNoApiVersionSpecifiedWarning()\n }\n\n const newConfig = {\n ...defaultConfig,\n ...specifiedConfig,\n } as InitializedClientConfig\n\n // Normalize resource configuration - prefer `resource` over deprecated `~experimental_resource`\n if (newConfig['~experimental_resource'] && !newConfig.resource) {\n warnings.printDeprecatedResourceConfigWarning()\n newConfig.resource = newConfig['~experimental_resource']\n }\n\n const resourceConfig = newConfig.resource\n const projectBased = newConfig.useProjectHostname && !resourceConfig\n\n if (typeof Promise === 'undefined') {\n const helpUrl = generateHelpUrl('js-client-promise-polyfill')\n throw new Error(`No native Promise-implementation found, polyfill needed - see ${helpUrl}`)\n }\n\n if (projectBased && !newConfig.projectId) {\n throw new Error('Configuration must contain `projectId`')\n }\n\n if (resourceConfig) {\n validate.resourceConfig(newConfig)\n }\n\n if (typeof newConfig.perspective !== 'undefined') {\n validateApiPerspective(newConfig.perspective)\n }\n\n if ('encodeSourceMap' in newConfig) {\n throw new Error(\n `It looks like you're using options meant for '@sanity/preview-kit/client'. 'encodeSourceMap' is not supported in '@sanity/client'. Did you mean 'stega.enabled'?`,\n )\n }\n if ('encodeSourceMapAtPath' in newConfig) {\n throw new Error(\n `It looks like you're using options meant for '@sanity/preview-kit/client'. 'encodeSourceMapAtPath' is not supported in '@sanity/client'. Did you mean 'stega.filter'?`,\n )\n }\n if (typeof newConfig.stega.enabled !== 'boolean') {\n throw new Error(`stega.enabled must be a boolean, received ${newConfig.stega.enabled}`)\n }\n if (newConfig.stega.enabled && newConfig.stega.studioUrl === undefined) {\n throw new Error(`stega.studioUrl must be defined when stega.enabled is true`)\n }\n if (\n newConfig.stega.enabled &&\n typeof newConfig.stega.studioUrl !== 'string' &&\n typeof newConfig.stega.studioUrl !== 'function'\n ) {\n throw new Error(\n `stega.studioUrl must be a string or a function, received ${newConfig.stega.studioUrl}`,\n )\n }\n\n const isBrowser = typeof window !== 'undefined' && window.location && window.location.hostname\n const isLocalhost = isBrowser && isLocal(window.location.hostname)\n\n const hasToken = Boolean(newConfig.token)\n if (newConfig.withCredentials && hasToken) {\n warnings.printCredentialedTokenWarning()\n newConfig.withCredentials = false\n }\n\n if (isBrowser && isLocalhost && hasToken && newConfig.ignoreBrowserTokenWarning !== true) {\n warnings.printBrowserTokenWarning()\n } else if (typeof newConfig.useCdn === 'undefined') {\n warnings.printCdnWarning()\n }\n\n if (projectBased) {\n validate.projectId(newConfig.projectId!)\n }\n\n if (newConfig.dataset) {\n validate.dataset(newConfig.dataset)\n }\n\n if ('requestTagPrefix' in newConfig) {\n // Allow setting and unsetting request tag prefix\n newConfig.requestTagPrefix = newConfig.requestTagPrefix\n ? validate.requestTag(newConfig.requestTagPrefix).replace(/\\.+$/, '')\n : undefined\n }\n\n newConfig.apiVersion = `${newConfig.apiVersion}`.replace(/^v/, '')\n newConfig.isDefaultApi = newConfig.apiHost === defaultConfig.apiHost\n\n if (newConfig.useCdn === true && newConfig.withCredentials) {\n warnings.printCdnAndWithCredentialsWarning()\n }\n\n // If `useCdn` is undefined, we treat it as `true`\n newConfig.useCdn = newConfig.useCdn !== false && !newConfig.withCredentials\n\n validateApiVersion(newConfig.apiVersion)\n\n const hostParts = newConfig.apiHost.split('://', 2)\n const protocol = hostParts[0]\n const host = hostParts[1]\n const cdnHost = newConfig.isDefaultApi ? defaultCdnHost : host\n\n if (projectBased) {\n newConfig.url = `${protocol}://${newConfig.projectId}.${host}/v${newConfig.apiVersion}`\n newConfig.cdnUrl = `${protocol}://${newConfig.projectId}.${cdnHost}/v${newConfig.apiVersion}`\n } else {\n newConfig.url = `${newConfig.apiHost}/v${newConfig.apiVersion}`\n newConfig.cdnUrl = newConfig.url\n }\n\n return newConfig\n}\n"],"mappings":"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"}