sanity 5.0.0-next-major.14 → 5.0.0-next-major.6

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.
Files changed (65) hide show
  1. package/bin/sanity +2 -1
  2. package/lib/_chunks-es/LiveQueries.js +1 -1
  3. package/lib/_chunks-es/LiveQueries.js.map +1 -1
  4. package/lib/_chunks-es/MenuGroup.js +3 -3
  5. package/lib/_chunks-es/MenuGroup.js.map +1 -1
  6. package/lib/_chunks-es/PostMessagePreviewSnapshots.js +2 -2
  7. package/lib/_chunks-es/PostMessagePreviewSnapshots.js.map +1 -1
  8. package/lib/_chunks-es/PresentationToolGrantsCheck.js +54 -54
  9. package/lib/_chunks-es/PresentationToolGrantsCheck.js.map +1 -1
  10. package/lib/_chunks-es/QRCodeSVG.js +1 -1
  11. package/lib/_chunks-es/QRCodeSVG.js.map +1 -1
  12. package/lib/_chunks-es/StructureToolProvider.js +1 -1
  13. package/lib/_chunks-es/StructureToolProvider.js.map +1 -1
  14. package/lib/_chunks-es/VideoPlayer.js +1 -1
  15. package/lib/_chunks-es/VideoPlayer.js.map +1 -1
  16. package/lib/_chunks-es/ViteDevServerStopped.js +6 -6
  17. package/lib/_chunks-es/ViteDevServerStopped.js.map +1 -1
  18. package/lib/_chunks-es/_internal.js +1 -1
  19. package/lib/_chunks-es/_internal.js.map +1 -1
  20. package/lib/_chunks-es/deployApiAction.js +1 -1
  21. package/lib/_chunks-es/deployApiAction.js.map +1 -1
  22. package/lib/_chunks-es/execScript.js +2 -1
  23. package/lib/_chunks-es/execScript.js.map +1 -1
  24. package/lib/_chunks-es/exportAssetsAction.js +1 -1
  25. package/lib/_chunks-es/exportAssetsAction.js.map +1 -1
  26. package/lib/_chunks-es/extractAction.js +2 -1
  27. package/lib/_chunks-es/extractAction.js.map +1 -1
  28. package/lib/_chunks-es/extractManifestAction.js +2 -1
  29. package/lib/_chunks-es/extractManifestAction.js.map +1 -1
  30. package/lib/_chunks-es/generate-help-url.esm.js +1 -1
  31. package/lib/_chunks-es/generate-help-url.esm.js.map +1 -1
  32. package/lib/_chunks-es/getGraphQLAPIs.js +2 -1
  33. package/lib/_chunks-es/getGraphQLAPIs.js.map +1 -1
  34. package/lib/_chunks-es/helpers.js +2 -1
  35. package/lib/_chunks-es/helpers.js.map +1 -1
  36. package/lib/_chunks-es/index2.js +1 -1
  37. package/lib/_chunks-es/index2.js.map +1 -1
  38. package/lib/_chunks-es/index3.js +8 -8
  39. package/lib/_chunks-es/index3.js.map +1 -1
  40. package/lib/_chunks-es/package.js +1 -1
  41. package/lib/_chunks-es/pane.js +140 -140
  42. package/lib/_chunks-es/pane.js.map +1 -1
  43. package/lib/_chunks-es/presentation.js +4 -4
  44. package/lib/_chunks-es/presentation.js.map +1 -1
  45. package/lib/_chunks-es/previewServer.js +2 -1
  46. package/lib/_chunks-es/previewServer.js.map +1 -1
  47. package/lib/_chunks-es/runtime.js +14 -13
  48. package/lib/_chunks-es/runtime.js.map +1 -1
  49. package/lib/_chunks-es/validateAction.js +2 -1
  50. package/lib/_chunks-es/validateAction.js.map +1 -1
  51. package/lib/_chunks-es/validateAction2.js +2 -1
  52. package/lib/_chunks-es/validateAction2.js.map +1 -1
  53. package/lib/_chunks-es/version.js +1 -1
  54. package/lib/_internal/cli/threads/validateDocuments.cjs +1 -1
  55. package/lib/_internal/cli/threads/validateDocuments.cjs.map +1 -1
  56. package/lib/_singletons.d.ts +82 -2
  57. package/lib/_singletons.js +6 -2
  58. package/lib/_singletons.js.map +1 -1
  59. package/lib/desk.d.ts +28 -2
  60. package/lib/index.d.ts +30 -1
  61. package/lib/index.js +3573 -3172
  62. package/lib/index.js.map +1 -1
  63. package/lib/presentation.d.ts +14 -1
  64. package/lib/structure.d.ts +14 -1
  65. package/package.json +32 -32
package/bin/sanity CHANGED
@@ -5,8 +5,9 @@ import fs from 'node:fs'
5
5
  import path from 'node:path'
6
6
  import readPkgUp from 'read-pkg-up'
7
7
  import {createRequire} from 'node:module'
8
+ import {fileURLToPath} from 'node:url'
8
9
 
9
- const __dirname = path.dirname(new URL(import.meta.url).pathname)
10
+ const __dirname = path.dirname(fileURLToPath(import.meta.url))
10
11
  const expectedPath = path.join(__dirname, '..', 'node_modules', '.bin', 'sanity')
11
12
  const require = createRequire(import.meta.url)
12
13
 
@@ -126,7 +126,7 @@ const initialState = {
126
126
  function useLiveQueries() {
127
127
  const $ = c(4), [state, dispatch] = useReducer(reducer, initialState);
128
128
  let t0, t1;
129
- $[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = () => {
129
+ $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = () => {
130
130
  const interval = setInterval(() => dispatch({
131
131
  type: "gc"
132
132
  }), LOADER_QUERY_GC_INTERVAL);
@@ -1 +1 @@
1
- {"version":3,"file":"LiveQueries.js","sources":["../../src/presentation/loader/useLiveEvents.ts","../../src/presentation/loader/utils.ts","../../src/presentation/loader/useLiveQueries.ts","../../src/presentation/loader/LiveQueries.tsx"],"sourcesContent":["import {type LiveEvent, type LiveEventMessage} from '@sanity/client'\nimport {useDeferredValue, useEffect, useReducer, useState} from 'react'\nimport {type SanityClient} from 'sanity'\n\ntype State = {\n /**\n * Growing list over live events with Sync Tags,\n * that can be used to refetch with Sanity Client, using the id as the lastLiveEventId parameter\n */\n messages: LiveEventMessage[]\n /**\n * If the connection experiences a reconnect, or a restart event is received, the counter is incremented.\n * This counter is suitable as a `key` on React Components as a way to reset its internal state and refetch.\n */\n resets: number\n}\n\nexport function reducer(state: State, event: LiveEvent): State {\n switch (event.type) {\n case 'message':\n return {\n ...state,\n messages: [...state.messages, event],\n }\n case 'reconnect':\n case 'restart':\n return {\n ...state,\n messages: [],\n resets: state.resets + 1,\n }\n case 'welcome':\n // no-op\n return state\n default:\n throw Error(\n `Unknown event: ${\n // oxlint-disable-next-line no-explicit-any\n (event as any).type\n }`,\n {cause: event},\n )\n }\n}\n\nexport const initialState: State = {\n messages: [],\n resets: 0,\n}\n\nexport function useLiveEvents(client: SanityClient): State {\n const [state, dispatch] = useReducer(reducer, initialState)\n const [error, setError] = useState<unknown>(null)\n if (error !== null) {\n // Push error to nearest error boundary\n throw error\n }\n\n useEffect(() => {\n const subscription = client.live\n .events({includeDrafts: true, tag: 'presentation-loader'})\n .subscribe({\n next: dispatch,\n error: (err) =>\n setError(\n err instanceof Error\n ? err\n : new Error('Unexpected error in useLiveEvents', {cause: err}),\n ),\n })\n return () => subscription.unsubscribe()\n }, [client.live])\n\n return useDeferredValue(state)\n}\n","import {toPlainText} from '@portabletext/react'\nimport {isPortableTextBlock} from '@portabletext/toolkit'\nimport {type ClientPerspective, type QueryParams} from '@sanity/client'\nimport {type ApplySourceDocumentsUpdateFunction} from '@sanity/client/csm'\nimport {type FIXME} from 'sanity'\n\n/**\n * Used by `applySourceDocuments`\n * @internal\n */\nexport const mapChangedValue: ApplySourceDocumentsUpdateFunction = (\n changedValue: FIXME,\n {previousValue},\n) => {\n if (typeof previousValue === 'string') {\n if (typeof changedValue === 'number') {\n // If the string() function was used in the query, we need to convert the source value to a string as well\n return `${changedValue}`\n }\n // If it's an array in the source, but a string in the query response, it could be pt::text\n if (Array.isArray(changedValue)) {\n if (changedValue.length === 0) {\n // If it's empty assume it's PT and return an empty string\n return ''\n }\n // If the array contains any valid block type, assume the GROQ initially used pt::text on it and do the same conversion\n if (changedValue.some((node) => typeof node === 'object' && isPortableTextBlock(node))) {\n return toPlainText(changedValue)\n }\n }\n }\n\n return changedValue\n}\n\n/**\n * @internal\n */\nexport type QueryCacheKey = `${string}:${string}:${string}`\n/**\n * @internal\n */\nexport function getQueryCacheKey(\n perspective: ClientPerspective,\n query: string,\n params: QueryParams,\n): QueryCacheKey {\n return `${perspective}:${query}:${JSON.stringify(params)}`\n}\n","import {type ClientPerspective} from '@sanity/client'\nimport isEqual from 'fast-deep-equal'\nimport {useDeferredValue, useEffect, useReducer} from 'react'\nimport {type QueryParams} from 'sanity'\n\nimport {LOADER_QUERY_GC_INTERVAL} from '../constants'\nimport {getQueryCacheKey, type QueryCacheKey} from './utils'\n\ntype LiveQueriesState = Map<\n QueryCacheKey,\n {\n query: string\n params: QueryParams\n perspective: ClientPerspective\n }\n>\n\ntype State = {\n queries: LiveQueriesState\n heartbeats: Map<\n QueryCacheKey,\n {\n receivedAt: number\n /**\n * If false it means the query can't safely be garbage collected,\n * as older versions of \\@sanity/core-loader doesn't fire listen events\n * on an interval.\n */\n heartbeat: number | false\n }\n >\n}\n\ntype QueryListenAction = {\n type: 'query-listen'\n payload: {\n perspective: ClientPerspective\n query: string\n params: QueryParams\n heartbeat: number | false\n }\n}\ntype GarbageCollectAction = {type: 'gc'}\ntype Action = QueryListenAction | GarbageCollectAction\n\nfunction gc(state: State): State {\n if (state.queries.size < 1) {\n return state\n }\n\n const now = Date.now()\n const hasAnyExpired = Array.from(state.heartbeats.values()).some(\n (entry) => entry.heartbeat !== false && now > entry.receivedAt + entry.heartbeat,\n )\n if (!hasAnyExpired) {\n return state\n }\n const nextHeartbeats = new Map()\n const nextQueries = new Map()\n for (const [key, entry] of state.heartbeats.entries()) {\n if (entry.heartbeat !== false && now > entry.receivedAt + entry.heartbeat) {\n continue\n }\n nextHeartbeats.set(key, entry)\n nextQueries.set(key, state.queries.get(key))\n }\n\n return {...state, queries: nextQueries, heartbeats: nextHeartbeats}\n}\nfunction queryListen(state: State, {payload}: QueryListenAction): State {\n const key = getQueryCacheKey(payload.perspective, payload.query, payload.params)\n const data = {query: payload.query, params: payload.params, perspective: payload.perspective}\n\n const nextHeartbeats = new Map(state.heartbeats)\n nextHeartbeats.set(key, {\n receivedAt: Date.now(),\n heartbeat: payload.heartbeat,\n })\n\n let nextQueries = state.queries\n /**\n * The data comes from a postMessage event, which uses the structured clone algorithm to serialize state (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#message).\n * This impacts `params`, which is an object, as it will be a new object every time even if the sender is sending the same object instance on their end.\n * It also impacts `perspective`, as it's no longer just a string, but can also be an array of strings.\n * Both cases are handled by fast-deep-equal, which is used to compare the data before deciding wether the state should be updated.\n */\n if (!state.queries.has(key) || !isEqual(state.queries.get(key), data)) {\n nextQueries = new Map(state.queries)\n nextQueries.set(key, data)\n }\n\n return {heartbeats: nextHeartbeats, queries: nextQueries}\n}\n\nexport function reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'query-listen':\n return queryListen(state, action)\n case 'gc':\n return gc(state)\n default:\n throw Error(\n `Unknown action: ${\n // oxlint-disable-next-line no-explicit-any\n (action as any).type\n }`,\n {cause: action},\n )\n }\n}\n\nexport const initialState: State = {\n queries: new Map(),\n heartbeats: new Map(),\n}\n\nexport function useLiveQueries(): [LiveQueriesState, React.ActionDispatch<[action: Action]>] {\n const [state, dispatch] = useReducer(reducer, initialState)\n\n useEffect(() => {\n const interval = setInterval(() => dispatch({type: 'gc'}), LOADER_QUERY_GC_INTERVAL)\n return () => clearInterval(interval)\n }, [])\n\n const queries = useDeferredValue(state.queries)\n return [queries, dispatch]\n}\n","import {\n type ClientPerspective,\n type ContentSourceMap,\n type LiveEventMessage,\n type QueryParams,\n type SyncTag,\n} from '@sanity/client'\nimport {applySourceDocuments, getPublishedId} from '@sanity/client/csm'\nimport {\n type ChannelInstance,\n type Controller,\n createConnectionMachine,\n type StatusEvent,\n} from '@sanity/comlink'\nimport {\n createCompatibilityActors,\n type LoaderControllerMsg,\n type LoaderNodeMsg,\n} from '@sanity/presentation-comlink'\nimport isEqual from 'fast-deep-equal'\nimport {memo, startTransition, useDeferredValue, useEffect, useMemo, useState} from 'react'\nimport {\n isReleasePerspective,\n RELEASES_STUDIO_CLIENT_OPTIONS,\n type SanityClient,\n type SanityDocument,\n useClient,\n useDataset,\n useProjectId,\n} from 'sanity'\nimport {useEffectEvent} from 'use-effect-event'\n\nimport {API_VERSION, MIN_LOADER_QUERY_LISTEN_HEARTBEAT_INTERVAL} from '../constants'\nimport {type LoaderConnection, type PresentationPerspective} from '../types'\nimport {type DocumentOnPage} from '../useDocumentsOnPage'\nimport {useLiveEvents} from './useLiveEvents'\nimport {useLiveQueries} from './useLiveQueries'\nimport {mapChangedValue} from './utils'\n\nexport interface LiveQueriesProps {\n liveDocument: Partial<SanityDocument> | null | undefined\n controller: Controller | undefined\n perspective: ClientPerspective\n onLoadersConnection: (event: StatusEvent) => void\n onDocumentsOnPage: (\n key: string,\n perspective: PresentationPerspective,\n state: DocumentOnPage[],\n ) => void\n}\n\nexport default function LiveQueries(props: LiveQueriesProps): React.JSX.Element {\n const {controller, perspective: activePerspective, onLoadersConnection, onDocumentsOnPage} = props\n\n const [comlink, setComlink] = useState<ChannelInstance<LoaderControllerMsg, LoaderNodeMsg>>()\n const [liveQueries, liveQueriesDispatch] = useLiveQueries()\n\n const projectId = useProjectId()\n const dataset = useDataset()\n\n useEffect((): (() => void) => {\n if (controller) {\n const nextComlink = controller.createChannel<LoaderControllerMsg, LoaderNodeMsg>(\n {\n name: 'presentation',\n connectTo: 'loaders',\n heartbeat: true,\n },\n createConnectionMachine<LoaderControllerMsg, LoaderNodeMsg>().provide({\n actors: createCompatibilityActors<LoaderControllerMsg>(),\n }),\n )\n setComlink(nextComlink)\n\n nextComlink.onStatus(onLoadersConnection)\n\n nextComlink.on('loader/documents', (data) => {\n if (data.projectId === projectId && data.dataset === dataset) {\n onDocumentsOnPage(\n 'loaders',\n // oxlint-disable-next-line no-explicit-any\n data.perspective as unknown as any,\n data.documents,\n )\n }\n })\n\n nextComlink.on('loader/query-listen', (data) => {\n if (data.projectId === projectId && data.dataset === dataset) {\n if (\n typeof data.heartbeat === 'number' &&\n data.heartbeat < MIN_LOADER_QUERY_LISTEN_HEARTBEAT_INTERVAL\n ) {\n throw new Error(\n `Loader query listen heartbeat interval must be at least ${MIN_LOADER_QUERY_LISTEN_HEARTBEAT_INTERVAL}ms`,\n )\n }\n liveQueriesDispatch({\n type: 'query-listen',\n payload: {\n perspective: data.perspective,\n query: data.query,\n params: data.params,\n heartbeat: data.heartbeat ?? false,\n },\n })\n }\n })\n\n return nextComlink.start()\n }\n return () => undefined\n }, [controller, dataset, liveQueriesDispatch, onDocumentsOnPage, onLoadersConnection, projectId])\n\n const studioClient = useClient(\n isReleasePerspective(activePerspective)\n ? RELEASES_STUDIO_CLIENT_OPTIONS\n : {apiVersion: API_VERSION},\n )\n const client = useMemo(\n () =>\n studioClient.withConfig({\n resultSourceMap: 'withKeyArraySelector',\n }),\n [studioClient],\n )\n useEffect(() => {\n if (comlink) {\n comlink.post('loader/perspective', {\n projectId,\n dataset,\n perspective: activePerspective,\n })\n }\n }, [comlink, activePerspective, projectId, dataset])\n\n /**\n * Defer the liveDocument to avoid unnecessary rerenders on rapid edits\n */\n const liveDocument = useDeferredValue(props.liveDocument)\n\n const liveEvents = useLiveEvents(client)\n\n return (\n <>\n {[...liveQueries.entries()].map(([key, {query, params, perspective}]) => (\n <QuerySubscription\n key={`${liveEvents.resets}:${key}`}\n projectId={projectId}\n dataset={dataset}\n perspective={perspective}\n query={query}\n params={params}\n comlink={comlink}\n client={client}\n liveDocument={liveDocument}\n liveEventsMessages={liveEvents.messages}\n />\n ))}\n </>\n )\n}\n\ninterface SharedProps {\n /**\n * The Sanity client to use for fetching data and listening to mutations.\n */\n client: SanityClient\n}\n\ninterface QuerySubscriptionProps extends Pick<\n UseQuerySubscriptionProps,\n 'client' | 'liveDocument' | 'liveEventsMessages'\n> {\n projectId: string\n dataset: string\n perspective: ClientPerspective\n query: string\n params: QueryParams\n comlink: LoaderConnection | undefined\n}\nfunction QuerySubscriptionComponent(props: QuerySubscriptionProps) {\n const {\n projectId,\n dataset,\n perspective,\n query,\n client,\n liveDocument,\n params,\n comlink,\n liveEventsMessages,\n } = props\n\n const {\n result,\n resultSourceMap,\n syncTags: tags,\n } = useQuerySubscription({\n client,\n liveDocument,\n params,\n perspective,\n query,\n liveEventsMessages,\n }) || {}\n\n /* eslint-disable @typescript-eslint/no-shadow,max-params */\n const handleQueryChange = useEffectEvent(\n (\n comlink: LoaderConnection | undefined,\n perspective: ClientPerspective,\n query: string,\n params: QueryParams,\n result: unknown,\n resultSourceMap: ContentSourceMap | undefined,\n tags: `s1:${string}`[] | undefined,\n ) => {\n comlink?.post('loader/query-change', {\n projectId,\n dataset,\n perspective,\n query,\n params,\n result,\n resultSourceMap,\n tags,\n })\n },\n )\n /* eslint-enable @typescript-eslint/no-shadow,max-params */\n\n useEffect(() => {\n if (resultSourceMap) {\n handleQueryChange(comlink, perspective, query, params, result, resultSourceMap, tags)\n }\n return undefined\n }, [comlink, params, perspective, query, result, resultSourceMap, tags])\n\n return null\n}\nconst QuerySubscription = memo(QuerySubscriptionComponent)\nQuerySubscription.displayName = 'Memo(QuerySubscription)'\n\ninterface UseQuerySubscriptionProps extends Required<Pick<SharedProps, 'client'>> {\n liveDocument: Partial<SanityDocument> | null | undefined\n query: string\n params: QueryParams\n perspective: ClientPerspective\n liveEventsMessages: LiveEventMessage[]\n}\nfunction useQuerySubscription(props: UseQuerySubscriptionProps) {\n const {liveDocument, client, query, params, perspective, liveEventsMessages} = props\n const [result, setResult] = useState<unknown>(null)\n const [resultSourceMap, setResultSourceMap] = useState<ContentSourceMap | null | undefined>(null)\n const [syncTags, setSyncTags] = useState<SyncTag[] | undefined>(undefined)\n const [skipEventIds] = useState(() => new Set(liveEventsMessages.map((msg) => msg.id)))\n const recentLiveEvents = liveEventsMessages.filter((msg) => !skipEventIds.has(msg.id))\n const lastLiveEvent = recentLiveEvents.findLast((msg) =>\n msg.tags.some((tag) => syncTags?.includes(tag)),\n )\n const lastLiveEventId = lastLiveEvent?.id\n\n // Make sure any async errors bubble up to the nearest error boundary\n const [error, setError] = useState<unknown>(null)\n if (error) throw error\n\n /* eslint-disable max-nested-callbacks */\n useEffect(() => {\n const controller = new AbortController()\n\n client\n .fetch(query, params, {\n lastLiveEventId,\n tag: 'presentation-loader',\n signal: controller.signal,\n perspective,\n filterResponse: false,\n returnQuery: false,\n })\n .then((response) => {\n startTransition(() => {\n setResult((prev: unknown) => (isEqual(prev, response.result) ? prev : response.result))\n setResultSourceMap((prev) =>\n isEqual(prev, response.resultSourceMap) ? prev : response.resultSourceMap,\n )\n setSyncTags((prev) => (isEqual(prev, response.syncTags) ? prev : response.syncTags))\n })\n })\n .catch((err) => {\n if (typeof err !== 'object' || err?.name !== 'AbortError') {\n setError(err)\n }\n })\n\n return () => {\n controller.abort()\n }\n }, [client, lastLiveEventId, params, perspective, query])\n /* eslint-enable max-nested-callbacks */\n\n return useMemo(() => {\n if (liveDocument && resultSourceMap) {\n return {\n result: turboChargeResultIfSourceMap(liveDocument, result, perspective, resultSourceMap),\n resultSourceMap,\n syncTags,\n }\n }\n return {result, resultSourceMap, syncTags}\n }, [liveDocument, perspective, result, resultSourceMap, syncTags])\n}\n\nexport function turboChargeResultIfSourceMap<T = unknown>(\n liveDocument: Partial<SanityDocument> | null | undefined,\n result: T,\n perspective: ClientPerspective,\n resultSourceMap?: ContentSourceMap,\n): T {\n if (perspective === 'raw') {\n throw new Error('turboChargeResultIfSourceMap does not support raw perspective')\n }\n return applySourceDocuments(\n result,\n resultSourceMap,\n (sourceDocument) => {\n // If there's a displayed document, always prefer it\n if (\n // If _projectId is set, it's a cross dataset reference and we should skip it\n !sourceDocument._projectId &&\n liveDocument?._id &&\n getPublishedId(liveDocument._id) === getPublishedId(sourceDocument._id)\n ) {\n if (typeof liveDocument._id === 'string' && typeof sourceDocument._type === 'string') {\n return liveDocument as unknown as Required<Pick<SanityDocument, '_id' | '_type'>>\n }\n return {\n ...liveDocument,\n _id: liveDocument._id || sourceDocument._id,\n _type: liveDocument._type || sourceDocument._type,\n }\n }\n return null\n },\n mapChangedValue,\n perspective,\n )\n}\n"],"names":["reducer","state","event","type","messages","resets","Error","cause","initialState","useLiveEvents","client","$","_c","dispatch","useReducer","error","setError","useState","t0","t1","live","subscription","events","includeDrafts","tag","subscribe","next","err","unsubscribe","useEffect","useDeferredValue","mapChangedValue","changedValue","previousValue","Array","isArray","length","some","node","isPortableTextBlock","toPlainText","getQueryCacheKey","perspective","query","params","JSON","stringify","gc","queries","size","now","Date","from","heartbeats","values","entry","heartbeat","receivedAt","nextHeartbeats","Map","nextQueries","key","entries","set","get","queryListen","payload","data","has","isEqual","action","useLiveQueries","Symbol","for","interval","setInterval","LOADER_QUERY_GC_INTERVAL","clearInterval","t2","LiveQueries","props","controller","activePerspective","onLoadersConnection","onDocumentsOnPage","comlink","setComlink","liveQueries","liveQueriesDispatch","projectId","useProjectId","dataset","useDataset","nextComlink","createChannel","name","connectTo","createConnectionMachine","provide","actors","createCompatibilityActors","onStatus","on","documents","data_0","MIN_LOADER_QUERY_LISTEN_HEARTBEAT_INTERVAL","start","_temp","isReleasePerspective","RELEASES_STUDIO_CLIENT_OPTIONS","apiVersion","API_VERSION","studioClient","useClient","t3","withConfig","resultSourceMap","t4","t5","post","liveDocument","liveEvents","t6","t7","map","t8","t9","QuerySubscriptionComponent","liveEventsMessages","result","syncTags","tags","useQuerySubscription","comlink_0","perspective_0","query_0","params_0","result_0","resultSourceMap_0","tags_0","handleQueryChange","useEffectEvent","QuerySubscription","memo","displayName","setResult","setResultSourceMap","setSyncTags","undefined","Set","_temp2","skipEventIds","msg_0","msg","id","recentLiveEvents","filter","msg_1","includes","findLast","lastLiveEventId","AbortController","fetch","signal","filterResponse","returnQuery","then","response","startTransition","prev","prev_0","prev_1","catch","abort","bb0","turboChargeResultIfSourceMap","applySourceDocuments","sourceDocument","_projectId","_id","getPublishedId","_type"],"mappings":"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"}
1
+ {"version":3,"file":"LiveQueries.js","sources":["../../src/presentation/loader/useLiveEvents.ts","../../src/presentation/loader/utils.ts","../../src/presentation/loader/useLiveQueries.ts","../../src/presentation/loader/LiveQueries.tsx"],"sourcesContent":["import {type LiveEvent, type LiveEventMessage} from '@sanity/client'\nimport {useDeferredValue, useEffect, useReducer, useState} from 'react'\nimport {type SanityClient} from 'sanity'\n\ntype State = {\n /**\n * Growing list over live events with Sync Tags,\n * that can be used to refetch with Sanity Client, using the id as the lastLiveEventId parameter\n */\n messages: LiveEventMessage[]\n /**\n * If the connection experiences a reconnect, or a restart event is received, the counter is incremented.\n * This counter is suitable as a `key` on React Components as a way to reset its internal state and refetch.\n */\n resets: number\n}\n\nexport function reducer(state: State, event: LiveEvent): State {\n switch (event.type) {\n case 'message':\n return {\n ...state,\n messages: [...state.messages, event],\n }\n case 'reconnect':\n case 'restart':\n return {\n ...state,\n messages: [],\n resets: state.resets + 1,\n }\n case 'welcome':\n // no-op\n return state\n default:\n throw Error(\n `Unknown event: ${\n // oxlint-disable-next-line no-explicit-any\n (event as any).type\n }`,\n {cause: event},\n )\n }\n}\n\nexport const initialState: State = {\n messages: [],\n resets: 0,\n}\n\nexport function useLiveEvents(client: SanityClient): State {\n const [state, dispatch] = useReducer(reducer, initialState)\n const [error, setError] = useState<unknown>(null)\n if (error !== null) {\n // Push error to nearest error boundary\n throw error\n }\n\n useEffect(() => {\n const subscription = client.live\n .events({includeDrafts: true, tag: 'presentation-loader'})\n .subscribe({\n next: dispatch,\n error: (err) =>\n setError(\n err instanceof Error\n ? err\n : new Error('Unexpected error in useLiveEvents', {cause: err}),\n ),\n })\n return () => subscription.unsubscribe()\n }, [client.live])\n\n return useDeferredValue(state)\n}\n","import {toPlainText} from '@portabletext/react'\nimport {isPortableTextBlock} from '@portabletext/toolkit'\nimport {type ClientPerspective, type QueryParams} from '@sanity/client'\nimport {type ApplySourceDocumentsUpdateFunction} from '@sanity/client/csm'\nimport {type FIXME} from 'sanity'\n\n/**\n * Used by `applySourceDocuments`\n * @internal\n */\nexport const mapChangedValue: ApplySourceDocumentsUpdateFunction = (\n changedValue: FIXME,\n {previousValue},\n) => {\n if (typeof previousValue === 'string') {\n if (typeof changedValue === 'number') {\n // If the string() function was used in the query, we need to convert the source value to a string as well\n return `${changedValue}`\n }\n // If it's an array in the source, but a string in the query response, it could be pt::text\n if (Array.isArray(changedValue)) {\n if (changedValue.length === 0) {\n // If it's empty assume it's PT and return an empty string\n return ''\n }\n // If the array contains any valid block type, assume the GROQ initially used pt::text on it and do the same conversion\n if (changedValue.some((node) => typeof node === 'object' && isPortableTextBlock(node))) {\n return toPlainText(changedValue)\n }\n }\n }\n\n return changedValue\n}\n\n/**\n * @internal\n */\nexport type QueryCacheKey = `${string}:${string}:${string}`\n/**\n * @internal\n */\nexport function getQueryCacheKey(\n perspective: ClientPerspective,\n query: string,\n params: QueryParams,\n): QueryCacheKey {\n return `${perspective}:${query}:${JSON.stringify(params)}`\n}\n","import {type ClientPerspective} from '@sanity/client'\nimport isEqual from 'fast-deep-equal'\nimport {useDeferredValue, useEffect, useReducer} from 'react'\nimport {type QueryParams} from 'sanity'\n\nimport {LOADER_QUERY_GC_INTERVAL} from '../constants'\nimport {getQueryCacheKey, type QueryCacheKey} from './utils'\n\ntype LiveQueriesState = Map<\n QueryCacheKey,\n {\n query: string\n params: QueryParams\n perspective: ClientPerspective\n }\n>\n\ntype State = {\n queries: LiveQueriesState\n heartbeats: Map<\n QueryCacheKey,\n {\n receivedAt: number\n /**\n * If false it means the query can't safely be garbage collected,\n * as older versions of \\@sanity/core-loader doesn't fire listen events\n * on an interval.\n */\n heartbeat: number | false\n }\n >\n}\n\ntype QueryListenAction = {\n type: 'query-listen'\n payload: {\n perspective: ClientPerspective\n query: string\n params: QueryParams\n heartbeat: number | false\n }\n}\ntype GarbageCollectAction = {type: 'gc'}\ntype Action = QueryListenAction | GarbageCollectAction\n\nfunction gc(state: State): State {\n if (state.queries.size < 1) {\n return state\n }\n\n const now = Date.now()\n const hasAnyExpired = Array.from(state.heartbeats.values()).some(\n (entry) => entry.heartbeat !== false && now > entry.receivedAt + entry.heartbeat,\n )\n if (!hasAnyExpired) {\n return state\n }\n const nextHeartbeats = new Map()\n const nextQueries = new Map()\n for (const [key, entry] of state.heartbeats.entries()) {\n if (entry.heartbeat !== false && now > entry.receivedAt + entry.heartbeat) {\n continue\n }\n nextHeartbeats.set(key, entry)\n nextQueries.set(key, state.queries.get(key))\n }\n\n return {...state, queries: nextQueries, heartbeats: nextHeartbeats}\n}\nfunction queryListen(state: State, {payload}: QueryListenAction): State {\n const key = getQueryCacheKey(payload.perspective, payload.query, payload.params)\n const data = {query: payload.query, params: payload.params, perspective: payload.perspective}\n\n const nextHeartbeats = new Map(state.heartbeats)\n nextHeartbeats.set(key, {\n receivedAt: Date.now(),\n heartbeat: payload.heartbeat,\n })\n\n let nextQueries = state.queries\n /**\n * The data comes from a postMessage event, which uses the structured clone algorithm to serialize state (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#message).\n * This impacts `params`, which is an object, as it will be a new object every time even if the sender is sending the same object instance on their end.\n * It also impacts `perspective`, as it's no longer just a string, but can also be an array of strings.\n * Both cases are handled by fast-deep-equal, which is used to compare the data before deciding wether the state should be updated.\n */\n if (!state.queries.has(key) || !isEqual(state.queries.get(key), data)) {\n nextQueries = new Map(state.queries)\n nextQueries.set(key, data)\n }\n\n return {heartbeats: nextHeartbeats, queries: nextQueries}\n}\n\nexport function reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'query-listen':\n return queryListen(state, action)\n case 'gc':\n return gc(state)\n default:\n throw Error(\n `Unknown action: ${\n // oxlint-disable-next-line no-explicit-any\n (action as any).type\n }`,\n {cause: action},\n )\n }\n}\n\nexport const initialState: State = {\n queries: new Map(),\n heartbeats: new Map(),\n}\n\nexport function useLiveQueries(): [LiveQueriesState, React.ActionDispatch<[action: Action]>] {\n const [state, dispatch] = useReducer(reducer, initialState)\n\n useEffect(() => {\n const interval = setInterval(() => dispatch({type: 'gc'}), LOADER_QUERY_GC_INTERVAL)\n return () => clearInterval(interval)\n }, [])\n\n const queries = useDeferredValue(state.queries)\n return [queries, dispatch]\n}\n","import {\n type ClientPerspective,\n type ContentSourceMap,\n type LiveEventMessage,\n type QueryParams,\n type SyncTag,\n} from '@sanity/client'\nimport {applySourceDocuments, getPublishedId} from '@sanity/client/csm'\nimport {\n type ChannelInstance,\n type Controller,\n createConnectionMachine,\n type StatusEvent,\n} from '@sanity/comlink'\nimport {\n createCompatibilityActors,\n type LoaderControllerMsg,\n type LoaderNodeMsg,\n} from '@sanity/presentation-comlink'\nimport isEqual from 'fast-deep-equal'\nimport {memo, startTransition, useDeferredValue, useEffect, useMemo, useState} from 'react'\nimport {\n isReleasePerspective,\n RELEASES_STUDIO_CLIENT_OPTIONS,\n type SanityClient,\n type SanityDocument,\n useClient,\n useDataset,\n useProjectId,\n} from 'sanity'\nimport {useEffectEvent} from 'use-effect-event'\n\nimport {API_VERSION, MIN_LOADER_QUERY_LISTEN_HEARTBEAT_INTERVAL} from '../constants'\nimport {type LoaderConnection, type PresentationPerspective} from '../types'\nimport {type DocumentOnPage} from '../useDocumentsOnPage'\nimport {useLiveEvents} from './useLiveEvents'\nimport {useLiveQueries} from './useLiveQueries'\nimport {mapChangedValue} from './utils'\n\nexport interface LiveQueriesProps {\n liveDocument: Partial<SanityDocument> | null | undefined\n controller: Controller | undefined\n perspective: ClientPerspective\n onLoadersConnection: (event: StatusEvent) => void\n onDocumentsOnPage: (\n key: string,\n perspective: PresentationPerspective,\n state: DocumentOnPage[],\n ) => void\n}\n\nexport default function LiveQueries(props: LiveQueriesProps): React.JSX.Element {\n const {controller, perspective: activePerspective, onLoadersConnection, onDocumentsOnPage} = props\n\n const [comlink, setComlink] = useState<ChannelInstance<LoaderControllerMsg, LoaderNodeMsg>>()\n const [liveQueries, liveQueriesDispatch] = useLiveQueries()\n\n const projectId = useProjectId()\n const dataset = useDataset()\n\n useEffect((): (() => void) => {\n if (controller) {\n const nextComlink = controller.createChannel<LoaderControllerMsg, LoaderNodeMsg>(\n {\n name: 'presentation',\n connectTo: 'loaders',\n heartbeat: true,\n },\n createConnectionMachine<LoaderControllerMsg, LoaderNodeMsg>().provide({\n actors: createCompatibilityActors<LoaderControllerMsg>(),\n }),\n )\n setComlink(nextComlink)\n\n nextComlink.onStatus(onLoadersConnection)\n\n nextComlink.on('loader/documents', (data) => {\n if (data.projectId === projectId && data.dataset === dataset) {\n onDocumentsOnPage(\n 'loaders',\n // oxlint-disable-next-line no-explicit-any\n data.perspective as unknown as any,\n data.documents,\n )\n }\n })\n\n nextComlink.on('loader/query-listen', (data) => {\n if (data.projectId === projectId && data.dataset === dataset) {\n if (\n typeof data.heartbeat === 'number' &&\n data.heartbeat < MIN_LOADER_QUERY_LISTEN_HEARTBEAT_INTERVAL\n ) {\n throw new Error(\n `Loader query listen heartbeat interval must be at least ${MIN_LOADER_QUERY_LISTEN_HEARTBEAT_INTERVAL}ms`,\n )\n }\n liveQueriesDispatch({\n type: 'query-listen',\n payload: {\n perspective: data.perspective,\n query: data.query,\n params: data.params,\n heartbeat: data.heartbeat ?? false,\n },\n })\n }\n })\n\n return nextComlink.start()\n }\n return () => undefined\n }, [controller, dataset, liveQueriesDispatch, onDocumentsOnPage, onLoadersConnection, projectId])\n\n const studioClient = useClient(\n isReleasePerspective(activePerspective)\n ? RELEASES_STUDIO_CLIENT_OPTIONS\n : {apiVersion: API_VERSION},\n )\n const client = useMemo(\n () =>\n studioClient.withConfig({\n resultSourceMap: 'withKeyArraySelector',\n }),\n [studioClient],\n )\n useEffect(() => {\n if (comlink) {\n comlink.post('loader/perspective', {\n projectId,\n dataset,\n perspective: activePerspective,\n })\n }\n }, [comlink, activePerspective, projectId, dataset])\n\n /**\n * Defer the liveDocument to avoid unnecessary rerenders on rapid edits\n */\n const liveDocument = useDeferredValue(props.liveDocument)\n\n const liveEvents = useLiveEvents(client)\n\n return (\n <>\n {[...liveQueries.entries()].map(([key, {query, params, perspective}]) => (\n <QuerySubscription\n key={`${liveEvents.resets}:${key}`}\n projectId={projectId}\n dataset={dataset}\n perspective={perspective}\n query={query}\n params={params}\n comlink={comlink}\n client={client}\n liveDocument={liveDocument}\n liveEventsMessages={liveEvents.messages}\n />\n ))}\n </>\n )\n}\n\ninterface SharedProps {\n /**\n * The Sanity client to use for fetching data and listening to mutations.\n */\n client: SanityClient\n}\n\ninterface QuerySubscriptionProps extends Pick<\n UseQuerySubscriptionProps,\n 'client' | 'liveDocument' | 'liveEventsMessages'\n> {\n projectId: string\n dataset: string\n perspective: ClientPerspective\n query: string\n params: QueryParams\n comlink: LoaderConnection | undefined\n}\nfunction QuerySubscriptionComponent(props: QuerySubscriptionProps) {\n const {\n projectId,\n dataset,\n perspective,\n query,\n client,\n liveDocument,\n params,\n comlink,\n liveEventsMessages,\n } = props\n\n const {\n result,\n resultSourceMap,\n syncTags: tags,\n } = useQuerySubscription({\n client,\n liveDocument,\n params,\n perspective,\n query,\n liveEventsMessages,\n }) || {}\n\n /* eslint-disable @typescript-eslint/no-shadow,max-params */\n const handleQueryChange = useEffectEvent(\n (\n comlink: LoaderConnection | undefined,\n perspective: ClientPerspective,\n query: string,\n params: QueryParams,\n result: unknown,\n resultSourceMap: ContentSourceMap | undefined,\n tags: `s1:${string}`[] | undefined,\n ) => {\n comlink?.post('loader/query-change', {\n projectId,\n dataset,\n perspective,\n query,\n params,\n result,\n resultSourceMap,\n tags,\n })\n },\n )\n /* eslint-enable @typescript-eslint/no-shadow,max-params */\n\n useEffect(() => {\n if (resultSourceMap) {\n handleQueryChange(comlink, perspective, query, params, result, resultSourceMap, tags)\n }\n return undefined\n }, [comlink, params, perspective, query, result, resultSourceMap, tags])\n\n return null\n}\nconst QuerySubscription = memo(QuerySubscriptionComponent)\nQuerySubscription.displayName = 'Memo(QuerySubscription)'\n\ninterface UseQuerySubscriptionProps extends Required<Pick<SharedProps, 'client'>> {\n liveDocument: Partial<SanityDocument> | null | undefined\n query: string\n params: QueryParams\n perspective: ClientPerspective\n liveEventsMessages: LiveEventMessage[]\n}\nfunction useQuerySubscription(props: UseQuerySubscriptionProps) {\n const {liveDocument, client, query, params, perspective, liveEventsMessages} = props\n const [result, setResult] = useState<unknown>(null)\n const [resultSourceMap, setResultSourceMap] = useState<ContentSourceMap | null | undefined>(null)\n const [syncTags, setSyncTags] = useState<SyncTag[] | undefined>(undefined)\n const [skipEventIds] = useState(() => new Set(liveEventsMessages.map((msg) => msg.id)))\n const recentLiveEvents = liveEventsMessages.filter((msg) => !skipEventIds.has(msg.id))\n const lastLiveEvent = recentLiveEvents.findLast((msg) =>\n msg.tags.some((tag) => syncTags?.includes(tag)),\n )\n const lastLiveEventId = lastLiveEvent?.id\n\n // Make sure any async errors bubble up to the nearest error boundary\n const [error, setError] = useState<unknown>(null)\n if (error) throw error\n\n /* eslint-disable max-nested-callbacks */\n useEffect(() => {\n const controller = new AbortController()\n\n client\n .fetch(query, params, {\n lastLiveEventId,\n tag: 'presentation-loader',\n signal: controller.signal,\n perspective,\n filterResponse: false,\n returnQuery: false,\n })\n .then((response) => {\n startTransition(() => {\n setResult((prev: unknown) => (isEqual(prev, response.result) ? prev : response.result))\n setResultSourceMap((prev) =>\n isEqual(prev, response.resultSourceMap) ? prev : response.resultSourceMap,\n )\n setSyncTags((prev) => (isEqual(prev, response.syncTags) ? prev : response.syncTags))\n })\n })\n .catch((err) => {\n if (typeof err !== 'object' || err?.name !== 'AbortError') {\n setError(err)\n }\n })\n\n return () => {\n controller.abort()\n }\n }, [client, lastLiveEventId, params, perspective, query])\n /* eslint-enable max-nested-callbacks */\n\n return useMemo(() => {\n if (liveDocument && resultSourceMap) {\n return {\n result: turboChargeResultIfSourceMap(liveDocument, result, perspective, resultSourceMap),\n resultSourceMap,\n syncTags,\n }\n }\n return {result, resultSourceMap, syncTags}\n }, [liveDocument, perspective, result, resultSourceMap, syncTags])\n}\n\nexport function turboChargeResultIfSourceMap<T = unknown>(\n liveDocument: Partial<SanityDocument> | null | undefined,\n result: T,\n perspective: ClientPerspective,\n resultSourceMap?: ContentSourceMap,\n): T {\n if (perspective === 'raw') {\n throw new Error('turboChargeResultIfSourceMap does not support raw perspective')\n }\n return applySourceDocuments(\n result,\n resultSourceMap,\n (sourceDocument) => {\n // If there's a displayed document, always prefer it\n if (\n // If _projectId is set, it's a cross dataset reference and we should skip it\n !sourceDocument._projectId &&\n liveDocument?._id &&\n getPublishedId(liveDocument._id) === getPublishedId(sourceDocument._id)\n ) {\n if (typeof liveDocument._id === 'string' && typeof sourceDocument._type === 'string') {\n return liveDocument as unknown as Required<Pick<SanityDocument, '_id' | '_type'>>\n }\n return {\n ...liveDocument,\n _id: liveDocument._id || sourceDocument._id,\n _type: liveDocument._type || sourceDocument._type,\n }\n }\n return null\n },\n mapChangedValue,\n perspective,\n )\n}\n"],"names":["reducer","state","event","type","messages","resets","Error","cause","initialState","useLiveEvents","client","$","_c","dispatch","useReducer","error","setError","useState","t0","t1","live","subscription","events","includeDrafts","tag","subscribe","next","err","unsubscribe","useEffect","useDeferredValue","mapChangedValue","changedValue","previousValue","Array","isArray","length","some","node","isPortableTextBlock","toPlainText","getQueryCacheKey","perspective","query","params","JSON","stringify","gc","queries","size","now","Date","from","heartbeats","values","entry","heartbeat","receivedAt","nextHeartbeats","Map","nextQueries","key","entries","set","get","queryListen","payload","data","has","isEqual","action","useLiveQueries","Symbol","for","interval","setInterval","LOADER_QUERY_GC_INTERVAL","clearInterval","t2","LiveQueries","props","controller","activePerspective","onLoadersConnection","onDocumentsOnPage","comlink","setComlink","liveQueries","liveQueriesDispatch","projectId","useProjectId","dataset","useDataset","nextComlink","createChannel","name","connectTo","createConnectionMachine","provide","actors","createCompatibilityActors","onStatus","on","documents","data_0","MIN_LOADER_QUERY_LISTEN_HEARTBEAT_INTERVAL","start","_temp","isReleasePerspective","RELEASES_STUDIO_CLIENT_OPTIONS","apiVersion","API_VERSION","studioClient","useClient","t3","withConfig","resultSourceMap","t4","t5","post","liveDocument","liveEvents","t6","t7","map","t8","t9","QuerySubscriptionComponent","liveEventsMessages","result","syncTags","tags","useQuerySubscription","comlink_0","perspective_0","query_0","params_0","result_0","resultSourceMap_0","tags_0","handleQueryChange","useEffectEvent","QuerySubscription","memo","displayName","setResult","setResultSourceMap","setSyncTags","undefined","Set","_temp2","skipEventIds","msg_0","msg","id","recentLiveEvents","filter","msg_1","includes","findLast","lastLiveEventId","AbortController","fetch","signal","filterResponse","returnQuery","then","response","startTransition","prev","prev_0","prev_1","catch","abort","bb0","turboChargeResultIfSourceMap","applySourceDocuments","sourceDocument","_projectId","_id","getPublishedId","_type"],"mappings":"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"}
@@ -49,16 +49,16 @@ function ConfirmPopoverContent(t0) {
49
49
  event.key === "Escape" && isTopLayer && onCancel();
50
50
  }, $[0] = isTopLayer, $[1] = onCancel, $[2] = t1) : t1 = $[2], useGlobalKeyDown(t1);
51
51
  let t2;
52
- $[3] === Symbol.for("react.memo_cache_sentinel") ? (t2 = () => [ref.current], $[3] = t2) : t2 = $[3], useClickOutsideEvent(isTopLayer && onCancel, t2);
52
+ $[3] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t2 = () => [ref.current], $[3] = t2) : t2 = $[3], useClickOutsideEvent(isTopLayer && onCancel, t2);
53
53
  let t3;
54
- $[4] === Symbol.for("react.memo_cache_sentinel") ? (t3 = {
54
+ $[4] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t3 = {
55
55
  minWidth: 280,
56
56
  maxWidth: 350
57
57
  }, $[4] = t3) : t3 = $[4];
58
58
  let t4;
59
59
  $[5] !== message ? (t4 = /* @__PURE__ */ jsx(Box, { flex: 1, overflow: "auto", padding: 4, children: /* @__PURE__ */ jsx(Text, { size: 1, children: message }) }), $[5] = message, $[6] = t4) : t4 = $[6];
60
60
  let t5;
61
- $[7] === Symbol.for("react.memo_cache_sentinel") ? (t5 = {
61
+ $[7] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t5 = {
62
62
  borderTop: "1px solid var(--card-border-color)"
63
63
  }, $[7] = t5) : t5 = $[7];
64
64
  let t6;
@@ -1 +1 @@
1
- {"version":3,"file":"MenuGroup.js","sources":["../../src/ui-components/confirmPopover/ConfirmPopover.tsx","../../src/ui-components/menuGroup/MenuGroup.tsx"],"sourcesContent":["/* eslint-disable no-restricted-imports, @sanity/i18n/no-i18next-import */\nimport {\n Box,\n Button as UIButton,\n Flex,\n Grid,\n Popover as UIPopover,\n type PopoverProps as UIPopoverProps,\n Text,\n useClickOutsideEvent,\n useGlobalKeyDown,\n useLayer,\n} from '@sanity/ui'\nimport {type ComponentType, type ReactNode, useCallback, useRef} from 'react'\nimport {useTranslation} from 'react-i18next'\n\nexport interface ConfirmPopoverProps {\n cancelButtonIcon?: ReactNode | ComponentType\n cancelButtonText?: string\n confirmButtonIcon?: ReactNode | ComponentType\n confirmButtonText?: string\n message: ReactNode\n onCancel: () => void\n onConfirm: () => void\n open: boolean\n referenceElement: HTMLElement | null\n tone?: 'default' | 'primary' | 'positive' | 'caution' | 'critical' | 'neutral' | 'suggest'\n placement?: UIPopoverProps['placement']\n fallbackPlacements?: UIPopoverProps['fallbackPlacements']\n}\n\n/**\n * A popover component for inline confirmation dialogs.\n * Follows the same pattern as document action confirm dialogs.\n *\n * @internal\n */\nexport function ConfirmPopover({\n cancelButtonIcon,\n cancelButtonText,\n confirmButtonIcon,\n confirmButtonText,\n message,\n onCancel,\n onConfirm,\n open,\n referenceElement,\n tone = 'critical',\n placement = 'top',\n fallbackPlacements = ['left', 'bottom'],\n}: ConfirmPopoverProps) {\n if (!open) return null\n\n return (\n <UIPopover\n content={\n <ConfirmPopoverContent\n cancelButtonIcon={cancelButtonIcon}\n cancelButtonText={cancelButtonText}\n confirmButtonIcon={confirmButtonIcon}\n confirmButtonText={confirmButtonText}\n message={message}\n onCancel={onCancel}\n onConfirm={onConfirm}\n tone={tone}\n />\n }\n constrainSize\n fallbackPlacements={fallbackPlacements}\n open\n placement={placement}\n portal\n preventOverflow\n referenceElement={referenceElement}\n />\n )\n}\n\nfunction ConfirmPopoverContent({\n cancelButtonIcon,\n cancelButtonText,\n confirmButtonIcon,\n confirmButtonText,\n message,\n onCancel,\n onConfirm,\n tone,\n}: Omit<ConfirmPopoverProps, 'open' | 'referenceElement' | 'placement' | 'fallbackPlacements'>) {\n const {t} = useTranslation()\n const {isTopLayer} = useLayer()\n const ref = useRef<HTMLDivElement | null>(null)\n\n const handleGlobalKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isTopLayer) onCancel()\n },\n [isTopLayer, onCancel],\n )\n\n useGlobalKeyDown(handleGlobalKeyDown)\n useClickOutsideEvent(isTopLayer && onCancel, () => [ref.current])\n\n return (\n <Flex direction=\"column\" ref={ref} style={{minWidth: 280, maxWidth: 350}}>\n <Box flex={1} overflow=\"auto\" padding={4}>\n <Text size={1}>{message}</Text>\n </Box>\n <Box paddingX={4} paddingY={3} style={{borderTop: '1px solid var(--card-border-color)'}}>\n <Grid columns={2} gap={2}>\n <UIButton\n data-testid=\"confirm-popover-cancel-button\"\n icon={cancelButtonIcon}\n onClick={onCancel}\n mode=\"ghost\"\n padding={2}\n text={cancelButtonText || t('common.dialog.cancel-button.text')}\n size={1}\n />\n <UIButton\n data-testid=\"confirm-popover-confirm-button\"\n icon={confirmButtonIcon}\n onClick={onConfirm}\n padding={2}\n text={confirmButtonText || t('common.dialog.confirm-button.text')}\n tone={tone}\n size={1}\n />\n </Grid>\n </Box>\n </Flex>\n )\n}\n","/* eslint-disable no-restricted-imports */\nimport {MenuGroup as UIMenuGroup, type MenuGroupProps as UIMenuGroupProps} from '@sanity/ui'\nimport {type HTMLProps} from 'react'\n\nimport {Tooltip, type TooltipProps} from '../tooltip/Tooltip'\n\n/** @internal */\nexport type MenuGroupProps = Pick<UIMenuGroupProps, 'icon' | 'popover' | 'text' | 'tone'>\n\n/**\n * Customized Sanity UI <MenuGroup> component with pre-defined layout options.\n *\n * @internal\n */\nexport const MenuGroup = (\n props: MenuGroupProps &\n Omit<HTMLProps<HTMLDivElement>, 'as' | 'height' | 'ref' | 'tabIndex' | 'popover'> & {\n tooltipProps?: TooltipProps | null\n },\n) => {\n const {tooltipProps} = props\n\n const children = <UIMenuGroup {...props} fontSize={1} padding={3} />\n\n if (tooltipProps) {\n return (\n <Tooltip content={tooltipProps?.content} portal {...tooltipProps}>\n {/* This div is needed to make the tooltip work in disabled menu items */}\n <div>{children}</div>\n </Tooltip>\n )\n }\n\n return children\n}\n"],"names":["ConfirmPopover","t0","$","_c","cancelButtonIcon","cancelButtonText","confirmButtonIcon","confirmButtonText","message","onCancel","onConfirm","open","referenceElement","tone","t1","placement","t2","fallbackPlacements","t3","undefined","t4","t5","t6","UIPopover","ConfirmPopoverContent","t","useTranslation","isTopLayer","useLayer","ref","useRef","event","key","useGlobalKeyDown","Symbol","for","current","useClickOutsideEvent","minWidth","maxWidth","borderTop","t7","UIButton","t8","t9","t10","t11","MenuGroup","props","tooltipProps","UIMenuGroup","children","content"],"mappings":"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"}
1
+ {"version":3,"file":"MenuGroup.js","sources":["../../src/ui-components/confirmPopover/ConfirmPopover.tsx","../../src/ui-components/menuGroup/MenuGroup.tsx"],"sourcesContent":["/* eslint-disable no-restricted-imports, @sanity/i18n/no-i18next-import */\nimport {\n Box,\n Button as UIButton,\n Flex,\n Grid,\n Popover as UIPopover,\n type PopoverProps as UIPopoverProps,\n Text,\n useClickOutsideEvent,\n useGlobalKeyDown,\n useLayer,\n} from '@sanity/ui'\nimport {type ComponentType, type ReactNode, useCallback, useRef} from 'react'\nimport {useTranslation} from 'react-i18next'\n\nexport interface ConfirmPopoverProps {\n cancelButtonIcon?: ReactNode | ComponentType\n cancelButtonText?: string\n confirmButtonIcon?: ReactNode | ComponentType\n confirmButtonText?: string\n message: ReactNode\n onCancel: () => void\n onConfirm: () => void\n open: boolean\n referenceElement: HTMLElement | null\n tone?: 'default' | 'primary' | 'positive' | 'caution' | 'critical' | 'neutral' | 'suggest'\n placement?: UIPopoverProps['placement']\n fallbackPlacements?: UIPopoverProps['fallbackPlacements']\n}\n\n/**\n * A popover component for inline confirmation dialogs.\n * Follows the same pattern as document action confirm dialogs.\n *\n * @internal\n */\nexport function ConfirmPopover({\n cancelButtonIcon,\n cancelButtonText,\n confirmButtonIcon,\n confirmButtonText,\n message,\n onCancel,\n onConfirm,\n open,\n referenceElement,\n tone = 'critical',\n placement = 'top',\n fallbackPlacements = ['left', 'bottom'],\n}: ConfirmPopoverProps) {\n if (!open) return null\n\n return (\n <UIPopover\n content={\n <ConfirmPopoverContent\n cancelButtonIcon={cancelButtonIcon}\n cancelButtonText={cancelButtonText}\n confirmButtonIcon={confirmButtonIcon}\n confirmButtonText={confirmButtonText}\n message={message}\n onCancel={onCancel}\n onConfirm={onConfirm}\n tone={tone}\n />\n }\n constrainSize\n fallbackPlacements={fallbackPlacements}\n open\n placement={placement}\n portal\n preventOverflow\n referenceElement={referenceElement}\n />\n )\n}\n\nfunction ConfirmPopoverContent({\n cancelButtonIcon,\n cancelButtonText,\n confirmButtonIcon,\n confirmButtonText,\n message,\n onCancel,\n onConfirm,\n tone,\n}: Omit<ConfirmPopoverProps, 'open' | 'referenceElement' | 'placement' | 'fallbackPlacements'>) {\n const {t} = useTranslation()\n const {isTopLayer} = useLayer()\n const ref = useRef<HTMLDivElement | null>(null)\n\n const handleGlobalKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isTopLayer) onCancel()\n },\n [isTopLayer, onCancel],\n )\n\n useGlobalKeyDown(handleGlobalKeyDown)\n useClickOutsideEvent(isTopLayer && onCancel, () => [ref.current])\n\n return (\n <Flex direction=\"column\" ref={ref} style={{minWidth: 280, maxWidth: 350}}>\n <Box flex={1} overflow=\"auto\" padding={4}>\n <Text size={1}>{message}</Text>\n </Box>\n <Box paddingX={4} paddingY={3} style={{borderTop: '1px solid var(--card-border-color)'}}>\n <Grid columns={2} gap={2}>\n <UIButton\n data-testid=\"confirm-popover-cancel-button\"\n icon={cancelButtonIcon}\n onClick={onCancel}\n mode=\"ghost\"\n padding={2}\n text={cancelButtonText || t('common.dialog.cancel-button.text')}\n size={1}\n />\n <UIButton\n data-testid=\"confirm-popover-confirm-button\"\n icon={confirmButtonIcon}\n onClick={onConfirm}\n padding={2}\n text={confirmButtonText || t('common.dialog.confirm-button.text')}\n tone={tone}\n size={1}\n />\n </Grid>\n </Box>\n </Flex>\n )\n}\n","/* eslint-disable no-restricted-imports */\nimport {MenuGroup as UIMenuGroup, type MenuGroupProps as UIMenuGroupProps} from '@sanity/ui'\nimport {type HTMLProps} from 'react'\n\nimport {Tooltip, type TooltipProps} from '../tooltip/Tooltip'\n\n/** @internal */\nexport type MenuGroupProps = Pick<UIMenuGroupProps, 'icon' | 'popover' | 'text' | 'tone'>\n\n/**\n * Customized Sanity UI <MenuGroup> component with pre-defined layout options.\n *\n * @internal\n */\nexport const MenuGroup = (\n props: MenuGroupProps &\n Omit<HTMLProps<HTMLDivElement>, 'as' | 'height' | 'ref' | 'tabIndex' | 'popover'> & {\n tooltipProps?: TooltipProps | null\n },\n) => {\n const {tooltipProps} = props\n\n const children = <UIMenuGroup {...props} fontSize={1} padding={3} />\n\n if (tooltipProps) {\n return (\n <Tooltip content={tooltipProps?.content} portal {...tooltipProps}>\n {/* This div is needed to make the tooltip work in disabled menu items */}\n <div>{children}</div>\n </Tooltip>\n )\n }\n\n return children\n}\n"],"names":["ConfirmPopover","t0","$","_c","cancelButtonIcon","cancelButtonText","confirmButtonIcon","confirmButtonText","message","onCancel","onConfirm","open","referenceElement","tone","t1","placement","t2","fallbackPlacements","t3","undefined","t4","t5","t6","UIPopover","ConfirmPopoverContent","t","useTranslation","isTopLayer","useLayer","ref","useRef","event","key","useGlobalKeyDown","Symbol","for","current","useClickOutsideEvent","minWidth","maxWidth","borderTop","t7","UIButton","t8","t9","t10","t11","MenuGroup","props","tooltipProps","UIMenuGroup","children","content"],"mappings":"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"}
@@ -9,7 +9,7 @@ const PostMessagePreviews = (props) => {
9
9
  perspective
10
10
  } = props, documentPreviewStore = useDocumentPreviewStore(), schema = useSchema();
11
11
  let t0;
12
- $[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = new Subject(), $[0] = t0) : t0 = $[0];
12
+ $[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = new Subject(), $[0] = t0) : t0 = $[0];
13
13
  const refsSubject = t0;
14
14
  let t1;
15
15
  $[1] !== documentPreviewStore || $[2] !== perspective || $[3] !== schema ? (t1 = refsSubject.asObservable().pipe(switchMap((refs_0) => combineLatest(refs_0.map((ref) => {
@@ -24,7 +24,7 @@ const PostMessagePreviews = (props) => {
24
24
  }))), debounceTime(0)), $[1] = documentPreviewStore, $[2] = perspective, $[3] = schema, $[4] = t1) : t1 = $[4];
25
25
  const previews$ = t1;
26
26
  let t2;
27
- $[5] === Symbol.for("react.memo_cache_sentinel") ? (t2 = [], $[5] = t2) : t2 = $[5];
27
+ $[5] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t2 = [], $[5] = t2) : t2 = $[5];
28
28
  const lastSnapshots = useRef(t2);
29
29
  let t3, t4;
30
30
  $[6] !== comlink || $[7] !== previews$ ? (t3 = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"PostMessagePreviewSnapshots.js","sources":["../../src/presentation/editor/PostMessagePreviewSnapshots.tsx"],"sourcesContent":["import {type ClientPerspective} from '@sanity/client'\nimport {type PreviewSnapshot} from '@sanity/presentation-comlink'\nimport {type FC, memo, useEffect, useMemo, useRef} from 'react'\nimport {\n combineLatest,\n debounceTime,\n filter,\n map,\n merge,\n NEVER,\n share,\n skipWhile,\n Subject,\n switchMap,\n takeUntil,\n} from 'rxjs'\nimport {\n getDraftId,\n getPublishedId,\n type PreviewValue,\n useDocumentPreviewStore,\n useSchema,\n} from 'sanity'\n\nimport {type VisualEditingConnection} from '../types'\n\ntype Ref = {\n _id: string\n _type: string\n}\n\nexport interface PostMessagePreviewsProps {\n comlink: VisualEditingConnection\n perspective: ClientPerspective\n refs: Ref[]\n}\n\nconst PostMessagePreviews: FC<PostMessagePreviewsProps> = (props) => {\n const {comlink, refs, perspective} = props\n const documentPreviewStore = useDocumentPreviewStore()\n const schema = useSchema()\n\n const refsSubject = useMemo(() => new Subject<Ref[]>(), [])\n\n const previews$ = useMemo(() => {\n return refsSubject.asObservable().pipe(\n switchMap(\n (\n // eslint-disable-next-line @typescript-eslint/no-shadow\n refs,\n ) => {\n return combineLatest(\n refs.map((ref) => {\n const draftRef = {...ref, _id: getDraftId(ref._id)}\n const draft$ =\n perspective === 'published'\n ? // Don't emit if not displaying drafts\n NEVER\n : documentPreviewStore\n .observeForPreview(draftRef, schema.get(draftRef._type)!)\n .pipe(\n // Share to prevent double subscribe in the merge\n share(),\n // Don't emit if no snapshot is returned\n // eslint-disable-next-line max-nested-callbacks\n skipWhile((p) => p.snapshot === null),\n )\n\n const publishedRef = {...ref, _id: getPublishedId(ref._id)}\n const published$ = documentPreviewStore.observeForPreview(\n publishedRef,\n schema.get(publishedRef._type)!,\n )\n\n return merge(published$.pipe(takeUntil(draft$)), draft$).pipe(\n // eslint-disable-next-line max-nested-callbacks\n filter((p) => !!p.snapshot),\n // eslint-disable-next-line max-nested-callbacks\n map((p) => {\n const snapshot = p.snapshot as PreviewValue & {\n _id: string\n }\n return {\n _id: getPublishedId(snapshot._id),\n title: snapshot.title,\n subtitle: snapshot.subtitle,\n description: snapshot.description,\n imageUrl: snapshot.imageUrl,\n } as PreviewSnapshot\n }),\n )\n }),\n )\n },\n ),\n debounceTime(0),\n )\n }, [documentPreviewStore, refsSubject, schema, perspective])\n\n const lastSnapshots = useRef<PreviewSnapshot[]>([])\n\n // Stream preview snapshots when updates are received, and store the last set\n // of snapshots so they can be returned if explicitly requested\n useEffect(() => {\n const sub = previews$.subscribe((snapshots) => {\n comlink.post('presentation/preview-snapshots', {snapshots})\n lastSnapshots.current = snapshots\n })\n\n return () => {\n sub.unsubscribe()\n }\n }, [comlink, previews$])\n\n // Respond to explict requests for preview snapshots. Streaming will not\n // always suffice as the previews$ subscriber will not be called if the app\n // reloads but Presentation does not.\n useEffect(() => {\n return comlink.on('visual-editing/preview-snapshots', () => ({\n snapshots: lastSnapshots.current,\n }))\n }, [comlink])\n\n useEffect(() => {\n refsSubject.next(refs)\n }, [refs, refsSubject])\n\n return null\n}\n\nexport default memo(PostMessagePreviews)\n"],"names":["PostMessagePreviews","props","$","_c","comlink","refs","perspective","documentPreviewStore","useDocumentPreviewStore","schema","useSchema","t0","Symbol","for","Subject","refsSubject","t1","asObservable","pipe","switchMap","refs_0","combineLatest","map","ref","draftRef","_id","getDraftId","draft$","NEVER","observeForPreview","get","_type","share","skipWhile","_temp","publishedRef","getPublishedId","published$","merge","takeUntil","filter","_temp2","_temp3","debounceTime","previews$","t2","lastSnapshots","useRef","t3","t4","sub","subscribe","snapshots","post","current","unsubscribe","useEffect","t5","t6","on","t7","t8","next","memo","p","snapshot","p_0","p_1","title","subtitle","description","imageUrl"],"mappings":"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"}
1
+ {"version":3,"file":"PostMessagePreviewSnapshots.js","sources":["../../src/presentation/editor/PostMessagePreviewSnapshots.tsx"],"sourcesContent":["import {type ClientPerspective} from '@sanity/client'\nimport {type PreviewSnapshot} from '@sanity/presentation-comlink'\nimport {type FC, memo, useEffect, useMemo, useRef} from 'react'\nimport {\n combineLatest,\n debounceTime,\n filter,\n map,\n merge,\n NEVER,\n share,\n skipWhile,\n Subject,\n switchMap,\n takeUntil,\n} from 'rxjs'\nimport {\n getDraftId,\n getPublishedId,\n type PreviewValue,\n useDocumentPreviewStore,\n useSchema,\n} from 'sanity'\n\nimport {type VisualEditingConnection} from '../types'\n\ntype Ref = {\n _id: string\n _type: string\n}\n\nexport interface PostMessagePreviewsProps {\n comlink: VisualEditingConnection\n perspective: ClientPerspective\n refs: Ref[]\n}\n\nconst PostMessagePreviews: FC<PostMessagePreviewsProps> = (props) => {\n const {comlink, refs, perspective} = props\n const documentPreviewStore = useDocumentPreviewStore()\n const schema = useSchema()\n\n const refsSubject = useMemo(() => new Subject<Ref[]>(), [])\n\n const previews$ = useMemo(() => {\n return refsSubject.asObservable().pipe(\n switchMap(\n (\n // eslint-disable-next-line @typescript-eslint/no-shadow\n refs,\n ) => {\n return combineLatest(\n refs.map((ref) => {\n const draftRef = {...ref, _id: getDraftId(ref._id)}\n const draft$ =\n perspective === 'published'\n ? // Don't emit if not displaying drafts\n NEVER\n : documentPreviewStore\n .observeForPreview(draftRef, schema.get(draftRef._type)!)\n .pipe(\n // Share to prevent double subscribe in the merge\n share(),\n // Don't emit if no snapshot is returned\n // eslint-disable-next-line max-nested-callbacks\n skipWhile((p) => p.snapshot === null),\n )\n\n const publishedRef = {...ref, _id: getPublishedId(ref._id)}\n const published$ = documentPreviewStore.observeForPreview(\n publishedRef,\n schema.get(publishedRef._type)!,\n )\n\n return merge(published$.pipe(takeUntil(draft$)), draft$).pipe(\n // eslint-disable-next-line max-nested-callbacks\n filter((p) => !!p.snapshot),\n // eslint-disable-next-line max-nested-callbacks\n map((p) => {\n const snapshot = p.snapshot as PreviewValue & {\n _id: string\n }\n return {\n _id: getPublishedId(snapshot._id),\n title: snapshot.title,\n subtitle: snapshot.subtitle,\n description: snapshot.description,\n imageUrl: snapshot.imageUrl,\n } as PreviewSnapshot\n }),\n )\n }),\n )\n },\n ),\n debounceTime(0),\n )\n }, [documentPreviewStore, refsSubject, schema, perspective])\n\n const lastSnapshots = useRef<PreviewSnapshot[]>([])\n\n // Stream preview snapshots when updates are received, and store the last set\n // of snapshots so they can be returned if explicitly requested\n useEffect(() => {\n const sub = previews$.subscribe((snapshots) => {\n comlink.post('presentation/preview-snapshots', {snapshots})\n lastSnapshots.current = snapshots\n })\n\n return () => {\n sub.unsubscribe()\n }\n }, [comlink, previews$])\n\n // Respond to explict requests for preview snapshots. Streaming will not\n // always suffice as the previews$ subscriber will not be called if the app\n // reloads but Presentation does not.\n useEffect(() => {\n return comlink.on('visual-editing/preview-snapshots', () => ({\n snapshots: lastSnapshots.current,\n }))\n }, [comlink])\n\n useEffect(() => {\n refsSubject.next(refs)\n }, [refs, refsSubject])\n\n return null\n}\n\nexport default memo(PostMessagePreviews)\n"],"names":["PostMessagePreviews","props","$","_c","comlink","refs","perspective","documentPreviewStore","useDocumentPreviewStore","schema","useSchema","t0","Symbol","for","Subject","refsSubject","t1","asObservable","pipe","switchMap","refs_0","combineLatest","map","ref","draftRef","_id","getDraftId","draft$","NEVER","observeForPreview","get","_type","share","skipWhile","_temp","publishedRef","getPublishedId","published$","merge","takeUntil","filter","_temp2","_temp3","debounceTime","previews$","t2","lastSnapshots","useRef","t3","t4","sub","subscribe","snapshots","post","current","unsubscribe","useEffect","t5","t6","on","t7","t8","next","memo","p","snapshot","p_0","p_1","title","subtitle","description","imageUrl"],"mappings":"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"}