@sanity/sdk-react 3.0.0-rc.0 → 3.0.0-rc.2
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.
- package/README.md +103 -155
- package/dist/index.d.ts +2488 -2019
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4435 -1529
- package/dist/index.js.map +1 -1
- package/package.json +55 -59
- package/src/_exports/index.ts +2 -4
- package/src/_exports/sdk-react.ts +30 -18
- package/src/components/SDKProvider.test.tsx +173 -32
- package/src/components/SDKProvider.tsx +87 -28
- package/src/components/SanityApp.test.tsx +68 -12
- package/src/components/SanityApp.tsx +93 -87
- package/src/components/auth/AuthBoundary.recovery.test.tsx +86 -0
- package/src/components/auth/AuthBoundary.test.tsx +7 -7
- package/src/components/auth/AuthBoundary.tsx +29 -6
- package/src/components/auth/DashboardAccessRequest.tsx +37 -0
- package/src/components/auth/LoginError.test.tsx +191 -5
- package/src/components/auth/LoginError.tsx +104 -61
- package/src/components/errors/ChunkLoadError.test.tsx +59 -0
- package/src/components/errors/ChunkLoadError.tsx +56 -0
- package/src/components/errors/CorsErrorComponent.tsx +2 -2
- package/src/components/errors/chunkReloadStorage.ts +57 -0
- package/src/config/handles.ts +29 -27
- package/src/constants.ts +5 -0
- package/src/context/ComlinkTokenRefresh.test.tsx +10 -27
- package/src/context/ComlinkTokenRefresh.tsx +3 -5
- package/src/context/DefaultResourceContext.ts +3 -3
- package/src/context/OrganizationResourcesProvider.test.tsx +189 -0
- package/src/context/OrganizationResourcesProvider.tsx +111 -0
- package/src/context/PerspectiveContext.ts +3 -3
- package/src/context/ProjectContext.ts +15 -0
- package/src/context/ResourceProvider.test.tsx +93 -90
- package/src/context/ResourceProvider.tsx +62 -93
- package/src/context/SDKStudioContext.test.tsx +28 -33
- package/src/context/SanityInstanceProvider.test.tsx +100 -0
- package/src/context/SanityInstanceProvider.tsx +71 -0
- package/src/context/WorkbenchTokenRefresh.test.tsx +106 -0
- package/src/context/WorkbenchTokenRefresh.tsx +61 -0
- package/src/context/renderSanityApp.test.tsx +151 -49
- package/src/context/renderSanityApp.tsx +12 -8
- package/src/context/workbenchToken.ts +63 -0
- package/src/hooks/access/useCheckPermissions.test-d.ts +15 -0
- package/src/hooks/access/useCheckPermissions.test.tsx +53 -0
- package/src/hooks/access/useCheckPermissions.ts +24 -0
- package/src/hooks/agent/agentActions.test.tsx +2 -2
- package/src/hooks/agent/agentActions.ts +52 -72
- package/src/hooks/agent/useAgentResourceContext.ts +1 -1
- package/src/hooks/applications/useApplication.test-d.ts +30 -0
- package/src/hooks/applications/useApplication.ts +22 -0
- package/src/hooks/applications/useApplications.test-d.ts +31 -0
- package/src/hooks/applications/useApplications.ts +25 -0
- package/src/hooks/applications/useDeleteApplication.test-d.ts +12 -0
- package/src/hooks/applications/useDeleteApplication.ts +11 -0
- package/src/hooks/applications/useUpdateApplication.test-d.ts +12 -0
- package/src/hooks/applications/useUpdateApplication.ts +11 -0
- package/src/hooks/auth/useDashboardOrganizationId.test.tsx +2 -8
- package/src/hooks/auth/useVerifyOrgProjects.test.tsx +8 -32
- package/src/hooks/auth/useVerifyOrgProjects.tsx +13 -6
- package/src/hooks/client/useClient.test.tsx +1 -4
- package/src/hooks/client/useClient.ts +1 -0
- package/src/hooks/comlink/useFrameConnection.test.tsx +3 -2
- package/src/hooks/comlink/useFrameConnection.ts +1 -1
- package/src/hooks/comlink/useWindowConnection.test.tsx +4 -3
- package/src/hooks/comlink/useWindowConnection.ts +2 -3
- package/src/hooks/comments/useCommentActions.test.tsx +150 -0
- package/src/hooks/comments/useCommentActions.ts +109 -0
- package/src/hooks/comments/useCommentList.ts +79 -0
- package/src/hooks/comments/useCommentThreads.test.tsx +107 -0
- package/src/hooks/comments/useCommentThreads.ts +73 -0
- package/src/hooks/comments/useComments.test.tsx +242 -0
- package/src/hooks/comments/useComments.ts +59 -0
- package/src/hooks/context/useResource.test.tsx +32 -0
- package/src/hooks/context/useResource.ts +24 -0
- package/src/hooks/context/useSanityInstance.test.tsx +18 -1
- package/src/hooks/context/useSanityInstance.ts +6 -6
- package/src/hooks/dashboard/useManageFavorite.test.tsx +110 -46
- package/src/hooks/dashboard/useManageFavorite.ts +11 -17
- package/src/hooks/dashboard/useNavigateToStudioDocument.test.ts +5 -7
- package/src/hooks/dashboard/useNavigateToStudioDocument.ts +2 -6
- package/src/hooks/dashboard/useRecordDocumentHistoryEvent.test.ts +0 -2
- package/src/hooks/dashboard/useRecordDocumentHistoryEvent.ts +2 -2
- package/src/hooks/dashboard/useWindowTitle.test.ts +244 -0
- package/src/hooks/dashboard/useWindowTitle.ts +114 -0
- package/src/hooks/datasets/useDatasets.test.tsx +116 -0
- package/src/hooks/datasets/useDatasets.ts +33 -13
- package/src/hooks/document/useApplyDocumentActions.test.tsx +48 -0
- package/src/hooks/document/useApplyDocumentActions.ts +66 -48
- package/src/hooks/document/useCreateDocument.test.tsx +83 -0
- package/src/hooks/document/useCreateDocument.ts +117 -0
- package/src/hooks/document/useDocument.test.tsx +37 -8
- package/src/hooks/document/useDocument.ts +131 -66
- package/src/hooks/document/useDocumentEvent.test.tsx +16 -4
- package/src/hooks/document/useDocumentEvent.ts +16 -10
- package/src/hooks/document/useDocumentPermissions.test.tsx +8 -7
- package/src/hooks/document/useDocumentPermissions.ts +71 -39
- package/src/hooks/document/useDocumentSyncStatus.test.ts +1 -0
- package/src/hooks/document/useDocumentSyncStatus.ts +13 -9
- package/src/hooks/document/useEditDocument.test.tsx +21 -14
- package/src/hooks/document/useEditDocument.ts +163 -17
- package/src/hooks/documents/useDocuments.test.tsx +64 -44
- package/src/hooks/documents/useDocuments.ts +31 -20
- package/src/hooks/helpers/createCallbackHook.test.tsx +13 -19
- package/src/hooks/helpers/createFetcherHook.test.tsx +180 -0
- package/src/hooks/helpers/createFetcherHook.ts +69 -0
- package/src/hooks/helpers/createMutationHook.test.tsx +125 -0
- package/src/hooks/helpers/createMutationHook.tsx +93 -0
- package/src/hooks/helpers/createStateSourceHook.test.tsx +10 -10
- package/src/hooks/helpers/createStateSourceHook.tsx +2 -1
- package/src/hooks/{document/useApplyDocumentActions.test.ts → helpers/useApplyActions.test.tsx} +92 -53
- package/src/hooks/helpers/useApplyActions.ts +68 -0
- package/src/hooks/helpers/useNormalizedResourceOptions.test.tsx +226 -0
- package/src/hooks/helpers/useNormalizedResourceOptions.ts +79 -48
- package/src/hooks/helpers/useResolvedProjectId.test.tsx +59 -0
- package/src/hooks/helpers/useResolvedProjectId.ts +35 -0
- package/src/hooks/helpers/useTrackHookUsage.ts +37 -0
- package/src/hooks/installations/useInstallation.test-d.ts +19 -0
- package/src/hooks/installations/useInstallation.ts +22 -0
- package/src/hooks/installations/useInstallations.test-d.ts +26 -0
- package/src/hooks/installations/useInstallations.ts +25 -0
- package/src/hooks/organizations/useOrganization.test-d.ts +60 -0
- package/src/hooks/organizations/useOrganization.test.ts +63 -0
- package/src/hooks/organizations/useOrganization.ts +34 -0
- package/src/hooks/organizations/useOrganizations.test-d.ts +68 -0
- package/src/hooks/organizations/useOrganizations.test.ts +63 -0
- package/src/hooks/organizations/useOrganizations.ts +39 -0
- package/src/hooks/paginatedDocuments/usePaginatedDocuments.test.tsx +34 -27
- package/src/hooks/paginatedDocuments/usePaginatedDocuments.ts +35 -22
- package/src/hooks/presence/usePresence.test.tsx +0 -15
- package/src/hooks/presence/usePresence.ts +22 -20
- package/src/hooks/presence/usePresenceForDocument.test.tsx +141 -0
- package/src/hooks/presence/usePresenceForDocument.ts +104 -0
- package/src/hooks/presence/useReportPresence.test.tsx +202 -0
- package/src/hooks/presence/useReportPresence.ts +170 -0
- package/src/hooks/preview/useDocumentPreview.test.tsx +0 -1
- package/src/hooks/preview/useDocumentPreview.tsx +12 -14
- package/src/hooks/projection/useDocumentProjection.test.tsx +78 -9
- package/src/hooks/projection/useDocumentProjection.ts +81 -2
- package/src/hooks/projects/useProject.test-d.ts +56 -0
- package/src/hooks/projects/useProject.test.tsx +120 -0
- package/src/hooks/projects/useProject.ts +42 -43
- package/src/hooks/projects/useProjects.test-d.ts +60 -0
- package/src/hooks/projects/useProjects.test.ts +45 -98
- package/src/hooks/projects/useProjects.ts +17 -32
- package/src/hooks/query/useQuery.test.tsx +6 -5
- package/src/hooks/query/useQuery.ts +94 -17
- package/src/hooks/releases/useActiveReleases.test.tsx +13 -7
- package/src/hooks/releases/useActiveReleases.ts +28 -24
- package/src/hooks/releases/useAllReleases.test.tsx +93 -0
- package/src/hooks/releases/useAllReleases.ts +62 -0
- package/src/hooks/releases/useApplyReleaseActions.test.tsx +66 -0
- package/src/hooks/releases/useApplyReleaseActions.ts +82 -0
- package/src/hooks/releases/usePerspective.test.tsx +18 -10
- package/src/hooks/releases/usePerspective.ts +13 -17
- package/src/hooks/users/useUser.test.tsx +3 -9
- package/src/hooks/users/useUser.ts +4 -8
- package/src/hooks/users/useUsers.test.tsx +103 -7
- package/src/hooks/users/useUsers.ts +38 -5
- package/src/utils/resolveOrgResources.test.ts +111 -0
- package/src/utils/resolveOrgResources.ts +69 -0
- package/src/hooks/context/useDefaultResource.test.tsx +0 -25
- package/src/hooks/context/useDefaultResource.ts +0 -30
- package/src/hooks/dashboard/useDispatchIntent.test.ts +0 -254
- package/src/hooks/dashboard/useDispatchIntent.ts +0 -157
- package/src/hooks/dashboard/utils/useResourceIdFromDocumentHandle.test.ts +0 -107
- package/src/hooks/dashboard/utils/useResourceIdFromDocumentHandle.ts +0 -39
- package/src/hooks/datasets/useDatasets.test.ts +0 -66
- package/src/hooks/helpers/useNormalizedResourceOptions.test.ts +0 -65
- package/src/hooks/projects/useProject.test.ts +0 -79
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import {describe, expect, it} from 'vitest'
|
|
2
|
-
|
|
3
|
-
import {renderHook} from '../../../../test/test-utils'
|
|
4
|
-
import {useResourceIdFromDocumentHandle} from './useResourceIdFromDocumentHandle'
|
|
5
|
-
|
|
6
|
-
describe('getResourceIdFromDocumentHandle', () => {
|
|
7
|
-
describe('with DocumentHandle using resource object', () => {
|
|
8
|
-
it('should return resource ID from resource object with projectId and dataset', () => {
|
|
9
|
-
const documentHandle = {
|
|
10
|
-
documentId: 'test-document-id',
|
|
11
|
-
documentType: 'test-document-type',
|
|
12
|
-
resource: {projectId: 'test-project-id', dataset: 'test-dataset'},
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const {result} = renderHook(() => useResourceIdFromDocumentHandle(documentHandle))
|
|
16
|
-
|
|
17
|
-
expect(result.current).toEqual({
|
|
18
|
-
id: 'test-project-id.test-dataset',
|
|
19
|
-
type: undefined,
|
|
20
|
-
})
|
|
21
|
-
})
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
describe('with DocumentHandle - media library resource', () => {
|
|
25
|
-
it('should return media library ID and resourceType when media library resource is provided', () => {
|
|
26
|
-
const documentHandle = {
|
|
27
|
-
documentId: 'test-asset-id',
|
|
28
|
-
documentType: 'sanity.asset',
|
|
29
|
-
resourceName: 'media-library',
|
|
30
|
-
} as const
|
|
31
|
-
|
|
32
|
-
const {result} = renderHook(() => useResourceIdFromDocumentHandle(documentHandle))
|
|
33
|
-
|
|
34
|
-
expect(result.current).toEqual({
|
|
35
|
-
id: 'media-library-id',
|
|
36
|
-
type: 'media-library',
|
|
37
|
-
})
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
it('should use resourceName when provided', () => {
|
|
41
|
-
const documentHandle = {
|
|
42
|
-
documentId: 'test-asset-id',
|
|
43
|
-
documentType: 'sanity.asset',
|
|
44
|
-
resourceName: 'media-library',
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const {result} = renderHook(() => useResourceIdFromDocumentHandle(documentHandle))
|
|
48
|
-
|
|
49
|
-
expect(result.current).toEqual({
|
|
50
|
-
id: 'media-library-id',
|
|
51
|
-
type: 'media-library',
|
|
52
|
-
})
|
|
53
|
-
})
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
describe('with DocumentHandle - canvas resource', () => {
|
|
57
|
-
it('should return canvas ID and resourceType when canvas resource is provided', () => {
|
|
58
|
-
const documentHandle = {
|
|
59
|
-
documentId: 'test-canvas-document-id',
|
|
60
|
-
documentType: 'sanity.canvas.document',
|
|
61
|
-
resourceName: 'canvas',
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const {result} = renderHook(() => useResourceIdFromDocumentHandle(documentHandle))
|
|
65
|
-
|
|
66
|
-
expect(result.current).toEqual({
|
|
67
|
-
id: 'canvas-id',
|
|
68
|
-
type: 'canvas',
|
|
69
|
-
})
|
|
70
|
-
})
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
describe('with DocumentHandle - dataset resource', () => {
|
|
74
|
-
it('should return dataset resource ID when dataset resource is provided', () => {
|
|
75
|
-
const documentHandle = {
|
|
76
|
-
documentId: 'test-document-id',
|
|
77
|
-
documentType: 'test-document-type',
|
|
78
|
-
resourceName: 'dataset',
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const {result} = renderHook(() => useResourceIdFromDocumentHandle(documentHandle))
|
|
82
|
-
|
|
83
|
-
expect(result.current).toEqual({
|
|
84
|
-
id: 'source-project-id.source-dataset',
|
|
85
|
-
type: undefined,
|
|
86
|
-
})
|
|
87
|
-
})
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
describe('edge cases', () => {
|
|
91
|
-
it('should handle DocumentHandle with explicit resource and no resourceName', () => {
|
|
92
|
-
const documentHandle = {
|
|
93
|
-
documentId: 'test-document-id',
|
|
94
|
-
documentType: 'test-document-type',
|
|
95
|
-
resource: {projectId: 'test-project-id', dataset: 'test-dataset'},
|
|
96
|
-
resourceName: undefined,
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const {result} = renderHook(() => useResourceIdFromDocumentHandle(documentHandle))
|
|
100
|
-
|
|
101
|
-
expect(result.current).toEqual({
|
|
102
|
-
id: 'test-project-id.test-dataset',
|
|
103
|
-
type: undefined,
|
|
104
|
-
})
|
|
105
|
-
})
|
|
106
|
-
})
|
|
107
|
-
})
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import {isCanvasResource, isDatasetResource, isMediaLibraryResource} from '@sanity/sdk'
|
|
2
|
-
|
|
3
|
-
import {type DocumentHandle} from '../../../config/handles'
|
|
4
|
-
import {useNormalizedResourceOptions} from '../../helpers/useNormalizedResourceOptions'
|
|
5
|
-
|
|
6
|
-
interface DashboardMessageResource {
|
|
7
|
-
id: string
|
|
8
|
-
type?: 'media-library' | 'canvas'
|
|
9
|
-
}
|
|
10
|
-
/** Currently only used for dispatching intents to the dashboard,
|
|
11
|
-
* but could easily be extended to other dashboard hooks
|
|
12
|
-
* @beta
|
|
13
|
-
*/
|
|
14
|
-
export function useResourceIdFromDocumentHandle(
|
|
15
|
-
documentHandle: DocumentHandle,
|
|
16
|
-
): DashboardMessageResource {
|
|
17
|
-
const options = useNormalizedResourceOptions(documentHandle)
|
|
18
|
-
const {resource} = options
|
|
19
|
-
let resourceId: string = ''
|
|
20
|
-
let resourceType: 'media-library' | 'canvas' | undefined
|
|
21
|
-
|
|
22
|
-
if (resource) {
|
|
23
|
-
if (isDatasetResource(resource)) {
|
|
24
|
-
resourceId = `${resource.projectId}.${resource.dataset}`
|
|
25
|
-
resourceType = undefined
|
|
26
|
-
} else if (isMediaLibraryResource(resource)) {
|
|
27
|
-
resourceId = resource.mediaLibraryId
|
|
28
|
-
resourceType = 'media-library'
|
|
29
|
-
} else if (isCanvasResource(resource)) {
|
|
30
|
-
resourceId = resource.canvasId
|
|
31
|
-
resourceType = 'canvas'
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return {
|
|
36
|
-
id: resourceId,
|
|
37
|
-
type: resourceType,
|
|
38
|
-
}
|
|
39
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import {getDatasetsState, type SanityInstance} from '@sanity/sdk'
|
|
2
|
-
import {beforeEach, describe, expect, it, vi} from 'vitest'
|
|
3
|
-
|
|
4
|
-
import {createStateSourceHook} from '../helpers/createStateSourceHook'
|
|
5
|
-
|
|
6
|
-
// Mock dependencies
|
|
7
|
-
vi.mock('@sanity/sdk', () => ({
|
|
8
|
-
getDatasetsState: vi.fn(() => ({
|
|
9
|
-
getCurrent: vi.fn(() => undefined),
|
|
10
|
-
})),
|
|
11
|
-
resolveDatasets: vi.fn(),
|
|
12
|
-
}))
|
|
13
|
-
vi.mock('../helpers/createStateSourceHook', () => ({
|
|
14
|
-
createStateSourceHook: vi.fn(),
|
|
15
|
-
}))
|
|
16
|
-
|
|
17
|
-
describe('useDatasets', () => {
|
|
18
|
-
beforeEach(() => {
|
|
19
|
-
vi.resetModules()
|
|
20
|
-
vi.mock('@sanity/sdk', () => ({
|
|
21
|
-
getDatasetsState: vi.fn(() => ({
|
|
22
|
-
getCurrent: vi.fn(() => undefined),
|
|
23
|
-
})),
|
|
24
|
-
resolveDatasets: vi.fn(),
|
|
25
|
-
}))
|
|
26
|
-
vi.mock('../helpers/createStateSourceHook', () => ({
|
|
27
|
-
createStateSourceHook: vi.fn(),
|
|
28
|
-
}))
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
it('should call createStateSourceHook with correct arguments on import', async () => {
|
|
32
|
-
await import('./useDatasets')
|
|
33
|
-
|
|
34
|
-
expect(createStateSourceHook).toHaveBeenCalled()
|
|
35
|
-
expect(createStateSourceHook).toHaveBeenCalledWith(
|
|
36
|
-
expect.objectContaining({
|
|
37
|
-
getState: expect.any(Function),
|
|
38
|
-
shouldSuspend: expect.any(Function),
|
|
39
|
-
suspender: expect.any(Function),
|
|
40
|
-
}),
|
|
41
|
-
)
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
it('shouldSuspend should call getDatasetsState and getCurrent', async () => {
|
|
45
|
-
await import('./useDatasets')
|
|
46
|
-
|
|
47
|
-
const mockCreateStateSourceHook = createStateSourceHook as ReturnType<typeof vi.fn>
|
|
48
|
-
expect(mockCreateStateSourceHook.mock.calls.length).toBeGreaterThan(0)
|
|
49
|
-
const createStateSourceHookArgs = mockCreateStateSourceHook.mock.calls[0][0]
|
|
50
|
-
const shouldSuspend = createStateSourceHookArgs.shouldSuspend
|
|
51
|
-
|
|
52
|
-
const mockInstance = {} as SanityInstance
|
|
53
|
-
const mockOptions = {projectId: 'test-project'}
|
|
54
|
-
|
|
55
|
-
const result = shouldSuspend(mockInstance, mockOptions)
|
|
56
|
-
|
|
57
|
-
const mockGetDatasetsState = getDatasetsState as ReturnType<typeof vi.fn>
|
|
58
|
-
expect(mockGetDatasetsState).toHaveBeenCalledWith(mockInstance, mockOptions)
|
|
59
|
-
|
|
60
|
-
expect(mockGetDatasetsState.mock.results.length).toBeGreaterThan(0)
|
|
61
|
-
const getDatasetsStateMockResult = mockGetDatasetsState.mock.results[0].value
|
|
62
|
-
expect(getDatasetsStateMockResult.getCurrent).toHaveBeenCalled()
|
|
63
|
-
|
|
64
|
-
expect(result).toBe(true)
|
|
65
|
-
})
|
|
66
|
-
})
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import {describe, expect, it} from 'vitest'
|
|
2
|
-
|
|
3
|
-
import {normalizeResourceOptions} from './useNormalizedResourceOptions'
|
|
4
|
-
|
|
5
|
-
describe('normalizeResourceOptions', () => {
|
|
6
|
-
it('throws when both resource and resourceName are provided together', () => {
|
|
7
|
-
const resource = {projectId: 'p', dataset: 'd'}
|
|
8
|
-
|
|
9
|
-
expect(() =>
|
|
10
|
-
normalizeResourceOptions(
|
|
11
|
-
{resource, resourceName: 'my-resource'},
|
|
12
|
-
{'my-resource': resource},
|
|
13
|
-
undefined,
|
|
14
|
-
),
|
|
15
|
-
).toThrow(/cannot be used together/)
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
it('throws when no resource can be resolved from any source', () => {
|
|
19
|
-
expect(() =>
|
|
20
|
-
normalizeResourceOptions(
|
|
21
|
-
{},
|
|
22
|
-
{}, // no named resources
|
|
23
|
-
undefined, // no context resource
|
|
24
|
-
),
|
|
25
|
-
).toThrow(/resource is required/)
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
it('uses explicit resource when provided', () => {
|
|
29
|
-
const resource = {projectId: 'project-a', dataset: 'staging'}
|
|
30
|
-
|
|
31
|
-
const normalized = normalizeResourceOptions(
|
|
32
|
-
{resource},
|
|
33
|
-
{},
|
|
34
|
-
{projectId: 'default', dataset: 'prod'},
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
expect(normalized).toEqual({resource: {projectId: 'project-a', dataset: 'staging'}})
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
it('resolves resource from resourceName', () => {
|
|
41
|
-
const resource = {projectId: 'p', dataset: 'd'}
|
|
42
|
-
|
|
43
|
-
const normalized = normalizeResourceOptions(
|
|
44
|
-
{resourceName: 'my-resource'},
|
|
45
|
-
{'my-resource': resource},
|
|
46
|
-
undefined,
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
expect(normalized).toEqual({resource})
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
it('throws when resourceName is not found in resources map', () => {
|
|
53
|
-
expect(() => normalizeResourceOptions({resourceName: 'missing'}, {}, undefined)).toThrow(
|
|
54
|
-
/no resource named/,
|
|
55
|
-
)
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
it('falls back to context resource when neither resource nor resourceName is provided', () => {
|
|
59
|
-
const contextResource = {projectId: 'default', dataset: 'prod'}
|
|
60
|
-
|
|
61
|
-
const normalized = normalizeResourceOptions({}, {}, contextResource)
|
|
62
|
-
|
|
63
|
-
expect(normalized).toEqual({resource: contextResource})
|
|
64
|
-
})
|
|
65
|
-
})
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import {getProjectState, type ProjectHandle, type SanityInstance} from '@sanity/sdk'
|
|
2
|
-
import {beforeEach, describe, expect, it, vi} from 'vitest'
|
|
3
|
-
|
|
4
|
-
import {createStateSourceHook} from '../helpers/createStateSourceHook'
|
|
5
|
-
|
|
6
|
-
// Mock dependencies
|
|
7
|
-
vi.mock('@sanity/sdk', () => ({
|
|
8
|
-
getProjectState: vi.fn(() => ({
|
|
9
|
-
getCurrent: vi.fn(() => undefined), // Mocking getCurrent to satisfy the call within shouldSuspend
|
|
10
|
-
})),
|
|
11
|
-
resolveProject: vi.fn(),
|
|
12
|
-
}))
|
|
13
|
-
vi.mock('../helpers/createStateSourceHook', () => ({
|
|
14
|
-
createStateSourceHook: vi.fn(),
|
|
15
|
-
}))
|
|
16
|
-
|
|
17
|
-
describe('useProject', () => {
|
|
18
|
-
// Use beforeEach to reset modules and ensure mocks are fresh for each test
|
|
19
|
-
beforeEach(() => {
|
|
20
|
-
vi.resetModules()
|
|
21
|
-
// Re-mock dependencies for each test after resetModules
|
|
22
|
-
vi.mock('@sanity/sdk', () => ({
|
|
23
|
-
getProjectState: vi.fn(() => ({
|
|
24
|
-
getCurrent: vi.fn(() => undefined),
|
|
25
|
-
})),
|
|
26
|
-
resolveProject: vi.fn(),
|
|
27
|
-
}))
|
|
28
|
-
vi.mock('../helpers/createStateSourceHook', () => ({
|
|
29
|
-
createStateSourceHook: vi.fn(),
|
|
30
|
-
}))
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
it('should call createStateSourceHook with correct arguments on import', async () => {
|
|
34
|
-
// Dynamically import the hook *after* mocks are set up and modules reset
|
|
35
|
-
await import('./useProject')
|
|
36
|
-
|
|
37
|
-
// Check if createStateSourceHook was called during the module evaluation (import)
|
|
38
|
-
expect(createStateSourceHook).toHaveBeenCalled()
|
|
39
|
-
expect(createStateSourceHook).toHaveBeenCalledWith(
|
|
40
|
-
expect.objectContaining({
|
|
41
|
-
getState: expect.any(Function),
|
|
42
|
-
shouldSuspend: expect.any(Function),
|
|
43
|
-
suspender: expect.any(Function),
|
|
44
|
-
}),
|
|
45
|
-
)
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
it('shouldSuspend should call getProjectState and getCurrent', async () => {
|
|
49
|
-
// Dynamically import the hook *after* mocks are set up and modules reset
|
|
50
|
-
await import('./useProject')
|
|
51
|
-
|
|
52
|
-
// Get the arguments passed to createStateSourceHook
|
|
53
|
-
// Need to ensure createStateSourceHook mock is correctly typed for access
|
|
54
|
-
const mockCreateStateSourceHook = createStateSourceHook as ReturnType<typeof vi.fn>
|
|
55
|
-
expect(mockCreateStateSourceHook.mock.calls.length).toBeGreaterThan(0)
|
|
56
|
-
const createStateSourceHookArgs = mockCreateStateSourceHook.mock.calls[0][0]
|
|
57
|
-
const shouldSuspend = createStateSourceHookArgs.shouldSuspend
|
|
58
|
-
|
|
59
|
-
// Mock instance and projectHandle for the test call
|
|
60
|
-
const mockInstance = {} as SanityInstance // Use specific type
|
|
61
|
-
const mockProjectHandle = {} as ProjectHandle // Use specific type
|
|
62
|
-
|
|
63
|
-
// Call the shouldSuspend function
|
|
64
|
-
const result = shouldSuspend(mockInstance, mockProjectHandle)
|
|
65
|
-
|
|
66
|
-
// Assert that getProjectState was called with the correct arguments
|
|
67
|
-
// Need to ensure getProjectState mock is correctly typed for access
|
|
68
|
-
const mockGetProjectState = getProjectState as ReturnType<typeof vi.fn>
|
|
69
|
-
expect(mockGetProjectState).toHaveBeenCalledWith(mockInstance, mockProjectHandle)
|
|
70
|
-
|
|
71
|
-
// Assert that getCurrent was called on the result of getProjectState
|
|
72
|
-
expect(mockGetProjectState.mock.results.length).toBeGreaterThan(0)
|
|
73
|
-
const getProjectStateMockResult = mockGetProjectState.mock.results[0].value
|
|
74
|
-
expect(getProjectStateMockResult.getCurrent).toHaveBeenCalled()
|
|
75
|
-
|
|
76
|
-
// Assert the result of shouldSuspend based on the mocked getCurrent value
|
|
77
|
-
expect(result).toBe(true) // Since getCurrent is mocked to return undefined
|
|
78
|
-
})
|
|
79
|
-
})
|