sanity 4.0.2-next.0-1493034f2d-202507161600 → 4.0.2-next.0-ebde28ec21-202507170747

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.
@@ -659,10 +659,12 @@ const DocumentTitle = (props) => {
659
659
  value,
660
660
  isLoading: previewValueIsLoading
661
661
  } = sanity.unstable_useValuePreview({
662
- enabled: !0,
662
+ enabled: !!documentValue,
663
663
  schemaType,
664
664
  value: documentValue
665
- }), documentTitle = isNewDocument ? t("browser-document-title.new-document", {
665
+ }), {
666
+ lastRevisionDocument
667
+ } = structure.useDocumentLastRev(documentId, documentType), documentTitle = lastRevisionDocument && !documentValue ? "" : isNewDocument ? t("browser-document-title.new-document", {
666
668
  schemaType: schemaType?.title || schemaType?.name
667
669
  }) : value?.title || t("browser-document-title.untitled-document"), settled = editState.ready && !previewValueIsLoading, newTitle = useConstructDocumentTitle(documentTitle);
668
670
  let t0;
@@ -1 +1 @@
1
- {"version":3,"file":"index3.js","sources":["../../src/structure/structureResolvers/PaneResolutionError.ts","../../src/structure/structureResolvers/assignId.ts","../../src/structure/structureResolvers/createPaneResolver.ts","../../src/structure/structureResolvers/memoBind.ts","../../src/structure/structureResolvers/resolveIntent.ts","../../src/structure/structureResolvers/createResolvedPaneNodeStream.ts","../../src/structure/structureResolvers/useResolvedPanes.ts","../../src/structure/components/structureTool/intentResolver/utils.ts","../../src/structure/components/structureTool/intentResolver/IntentResolver.tsx","../../src/structure/components/structureTool/StructureError.tsx","../../src/structure/components/structureTool/NoDocumentTypesScreen.tsx","../../src/structure/components/structureTool/StructureTitle.tsx","../../src/structure/components/structureTool/StructureTool.tsx","../../src/structure/components/structureTool/StructureToolBoundary.tsx"],"sourcesContent":["import {type RouterPaneSiblingContext} from '../types'\n\nexport interface PaneResolutionErrorOptions {\n message: string\n context?: RouterPaneSiblingContext\n helpId?: string\n cause?: Error\n}\n\n/**\n * An error thrown during pane resolving. This error is meant to be bubbled up\n * through react and handled in an error boundary. It includes a `cause`\n * property which is the original error caught\n */\nexport class PaneResolutionError extends Error {\n cause: Error | undefined\n context: RouterPaneSiblingContext | undefined\n helpId: string | undefined\n\n constructor({message, context, helpId, cause}: PaneResolutionErrorOptions) {\n super(message)\n this.name = 'PaneResolutionError'\n this.context = context\n this.helpId = helpId\n this.cause = cause\n }\n}\n","import {nanoid} from 'nanoid'\n\n// `WeakMap`s require the first type param to extend `object`\nconst randomIdCache = new WeakMap<object, string>()\n\n/**\n * given an object, this function randomly generates an ID and returns it. this\n * result is then saved in a WeakMap so subsequent requests for the same object\n * will receive the same ID\n */\nexport function assignId(obj: object): string {\n const cachedValue = randomIdCache.get(obj)\n if (cachedValue) return cachedValue\n\n const id = nanoid()\n randomIdCache.set(obj, id)\n return id\n}\n","import {from, isObservable, type Observable, of as observableOf} from 'rxjs'\nimport {publishReplay, refCount, switchMap} from 'rxjs/operators'\nimport {isRecord} from 'sanity'\n\nimport {type PaneNode, type RouterPaneSiblingContext, type UnresolvedPaneNode} from '../types'\nimport {PaneResolutionError} from './PaneResolutionError'\n\ninterface Serializable {\n serialize: (...args: never[]) => unknown\n}\n\nconst isPromise = (thing: any): thing is PromiseLike<unknown> => {\n return !!thing && typeof thing?.then === 'function'\n}\nconst isSerializable = (thing: unknown): thing is Serializable => {\n if (!isRecord(thing)) return false\n return typeof thing.serialize === 'function'\n}\n\n/**\n * The signature of the function used to take an `UnresolvedPaneNode` and turn\n * it into an `Observable<PaneNode>`.\n */\nexport type PaneResolver = (\n unresolvedPane: UnresolvedPaneNode | undefined,\n context: RouterPaneSiblingContext,\n flatIndex: number,\n) => Observable<PaneNode>\n\nexport type PaneResolverMiddleware = (paneResolveFn: PaneResolver) => PaneResolver\n\nconst rethrowWithPaneResolutionErrors: PaneResolverMiddleware =\n (next) => (unresolvedPane, context, flatIndex) => {\n try {\n return next(unresolvedPane, context, flatIndex)\n } catch (e) {\n // re-throw errors that are already `PaneResolutionError`s\n if (e instanceof PaneResolutionError) {\n throw e\n }\n\n // anything else, wrap with `PaneResolutionError` and set the underlying\n // error as a the `cause`\n throw new PaneResolutionError({\n message: typeof e?.message === 'string' ? e.message : '',\n context,\n cause: e,\n })\n }\n }\n\nconst wrapWithPublishReplay: PaneResolverMiddleware =\n (next) =>\n (...args) => {\n return next(...args).pipe(\n // need to add publishReplay + refCount to ensure new subscribers always\n // get an emission. without this, memoized observables may get stuck\n // waiting for their first emissions resulting in a loading pane\n publishReplay(1),\n refCount(),\n )\n }\n\nexport function createPaneResolver(middleware: PaneResolverMiddleware): PaneResolver {\n // note: this API includes a middleware/wrapper function because the function\n // is recursive. we want to call the wrapped version of the function always\n // (even inside of nested calls) so the identifier invoked for the recursion\n // should be the wrapped version\n const resolvePane = rethrowWithPaneResolutionErrors(\n wrapWithPublishReplay(\n middleware((unresolvedPane, context, flatIndex) => {\n if (!unresolvedPane) {\n throw new PaneResolutionError({\n message: 'Pane returned no child',\n context,\n helpId: 'structure-item-returned-no-child',\n })\n }\n\n if (isPromise(unresolvedPane) || isObservable(unresolvedPane)) {\n return from(unresolvedPane).pipe(\n switchMap((result) => resolvePane(result, context, flatIndex)),\n )\n }\n\n if (isSerializable(unresolvedPane)) {\n return resolvePane(unresolvedPane.serialize(context), context, flatIndex)\n }\n\n if (typeof unresolvedPane === 'function') {\n return resolvePane(unresolvedPane(context.id, context), context, flatIndex)\n }\n\n return observableOf(unresolvedPane)\n }),\n ),\n )\n\n return resolvePane\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n\n// `WeakMap`s require the first type param to extend `object`\nconst bindCache = new WeakMap<object, Map<string, Function>>()\n\n/**\n * An alternative to `obj.method.bind(obj)` that utilizes a weakmap to return\n * the same memory reference for sequent binds.\n */\nexport function memoBind<\n T extends object,\n K extends keyof {[P in keyof T]: T[P] extends Function ? T[P] : never},\n>(obj: T, methodKey: K): T[K]\nexport function memoBind(obj: Record<string, unknown>, methodKey: string): Function {\n const boundMethods = bindCache.get(obj) || new Map<string, Function>()\n if (boundMethods) {\n const bound = boundMethods.get(methodKey)\n if (bound) return bound\n }\n\n const method = obj[methodKey]\n\n if (typeof method !== 'function') {\n throw new Error(\n `Expected property \\`${methodKey}\\` to be a function but got ${typeof method} instead.`,\n )\n }\n\n const bound = method.bind(obj)\n boundMethods.set(methodKey, bound)\n bindCache.set(obj, boundMethods)\n\n return bound\n}\n","import {omit} from 'lodash'\nimport {firstValueFrom, type Observable} from 'rxjs'\n\nimport {type StructureContext} from '../structureBuilder'\nimport {\n type PaneNode,\n type RouterPanes,\n type RouterPaneSiblingContext,\n type UnresolvedPaneNode,\n} from '../types'\nimport {assignId} from './assignId'\nimport {createPaneResolver, type PaneResolverMiddleware} from './createPaneResolver'\nimport {memoBind} from './memoBind'\n\ninterface TraverseOptions {\n unresolvedPane: UnresolvedPaneNode | undefined\n intent: string\n params: {type: string; id: string; [key: string]: string | undefined}\n payload: unknown\n parent: PaneNode | null\n path: string[]\n currentId: string\n flatIndex: number\n levelIndex: number\n structureContext: StructureContext\n}\n\nexport interface ResolveIntentOptions {\n rootPaneNode?: UnresolvedPaneNode\n intent: string\n params: {type: string; id: string; [key: string]: string | undefined}\n payload: unknown\n structureContext: StructureContext\n}\n\n/**\n * Resolves an intent request using breadth first search. If a match is not\n * found, the intent will resolve to the fallback editor.\n *\n * A match is found if:\n * 1. the `PaneNode` is of type `document` and the its ID matches the intent ID\n * 2. the `PaneNode` is of type `documentList` and the `schemaTypeName` matches\n * 3. the `PaneNode`'s `canHandleIntent` method returns true\n *\n * If a `PaneNode` of type `list` is found, it will be searched for a match.\n *\n * @see PaneNode\n */\nexport async function resolveIntent(options: ResolveIntentOptions): Promise<RouterPanes> {\n const resolvedPaneCache = new Map<string, Observable<PaneNode>>()\n\n // this is a simple version of the memoizer in `createResolvedPaneNodeStream`\n const memoize: PaneResolverMiddleware = (nextFn) => (unresolvedPane, context, flatIndex) => {\n const key = unresolvedPane && `${assignId(unresolvedPane)}-${context.path.join('__')}`\n const cachedResolvedPane = key && resolvedPaneCache.get(key)\n if (cachedResolvedPane) return cachedResolvedPane\n\n const result = nextFn(unresolvedPane, context, flatIndex)\n if (key) resolvedPaneCache.set(key, result)\n return result\n }\n\n const resolvePane = createPaneResolver(memoize)\n\n const fallbackEditorPanes: RouterPanes = [\n [\n {\n id: `__edit__${options.params.id}`,\n params: {...omit(options.params, ['id']), type: options.params.type},\n payload: options.payload,\n },\n ],\n ]\n\n async function traverse({\n currentId,\n flatIndex,\n intent,\n params,\n parent,\n path,\n payload,\n unresolvedPane,\n levelIndex,\n structureContext,\n }: TraverseOptions): Promise<\n Array<{panes: RouterPanes; depthIndex: number; levelIndex: number}>\n > {\n if (!unresolvedPane) return []\n\n const {id: targetId, type: schemaTypeName, ...otherParams} = params\n const context: RouterPaneSiblingContext = {\n id: currentId,\n splitIndex: 0,\n parent,\n path,\n index: flatIndex,\n params: {},\n payload: undefined,\n structureContext,\n }\n const resolvedPane = await firstValueFrom(resolvePane(unresolvedPane, context, flatIndex))\n\n // if the resolved pane is a document pane and the pane's ID matches then\n // resolve the intent to the current path\n if (resolvedPane.type === 'document' && resolvedPane.id === targetId) {\n return [\n {\n panes: [\n ...path.slice(0, path.length - 1).map((i) => [{id: i}]),\n [{id: targetId, params: otherParams, payload}],\n ],\n depthIndex: path.length,\n levelIndex,\n },\n ]\n }\n\n // NOTE: if you update this logic, please also update the similar handler in\n // `getIntentState.ts`\n if (\n // if the resolve pane's `canHandleIntent` returns true, then resolve\n resolvedPane.canHandleIntent?.(intent, params, {\n pane: resolvedPane,\n index: flatIndex,\n }) ||\n // if the pane's `canHandleIntent` did not return true, then match against\n // this default case. we will resolve the intent if:\n (resolvedPane.type === 'documentList' &&\n // 1. the schema type matches (this required for the document to render)\n resolvedPane.schemaTypeName === schemaTypeName &&\n // 2. the filter is the default filter.\n //\n // NOTE: this case is to prevent false positive matches where the user\n // has configured a more specific filter for a particular type. In that\n // case, the user can implement their own `canHandleIntent` function\n resolvedPane.options.filter === '_type == $type')\n ) {\n return [\n {\n panes: [\n // map the current path to router panes\n ...path.map((id) => [{id}]),\n // then augment with the intents IDs and params\n [{id: params.id, params: otherParams, payload}],\n ],\n depthIndex: path.length,\n levelIndex,\n },\n ]\n }\n\n if (resolvedPane.type === 'list' && resolvedPane.child && resolvedPane.items) {\n return (\n await Promise.all(\n resolvedPane.items.map((item, nextLevelIndex) => {\n if (item.type === 'divider') return Promise.resolve([])\n\n return traverse({\n currentId: item._id || item.id,\n flatIndex: flatIndex + 1,\n intent,\n params,\n parent: resolvedPane,\n path: [...path, item.id],\n payload,\n unresolvedPane:\n typeof resolvedPane.child === 'function'\n ? memoBind(resolvedPane, 'child')\n : resolvedPane.child,\n levelIndex: nextLevelIndex,\n structureContext,\n })\n }),\n )\n ).flat()\n }\n\n return []\n }\n\n const matchingPanes = await traverse({\n currentId: 'root',\n flatIndex: 0,\n levelIndex: 0,\n intent: options.intent,\n params: options.params,\n parent: null,\n path: [],\n payload: options.payload,\n unresolvedPane: options.rootPaneNode,\n structureContext: options.structureContext,\n })\n\n const closestPaneToRoot = matchingPanes.sort((a, b) => {\n // break ties with the level index\n if (a.depthIndex === b.depthIndex) return a.levelIndex - b.levelIndex\n return a.depthIndex - b.depthIndex\n })[0]\n\n if (closestPaneToRoot) {\n return closestPaneToRoot.panes\n }\n\n return fallbackEditorPanes\n}\n","import {generateHelpUrl} from '@sanity/generate-help-url'\nimport {isEqual} from 'lodash'\nimport {concat, NEVER, type Observable, of as observableOf} from 'rxjs'\nimport {distinctUntilChanged, map, pairwise, scan, startWith, switchMap} from 'rxjs/operators'\n\nimport {type StructureContext} from '../structureBuilder'\nimport {\n type DocumentPaneNode,\n type PaneNode,\n type PaneNodeResolver,\n type RouterPanes,\n type RouterPaneSibling,\n type RouterPaneSiblingContext,\n type UnresolvedPaneNode,\n} from '../types'\nimport {assignId} from './assignId'\nimport {\n createPaneResolver,\n type PaneResolver,\n type PaneResolverMiddleware,\n} from './createPaneResolver'\nimport {memoBind} from './memoBind'\nimport {PaneResolutionError} from './PaneResolutionError'\n\n/**\n * the fallback editor child that is implicitly inserted into the structure tree\n * if the id starts with `__edit__`\n */\nconst fallbackEditorChild: PaneNodeResolver = (nodeId, context): DocumentPaneNode => {\n const id = nodeId.replace(/^__edit__/, '')\n const {\n params,\n payload,\n structureContext: {resolveDocumentNode},\n } = context\n const {type, template} = params\n\n if (!type) {\n throw new Error(\n `Document type for document with ID ${id} was not provided in the router params.`,\n )\n }\n\n let defaultDocumentBuilder = resolveDocumentNode({schemaType: type, documentId: id}).id('editor')\n\n if (template) {\n defaultDocumentBuilder = defaultDocumentBuilder.initialValueTemplate(\n template,\n payload as {[key: string]: unknown},\n )\n }\n\n return defaultDocumentBuilder.serialize() as DocumentPaneNode\n}\n\n/**\n * takes in a `RouterPaneSiblingContext` and returns a normalized string\n * representation that can be used for comparisons\n */\nfunction hashContext(context: RouterPaneSiblingContext): string {\n return `contextHash(${JSON.stringify({\n id: context.id,\n parentId: parent && assignId(parent),\n path: context.path,\n index: context.index,\n splitIndex: context.splitIndex,\n serializeOptionsIndex: context.serializeOptions?.index,\n serializeOptionsPath: context.serializeOptions?.path,\n })})`\n}\n\n/**\n * takes in `ResolvedPaneMeta` and returns a normalized string representation\n * that can be used for comparisons\n */\nconst hashResolvedPaneMeta = (meta: ResolvedPaneMeta): string => {\n const normalized = {\n type: meta.type,\n id: meta.routerPaneSibling.id,\n params: meta.routerPaneSibling.params || {},\n payload: meta.routerPaneSibling.payload || null,\n flatIndex: meta.flatIndex,\n groupIndex: meta.groupIndex,\n siblingIndex: meta.siblingIndex,\n path: meta.path,\n paneNode: meta.type === 'resolvedMeta' ? assignId(meta.paneNode) : null,\n }\n\n return `metaHash(${JSON.stringify(normalized)})`\n}\n\n/**\n * Represents one flattened \"router pane\", including the source group and\n * sibling indexes.\n *\n * @see RouterPanes\n */\ninterface FlattenedRouterPane {\n routerPaneSibling: RouterPaneSibling\n flatIndex: number\n groupIndex: number\n siblingIndex: number\n}\n\n/**\n * The state of the accumulator used to store and manage memo cache state\n */\ninterface CacheState {\n /**\n * Holds the memoization results keyed by a combination of `assignId` and a\n * context hash.\n */\n resolvedPaneCache: Map<string, Observable<PaneNode>>\n /**\n * Acts as a dictionary that stores cache keys by their flat index. This is\n * used to clean up the cache between different branches in the pane\n * structure.\n *\n * @see createResolvedPaneNodeStream look inside the `scan` where `wrapFn` is\n * defined\n */\n cacheKeysByFlatIndex: Array<Set<string>>\n /**\n * The resulting memoized `PaneResolver` function. This function closes over\n * the `resolvedPaneCache`.\n */\n resolvePane: PaneResolver\n flattenedRouterPanes: FlattenedRouterPane[]\n}\n\nexport interface CreateResolvedPaneNodeStreamOptions {\n /**\n * an input stream of `RouterPanes`\n * @see RouterPanes\n */\n routerPanesStream: Observable<RouterPanes>\n /**\n * any `UnresolvedPaneNode` (could be an observable, promise, pane resolver etc)\n */\n rootPaneNode: UnresolvedPaneNode\n /** used primarily for testing */\n initialCacheState?: CacheState\n\n structureContext: StructureContext\n}\n\n/**\n * The result of pane resolving\n */\nexport type ResolvedPaneMeta = {\n groupIndex: number\n siblingIndex: number\n flatIndex: number\n routerPaneSibling: RouterPaneSibling\n path: string[]\n} & ({type: 'loading'; paneNode: null} | {type: 'resolvedMeta'; paneNode: PaneNode})\n\ninterface ResolvePaneTreeOptions {\n resolvePane: PaneResolver\n flattenedRouterPanes: FlattenedRouterPane[]\n unresolvedPane: UnresolvedPaneNode | undefined\n parent: PaneNode | null\n path: string[]\n structureContext: StructureContext\n}\n\n/**\n * A recursive pane resolving function. Starts at one unresolved pane node and\n * continues until there is no more flattened router panes that can be used as\n * input to the unresolved panes.\n */\nfunction resolvePaneTree({\n unresolvedPane,\n flattenedRouterPanes,\n parent,\n path,\n resolvePane,\n structureContext,\n}: ResolvePaneTreeOptions): Observable<ResolvedPaneMeta[]> {\n const [current, ...rest] = flattenedRouterPanes\n const next = rest[0] as FlattenedRouterPane | undefined\n\n const context: RouterPaneSiblingContext = {\n id: current.routerPaneSibling.id,\n splitIndex: current.siblingIndex,\n parent,\n path: [...path, current.routerPaneSibling.id],\n index: current.flatIndex,\n params: current.routerPaneSibling.params || {},\n payload: current.routerPaneSibling.payload,\n structureContext,\n }\n\n try {\n return resolvePane(unresolvedPane, context, current.flatIndex).pipe(\n // this switch map receives a resolved pane\n switchMap((paneNode) => {\n // we can create a `resolvedMeta` type using it\n const resolvedPaneMeta: ResolvedPaneMeta = {\n type: 'resolvedMeta',\n ...current,\n paneNode: paneNode,\n path: context.path,\n }\n\n // for the other unresolved panes, we can create \"loading panes\"\n const loadingPanes = rest.map((i, restIndex) => {\n const loadingPanePath = [\n ...context.path,\n ...rest.slice(restIndex).map((_, currentIndex) => `[${i.flatIndex + currentIndex}]`),\n ]\n\n const loadingPane: ResolvedPaneMeta = {\n type: 'loading',\n path: loadingPanePath,\n paneNode: null,\n ...i,\n }\n\n return loadingPane\n })\n\n if (!rest.length) {\n return observableOf([resolvedPaneMeta])\n }\n\n let nextStream\n\n if (\n // the fallback editor case\n next?.routerPaneSibling.id.startsWith('__edit__')\n ) {\n nextStream = resolvePaneTree({\n unresolvedPane: fallbackEditorChild,\n flattenedRouterPanes: rest,\n parent,\n path: context.path,\n resolvePane,\n structureContext,\n })\n } else if (current.groupIndex === next?.groupIndex) {\n // if the next flattened router pane has the same group index as the\n // current flattened router pane, then the next flattened router pane\n // belongs to the same group (i.e. it is a split pane)\n nextStream = resolvePaneTree({\n unresolvedPane,\n flattenedRouterPanes: rest,\n parent,\n path,\n resolvePane,\n structureContext,\n })\n } else {\n // normal children resolving\n nextStream = resolvePaneTree({\n unresolvedPane:\n typeof paneNode.child === 'function'\n ? (memoBind(paneNode, 'child') as PaneNodeResolver)\n : paneNode.child,\n flattenedRouterPanes: rest,\n parent: paneNode,\n path: context.path,\n resolvePane,\n structureContext,\n })\n }\n\n return concat(\n // we emit the loading panes first in a concat (this emits immediately)\n observableOf([resolvedPaneMeta, ...loadingPanes]),\n // then whenever the next stream is done, the results will be combined.\n nextStream.pipe(map((nextResolvedPanes) => [resolvedPaneMeta, ...nextResolvedPanes])),\n )\n }),\n )\n } catch (e) {\n if (e instanceof PaneResolutionError) {\n if (e.context) {\n console.warn(\n `Pane resolution error at index ${e.context.index}${\n e.context.splitIndex > 0 ? ` for split pane index ${e.context.splitIndex}` : ''\n }: ${e.message}${e.helpId ? ` - see ${generateHelpUrl(e.helpId)}` : ''}`,\n e,\n )\n }\n\n if (e.helpId === 'structure-item-returned-no-child') {\n // returning an observable of an empty array will remove loading panes\n // note: this one intentionally does not throw\n return observableOf([])\n }\n }\n\n throw e\n }\n}\n\n/**\n * Takes in a stream of `RouterPanes` and an unresolved root pane and returns\n * a stream of `ResolvedPaneMeta`\n */\nexport function createResolvedPaneNodeStream({\n routerPanesStream,\n rootPaneNode,\n initialCacheState = {\n cacheKeysByFlatIndex: [],\n flattenedRouterPanes: [],\n resolvedPaneCache: new Map(),\n resolvePane: () => NEVER,\n },\n structureContext,\n}: CreateResolvedPaneNodeStreamOptions): Observable<ResolvedPaneMeta[]> {\n const resolvedPanes$ = routerPanesStream.pipe(\n // add in implicit \"root\" router pane\n map((rawRouterPanes) => [[{id: 'root'}], ...rawRouterPanes]),\n // create flattened router panes\n map((routerPanes) => {\n const flattenedRouterPanes: FlattenedRouterPane[] = routerPanes\n .flatMap((routerPaneGroup, groupIndex) =>\n routerPaneGroup.map((routerPaneSibling, siblingIndex) => ({\n routerPaneSibling,\n groupIndex,\n siblingIndex,\n })),\n )\n // add in the flat index\n .map((i, index) => ({...i, flatIndex: index}))\n\n return flattenedRouterPanes\n }),\n // calculate a \"diffIndex\" used for clearing the memo cache\n startWith([] as FlattenedRouterPane[]),\n pairwise(),\n map(([prev, curr]) => {\n for (let i = 0; i < curr.length; i++) {\n const prevValue = prev[i]\n const currValue = curr[i]\n\n if (!isEqual(prevValue, currValue)) {\n return {\n flattenedRouterPanes: curr,\n diffIndex: i,\n }\n }\n }\n\n return {\n flattenedRouterPanes: curr,\n diffIndex: curr.length,\n }\n }),\n // create the memoized `resolvePane` function and manage the memo cache\n scan((acc, next) => {\n const {cacheKeysByFlatIndex, resolvedPaneCache} = acc\n const {flattenedRouterPanes, diffIndex} = next\n\n // use the `cacheKeysByFlatIndex` like a dictionary to find cache keys to\n // and cache keys to delete\n const beforeDiffIndex = cacheKeysByFlatIndex.slice(0, diffIndex + 1)\n const afterDiffIndex = cacheKeysByFlatIndex.slice(diffIndex + 1)\n\n const keysToKeep = new Set(beforeDiffIndex.flatMap((keySet) => Array.from(keySet)))\n const keysToDelete = afterDiffIndex\n .flatMap((keySet) => Array.from(keySet))\n .filter((key) => !keysToKeep.has(key))\n\n for (const key of keysToDelete) {\n resolvedPaneCache.delete(key)\n }\n\n // create a memoizing pane resolver middleware that utilizes the cache\n // maintained above. this keeps the cache from growing indefinitely\n const memoize: PaneResolverMiddleware = (nextFn) => (unresolvedPane, context, flatIndex) => {\n const key = unresolvedPane && `${assignId(unresolvedPane)}-${hashContext(context)}`\n const cachedResolvedPane = key && resolvedPaneCache.get(key)\n if (cachedResolvedPane) return cachedResolvedPane\n\n const result = nextFn(unresolvedPane, context, flatIndex)\n if (!key) return result\n\n const cacheKeySet = cacheKeysByFlatIndex[flatIndex] || new Set()\n cacheKeySet.add(key)\n cacheKeysByFlatIndex[flatIndex] = cacheKeySet\n resolvedPaneCache.set(key, result)\n return result\n }\n\n return {\n flattenedRouterPanes,\n cacheKeysByFlatIndex,\n resolvedPaneCache,\n resolvePane: createPaneResolver(memoize),\n }\n }, initialCacheState),\n // run the memoized, recursive resolving\n switchMap(({flattenedRouterPanes, resolvePane}) =>\n resolvePaneTree({\n unresolvedPane: rootPaneNode,\n flattenedRouterPanes,\n parent: null,\n path: [],\n resolvePane,\n structureContext,\n }),\n ),\n )\n\n // after we've created a stream of `ResolvedPaneMeta[]`, we need to clean up\n // the results to remove unwanted loading panes and prevent unnecessary\n // emissions\n return resolvedPanes$.pipe(\n // this diffs the previous emission with the current one. if there is a new\n // loading pane at the same position where a previous pane already had a\n // resolved value (looking at the IDs to compare), then return the previous\n // pane instead of the loading pane\n scan(\n (prev, next) =>\n next.map((nextPane, index) => {\n const prevPane = prev[index] as ResolvedPaneMeta | undefined\n if (!prevPane) return nextPane\n if (nextPane.type !== 'loading') return nextPane\n\n if (prevPane.routerPaneSibling.id === nextPane.routerPaneSibling.id) {\n return prevPane\n }\n return nextPane\n }),\n [] as ResolvedPaneMeta[],\n ),\n // this prevents duplicate emissions\n distinctUntilChanged((prev, next) => {\n if (prev.length !== next.length) return false\n\n for (let i = 0; i < next.length; i++) {\n const prevValue = prev[i]\n const nextValue = next[i]\n if (hashResolvedPaneMeta(prevValue) !== hashResolvedPaneMeta(nextValue)) {\n return false\n }\n }\n\n return true\n }),\n )\n}\n","import {useEffect, useMemo, useState} from 'react'\nimport {ReplaySubject} from 'rxjs'\nimport {map} from 'rxjs/operators'\nimport {type RouterState, useRouter} from 'sanity/router'\n\nimport {LOADING_PANE} from '../constants'\nimport {type PaneNode, type RouterPaneGroup, type RouterPanes} from '../types'\nimport {useStructureTool} from '../useStructureTool'\nimport {createResolvedPaneNodeStream} from './createResolvedPaneNodeStream'\n\ninterface PaneData {\n active: boolean\n childItemId: string | null\n groupIndex: number\n index: number\n itemId: string\n key: string\n pane: PaneNode | typeof LOADING_PANE\n params: Record<string, string | undefined> & {perspective?: string}\n path: string\n payload: unknown\n selected: boolean\n siblingIndex: number\n}\n\nexport interface Panes {\n paneDataItems: PaneData[]\n routerPanes: RouterPanes\n resolvedPanes: (PaneNode | typeof LOADING_PANE)[]\n}\n\nfunction useRouterPanesStream() {\n const [routerStateSubject] = useState(() => new ReplaySubject<RouterState>(1))\n const routerPanes$ = useMemo(\n () =>\n routerStateSubject\n .asObservable()\n .pipe(map((_routerState) => (_routerState?.panes || []) as RouterPanes)),\n [routerStateSubject],\n )\n const {state: routerState} = useRouter()\n useEffect(() => {\n routerStateSubject.next(routerState)\n }, [routerState, routerStateSubject])\n\n return routerPanes$\n}\n\nexport function useResolvedPanes(): Panes {\n // used to propagate errors from async effect. throwing inside of the render\n // will bubble the error to react where it can be picked up by standard error\n // boundaries\n const [error, setError] = useState<unknown>()\n if (error) throw error\n\n const {structureContext, rootPaneNode} = useStructureTool()\n\n const [data, setData] = useState<Panes>({\n paneDataItems: [],\n resolvedPanes: [],\n routerPanes: [],\n })\n\n const routerPanesStream = useRouterPanesStream()\n\n useEffect(() => {\n const resolvedPanes$ = createResolvedPaneNodeStream({\n rootPaneNode,\n routerPanesStream,\n structureContext,\n }).pipe(\n map((resolvedPanes) => {\n const routerPanes = resolvedPanes.reduce<RouterPanes>((acc, next) => {\n const currentGroup = acc[next.groupIndex] || []\n currentGroup[next.siblingIndex] = next.routerPaneSibling\n acc[next.groupIndex] = currentGroup\n return acc\n }, [])\n\n const groupsLen = routerPanes.length\n\n const paneDataItems = resolvedPanes.map((pane) => {\n const {groupIndex, flatIndex, siblingIndex, routerPaneSibling, path} = pane\n const itemId = routerPaneSibling.id\n const nextGroup = routerPanes[groupIndex + 1] as RouterPaneGroup | undefined\n\n const paneDataItem: PaneData = {\n active: groupIndex === groupsLen - 2,\n childItemId: nextGroup?.[0].id ?? null,\n index: flatIndex,\n itemId: routerPaneSibling.id,\n groupIndex,\n key: `${\n pane.type === 'loading' ? 'unknown' : pane.paneNode.id\n }-${itemId}-${siblingIndex}`,\n pane: pane.type === 'loading' ? LOADING_PANE : pane.paneNode,\n params: routerPaneSibling.params || {},\n path: path.join(';'),\n payload: routerPaneSibling.payload,\n selected: flatIndex === resolvedPanes.length - 1,\n siblingIndex,\n }\n\n return paneDataItem\n })\n\n return {\n paneDataItems,\n routerPanes,\n resolvedPanes: paneDataItems.map((pane) => pane.pane),\n }\n }),\n )\n\n const subscription = resolvedPanes$.subscribe({\n next: (result) => setData(result),\n error: (e) => setError(e),\n })\n\n return () => subscription.unsubscribe()\n }, [rootPaneNode, routerPanesStream, structureContext])\n\n return data\n}\n","import {uuid} from '@sanity/uuid'\nimport {firstValueFrom, type Observable} from 'rxjs'\nimport {type DocumentStore, getPublishedId} from 'sanity'\n\nimport {PaneResolutionError} from '../../../structureResolvers'\n\nexport function removeDraftPrefix(documentId: string): string {\n const publishedId = getPublishedId(documentId)\n\n if (publishedId !== documentId) {\n console.warn(\n 'Removed unexpected draft id in document link: All links to documents should have the ' +\n '`drafts.`-prefix removed and something appears to have made an intent link to `%s`',\n documentId,\n )\n }\n\n return publishedId\n}\n\nexport async function ensureDocumentIdAndType(\n documentStore: DocumentStore,\n id: string | undefined,\n type: string | undefined,\n): Promise<{id: string; type: string}> {\n if (id && type) return {id, type}\n if (!id && type) return {id: uuid(), type}\n if (id && !type) {\n const resolvedType = await firstValueFrom(\n documentStore.resolveTypeForDocument(id) as Observable<string>,\n )\n\n return {id, type: resolvedType}\n }\n\n throw new PaneResolutionError({\n message: 'Neither document `id` or `type` was provided when trying to resolve intent.',\n })\n}\n","import {memo, useCallback, useEffect, useState} from 'react'\nimport {isRecord, useDocumentStore} from 'sanity'\nimport {useRouter, useRouterState} from 'sanity/router'\n\nimport {resolveIntent} from '../../../structureResolvers'\nimport {useStructureTool} from '../../../useStructureTool'\nimport {ensureDocumentIdAndType} from './utils'\n\nconst EMPTY_RECORD: Record<string, unknown> = {}\n\n/**\n * A component that receives an intent from props and redirects to the resolved\n * intent location (while showing a loading spinner during the process)\n */\nexport const IntentResolver = memo(function IntentResolver() {\n const {navigate} = useRouter()\n const maybeIntent = useRouterState(\n useCallback((routerState) => {\n const intentName = typeof routerState.intent === 'string' ? routerState.intent : undefined\n return intentName\n ? {\n intent: intentName,\n params: isRecord(routerState.params) ? routerState.params : EMPTY_RECORD,\n payload: routerState.payload,\n }\n : undefined\n }, []),\n )\n const {rootPaneNode, structureContext} = useStructureTool()\n const documentStore = useDocumentStore()\n const [error, setError] = useState<unknown>(null)\n\n // this re-throws errors so that parent ErrorBoundary's can handle them properly\n if (error) throw error\n\n // eslint-disable-next-line consistent-return\n useEffect(() => {\n if (maybeIntent) {\n const {intent, params, payload} = maybeIntent\n\n let cancelled = false\n // eslint-disable-next-line no-inner-declarations\n async function effect() {\n const {id, type} = await ensureDocumentIdAndType(\n documentStore,\n typeof params.id === 'string' ? params.id : undefined,\n typeof params.type === 'string' ? params.type : undefined,\n )\n\n if (cancelled) return\n\n const panes = await resolveIntent({\n intent,\n params: {...params, id, type},\n payload,\n rootPaneNode,\n structureContext,\n })\n\n if (cancelled) return\n\n navigate({panes}, {replace: true})\n }\n\n effect().catch(setError)\n\n return () => {\n cancelled = true\n }\n }\n }, [documentStore, maybeIntent, navigate, rootPaneNode, structureContext])\n\n return null\n})\n","import {generateHelpUrl} from '@sanity/generate-help-url'\nimport {SyncIcon} from '@sanity/icons'\nimport {Box, Card, Code, Container, Heading, Stack, Text} from '@sanity/ui'\nimport {useCallback} from 'react'\nimport {useTranslation} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {Button} from '../../../ui-components'\nimport {structureLocaleNamespace} from '../../i18n'\nimport {SerializeError} from '../../structureBuilder'\nimport {PaneResolutionError} from '../../structureResolvers'\n\nconst PathSegment = styled.span`\n &:not(:last-child)::after {\n content: ' ➝ ';\n opacity: 0.5;\n }\n`\n\nfunction formatStack(stack: string) {\n return (\n stack\n // Prettify builder functions\n .replace(/\\(\\.\\.\\.\\)\\./g, '(...)\\n .')\n // Remove webpack cruft from function names\n .replace(/__WEBPACK_IMPORTED_MODULE_\\d+_+/g, '')\n // Remove default export postfix from function names\n .replace(/___default\\./g, '.')\n // Replace full host path, leave only path to JS-file\n .replace(new RegExp(` \\\\(https?:\\\\/\\\\/${window.location.host}`, 'g'), ' (')\n )\n}\n\ninterface StructureErrorProps {\n error: unknown\n}\n\nexport function StructureError({error}: StructureErrorProps) {\n if (!(error instanceof PaneResolutionError)) {\n throw error\n }\n const {cause} = error\n const {t} = useTranslation(structureLocaleNamespace)\n\n // Serialize errors are well-formatted and should be readable, in these cases a stack trace is\n // usually not helpful. Build errors in dev (with HMR) usually also contains a bunch of garbage\n // instead of an actual error message, so make sure we show the message in these cases as well\n const stack = cause?.stack || error.stack\n const showStack =\n stack && !(cause instanceof SerializeError) && !error.message.includes('Module build failed:')\n\n const path = cause instanceof SerializeError ? cause.path : []\n const helpId = (cause instanceof SerializeError && cause.helpId) || error.helpId\n\n const handleReload = useCallback(() => {\n window.location.reload()\n }, [])\n\n return (\n <Card height=\"fill\" overflow=\"auto\" padding={4} sizing=\"border\" tone=\"critical\">\n <Container>\n <Heading as=\"h2\">{t('structure-error.header.text')}</Heading>\n\n <Card marginTop={4} padding={4} radius={2} overflow=\"auto\" shadow={1} tone=\"inherit\">\n {path.length > 0 && (\n <Stack space={2}>\n <Text size={1} weight=\"medium\">\n {t('structure-error.structure-path.label')}\n </Text>\n <Code>\n {/* TODO: it seems like the path is off by one and includes */}\n {/* `root` twice */}\n {path.slice(1).map((segment, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <PathSegment key={`${segment}-${i}`}>{segment}</PathSegment>\n ))}\n </Code>\n </Stack>\n )}\n\n <Stack marginTop={4} space={2}>\n <Text size={1} weight=\"medium\">\n {t('structure-error.error.label')}\n </Text>\n <Code>{showStack ? formatStack(stack) : error.message}</Code>\n </Stack>\n\n {helpId && (\n <Box marginTop={4}>\n <Text>\n <a href={generateHelpUrl(helpId)} rel=\"noopener noreferrer\" target=\"_blank\">\n {t('structure-error.docs-link.text')}\n </a>\n </Text>\n </Box>\n )}\n\n <Box marginTop={4}>\n <Button\n text={t('structure-error.reload-button.text')}\n icon={SyncIcon}\n tone=\"primary\"\n onClick={handleReload}\n />\n </Box>\n </Card>\n </Container>\n </Card>\n )\n}\n","import {WarningOutlineIcon} from '@sanity/icons'\nimport {Box, Card, Container, Flex, Stack, Text} from '@sanity/ui'\nimport {useTranslation} from 'sanity'\n\nimport {structureLocaleNamespace} from '../../i18n'\n\nexport function NoDocumentTypesScreen() {\n const {t} = useTranslation(structureLocaleNamespace)\n\n return (\n <Card height=\"fill\">\n <Flex align=\"center\" height=\"fill\" justify=\"center\" padding={4} sizing=\"border\">\n <Container width={0}>\n <Card padding={4} radius={2} shadow={1} tone=\"caution\">\n <Flex>\n <Box>\n <Text size={1}>\n <WarningOutlineIcon />\n </Text>\n </Box>\n <Stack flex={1} marginLeft={3} space={3}>\n <Text as=\"h1\" size={1} weight=\"medium\">\n {t('no-document-types-screen.title')}\n </Text>\n <Text as=\"p\" muted size={1}>\n {t('no-document-types-screen.subtitle')}\n </Text>\n <Text as=\"p\" muted size={1}>\n <a\n href=\"https://www.sanity.io/docs/create-a-schema-and-configure-sanity-studio\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {t('no-document-types-screen.link-text')}\n </a>\n </Text>\n </Stack>\n </Flex>\n </Card>\n </Container>\n </Flex>\n </Card>\n )\n}\n","import {type ObjectSchemaType} from '@sanity/types'\nimport {useEffect} from 'react'\nimport {\n unstable_useValuePreview as useValuePreview,\n useEditState,\n usePerspective,\n useSchema,\n useTranslation,\n} from 'sanity'\n\nimport {LOADING_PANE} from '../../constants'\nimport {structureLocaleNamespace} from '../../i18n'\nimport {type Panes} from '../../structureResolvers'\nimport {type DocumentPaneNode} from '../../types'\nimport {useStructureTool} from '../../useStructureTool'\n\ninterface StructureTitleProps {\n resolvedPanes: Panes['resolvedPanes']\n}\n\n// TODO: Fix state jank when editing different versions inside panes.\nconst DocumentTitle = (props: {documentId: string; documentType: string}) => {\n const {documentId, documentType} = props\n const {selectedReleaseId} = usePerspective()\n\n const editState = useEditState(documentId, documentType, 'default', selectedReleaseId)\n const schema = useSchema()\n const {t} = useTranslation(structureLocaleNamespace)\n const isNewDocument = !editState?.published && !editState?.draft\n const documentValue = editState?.version || editState?.draft || editState?.published\n const schemaType = schema.get(documentType) as ObjectSchemaType | undefined\n\n const {value, isLoading: previewValueIsLoading} = useValuePreview({\n enabled: true,\n schemaType,\n value: documentValue,\n })\n\n const documentTitle = isNewDocument\n ? t('browser-document-title.new-document', {\n schemaType: schemaType?.title || schemaType?.name,\n })\n : value?.title || t('browser-document-title.untitled-document')\n\n const settled = editState.ready && !previewValueIsLoading\n const newTitle = useConstructDocumentTitle(documentTitle)\n useEffect(() => {\n if (!settled) return\n // Set the title as the document title\n document.title = newTitle\n }, [documentTitle, settled, newTitle])\n\n return null\n}\n\nconst PassthroughTitle = (props: {title?: string}) => {\n const {title} = props\n const newTitle = useConstructDocumentTitle(title)\n useEffect(() => {\n // Set the title as the document title\n document.title = newTitle\n }, [newTitle, title])\n return null\n}\n\nexport const StructureTitle = (props: StructureTitleProps) => {\n const {resolvedPanes} = props\n\n if (!resolvedPanes?.length) return null\n\n const lastPane = resolvedPanes[resolvedPanes.length - 1]\n\n // If the last pane is loading, display the structure tool title only\n if (isLoadingPane(lastPane)) {\n return <PassthroughTitle />\n }\n\n // If the last pane is a document\n if (isDocumentPane(lastPane)) {\n // Passthrough the document pane's title, which may be defined in structure builder\n if (lastPane?.title) {\n return <PassthroughTitle title={lastPane.title} />\n }\n\n // Otherwise, display a `document.title` containing the resolved Sanity document title\n return <DocumentTitle documentId={lastPane.options.id} documentType={lastPane.options.type} />\n }\n\n // Otherwise, display the last pane's title (if present)\n return <PassthroughTitle title={lastPane?.title} />\n}\n\n/**\n * Construct a pipe delimited title containing `activeTitle` (if applicable) and the base structure title.\n *\n * @param activeTitle - Title of the first segment\n *\n * @returns A pipe delimited title in the format `${activeTitle} | %BASE_STRUCTURE_TITLE%`\n * or simply `%BASE_STRUCTURE_TITLE` if `activeTitle` is undefined.\n */\nfunction useConstructDocumentTitle(activeTitle?: string) {\n const structureToolBaseTitle = useStructureTool().structureContext.title\n return [activeTitle, structureToolBaseTitle].filter((title) => title).join(' | ')\n}\n\n// Type guards\nfunction isDocumentPane(pane: Panes['resolvedPanes'][number]): pane is DocumentPaneNode {\n return pane !== LOADING_PANE && pane.type === 'document'\n}\n\nfunction isLoadingPane(pane: Panes['resolvedPanes'][number]): pane is typeof LOADING_PANE {\n return pane === LOADING_PANE\n}\n","import {PortalProvider, useTheme, useToast} from '@sanity/ui'\nimport {isHotkey} from 'is-hotkey-esm'\nimport {Fragment, memo, useCallback, useEffect, useState} from 'react'\nimport {_isCustomDocumentTypeDefinition, useSchema} from 'sanity'\nimport {useRouterState} from 'sanity/router'\nimport {styled} from 'styled-components'\n\nimport {LOADING_PANE} from '../../constants'\nimport {LoadingPane, StructureToolPane} from '../../panes'\nimport {useResolvedPanes} from '../../structureResolvers'\nimport {type PaneNode} from '../../types'\nimport {useStructureTool} from '../../useStructureTool'\nimport {PaneLayout} from '../pane'\nimport {NoDocumentTypesScreen} from './NoDocumentTypesScreen'\nimport {StructureTitle} from './StructureTitle'\n\ninterface StructureToolProps {\n onPaneChange: (panes: Array<PaneNode | typeof LOADING_PANE>) => void\n}\n\nconst StyledPaneLayout = styled(PaneLayout)`\n min-height: 100%;\n min-width: 320px;\n`\n\nconst isSaveHotkey = isHotkey('mod+s')\n\n/**\n * @internal\n */\nexport const StructureTool = memo(function StructureTool({onPaneChange}: StructureToolProps) {\n const {push: pushToast} = useToast()\n const schema = useSchema()\n const {layoutCollapsed, setLayoutCollapsed} = useStructureTool()\n const {paneDataItems, resolvedPanes} = useResolvedPanes()\n // Intent resolving is processed by the sibling `<IntentResolver />` but it doesn't have a UI for indicating progress.\n // We handle that here, so if there are only 1 pane (the root structure), and there's an intent state in the router, we need to show a placeholder LoadingPane until\n // the structure is resolved and we know what panes to load/display\n const isResolvingIntent = useRouterState(\n useCallback((routerState) => typeof routerState.intent === 'string', []),\n )\n const {\n sanity: {media},\n } = useTheme()\n\n const [portalElement, setPortalElement] = useState<HTMLDivElement | null>(null)\n\n const handleRootCollapse = useCallback(() => setLayoutCollapsed(true), [setLayoutCollapsed])\n const handleRootExpand = useCallback(() => setLayoutCollapsed(false), [setLayoutCollapsed])\n\n useEffect(() => {\n // we check for length before emitting here to skip the initial empty array\n // state from the `useResolvedPanes` hook. there should always be a root\n // pane emitted on subsequent emissions\n if (resolvedPanes.length) {\n onPaneChange(resolvedPanes)\n }\n }, [onPaneChange, resolvedPanes])\n\n useEffect(() => {\n const handleGlobalKeyDown = (event: KeyboardEvent) => {\n // Prevent `Cmd+S`\n if (isSaveHotkey(event)) {\n event.preventDefault()\n\n pushToast({\n closable: true,\n id: 'auto-save-message',\n status: 'info',\n title: 'Your work is automatically saved!',\n duration: 4000,\n })\n }\n }\n\n window.addEventListener('keydown', handleGlobalKeyDown)\n return () => window.removeEventListener('keydown', handleGlobalKeyDown)\n }, [pushToast])\n\n const hasDefinedDocumentTypes = schema._original?.types.some(_isCustomDocumentTypeDefinition)\n\n if (!hasDefinedDocumentTypes) {\n return <NoDocumentTypesScreen />\n }\n\n return (\n <PortalProvider element={portalElement || null}>\n <StyledPaneLayout\n flex={1}\n height={layoutCollapsed ? undefined : 'fill'}\n minWidth={media[1]}\n onCollapse={handleRootCollapse}\n onExpand={handleRootExpand}\n >\n {paneDataItems.map(\n ({\n active,\n childItemId,\n groupIndex,\n itemId,\n key: paneKey,\n pane,\n index: paneIndex,\n params: paneParams,\n path,\n payload,\n siblingIndex,\n selected,\n }) => (\n <Fragment key={`${pane === LOADING_PANE ? 'loading' : pane.type}-${paneIndex}`}>\n {pane === LOADING_PANE ? (\n <LoadingPane paneKey={paneKey} path={path} selected={selected} />\n ) : (\n <StructureToolPane\n active={active}\n groupIndex={groupIndex}\n index={paneIndex}\n pane={pane}\n childItemId={childItemId}\n itemId={itemId}\n paneKey={paneKey}\n params={paneParams}\n payload={payload}\n path={path}\n selected={selected}\n siblingIndex={siblingIndex}\n />\n )}\n </Fragment>\n ),\n )}\n {/* If there's just 1 pane (the root), or less, and we're resolving an intent then it's necessary to show */}\n {/* a loading indicator as the intent resolving is async, could take a while and can also be interrupted/redirected */}\n {paneDataItems.length <= 1 && isResolvingIntent && (\n <LoadingPane paneKey=\"intent-resolver\" />\n )}\n </StyledPaneLayout>\n <StructureTitle resolvedPanes={resolvedPanes} />\n <div data-portal=\"\" ref={setPortalElement} />\n </PortalProvider>\n )\n})\n","import {useEffect, useState} from 'react'\nimport {SourceProvider, type Tool, useWorkspace} from 'sanity'\n\nimport {ErrorBoundary} from '../../../ui-components/errorBoundary'\nimport {setActivePanes} from '../../getIntentState'\nimport {StructureToolProvider} from '../../StructureToolProvider'\nimport {type StructureToolOptions} from '../../types'\nimport {IntentResolver} from './intentResolver'\nimport {StructureError} from './StructureError'\nimport {StructureTool} from './StructureTool'\n\ninterface StructureToolBoundaryProps {\n tool: Tool<StructureToolOptions>\n}\n\nexport function StructureToolBoundary({tool: {options}}: StructureToolBoundaryProps) {\n const {unstable_sources: sources} = useWorkspace()\n const [firstSource] = sources\n const {source, defaultDocumentNode, structure} = options || {}\n\n // Set active panes to blank on mount and unmount\n useEffect(() => {\n setActivePanes([])\n return () => setActivePanes([])\n }, [])\n\n const [{error}, setError] = useState<{error: unknown}>({error: null})\n\n // this re-throws if the error it catches is not a PaneResolutionError\n if (error) return <StructureError error={error} />\n\n return (\n <ErrorBoundary onCatch={setError}>\n <SourceProvider name={source || firstSource.name}>\n <StructureToolProvider defaultDocumentNode={defaultDocumentNode} structure={structure}>\n <StructureTool onPaneChange={setActivePanes} />\n <IntentResolver />\n </StructureToolProvider>\n </SourceProvider>\n </ErrorBoundary>\n )\n}\n"],"names":["PaneResolutionError","Error","constructor","message","context","helpId","cause","name","randomIdCache","WeakMap","assignId","obj","cachedValue","get","id","nanoid","set","isPromise","thing","then","isSerializable","isRecord","serialize","rethrowWithPaneResolutionErrors","next","unresolvedPane","flatIndex","e","wrapWithPublishReplay","args","pipe","publishReplay","refCount","createPaneResolver","middleware","resolvePane","isObservable","from","switchMap","result","observableOf","bindCache","memoBind","methodKey","boundMethods","Map","bound","method","bind","resolveIntent","options","resolvedPaneCache","nextFn","key","path","join","cachedResolvedPane","fallbackEditorPanes","params","omit","type","payload","traverse","currentId","intent","parent","levelIndex","structureContext","targetId","schemaTypeName","otherParams","resolvedPane","firstValueFrom","splitIndex","index","undefined","panes","slice","length","map","i","depthIndex","canHandleIntent","pane","filter","child","items","Promise","all","item","nextLevelIndex","resolve","_id","flat","closestPaneToRoot","rootPaneNode","sort","a","b","fallbackEditorChild","nodeId","replace","resolveDocumentNode","template","defaultDocumentBuilder","schemaType","documentId","initialValueTemplate","hashContext","JSON","stringify","parentId","serializeOptionsIndex","serializeOptions","serializeOptionsPath","hashResolvedPaneMeta","meta","normalized","routerPaneSibling","groupIndex","siblingIndex","paneNode","resolvePaneTree","flattenedRouterPanes","current","rest","resolvedPaneMeta","loadingPanes","restIndex","_","currentIndex","nextStream","startsWith","concat","nextResolvedPanes","console","warn","generateHelpUrl","createResolvedPaneNodeStream","routerPanesStream","initialCacheState","cacheKeysByFlatIndex","NEVER","rawRouterPanes","routerPanes","flatMap","routerPaneGroup","startWith","pairwise","prev","curr","prevValue","currValue","isEqual","diffIndex","scan","acc","beforeDiffIndex","afterDiffIndex","keysToKeep","Set","keySet","Array","keysToDelete","has","delete","cacheKeySet","add","nextPane","prevPane","distinctUntilChanged","nextValue","useRouterPanesStream","$","_c","routerStateSubject","useState","_temp","t0","t1","asObservable","_temp2","routerPanes$","state","routerState","useRouter","t2","t3","useEffect","_routerState","ReplaySubject","useResolvedPanes","error","setError","useStructureTool","Symbol","for","paneDataItems","resolvedPanes","data","setData","subscription","_temp5","subscribe","unsubscribe","reduce","_temp3","groupsLen","itemId","nextGroup","active","childItemId","LOADING_PANE","selected","_temp4","pane_0","currentGroup","ensureDocumentIdAndType","documentStore","uuid","resolvedType","resolveTypeForDocument","EMPTY_RECORD","IntentResolver","memo","navigate","maybeIntent","useRouterState","useDocumentStore","cancelled","effect","catch","intentName","PathSegment","styled","span","formatStack","stack","RegExp","window","location","host","StructureError","t","useTranslation","structureLocaleNamespace","showStack","SerializeError","includes","handleReload","jsx","Heading","t4","jsxs","Stack","Text","Code","t5","t6","t7","t8","t9","t10","Box","t11","t12","Button","SyncIcon","t13","Card","t14","Container","segment","reload","NoDocumentTypesScreen","WarningOutlineIcon","Flex","DocumentTitle","props","documentType","selectedReleaseId","usePerspective","editState","useEditState","schema","useSchema","isNewDocument","published","draft","documentValue","version","value","isLoading","previewValueIsLoading","useValuePreview","enabled","documentTitle","title","settled","ready","newTitle","useConstructDocumentTitle","document","PassthroughTitle","StructureTitle","lastPane","isLoadingPane","isDocumentPane","activeTitle","structureToolBaseTitle","StyledPaneLayout","PaneLayout","isSaveHotkey","isHotkey","StructureTool","onPaneChange","push","pushToast","useToast","layoutCollapsed","setLayoutCollapsed","isResolvingIntent","sanity","useTheme","media","portalElement","setPortalElement","handleRootCollapse","handleRootExpand","handleGlobalKeyDown","event","preventDefault","closable","status","duration","addEventListener","removeEventListener","_original","types","some","_isCustomDocumentTypeDefinition","LoadingPane","t15","t16","PortalProvider","paneKey","paneIndex","paneParams","Fragment","StructureToolPane","StructureToolBoundary","tool","unstable_sources","sources","useWorkspace","firstSource","source","defaultDocumentNode","structure","setActivePanes","StructureToolProvider","ErrorBoundary","SourceProvider"],"mappings":"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"}
1
+ {"version":3,"file":"index3.js","sources":["../../src/structure/structureResolvers/PaneResolutionError.ts","../../src/structure/structureResolvers/assignId.ts","../../src/structure/structureResolvers/createPaneResolver.ts","../../src/structure/structureResolvers/memoBind.ts","../../src/structure/structureResolvers/resolveIntent.ts","../../src/structure/structureResolvers/createResolvedPaneNodeStream.ts","../../src/structure/structureResolvers/useResolvedPanes.ts","../../src/structure/components/structureTool/intentResolver/utils.ts","../../src/structure/components/structureTool/intentResolver/IntentResolver.tsx","../../src/structure/components/structureTool/StructureError.tsx","../../src/structure/components/structureTool/NoDocumentTypesScreen.tsx","../../src/structure/components/structureTool/StructureTitle.tsx","../../src/structure/components/structureTool/StructureTool.tsx","../../src/structure/components/structureTool/StructureToolBoundary.tsx"],"sourcesContent":["import {type RouterPaneSiblingContext} from '../types'\n\nexport interface PaneResolutionErrorOptions {\n message: string\n context?: RouterPaneSiblingContext\n helpId?: string\n cause?: Error\n}\n\n/**\n * An error thrown during pane resolving. This error is meant to be bubbled up\n * through react and handled in an error boundary. It includes a `cause`\n * property which is the original error caught\n */\nexport class PaneResolutionError extends Error {\n cause: Error | undefined\n context: RouterPaneSiblingContext | undefined\n helpId: string | undefined\n\n constructor({message, context, helpId, cause}: PaneResolutionErrorOptions) {\n super(message)\n this.name = 'PaneResolutionError'\n this.context = context\n this.helpId = helpId\n this.cause = cause\n }\n}\n","import {nanoid} from 'nanoid'\n\n// `WeakMap`s require the first type param to extend `object`\nconst randomIdCache = new WeakMap<object, string>()\n\n/**\n * given an object, this function randomly generates an ID and returns it. this\n * result is then saved in a WeakMap so subsequent requests for the same object\n * will receive the same ID\n */\nexport function assignId(obj: object): string {\n const cachedValue = randomIdCache.get(obj)\n if (cachedValue) return cachedValue\n\n const id = nanoid()\n randomIdCache.set(obj, id)\n return id\n}\n","import {from, isObservable, type Observable, of as observableOf} from 'rxjs'\nimport {publishReplay, refCount, switchMap} from 'rxjs/operators'\nimport {isRecord} from 'sanity'\n\nimport {type PaneNode, type RouterPaneSiblingContext, type UnresolvedPaneNode} from '../types'\nimport {PaneResolutionError} from './PaneResolutionError'\n\ninterface Serializable {\n serialize: (...args: never[]) => unknown\n}\n\nconst isPromise = (thing: any): thing is PromiseLike<unknown> => {\n return !!thing && typeof thing?.then === 'function'\n}\nconst isSerializable = (thing: unknown): thing is Serializable => {\n if (!isRecord(thing)) return false\n return typeof thing.serialize === 'function'\n}\n\n/**\n * The signature of the function used to take an `UnresolvedPaneNode` and turn\n * it into an `Observable<PaneNode>`.\n */\nexport type PaneResolver = (\n unresolvedPane: UnresolvedPaneNode | undefined,\n context: RouterPaneSiblingContext,\n flatIndex: number,\n) => Observable<PaneNode>\n\nexport type PaneResolverMiddleware = (paneResolveFn: PaneResolver) => PaneResolver\n\nconst rethrowWithPaneResolutionErrors: PaneResolverMiddleware =\n (next) => (unresolvedPane, context, flatIndex) => {\n try {\n return next(unresolvedPane, context, flatIndex)\n } catch (e) {\n // re-throw errors that are already `PaneResolutionError`s\n if (e instanceof PaneResolutionError) {\n throw e\n }\n\n // anything else, wrap with `PaneResolutionError` and set the underlying\n // error as a the `cause`\n throw new PaneResolutionError({\n message: typeof e?.message === 'string' ? e.message : '',\n context,\n cause: e,\n })\n }\n }\n\nconst wrapWithPublishReplay: PaneResolverMiddleware =\n (next) =>\n (...args) => {\n return next(...args).pipe(\n // need to add publishReplay + refCount to ensure new subscribers always\n // get an emission. without this, memoized observables may get stuck\n // waiting for their first emissions resulting in a loading pane\n publishReplay(1),\n refCount(),\n )\n }\n\nexport function createPaneResolver(middleware: PaneResolverMiddleware): PaneResolver {\n // note: this API includes a middleware/wrapper function because the function\n // is recursive. we want to call the wrapped version of the function always\n // (even inside of nested calls) so the identifier invoked for the recursion\n // should be the wrapped version\n const resolvePane = rethrowWithPaneResolutionErrors(\n wrapWithPublishReplay(\n middleware((unresolvedPane, context, flatIndex) => {\n if (!unresolvedPane) {\n throw new PaneResolutionError({\n message: 'Pane returned no child',\n context,\n helpId: 'structure-item-returned-no-child',\n })\n }\n\n if (isPromise(unresolvedPane) || isObservable(unresolvedPane)) {\n return from(unresolvedPane).pipe(\n switchMap((result) => resolvePane(result, context, flatIndex)),\n )\n }\n\n if (isSerializable(unresolvedPane)) {\n return resolvePane(unresolvedPane.serialize(context), context, flatIndex)\n }\n\n if (typeof unresolvedPane === 'function') {\n return resolvePane(unresolvedPane(context.id, context), context, flatIndex)\n }\n\n return observableOf(unresolvedPane)\n }),\n ),\n )\n\n return resolvePane\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n\n// `WeakMap`s require the first type param to extend `object`\nconst bindCache = new WeakMap<object, Map<string, Function>>()\n\n/**\n * An alternative to `obj.method.bind(obj)` that utilizes a weakmap to return\n * the same memory reference for sequent binds.\n */\nexport function memoBind<\n T extends object,\n K extends keyof {[P in keyof T]: T[P] extends Function ? T[P] : never},\n>(obj: T, methodKey: K): T[K]\nexport function memoBind(obj: Record<string, unknown>, methodKey: string): Function {\n const boundMethods = bindCache.get(obj) || new Map<string, Function>()\n if (boundMethods) {\n const bound = boundMethods.get(methodKey)\n if (bound) return bound\n }\n\n const method = obj[methodKey]\n\n if (typeof method !== 'function') {\n throw new Error(\n `Expected property \\`${methodKey}\\` to be a function but got ${typeof method} instead.`,\n )\n }\n\n const bound = method.bind(obj)\n boundMethods.set(methodKey, bound)\n bindCache.set(obj, boundMethods)\n\n return bound\n}\n","import {omit} from 'lodash'\nimport {firstValueFrom, type Observable} from 'rxjs'\n\nimport {type StructureContext} from '../structureBuilder'\nimport {\n type PaneNode,\n type RouterPanes,\n type RouterPaneSiblingContext,\n type UnresolvedPaneNode,\n} from '../types'\nimport {assignId} from './assignId'\nimport {createPaneResolver, type PaneResolverMiddleware} from './createPaneResolver'\nimport {memoBind} from './memoBind'\n\ninterface TraverseOptions {\n unresolvedPane: UnresolvedPaneNode | undefined\n intent: string\n params: {type: string; id: string; [key: string]: string | undefined}\n payload: unknown\n parent: PaneNode | null\n path: string[]\n currentId: string\n flatIndex: number\n levelIndex: number\n structureContext: StructureContext\n}\n\nexport interface ResolveIntentOptions {\n rootPaneNode?: UnresolvedPaneNode\n intent: string\n params: {type: string; id: string; [key: string]: string | undefined}\n payload: unknown\n structureContext: StructureContext\n}\n\n/**\n * Resolves an intent request using breadth first search. If a match is not\n * found, the intent will resolve to the fallback editor.\n *\n * A match is found if:\n * 1. the `PaneNode` is of type `document` and the its ID matches the intent ID\n * 2. the `PaneNode` is of type `documentList` and the `schemaTypeName` matches\n * 3. the `PaneNode`'s `canHandleIntent` method returns true\n *\n * If a `PaneNode` of type `list` is found, it will be searched for a match.\n *\n * @see PaneNode\n */\nexport async function resolveIntent(options: ResolveIntentOptions): Promise<RouterPanes> {\n const resolvedPaneCache = new Map<string, Observable<PaneNode>>()\n\n // this is a simple version of the memoizer in `createResolvedPaneNodeStream`\n const memoize: PaneResolverMiddleware = (nextFn) => (unresolvedPane, context, flatIndex) => {\n const key = unresolvedPane && `${assignId(unresolvedPane)}-${context.path.join('__')}`\n const cachedResolvedPane = key && resolvedPaneCache.get(key)\n if (cachedResolvedPane) return cachedResolvedPane\n\n const result = nextFn(unresolvedPane, context, flatIndex)\n if (key) resolvedPaneCache.set(key, result)\n return result\n }\n\n const resolvePane = createPaneResolver(memoize)\n\n const fallbackEditorPanes: RouterPanes = [\n [\n {\n id: `__edit__${options.params.id}`,\n params: {...omit(options.params, ['id']), type: options.params.type},\n payload: options.payload,\n },\n ],\n ]\n\n async function traverse({\n currentId,\n flatIndex,\n intent,\n params,\n parent,\n path,\n payload,\n unresolvedPane,\n levelIndex,\n structureContext,\n }: TraverseOptions): Promise<\n Array<{panes: RouterPanes; depthIndex: number; levelIndex: number}>\n > {\n if (!unresolvedPane) return []\n\n const {id: targetId, type: schemaTypeName, ...otherParams} = params\n const context: RouterPaneSiblingContext = {\n id: currentId,\n splitIndex: 0,\n parent,\n path,\n index: flatIndex,\n params: {},\n payload: undefined,\n structureContext,\n }\n const resolvedPane = await firstValueFrom(resolvePane(unresolvedPane, context, flatIndex))\n\n // if the resolved pane is a document pane and the pane's ID matches then\n // resolve the intent to the current path\n if (resolvedPane.type === 'document' && resolvedPane.id === targetId) {\n return [\n {\n panes: [\n ...path.slice(0, path.length - 1).map((i) => [{id: i}]),\n [{id: targetId, params: otherParams, payload}],\n ],\n depthIndex: path.length,\n levelIndex,\n },\n ]\n }\n\n // NOTE: if you update this logic, please also update the similar handler in\n // `getIntentState.ts`\n if (\n // if the resolve pane's `canHandleIntent` returns true, then resolve\n resolvedPane.canHandleIntent?.(intent, params, {\n pane: resolvedPane,\n index: flatIndex,\n }) ||\n // if the pane's `canHandleIntent` did not return true, then match against\n // this default case. we will resolve the intent if:\n (resolvedPane.type === 'documentList' &&\n // 1. the schema type matches (this required for the document to render)\n resolvedPane.schemaTypeName === schemaTypeName &&\n // 2. the filter is the default filter.\n //\n // NOTE: this case is to prevent false positive matches where the user\n // has configured a more specific filter for a particular type. In that\n // case, the user can implement their own `canHandleIntent` function\n resolvedPane.options.filter === '_type == $type')\n ) {\n return [\n {\n panes: [\n // map the current path to router panes\n ...path.map((id) => [{id}]),\n // then augment with the intents IDs and params\n [{id: params.id, params: otherParams, payload}],\n ],\n depthIndex: path.length,\n levelIndex,\n },\n ]\n }\n\n if (resolvedPane.type === 'list' && resolvedPane.child && resolvedPane.items) {\n return (\n await Promise.all(\n resolvedPane.items.map((item, nextLevelIndex) => {\n if (item.type === 'divider') return Promise.resolve([])\n\n return traverse({\n currentId: item._id || item.id,\n flatIndex: flatIndex + 1,\n intent,\n params,\n parent: resolvedPane,\n path: [...path, item.id],\n payload,\n unresolvedPane:\n typeof resolvedPane.child === 'function'\n ? memoBind(resolvedPane, 'child')\n : resolvedPane.child,\n levelIndex: nextLevelIndex,\n structureContext,\n })\n }),\n )\n ).flat()\n }\n\n return []\n }\n\n const matchingPanes = await traverse({\n currentId: 'root',\n flatIndex: 0,\n levelIndex: 0,\n intent: options.intent,\n params: options.params,\n parent: null,\n path: [],\n payload: options.payload,\n unresolvedPane: options.rootPaneNode,\n structureContext: options.structureContext,\n })\n\n const closestPaneToRoot = matchingPanes.sort((a, b) => {\n // break ties with the level index\n if (a.depthIndex === b.depthIndex) return a.levelIndex - b.levelIndex\n return a.depthIndex - b.depthIndex\n })[0]\n\n if (closestPaneToRoot) {\n return closestPaneToRoot.panes\n }\n\n return fallbackEditorPanes\n}\n","import {generateHelpUrl} from '@sanity/generate-help-url'\nimport {isEqual} from 'lodash'\nimport {concat, NEVER, type Observable, of as observableOf} from 'rxjs'\nimport {distinctUntilChanged, map, pairwise, scan, startWith, switchMap} from 'rxjs/operators'\n\nimport {type StructureContext} from '../structureBuilder'\nimport {\n type DocumentPaneNode,\n type PaneNode,\n type PaneNodeResolver,\n type RouterPanes,\n type RouterPaneSibling,\n type RouterPaneSiblingContext,\n type UnresolvedPaneNode,\n} from '../types'\nimport {assignId} from './assignId'\nimport {\n createPaneResolver,\n type PaneResolver,\n type PaneResolverMiddleware,\n} from './createPaneResolver'\nimport {memoBind} from './memoBind'\nimport {PaneResolutionError} from './PaneResolutionError'\n\n/**\n * the fallback editor child that is implicitly inserted into the structure tree\n * if the id starts with `__edit__`\n */\nconst fallbackEditorChild: PaneNodeResolver = (nodeId, context): DocumentPaneNode => {\n const id = nodeId.replace(/^__edit__/, '')\n const {\n params,\n payload,\n structureContext: {resolveDocumentNode},\n } = context\n const {type, template} = params\n\n if (!type) {\n throw new Error(\n `Document type for document with ID ${id} was not provided in the router params.`,\n )\n }\n\n let defaultDocumentBuilder = resolveDocumentNode({schemaType: type, documentId: id}).id('editor')\n\n if (template) {\n defaultDocumentBuilder = defaultDocumentBuilder.initialValueTemplate(\n template,\n payload as {[key: string]: unknown},\n )\n }\n\n return defaultDocumentBuilder.serialize() as DocumentPaneNode\n}\n\n/**\n * takes in a `RouterPaneSiblingContext` and returns a normalized string\n * representation that can be used for comparisons\n */\nfunction hashContext(context: RouterPaneSiblingContext): string {\n return `contextHash(${JSON.stringify({\n id: context.id,\n parentId: parent && assignId(parent),\n path: context.path,\n index: context.index,\n splitIndex: context.splitIndex,\n serializeOptionsIndex: context.serializeOptions?.index,\n serializeOptionsPath: context.serializeOptions?.path,\n })})`\n}\n\n/**\n * takes in `ResolvedPaneMeta` and returns a normalized string representation\n * that can be used for comparisons\n */\nconst hashResolvedPaneMeta = (meta: ResolvedPaneMeta): string => {\n const normalized = {\n type: meta.type,\n id: meta.routerPaneSibling.id,\n params: meta.routerPaneSibling.params || {},\n payload: meta.routerPaneSibling.payload || null,\n flatIndex: meta.flatIndex,\n groupIndex: meta.groupIndex,\n siblingIndex: meta.siblingIndex,\n path: meta.path,\n paneNode: meta.type === 'resolvedMeta' ? assignId(meta.paneNode) : null,\n }\n\n return `metaHash(${JSON.stringify(normalized)})`\n}\n\n/**\n * Represents one flattened \"router pane\", including the source group and\n * sibling indexes.\n *\n * @see RouterPanes\n */\ninterface FlattenedRouterPane {\n routerPaneSibling: RouterPaneSibling\n flatIndex: number\n groupIndex: number\n siblingIndex: number\n}\n\n/**\n * The state of the accumulator used to store and manage memo cache state\n */\ninterface CacheState {\n /**\n * Holds the memoization results keyed by a combination of `assignId` and a\n * context hash.\n */\n resolvedPaneCache: Map<string, Observable<PaneNode>>\n /**\n * Acts as a dictionary that stores cache keys by their flat index. This is\n * used to clean up the cache between different branches in the pane\n * structure.\n *\n * @see createResolvedPaneNodeStream look inside the `scan` where `wrapFn` is\n * defined\n */\n cacheKeysByFlatIndex: Array<Set<string>>\n /**\n * The resulting memoized `PaneResolver` function. This function closes over\n * the `resolvedPaneCache`.\n */\n resolvePane: PaneResolver\n flattenedRouterPanes: FlattenedRouterPane[]\n}\n\nexport interface CreateResolvedPaneNodeStreamOptions {\n /**\n * an input stream of `RouterPanes`\n * @see RouterPanes\n */\n routerPanesStream: Observable<RouterPanes>\n /**\n * any `UnresolvedPaneNode` (could be an observable, promise, pane resolver etc)\n */\n rootPaneNode: UnresolvedPaneNode\n /** used primarily for testing */\n initialCacheState?: CacheState\n\n structureContext: StructureContext\n}\n\n/**\n * The result of pane resolving\n */\nexport type ResolvedPaneMeta = {\n groupIndex: number\n siblingIndex: number\n flatIndex: number\n routerPaneSibling: RouterPaneSibling\n path: string[]\n} & ({type: 'loading'; paneNode: null} | {type: 'resolvedMeta'; paneNode: PaneNode})\n\ninterface ResolvePaneTreeOptions {\n resolvePane: PaneResolver\n flattenedRouterPanes: FlattenedRouterPane[]\n unresolvedPane: UnresolvedPaneNode | undefined\n parent: PaneNode | null\n path: string[]\n structureContext: StructureContext\n}\n\n/**\n * A recursive pane resolving function. Starts at one unresolved pane node and\n * continues until there is no more flattened router panes that can be used as\n * input to the unresolved panes.\n */\nfunction resolvePaneTree({\n unresolvedPane,\n flattenedRouterPanes,\n parent,\n path,\n resolvePane,\n structureContext,\n}: ResolvePaneTreeOptions): Observable<ResolvedPaneMeta[]> {\n const [current, ...rest] = flattenedRouterPanes\n const next = rest[0] as FlattenedRouterPane | undefined\n\n const context: RouterPaneSiblingContext = {\n id: current.routerPaneSibling.id,\n splitIndex: current.siblingIndex,\n parent,\n path: [...path, current.routerPaneSibling.id],\n index: current.flatIndex,\n params: current.routerPaneSibling.params || {},\n payload: current.routerPaneSibling.payload,\n structureContext,\n }\n\n try {\n return resolvePane(unresolvedPane, context, current.flatIndex).pipe(\n // this switch map receives a resolved pane\n switchMap((paneNode) => {\n // we can create a `resolvedMeta` type using it\n const resolvedPaneMeta: ResolvedPaneMeta = {\n type: 'resolvedMeta',\n ...current,\n paneNode: paneNode,\n path: context.path,\n }\n\n // for the other unresolved panes, we can create \"loading panes\"\n const loadingPanes = rest.map((i, restIndex) => {\n const loadingPanePath = [\n ...context.path,\n ...rest.slice(restIndex).map((_, currentIndex) => `[${i.flatIndex + currentIndex}]`),\n ]\n\n const loadingPane: ResolvedPaneMeta = {\n type: 'loading',\n path: loadingPanePath,\n paneNode: null,\n ...i,\n }\n\n return loadingPane\n })\n\n if (!rest.length) {\n return observableOf([resolvedPaneMeta])\n }\n\n let nextStream\n\n if (\n // the fallback editor case\n next?.routerPaneSibling.id.startsWith('__edit__')\n ) {\n nextStream = resolvePaneTree({\n unresolvedPane: fallbackEditorChild,\n flattenedRouterPanes: rest,\n parent,\n path: context.path,\n resolvePane,\n structureContext,\n })\n } else if (current.groupIndex === next?.groupIndex) {\n // if the next flattened router pane has the same group index as the\n // current flattened router pane, then the next flattened router pane\n // belongs to the same group (i.e. it is a split pane)\n nextStream = resolvePaneTree({\n unresolvedPane,\n flattenedRouterPanes: rest,\n parent,\n path,\n resolvePane,\n structureContext,\n })\n } else {\n // normal children resolving\n nextStream = resolvePaneTree({\n unresolvedPane:\n typeof paneNode.child === 'function'\n ? (memoBind(paneNode, 'child') as PaneNodeResolver)\n : paneNode.child,\n flattenedRouterPanes: rest,\n parent: paneNode,\n path: context.path,\n resolvePane,\n structureContext,\n })\n }\n\n return concat(\n // we emit the loading panes first in a concat (this emits immediately)\n observableOf([resolvedPaneMeta, ...loadingPanes]),\n // then whenever the next stream is done, the results will be combined.\n nextStream.pipe(map((nextResolvedPanes) => [resolvedPaneMeta, ...nextResolvedPanes])),\n )\n }),\n )\n } catch (e) {\n if (e instanceof PaneResolutionError) {\n if (e.context) {\n console.warn(\n `Pane resolution error at index ${e.context.index}${\n e.context.splitIndex > 0 ? ` for split pane index ${e.context.splitIndex}` : ''\n }: ${e.message}${e.helpId ? ` - see ${generateHelpUrl(e.helpId)}` : ''}`,\n e,\n )\n }\n\n if (e.helpId === 'structure-item-returned-no-child') {\n // returning an observable of an empty array will remove loading panes\n // note: this one intentionally does not throw\n return observableOf([])\n }\n }\n\n throw e\n }\n}\n\n/**\n * Takes in a stream of `RouterPanes` and an unresolved root pane and returns\n * a stream of `ResolvedPaneMeta`\n */\nexport function createResolvedPaneNodeStream({\n routerPanesStream,\n rootPaneNode,\n initialCacheState = {\n cacheKeysByFlatIndex: [],\n flattenedRouterPanes: [],\n resolvedPaneCache: new Map(),\n resolvePane: () => NEVER,\n },\n structureContext,\n}: CreateResolvedPaneNodeStreamOptions): Observable<ResolvedPaneMeta[]> {\n const resolvedPanes$ = routerPanesStream.pipe(\n // add in implicit \"root\" router pane\n map((rawRouterPanes) => [[{id: 'root'}], ...rawRouterPanes]),\n // create flattened router panes\n map((routerPanes) => {\n const flattenedRouterPanes: FlattenedRouterPane[] = routerPanes\n .flatMap((routerPaneGroup, groupIndex) =>\n routerPaneGroup.map((routerPaneSibling, siblingIndex) => ({\n routerPaneSibling,\n groupIndex,\n siblingIndex,\n })),\n )\n // add in the flat index\n .map((i, index) => ({...i, flatIndex: index}))\n\n return flattenedRouterPanes\n }),\n // calculate a \"diffIndex\" used for clearing the memo cache\n startWith([] as FlattenedRouterPane[]),\n pairwise(),\n map(([prev, curr]) => {\n for (let i = 0; i < curr.length; i++) {\n const prevValue = prev[i]\n const currValue = curr[i]\n\n if (!isEqual(prevValue, currValue)) {\n return {\n flattenedRouterPanes: curr,\n diffIndex: i,\n }\n }\n }\n\n return {\n flattenedRouterPanes: curr,\n diffIndex: curr.length,\n }\n }),\n // create the memoized `resolvePane` function and manage the memo cache\n scan((acc, next) => {\n const {cacheKeysByFlatIndex, resolvedPaneCache} = acc\n const {flattenedRouterPanes, diffIndex} = next\n\n // use the `cacheKeysByFlatIndex` like a dictionary to find cache keys to\n // and cache keys to delete\n const beforeDiffIndex = cacheKeysByFlatIndex.slice(0, diffIndex + 1)\n const afterDiffIndex = cacheKeysByFlatIndex.slice(diffIndex + 1)\n\n const keysToKeep = new Set(beforeDiffIndex.flatMap((keySet) => Array.from(keySet)))\n const keysToDelete = afterDiffIndex\n .flatMap((keySet) => Array.from(keySet))\n .filter((key) => !keysToKeep.has(key))\n\n for (const key of keysToDelete) {\n resolvedPaneCache.delete(key)\n }\n\n // create a memoizing pane resolver middleware that utilizes the cache\n // maintained above. this keeps the cache from growing indefinitely\n const memoize: PaneResolverMiddleware = (nextFn) => (unresolvedPane, context, flatIndex) => {\n const key = unresolvedPane && `${assignId(unresolvedPane)}-${hashContext(context)}`\n const cachedResolvedPane = key && resolvedPaneCache.get(key)\n if (cachedResolvedPane) return cachedResolvedPane\n\n const result = nextFn(unresolvedPane, context, flatIndex)\n if (!key) return result\n\n const cacheKeySet = cacheKeysByFlatIndex[flatIndex] || new Set()\n cacheKeySet.add(key)\n cacheKeysByFlatIndex[flatIndex] = cacheKeySet\n resolvedPaneCache.set(key, result)\n return result\n }\n\n return {\n flattenedRouterPanes,\n cacheKeysByFlatIndex,\n resolvedPaneCache,\n resolvePane: createPaneResolver(memoize),\n }\n }, initialCacheState),\n // run the memoized, recursive resolving\n switchMap(({flattenedRouterPanes, resolvePane}) =>\n resolvePaneTree({\n unresolvedPane: rootPaneNode,\n flattenedRouterPanes,\n parent: null,\n path: [],\n resolvePane,\n structureContext,\n }),\n ),\n )\n\n // after we've created a stream of `ResolvedPaneMeta[]`, we need to clean up\n // the results to remove unwanted loading panes and prevent unnecessary\n // emissions\n return resolvedPanes$.pipe(\n // this diffs the previous emission with the current one. if there is a new\n // loading pane at the same position where a previous pane already had a\n // resolved value (looking at the IDs to compare), then return the previous\n // pane instead of the loading pane\n scan(\n (prev, next) =>\n next.map((nextPane, index) => {\n const prevPane = prev[index] as ResolvedPaneMeta | undefined\n if (!prevPane) return nextPane\n if (nextPane.type !== 'loading') return nextPane\n\n if (prevPane.routerPaneSibling.id === nextPane.routerPaneSibling.id) {\n return prevPane\n }\n return nextPane\n }),\n [] as ResolvedPaneMeta[],\n ),\n // this prevents duplicate emissions\n distinctUntilChanged((prev, next) => {\n if (prev.length !== next.length) return false\n\n for (let i = 0; i < next.length; i++) {\n const prevValue = prev[i]\n const nextValue = next[i]\n if (hashResolvedPaneMeta(prevValue) !== hashResolvedPaneMeta(nextValue)) {\n return false\n }\n }\n\n return true\n }),\n )\n}\n","import {useEffect, useMemo, useState} from 'react'\nimport {ReplaySubject} from 'rxjs'\nimport {map} from 'rxjs/operators'\nimport {type RouterState, useRouter} from 'sanity/router'\n\nimport {LOADING_PANE} from '../constants'\nimport {type PaneNode, type RouterPaneGroup, type RouterPanes} from '../types'\nimport {useStructureTool} from '../useStructureTool'\nimport {createResolvedPaneNodeStream} from './createResolvedPaneNodeStream'\n\ninterface PaneData {\n active: boolean\n childItemId: string | null\n groupIndex: number\n index: number\n itemId: string\n key: string\n pane: PaneNode | typeof LOADING_PANE\n params: Record<string, string | undefined> & {perspective?: string}\n path: string\n payload: unknown\n selected: boolean\n siblingIndex: number\n}\n\nexport interface Panes {\n paneDataItems: PaneData[]\n routerPanes: RouterPanes\n resolvedPanes: (PaneNode | typeof LOADING_PANE)[]\n}\n\nfunction useRouterPanesStream() {\n const [routerStateSubject] = useState(() => new ReplaySubject<RouterState>(1))\n const routerPanes$ = useMemo(\n () =>\n routerStateSubject\n .asObservable()\n .pipe(map((_routerState) => (_routerState?.panes || []) as RouterPanes)),\n [routerStateSubject],\n )\n const {state: routerState} = useRouter()\n useEffect(() => {\n routerStateSubject.next(routerState)\n }, [routerState, routerStateSubject])\n\n return routerPanes$\n}\n\nexport function useResolvedPanes(): Panes {\n // used to propagate errors from async effect. throwing inside of the render\n // will bubble the error to react where it can be picked up by standard error\n // boundaries\n const [error, setError] = useState<unknown>()\n if (error) throw error\n\n const {structureContext, rootPaneNode} = useStructureTool()\n\n const [data, setData] = useState<Panes>({\n paneDataItems: [],\n resolvedPanes: [],\n routerPanes: [],\n })\n\n const routerPanesStream = useRouterPanesStream()\n\n useEffect(() => {\n const resolvedPanes$ = createResolvedPaneNodeStream({\n rootPaneNode,\n routerPanesStream,\n structureContext,\n }).pipe(\n map((resolvedPanes) => {\n const routerPanes = resolvedPanes.reduce<RouterPanes>((acc, next) => {\n const currentGroup = acc[next.groupIndex] || []\n currentGroup[next.siblingIndex] = next.routerPaneSibling\n acc[next.groupIndex] = currentGroup\n return acc\n }, [])\n\n const groupsLen = routerPanes.length\n\n const paneDataItems = resolvedPanes.map((pane) => {\n const {groupIndex, flatIndex, siblingIndex, routerPaneSibling, path} = pane\n const itemId = routerPaneSibling.id\n const nextGroup = routerPanes[groupIndex + 1] as RouterPaneGroup | undefined\n\n const paneDataItem: PaneData = {\n active: groupIndex === groupsLen - 2,\n childItemId: nextGroup?.[0].id ?? null,\n index: flatIndex,\n itemId: routerPaneSibling.id,\n groupIndex,\n key: `${\n pane.type === 'loading' ? 'unknown' : pane.paneNode.id\n }-${itemId}-${siblingIndex}`,\n pane: pane.type === 'loading' ? LOADING_PANE : pane.paneNode,\n params: routerPaneSibling.params || {},\n path: path.join(';'),\n payload: routerPaneSibling.payload,\n selected: flatIndex === resolvedPanes.length - 1,\n siblingIndex,\n }\n\n return paneDataItem\n })\n\n return {\n paneDataItems,\n routerPanes,\n resolvedPanes: paneDataItems.map((pane) => pane.pane),\n }\n }),\n )\n\n const subscription = resolvedPanes$.subscribe({\n next: (result) => setData(result),\n error: (e) => setError(e),\n })\n\n return () => subscription.unsubscribe()\n }, [rootPaneNode, routerPanesStream, structureContext])\n\n return data\n}\n","import {uuid} from '@sanity/uuid'\nimport {firstValueFrom, type Observable} from 'rxjs'\nimport {type DocumentStore, getPublishedId} from 'sanity'\n\nimport {PaneResolutionError} from '../../../structureResolvers'\n\nexport function removeDraftPrefix(documentId: string): string {\n const publishedId = getPublishedId(documentId)\n\n if (publishedId !== documentId) {\n console.warn(\n 'Removed unexpected draft id in document link: All links to documents should have the ' +\n '`drafts.`-prefix removed and something appears to have made an intent link to `%s`',\n documentId,\n )\n }\n\n return publishedId\n}\n\nexport async function ensureDocumentIdAndType(\n documentStore: DocumentStore,\n id: string | undefined,\n type: string | undefined,\n): Promise<{id: string; type: string}> {\n if (id && type) return {id, type}\n if (!id && type) return {id: uuid(), type}\n if (id && !type) {\n const resolvedType = await firstValueFrom(\n documentStore.resolveTypeForDocument(id) as Observable<string>,\n )\n\n return {id, type: resolvedType}\n }\n\n throw new PaneResolutionError({\n message: 'Neither document `id` or `type` was provided when trying to resolve intent.',\n })\n}\n","import {memo, useCallback, useEffect, useState} from 'react'\nimport {isRecord, useDocumentStore} from 'sanity'\nimport {useRouter, useRouterState} from 'sanity/router'\n\nimport {resolveIntent} from '../../../structureResolvers'\nimport {useStructureTool} from '../../../useStructureTool'\nimport {ensureDocumentIdAndType} from './utils'\n\nconst EMPTY_RECORD: Record<string, unknown> = {}\n\n/**\n * A component that receives an intent from props and redirects to the resolved\n * intent location (while showing a loading spinner during the process)\n */\nexport const IntentResolver = memo(function IntentResolver() {\n const {navigate} = useRouter()\n const maybeIntent = useRouterState(\n useCallback((routerState) => {\n const intentName = typeof routerState.intent === 'string' ? routerState.intent : undefined\n return intentName\n ? {\n intent: intentName,\n params: isRecord(routerState.params) ? routerState.params : EMPTY_RECORD,\n payload: routerState.payload,\n }\n : undefined\n }, []),\n )\n const {rootPaneNode, structureContext} = useStructureTool()\n const documentStore = useDocumentStore()\n const [error, setError] = useState<unknown>(null)\n\n // this re-throws errors so that parent ErrorBoundary's can handle them properly\n if (error) throw error\n\n // eslint-disable-next-line consistent-return\n useEffect(() => {\n if (maybeIntent) {\n const {intent, params, payload} = maybeIntent\n\n let cancelled = false\n // eslint-disable-next-line no-inner-declarations\n async function effect() {\n const {id, type} = await ensureDocumentIdAndType(\n documentStore,\n typeof params.id === 'string' ? params.id : undefined,\n typeof params.type === 'string' ? params.type : undefined,\n )\n\n if (cancelled) return\n\n const panes = await resolveIntent({\n intent,\n params: {...params, id, type},\n payload,\n rootPaneNode,\n structureContext,\n })\n\n if (cancelled) return\n\n navigate({panes}, {replace: true})\n }\n\n effect().catch(setError)\n\n return () => {\n cancelled = true\n }\n }\n }, [documentStore, maybeIntent, navigate, rootPaneNode, structureContext])\n\n return null\n})\n","import {generateHelpUrl} from '@sanity/generate-help-url'\nimport {SyncIcon} from '@sanity/icons'\nimport {Box, Card, Code, Container, Heading, Stack, Text} from '@sanity/ui'\nimport {useCallback} from 'react'\nimport {useTranslation} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {Button} from '../../../ui-components'\nimport {structureLocaleNamespace} from '../../i18n'\nimport {SerializeError} from '../../structureBuilder'\nimport {PaneResolutionError} from '../../structureResolvers'\n\nconst PathSegment = styled.span`\n &:not(:last-child)::after {\n content: ' ➝ ';\n opacity: 0.5;\n }\n`\n\nfunction formatStack(stack: string) {\n return (\n stack\n // Prettify builder functions\n .replace(/\\(\\.\\.\\.\\)\\./g, '(...)\\n .')\n // Remove webpack cruft from function names\n .replace(/__WEBPACK_IMPORTED_MODULE_\\d+_+/g, '')\n // Remove default export postfix from function names\n .replace(/___default\\./g, '.')\n // Replace full host path, leave only path to JS-file\n .replace(new RegExp(` \\\\(https?:\\\\/\\\\/${window.location.host}`, 'g'), ' (')\n )\n}\n\ninterface StructureErrorProps {\n error: unknown\n}\n\nexport function StructureError({error}: StructureErrorProps) {\n if (!(error instanceof PaneResolutionError)) {\n throw error\n }\n const {cause} = error\n const {t} = useTranslation(structureLocaleNamespace)\n\n // Serialize errors are well-formatted and should be readable, in these cases a stack trace is\n // usually not helpful. Build errors in dev (with HMR) usually also contains a bunch of garbage\n // instead of an actual error message, so make sure we show the message in these cases as well\n const stack = cause?.stack || error.stack\n const showStack =\n stack && !(cause instanceof SerializeError) && !error.message.includes('Module build failed:')\n\n const path = cause instanceof SerializeError ? cause.path : []\n const helpId = (cause instanceof SerializeError && cause.helpId) || error.helpId\n\n const handleReload = useCallback(() => {\n window.location.reload()\n }, [])\n\n return (\n <Card height=\"fill\" overflow=\"auto\" padding={4} sizing=\"border\" tone=\"critical\">\n <Container>\n <Heading as=\"h2\">{t('structure-error.header.text')}</Heading>\n\n <Card marginTop={4} padding={4} radius={2} overflow=\"auto\" shadow={1} tone=\"inherit\">\n {path.length > 0 && (\n <Stack space={2}>\n <Text size={1} weight=\"medium\">\n {t('structure-error.structure-path.label')}\n </Text>\n <Code>\n {/* TODO: it seems like the path is off by one and includes */}\n {/* `root` twice */}\n {path.slice(1).map((segment, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <PathSegment key={`${segment}-${i}`}>{segment}</PathSegment>\n ))}\n </Code>\n </Stack>\n )}\n\n <Stack marginTop={4} space={2}>\n <Text size={1} weight=\"medium\">\n {t('structure-error.error.label')}\n </Text>\n <Code>{showStack ? formatStack(stack) : error.message}</Code>\n </Stack>\n\n {helpId && (\n <Box marginTop={4}>\n <Text>\n <a href={generateHelpUrl(helpId)} rel=\"noopener noreferrer\" target=\"_blank\">\n {t('structure-error.docs-link.text')}\n </a>\n </Text>\n </Box>\n )}\n\n <Box marginTop={4}>\n <Button\n text={t('structure-error.reload-button.text')}\n icon={SyncIcon}\n tone=\"primary\"\n onClick={handleReload}\n />\n </Box>\n </Card>\n </Container>\n </Card>\n )\n}\n","import {WarningOutlineIcon} from '@sanity/icons'\nimport {Box, Card, Container, Flex, Stack, Text} from '@sanity/ui'\nimport {useTranslation} from 'sanity'\n\nimport {structureLocaleNamespace} from '../../i18n'\n\nexport function NoDocumentTypesScreen() {\n const {t} = useTranslation(structureLocaleNamespace)\n\n return (\n <Card height=\"fill\">\n <Flex align=\"center\" height=\"fill\" justify=\"center\" padding={4} sizing=\"border\">\n <Container width={0}>\n <Card padding={4} radius={2} shadow={1} tone=\"caution\">\n <Flex>\n <Box>\n <Text size={1}>\n <WarningOutlineIcon />\n </Text>\n </Box>\n <Stack flex={1} marginLeft={3} space={3}>\n <Text as=\"h1\" size={1} weight=\"medium\">\n {t('no-document-types-screen.title')}\n </Text>\n <Text as=\"p\" muted size={1}>\n {t('no-document-types-screen.subtitle')}\n </Text>\n <Text as=\"p\" muted size={1}>\n <a\n href=\"https://www.sanity.io/docs/create-a-schema-and-configure-sanity-studio\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {t('no-document-types-screen.link-text')}\n </a>\n </Text>\n </Stack>\n </Flex>\n </Card>\n </Container>\n </Flex>\n </Card>\n )\n}\n","import {type ObjectSchemaType} from '@sanity/types'\nimport {useEffect} from 'react'\nimport {\n unstable_useValuePreview as useValuePreview,\n useEditState,\n usePerspective,\n useSchema,\n useTranslation,\n} from 'sanity'\n\nimport {LOADING_PANE} from '../../constants'\nimport {useDocumentLastRev} from '../../hooks/useDocumentLastRev'\nimport {structureLocaleNamespace} from '../../i18n'\nimport {type Panes} from '../../structureResolvers'\nimport {type DocumentPaneNode} from '../../types'\nimport {useStructureTool} from '../../useStructureTool'\n\ninterface StructureTitleProps {\n resolvedPanes: Panes['resolvedPanes']\n}\n\n// TODO: Fix state jank when editing different versions inside panes.\nconst DocumentTitle = (props: {documentId: string; documentType: string}) => {\n const {documentId, documentType} = props\n const {selectedReleaseId} = usePerspective()\n\n const editState = useEditState(documentId, documentType, 'default', selectedReleaseId)\n const schema = useSchema()\n const {t} = useTranslation(structureLocaleNamespace)\n const isNewDocument = !editState?.published && !editState?.draft\n const documentValue = editState?.version || editState?.draft || editState?.published\n const schemaType = schema.get(documentType) as ObjectSchemaType | undefined\n\n const {value, isLoading: previewValueIsLoading} = useValuePreview({\n enabled: !!documentValue,\n schemaType,\n value: documentValue,\n })\n\n const {lastRevisionDocument} = useDocumentLastRev(documentId, documentType)\n const isDeleted = lastRevisionDocument && !documentValue\n\n // if the document is deleted, we don't want to show the title\n const documentTitle = isDeleted\n ? ''\n : isNewDocument\n ? t('browser-document-title.new-document', {\n schemaType: schemaType?.title || schemaType?.name,\n })\n : value?.title || t('browser-document-title.untitled-document')\n\n const settled = editState.ready && !previewValueIsLoading\n const newTitle = useConstructDocumentTitle(documentTitle)\n useEffect(() => {\n if (!settled) return\n // Set the title as the document title\n document.title = newTitle\n }, [documentTitle, settled, newTitle])\n\n return null\n}\n\nconst PassthroughTitle = (props: {title?: string}) => {\n const {title} = props\n const newTitle = useConstructDocumentTitle(title)\n useEffect(() => {\n // Set the title as the document title\n document.title = newTitle\n }, [newTitle, title])\n return null\n}\n\nexport const StructureTitle = (props: StructureTitleProps) => {\n const {resolvedPanes} = props\n\n if (!resolvedPanes?.length) return null\n\n const lastPane = resolvedPanes[resolvedPanes.length - 1]\n\n // If the last pane is loading, display the structure tool title only\n if (isLoadingPane(lastPane)) {\n return <PassthroughTitle />\n }\n\n // If the last pane is a document\n if (isDocumentPane(lastPane)) {\n // Passthrough the document pane's title, which may be defined in structure builder\n if (lastPane?.title) {\n return <PassthroughTitle title={lastPane.title} />\n }\n\n // Otherwise, display a `document.title` containing the resolved Sanity document title\n return <DocumentTitle documentId={lastPane.options.id} documentType={lastPane.options.type} />\n }\n\n // Otherwise, display the last pane's title (if present)\n return <PassthroughTitle title={lastPane?.title} />\n}\n\n/**\n * Construct a pipe delimited title containing `activeTitle` (if applicable) and the base structure title.\n *\n * @param activeTitle - Title of the first segment\n *\n * @returns A pipe delimited title in the format `${activeTitle} | %BASE_STRUCTURE_TITLE%`\n * or simply `%BASE_STRUCTURE_TITLE` if `activeTitle` is undefined.\n */\nfunction useConstructDocumentTitle(activeTitle?: string) {\n const structureToolBaseTitle = useStructureTool().structureContext.title\n return [activeTitle, structureToolBaseTitle].filter((title) => title).join(' | ')\n}\n\n// Type guards\nfunction isDocumentPane(pane: Panes['resolvedPanes'][number]): pane is DocumentPaneNode {\n return pane !== LOADING_PANE && pane.type === 'document'\n}\n\nfunction isLoadingPane(pane: Panes['resolvedPanes'][number]): pane is typeof LOADING_PANE {\n return pane === LOADING_PANE\n}\n","import {PortalProvider, useTheme, useToast} from '@sanity/ui'\nimport {isHotkey} from 'is-hotkey-esm'\nimport {Fragment, memo, useCallback, useEffect, useState} from 'react'\nimport {_isCustomDocumentTypeDefinition, useSchema} from 'sanity'\nimport {useRouterState} from 'sanity/router'\nimport {styled} from 'styled-components'\n\nimport {LOADING_PANE} from '../../constants'\nimport {LoadingPane, StructureToolPane} from '../../panes'\nimport {useResolvedPanes} from '../../structureResolvers'\nimport {type PaneNode} from '../../types'\nimport {useStructureTool} from '../../useStructureTool'\nimport {PaneLayout} from '../pane'\nimport {NoDocumentTypesScreen} from './NoDocumentTypesScreen'\nimport {StructureTitle} from './StructureTitle'\n\ninterface StructureToolProps {\n onPaneChange: (panes: Array<PaneNode | typeof LOADING_PANE>) => void\n}\n\nconst StyledPaneLayout = styled(PaneLayout)`\n min-height: 100%;\n min-width: 320px;\n`\n\nconst isSaveHotkey = isHotkey('mod+s')\n\n/**\n * @internal\n */\nexport const StructureTool = memo(function StructureTool({onPaneChange}: StructureToolProps) {\n const {push: pushToast} = useToast()\n const schema = useSchema()\n const {layoutCollapsed, setLayoutCollapsed} = useStructureTool()\n const {paneDataItems, resolvedPanes} = useResolvedPanes()\n // Intent resolving is processed by the sibling `<IntentResolver />` but it doesn't have a UI for indicating progress.\n // We handle that here, so if there are only 1 pane (the root structure), and there's an intent state in the router, we need to show a placeholder LoadingPane until\n // the structure is resolved and we know what panes to load/display\n const isResolvingIntent = useRouterState(\n useCallback((routerState) => typeof routerState.intent === 'string', []),\n )\n const {\n sanity: {media},\n } = useTheme()\n\n const [portalElement, setPortalElement] = useState<HTMLDivElement | null>(null)\n\n const handleRootCollapse = useCallback(() => setLayoutCollapsed(true), [setLayoutCollapsed])\n const handleRootExpand = useCallback(() => setLayoutCollapsed(false), [setLayoutCollapsed])\n\n useEffect(() => {\n // we check for length before emitting here to skip the initial empty array\n // state from the `useResolvedPanes` hook. there should always be a root\n // pane emitted on subsequent emissions\n if (resolvedPanes.length) {\n onPaneChange(resolvedPanes)\n }\n }, [onPaneChange, resolvedPanes])\n\n useEffect(() => {\n const handleGlobalKeyDown = (event: KeyboardEvent) => {\n // Prevent `Cmd+S`\n if (isSaveHotkey(event)) {\n event.preventDefault()\n\n pushToast({\n closable: true,\n id: 'auto-save-message',\n status: 'info',\n title: 'Your work is automatically saved!',\n duration: 4000,\n })\n }\n }\n\n window.addEventListener('keydown', handleGlobalKeyDown)\n return () => window.removeEventListener('keydown', handleGlobalKeyDown)\n }, [pushToast])\n\n const hasDefinedDocumentTypes = schema._original?.types.some(_isCustomDocumentTypeDefinition)\n\n if (!hasDefinedDocumentTypes) {\n return <NoDocumentTypesScreen />\n }\n\n return (\n <PortalProvider element={portalElement || null}>\n <StyledPaneLayout\n flex={1}\n height={layoutCollapsed ? undefined : 'fill'}\n minWidth={media[1]}\n onCollapse={handleRootCollapse}\n onExpand={handleRootExpand}\n >\n {paneDataItems.map(\n ({\n active,\n childItemId,\n groupIndex,\n itemId,\n key: paneKey,\n pane,\n index: paneIndex,\n params: paneParams,\n path,\n payload,\n siblingIndex,\n selected,\n }) => (\n <Fragment key={`${pane === LOADING_PANE ? 'loading' : pane.type}-${paneIndex}`}>\n {pane === LOADING_PANE ? (\n <LoadingPane paneKey={paneKey} path={path} selected={selected} />\n ) : (\n <StructureToolPane\n active={active}\n groupIndex={groupIndex}\n index={paneIndex}\n pane={pane}\n childItemId={childItemId}\n itemId={itemId}\n paneKey={paneKey}\n params={paneParams}\n payload={payload}\n path={path}\n selected={selected}\n siblingIndex={siblingIndex}\n />\n )}\n </Fragment>\n ),\n )}\n {/* If there's just 1 pane (the root), or less, and we're resolving an intent then it's necessary to show */}\n {/* a loading indicator as the intent resolving is async, could take a while and can also be interrupted/redirected */}\n {paneDataItems.length <= 1 && isResolvingIntent && (\n <LoadingPane paneKey=\"intent-resolver\" />\n )}\n </StyledPaneLayout>\n <StructureTitle resolvedPanes={resolvedPanes} />\n <div data-portal=\"\" ref={setPortalElement} />\n </PortalProvider>\n )\n})\n","import {useEffect, useState} from 'react'\nimport {SourceProvider, type Tool, useWorkspace} from 'sanity'\n\nimport {ErrorBoundary} from '../../../ui-components/errorBoundary'\nimport {setActivePanes} from '../../getIntentState'\nimport {StructureToolProvider} from '../../StructureToolProvider'\nimport {type StructureToolOptions} from '../../types'\nimport {IntentResolver} from './intentResolver'\nimport {StructureError} from './StructureError'\nimport {StructureTool} from './StructureTool'\n\ninterface StructureToolBoundaryProps {\n tool: Tool<StructureToolOptions>\n}\n\nexport function StructureToolBoundary({tool: {options}}: StructureToolBoundaryProps) {\n const {unstable_sources: sources} = useWorkspace()\n const [firstSource] = sources\n const {source, defaultDocumentNode, structure} = options || {}\n\n // Set active panes to blank on mount and unmount\n useEffect(() => {\n setActivePanes([])\n return () => setActivePanes([])\n }, [])\n\n const [{error}, setError] = useState<{error: unknown}>({error: null})\n\n // this re-throws if the error it catches is not a PaneResolutionError\n if (error) return <StructureError error={error} />\n\n return (\n <ErrorBoundary onCatch={setError}>\n <SourceProvider name={source || firstSource.name}>\n <StructureToolProvider defaultDocumentNode={defaultDocumentNode} structure={structure}>\n <StructureTool onPaneChange={setActivePanes} />\n <IntentResolver />\n </StructureToolProvider>\n </SourceProvider>\n </ErrorBoundary>\n )\n}\n"],"names":["PaneResolutionError","Error","constructor","message","context","helpId","cause","name","randomIdCache","WeakMap","assignId","obj","cachedValue","get","id","nanoid","set","isPromise","thing","then","isSerializable","isRecord","serialize","rethrowWithPaneResolutionErrors","next","unresolvedPane","flatIndex","e","wrapWithPublishReplay","args","pipe","publishReplay","refCount","createPaneResolver","middleware","resolvePane","isObservable","from","switchMap","result","observableOf","bindCache","memoBind","methodKey","boundMethods","Map","bound","method","bind","resolveIntent","options","resolvedPaneCache","nextFn","key","path","join","cachedResolvedPane","fallbackEditorPanes","params","omit","type","payload","traverse","currentId","intent","parent","levelIndex","structureContext","targetId","schemaTypeName","otherParams","resolvedPane","firstValueFrom","splitIndex","index","undefined","panes","slice","length","map","i","depthIndex","canHandleIntent","pane","filter","child","items","Promise","all","item","nextLevelIndex","resolve","_id","flat","closestPaneToRoot","rootPaneNode","sort","a","b","fallbackEditorChild","nodeId","replace","resolveDocumentNode","template","defaultDocumentBuilder","schemaType","documentId","initialValueTemplate","hashContext","JSON","stringify","parentId","serializeOptionsIndex","serializeOptions","serializeOptionsPath","hashResolvedPaneMeta","meta","normalized","routerPaneSibling","groupIndex","siblingIndex","paneNode","resolvePaneTree","flattenedRouterPanes","current","rest","resolvedPaneMeta","loadingPanes","restIndex","_","currentIndex","nextStream","startsWith","concat","nextResolvedPanes","console","warn","generateHelpUrl","createResolvedPaneNodeStream","routerPanesStream","initialCacheState","cacheKeysByFlatIndex","NEVER","rawRouterPanes","routerPanes","flatMap","routerPaneGroup","startWith","pairwise","prev","curr","prevValue","currValue","isEqual","diffIndex","scan","acc","beforeDiffIndex","afterDiffIndex","keysToKeep","Set","keySet","Array","keysToDelete","has","delete","cacheKeySet","add","nextPane","prevPane","distinctUntilChanged","nextValue","useRouterPanesStream","$","_c","routerStateSubject","useState","_temp","t0","t1","asObservable","_temp2","routerPanes$","state","routerState","useRouter","t2","t3","useEffect","_routerState","ReplaySubject","useResolvedPanes","error","setError","useStructureTool","Symbol","for","paneDataItems","resolvedPanes","data","setData","subscription","_temp5","subscribe","unsubscribe","reduce","_temp3","groupsLen","itemId","nextGroup","active","childItemId","LOADING_PANE","selected","_temp4","pane_0","currentGroup","ensureDocumentIdAndType","documentStore","uuid","resolvedType","resolveTypeForDocument","EMPTY_RECORD","IntentResolver","memo","navigate","maybeIntent","useRouterState","useDocumentStore","cancelled","effect","catch","intentName","PathSegment","styled","span","formatStack","stack","RegExp","window","location","host","StructureError","t","useTranslation","structureLocaleNamespace","showStack","SerializeError","includes","handleReload","jsx","Heading","t4","jsxs","Stack","Text","Code","t5","t6","t7","t8","t9","t10","Box","t11","t12","Button","SyncIcon","t13","Card","t14","Container","segment","reload","NoDocumentTypesScreen","WarningOutlineIcon","Flex","DocumentTitle","props","documentType","selectedReleaseId","usePerspective","editState","useEditState","schema","useSchema","isNewDocument","published","draft","documentValue","version","value","isLoading","previewValueIsLoading","useValuePreview","enabled","lastRevisionDocument","useDocumentLastRev","documentTitle","title","settled","ready","newTitle","useConstructDocumentTitle","document","PassthroughTitle","StructureTitle","lastPane","isLoadingPane","isDocumentPane","activeTitle","structureToolBaseTitle","StyledPaneLayout","PaneLayout","isSaveHotkey","isHotkey","StructureTool","onPaneChange","push","pushToast","useToast","layoutCollapsed","setLayoutCollapsed","isResolvingIntent","sanity","useTheme","media","portalElement","setPortalElement","handleRootCollapse","handleRootExpand","handleGlobalKeyDown","event","preventDefault","closable","status","duration","addEventListener","removeEventListener","_original","types","some","_isCustomDocumentTypeDefinition","LoadingPane","t15","t16","PortalProvider","paneKey","paneIndex","paneParams","Fragment","StructureToolPane","StructureToolBoundary","tool","unstable_sources","sources","useWorkspace","firstSource","source","defaultDocumentNode","structure","setActivePanes","StructureToolProvider","ErrorBoundary","SourceProvider"],"mappings":"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"}