Skip to content

Commit

Permalink
feat(sanity): move perspective resolution to resolvePerspective fun…
Browse files Browse the repository at this point in the history
…ction
  • Loading branch information
juice49 committed Sep 13, 2024
1 parent d774601 commit 1eac625
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {type CommandListHandle} from '../../../../../../components'
import {useSchema} from '../../../../../../hooks'
import {type SearchTerms} from '../../../../../../search'
import {useCurrentUser} from '../../../../../../store'
import {resolvePerspective} from '../../../../../../util/resolvePerspective'
import {useSource} from '../../../../../source'
import {SEARCH_LIMIT} from '../../constants'
import {type RecentSearch} from '../../datastores/recentSearches'
Expand Down Expand Up @@ -142,10 +143,9 @@ export function SearchProvider({children, fullscreen}: SearchProviderProps) {
skipSortByScore: ordering.ignoreScore,
...(ordering.sort ? {sort: [ordering.sort]} : {}),
cursor: cursor || undefined,
perspective: omitBundlePerspective(perspective),
bundlePerspective: perspective?.startsWith('bundle.')
? [perspective.split('bundle.').at(1), DRAFTS_FOLDER].join(',')
: undefined,
...resolvePerspective(perspective, (perspectives, isSystemPerspective) =>
isSystemPerspective ? perspectives : perspectives.concat(DRAFTS_FOLDER),
),
},
terms: {
...terms,
Expand Down Expand Up @@ -204,11 +204,3 @@ export function SearchProvider({children, fullscreen}: SearchProviderProps) {

return <SearchContext.Provider value={value}>{children}</SearchContext.Provider>
}

function omitBundlePerspective(perspective: string | undefined): string | undefined {
if (perspective?.startsWith('bundle.')) {
return undefined
}

return perspective
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import {describe, expect, it} from '@jest/globals'

import {resolvePerspective} from '../resolvePerspective'

describe('resolvePerspectives', () => {
it('includes the `bundlePerspective` property if a bundle is provided', () => {
expect(resolvePerspective('bundle.x')).toHaveProperty('bundlePerspective')
expect(resolvePerspective('bundle.x')).not.toHaveProperty('perspective')
})

it('includes the `perspective` property if a system perspective is provided', () => {
expect(resolvePerspective('x')).toHaveProperty('perspective')
expect(resolvePerspective('x')).not.toHaveProperty('bundlePerspective')
})

it(`removes the bundle prefix if it exists`, () => {
expect(resolvePerspective('bundle.x').bundlePerspective).toEqual('x')
expect(resolvePerspective('x').perspective).toEqual('x')
})

it('allows the extracted perspectives to be transformed', () => {
expect(resolvePerspective('x', () => ['y'])).toEqual({
perspective: 'y',
})
})

it('passes the perspective to the `transformPerspectives` function', () => {
expect.assertions(2)

resolvePerspective('x', (perspectives) => {
expect(perspectives).toEqual(['x'])
return perspectives
})

resolvePerspective('bundle.x', (perspectives) => {
expect(perspectives).toEqual(['x'])
return perspectives
})
})

it('passes the perspective type to the `transformPerspectives` function', () => {
expect.assertions(2)

resolvePerspective('x', (perspectives, isSystemPerspective) => {
expect(isSystemPerspective).toBe(true)
return perspectives
})

resolvePerspective('bundle.x', (perspectives, isSystemPerspective) => {
expect(isSystemPerspective).toBe(false)
return perspectives
})
})

it('produces a correctly formatted list of perspectives', () => {
expect(resolvePerspective('x', (perspectives) => perspectives.concat('y'))).toEqual({
perspective: 'x,y',
})
})
})
1 change: 1 addition & 0 deletions packages/sanity/src/core/util/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export * from './isString'
export * from './isTruthy'
export * from './PartialExcept'
export * from './resizeObserver'
export * from './resolvePerspective'
export * from './schemaUtils'
export * from './searchUtils'
export * from './supportsTouch'
Expand Down
32 changes: 32 additions & 0 deletions packages/sanity/src/core/util/resolvePerspective.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/**
* Given a system perspective, or a bundle name prefixed with `bundle.`, returns
* the provided `options` object with either `perspective` or `bundlePerspective`
* applied.
*
* @internal
*/
export function resolvePerspective(
perspective: string | undefined,
transformPerspectives: (perspectives: string[], isSystemPerspective: boolean) => string[] = (
perspectives,
) => perspectives,
):
| {perspective: string; bundlePerspective?: never}
| {perspective?: never; bundlePerspective: string}
| Record<PropertyKey, never> {
if (typeof perspective === 'undefined') {
return {}
}

const bundlePerspective = perspective.split(/^bundle./).at(1)

if (typeof bundlePerspective === 'string') {
return {
bundlePerspective: transformPerspectives([bundlePerspective], false).join(','),
}
}

return {
perspective: transformPerspectives([perspective], true).join(','),
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@ import {
createSearch,
DRAFTS_FOLDER,
getSearchableTypes,
resolvePerspective,
type SanityDocumentLike,
type Schema,
type SearchOptions,
} from 'sanity'

import {getExtendedProjection} from '../../structureBuilder/util/getExtendedProjection'
Expand Down Expand Up @@ -128,16 +130,15 @@ export function listenSearchQuery(options: ListenQueryOptions): Observable<Sanit
types,
}

const searchOptions = {
const searchOptions: SearchOptions = {
__unstable_extendedProjection: extendedProjection,
comments: [`findability-source: ${searchQuery ? 'list-query' : 'list'}`],
limit,
perspective: omitBundlePerspective(perspective),
bundlePerspective: perspective?.startsWith('bundle.')
? [perspective.split('bundle.').at(1), DRAFTS_FOLDER].join(',')
: undefined,
skipSortByScore: true,
sort: sortBy,
...resolvePerspective(perspective, (perspectives, isSystemPerspective) =>
isSystemPerspective ? perspectives : perspectives.concat(DRAFTS_FOLDER),
),
}

return search(searchTerms, searchOptions).pipe(
Expand All @@ -160,11 +161,3 @@ export function listenSearchQuery(options: ListenQueryOptions): Observable<Sanit
}),
)
}

function omitBundlePerspective(perspective: string | undefined): string | undefined {
if (perspective?.startsWith('bundle.')) {
return undefined
}

return perspective
}

0 comments on commit 1eac625

Please sign in to comment.