-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathtypes.ts
290 lines (252 loc) · 6.41 KB
/
types.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
export type SanityAssetIdParts = SanityFileAssetIdParts | SanityImageAssetIdParts
export interface SanityFileAssetIdParts {
type: 'file'
assetId: string
extension: string
}
export type SanityImageAssetIdParts = {
type: 'image'
assetId: string
extension: string
width: number
height: number
}
export type SanityAssetSource = SanityFileSource | SanityImageSource
export type SanityFileSource =
| string
| SanityReference
| SanityFileAsset
| SanityAssetIdStub
| SanityAssetUrlStub
| SanityAssetPathStub
| SanityFileObjectStub
export type SanityImageSource =
| string
| SanityReference
| SanityImageAsset
| SanityAssetIdStub
| SanityAssetUrlStub
| SanityAssetPathStub
| SanityImageObjectStub
export type SanitySwatchName =
| 'darkMuted'
| 'darkVibrant'
| 'dominant'
| 'lightMuted'
| 'lightVibrant'
| 'muted'
| 'vibrant'
export interface Rectangle {
x: number
y: number
width: number
height: number
}
export interface AbsoluteRectangle {
top: number
left: number
right: number
bottom: number
}
export interface SanityProjectDetails {
projectId: string
dataset: string
}
export interface ImageUrlBuilderOptions {
assetId: string
extension: string
metadata: {
dimensions: {
width: number
height: number
}
}
}
export interface FileUrlBuilderOptions {
assetId: string
extension: string
}
export interface SanityReference {
_ref: string
_weak?: boolean
}
/**
* Checks whether or not the given source is a Sanity reference
* (an object containing _ref string key)
*
* @param ref - Possible reference
* @returns Whether or not the passed object is a reference
*/
export function isReference(ref: unknown): ref is SanityReference {
return isObject(ref) && typeof (ref as SanityReference)._ref === 'string'
}
export interface SanityAssetIdStub {
_id: string
}
/**
* Checks whether or not the given source is an asset ID stub
* (an object containing an `_id` property)
*
* @param stub - Possible asset id stub
* @returns Whether or not the passed object is an object id stub
*/
export function isAssetIdStub(stub: unknown): stub is SanityAssetIdStub {
return isObject(stub) && typeof (stub as SanityAssetIdStub)._id === 'string'
}
export interface SanityAssetPathStub {
path: string
}
/**
* Checks whether or not the given source is an asset path stub
* (an object containing a `path` property)
*
* @param stub - Possible asset path stub
* @returns Whether or not the passed object is an object path stub
*/
export function isAssetPathStub(stub: unknown): stub is SanityAssetPathStub {
return isObject(stub) && typeof (stub as SanityAssetPathStub).path === 'string'
}
export interface SanityAssetUrlStub {
url: string
}
/**
* Checks whether or not the given source is an asset URL stub
* (an object containing a `url` property)
*
* @param stub - Possible asset url stub
* @returns Whether or not the passed object is an object url stub
*/
export function isAssetUrlStub(stub: unknown): stub is SanityAssetUrlStub {
return isObject(stub) && typeof (stub as SanityAssetUrlStub).url === 'string'
}
export interface SanityAsset {
_id: string
_type: string
url: string
path: string
assetId: string
extension: string
originalFilename?: string
}
export type SanityImageAsset = SanityAsset & {
_type: 'sanity.imageAsset'
metadata: SanityImageMetadata
}
export type SanityFileAsset = SanityAsset & {
_type: 'sanity.fileAsset'
metadata: {[key: string]: unknown}
}
/**
* Checks whether or not the given source is a (partial) sanity file asset document.
* Only checks the `_type` property, all other properties _may_ be missing
*
* @param src - Source to check
* @returns Whether or not the given source is a file asset
*/
export function isSanityFileAsset(src: unknown): src is SanityFileAsset {
return isObject(src) && (src as SanityFileAsset)._type === 'sanity.fileAsset'
}
export interface SanityImageMetadata {
dimensions: SanityImageDimensions
lqip?: string
palette?: SanityImagePalette
[key: string]: unknown
}
export interface SanityImageSize {
height: number
width: number
}
export type SanityImageDimensions = SanityImageSize & {
aspectRatio: number
}
export interface SanityImageCrop {
_type?: string
left: number
bottom: number
right: number
top: number
}
export interface SanityImageHotspot {
_type?: string
width: number
height: number
x: number
y: number
}
export interface SanityFileObjectStub {
_type?: string
asset:
| SanityReference
| SanityFileAsset
| SanityAssetIdStub
| SanityAssetPathStub
| SanityAssetUrlStub
[key: string]: unknown
}
export interface SanityImageObjectStub {
_type?: string
asset:
| SanityReference
| SanityImageAsset
| SanityAssetIdStub
| SanityAssetPathStub
| SanityAssetUrlStub
crop?: SanityImageCrop
hotspot?: SanityImageHotspot
[key: string]: unknown
}
export interface ResolvedSanityImage {
_type?: string
asset: SanityImageAsset
crop: SanityImageCrop
hotspot: SanityImageHotspot
[key: string]: unknown
}
export interface ResolvedSanityFile {
_type?: string
asset: SanityFileAsset
[key: string]: unknown
}
export type SanityAssetObjectStub = SanityFileObjectStub | SanityImageObjectStub
/**
* Checks whether or not the given source is an asset object stub
*
* @param stub - Possible asset object stub
* @returns Whether or not the passed object is an object stub
*/
export function isAssetObjectStub(stub: unknown): stub is SanityAssetObjectStub {
const item = stub as SanityAssetObjectStub
return isObject(item) && item.asset && typeof item.asset === 'object'
}
export interface SanityImagePalette {
_type?: string
darkMuted?: SanityImageSwatch
darkVibrant?: SanityImageSwatch
dominant?: SanityImageSwatch
lightMuted?: SanityImageSwatch
lightVibrant?: SanityImageSwatch
muted?: SanityImageSwatch
vibrant?: SanityImageSwatch
[key: string]: unknown
}
export interface SanityImageSwatch {
background: string
foreground: string
population: number
title?: string
}
export interface SanityImageFitResult {
width?: number
height?: number
rect: Rectangle
}
/**
* Checks whether or not the passed object is an object (and not `null`)
*
* @param obj Item to check whether or not is an object
* @returns Whether or not `obj` is an object
* @internal
*/
export function isObject(obj: unknown): obj is object {
return obj !== null && !Array.isArray(obj) && typeof obj === 'object'
}