next-sanity 1.0.0 → 1.0.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 CHANGED
@@ -235,7 +235,7 @@ import config from '../sanity.config'
235
235
  import {NextStudio} from 'next-sanity/studio'
236
236
 
237
237
  export default function StudioPage() {
238
- // Loads the Studio, with all the needed neta tags and global CSS reqiired for it to render correctly
238
+ // Loads the Studio, with all the needed meta tags and global CSS required for it to render correctly
239
239
  return <NextStudio config={config} />
240
240
  }
241
241
  ```
@@ -336,7 +336,7 @@ import {
336
336
  NextStudio,
337
337
  NextStudioGlobalStyle,
338
338
  NextStudioHead,
339
- useThem,
339
+ useTheme,
340
340
  useBackgroundColorsFromTheme,
341
341
  } from 'next-sanity/studio'
342
342
  import {Studio} from 'sanity'
package/dist/index.d.ts CHANGED
@@ -52,7 +52,7 @@ export {groq}
52
52
 
53
53
  export declare type GroqStoreEventSource = Config['EventSource']
54
54
 
55
- declare type Params = Record<string, unknown>
55
+ export declare type Params = Record<string, unknown>
56
56
 
57
57
  export declare interface ProjectConfig {
58
58
  projectId: string
@@ -64,7 +64,7 @@ export declare interface ProjectConfig {
64
64
 
65
65
  export declare type SanityClient = SanityClient_2
66
66
 
67
- declare interface SubscriptionOptions<R = any> {
67
+ export declare interface SubscriptionOptions<R = any> {
68
68
  enabled?: boolean
69
69
  params?: Params
70
70
  initialData?: R
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/client.ts","../src/aborter.ts","../src/currentUser.ts","../src/useSubscription.ts"],"sourcesContent":["import type {ClientConfig, SanityClient} from '@sanity/client'\nimport sanityClient from '@sanity/client'\n\nexport function createClient(config: ClientConfig): SanityClient {\n return sanityClient(config)\n}\n","export interface Aborter {\n abort(): void\n signal: AbortSignal\n}\n\nclass MockAbortController {\n _signal = {aborted: false}\n get signal() {\n return this._signal as AbortSignal\n }\n abort() {\n this._signal.aborted = true\n }\n}\n\nexport function getAborter(): Aborter {\n return typeof AbortController === 'undefined'\n ? new MockAbortController()\n : new AbortController()\n}\n","import {useEffect, useState} from 'react'\n\nimport {Aborter, getAborter} from './aborter'\nimport {CurrentUser} from './types'\n\nexport function createCurrentUserHook({projectId}: {projectId: string; dataset?: string}) {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n return () => useCurrentUser(projectId)\n}\n\nexport function getCurrentUser(\n projectId: string,\n abort: Aborter,\n token?: string\n): Promise<CurrentUser | null> {\n const headers = token ? {Authorization: `Bearer ${token}`} : undefined\n return fetch(`https://${projectId}.api.sanity.io/v1/users/me`, {\n credentials: 'include',\n signal: abort.signal,\n headers,\n })\n .then((res) => res.json())\n .then((res) => (res?.id ? res : null))\n}\n\nfunction useCurrentUser(projectId: string) {\n const [data, setUser] = useState<CurrentUser | null>()\n const [error, setError] = useState<Error>()\n\n useEffect(() => {\n const aborter = getAborter()\n getCurrentUser(projectId, aborter)\n .then(setUser)\n .catch((err: Error) => err.name !== 'AbortError' && setError(err))\n\n return () => {\n aborter.abort()\n }\n }, [projectId])\n\n return {data, error, loading: data !== null || !error}\n}\n","import {GroqStore, Subscription} from '@sanity/groq-store'\nimport {useEffect, useMemo, useState} from 'react'\n\nimport {Aborter, getAborter} from './aborter'\nimport {getCurrentUser} from './currentUser'\nimport {ProjectConfig} from './types'\n\nconst EMPTY_PARAMS = {}\n\nexport type Params = Record<string, unknown>\nexport interface SubscriptionOptions<R = any> {\n enabled?: boolean\n params?: Params\n initialData?: R\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function createPreviewSubscriptionHook({\n projectId,\n dataset,\n token,\n EventSource,\n documentLimit = 3000,\n}: ProjectConfig & {documentLimit?: number}) {\n // Only construct/setup the store when `getStore()` is called\n let store: Promise<GroqStore>\n\n return function usePreviewSubscription<R = any>(\n query: string,\n options: SubscriptionOptions<R> = {}\n ) {\n const {params = EMPTY_PARAMS, initialData, enabled} = options\n return useQuerySubscription<R>({\n getStore,\n projectId,\n query,\n params,\n initialData: initialData as any,\n enabled: enabled ? typeof window !== 'undefined' : false,\n token,\n })\n }\n\n function getStore(abort: Aborter) {\n if (!store) {\n store = import('@sanity/groq-store').then(({groqStore}) => {\n // Skip creating the groq store if we've been unmounted to save memory and reduce gc pressure\n if (abort.signal.aborted) {\n const error = new Error('Cancelling groq store creation')\n // This ensures we can skip it in the catch block same way\n error.name = 'AbortError'\n return Promise.reject(error)\n }\n\n return groqStore({\n projectId,\n dataset,\n documentLimit,\n token,\n EventSource,\n listen: true,\n overlayDrafts: true,\n subscriptionThrottleMs: 10,\n })\n })\n }\n return store\n }\n}\n\nfunction useQuerySubscription<R = any>(options: {\n getStore: (abort: Aborter) => Promise<GroqStore>\n projectId: string\n query: string\n params: Params\n initialData: R\n enabled: boolean\n token?: string\n}) {\n const {getStore, projectId, query, initialData, enabled = false, token} = options\n const [error, setError] = useState<Error>()\n const [loading, setLoading] = useState(false)\n const [data, setData] = useState<R>()\n const params = useParams(options.params)\n\n // Use \"deep\" dependency comparison because params are often not _referentially_ equal,\n // but contains the same shallow properties, eg `{\"slug\": \"some-slug\"}`\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n setLoading(true)\n\n const aborter = getAborter()\n let subscription: Subscription | undefined\n getCurrentUser(projectId, aborter, token)\n .then((user) => {\n if (user) {\n return\n }\n\n // eslint-disable-next-line no-console\n console.warn('Not authenticated - preview not available')\n throw new Error('Not authenticated - preview not available')\n })\n .then(() => getStore(aborter))\n .then((store) => {\n subscription = store.subscribe(query, params, (err, result) => {\n if (err) {\n setError(err)\n } else {\n setData(result)\n }\n })\n })\n .catch((err: Error) => (err.name === 'AbortError' ? null : setError(err)))\n .finally(() => setLoading(false))\n\n // eslint-disable-next-line consistent-return\n return () => {\n if (subscription) {\n subscription.unsubscribe()\n }\n\n aborter.abort()\n }\n }, [getStore, query, params, enabled, projectId, token])\n\n return {\n data: typeof data === 'undefined' ? initialData : data,\n loading,\n error,\n }\n}\n\n// Return params that are stable with deep equal as long as the key order is the same\nexport function useParams(params: Params): Params {\n const stringifiedParams = useMemo(() => JSON.stringify(params), [params])\n return useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])\n}\n"],"names":["createClient","config","sanityClient","MockAbortController","constructor","_signal","aborted","signal","abort","getAborter","AbortController","createCurrentUserHook","projectId","useCurrentUser","getCurrentUser","token","headers","Authorization","fetch","credentials","then","res","json","id","data","setUser","useState","error","setError","useEffect","aborter","catch","err","name","loading","EMPTY_PARAMS","createPreviewSubscriptionHook","dataset","EventSource","documentLimit","store","usePreviewSubscription","query","options","params","initialData","enabled","useQuerySubscription","getStore","window","groqStore","Error","Promise","reject","listen","overlayDrafts","subscriptionThrottleMs","setLoading","setData","useParams","subscription","user","console","warn","subscribe","result","finally","unsubscribe","stringifiedParams","useMemo","JSON","stringify","parse"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/client.ts","../src/aborter.ts","../src/currentUser.ts","../src/useSubscription.ts"],"sourcesContent":["import type {ClientConfig, SanityClient} from '@sanity/client'\nimport sanityClient from '@sanity/client'\n\nexport function createClient(config: ClientConfig): SanityClient {\n return sanityClient(config)\n}\n","export interface Aborter {\n abort(): void\n signal: AbortSignal\n}\n\nclass MockAbortController {\n _signal = {aborted: false}\n get signal() {\n return this._signal as AbortSignal\n }\n abort() {\n this._signal.aborted = true\n }\n}\n\nexport function getAborter(): Aborter {\n return typeof AbortController === 'undefined'\n ? new MockAbortController()\n : new AbortController()\n}\n","import {useEffect, useState} from 'react'\n\nimport {Aborter, getAborter} from './aborter'\nimport {CurrentUser} from './types'\n\nexport function createCurrentUserHook({projectId}: {projectId: string; dataset?: string}) {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n return () => useCurrentUser(projectId)\n}\n\nexport function getCurrentUser(\n projectId: string,\n abort: Aborter,\n token?: string\n): Promise<CurrentUser | null> {\n const headers = token ? {Authorization: `Bearer ${token}`} : undefined\n return fetch(`https://${projectId}.api.sanity.io/v1/users/me`, {\n credentials: 'include',\n signal: abort.signal,\n headers,\n })\n .then((res) => res.json())\n .then((res) => (res?.id ? res : null))\n}\n\nfunction useCurrentUser(projectId: string) {\n const [data, setUser] = useState<CurrentUser | null>()\n const [error, setError] = useState<Error>()\n\n useEffect(() => {\n const aborter = getAborter()\n getCurrentUser(projectId, aborter)\n .then(setUser)\n .catch((err: Error) => err.name !== 'AbortError' && setError(err))\n\n return () => {\n aborter.abort()\n }\n }, [projectId])\n\n return {data, error, loading: data !== null || !error}\n}\n","import {GroqStore, Subscription} from '@sanity/groq-store'\nimport {useEffect, useMemo, useState} from 'react'\n\nimport {Aborter, getAborter} from './aborter'\nimport {getCurrentUser} from './currentUser'\nimport {Params, ProjectConfig, SubscriptionOptions} from './types'\n\nconst EMPTY_PARAMS = {}\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function createPreviewSubscriptionHook({\n projectId,\n dataset,\n token,\n EventSource,\n documentLimit = 3000,\n}: ProjectConfig & {documentLimit?: number}) {\n // Only construct/setup the store when `getStore()` is called\n let store: Promise<GroqStore>\n\n return function usePreviewSubscription<R = any>(\n query: string,\n options: SubscriptionOptions<R> = {}\n ) {\n const {params = EMPTY_PARAMS, initialData, enabled} = options\n return useQuerySubscription<R>({\n getStore,\n projectId,\n query,\n params,\n initialData: initialData as any,\n enabled: enabled ? typeof window !== 'undefined' : false,\n token,\n })\n }\n\n function getStore(abort: Aborter) {\n if (!store) {\n store = import('@sanity/groq-store').then(({groqStore}) => {\n // Skip creating the groq store if we've been unmounted to save memory and reduce gc pressure\n if (abort.signal.aborted) {\n const error = new Error('Cancelling groq store creation')\n // This ensures we can skip it in the catch block same way\n error.name = 'AbortError'\n return Promise.reject(error)\n }\n\n return groqStore({\n projectId,\n dataset,\n documentLimit,\n token,\n EventSource,\n listen: true,\n overlayDrafts: true,\n subscriptionThrottleMs: 10,\n })\n })\n }\n return store\n }\n}\n\nfunction useQuerySubscription<R = any>(options: {\n getStore: (abort: Aborter) => Promise<GroqStore>\n projectId: string\n query: string\n params: Params\n initialData: R\n enabled: boolean\n token?: string\n}) {\n const {getStore, projectId, query, initialData, enabled = false, token} = options\n const [error, setError] = useState<Error>()\n const [loading, setLoading] = useState(false)\n const [data, setData] = useState<R>()\n const params = useParams(options.params)\n\n // Use \"deep\" dependency comparison because params are often not _referentially_ equal,\n // but contains the same shallow properties, eg `{\"slug\": \"some-slug\"}`\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n setLoading(true)\n\n const aborter = getAborter()\n let subscription: Subscription | undefined\n getCurrentUser(projectId, aborter, token)\n .then((user) => {\n if (user) {\n return\n }\n\n // eslint-disable-next-line no-console\n console.warn('Not authenticated - preview not available')\n throw new Error('Not authenticated - preview not available')\n })\n .then(() => getStore(aborter))\n .then((store) => {\n subscription = store.subscribe(query, params, (err, result) => {\n if (err) {\n setError(err)\n } else {\n setData(result)\n }\n })\n })\n .catch((err: Error) => (err.name === 'AbortError' ? null : setError(err)))\n .finally(() => setLoading(false))\n\n // eslint-disable-next-line consistent-return\n return () => {\n if (subscription) {\n subscription.unsubscribe()\n }\n\n aborter.abort()\n }\n }, [getStore, query, params, enabled, projectId, token])\n\n return {\n data: typeof data === 'undefined' ? initialData : data,\n loading,\n error,\n }\n}\n\n// Return params that are stable with deep equal as long as the key order is the same\nexport function useParams(params: Params): Params {\n const stringifiedParams = useMemo(() => JSON.stringify(params), [params])\n return useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])\n}\n"],"names":["createClient","config","sanityClient","MockAbortController","constructor","_signal","aborted","signal","abort","getAborter","AbortController","createCurrentUserHook","projectId","useCurrentUser","getCurrentUser","token","headers","Authorization","fetch","credentials","then","res","json","id","data","setUser","useState","error","setError","useEffect","aborter","catch","err","name","loading","EMPTY_PARAMS","createPreviewSubscriptionHook","dataset","EventSource","documentLimit","store","usePreviewSubscription","query","options","params","initialData","enabled","useQuerySubscription","getStore","window","groqStore","Error","Promise","reject","listen","overlayDrafts","subscriptionThrottleMs","setLoading","setData","useParams","subscription","user","console","warn","subscribe","result","finally","unsubscribe","stringifiedParams","useMemo","JSON","stringify","parse"],"mappings":"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"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/client.ts","../src/aborter.ts","../src/currentUser.ts","../src/useSubscription.ts"],"sourcesContent":["import type {ClientConfig, SanityClient} from '@sanity/client'\nimport sanityClient from '@sanity/client'\n\nexport function createClient(config: ClientConfig): SanityClient {\n return sanityClient(config)\n}\n","export interface Aborter {\n abort(): void\n signal: AbortSignal\n}\n\nclass MockAbortController {\n _signal = {aborted: false}\n get signal() {\n return this._signal as AbortSignal\n }\n abort() {\n this._signal.aborted = true\n }\n}\n\nexport function getAborter(): Aborter {\n return typeof AbortController === 'undefined'\n ? new MockAbortController()\n : new AbortController()\n}\n","import {useEffect, useState} from 'react'\n\nimport {Aborter, getAborter} from './aborter'\nimport {CurrentUser} from './types'\n\nexport function createCurrentUserHook({projectId}: {projectId: string; dataset?: string}) {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n return () => useCurrentUser(projectId)\n}\n\nexport function getCurrentUser(\n projectId: string,\n abort: Aborter,\n token?: string\n): Promise<CurrentUser | null> {\n const headers = token ? {Authorization: `Bearer ${token}`} : undefined\n return fetch(`https://${projectId}.api.sanity.io/v1/users/me`, {\n credentials: 'include',\n signal: abort.signal,\n headers,\n })\n .then((res) => res.json())\n .then((res) => (res?.id ? res : null))\n}\n\nfunction useCurrentUser(projectId: string) {\n const [data, setUser] = useState<CurrentUser | null>()\n const [error, setError] = useState<Error>()\n\n useEffect(() => {\n const aborter = getAborter()\n getCurrentUser(projectId, aborter)\n .then(setUser)\n .catch((err: Error) => err.name !== 'AbortError' && setError(err))\n\n return () => {\n aborter.abort()\n }\n }, [projectId])\n\n return {data, error, loading: data !== null || !error}\n}\n","import {GroqStore, Subscription} from '@sanity/groq-store'\nimport {useEffect, useMemo, useState} from 'react'\n\nimport {Aborter, getAborter} from './aborter'\nimport {getCurrentUser} from './currentUser'\nimport {ProjectConfig} from './types'\n\nconst EMPTY_PARAMS = {}\n\nexport type Params = Record<string, unknown>\nexport interface SubscriptionOptions<R = any> {\n enabled?: boolean\n params?: Params\n initialData?: R\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function createPreviewSubscriptionHook({\n projectId,\n dataset,\n token,\n EventSource,\n documentLimit = 3000,\n}: ProjectConfig & {documentLimit?: number}) {\n // Only construct/setup the store when `getStore()` is called\n let store: Promise<GroqStore>\n\n return function usePreviewSubscription<R = any>(\n query: string,\n options: SubscriptionOptions<R> = {}\n ) {\n const {params = EMPTY_PARAMS, initialData, enabled} = options\n return useQuerySubscription<R>({\n getStore,\n projectId,\n query,\n params,\n initialData: initialData as any,\n enabled: enabled ? typeof window !== 'undefined' : false,\n token,\n })\n }\n\n function getStore(abort: Aborter) {\n if (!store) {\n store = import('@sanity/groq-store').then(({groqStore}) => {\n // Skip creating the groq store if we've been unmounted to save memory and reduce gc pressure\n if (abort.signal.aborted) {\n const error = new Error('Cancelling groq store creation')\n // This ensures we can skip it in the catch block same way\n error.name = 'AbortError'\n return Promise.reject(error)\n }\n\n return groqStore({\n projectId,\n dataset,\n documentLimit,\n token,\n EventSource,\n listen: true,\n overlayDrafts: true,\n subscriptionThrottleMs: 10,\n })\n })\n }\n return store\n }\n}\n\nfunction useQuerySubscription<R = any>(options: {\n getStore: (abort: Aborter) => Promise<GroqStore>\n projectId: string\n query: string\n params: Params\n initialData: R\n enabled: boolean\n token?: string\n}) {\n const {getStore, projectId, query, initialData, enabled = false, token} = options\n const [error, setError] = useState<Error>()\n const [loading, setLoading] = useState(false)\n const [data, setData] = useState<R>()\n const params = useParams(options.params)\n\n // Use \"deep\" dependency comparison because params are often not _referentially_ equal,\n // but contains the same shallow properties, eg `{\"slug\": \"some-slug\"}`\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n setLoading(true)\n\n const aborter = getAborter()\n let subscription: Subscription | undefined\n getCurrentUser(projectId, aborter, token)\n .then((user) => {\n if (user) {\n return\n }\n\n // eslint-disable-next-line no-console\n console.warn('Not authenticated - preview not available')\n throw new Error('Not authenticated - preview not available')\n })\n .then(() => getStore(aborter))\n .then((store) => {\n subscription = store.subscribe(query, params, (err, result) => {\n if (err) {\n setError(err)\n } else {\n setData(result)\n }\n })\n })\n .catch((err: Error) => (err.name === 'AbortError' ? null : setError(err)))\n .finally(() => setLoading(false))\n\n // eslint-disable-next-line consistent-return\n return () => {\n if (subscription) {\n subscription.unsubscribe()\n }\n\n aborter.abort()\n }\n }, [getStore, query, params, enabled, projectId, token])\n\n return {\n data: typeof data === 'undefined' ? initialData : data,\n loading,\n error,\n }\n}\n\n// Return params that are stable with deep equal as long as the key order is the same\nexport function useParams(params: Params): Params {\n const stringifiedParams = useMemo(() => JSON.stringify(params), [params])\n return useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])\n}\n"],"names":["createClient","config","sanityClient","MockAbortController","constructor","_signal","aborted","signal","abort","getAborter","AbortController","createCurrentUserHook","projectId","useCurrentUser","getCurrentUser","token","headers","Authorization","fetch","credentials","then","res","json","id","data","setUser","useState","error","setError","useEffect","aborter","catch","err","name","loading","EMPTY_PARAMS","createPreviewSubscriptionHook","dataset","EventSource","documentLimit","store","usePreviewSubscription","query","options","params","initialData","enabled","useQuerySubscription","getStore","window","Promise","resolve","_interopNamespace","require","groqStore","Error","reject","listen","overlayDrafts","subscriptionThrottleMs","setLoading","setData","useParams","subscription","user","console","warn","subscribe","result","finally","unsubscribe","stringifiedParams","useMemo","JSON","stringify","parse"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/client.ts","../src/aborter.ts","../src/currentUser.ts","../src/useSubscription.ts"],"sourcesContent":["import type {ClientConfig, SanityClient} from '@sanity/client'\nimport sanityClient from '@sanity/client'\n\nexport function createClient(config: ClientConfig): SanityClient {\n return sanityClient(config)\n}\n","export interface Aborter {\n abort(): void\n signal: AbortSignal\n}\n\nclass MockAbortController {\n _signal = {aborted: false}\n get signal() {\n return this._signal as AbortSignal\n }\n abort() {\n this._signal.aborted = true\n }\n}\n\nexport function getAborter(): Aborter {\n return typeof AbortController === 'undefined'\n ? new MockAbortController()\n : new AbortController()\n}\n","import {useEffect, useState} from 'react'\n\nimport {Aborter, getAborter} from './aborter'\nimport {CurrentUser} from './types'\n\nexport function createCurrentUserHook({projectId}: {projectId: string; dataset?: string}) {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n return () => useCurrentUser(projectId)\n}\n\nexport function getCurrentUser(\n projectId: string,\n abort: Aborter,\n token?: string\n): Promise<CurrentUser | null> {\n const headers = token ? {Authorization: `Bearer ${token}`} : undefined\n return fetch(`https://${projectId}.api.sanity.io/v1/users/me`, {\n credentials: 'include',\n signal: abort.signal,\n headers,\n })\n .then((res) => res.json())\n .then((res) => (res?.id ? res : null))\n}\n\nfunction useCurrentUser(projectId: string) {\n const [data, setUser] = useState<CurrentUser | null>()\n const [error, setError] = useState<Error>()\n\n useEffect(() => {\n const aborter = getAborter()\n getCurrentUser(projectId, aborter)\n .then(setUser)\n .catch((err: Error) => err.name !== 'AbortError' && setError(err))\n\n return () => {\n aborter.abort()\n }\n }, [projectId])\n\n return {data, error, loading: data !== null || !error}\n}\n","import {GroqStore, Subscription} from '@sanity/groq-store'\nimport {useEffect, useMemo, useState} from 'react'\n\nimport {Aborter, getAborter} from './aborter'\nimport {getCurrentUser} from './currentUser'\nimport {Params, ProjectConfig, SubscriptionOptions} from './types'\n\nconst EMPTY_PARAMS = {}\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function createPreviewSubscriptionHook({\n projectId,\n dataset,\n token,\n EventSource,\n documentLimit = 3000,\n}: ProjectConfig & {documentLimit?: number}) {\n // Only construct/setup the store when `getStore()` is called\n let store: Promise<GroqStore>\n\n return function usePreviewSubscription<R = any>(\n query: string,\n options: SubscriptionOptions<R> = {}\n ) {\n const {params = EMPTY_PARAMS, initialData, enabled} = options\n return useQuerySubscription<R>({\n getStore,\n projectId,\n query,\n params,\n initialData: initialData as any,\n enabled: enabled ? typeof window !== 'undefined' : false,\n token,\n })\n }\n\n function getStore(abort: Aborter) {\n if (!store) {\n store = import('@sanity/groq-store').then(({groqStore}) => {\n // Skip creating the groq store if we've been unmounted to save memory and reduce gc pressure\n if (abort.signal.aborted) {\n const error = new Error('Cancelling groq store creation')\n // This ensures we can skip it in the catch block same way\n error.name = 'AbortError'\n return Promise.reject(error)\n }\n\n return groqStore({\n projectId,\n dataset,\n documentLimit,\n token,\n EventSource,\n listen: true,\n overlayDrafts: true,\n subscriptionThrottleMs: 10,\n })\n })\n }\n return store\n }\n}\n\nfunction useQuerySubscription<R = any>(options: {\n getStore: (abort: Aborter) => Promise<GroqStore>\n projectId: string\n query: string\n params: Params\n initialData: R\n enabled: boolean\n token?: string\n}) {\n const {getStore, projectId, query, initialData, enabled = false, token} = options\n const [error, setError] = useState<Error>()\n const [loading, setLoading] = useState(false)\n const [data, setData] = useState<R>()\n const params = useParams(options.params)\n\n // Use \"deep\" dependency comparison because params are often not _referentially_ equal,\n // but contains the same shallow properties, eg `{\"slug\": \"some-slug\"}`\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n setLoading(true)\n\n const aborter = getAborter()\n let subscription: Subscription | undefined\n getCurrentUser(projectId, aborter, token)\n .then((user) => {\n if (user) {\n return\n }\n\n // eslint-disable-next-line no-console\n console.warn('Not authenticated - preview not available')\n throw new Error('Not authenticated - preview not available')\n })\n .then(() => getStore(aborter))\n .then((store) => {\n subscription = store.subscribe(query, params, (err, result) => {\n if (err) {\n setError(err)\n } else {\n setData(result)\n }\n })\n })\n .catch((err: Error) => (err.name === 'AbortError' ? null : setError(err)))\n .finally(() => setLoading(false))\n\n // eslint-disable-next-line consistent-return\n return () => {\n if (subscription) {\n subscription.unsubscribe()\n }\n\n aborter.abort()\n }\n }, [getStore, query, params, enabled, projectId, token])\n\n return {\n data: typeof data === 'undefined' ? initialData : data,\n loading,\n error,\n }\n}\n\n// Return params that are stable with deep equal as long as the key order is the same\nexport function useParams(params: Params): Params {\n const stringifiedParams = useMemo(() => JSON.stringify(params), [params])\n return useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])\n}\n"],"names":["createClient","config","sanityClient","MockAbortController","constructor","_signal","aborted","signal","abort","getAborter","AbortController","createCurrentUserHook","projectId","useCurrentUser","getCurrentUser","token","headers","Authorization","fetch","credentials","then","res","json","id","data","setUser","useState","error","setError","useEffect","aborter","catch","err","name","loading","EMPTY_PARAMS","createPreviewSubscriptionHook","dataset","EventSource","documentLimit","store","usePreviewSubscription","query","options","params","initialData","enabled","useQuerySubscription","getStore","window","Promise","resolve","_interopNamespace","require","groqStore","Error","reject","listen","overlayDrafts","subscriptionThrottleMs","setLoading","setData","useParams","subscription","user","console","warn","subscribe","result","finally","unsubscribe","stringifiedParams","useMemo","JSON","stringify","parse"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "next-sanity",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Sanity.io toolkit for Next.js",
5
5
  "keywords": [
6
6
  "sanity",
@@ -80,44 +80,44 @@
80
80
  },
81
81
  "dependencies": {
82
82
  "@sanity/client": "^3.4.1",
83
- "@sanity/groq-store": "^0.4.1",
83
+ "@sanity/groq-store": "^1.0.2",
84
84
  "groq": "^2.33.2"
85
85
  },
86
86
  "devDependencies": {
87
87
  "@async-fn/jest": "^1.6.4",
88
- "@rollup/plugin-url": "^8.0.0",
88
+ "@rollup/plugin-url": "^8.0.1",
89
89
  "@sanity/eslint-config-studio": "^2.0.0",
90
- "@sanity/pkg-utils": "^1.15.0",
90
+ "@sanity/pkg-utils": "^1.16.0",
91
91
  "@sanity/semantic-release-preset": "^2.0.2",
92
92
  "@testing-library/react-hooks": "^8.0.1",
93
- "@types/eventsource": "^1.1.9",
94
- "@types/jest": "^29.1.2",
95
- "@types/react": "^18.0.21",
96
- "@types/react-dom": "^18.0.6",
93
+ "@types/eventsource": "^1.1.10",
94
+ "@types/jest": "^29.2.0",
95
+ "@types/react": "^18.0.24",
96
+ "@types/react-dom": "^18.0.8",
97
97
  "@types/styled-components": "^5.1.26",
98
- "@typescript-eslint/eslint-plugin": "^5.39.0",
99
- "eslint": "^8.25.0",
100
- "eslint-config-next": "^12.3.1",
98
+ "@typescript-eslint/eslint-plugin": "^5.41.0",
99
+ "eslint": "^8.26.0",
100
+ "eslint-config-next": "^13.0.0",
101
101
  "eslint-config-prettier": "^8.5.0",
102
102
  "eslint-config-sanity": "^6.0.0",
103
103
  "eslint-gitignore": "^0.1.0",
104
104
  "eslint-plugin-prettier": "^4.2.1",
105
105
  "eslint-plugin-simple-import-sort": "^8.0.0",
106
- "jest": "^29.1.2",
107
- "jest-environment-jsdom": "^29.1.2",
108
- "next": "^12.3.1",
106
+ "jest": "^29.2.2",
107
+ "jest-environment-jsdom": "^29.2.2",
108
+ "next": "^13.0.0",
109
109
  "prettier": "^2.7.1",
110
110
  "prettier-plugin-packagejson": "^2.3.0",
111
111
  "react": "^18.2.0",
112
112
  "react-dom": "^18.2.0",
113
113
  "react-is": "^18.2.0",
114
114
  "rollup": "^2.79.1",
115
- "sanity": "3.0.0-purple-unicorn.6",
115
+ "sanity": "3.0.0-dev-preview.22",
116
116
  "styled-components": "^5.3.6",
117
117
  "typescript": "^4.8.4"
118
118
  },
119
119
  "peerDependencies": {
120
- "next": "^12",
120
+ "next": "^12 || ^13",
121
121
  "react": "^16.3 || ^17 || ^18",
122
122
  "sanity": "dev-preview",
123
123
  "styled-components": "^5.2"
package/src/types.ts CHANGED
@@ -15,3 +15,11 @@ export interface CurrentUser {
15
15
  name: string
16
16
  profileImage?: string
17
17
  }
18
+
19
+ export type Params = Record<string, unknown>
20
+
21
+ export interface SubscriptionOptions<R = any> {
22
+ enabled?: boolean
23
+ params?: Params
24
+ initialData?: R
25
+ }
@@ -3,17 +3,10 @@ import {useEffect, useMemo, useState} from 'react'
3
3
 
4
4
  import {Aborter, getAborter} from './aborter'
5
5
  import {getCurrentUser} from './currentUser'
6
- import {ProjectConfig} from './types'
6
+ import {Params, ProjectConfig, SubscriptionOptions} from './types'
7
7
 
8
8
  const EMPTY_PARAMS = {}
9
9
 
10
- export type Params = Record<string, unknown>
11
- export interface SubscriptionOptions<R = any> {
12
- enabled?: boolean
13
- params?: Params
14
- initialData?: R
15
- }
16
-
17
10
  // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
18
11
  export function createPreviewSubscriptionHook({
19
12
  projectId,