@sanity/sdk 2.14.1 → 2.16.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.
@@ -333,4 +333,40 @@ describe('sortReleases()', () => {
333
333
  expect(sorted[idx]['_id']).toContain(expectedName)
334
334
  })
335
335
  })
336
+
337
+ it('should not throw when a release has no metadata', () => {
338
+ // Releases created without a title/type can come back from the API with no
339
+ // `metadata` object at all. Sorting must not throw on these, otherwise the
340
+ // whole releases subscription errors and the list comes back empty.
341
+ const releaseWithoutMetadata = {
342
+ _id: '_.releases.rnometa',
343
+ _rev: 'rev',
344
+ _type: 'system.release',
345
+ _createdAt: '2024-10-24T00:00:00Z',
346
+ _updatedAt: '2024-10-24T00:00:00Z',
347
+ state: 'active',
348
+ name: 'rnometa',
349
+ } as unknown as ReleaseDocument
350
+
351
+ const releases: ReleaseDocument[] = [
352
+ createReleaseMock({
353
+ _id: '_.releases.rasap1',
354
+ _createdAt: '2024-10-25T00:00:00Z',
355
+ metadata: {releaseType: 'asap'},
356
+ }),
357
+ releaseWithoutMetadata,
358
+ createReleaseMock({
359
+ _id: '_.releases.rundecided1',
360
+ _createdAt: '2024-10-26T00:00:00Z',
361
+ metadata: {releaseType: 'undecided'},
362
+ }),
363
+ ]
364
+
365
+ let sorted: ReleaseDocument[] = []
366
+ expect(() => {
367
+ sorted = sortReleases(releases)
368
+ }).not.toThrow()
369
+ expect(sorted).toHaveLength(3)
370
+ expect(sorted.map((r) => r._id)).toContain('_.releases.rnometa')
371
+ })
336
372
  })
@@ -6,25 +6,30 @@ export function sortReleases(releases: ReleaseDocument[] = []): ReleaseDocument[
6
6
  // The order should always be:
7
7
  // [undecided (sortByCreatedAt), scheduled(sortBy publishAt || metadata.intendedPublishAt), asap(sortByCreatedAt)]
8
8
  return [...releases].sort((a, b) => {
9
+ // metadata is optional on a release document; guard against releases that
10
+ // have no metadata at all so sorting can't throw and wipe out the list.
11
+ const aType = a.metadata?.releaseType
12
+ const bType = b.metadata?.releaseType
13
+
9
14
  // undecided are always first, then by createdAt descending
10
- if (a.metadata.releaseType === 'undecided' && b.metadata.releaseType !== 'undecided') {
15
+ if (aType === 'undecided' && bType !== 'undecided') {
11
16
  return -1
12
17
  }
13
- if (a.metadata.releaseType !== 'undecided' && b.metadata.releaseType === 'undecided') {
18
+ if (aType !== 'undecided' && bType === 'undecided') {
14
19
  return 1
15
20
  }
16
- if (a.metadata.releaseType === 'undecided' && b.metadata.releaseType === 'undecided') {
21
+ if (aType === 'undecided' && bType === 'undecided') {
17
22
  // Sort by createdAt
18
23
  return new Date(b._createdAt).getTime() - new Date(a._createdAt).getTime()
19
24
  }
20
25
 
21
26
  // Scheduled are always at the middle, then by publishAt descending
22
- if (a.metadata.releaseType === 'scheduled' && b.metadata.releaseType === 'scheduled') {
23
- const aPublishAt = a['publishAt'] || a.metadata['intendedPublishAt']
27
+ if (aType === 'scheduled' && bType === 'scheduled') {
28
+ const aPublishAt = a['publishAt'] || a.metadata?.['intendedPublishAt']
24
29
  if (!aPublishAt) {
25
30
  return 1
26
31
  }
27
- const bPublishAt = b['publishAt'] || b.metadata['intendedPublishAt']
32
+ const bPublishAt = b['publishAt'] || b.metadata?.['intendedPublishAt']
28
33
  if (!bPublishAt) {
29
34
  return -1
30
35
  }
@@ -32,13 +37,13 @@ export function sortReleases(releases: ReleaseDocument[] = []): ReleaseDocument[
32
37
  }
33
38
 
34
39
  // ASAP are always last, then by createdAt descending
35
- if (a.metadata.releaseType === 'asap' && b.metadata.releaseType !== 'asap') {
40
+ if (aType === 'asap' && bType !== 'asap') {
36
41
  return 1
37
42
  }
38
- if (a.metadata.releaseType !== 'asap' && b.metadata.releaseType === 'asap') {
43
+ if (aType !== 'asap' && bType === 'asap') {
39
44
  return -1
40
45
  }
41
- if (a.metadata.releaseType === 'asap' && b.metadata.releaseType === 'asap') {
46
+ if (aType === 'asap' && bType === 'asap') {
42
47
  // Sort by createdAt
43
48
  return new Date(b._createdAt).getTime() - new Date(a._createdAt).getTime()
44
49
  }