From f7eb4b3a653702d07cd1263b732ba9d0757cd285 Mon Sep 17 00:00:00 2001 From: Espen Hovlandsdal Date: Thu, 15 Dec 2022 13:01:45 -0800 Subject: [PATCH] feat(core): add new `documentIdEquals` utility method --- .../sanity/src/core/util/draftUtils.test.ts | 16 ++++++++++++- packages/sanity/src/core/util/draftUtils.ts | 23 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/packages/sanity/src/core/util/draftUtils.test.ts b/packages/sanity/src/core/util/draftUtils.test.ts index b42eebcc41e..5737e55e60e 100644 --- a/packages/sanity/src/core/util/draftUtils.test.ts +++ b/packages/sanity/src/core/util/draftUtils.test.ts @@ -1,5 +1,5 @@ import {SanityDocument} from '@sanity/types' -import {collate, removeDupes} from './draftUtils' +import {collate, documentIdEquals, removeDupes} from './draftUtils' test('collate()', () => { const foo = {_type: 'foo', _id: 'foo'} @@ -22,3 +22,17 @@ test('removeDupes()', () => { expect(removeDupes([foo, fooDraft, barDraft, baz])).toEqual([fooDraft, barDraft, baz]) }) + +test.each([ + ['full equality, published', 'agot', 'agot', true], + ['full equality, drafts', 'drafts.agot', 'drafts.agot', true], + ['lhs draft, rhs published', 'drafts.agot', 'agot', true], + ['rhs draft, lhs published', 'agot', 'drafts.agot', true], + ['differing documents', 'agot', 'adwd', false], + ['differing documents, draft lhs', 'drafts.agot', 'adwd', false], + ['differing documents, draft rhs', 'agot', 'drafts.adwd', false], + ['lhs non-draft prefix, otherwise equality', 'notes.agot', 'agot', false], + ['rhs non-draft prefix, otherwise equality', 'agot', 'notes.agot', false], +])('documentIdEquals(): %s', (_, documentId, equalsDocumentId, shouldEqual) => { + expect(documentIdEquals(documentId, equalsDocumentId)).toEqual(shouldEqual) +}) diff --git a/packages/sanity/src/core/util/draftUtils.ts b/packages/sanity/src/core/util/draftUtils.ts index abcf9ad9e7a..b436cc142a4 100644 --- a/packages/sanity/src/core/util/draftUtils.ts +++ b/packages/sanity/src/core/util/draftUtils.ts @@ -15,6 +15,29 @@ export type PublishedId = Opaque export const DRAFTS_FOLDER = 'drafts' const DRAFTS_PREFIX = `${DRAFTS_FOLDER}.` +/** + * Checks if the document ID `documentId` has the same ID as `equalsDocumentId`, + * if you discard the draft status of the given IDs. Examples: + * + * @example + * Draft vs published document ID, but representing the same document: + * ``` + * // Prints "true": + * console.log(documentIdEquals('drafts.agot', 'agot')); + * ``` + * @example + * Different documents: + * ``` + * // Prints "false": + * console.log(documentIdEquals('hp-tcos', 'hp-hbp')); + * ``` + * + * @public + */ +export function documentIdEquals(documentId: string, equalsDocumentId: string): boolean { + return getPublishedId(documentId) === getPublishedId(equalsDocumentId) +} + /** @internal */ export function isDraft(document: SanityDocument): boolean { return isDraftId(document._id)