sanity 3.72.1 → 3.72.2-use-live-content-api.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/_chunks-cjs/LiveQueries.js +236 -163
- package/lib/_chunks-cjs/LiveQueries.js.map +1 -1
- package/lib/_chunks-cjs/PresentationToolGrantsCheck.js +3 -7
- package/lib/_chunks-cjs/PresentationToolGrantsCheck.js.map +1 -1
- package/lib/_chunks-cjs/buildAction.js +3 -0
- package/lib/_chunks-cjs/buildAction.js.map +1 -1
- package/lib/_chunks-cjs/presentation.js +3 -4
- package/lib/_chunks-cjs/presentation.js.map +1 -1
- package/lib/_chunks-cjs/version.js +1 -1
- package/lib/_chunks-es/LiveQueries.mjs +235 -162
- package/lib/_chunks-es/LiveQueries.mjs.map +1 -1
- package/lib/_chunks-es/PresentationToolGrantsCheck.mjs +2 -4
- package/lib/_chunks-es/PresentationToolGrantsCheck.mjs.map +1 -1
- package/lib/_chunks-es/presentation.mjs +3 -3
- package/lib/_chunks-es/presentation.mjs.map +1 -1
- package/lib/_chunks-es/version.mjs +1 -1
- package/lib/_internal/cli/threads/validateDocuments.js +1 -1
- package/lib/_internal/cli/threads/validateDocuments.js.map +1 -1
- package/lib/_legacy/LiveQueries.esm.js +235 -162
- package/lib/_legacy/LiveQueries.esm.js.map +1 -1
- package/lib/_legacy/PresentationToolGrantsCheck.esm.js +2 -4
- package/lib/_legacy/PresentationToolGrantsCheck.esm.js.map +1 -1
- package/lib/_legacy/presentation.esm.js +3 -3
- package/lib/_legacy/presentation.esm.js.map +1 -1
- package/lib/_legacy/version.esm.js +1 -1
- package/package.json +13 -14
- package/src/_internal/cli/server/buildVendorDependencies.ts +1 -0
- package/src/_internal/cli/threads/validateDocuments.ts +2 -2
- package/src/presentation/PresentationTool.tsx +10 -21
- package/src/presentation/constants.ts +4 -16
- package/src/presentation/loader/LiveQueries.tsx +79 -234
- package/src/presentation/loader/useLiveEvents.ts +75 -0
- package/src/presentation/loader/useLiveQueries.ts +127 -0
- package/src/presentation/loader/utils.ts +2 -125
- package/src/presentation/types.ts +1 -18
- package/lib/_chunks-cjs/LoaderQueries.js +0 -281
- package/lib/_chunks-cjs/LoaderQueries.js.map +0 -1
- package/lib/_chunks-cjs/utils.js +0 -70
- package/lib/_chunks-cjs/utils.js.map +0 -1
- package/lib/_chunks-es/LoaderQueries.mjs +0 -288
- package/lib/_chunks-es/LoaderQueries.mjs.map +0 -1
- package/lib/_chunks-es/utils.mjs +0 -74
- package/lib/_chunks-es/utils.mjs.map +0 -1
- package/lib/_legacy/LoaderQueries.esm.js +0 -288
- package/lib/_legacy/LoaderQueries.esm.js.map +0 -1
- package/lib/_legacy/utils.esm.js +0 -74
- package/lib/_legacy/utils.esm.js.map +0 -1
- package/src/presentation/loader/LoaderQueries.tsx +0 -564
@@ -4,6 +4,7 @@ import { PresentationSharedStateContext, PresentationContext, PresentationDocume
|
|
4
4
|
import { jsxs, Fragment, jsx } from "react/jsx-runtime";
|
5
5
|
import { useDocumentStore, isRecord, isReference, getDraftId, defineLocaleResourceBundle, useTranslation, defineDocumentFieldAction, useWorkspace, pathToString, getPublishedId, definePlugin, isDocumentSchemaType } from "sanity";
|
6
6
|
import { ComposeIcon, InfoOutlineIcon, ChevronRightIcon, DesktopIcon, WarningOutlineIcon, ErrorOutlineIcon, MasterDetailIcon } from "@sanity/icons";
|
7
|
+
import { apiVersion } from "@sanity/preview-url-secret/constants";
|
7
8
|
import { Card, Flex, Box, Spinner, Text, Stack, rem } from "@sanity/ui";
|
8
9
|
import { styled } from "styled-components";
|
9
10
|
import get from "lodash/get.js";
|
@@ -23,7 +24,7 @@ const useSharedState = (key, value) => {
|
|
23
24
|
$[0] !== key || $[1] !== setValue || $[2] !== value ? (t0 = () => {
|
24
25
|
setValue(key, value);
|
25
26
|
}, t1 = [key, value, setValue], $[0] = key, $[1] = setValue, $[2] = value, $[3] = t0, $[4] = t1) : (t0 = $[3], t1 = $[4]), useEffect(t0, t1);
|
26
|
-
}, DEFAULT_TOOL_ICON = ComposeIcon, DEFAULT_TOOL_NAME = "presentation", DEFAULT_TOOL_TITLE = "Presentation", EDIT_INTENT_MODE = "presentation", MAX_TIME_TO_OVERLAYS_CONNECTION = 3e3, API_VERSION =
|
27
|
+
}, DEFAULT_TOOL_ICON = ComposeIcon, DEFAULT_TOOL_NAME = "presentation", DEFAULT_TOOL_TITLE = "Presentation", EDIT_INTENT_MODE = "presentation", MAX_TIME_TO_OVERLAYS_CONNECTION = 3e3, API_VERSION = apiVersion, MIN_LOADER_QUERY_LISTEN_HEARTBEAT_INTERVAL = 1e3, LOADER_QUERY_GC_INTERVAL = 3e4, POPUP_CHECK_INTERVAL = 1e3;
|
27
28
|
function keysOf(value) {
|
28
29
|
return Object.keys(value);
|
29
30
|
}
|
@@ -594,8 +595,7 @@ export {
|
|
594
595
|
API_VERSION,
|
595
596
|
DEFAULT_TOOL_NAME,
|
596
597
|
EDIT_INTENT_MODE,
|
597
|
-
|
598
|
-
LIVE_QUERY_CACHE_SIZE,
|
598
|
+
LOADER_QUERY_GC_INTERVAL,
|
599
599
|
MAX_TIME_TO_OVERLAYS_CONNECTION,
|
600
600
|
MIN_LOADER_QUERY_LISTEN_HEARTBEAT_INTERVAL,
|
601
601
|
POPUP_CHECK_INTERVAL,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"presentation.mjs","sources":["../../src/presentation/overlays/useSharedState.ts","../../src/presentation/constants.ts","../../src/presentation/util/props.ts","../../src/presentation/useDocumentLocations.ts","../../src/presentation/i18n/index.ts","../../src/presentation/usePresentationTool.ts","../../src/presentation/document/useCurrentPresentationToolName.ts","../../src/presentation/document/LocationsBanner.tsx","../../src/presentation/document/PresentationDocumentHeader.tsx","../../src/presentation/document/PresentationDocumentProvider.tsx","../../src/presentation/fieldActions/openInStructure.ts","../../src/presentation/getIntentState.ts","../../src/presentation/PresentationSpinner.tsx","../../src/presentation/router.ts","../../src/presentation/plugin.tsx","../../src/presentation/reducers/presentationReducer.ts","../../src/presentation/usePresentationNavigate.ts","../../src/presentation/usePresentationParams.ts"],"sourcesContent":["import {type Serializable} from '@sanity/presentation-comlink'\nimport {useContext, useEffect} from 'react'\nimport {PresentationSharedStateContext} from 'sanity/_singletons'\n\n/** @public */\nexport const useSharedState = (key: string, value: Serializable): undefined => {\n const context = useContext(PresentationSharedStateContext)\n\n if (!context) {\n throw new Error('Preview Snapshots context is missing')\n }\n\n const {setValue} = context\n\n useEffect(() => {\n setValue(key, value)\n }, [key, value, setValue])\n\n return undefined\n}\n","import {ComposeIcon} from '@sanity/icons'\n\nexport const DEFAULT_TOOL_ICON = ComposeIcon\nexport const DEFAULT_TOOL_NAME = 'presentation'\nexport const DEFAULT_TOOL_TITLE = 'Presentation'\n\nexport const EDIT_INTENT_MODE = 'presentation'\n\n// How long we wait until an iframe is loaded until we consider it to be slow and possibly failed\nexport const MAX_TIME_TO_OVERLAYS_CONNECTION = 3_000 // ms\n\n// The API version to use when using `@sanity/client`\nexport const API_VERSION = '2023-10-16'\n\n// Heartbeats shouldn't fire on intervals that are so short it causes performance issues\nexport const MIN_LOADER_QUERY_LISTEN_HEARTBEAT_INTERVAL = 1000 // ms\n\n// Batch size for fetching documents building up the cache\nexport const LIVE_QUERY_CACHE_BATCH_SIZE = 100\n\n// Total cache size for documents that are live queried\nexport const LIVE_QUERY_CACHE_SIZE = 2048\n\n// The interval at which we check if existing popups have been closed\nexport const POPUP_CHECK_INTERVAL = 1000 // ms\n\ndeclare global {\n const PRESENTATION_ENABLE_LIVE_DRAFT_EVENTS: unknown\n}\n\n// Feature flag that uses the new Live Draft Content API instead of the Listen API + Mendoza events\nexport const LIVE_DRAFT_EVENTS_ENABLED =\n typeof PRESENTATION_ENABLE_LIVE_DRAFT_EVENTS === 'string'\n ? PRESENTATION_ENABLE_LIVE_DRAFT_EVENTS === 'true'\n : false\n","import {\n combineLatest,\n from,\n isObservable,\n map,\n mergeAll,\n Observable,\n of,\n scan,\n switchMap,\n} from 'rxjs'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Props<K extends keyof any, T> = {\n [P in K]: T | Observable<T>\n}\n\nfunction keysOf<T extends object>(value: T) {\n return Object.keys(value) as (keyof T)[]\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction setKey(source: Record<string, unknown>, key: any, value: unknown) {\n return {\n ...source,\n [key]: value,\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function props<K extends keyof any, T>(options: {wait?: boolean} = {}) {\n return (source: Observable<Props<K, T>>): Observable<Record<string, unknown>> => {\n return new Observable<Props<K, T>>((observer) => source.subscribe(observer)).pipe(\n switchMap((object) => {\n const keyObservables = keysOf(object).map((key) => {\n const value = object[key]\n return isObservable(value) ? from(value).pipe(map((val) => [key, val])) : of([key, value])\n })\n\n return options.wait\n ? combineLatest(keyObservables).pipe(\n map((pairs) => pairs.reduce((acc, [key, value]) => setKey(acc, key, value), {})),\n )\n : from(keyObservables).pipe(\n mergeAll(),\n scan((acc, [key, value]) => setKey(acc, key, value), {}),\n )\n }),\n )\n }\n}\n","/* eslint-disable @typescript-eslint/no-shadow */\nimport {get} from 'lodash'\nimport {useEffect, useMemo, useState} from 'react'\nimport {isObservable, map, type Observable, of, switchMap} from 'rxjs'\nimport {\n type DocumentStore,\n getDraftId,\n isRecord,\n isReference,\n type Previewable,\n type SanityDocument,\n useDocumentStore,\n} from 'sanity'\n\nimport {\n type DocumentLocationResolver,\n type DocumentLocationResolverObject,\n type DocumentLocationResolvers,\n type DocumentLocationsState,\n type DocumentLocationsStatus,\n} from './types'\nimport {props} from './util/props'\n\nconst INITIAL_STATE: DocumentLocationsState = {locations: []}\n\nfunction getDocumentId(value: Previewable) {\n if (isReference(value)) {\n return value._ref\n }\n return '_id' in value ? value._id : undefined\n}\n\nfunction cleanPreviewable(id: string | undefined, previewable: Previewable) {\n const clean: Record<string, unknown> = id ? {...previewable, _id: id} : {...previewable}\n\n if (clean._type === 'reference') {\n delete clean._type\n delete clean._ref\n delete clean._weak\n delete clean._dataset\n delete clean._projectId\n delete clean._strengthenOnPublish\n }\n\n return clean\n}\n\nfunction listen(id: string, fields: string[], store: DocumentStore) {\n const projection = fields.join(', ')\n const query = {\n fetch: `*[_id==$id][0]{${projection}}`,\n // TODO: is it more performant to use `||` instead of `in`?\n listen: `*[_id in [$id,$draftId]]`,\n }\n const params = {id, draftId: getDraftId(id)}\n return store.listenQuery(query, params, {\n perspective: 'previewDrafts',\n }) as Observable<SanityDocument | null>\n}\n\nfunction observeDocument(\n value: Previewable | null,\n paths: string[][],\n store: DocumentStore,\n): Observable<Record<string, unknown> | null> {\n if (!value || typeof value !== 'object') {\n return of(value)\n }\n\n const id = getDocumentId(value)\n const currentValue = cleanPreviewable(id, value)\n\n const headlessPaths = paths.filter((path) => !(path[0] in currentValue))\n\n if (id && headlessPaths.length) {\n const fields = [...new Set(headlessPaths.map((path: string[]) => path[0]))]\n return listen(id, fields, store).pipe(\n switchMap((snapshot) => {\n if (snapshot) {\n return observeDocument(snapshot, paths, store)\n }\n return of(null)\n }),\n )\n }\n\n const leads: Record<string, string[][]> = {}\n paths.forEach((path) => {\n const [head, ...tail] = path\n if (!leads[head]) {\n leads[head] = []\n }\n leads[head].push(tail)\n })\n const next = Object.keys(leads).reduce((res: Record<string, unknown>, head) => {\n const tails = leads[head].filter((tail) => tail.length > 0)\n if (tails.length === 0) {\n res[head] = isRecord(value) ? (value as Record<string, unknown>)[head] : undefined\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n res[head] = observeDocument((value as any)[head], tails, store)\n }\n return res\n }, currentValue)\n\n return of(next).pipe(props({wait: true}))\n}\n\nfunction observeForLocations(\n documentId: string,\n resolver: DocumentLocationResolverObject<string>,\n documentStore: DocumentStore,\n) {\n const {select} = resolver\n const paths = Object.values(select).map((value) => String(value).split('.')) || []\n const doc = {_type: 'reference', _ref: documentId}\n return observeDocument(doc, paths, documentStore).pipe(\n map((doc) => {\n return Object.keys(select).reduce<Record<string, unknown>>((acc, key) => {\n acc[key] = get(doc, select[key])\n return acc\n }, {})\n }),\n map(resolver.resolve),\n )\n}\n\nexport function useDocumentLocations(props: {\n id: string\n resolvers?: DocumentLocationResolver | DocumentLocationResolvers\n type: string\n}): {\n state: DocumentLocationsState\n status: DocumentLocationsStatus\n} {\n const {id, resolvers, type} = props\n const documentStore = useDocumentStore()\n const [locationsState, setLocationsState] = useState<DocumentLocationsState>(INITIAL_STATE)\n\n const resolver = resolvers && (typeof resolvers === 'function' ? resolvers : resolvers[type])\n\n const [locationsStatus, setLocationsStatus] = useState<DocumentLocationsStatus>(\n resolver ? 'resolving' : 'empty',\n )\n\n const result = useMemo(() => {\n if (!resolver) return undefined\n\n // Original/advanced resolver which requires explicit use of Observables\n if (typeof resolver === 'function') {\n const params = {id, type}\n const context = {documentStore}\n const _result = resolver(params, context)\n return isObservable(_result) ? _result : of(_result)\n }\n\n // Simplified resolver pattern which abstracts away Observable logic\n if ('select' in resolver && 'resolve' in resolver) {\n return observeForLocations(id, resolver, documentStore)\n }\n\n // Resolver is explicitly provided state\n return of(resolver)\n }, [documentStore, id, resolver, type])\n\n useEffect(() => {\n const sub = result?.subscribe((state) => {\n setLocationsState(state || INITIAL_STATE)\n setLocationsStatus(state ? 'resolved' : 'empty')\n })\n\n return () => sub?.unsubscribe()\n }, [result])\n\n return {\n state: locationsState,\n status: locationsStatus,\n }\n}\n","import {defineLocaleResourceBundle} from 'sanity'\n\n/**\n * The locale namespace for the presentation tool\n *\n * @public\n */\nexport const presentationLocaleNamespace = 'presentation' as const\n\n/**\n * The default locale bundle for the presentation tool, which is US English.\n *\n * @internal\n */\nexport const presentationUsEnglishLocaleBundle = defineLocaleResourceBundle({\n locale: 'en-US',\n namespace: presentationLocaleNamespace,\n resources: () => import('./resources'),\n})\n","import {useContext} from 'react'\nimport {PresentationContext} from 'sanity/_singletons'\n\nimport {type PresentationContextValue} from './types'\n\nexport function usePresentationTool(throwOnMissingContext?: true): PresentationContextValue\nexport function usePresentationTool(throwOnMissingContext: false): PresentationContextValue | null\nexport function usePresentationTool(throwOnMissingContext = true): PresentationContextValue | null {\n const presentation = useContext(PresentationContext)\n\n if (throwOnMissingContext && !presentation) {\n throw new Error('Presentation context is missing')\n }\n\n return presentation\n}\n","import {usePresentationTool} from '../usePresentationTool'\n\nexport function useCurrentPresentationToolName(): string | undefined {\n return usePresentationTool(false)?.name ?? undefined\n}\n","import {\n ChevronRightIcon,\n DesktopIcon,\n ErrorOutlineIcon,\n InfoOutlineIcon,\n WarningOutlineIcon,\n} from '@sanity/icons'\nimport {Box, Card, Flex, Spinner, Stack, Text} from '@sanity/ui'\nimport {type ComponentType, type ReactNode, useCallback, useContext, useState} from 'react'\nimport {type ObjectSchemaType, useTranslation} from 'sanity'\nimport {PresentationContext} from 'sanity/_singletons'\nimport {useIntentLink} from 'sanity/router'\n\nimport {DEFAULT_TOOL_NAME, DEFAULT_TOOL_TITLE} from '../constants'\nimport {presentationLocaleNamespace} from '../i18n'\nimport {\n type DocumentLocation,\n type DocumentLocationsState,\n type PresentationPluginOptions,\n} from '../types'\nimport {useCurrentPresentationToolName} from './useCurrentPresentationToolName'\n\nconst TONE_ICONS: Record<'positive' | 'caution' | 'critical', ComponentType> = {\n positive: InfoOutlineIcon,\n caution: WarningOutlineIcon,\n critical: ErrorOutlineIcon,\n}\n\nexport function LocationsBanner(props: {\n documentId: string\n isResolving: boolean\n options: PresentationPluginOptions\n schemaType: ObjectSchemaType\n showPresentationTitle: boolean\n state: DocumentLocationsState\n}): ReactNode {\n const {documentId, isResolving, options, schemaType, showPresentationTitle} = props\n const {locations, message, tone} = props.state\n const len = locations?.length || 0\n\n const {t} = useTranslation(presentationLocaleNamespace)\n const presentation = useContext(PresentationContext)\n const presentationName = presentation?.name\n const [expanded, setExpanded] = useState(false)\n const toggle = useCallback(() => {\n if (!len) return\n setExpanded((v) => !v)\n }, [len])\n\n const title = isResolving\n ? t('locations-banner.resolving.text')\n : message || t('locations-banner.locations-count', {count: len})\n\n const ToneIcon = tone ? TONE_ICONS[tone] : undefined\n\n return (\n <Card padding={1} radius={2} border tone={tone}>\n <div style={{margin: -1}}>\n {!locations && (\n <Flex align=\"flex-start\" gap={3} padding={3}>\n {tone && ToneIcon && (\n <Box flex=\"none\">\n <Text size={1}>\n <ToneIcon />\n </Text>\n </Box>\n )}\n <Box flex={1}>\n <Text size={1} weight=\"medium\">\n {showPresentationTitle && <>{options.title || DEFAULT_TOOL_TITLE} · </>}\n {title}\n </Text>\n </Box>\n </Flex>\n )}\n {locations && (\n <>\n <Card\n as={len ? 'button' : undefined}\n onClick={toggle}\n padding={3}\n radius={1}\n tone=\"inherit\"\n >\n <Flex gap={3}>\n <Box flex=\"none\">\n {isResolving ? (\n <Spinner size={1} />\n ) : (\n <Text size={1}>\n {len === 0 ? (\n <InfoOutlineIcon />\n ) : (\n <ChevronRightIcon\n style={{\n transform: `rotate(${expanded ? '90deg' : 0})`,\n transition: 'transform 100ms ease-in-out',\n }}\n />\n )}\n </Text>\n )}\n </Box>\n <Box flex={1}>\n <Text size={1} weight=\"medium\">\n {showPresentationTitle && <>{options.title || DEFAULT_TOOL_TITLE} · </>}\n {title}\n </Text>\n </Box>\n </Flex>\n </Card>\n <Stack hidden={!expanded} marginTop={1} space={1}>\n {locations.map((l, index) => (\n <LocationItem\n active={\n (options.name || DEFAULT_TOOL_NAME) === presentationName &&\n l.href === presentation?.params.preview\n }\n documentId={documentId}\n documentType={schemaType.name}\n key={index}\n node={l}\n toolName={options.name || DEFAULT_TOOL_NAME}\n />\n ))}\n </Stack>\n </>\n )}\n </div>\n </Card>\n )\n}\n\nfunction LocationItem(props: {\n active: boolean\n documentId: string\n documentType: string\n node: DocumentLocation\n toolName: string\n}) {\n const {documentId, documentType, node, active, toolName} = props\n const presentation = useContext(PresentationContext)\n const currentPresentationToolName = useCurrentPresentationToolName()\n const isCurrentTool = toolName === currentPresentationToolName\n const navigate = presentation?.navigate\n\n const presentationLinkProps = useIntentLink({\n intent: 'edit',\n params: {\n id: documentId,\n type: documentType,\n mode: 'presentation',\n presentation: toolName,\n ...presentation?.structureParams,\n preview: node.href,\n },\n })\n\n const handleCurrentToolClick = useCallback(() => {\n navigate?.({}, {preview: node.href})\n }, [node.href, navigate])\n\n return (\n <Card\n {...(isCurrentTool ? {} : presentationLinkProps)}\n as=\"a\"\n key={node.href}\n onClick={isCurrentTool ? handleCurrentToolClick : presentationLinkProps.onClick}\n padding={3}\n radius={1}\n pressed={active}\n tone=\"inherit\"\n >\n <Flex gap={3}>\n <Box flex=\"none\">\n <Text size={1}>\n <DesktopIcon />\n </Text>\n </Box>\n <Stack flex={1} space={2}>\n <Text size={1} weight=\"medium\">\n {node.title}\n </Text>\n <Text muted size={1} textOverflow=\"ellipsis\">\n {node.href}\n </Text>\n </Stack>\n </Flex>\n </Card>\n )\n}\n","import {rem, Stack} from '@sanity/ui'\nimport {type ReactNode, useContext} from 'react'\nimport {type ObjectSchemaType, type PublishedId} from 'sanity'\nimport {PresentationDocumentContext} from 'sanity/_singletons'\nimport {styled} from 'styled-components'\n\nimport {type PresentationPluginOptions} from '../types'\nimport {useDocumentLocations} from '../useDocumentLocations'\nimport {LocationsBanner} from './LocationsBanner'\n\nconst LocationStack = styled(Stack)`\n min-height: ${rem(42)};\n\n & + &:empty {\n display: none;\n }\n`\n\nexport function PresentationDocumentHeader(props: {\n documentId: PublishedId\n options: PresentationPluginOptions\n schemaType: ObjectSchemaType\n}): ReactNode {\n const {documentId, options, schemaType} = props\n\n const context = useContext(PresentationDocumentContext)\n const {state, status} = useDocumentLocations({\n id: documentId,\n resolvers: options.resolve?.locations || options.locate,\n type: schemaType.name,\n })\n\n if ((context && context.options[0] !== options) || status === 'empty') {\n return null\n }\n\n const contextOptions = context?.options || []\n\n return (\n <LocationStack marginBottom={5} space={5}>\n <Stack space={2}>\n {contextOptions.map(\n (\n // eslint-disable-next-line @typescript-eslint/no-shadow\n options,\n idx,\n ) => (\n <LocationsBanner\n documentId={documentId}\n isResolving={status === 'resolving'}\n key={idx}\n options={options}\n schemaType={schemaType}\n showPresentationTitle={contextOptions.length > 1}\n state={state}\n />\n ),\n )}\n </Stack>\n </LocationStack>\n )\n}\n","import {type ReactNode, useCallback, useContext, useLayoutEffect, useMemo, useState} from 'react'\nimport {PresentationDocumentContext} from 'sanity/_singletons'\nimport {useEffectEvent} from 'use-effect-event'\n\nimport {type PresentationPluginOptions} from '../types'\nimport {type PresentationDocumentContextValue} from './types'\n\n/** @internal */\nexport function PresentationDocumentProvider(props: {\n children?: ReactNode\n options: PresentationPluginOptions\n}): React.JSX.Element {\n const {children, options} = props\n const parent = useContext(PresentationDocumentContext)\n const parentRegister = parent?.register\n\n const [optionsArray, setOptionsArray] = useState<PresentationPluginOptions[]>(() => [])\n\n const register = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-shadow\n (options: PresentationPluginOptions) => {\n if (parentRegister) {\n return parentRegister(options)\n }\n\n setOptionsArray((prev) => [options].concat(prev))\n\n return () => {\n setOptionsArray((prev) => prev.filter((o) => o !== options))\n }\n },\n [parentRegister],\n )\n\n const context: PresentationDocumentContextValue = useMemo(\n () => ({\n options: parent?.options || optionsArray,\n register,\n }),\n [optionsArray, parent, register],\n )\n\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const registerEffectEvent = useEffectEvent((options: PresentationPluginOptions) =>\n register(options),\n )\n useLayoutEffect(() => registerEffectEvent(options), [registerEffectEvent, options])\n\n return (\n <PresentationDocumentContext.Provider value={context}>\n {children}\n </PresentationDocumentContext.Provider>\n )\n}\n","import {MasterDetailIcon} from '@sanity/icons'\nimport {useContext, useMemo} from 'react'\nimport {\n defineDocumentFieldAction,\n type DocumentFieldActionGroup,\n type DocumentFieldActionItem,\n type DocumentFieldActionProps,\n isRecord,\n pathToString,\n type Tool,\n useWorkspace,\n} from 'sanity'\nimport {PresentationContext} from 'sanity/_singletons'\nimport {useRouter} from 'sanity/router'\n\nimport {DEFAULT_TOOL_NAME} from '../constants'\n\nfunction useOpenInStructureAction(\n props: DocumentFieldActionProps,\n): DocumentFieldActionItem | DocumentFieldActionGroup {\n const {documentId, documentType, path} = props\n const workspace = useWorkspace()\n const {navigateIntent} = useRouter()\n const presentation = useContext(PresentationContext)\n\n const defaultStructureTool = useMemo(\n () =>\n findStructureTool(\n workspace.tools,\n documentId,\n documentType,\n presentation?.name || DEFAULT_TOOL_NAME,\n ),\n [documentId, documentType, workspace.tools, presentation],\n )\n\n return {\n type: 'action',\n hidden: !presentation || path.length > 0 || !defaultStructureTool,\n icon: defaultStructureTool?.icon || MasterDetailIcon,\n title: `Open in ${defaultStructureTool?.title || 'Structure'}`,\n onAction() {\n navigateIntent('edit', {\n id: documentId,\n type: documentType,\n mode: 'structure',\n path: pathToString(path),\n })\n },\n renderAsButton: true,\n }\n}\n\nexport const openInStructure = defineDocumentFieldAction({\n name: 'presentation/openInStructure',\n useAction: useOpenInStructureAction,\n})\n\nfunction findStructureTool(\n tools: Tool[],\n documentId: string,\n documentType: string,\n presentationToolName?: string,\n): Tool | undefined {\n const results = tools\n .filter((t) => t.name !== presentationToolName)\n .map((t) => {\n const match = t.canHandleIntent?.(\n 'edit',\n {\n id: documentId,\n type: documentType,\n mode: 'structure',\n },\n {},\n )\n\n return {tool: t, match}\n })\n\n const modeMatches = results.filter((t) => isRecord(t.match) && t.match.mode)\n\n if (modeMatches.length > 0) {\n return modeMatches[0].tool\n }\n\n const matches = results.filter((t) => t.match)\n\n return matches[0]?.tool\n}\n","import {uuid} from '@sanity/uuid'\nimport {getPublishedId} from 'sanity'\nimport {encodeJsonParams, type RouterState, type SearchParam} from 'sanity/router'\n\nimport {type PresentationSearchParams, type PresentationStateParams} from './types'\n\nconst preservedSearchParamKeys: Array<keyof PresentationSearchParams> = [\n 'preview',\n 'perspective',\n 'viewport',\n]\n\n/**\n * @internal\n */\nexport function getIntentState(\n intent: string,\n params: Record<string, string>,\n routerState: RouterState | undefined,\n payload: unknown,\n):\n | (PresentationStateParams & {_searchParams: SearchParam[]})\n | {intent: string; params: Record<string, string>; payload: unknown} {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {id, mode, path, presentation, type, ...searchParams} = params\n\n const preservedSearchParams = (routerState?._searchParams || [])\n // @todo Casting https://github.com/microsoft/TypeScript/issues/14520\n .filter(([key]) => preservedSearchParamKeys.includes(key as keyof PresentationSearchParams))\n .reduce((acc, [key, value]) => ({...acc, [key]: value}), {} as Record<string, string>)\n\n const _searchParams = {\n ...preservedSearchParams,\n ...searchParams,\n }\n\n if (intent === 'edit' && id) {\n _searchParams.preview =\n _searchParams.preview || new URLSearchParams(window.location.search).get('preview') || '/'\n return {\n type: type || '*',\n id: getPublishedId(id),\n path,\n _searchParams: Object.entries(_searchParams),\n }\n }\n\n if (intent === 'create') {\n _searchParams.preview =\n _searchParams.preview || new URLSearchParams(window.location.search).get('preview') || '/'\n\n if (payload && typeof payload === 'object') {\n _searchParams.templateParams = encodeJsonParams(payload as Record<string, unknown>)\n }\n\n return {\n type: type || '*',\n id: id || uuid(),\n _searchParams: Object.entries(_searchParams),\n }\n }\n return {intent, params, payload}\n}\n","import {Flex, Spinner} from '@sanity/ui'\n\nexport function PresentationSpinner(): React.JSX.Element {\n return (\n <Flex align=\"center\" direction=\"column\" height=\"fill\" justify=\"center\" style={{width: '100%'}}>\n <Spinner />\n </Flex>\n )\n}\n","import {route} from 'sanity/router'\n\n// eslint-disable-next-line camelcase\nexport const router = route.create('/', {__unsafe_disableScopedSearchParams: true}, [\n route.intents('/intent'),\n route.create(':type', [route.create(':id', [route.create(':path')])]),\n])\n","import {type SanityDocument} from '@sanity/client'\nimport {lazy, Suspense} from 'react'\nimport {definePlugin, getPublishedId, type InputProps, isDocumentSchemaType} from 'sanity'\n\nimport {DEFAULT_TOOL_ICON, DEFAULT_TOOL_NAME, EDIT_INTENT_MODE} from './constants'\nimport {PresentationDocumentHeader} from './document/PresentationDocumentHeader'\nimport {PresentationDocumentProvider} from './document/PresentationDocumentProvider'\nimport {openInStructure} from './fieldActions/openInStructure'\nimport {getIntentState} from './getIntentState'\nimport {presentationUsEnglishLocaleBundle} from './i18n'\nimport {PresentationSpinner} from './PresentationSpinner'\nimport {router} from './router'\nimport {\n type DocumentLocationResolverObject,\n type DocumentLocationsState,\n type DocumentResolver,\n type PresentationPluginOptions,\n} from './types'\n\nconst PresentationTool = lazy(() => import('./PresentationToolGrantsCheck'))\nconst BroadcastDisplayedDocument = lazy(() => import('./loader/BroadcastDisplayedDocument'))\n\n/**\n * Define locations for a given document type.\n * This function doesn't do anything itself, it is used to provide type information.\n * @param resolver - resolver that return locations for a document.\n * @public\n */\nexport function defineLocations<K extends string>(\n resolver: DocumentLocationResolverObject<K> | DocumentLocationsState,\n): typeof resolver {\n return resolver\n}\n\n/**\n * Define documents for a given location.\n * This function doesn't do anything itself, it is used to provide type information.\n * @param resolvers - resolvers that return documents.\n * @public\n */\nexport function defineDocuments(resolvers: DocumentResolver[]): typeof resolvers {\n return resolvers\n}\n\n/** @public */\nexport const presentationTool = definePlugin<PresentationPluginOptions>((options) => {\n const toolName = options.name || DEFAULT_TOOL_NAME\n\n if ('locate' in options) {\n // eslint-disable-next-line no-console\n console.warn('Presentation’s `locate` option is deprecated. Use `resolve.locations` instead.')\n }\n\n const hasLocationsResolver = !!(options.resolve?.locations || options.locate)\n\n function PresentationDocumentInput(props: InputProps) {\n const value = props.value as SanityDocument\n const documentId = value?._id ? getPublishedId(value?._id) : undefined\n\n if (isDocumentSchemaType(props.schemaType)) {\n return (\n <PresentationDocumentProvider options={options}>\n {hasLocationsResolver && documentId && (\n <PresentationDocumentHeader\n documentId={documentId}\n options={options}\n schemaType={props.schemaType}\n />\n )}\n <Suspense fallback={<PresentationSpinner />}>{props.renderDefault(props)}</Suspense>\n <Suspense key=\"broadcast-displayed-document\">\n <BroadcastDisplayedDocument key={documentId} value={value} />\n </Suspense>\n </PresentationDocumentProvider>\n )\n }\n\n return props.renderDefault(props)\n }\n\n function canHandleCreateIntent(params: Record<string, unknown>) {\n // We can't handle create intents without a `type` parameter\n if (!('type' in params)) {\n return false\n }\n\n if ('presentation' in params && params.presentation !== toolName) {\n return false\n }\n\n return 'template' in params ? {template: true} : true\n }\n\n function canHandleEditIntent(params: Record<string, unknown>) {\n // We can't handle edit intents without `type` or `id` parameters\n if (!('type' in params) || !('id' in params)) {\n return false\n }\n\n if ('presentation' in params && params.presentation !== toolName) {\n return false\n }\n\n return 'mode' in params ? {mode: params.mode === EDIT_INTENT_MODE} : true\n }\n\n return {\n i18n: {\n bundles: [presentationUsEnglishLocaleBundle],\n },\n document: {\n unstable_fieldActions: (prev) => {\n return [\n ...prev.filter((a) => a.name !== openInStructure.name), // prevent duplication\n openInStructure,\n ]\n },\n },\n\n form: {\n components: {\n input: PresentationDocumentInput,\n },\n },\n\n tools: [\n {\n icon: options.icon || DEFAULT_TOOL_ICON,\n name: toolName,\n title: options.title,\n component: PresentationTool,\n options,\n canHandleIntent(intent, params) {\n if (intent === 'create') return canHandleCreateIntent(params)\n if (intent === 'edit') return canHandleEditIntent(params)\n return false\n },\n getIntentState,\n router,\n __internalApplicationType: 'sanity/presentation',\n },\n ],\n }\n})\n","import {type Dispatch, type Reducer} from 'react'\nimport {boolean, fallback, object, parse, picklist} from 'valibot'\n\n/** @public */\nexport interface PresentationState {\n mainDocument: boolean\n iframe: {\n status: 'loading' | 'loaded' | 'refreshing' | 'reloading'\n }\n visualEditing: {\n overlaysEnabled: boolean\n }\n}\n\n/** @public */\nexport const ACTION_IFRAME_LOADED = 'ACTION_IFRAME_LOADED'\n/** @public */\nexport const ACTION_IFRAME_REFRESH = 'ACTION_IFRAME_REFRESH'\n/** @public */\nexport const ACTION_IFRAME_RELOAD = 'ACTION_IFRAME_RELOAD'\n/** @public */\nexport const ACTION_VISUAL_EDITING_OVERLAYS_TOGGLE = 'ACTION_VISUAL_EDITING_OVERLAYS_TOGGLE'\n\n/** @public */\nexport interface IframeLoadedAction {\n type: typeof ACTION_IFRAME_LOADED\n}\n/** @public */\nexport interface IframeRefreshAction {\n type: typeof ACTION_IFRAME_REFRESH\n}\n/** @public */\nexport interface IframeReloadAction {\n type: typeof ACTION_IFRAME_RELOAD\n}\n/** @public */\nexport interface VisualEditingOverlaysToggleAction {\n type: typeof ACTION_VISUAL_EDITING_OVERLAYS_TOGGLE\n enabled: boolean\n}\n\n/** @public */\nexport type PresentationAction =\n | IframeLoadedAction\n | IframeRefreshAction\n | IframeReloadAction\n | VisualEditingOverlaysToggleAction\n\nexport const presentationReducer: Reducer<\n Readonly<PresentationState>,\n Readonly<PresentationAction>\n> = (state, action) => {\n switch (action.type) {\n case ACTION_IFRAME_LOADED:\n return state.iframe.status === 'loaded'\n ? state\n : {\n ...state,\n iframe: {\n ...state.iframe,\n status: 'loaded',\n },\n }\n case ACTION_IFRAME_REFRESH:\n return state.iframe.status === 'refreshing'\n ? state\n : {\n ...state,\n iframe: {\n ...state.iframe,\n status: 'refreshing',\n },\n }\n case ACTION_IFRAME_RELOAD:\n return state.iframe.status === 'reloading'\n ? state\n : {\n ...state,\n iframe: {\n ...state.iframe,\n status: 'reloading',\n },\n }\n case ACTION_VISUAL_EDITING_OVERLAYS_TOGGLE:\n return toggleVisualEditingOverlays(state, action)\n default:\n return state\n }\n}\n\nconst toggleVisualEditingOverlays: Reducer<\n Readonly<PresentationState>,\n Readonly<VisualEditingOverlaysToggleAction>\n> = (state, action) => {\n if (state.visualEditing.overlaysEnabled === action.enabled) return state\n return {\n ...state,\n visualEditing: {\n ...state.visualEditing,\n overlaysEnabled: action.enabled,\n },\n }\n}\n\nconst mainDocumentSchema = fallback(boolean(), false)\n\nconst iframeStatusSchema = picklist(['loading', 'loaded', 'refreshing', 'reloading'])\n\nconst initStateSchema = object({\n mainDocument: mainDocumentSchema,\n iframe: object({\n status: iframeStatusSchema,\n }),\n visualEditing: object({overlaysEnabled: boolean()}),\n})\n\nconst INITIAL_PRESENTATION_STATE = {\n mainDocument: false,\n iframe: {\n status: 'loading',\n },\n visualEditing: {\n overlaysEnabled: false,\n },\n} as const satisfies PresentationState\n\nexport function presentationReducerInit(\n state: Readonly<Partial<PresentationState>>,\n): Readonly<PresentationState> {\n return parse(initStateSchema, {...INITIAL_PRESENTATION_STATE, ...state})\n}\n\n/** @public */\nexport type DispatchPresentationAction = Dispatch<Readonly<PresentationAction>>\n","import {useContext} from 'react'\nimport {PresentationNavigateContext} from 'sanity/_singletons'\n\nimport {type PresentationNavigateContextValue} from './types'\n\n/** @public */\nexport function usePresentationNavigate(): PresentationNavigateContextValue {\n const navigate = useContext(PresentationNavigateContext)\n\n if (!navigate) {\n throw new Error('Presentation navigate context is missing')\n }\n\n return navigate\n}\n\nexport type {PresentationNavigateContextValue}\n","import {useContext} from 'react'\nimport {PresentationParamsContext} from 'sanity/_singletons'\n\nimport {type PresentationParamsContextValue} from './types'\n\n/** @public */\nexport function usePresentationParams(throwOnMissingContext?: true): PresentationParamsContextValue\n/** @public */\nexport function usePresentationParams(\n throwOnMissingContext: false,\n): PresentationParamsContextValue | null\n/** @public */\nexport function usePresentationParams(\n throwOnMissingContext = true,\n): PresentationParamsContextValue | null {\n const params = useContext(PresentationParamsContext)\n\n if (throwOnMissingContext && !params) {\n throw new Error('Presentation params context is missing')\n }\n\n return params\n}\n"],"names":["useSharedState","key","value","$","_c","context","useContext","PresentationSharedStateContext","Error","setValue","t0","t1","useEffect","DEFAULT_TOOL_ICON","ComposeIcon","DEFAULT_TOOL_NAME","DEFAULT_TOOL_TITLE","EDIT_INTENT_MODE","MAX_TIME_TO_OVERLAYS_CONNECTION","API_VERSION","MIN_LOADER_QUERY_LISTEN_HEARTBEAT_INTERVAL","LIVE_QUERY_CACHE_BATCH_SIZE","LIVE_QUERY_CACHE_SIZE","POPUP_CHECK_INTERVAL","keysOf","Object","keys","setKey","source","props","options","Observable","observer","subscribe","pipe","switchMap","object","keyObservables","map","isObservable","from","val","of","wait","combineLatest","pairs","reduce","acc","mergeAll","scan","INITIAL_STATE","locations","getDocumentId","isReference","_ref","_id","undefined","cleanPreviewable","id","previewable","clean","_type","_weak","_dataset","_projectId","_strengthenOnPublish","listen","fields","store","query","fetch","join","params","draftId","getDraftId","listenQuery","perspective","observeDocument","paths","currentValue","headlessPaths","filter","path","length","Set","snapshot","leads","forEach","head","tail","push","next","res","tails","isRecord","observeForLocations","documentId","resolver","documentStore","select","values","String","split","doc","get","resolve","useDocumentLocations","resolvers","type","useDocumentStore","locationsState","setLocationsState","useState","locationsStatus","setLocationsStatus","bb0","_result","result","t2","sub","state","unsubscribe","t3","status","presentationLocaleNamespace","presentationUsEnglishLocaleBundle","defineLocaleResourceBundle","locale","namespace","resources","usePresentationTool","throwOnMissingContext","presentation","PresentationContext","useCurrentPresentationToolName","name","TONE_ICONS","positive","InfoOutlineIcon","caution","WarningOutlineIcon","critical","ErrorOutlineIcon","LocationsBanner","isResolving","schemaType","showPresentationTitle","message","tone","len","t","useTranslation","presentationName","expanded","setExpanded","_temp","toggle","count","title","ToneIcon","Symbol","for","margin","t4","transform","transition","l","index","href","preview","t5","t6","v","LocationItem","documentType","node","active","toolName","currentPresentationToolName","isCurrentTool","navigate","structureParams","intent","mode","presentationLinkProps","useIntentLink","handleCurrentToolClick","onClick","t7","t8","t9","LocationStack","styled","Stack","rem","PresentationDocumentHeader","PresentationDocumentContext","locate","contextOptions","options_0","idx","PresentationDocumentProvider","children","parent","parentRegister","register","optionsArray","setOptionsArray","prev","concat","prev_0","o","options_1","registerEffectEvent","useEffectEvent","useLayoutEffect","useOpenInStructureAction","workspace","useWorkspace","navigateIntent","useRouter","tools","findStructureTool","defaultStructureTool","icon","MasterDetailIcon","hidden","onAction","pathToString","renderAsButton","openInStructure","defineDocumentFieldAction","useAction","presentationToolName","results","match","canHandleIntent","tool","modeMatches","preservedSearchParamKeys","getIntentState","routerState","payload","searchParams","_searchParams","includes","URLSearchParams","window","location","search","getPublishedId","entries","templateParams","encodeJsonParams","uuid","PresentationSpinner","width","router","route","create","__unsafe_disableScopedSearchParams","intents","PresentationTool","lazy","BroadcastDisplayedDocument","defineLocations","defineDocuments","presentationTool","definePlugin","console","warn","hasLocationsResolver","PresentationDocumentInput","isDocumentSchemaType","renderDefault","canHandleCreateIntent","template","canHandleEditIntent","i18n","bundles","document","unstable_fieldActions","a","form","components","input","component","__internalApplicationType","ACTION_IFRAME_LOADED","ACTION_IFRAME_REFRESH","ACTION_IFRAME_RELOAD","ACTION_VISUAL_EDITING_OVERLAYS_TOGGLE","presentationReducer","action","iframe","toggleVisualEditingOverlays","visualEditing","overlaysEnabled","enabled","mainDocumentSchema","fallback","boolean","iframeStatusSchema","picklist","initStateSchema","mainDocument","INITIAL_PRESENTATION_STATE","presentationReducerInit","parse","usePresentationNavigate","PresentationNavigateContext","usePresentationParams","PresentationParamsContext"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"presentation.mjs","sources":["../../src/presentation/overlays/useSharedState.ts","../../src/presentation/constants.ts","../../src/presentation/util/props.ts","../../src/presentation/useDocumentLocations.ts","../../src/presentation/i18n/index.ts","../../src/presentation/usePresentationTool.ts","../../src/presentation/document/useCurrentPresentationToolName.ts","../../src/presentation/document/LocationsBanner.tsx","../../src/presentation/document/PresentationDocumentHeader.tsx","../../src/presentation/document/PresentationDocumentProvider.tsx","../../src/presentation/fieldActions/openInStructure.ts","../../src/presentation/getIntentState.ts","../../src/presentation/PresentationSpinner.tsx","../../src/presentation/router.ts","../../src/presentation/plugin.tsx","../../src/presentation/reducers/presentationReducer.ts","../../src/presentation/usePresentationNavigate.ts","../../src/presentation/usePresentationParams.ts"],"sourcesContent":["import {type Serializable} from '@sanity/presentation-comlink'\nimport {useContext, useEffect} from 'react'\nimport {PresentationSharedStateContext} from 'sanity/_singletons'\n\n/** @public */\nexport const useSharedState = (key: string, value: Serializable): undefined => {\n const context = useContext(PresentationSharedStateContext)\n\n if (!context) {\n throw new Error('Preview Snapshots context is missing')\n }\n\n const {setValue} = context\n\n useEffect(() => {\n setValue(key, value)\n }, [key, value, setValue])\n\n return undefined\n}\n","import {ComposeIcon} from '@sanity/icons'\nimport {apiVersion} from '@sanity/preview-url-secret/constants'\n\nexport const DEFAULT_TOOL_ICON = ComposeIcon\nexport const DEFAULT_TOOL_NAME = 'presentation'\nexport const DEFAULT_TOOL_TITLE = 'Presentation'\n\nexport const EDIT_INTENT_MODE = 'presentation'\n\n// How long we wait until an iframe is loaded until we consider it to be slow and possibly failed\nexport const MAX_TIME_TO_OVERLAYS_CONNECTION = 3_000 // ms\n\n// The API version to use when using `@sanity/client`\nexport const API_VERSION = apiVersion\n\n// Heartbeats shouldn't fire on intervals that are so short it causes performance issues\nexport const MIN_LOADER_QUERY_LISTEN_HEARTBEAT_INTERVAL = 1000 // ms\n\n// How often the list over loader queries should be garbage collected\nexport const LOADER_QUERY_GC_INTERVAL = 30_000 // ms\n\n// The interval at which we check if existing popups have been closed\nexport const POPUP_CHECK_INTERVAL = 1000 // ms\n","import {\n combineLatest,\n from,\n isObservable,\n map,\n mergeAll,\n Observable,\n of,\n scan,\n switchMap,\n} from 'rxjs'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Props<K extends keyof any, T> = {\n [P in K]: T | Observable<T>\n}\n\nfunction keysOf<T extends object>(value: T) {\n return Object.keys(value) as (keyof T)[]\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction setKey(source: Record<string, unknown>, key: any, value: unknown) {\n return {\n ...source,\n [key]: value,\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function props<K extends keyof any, T>(options: {wait?: boolean} = {}) {\n return (source: Observable<Props<K, T>>): Observable<Record<string, unknown>> => {\n return new Observable<Props<K, T>>((observer) => source.subscribe(observer)).pipe(\n switchMap((object) => {\n const keyObservables = keysOf(object).map((key) => {\n const value = object[key]\n return isObservable(value) ? from(value).pipe(map((val) => [key, val])) : of([key, value])\n })\n\n return options.wait\n ? combineLatest(keyObservables).pipe(\n map((pairs) => pairs.reduce((acc, [key, value]) => setKey(acc, key, value), {})),\n )\n : from(keyObservables).pipe(\n mergeAll(),\n scan((acc, [key, value]) => setKey(acc, key, value), {}),\n )\n }),\n )\n }\n}\n","/* eslint-disable @typescript-eslint/no-shadow */\nimport {get} from 'lodash'\nimport {useEffect, useMemo, useState} from 'react'\nimport {isObservable, map, type Observable, of, switchMap} from 'rxjs'\nimport {\n type DocumentStore,\n getDraftId,\n isRecord,\n isReference,\n type Previewable,\n type SanityDocument,\n useDocumentStore,\n} from 'sanity'\n\nimport {\n type DocumentLocationResolver,\n type DocumentLocationResolverObject,\n type DocumentLocationResolvers,\n type DocumentLocationsState,\n type DocumentLocationsStatus,\n} from './types'\nimport {props} from './util/props'\n\nconst INITIAL_STATE: DocumentLocationsState = {locations: []}\n\nfunction getDocumentId(value: Previewable) {\n if (isReference(value)) {\n return value._ref\n }\n return '_id' in value ? value._id : undefined\n}\n\nfunction cleanPreviewable(id: string | undefined, previewable: Previewable) {\n const clean: Record<string, unknown> = id ? {...previewable, _id: id} : {...previewable}\n\n if (clean._type === 'reference') {\n delete clean._type\n delete clean._ref\n delete clean._weak\n delete clean._dataset\n delete clean._projectId\n delete clean._strengthenOnPublish\n }\n\n return clean\n}\n\nfunction listen(id: string, fields: string[], store: DocumentStore) {\n const projection = fields.join(', ')\n const query = {\n fetch: `*[_id==$id][0]{${projection}}`,\n // TODO: is it more performant to use `||` instead of `in`?\n listen: `*[_id in [$id,$draftId]]`,\n }\n const params = {id, draftId: getDraftId(id)}\n return store.listenQuery(query, params, {\n perspective: 'previewDrafts',\n }) as Observable<SanityDocument | null>\n}\n\nfunction observeDocument(\n value: Previewable | null,\n paths: string[][],\n store: DocumentStore,\n): Observable<Record<string, unknown> | null> {\n if (!value || typeof value !== 'object') {\n return of(value)\n }\n\n const id = getDocumentId(value)\n const currentValue = cleanPreviewable(id, value)\n\n const headlessPaths = paths.filter((path) => !(path[0] in currentValue))\n\n if (id && headlessPaths.length) {\n const fields = [...new Set(headlessPaths.map((path: string[]) => path[0]))]\n return listen(id, fields, store).pipe(\n switchMap((snapshot) => {\n if (snapshot) {\n return observeDocument(snapshot, paths, store)\n }\n return of(null)\n }),\n )\n }\n\n const leads: Record<string, string[][]> = {}\n paths.forEach((path) => {\n const [head, ...tail] = path\n if (!leads[head]) {\n leads[head] = []\n }\n leads[head].push(tail)\n })\n const next = Object.keys(leads).reduce((res: Record<string, unknown>, head) => {\n const tails = leads[head].filter((tail) => tail.length > 0)\n if (tails.length === 0) {\n res[head] = isRecord(value) ? (value as Record<string, unknown>)[head] : undefined\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n res[head] = observeDocument((value as any)[head], tails, store)\n }\n return res\n }, currentValue)\n\n return of(next).pipe(props({wait: true}))\n}\n\nfunction observeForLocations(\n documentId: string,\n resolver: DocumentLocationResolverObject<string>,\n documentStore: DocumentStore,\n) {\n const {select} = resolver\n const paths = Object.values(select).map((value) => String(value).split('.')) || []\n const doc = {_type: 'reference', _ref: documentId}\n return observeDocument(doc, paths, documentStore).pipe(\n map((doc) => {\n return Object.keys(select).reduce<Record<string, unknown>>((acc, key) => {\n acc[key] = get(doc, select[key])\n return acc\n }, {})\n }),\n map(resolver.resolve),\n )\n}\n\nexport function useDocumentLocations(props: {\n id: string\n resolvers?: DocumentLocationResolver | DocumentLocationResolvers\n type: string\n}): {\n state: DocumentLocationsState\n status: DocumentLocationsStatus\n} {\n const {id, resolvers, type} = props\n const documentStore = useDocumentStore()\n const [locationsState, setLocationsState] = useState<DocumentLocationsState>(INITIAL_STATE)\n\n const resolver = resolvers && (typeof resolvers === 'function' ? resolvers : resolvers[type])\n\n const [locationsStatus, setLocationsStatus] = useState<DocumentLocationsStatus>(\n resolver ? 'resolving' : 'empty',\n )\n\n const result = useMemo(() => {\n if (!resolver) return undefined\n\n // Original/advanced resolver which requires explicit use of Observables\n if (typeof resolver === 'function') {\n const params = {id, type}\n const context = {documentStore}\n const _result = resolver(params, context)\n return isObservable(_result) ? _result : of(_result)\n }\n\n // Simplified resolver pattern which abstracts away Observable logic\n if ('select' in resolver && 'resolve' in resolver) {\n return observeForLocations(id, resolver, documentStore)\n }\n\n // Resolver is explicitly provided state\n return of(resolver)\n }, [documentStore, id, resolver, type])\n\n useEffect(() => {\n const sub = result?.subscribe((state) => {\n setLocationsState(state || INITIAL_STATE)\n setLocationsStatus(state ? 'resolved' : 'empty')\n })\n\n return () => sub?.unsubscribe()\n }, [result])\n\n return {\n state: locationsState,\n status: locationsStatus,\n }\n}\n","import {defineLocaleResourceBundle} from 'sanity'\n\n/**\n * The locale namespace for the presentation tool\n *\n * @public\n */\nexport const presentationLocaleNamespace = 'presentation' as const\n\n/**\n * The default locale bundle for the presentation tool, which is US English.\n *\n * @internal\n */\nexport const presentationUsEnglishLocaleBundle = defineLocaleResourceBundle({\n locale: 'en-US',\n namespace: presentationLocaleNamespace,\n resources: () => import('./resources'),\n})\n","import {useContext} from 'react'\nimport {PresentationContext} from 'sanity/_singletons'\n\nimport {type PresentationContextValue} from './types'\n\nexport function usePresentationTool(throwOnMissingContext?: true): PresentationContextValue\nexport function usePresentationTool(throwOnMissingContext: false): PresentationContextValue | null\nexport function usePresentationTool(throwOnMissingContext = true): PresentationContextValue | null {\n const presentation = useContext(PresentationContext)\n\n if (throwOnMissingContext && !presentation) {\n throw new Error('Presentation context is missing')\n }\n\n return presentation\n}\n","import {usePresentationTool} from '../usePresentationTool'\n\nexport function useCurrentPresentationToolName(): string | undefined {\n return usePresentationTool(false)?.name ?? undefined\n}\n","import {\n ChevronRightIcon,\n DesktopIcon,\n ErrorOutlineIcon,\n InfoOutlineIcon,\n WarningOutlineIcon,\n} from '@sanity/icons'\nimport {Box, Card, Flex, Spinner, Stack, Text} from '@sanity/ui'\nimport {type ComponentType, type ReactNode, useCallback, useContext, useState} from 'react'\nimport {type ObjectSchemaType, useTranslation} from 'sanity'\nimport {PresentationContext} from 'sanity/_singletons'\nimport {useIntentLink} from 'sanity/router'\n\nimport {DEFAULT_TOOL_NAME, DEFAULT_TOOL_TITLE} from '../constants'\nimport {presentationLocaleNamespace} from '../i18n'\nimport {\n type DocumentLocation,\n type DocumentLocationsState,\n type PresentationPluginOptions,\n} from '../types'\nimport {useCurrentPresentationToolName} from './useCurrentPresentationToolName'\n\nconst TONE_ICONS: Record<'positive' | 'caution' | 'critical', ComponentType> = {\n positive: InfoOutlineIcon,\n caution: WarningOutlineIcon,\n critical: ErrorOutlineIcon,\n}\n\nexport function LocationsBanner(props: {\n documentId: string\n isResolving: boolean\n options: PresentationPluginOptions\n schemaType: ObjectSchemaType\n showPresentationTitle: boolean\n state: DocumentLocationsState\n}): ReactNode {\n const {documentId, isResolving, options, schemaType, showPresentationTitle} = props\n const {locations, message, tone} = props.state\n const len = locations?.length || 0\n\n const {t} = useTranslation(presentationLocaleNamespace)\n const presentation = useContext(PresentationContext)\n const presentationName = presentation?.name\n const [expanded, setExpanded] = useState(false)\n const toggle = useCallback(() => {\n if (!len) return\n setExpanded((v) => !v)\n }, [len])\n\n const title = isResolving\n ? t('locations-banner.resolving.text')\n : message || t('locations-banner.locations-count', {count: len})\n\n const ToneIcon = tone ? TONE_ICONS[tone] : undefined\n\n return (\n <Card padding={1} radius={2} border tone={tone}>\n <div style={{margin: -1}}>\n {!locations && (\n <Flex align=\"flex-start\" gap={3} padding={3}>\n {tone && ToneIcon && (\n <Box flex=\"none\">\n <Text size={1}>\n <ToneIcon />\n </Text>\n </Box>\n )}\n <Box flex={1}>\n <Text size={1} weight=\"medium\">\n {showPresentationTitle && <>{options.title || DEFAULT_TOOL_TITLE} · </>}\n {title}\n </Text>\n </Box>\n </Flex>\n )}\n {locations && (\n <>\n <Card\n as={len ? 'button' : undefined}\n onClick={toggle}\n padding={3}\n radius={1}\n tone=\"inherit\"\n >\n <Flex gap={3}>\n <Box flex=\"none\">\n {isResolving ? (\n <Spinner size={1} />\n ) : (\n <Text size={1}>\n {len === 0 ? (\n <InfoOutlineIcon />\n ) : (\n <ChevronRightIcon\n style={{\n transform: `rotate(${expanded ? '90deg' : 0})`,\n transition: 'transform 100ms ease-in-out',\n }}\n />\n )}\n </Text>\n )}\n </Box>\n <Box flex={1}>\n <Text size={1} weight=\"medium\">\n {showPresentationTitle && <>{options.title || DEFAULT_TOOL_TITLE} · </>}\n {title}\n </Text>\n </Box>\n </Flex>\n </Card>\n <Stack hidden={!expanded} marginTop={1} space={1}>\n {locations.map((l, index) => (\n <LocationItem\n active={\n (options.name || DEFAULT_TOOL_NAME) === presentationName &&\n l.href === presentation?.params.preview\n }\n documentId={documentId}\n documentType={schemaType.name}\n key={index}\n node={l}\n toolName={options.name || DEFAULT_TOOL_NAME}\n />\n ))}\n </Stack>\n </>\n )}\n </div>\n </Card>\n )\n}\n\nfunction LocationItem(props: {\n active: boolean\n documentId: string\n documentType: string\n node: DocumentLocation\n toolName: string\n}) {\n const {documentId, documentType, node, active, toolName} = props\n const presentation = useContext(PresentationContext)\n const currentPresentationToolName = useCurrentPresentationToolName()\n const isCurrentTool = toolName === currentPresentationToolName\n const navigate = presentation?.navigate\n\n const presentationLinkProps = useIntentLink({\n intent: 'edit',\n params: {\n id: documentId,\n type: documentType,\n mode: 'presentation',\n presentation: toolName,\n ...presentation?.structureParams,\n preview: node.href,\n },\n })\n\n const handleCurrentToolClick = useCallback(() => {\n navigate?.({}, {preview: node.href})\n }, [node.href, navigate])\n\n return (\n <Card\n {...(isCurrentTool ? {} : presentationLinkProps)}\n as=\"a\"\n key={node.href}\n onClick={isCurrentTool ? handleCurrentToolClick : presentationLinkProps.onClick}\n padding={3}\n radius={1}\n pressed={active}\n tone=\"inherit\"\n >\n <Flex gap={3}>\n <Box flex=\"none\">\n <Text size={1}>\n <DesktopIcon />\n </Text>\n </Box>\n <Stack flex={1} space={2}>\n <Text size={1} weight=\"medium\">\n {node.title}\n </Text>\n <Text muted size={1} textOverflow=\"ellipsis\">\n {node.href}\n </Text>\n </Stack>\n </Flex>\n </Card>\n )\n}\n","import {rem, Stack} from '@sanity/ui'\nimport {type ReactNode, useContext} from 'react'\nimport {type ObjectSchemaType, type PublishedId} from 'sanity'\nimport {PresentationDocumentContext} from 'sanity/_singletons'\nimport {styled} from 'styled-components'\n\nimport {type PresentationPluginOptions} from '../types'\nimport {useDocumentLocations} from '../useDocumentLocations'\nimport {LocationsBanner} from './LocationsBanner'\n\nconst LocationStack = styled(Stack)`\n min-height: ${rem(42)};\n\n & + &:empty {\n display: none;\n }\n`\n\nexport function PresentationDocumentHeader(props: {\n documentId: PublishedId\n options: PresentationPluginOptions\n schemaType: ObjectSchemaType\n}): ReactNode {\n const {documentId, options, schemaType} = props\n\n const context = useContext(PresentationDocumentContext)\n const {state, status} = useDocumentLocations({\n id: documentId,\n resolvers: options.resolve?.locations || options.locate,\n type: schemaType.name,\n })\n\n if ((context && context.options[0] !== options) || status === 'empty') {\n return null\n }\n\n const contextOptions = context?.options || []\n\n return (\n <LocationStack marginBottom={5} space={5}>\n <Stack space={2}>\n {contextOptions.map(\n (\n // eslint-disable-next-line @typescript-eslint/no-shadow\n options,\n idx,\n ) => (\n <LocationsBanner\n documentId={documentId}\n isResolving={status === 'resolving'}\n key={idx}\n options={options}\n schemaType={schemaType}\n showPresentationTitle={contextOptions.length > 1}\n state={state}\n />\n ),\n )}\n </Stack>\n </LocationStack>\n )\n}\n","import {type ReactNode, useCallback, useContext, useLayoutEffect, useMemo, useState} from 'react'\nimport {PresentationDocumentContext} from 'sanity/_singletons'\nimport {useEffectEvent} from 'use-effect-event'\n\nimport {type PresentationPluginOptions} from '../types'\nimport {type PresentationDocumentContextValue} from './types'\n\n/** @internal */\nexport function PresentationDocumentProvider(props: {\n children?: ReactNode\n options: PresentationPluginOptions\n}): React.JSX.Element {\n const {children, options} = props\n const parent = useContext(PresentationDocumentContext)\n const parentRegister = parent?.register\n\n const [optionsArray, setOptionsArray] = useState<PresentationPluginOptions[]>(() => [])\n\n const register = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-shadow\n (options: PresentationPluginOptions) => {\n if (parentRegister) {\n return parentRegister(options)\n }\n\n setOptionsArray((prev) => [options].concat(prev))\n\n return () => {\n setOptionsArray((prev) => prev.filter((o) => o !== options))\n }\n },\n [parentRegister],\n )\n\n const context: PresentationDocumentContextValue = useMemo(\n () => ({\n options: parent?.options || optionsArray,\n register,\n }),\n [optionsArray, parent, register],\n )\n\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const registerEffectEvent = useEffectEvent((options: PresentationPluginOptions) =>\n register(options),\n )\n useLayoutEffect(() => registerEffectEvent(options), [registerEffectEvent, options])\n\n return (\n <PresentationDocumentContext.Provider value={context}>\n {children}\n </PresentationDocumentContext.Provider>\n )\n}\n","import {MasterDetailIcon} from '@sanity/icons'\nimport {useContext, useMemo} from 'react'\nimport {\n defineDocumentFieldAction,\n type DocumentFieldActionGroup,\n type DocumentFieldActionItem,\n type DocumentFieldActionProps,\n isRecord,\n pathToString,\n type Tool,\n useWorkspace,\n} from 'sanity'\nimport {PresentationContext} from 'sanity/_singletons'\nimport {useRouter} from 'sanity/router'\n\nimport {DEFAULT_TOOL_NAME} from '../constants'\n\nfunction useOpenInStructureAction(\n props: DocumentFieldActionProps,\n): DocumentFieldActionItem | DocumentFieldActionGroup {\n const {documentId, documentType, path} = props\n const workspace = useWorkspace()\n const {navigateIntent} = useRouter()\n const presentation = useContext(PresentationContext)\n\n const defaultStructureTool = useMemo(\n () =>\n findStructureTool(\n workspace.tools,\n documentId,\n documentType,\n presentation?.name || DEFAULT_TOOL_NAME,\n ),\n [documentId, documentType, workspace.tools, presentation],\n )\n\n return {\n type: 'action',\n hidden: !presentation || path.length > 0 || !defaultStructureTool,\n icon: defaultStructureTool?.icon || MasterDetailIcon,\n title: `Open in ${defaultStructureTool?.title || 'Structure'}`,\n onAction() {\n navigateIntent('edit', {\n id: documentId,\n type: documentType,\n mode: 'structure',\n path: pathToString(path),\n })\n },\n renderAsButton: true,\n }\n}\n\nexport const openInStructure = defineDocumentFieldAction({\n name: 'presentation/openInStructure',\n useAction: useOpenInStructureAction,\n})\n\nfunction findStructureTool(\n tools: Tool[],\n documentId: string,\n documentType: string,\n presentationToolName?: string,\n): Tool | undefined {\n const results = tools\n .filter((t) => t.name !== presentationToolName)\n .map((t) => {\n const match = t.canHandleIntent?.(\n 'edit',\n {\n id: documentId,\n type: documentType,\n mode: 'structure',\n },\n {},\n )\n\n return {tool: t, match}\n })\n\n const modeMatches = results.filter((t) => isRecord(t.match) && t.match.mode)\n\n if (modeMatches.length > 0) {\n return modeMatches[0].tool\n }\n\n const matches = results.filter((t) => t.match)\n\n return matches[0]?.tool\n}\n","import {uuid} from '@sanity/uuid'\nimport {getPublishedId} from 'sanity'\nimport {encodeJsonParams, type RouterState, type SearchParam} from 'sanity/router'\n\nimport {type PresentationSearchParams, type PresentationStateParams} from './types'\n\nconst preservedSearchParamKeys: Array<keyof PresentationSearchParams> = [\n 'preview',\n 'perspective',\n 'viewport',\n]\n\n/**\n * @internal\n */\nexport function getIntentState(\n intent: string,\n params: Record<string, string>,\n routerState: RouterState | undefined,\n payload: unknown,\n):\n | (PresentationStateParams & {_searchParams: SearchParam[]})\n | {intent: string; params: Record<string, string>; payload: unknown} {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {id, mode, path, presentation, type, ...searchParams} = params\n\n const preservedSearchParams = (routerState?._searchParams || [])\n // @todo Casting https://github.com/microsoft/TypeScript/issues/14520\n .filter(([key]) => preservedSearchParamKeys.includes(key as keyof PresentationSearchParams))\n .reduce((acc, [key, value]) => ({...acc, [key]: value}), {} as Record<string, string>)\n\n const _searchParams = {\n ...preservedSearchParams,\n ...searchParams,\n }\n\n if (intent === 'edit' && id) {\n _searchParams.preview =\n _searchParams.preview || new URLSearchParams(window.location.search).get('preview') || '/'\n return {\n type: type || '*',\n id: getPublishedId(id),\n path,\n _searchParams: Object.entries(_searchParams),\n }\n }\n\n if (intent === 'create') {\n _searchParams.preview =\n _searchParams.preview || new URLSearchParams(window.location.search).get('preview') || '/'\n\n if (payload && typeof payload === 'object') {\n _searchParams.templateParams = encodeJsonParams(payload as Record<string, unknown>)\n }\n\n return {\n type: type || '*',\n id: id || uuid(),\n _searchParams: Object.entries(_searchParams),\n }\n }\n return {intent, params, payload}\n}\n","import {Flex, Spinner} from '@sanity/ui'\n\nexport function PresentationSpinner(): React.JSX.Element {\n return (\n <Flex align=\"center\" direction=\"column\" height=\"fill\" justify=\"center\" style={{width: '100%'}}>\n <Spinner />\n </Flex>\n )\n}\n","import {route} from 'sanity/router'\n\n// eslint-disable-next-line camelcase\nexport const router = route.create('/', {__unsafe_disableScopedSearchParams: true}, [\n route.intents('/intent'),\n route.create(':type', [route.create(':id', [route.create(':path')])]),\n])\n","import {type SanityDocument} from '@sanity/client'\nimport {lazy, Suspense} from 'react'\nimport {definePlugin, getPublishedId, type InputProps, isDocumentSchemaType} from 'sanity'\n\nimport {DEFAULT_TOOL_ICON, DEFAULT_TOOL_NAME, EDIT_INTENT_MODE} from './constants'\nimport {PresentationDocumentHeader} from './document/PresentationDocumentHeader'\nimport {PresentationDocumentProvider} from './document/PresentationDocumentProvider'\nimport {openInStructure} from './fieldActions/openInStructure'\nimport {getIntentState} from './getIntentState'\nimport {presentationUsEnglishLocaleBundle} from './i18n'\nimport {PresentationSpinner} from './PresentationSpinner'\nimport {router} from './router'\nimport {\n type DocumentLocationResolverObject,\n type DocumentLocationsState,\n type DocumentResolver,\n type PresentationPluginOptions,\n} from './types'\n\nconst PresentationTool = lazy(() => import('./PresentationToolGrantsCheck'))\nconst BroadcastDisplayedDocument = lazy(() => import('./loader/BroadcastDisplayedDocument'))\n\n/**\n * Define locations for a given document type.\n * This function doesn't do anything itself, it is used to provide type information.\n * @param resolver - resolver that return locations for a document.\n * @public\n */\nexport function defineLocations<K extends string>(\n resolver: DocumentLocationResolverObject<K> | DocumentLocationsState,\n): typeof resolver {\n return resolver\n}\n\n/**\n * Define documents for a given location.\n * This function doesn't do anything itself, it is used to provide type information.\n * @param resolvers - resolvers that return documents.\n * @public\n */\nexport function defineDocuments(resolvers: DocumentResolver[]): typeof resolvers {\n return resolvers\n}\n\n/** @public */\nexport const presentationTool = definePlugin<PresentationPluginOptions>((options) => {\n const toolName = options.name || DEFAULT_TOOL_NAME\n\n if ('locate' in options) {\n // eslint-disable-next-line no-console\n console.warn('Presentation’s `locate` option is deprecated. Use `resolve.locations` instead.')\n }\n\n const hasLocationsResolver = !!(options.resolve?.locations || options.locate)\n\n function PresentationDocumentInput(props: InputProps) {\n const value = props.value as SanityDocument\n const documentId = value?._id ? getPublishedId(value?._id) : undefined\n\n if (isDocumentSchemaType(props.schemaType)) {\n return (\n <PresentationDocumentProvider options={options}>\n {hasLocationsResolver && documentId && (\n <PresentationDocumentHeader\n documentId={documentId}\n options={options}\n schemaType={props.schemaType}\n />\n )}\n <Suspense fallback={<PresentationSpinner />}>{props.renderDefault(props)}</Suspense>\n <Suspense key=\"broadcast-displayed-document\">\n <BroadcastDisplayedDocument key={documentId} value={value} />\n </Suspense>\n </PresentationDocumentProvider>\n )\n }\n\n return props.renderDefault(props)\n }\n\n function canHandleCreateIntent(params: Record<string, unknown>) {\n // We can't handle create intents without a `type` parameter\n if (!('type' in params)) {\n return false\n }\n\n if ('presentation' in params && params.presentation !== toolName) {\n return false\n }\n\n return 'template' in params ? {template: true} : true\n }\n\n function canHandleEditIntent(params: Record<string, unknown>) {\n // We can't handle edit intents without `type` or `id` parameters\n if (!('type' in params) || !('id' in params)) {\n return false\n }\n\n if ('presentation' in params && params.presentation !== toolName) {\n return false\n }\n\n return 'mode' in params ? {mode: params.mode === EDIT_INTENT_MODE} : true\n }\n\n return {\n i18n: {\n bundles: [presentationUsEnglishLocaleBundle],\n },\n document: {\n unstable_fieldActions: (prev) => {\n return [\n ...prev.filter((a) => a.name !== openInStructure.name), // prevent duplication\n openInStructure,\n ]\n },\n },\n\n form: {\n components: {\n input: PresentationDocumentInput,\n },\n },\n\n tools: [\n {\n icon: options.icon || DEFAULT_TOOL_ICON,\n name: toolName,\n title: options.title,\n component: PresentationTool,\n options,\n canHandleIntent(intent, params) {\n if (intent === 'create') return canHandleCreateIntent(params)\n if (intent === 'edit') return canHandleEditIntent(params)\n return false\n },\n getIntentState,\n router,\n __internalApplicationType: 'sanity/presentation',\n },\n ],\n }\n})\n","import {type Dispatch, type Reducer} from 'react'\nimport {boolean, fallback, object, parse, picklist} from 'valibot'\n\n/** @public */\nexport interface PresentationState {\n mainDocument: boolean\n iframe: {\n status: 'loading' | 'loaded' | 'refreshing' | 'reloading'\n }\n visualEditing: {\n overlaysEnabled: boolean\n }\n}\n\n/** @public */\nexport const ACTION_IFRAME_LOADED = 'ACTION_IFRAME_LOADED'\n/** @public */\nexport const ACTION_IFRAME_REFRESH = 'ACTION_IFRAME_REFRESH'\n/** @public */\nexport const ACTION_IFRAME_RELOAD = 'ACTION_IFRAME_RELOAD'\n/** @public */\nexport const ACTION_VISUAL_EDITING_OVERLAYS_TOGGLE = 'ACTION_VISUAL_EDITING_OVERLAYS_TOGGLE'\n\n/** @public */\nexport interface IframeLoadedAction {\n type: typeof ACTION_IFRAME_LOADED\n}\n/** @public */\nexport interface IframeRefreshAction {\n type: typeof ACTION_IFRAME_REFRESH\n}\n/** @public */\nexport interface IframeReloadAction {\n type: typeof ACTION_IFRAME_RELOAD\n}\n/** @public */\nexport interface VisualEditingOverlaysToggleAction {\n type: typeof ACTION_VISUAL_EDITING_OVERLAYS_TOGGLE\n enabled: boolean\n}\n\n/** @public */\nexport type PresentationAction =\n | IframeLoadedAction\n | IframeRefreshAction\n | IframeReloadAction\n | VisualEditingOverlaysToggleAction\n\nexport const presentationReducer: Reducer<\n Readonly<PresentationState>,\n Readonly<PresentationAction>\n> = (state, action) => {\n switch (action.type) {\n case ACTION_IFRAME_LOADED:\n return state.iframe.status === 'loaded'\n ? state\n : {\n ...state,\n iframe: {\n ...state.iframe,\n status: 'loaded',\n },\n }\n case ACTION_IFRAME_REFRESH:\n return state.iframe.status === 'refreshing'\n ? state\n : {\n ...state,\n iframe: {\n ...state.iframe,\n status: 'refreshing',\n },\n }\n case ACTION_IFRAME_RELOAD:\n return state.iframe.status === 'reloading'\n ? state\n : {\n ...state,\n iframe: {\n ...state.iframe,\n status: 'reloading',\n },\n }\n case ACTION_VISUAL_EDITING_OVERLAYS_TOGGLE:\n return toggleVisualEditingOverlays(state, action)\n default:\n return state\n }\n}\n\nconst toggleVisualEditingOverlays: Reducer<\n Readonly<PresentationState>,\n Readonly<VisualEditingOverlaysToggleAction>\n> = (state, action) => {\n if (state.visualEditing.overlaysEnabled === action.enabled) return state\n return {\n ...state,\n visualEditing: {\n ...state.visualEditing,\n overlaysEnabled: action.enabled,\n },\n }\n}\n\nconst mainDocumentSchema = fallback(boolean(), false)\n\nconst iframeStatusSchema = picklist(['loading', 'loaded', 'refreshing', 'reloading'])\n\nconst initStateSchema = object({\n mainDocument: mainDocumentSchema,\n iframe: object({\n status: iframeStatusSchema,\n }),\n visualEditing: object({overlaysEnabled: boolean()}),\n})\n\nconst INITIAL_PRESENTATION_STATE = {\n mainDocument: false,\n iframe: {\n status: 'loading',\n },\n visualEditing: {\n overlaysEnabled: false,\n },\n} as const satisfies PresentationState\n\nexport function presentationReducerInit(\n state: Readonly<Partial<PresentationState>>,\n): Readonly<PresentationState> {\n return parse(initStateSchema, {...INITIAL_PRESENTATION_STATE, ...state})\n}\n\n/** @public */\nexport type DispatchPresentationAction = Dispatch<Readonly<PresentationAction>>\n","import {useContext} from 'react'\nimport {PresentationNavigateContext} from 'sanity/_singletons'\n\nimport {type PresentationNavigateContextValue} from './types'\n\n/** @public */\nexport function usePresentationNavigate(): PresentationNavigateContextValue {\n const navigate = useContext(PresentationNavigateContext)\n\n if (!navigate) {\n throw new Error('Presentation navigate context is missing')\n }\n\n return navigate\n}\n\nexport type {PresentationNavigateContextValue}\n","import {useContext} from 'react'\nimport {PresentationParamsContext} from 'sanity/_singletons'\n\nimport {type PresentationParamsContextValue} from './types'\n\n/** @public */\nexport function usePresentationParams(throwOnMissingContext?: true): PresentationParamsContextValue\n/** @public */\nexport function usePresentationParams(\n throwOnMissingContext: false,\n): PresentationParamsContextValue | null\n/** @public */\nexport function usePresentationParams(\n throwOnMissingContext = true,\n): PresentationParamsContextValue | null {\n const params = useContext(PresentationParamsContext)\n\n if (throwOnMissingContext && !params) {\n throw new Error('Presentation params context is missing')\n }\n\n return params\n}\n"],"names":["useSharedState","key","value","$","_c","context","useContext","PresentationSharedStateContext","Error","setValue","t0","t1","useEffect","DEFAULT_TOOL_ICON","ComposeIcon","DEFAULT_TOOL_NAME","DEFAULT_TOOL_TITLE","EDIT_INTENT_MODE","MAX_TIME_TO_OVERLAYS_CONNECTION","API_VERSION","apiVersion","MIN_LOADER_QUERY_LISTEN_HEARTBEAT_INTERVAL","LOADER_QUERY_GC_INTERVAL","POPUP_CHECK_INTERVAL","keysOf","Object","keys","setKey","source","props","options","Observable","observer","subscribe","pipe","switchMap","object","keyObservables","map","isObservable","from","val","of","wait","combineLatest","pairs","reduce","acc","mergeAll","scan","INITIAL_STATE","locations","getDocumentId","isReference","_ref","_id","undefined","cleanPreviewable","id","previewable","clean","_type","_weak","_dataset","_projectId","_strengthenOnPublish","listen","fields","store","query","fetch","join","params","draftId","getDraftId","listenQuery","perspective","observeDocument","paths","currentValue","headlessPaths","filter","path","length","Set","snapshot","leads","forEach","head","tail","push","next","res","tails","isRecord","observeForLocations","documentId","resolver","documentStore","select","values","String","split","doc","get","resolve","useDocumentLocations","resolvers","type","useDocumentStore","locationsState","setLocationsState","useState","locationsStatus","setLocationsStatus","bb0","_result","result","t2","sub","state","unsubscribe","t3","status","presentationLocaleNamespace","presentationUsEnglishLocaleBundle","defineLocaleResourceBundle","locale","namespace","resources","usePresentationTool","throwOnMissingContext","presentation","PresentationContext","useCurrentPresentationToolName","name","TONE_ICONS","positive","InfoOutlineIcon","caution","WarningOutlineIcon","critical","ErrorOutlineIcon","LocationsBanner","isResolving","schemaType","showPresentationTitle","message","tone","len","t","useTranslation","presentationName","expanded","setExpanded","_temp","toggle","count","title","ToneIcon","Symbol","for","margin","t4","transform","transition","l","index","href","preview","t5","t6","v","LocationItem","documentType","node","active","toolName","currentPresentationToolName","isCurrentTool","navigate","structureParams","intent","mode","presentationLinkProps","useIntentLink","handleCurrentToolClick","onClick","t7","t8","t9","LocationStack","styled","Stack","rem","PresentationDocumentHeader","PresentationDocumentContext","locate","contextOptions","options_0","idx","PresentationDocumentProvider","children","parent","parentRegister","register","optionsArray","setOptionsArray","prev","concat","prev_0","o","options_1","registerEffectEvent","useEffectEvent","useLayoutEffect","useOpenInStructureAction","workspace","useWorkspace","navigateIntent","useRouter","tools","findStructureTool","defaultStructureTool","icon","MasterDetailIcon","hidden","onAction","pathToString","renderAsButton","openInStructure","defineDocumentFieldAction","useAction","presentationToolName","results","match","canHandleIntent","tool","modeMatches","preservedSearchParamKeys","getIntentState","routerState","payload","searchParams","_searchParams","includes","URLSearchParams","window","location","search","getPublishedId","entries","templateParams","encodeJsonParams","uuid","PresentationSpinner","width","router","route","create","__unsafe_disableScopedSearchParams","intents","PresentationTool","lazy","BroadcastDisplayedDocument","defineLocations","defineDocuments","presentationTool","definePlugin","console","warn","hasLocationsResolver","PresentationDocumentInput","isDocumentSchemaType","renderDefault","canHandleCreateIntent","template","canHandleEditIntent","i18n","bundles","document","unstable_fieldActions","a","form","components","input","component","__internalApplicationType","ACTION_IFRAME_LOADED","ACTION_IFRAME_REFRESH","ACTION_IFRAME_RELOAD","ACTION_VISUAL_EDITING_OVERLAYS_TOGGLE","presentationReducer","action","iframe","toggleVisualEditingOverlays","visualEditing","overlaysEnabled","enabled","mainDocumentSchema","fallback","boolean","iframeStatusSchema","picklist","initStateSchema","mainDocument","INITIAL_PRESENTATION_STATE","presentationReducerInit","parse","usePresentationNavigate","PresentationNavigateContext","usePresentationParams","PresentationParamsContext"],"mappings":";;;;;;;;;;;;;;;AAKaA,MAAAA,iBAAiBA,CAAAC,KAAAC,UAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAC5BC,UAAgBC,WAAAC,8BAAyC;AAAC,MAAA,CAErDF;AAAOG,UAAAA,IAAAA,MACM,sCAAsC;AAGxD,QAAA;AAAA,IAAAC;AAAAA,EAAAA,IAAmBJ;AAAO,MAAAK,IAAAC;AAAAR,IAAAF,CAAAA,MAAAA,OAAAE,SAAAM,YAAAN,EAAA,CAAA,MAAAD,SAEhBQ,KAAAA,MAAA;AACRD,aAASR,KAAKC,KAAK;AAAA,EAAA,GAClBS,KAACV,CAAAA,KAAKC,OAAOO,QAAQ,GAACN,OAAAF,KAAAE,OAAAM,UAAAN,OAAAD,OAAAC,OAAAO,IAAAP,OAAAQ,OAAAD,KAAAP,EAAA,CAAA,GAAAQ,KAAAR,EAAA,CAAA,IAFzBS,UAAUF,IAEPC,EAAsB;AAAC,GCbfE,oBAAoBC,aACpBC,oBAAoB,gBACpBC,qBAAqB,gBAErBC,mBAAmB,gBAGnBC,kCAAkC,KAGlCC,cAAcC,YAGdC,6CAA6C,KAG7CC,2BAA2B,KAG3BC,uBAAuB;ACLpC,SAASC,OAAyBtB,OAAU;AACnCuB,SAAAA,OAAOC,KAAKxB,KAAK;AAC1B;AAGA,SAASyB,OAAOC,QAAiC3B,KAAUC,OAAgB;AAClE,SAAA;AAAA,IACL,GAAG0B;AAAAA,IACH,CAAC3B,GAAG,GAAGC;AAAAA,EACT;AACF;AAGgB2B,SAAAA,MAA8BC,UAA4B,IAAI;AACpEF,SAAAA,CAAAA,WACC,IAAIG,WAAyBC,CAAaJ,aAAAA,OAAOK,UAAUD,QAAQ,CAAC,EAAEE,KAC3EC,UAAWC,CAAWA,YAAA;AACpB,UAAMC,iBAAiBb,OAAOY,OAAM,EAAEE,IAAKrC,CAAQ,QAAA;AAC3CC,YAAAA,QAAQkC,QAAOnC,GAAG;AACxB,aAAOsC,aAAarC,KAAK,IAAIsC,KAAKtC,KAAK,EAAEgC,KAAKI,IAAKG,CAAAA,QAAQ,CAACxC,KAAKwC,GAAG,CAAC,CAAC,IAAIC,GAAG,CAACzC,KAAKC,KAAK,CAAC;AAAA,IAAA,CAC1F;AAEM4B,WAAAA,QAAQa,OACXC,cAAcP,cAAc,EAAEH,KAC5BI,IAAKO,WAAUA,MAAMC,OAAO,CAACC,KAAK,CAAC9C,KAAKC,KAAK,MAAMyB,OAAOoB,KAAK9C,KAAKC,KAAK,GAAG,CAAA,CAAE,CAAC,CACjF,IACAsC,KAAKH,cAAc,EAAEH,KACnBc,SAAS,GACTC,KAAK,CAACF,KAAK,CAAC9C,KAAKC,KAAK,MAAMyB,OAAOoB,KAAK9C,KAAKC,KAAK,GAAG,CAAA,CAAE,CACzD;AAAA,EAAA,CACL,CACH;AAEJ;AC3BA,MAAMgD,gBAAwC;AAAA,EAACC,WAAW,CAAA;AAAE;AAE5D,SAASC,cAAclD,OAAoB;AACrCmD,SAAAA,YAAYnD,KAAK,IACZA,MAAMoD,OAER,SAASpD,QAAQA,MAAMqD,MAAMC;AACtC;AAEA,SAASC,iBAAiBC,IAAwBC,aAA0B;AAC1E,QAAMC,QAAiCF,KAAK;AAAA,IAAC,GAAGC;AAAAA,IAAaJ,KAAKG;AAAAA,EAAAA,IAAM;AAAA,IAAC,GAAGC;AAAAA,EAAW;AAEnFC,SAAAA,MAAMC,UAAU,gBAClB,OAAOD,MAAMC,OACb,OAAOD,MAAMN,MACb,OAAOM,MAAME,OACb,OAAOF,MAAMG,UACb,OAAOH,MAAMI,YACb,OAAOJ,MAAMK,uBAGRL;AACT;AAEA,SAASM,OAAOR,IAAYS,QAAkBC,OAAsB;AAElE,QAAMC,QAAQ;AAAA,IACZC,OAAO,kBAFUH,OAAOI,KAAK,IAAI,CAEE;AAAA;AAAA,IAEnCL,QAAQ;AAAA,KAEJM,SAAS;AAAA,IAACd;AAAAA,IAAIe,SAASC,WAAWhB,EAAE;AAAA,EAAC;AACpCU,SAAAA,MAAMO,YAAYN,OAAOG,QAAQ;AAAA,IACtCI,aAAa;AAAA,EAAA,CACd;AACH;AAEA,SAASC,gBACP3E,OACA4E,OACAV,OAC4C;AACxC,MAAA,CAAClE,SAAS,OAAOA,SAAU;AAC7B,WAAOwC,GAAGxC,KAAK;AAGjB,QAAMwD,KAAKN,cAAclD,KAAK,GACxB6E,eAAetB,iBAAiBC,IAAIxD,KAAK,GAEzC8E,gBAAgBF,MAAMG,OAAQC,CAAAA,SAAS,EAAEA,KAAK,CAAC,KAAKH,aAAa;AAEnErB,MAAAA,MAAMsB,cAAcG,QAAQ;AAC9B,UAAMhB,SAAS,CAAC,GAAG,IAAIiB,IAAIJ,cAAc1C,IAAK4C,CAAAA,SAAmBA,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1E,WAAOhB,OAAOR,IAAIS,QAAQC,KAAK,EAAElC,KAC/BC,UAAWkD,CAAAA,aACLA,WACKR,gBAAgBQ,UAAUP,OAAOV,KAAK,IAExC1B,GAAG,IAAI,CACf,CACH;AAAA,EAAA;AAGF,QAAM4C,QAAoC,CAAC;AAC3CR,QAAMS,QAASL,CAAS,SAAA;AACtB,UAAM,CAACM,MAAM,GAAGC,IAAI,IAAIP;AACnBI,UAAME,IAAI,MACbF,MAAME,IAAI,IAAI,KAEhBF,MAAME,IAAI,EAAEE,KAAKD,IAAI;AAAA,EAAA,CACtB;AACKE,QAAAA,OAAOlE,OAAOC,KAAK4D,KAAK,EAAExC,OAAO,CAAC8C,KAA8BJ,SAAS;AACvEK,UAAAA,QAAQP,MAAME,IAAI,EAAEP,OAAQQ,CAASA,SAAAA,KAAKN,SAAS,CAAC;AACtDU,WAAAA,MAAMV,WAAW,IACnBS,IAAIJ,IAAI,IAAIM,SAAS5F,KAAK,IAAKA,MAAkCsF,IAAI,IAAIhC,SAGzEoC,IAAIJ,IAAI,IAAIX,gBAAiB3E,MAAcsF,IAAI,GAAGK,OAAOzB,KAAK,GAEzDwB;AAAAA,KACNb,YAAY;AAEf,SAAOrC,GAAGiD,IAAI,EAAEzD,KAAKL,MAAM;AAAA,IAACc,MAAM;AAAA,EAAA,CAAK,CAAC;AAC1C;AAEA,SAASoD,oBACPC,YACAC,UACAC,eACA;AACM,QAAA;AAAA,IAACC;AAAAA,EAAAA,IAAUF,UACXnB,QAAQrD,OAAO2E,OAAOD,MAAM,EAAE7D,IAAKpC,CAAUmG,UAAAA,OAAOnG,KAAK,EAAEoG,MAAM,GAAG,CAAC,KAAK,CAAE;AAElF,SAAOzB,gBADK;AAAA,IAAChB,OAAO;AAAA,IAAaP,MAAM0C;AAAAA,EACXlB,GAAAA,OAAOoB,aAAa,EAAEhE,KAChDI,IAAKiE,CAAAA,SACI9E,OAAOC,KAAKyE,MAAM,EAAErD,OAAgC,CAACC,KAAK9C,SAC/D8C,IAAI9C,GAAG,IAAIuG,IAAID,MAAKJ,OAAOlG,GAAG,CAAC,GACxB8C,MACN,CAAE,CAAA,CACN,GACDT,IAAI2D,SAASQ,OAAO,CACtB;AACF;AAEO,SAAAC,qBAAA7E,QAAA;AAAA1B,QAAAA,IAAAC,EAAA,EAAA,GAQL;AAAA,IAAAsD;AAAAA,IAAAiD;AAAAA,IAAAC;AAAAA,EAA8B/E,IAAAA,QAC9BqE,gBAAsBW,iBAAAA,GACtB,CAAAC,gBAAAC,iBAAA,IAA4CC,SAAA9D,aAA8C,GAE1F+C,WAAiBU,cAAc,OAAOA,aAAc,aAAaA,YAAYA,UAAUC,IAAI,IAE3FK,CAAAA,iBAAAC,kBAAA,IAA8CF,SAC5Cf,WAAW,cAAc,OAC3B;AAACvF,MAAAA;AAAA,OAAA;AAAA,QAAA,CAGMuF,UAAQ;AAAEzC,WAAAA;AAAgB2D,YAAAA;AAAAA,IAAAA;AAG3B,QAAA,OAAOlB,YAAa,YAAU;AAAAtF,UAAAA;AAAA,UAAAR,EAAA,CAAA,MAAA+F,iBAAA/F,EAAAuD,CAAAA,MAAAA,MAAAvD,EAAA8F,CAAAA,MAAAA,YAAA9F,SAAAyG,MAAA;AAGhC,cAAAQ,UAAgBnB,SAFhB;AAAA,UAAAvC;AAAAA,UAAAkD;AAAAA,QAAAA,GACA;AAAA,UAAAV;AAAAA,QAAAA,CACwC;AACjCvF,cAAA4B,aAAa6E,OAAO,IAAIA,UAAU1E,GAAG0E,OAAO,GAACjH,OAAA+F,eAAA/F,OAAAuD,IAAAvD,OAAA8F,UAAA9F,OAAAyG,MAAAzG,OAAAQ;AAAAA,MAAA;AAAAA,cAAAR,EAAA,CAAA;AAA7CQ,WAAAA;AAA6CwG,YAAAA;AAAAA,IAAAA;AAIlD,QAAA,YAAYlB,YAAY,aAAaA,UAAQ;AAAAtF,UAAAA;AAAAR,QAAA+F,CAAAA,MAAAA,iBAAA/F,SAAAuD,MAAAvD,EAAA,CAAA,MAAA8F,YACxCtF,MAAAoF,oBAAoBrC,IAAIuC,UAAUC,aAAa,GAAC/F,OAAA+F,eAAA/F,OAAAuD,IAAAvD,OAAA8F,UAAA9F,OAAAQ,OAAAA,MAAAR,EAAA,CAAA,GAAvDO,KAAOC;AAAgDwG,YAAAA;AAAAA,IAAAA;AAAAxG,QAAAA;AAAAR,aAAA8F,YAIlDtF,MAAA+B,GAAGuD,QAAQ,GAAC9F,OAAA8F,UAAA9F,QAAAQ,OAAAA,MAAAR,EAAA,EAAA,GAAnBO,KAAOC;AAAAA,EAAAA;AAjBT,QAAA0G,SAAe3G;AAkBwB,MAAAC,IAAA2G;AAAAnH,YAAAkH,UAE7B1G,KAAAA,MAAA;AACR4G,UAAAA,MAAYF,QAAMpF,UAAAuF,CAAA,UAAA;AAChBT,wBAAkBS,SAAKtE,aAAiB,GACxCgE,mBAAmBM,QAAQ,aAAa,OAAO;AAAA,IAAA,CAAC;AAGrCD,WAAAA,MAAAA,KAAGE,YAAA;AAAA,EAAA,GACfH,MAACD,MAAM,GAAClH,QAAAkH,QAAAlH,QAAAQ,IAAAR,QAAAmH,OAAA3G,KAAAR,EAAA,EAAA,GAAAmH,KAAAnH,EAAA,EAAA,IAPXS,UAAUD,IAOP2G,EAAQ;AAACI,MAAAA;AAAAvH,SAAAA,EAAA2G,EAAAA,MAAAA,kBAAA3G,UAAA8G,mBAELS,KAAA;AAAA,IAAAF,OACEV;AAAAA,IAAca,QACbV;AAAAA,EAAAA,GACT9G,QAAA2G,gBAAA3G,QAAA8G,iBAAA9G,QAAAuH,MAAAA,KAAAvH,EAAA,EAAA,GAHMuH;AAGN;AC1KUE,MAAAA,8BAA8B,gBAO9BC,oCAAoCC,2BAA2B;AAAA,EAC1EC,QAAQ;AAAA,EACRC,WAAWJ;AAAAA,EACXK,WAAWA,MAAM,OAAO,kBAAa;AACvC,CAAC;ACXM,SAAAC,oBAAAxH,IAAA;AAA6B,QAAAyH,wBAAAzH,OAA4B8C,cAA5B9C,IAClC0H,eAAqB9H,WAAA+H,mBAA8B;AAAC,MAEhDF,0BAA0BC;AAAY5H,UAAAA,IAAAA,MACxB,iCAAiC;AAG5C4H,SAAAA;AAAY;ACZd,SAAAE,iCAAA;AACEJ,SAAAA,oBAAyB,EAAA,GAACK,QAAA/E;AAAmB;ACmBtD,MAAMgF,aAAyE;AAAA,EAC7EC,UAAUC;AAAAA,EACVC,SAASC;AAAAA,EACTC,UAAUC;AACZ;AAEO,SAAAC,gBAAAlH,QAAA;AAAA1B,QAAAA,IAAAC,EAAA,EAAA,GAQL;AAAA,IAAA4F;AAAAA,IAAAgD;AAAAA,IAAAlH;AAAAA,IAAAmH;AAAAA,IAAAC;AAAAA,MAA8ErH,QAC9E;AAAA,IAAAsB;AAAAA,IAAAgG;AAAAA,IAAAC;AAAAA,EAAAA,IAAmCvH,OAAK2F,OACxC6B,MAAYlG,WAASgC,UAAa,GAElC;AAAA,IAAAmE;AAAAA,EAAAA,IAAYC,eAAA3B,2BAA0C,GACtDQ,eAAqB9H,WAAA+H,mBAA8B,GACnDmB,mBAAyBpB,cAAYG,MACrC,CAAAkB,UAAAC,WAAA,IAAgC1C,WAAc;AAACtG,MAAAA;AAAAP,WAAAkJ,OACpB3I,KAAAA,MAAA;AACpB2I,WACLK,YAAWC,OAAU;AAAA,EAAC,GACvBxJ,OAAAkJ,KAAAlJ,OAAAO,MAAAA,KAAAP,EAAA,CAAA;AAHD,QAAAyJ,SAAelJ;AAGNC,MAAAA;AAAAR,IAAA,CAAA,MAAA6I,eAAA7I,EAAAkJ,CAAAA,MAAAA,OAAAlJ,EAAAgJ,CAAAA,MAAAA,WAAAhJ,SAAAmJ,KAEK3I,KAAAqI,cACVM,EAAE,iCAAiC,IACnCH,WAAWG,EAAE,oCAAkC;AAAA,IAAAO,OAAUR;AAAAA,EAAAA,CAAI,GAAClJ,OAAA6I,aAAA7I,OAAAkJ,KAAAlJ,OAAAgJ,SAAAhJ,OAAAmJ,GAAAnJ,OAAAQ,MAAAA,KAAAR,EAAA,CAAA;AAFlE,QAAA2J,QAAcnJ,IAIdoJ,WAAiBX,OAAIZ,WAAcY,IAAI,IAAA5F;AAAa8D,MAAAA;AAAAnH,IAAA,CAAA,MAAA6J,OAAAC,IAAA,2BAAA,KAIpC3C,KAAA;AAAA,IAAA4C,QAAA;AAAA,EAAA,GAAY/J,OAAAmH,MAAAA,KAAAnH,EAAA,CAAA;AAAAuH,MAAAA;AAAAvH,WAAA4J,YAAA5J,EAAAgD,CAAAA,MAAAA,aAAAhD,EAAA2B,EAAAA,MAAAA,WAAA3B,EAAA,EAAA,MAAA+I,yBAAA/I,UAAA2J,SAAA3J,EAAA,EAAA,MAAAiJ,QACrB1B,MAACvE,aACA,qBAAC,QAAW,OAAA,cAAkB,QAAY,SAAC,GACxCiG,UAAAA;AAAAA,IAAAA,QAAQW,YACP,oBAAC,KAAS,EAAA,MAAA,QACR,UAAA,oBAAC,MAAW,EAAA,SACV,UAAA,oBAAC,UACH,CAAA,CAAA,EAAA,CAAA,GACF;AAAA,IAEF,oBAAC,OAAU,SACT,+BAAC,MAAW,EAAA,MAAC,GAAS,QAAA,UACnBb,UAAAA;AAAAA,MAAAA,yBAA4BpH,qBAAAA,UAAAA,EAAAA,UAAAA;AAAAA,QAAAA,QAAOgI,SAAA9I;AAAAA,QAA6B;AAAA,MAAA,GAAU;AAAA;OAE7E,EACF,CAAA;AAAA,EAAA,EAAA,CACF,GACDb,OAAA4J,UAAA5J,OAAAgD,WAAAhD,QAAA2B,SAAA3B,QAAA+I,uBAAA/I,QAAA2J,OAAA3J,QAAAiJ,MAAAjJ,QAAAuH,MAAAA,KAAAvH,EAAA,EAAA;AAAAgK,MAAAA;AAAAhK,YAAA6F,cAAA7F,EAAAsJ,EAAAA,MAAAA,YAAAtJ,EAAA6I,EAAAA,MAAAA,eAAA7I,EAAA,EAAA,MAAAkJ,OAAAlJ,UAAAgD,aAAAhD,EAAA,EAAA,MAAA2B,WAAA3B,EAAAiI,EAAAA,MAAAA,cAAA5D,UAAArE,EAAAqJ,EAAAA,MAAAA,oBAAArJ,EAAA8I,EAAAA,MAAAA,cAAA9I,EAAA,EAAA,MAAA+I,yBAAA/I,UAAA2J,SAAA3J,EAAA,EAAA,MAAAyJ,UACAO,KAAAhH,aAEG,qBAAA,UAAA,EAAA,UAAA;AAAA,IAAA,oBAAC,QACK,IAAAkG,MAAM,WAAQ7F,QACToG,SAAK,QACL,SAAC,GACF,QAAA,GACH,MAAA,WAEL,UAAC,qBAAA,MAAA,EAAU,KAAC,GACV,UAAA;AAAA,MAAC,oBAAA,KAAA,EAAS,MAAA,QACPZ,UAAAA,kCACE,SAAc,EAAA,SAAK,IAEpB,oBAAC,QAAW,MAAC,GACVK,kBAAG,IACF,oBAAC,kBAAkB,CAAA,IAEnB,oBAAC,oBACQ,OAAA;AAAA,QAAAe,WACM,UAAUX,WAAW,WAAW;AAAA,QAAGY,YAClC;AAAA,MAAA,EACb,CAAA,EAGP,CAAA,GAEJ;AAAA,MACA,oBAAC,OAAU,MAAA,GACT,+BAAC,MAAW,EAAA,SAAU,QAAA,UACnBnB,UAAAA;AAAAA,QAAAA,yBAA4BpH,qBAAAA,UAAAA,EAAAA,UAAAA;AAAAA,UAAAA,QAAOgI,SAAA9I;AAAAA,UAA6B;AAAA,QAAA,GAAU;AAAA,QACtE;AAAA,MAAA,EAAA,CACP,EACF,CAAA;AAAA,IAAA,EAAA,CACF,EACF,CAAA;AAAA,wBACC,OAAc,EAAA,QAAA,CAACyI,UAAqB,WAAC,GAAS,OAAA,GAC5CtG,UAAAA,UAASb,IAAA,CAAAgI,GAAAC,UACP,oBAAA,cAAA,EAEG,SAACzI,QAAOyG,QAAAxH,uBAAgCyI,oBACxCc,EAACE,SAAUpC,cAAY5D,OAAAiG,SAEbzE,YACE,cAAAiD,WAAUV,MAElB+B,MAAA,GACI,UAAAxI,QAAOyG,QAAAxH,kBAFR,GAAA,KAIZ,CAAA,EACH,CAAA;AAAA,EAAQ,EAAA,CAAA,GAEXZ,QAAA6F,YAAA7F,QAAAsJ,UAAAtJ,QAAA6I,aAAA7I,QAAAkJ,KAAAlJ,QAAAgD,WAAAhD,QAAA2B,SAAA3B,EAAA,EAAA,IAAAiI,cAAA5D,QAAArE,QAAAqJ,kBAAArJ,QAAA8I,YAAA9I,QAAA+I,uBAAA/I,QAAA2J,OAAA3J,QAAAyJ,QAAAzJ,QAAAgK,MAAAA,KAAAhK,EAAA,EAAA;AAAAuK,MAAAA;AAAAvK,IAAAuH,EAAAA,MAAAA,MAAAvH,UAAAgK,MAtEHO,KAuEM,qBAAA,OAvEM,EAAA,OAAApD,IACTI,UAAAA;AAAAA,IAAAA;AAAAA,IAiBAyC;AAAAA,EAAAA,EAqDH,CAAA,GAAMhK,QAAAuH,IAAAvH,QAAAgK,IAAAhK,QAAAuK,MAAAA,KAAAvK,EAAA,EAAA;AAAAwK,MAAAA;AAAA,SAAAxK,EAAAuK,EAAAA,MAAAA,MAAAvK,UAAAiJ,QAxERuB,yBAAC,MAAc,EAAA,SAAC,GAAU,QAAC,GAAE,YAAavB,MACxCsB,UAAAA,GAwEF,CAAA,GAAOvK,QAAAuK,IAAAvK,QAAAiJ,MAAAjJ,QAAAwK,MAAAA,KAAAxK,EAAA,EAAA,GAzEPwK;AAyEO;AArGJ,SAAAhB,QAAAiB,GAAA;AAAA,SAAA,CAkBiBA;AAAC;AAuFzB,SAAAC,aAAAhJ,QAAA;AAAA1B,QAAAA,IAAAC,EAAA,EAAA,GAOE;AAAA,IAAA4F;AAAAA,IAAA8E;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,IAAAC;AAAAA,EAAAA,IAA2DpJ,QAC3DuG,eAAqB9H,WAAA+H,mBAA8B,GACnD6C,8BAAoC5C,+BACpC6C,GAAAA,gBAAsBF,aAAaC,6BACnCE,WAAiBhD,cAAYgD,UAStB1K,KAAA0H,cAAYiD;AAAiB1K,MAAAA;AAAAR,WAAA6F,cAAA7F,EAAA2K,CAAAA,MAAAA,gBAAA3K,EAAA,CAAA,MAAA4K,KAAAP,QAAArK,EAAA,CAAA,MAAAO,MAAAP,SAAA8K,YAPQtK,KAAA;AAAA,IAAA2K,QAClC;AAAA,IAAM9G,QAAA;AAAA,MAAAd,IAERsC;AAAAA,MAAUY,MACRkE;AAAAA,MAAYS,MACZ;AAAA,MAAcnD,cACN6C;AAAAA,MAAQ,GACnBvK;AAAAA,MAA6B+J,SACvBM,KAAIP;AAAAA,IAAAA;AAAAA,EAEhBrK,GAAAA,OAAA6F,YAAA7F,OAAA2K,cAAA3K,EAAA,CAAA,IAAA4K,KAAAP,MAAArK,OAAAO,IAAAP,OAAA8K,UAAA9K,OAAAQ,MAAAA,KAAAR,EAAA,CAAA;AAVDqL,QAAAA,wBAA8BC,cAAc9K,EAU3C;AAAC2G,MAAAA;AAAAnH,WAAAiL,YAAAjL,EAAA4K,CAAAA,MAAAA,KAAAP,QAEyClD,KAAAA,MAAA;AACzC8D,eAAQ,CAAA,GAAA;AAAA,MAAAX,SAAiBM,KAAIP;AAAAA,IAAAA,CAAA;AAAA,EAAA,GAC9BrK,OAAAiL,UAAAjL,EAAA,CAAA,IAAA4K,KAAAP,MAAArK,OAAAmH,MAAAA,KAAAnH,EAAA,CAAA;AAFD,QAAAuL,yBAA+BpE;AAENI,MAAAA;AAAAvH,IAAAgL,CAAAA,MAAAA,iBAAAhL,UAAAqL,yBAIhB9D,KAAAyD,gBAAa,CAAQK,IAAAA,uBAAqBrL,OAAAgL,eAAAhL,QAAAqL,uBAAArL,QAAAuH,MAAAA,KAAAvH,EAAA,EAAA;AAGtCgK,QAAAA,KAAAgB,gBAAgBO,yBAAyBF,sBAAqBG;AAAQjB,MAAAA;AAAAvK,IAAA,EAAA,MAAA6J,OAAAC,IAAA,2BAAA,KAO7ES,KAAA,oBAAC,KAAS,EAAA,MAAA,QACR,UAAA,oBAAC,MAAW,EAAA,MAAC,GACX,UAAA,oBAAC,aAAW,CAAA,CAAA,EAAA,CACd,EACF,CAAA,GAAMvK,QAAAuK,MAAAA,KAAAvK,EAAA,EAAA;AAAAwK,MAAAA;AAAAxK,IAAA,EAAA,MAAA4K,KAAAjB,SAEJa,yBAAC,MAAW,EAAA,MAAA,GAAU,QAAA,UACnBI,UAAAA,KAAIjB,MACP,CAAA,GAAO3J,EAAA,EAAA,IAAA4K,KAAAjB,OAAA3J,QAAAwK,MAAAA,KAAAxK,EAAA,EAAA;AAAAyL,MAAAA;AAAAzL,IAAA,EAAA,MAAA4K,KAAAP,QACPoB,KAAC,oBAAA,MAAA,EAAK,OAAI,IAAQ,MAAA,GAAgB,cAAA,YAC/Bb,UAAIP,KAAAA,KACP,CAAA,GAAOrK,EAAA,EAAA,IAAA4K,KAAAP,MAAArK,QAAAyL,MAAAA,KAAAzL,EAAA,EAAA;AAAA0L,MAAAA;AAAA1L,IAAAwK,EAAAA,MAAAA,MAAAxK,UAAAyL,MAZXC,KAAC,qBAAA,MAAU,EAAA,KAAC,GACVnB,UAAAA;AAAAA,IAAAA;AAAAA,IAKC,qBAAA,OAAA,EAAY,MAAA,GAAU,OAAA,GACrBC,UAAAA;AAAAA,MAAAA;AAAAA,MAGAiB;AAAAA,IAAAA,EAGF,CAAA;AAAA,EAAA,EACF,CAAA,GAAOzL,QAAAwK,IAAAxK,QAAAyL,IAAAzL,QAAA0L,MAAAA,KAAA1L,EAAA,EAAA;AAAA2L,MAAAA;AAAA,SAAA3L,UAAA6K,UAAA7K,EAAA4K,EAAAA,MAAAA,KAAAP,QAAArK,EAAAuH,EAAAA,MAAAA,MAAAvH,EAAA,EAAA,MAAAgK,MAAAhK,UAAA0L,MAxBTC,mCAAC,MACMpE,EAAAA,GAAAA,IACF,IAAA,KACE,KAAAqD,KAAIP,MACA,SAAAL,IACA,YACD,QAAC,GACAa,SAAAA,QACJ,MAAA,UAAA,GAELa,EAeF,GAAO1L,QAAA6K,QAAA7K,EAAA,EAAA,IAAA4K,KAAAP,MAAArK,QAAAuH,IAAAvH,QAAAgK,IAAAhK,QAAA0L,IAAA1L,QAAA2L,MAAAA,KAAA3L,EAAA,EAAA,GAzBP2L;AAyBO;AClLX,MAAMC,gBAAgBC,OAAOC,KAAK;AAAA,gBAClBC,IAAI,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAOhB,SAAAC,2BAAAtK,QAAA;AAAA1B,QAAAA,IAAAC,EAAA,EAAA,GAKL;AAAA,IAAA4F;AAAAA,IAAAlE;AAAAA,IAAAmH;AAAAA,EAAA,IAA0CpH,QAE1CxB,UAAgBC,WAAA8L,2BAAsC,GAGzC1L,KAAAoB,QAAO2E,SAAAtD,aAAuBrB,QAAOuK;AAAO1L,MAAAA;AAAAR,IAAA,CAAA,MAAA6F,cAAA7F,EAAA,CAAA,MAAA8I,WAAAV,QAAApI,EAAA,CAAA,MAAAO,MAFZC,KAAA;AAAA,IAAA+C,IACvCsC;AAAAA,IAAUW,WACHjG;AAAAA,IAA4CkG,MACjDqC,WAAUV;AAAAA,EAAAA,GACjBpI,OAAA6F,YAAA7F,EAAA,CAAA,IAAA8I,WAAAV,MAAApI,OAAAO,IAAAP,OAAAQ,MAAAA,KAAAR,EAAA,CAAA;AAJD,QAAA;AAAA,IAAAqH;AAAAA,IAAAG;AAAAA,EAAAA,IAAwBjB,qBAAqB/F,EAI5C;AAAC,MAEGN,WAAWA,QAAOyB,eAAgBA,WAAY6F,WAAW;AAAO,WAAA;AAAAL,MAAAA;AAAAnH,IAAA,CAAA,MAAAE,SAAAyB,WAI9CwF,KAAAjH,SAAOyB,WAAe,CAAA,GAAA3B,EAAA,CAAA,IAAAE,SAAAyB,SAAA3B,OAAAmH,MAAAA,KAAAnH,EAAA,CAAA;AAA7C,QAAAmM,iBAAuBhF;AAAsBI,MAAAA;AAAA,MAAAvH,EAAAmM,CAAAA,MAAAA,kBAAAnM,EAAA,CAAA,MAAA6F,cAAA7F,EAAA8I,CAAAA,MAAAA,cAAA9I,EAAA,CAAA,MAAAqH,SAAArH,UAAAwH,QAAA;AAAAwC,QAAAA;AAAAhK,cAAAmM,eAAAnH,UAAAhF,UAAA6F,cAAA7F,EAAA8I,EAAAA,MAAAA,cAAA9I,EAAA,EAAA,MAAAqH,SAAArH,UAAAwH,UAMrCwC,MAAAA,CAAAoC,WAAAC,QAKE,oBAAC,mBACaxG,YACC,aAAA2B,WAAW,aAEf7F,SAAM,WACHmH,YACW,uBAAAqD,eAAcnH,SAAU,GACxCqC,SAJFgF,GAKL,GACHrM,EAAA,EAAA,IAAAmM,eAAAnH,QAAAhF,QAAA6F,YAAA7F,QAAA8I,YAAA9I,QAAAqH,OAAArH,QAAAwH,QAAAxH,QAAAgK,OAAAA,MAAAhK,EAAA,EAAA,GAfFuH,KAAA4E,eAAchK,IACb6H,GAeF,GAAChK,OAAAmM,gBAAAnM,OAAA6F,YAAA7F,OAAA8I,YAAA9I,OAAAqH,OAAArH,QAAAwH,QAAAxH,QAAAuH;AAAAA,EAAA;AAAAA,SAAAvH,EAAA,EAAA;AAAAgK,MAAAA;AAAA,SAAAhK,UAAAuH,MAlBLyC,KAAA,oBAAC,eAA4B,EAAA,cAAC,GAAS,OAAC,GACtC,UAAA,oBAAC,OAAa,EAAA,OAAC,GACZzC,UAAAA,GAiBH,CAAA,EACF,CAAA,GAAgBvH,QAAAuH,IAAAvH,QAAAgK,MAAAA,KAAAhK,EAAA,EAAA,GApBhBgK;AAoBgB;ACnDb,SAAAsC,6BAAA5K,QAAA;AAAA1B,QAAAA,IAAAC,EAAA,EAAA,GAIL;AAAA,IAAAsM;AAAAA,IAAA5K;AAAAA,EAA4BD,IAAAA,QAC5B8K,SAAerM,WAAA8L,2BAAsC,GACrDQ,iBAAuBD,QAAME,UAE7B,CAAAC,cAAAC,eAAA,IAAwC/F,SAAA2C,KAA8C;AAACjJ,MAAAA;AAAAP,WAAAyM,kBAIrFlM,KAAA6L,CAAAA,cACMK,iBACKA,eAAe9K,SAAO,KAG/BiL,gBAAeC,CAAAA,SAAW,CAAClL,SAAO,EAAAmL,OAASD,IAAI,CAAC,GAAC,MAAA;AAG/CD,oBAAeG,YAAWF,OAAI/H,OAAAkI,CAAeA,MAAAA,MAAMrL,SAAO,CAAC;AAAA,EAAC,IAE/D3B,OAAAyM,gBAAAzM,OAAAO,MAAAA,KAAAP,EAAA,CAAA;AAZH,QAAA0M,WAAiBnM;AAchBC,MAAAA;AAIY2G,QAAAA,KAAAqF,QAAM7K,WAAagL;AAAYpF,MAAAA;AAAAvH,IAAA0M,CAAAA,MAAAA,YAAA1M,SAAAmH,MADnCI,KAAA;AAAA,IAAA5F,SACIwF;AAAAA,IAA+BuF;AAAAA,EAAAA,GAEzC1M,OAAA0M,UAAA1M,OAAAmH,IAAAnH,OAAAuH,MAAAA,KAAAvH,EAAA,CAAA,GAAAQ,KAHM+G;AADT,QAAArH,UAAkDM;AAMjDwJ,MAAAA;AAAAhK,WAAA0M,YAG0C1C,KAAAiD,CAAAA,cACzCP,SAAS/K,SAAO,GAAC3B,OAAA0M,UAAA1M,OAAAgK,MAAAA,KAAAhK,EAAA,CAAA;AADnBkN,QAAAA,sBAA4BC,eAAenD,EAE3C;AAAC,MAAAO,IAAAC;AAAAxK,IAAA2B,CAAAA,MAAAA,WAAA3B,SAAAkN,uBACe3C,KAAAA,MAAM2C,oBAAoBvL,OAAO,GAAG6I,KAAA,CAAC0C,qBAAqBvL,OAAO,GAAC3B,OAAA2B,SAAA3B,OAAAkN,qBAAAlN,OAAAuK,IAAAvK,QAAAwK,OAAAD,KAAAvK,EAAA,CAAA,GAAAwK,KAAAxK,EAAA,EAAA,IAAlFoN,gBAAgB7C,IAAoCC,EAA8B;AAACiB,MAAAA;AAAA,SAAAzL,EAAAuM,EAAAA,MAAAA,YAAAvM,UAAAE,WAGjFuL,KAAA,oBAAA,4BAAA,UAAA,EAA6CvL,OAAAA,SAC1CqM,SAAAA,CACH,GAAuCvM,QAAAuM,UAAAvM,QAAAE,SAAAF,QAAAyL,MAAAA,KAAAzL,EAAA,EAAA,GAFvCyL;AAEuC;AA3CpC,SAAAjC,QAAA;AAAA,SAAA,CAAA;AAAA;ACSP,SAAA6D,yBAAA3L,QAAA;AAAA1B,QAAAA,IAAAC,EAAA,EAAA,GAGE;AAAA,IAAA4F;AAAAA,IAAA8E;AAAAA,IAAA5F;AAAAA,EAAAA,IAAyCrD,QACzC4L,YAAkBC,gBAClB;AAAA,IAAAC;AAAAA,EAAyBC,IAAAA,UACzBxF,GAAAA,eAAqB9H,WAAA+H,mBAA8B;AAAC3H,MAAAA;AAQ9CC,QAAAA,KAAAyH,cAAYG,QAAAxH;AAA2BuG,MAAAA;AAAAnH,IAAA6F,CAAAA,MAAAA,cAAA7F,SAAA2K,gBAAA3K,EAAA,CAAA,MAAAQ,MAAAR,EAAAsN,CAAAA,MAAAA,UAAAI,SAJzCvG,KAAAwG,kBACEL,UAASI,OACT7H,YACA8E,cACAnK,EACF,GAACR,OAAA6F,YAAA7F,OAAA2K,cAAA3K,OAAAQ,IAAAR,EAAA,CAAA,IAAAsN,UAAAI,OAAA1N,OAAAmH,MAAAA,KAAAnH,EAAA,CAAA,GAAAO,KALD4G;AAFJ,QAAAyG,uBAA6BrN,IAanBgH,MAACU,gBAAgBlD,KAAIC,SAAW,KAAA,CAAK4I,sBACvC5D,KAAA4D,sBAAoBC,QAAAC,kBACnBvD,KAAWqD,WAAAA,sBAAoBjE,SAAW,WAAW;AAAEa,MAAAA;AAAA,SAAAxK,EAAA6F,CAAAA,MAAAA,cAAA7F,EAAA2K,CAAAA,MAAAA,gBAAA3K,EAAAwN,CAAAA,MAAAA,kBAAAxN,SAAA+E,QAAA/E,EAAA,CAAA,MAAAuH,MAAAvH,EAAA,EAAA,MAAAgK,MAAAhK,EAAA,EAAA,MAAAuK,MAJzDC,KAAA;AAAA,IAAA/D,MACC;AAAA,IAAQsH,QACNxG;AAAAA,IAAyDsG,MAC3D7D;AAAAA,IAA8CL,OAC7CY;AAAAA,IAAuDyD,WAAA;AAE5DR,qBAAe,QAAM;AAAA,QAAAjK,IACfsC;AAAAA,QAAUY,MACRkE;AAAAA,QAAYS,MACZ;AAAA,QAAWrG,MACXkJ,aAAalJ,IAAI;AAAA,MAAA,CACxB;AAAA,IAAC;AAAA,IAAAmJ,gBAAA;AAAA,EAAA,GAGLlO,OAAA6F,YAAA7F,OAAA2K,cAAA3K,OAAAwN,gBAAAxN,OAAA+E,MAAA/E,OAAAuH,IAAAvH,QAAAgK,IAAAhK,QAAAuK,IAAAvK,QAAAwK,MAAAA,KAAAxK,EAAA,EAAA,GAdMwK;AAcN;AAGI,MAAM2D,kBAAkBC,0BAA0B;AAAA,EACvDhG,MAAM;AAAA,EACNiG,WAAWhB;AACb,CAAC;AAED,SAASM,kBACPD,OACA7H,YACA8E,cACA2D,sBACkB;AACZC,QAAAA,UAAUb,MACb5I,OAAQqE,CAAAA,MAAMA,EAAEf,SAASkG,oBAAoB,EAC7CnM,IAAKgH,CAAM,MAAA;AACJqF,UAAAA,QAAQrF,EAAEsF,kBACd,QACA;AAAA,MACElL,IAAIsC;AAAAA,MACJY,MAAMkE;AAAAA,MACNS,MAAM;AAAA,IACR,GACA,EACF;AAEO,WAAA;AAAA,MAACsD,MAAMvF;AAAAA,MAAGqF;AAAAA,IAAK;AAAA,EACvB,CAAA,GAEGG,cAAcJ,QAAQzJ,OAAQqE,CAAAA,MAAMxD,SAASwD,EAAEqF,KAAK,KAAKrF,EAAEqF,MAAMpD,IAAI;AAE3E,SAAIuD,YAAY3J,SAAS,IAChB2J,YAAY,CAAC,EAAED,OAGRH,QAAQzJ,OAAQqE,CAAMA,MAAAA,EAAEqF,KAAK,EAE9B,CAAC,GAAGE;AACrB;ACnFA,MAAME,2BAAkE,CACtE,WACA,eACA,UAAU;AAML,SAASC,eACd1D,QACA9G,QACAyK,aACAC,SAGqE;AAE/D,QAAA;AAAA,IAACxL;AAAAA,IAAI6H;AAAAA,IAAMrG;AAAAA,IAAMkD;AAAAA,IAAcxB;AAAAA,IAAM,GAAGuI;AAAAA,EAAAA,IAAgB3K,QAOxD4K,gBAAgB;AAAA,IACpB,IAN6BH,aAAaG,iBAAiB,CAAA,GAE1DnK,OAAO,CAAC,CAAChF,GAAG,MAAM8O,yBAAyBM,SAASpP,GAAqC,CAAC,EAC1F6C,OAAO,CAACC,KAAK,CAAC9C,KAAKC,KAAK,OAAO;AAAA,MAAC,GAAG6C;AAAAA,MAAK,CAAC9C,GAAG,GAAGC;AAAAA,IAAK,IAAI,CAAA,CAA4B;AAAA,IAIrF,GAAGiP;AAAAA,EACL;AAEA,SAAI7D,WAAW,UAAU5H,MACvB0L,cAAc3E,UACZ2E,cAAc3E,WAAW,IAAI6E,gBAAgBC,OAAOC,SAASC,MAAM,EAAEjJ,IAAI,SAAS,KAAK,KAClF;AAAA,IACLI,MAAMA,QAAQ;AAAA,IACdlD,IAAIgM,eAAehM,EAAE;AAAA,IACrBwB;AAAAA,IACAkK,eAAe3N,OAAOkO,QAAQP,aAAa;AAAA,EAC7C,KAGE9D,WAAW,YACb8D,cAAc3E,UACZ2E,cAAc3E,WAAW,IAAI6E,gBAAgBC,OAAOC,SAASC,MAAM,EAAEjJ,IAAI,SAAS,KAAK,KAErF0I,WAAW,OAAOA,WAAY,aAChCE,cAAcQ,iBAAiBC,iBAAiBX,OAAkC,IAG7E;AAAA,IACLtI,MAAMA,QAAQ;AAAA,IACdlD,IAAIA,MAAMoM,KAAK;AAAA,IACfV,eAAe3N,OAAOkO,QAAQP,aAAa;AAAA,EAAA,KAGxC;AAAA,IAAC9D;AAAAA,IAAQ9G;AAAAA,IAAQ0K;AAAAA,EAAO;AACjC;AC5DO,SAAAa,sBAAA;AAAA5P,QAAAA,IAAAC,EAAA,CAAA;AAAAM,MAAAA;AAAA,SAAAP,EAAA,CAAA,MAAA6J,OAAAC,IAAA,2BAAA,KAEHvJ,KAAA,oBAAC,MAAW,EAAA,OAAA,UAAmB,WAAA,UAAgB,QAAA,QAAe,SAAA,UAAgB,OAAA;AAAA,IAAAsP,OAAQ;AAAA,EACpF,GAAA,UAAA,oBAAC,SACH,CAAA,CAAA,EAAA,CAAA,GAAO7P,OAAAO,MAAAA,KAAAP,EAAA,CAAA,GAFPO;AAEO;ACHEuP,MAAAA,SAASC,MAAMC,OAAO,KAAK;AAAA,EAACC,oCAAoC;AAAI,GAAG,CAClFF,MAAMG,QAAQ,SAAS,GACvBH,MAAMC,OAAO,SAAS,CAACD,MAAMC,OAAO,OAAO,CAACD,MAAMC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CACtE,GCaKG,mBAAmBC,KAAK,MAAM,OAAO,mCAA+B,CAAC,GACrEC,6BAA6BD,KAAK,MAAM,OAAO,kCAAqC,CAAC;AAQpF,SAASE,gBACdxK,UACiB;AACVA,SAAAA;AACT;AAQO,SAASyK,gBAAgB/J,WAAiD;AACxEA,SAAAA;AACT;AAGagK,MAAAA,mBAAmBC,aAAyC9O,CAAY,YAAA;AAC7EmJ,QAAAA,WAAWnJ,QAAQyG,QAAQxH;AAE7B,cAAYe,WAEd+O,QAAQC,KAAK,qFAAgF;AAG/F,QAAMC,uBAAuB,CAAC,EAAEjP,QAAQ2E,SAAStD,aAAarB,QAAQuK;AAEtE,WAAA2E,0BAAAnP,QAAA;AAAA,UAAA1B,IAAAC,EAAA,EAAA,GACEF,QAAc2B,OAAK3B;AAAwBQ,QAAAA;AAAAP,MAAA,CAAA,MAAAD,OAAAqD,OACxB7C,KAAAR,OAAKqD,MAAQmM,eAAexP,OAAKqD,GAAK,IAACC,QAAYrD,EAAA,CAAA,IAAAD,OAAAqD,KAAApD,OAAAO,MAAAA,KAAAP,EAAA,CAAA;AAAtE,UAAA6F,aAAmBtF;AAEfuQ,QAAAA,qBAAqBpP,OAAKoH,UAAW,GAAC;AAAAtI,UAAAA;AAAAR,eAAA6F,cAAA7F,EAAA0B,CAAAA,MAAAA,OAAAoH,cAGnCtI,MAAAoQ,wBAAwB/K,cACtB,oBAAA,4BAAA,EACaA,YACHlE,SACG,YAAAD,OAAKoH,WAAAA,CAEpB,GAAA9I,OAAA6F,YAAA7F,EAAA,CAAA,IAAA0B,OAAAoH,YAAA9I,OAAAQ,OAAAA,MAAAR,EAAA,CAAA;AAAAmH,UAAAA;AAAAnH,QAAA,CAAA,MAAA6J,OAAAC,IAAA,2BAAA,KACmB3C,KAAC,oBAAA,qBAAA,CAAsB,CAAA,GAAAnH,OAAAmH,MAAAA,KAAAnH,EAAA,CAAA;AAAAuH,UAAAA;AAAAvH,eAAA0B,UAAG6F,KAAA7F,OAAKqP,cAAerP,MAAK,GAAC1B,OAAA0B,QAAA1B,OAAAuH,MAAAA,KAAAvH,EAAA,CAAA;AAAAgK,UAAAA;AAAAhK,eAAAuH,MAAxEyC,KAAC,oBAAA,UAAA,EAAmB,UAAA7C,IAA0BI,UAAAA,IAA2B,GAAWvH,OAAAuH,IAAAvH,OAAAgK,MAAAA,KAAAhK,EAAA,CAAA;AAAAuK,UAAAA;AAAAvK,QAAA6F,EAAAA,MAAAA,cAAA7F,UAAAD,SACpFwK,KAAC,oBAAA,UAAA,EACC,UAAC,oBAAA,4BAAA,EAAmDxK,SAAV,UAAe,EAAA,GAD7C,8BAEd,GAAWC,QAAA6F,YAAA7F,QAAAD,OAAAC,QAAAuK,MAAAA,KAAAvK,EAAA,EAAA;AAAAwK,UAAAA;AAAA,aAAAxK,EAAAQ,EAAAA,MAAAA,OAAAR,UAAAgK,MAAAhK,EAAA,EAAA,MAAAuK,MAXbC,0BAAC,gCAAsC7I,SACpCnB,UAAAA;AAAAA,QAAAA;AAAAA,QAODwJ;AAAAA,QACAO;AAAAA,MAAAA,GAGF,GAA+BvK,QAAAQ,KAAAR,QAAAgK,IAAAhK,QAAAuK,IAAAvK,QAAAwK,MAAAA,KAAAxK,EAAA,EAAA,GAZ/BwK;AAAAA,IAAAA;AAY+BhK,QAAAA;AAAAR,WAAAA,UAAA0B,UAI5BlB,KAAAkB,OAAKqP,cAAerP,MAAK,GAAC1B,QAAA0B,QAAA1B,QAAAQ,MAAAA,KAAAR,EAAA,EAAA,GAA1BQ;AAAAA,EAAAA;AAGT,WAASwQ,sBAAsB3M,QAAiC;AAE1D,WAAA,EAAE,UAAUA,WAIZ,kBAAkBA,UAAUA,OAAO4D,iBAAiB6C,WAC/C,KAGF,cAAczG,SAAS;AAAA,MAAC4M,UAAU;AAAA,IAAA,IAAQ;AAAA,EAAA;AAGnD,WAASC,oBAAoB7M,QAAiC;AAM5D,WAJI,EAAE,UAAUA,WAAW,EAAE,QAAQA,WAIjC,kBAAkBA,UAAUA,OAAO4D,iBAAiB6C,WAC/C,KAGF,UAAUzG,SAAS;AAAA,MAAC+G,MAAM/G,OAAO+G,SAAStK;AAAAA,IAAAA,IAAoB;AAAA,EAAA;AAGhE,SAAA;AAAA,IACLqQ,MAAM;AAAA,MACJC,SAAS,CAAC1J,iCAAiC;AAAA,IAC7C;AAAA,IACA2J,UAAU;AAAA,MACRC,uBAAwBzE,CACf,SAAA;AAAA,QACL,GAAGA,KAAK/H,OAAQyM,OAAMA,EAAEnJ,SAAS+F,gBAAgB/F,IAAI;AAAA;AAAA,QACrD+F;AAAAA,MAAAA;AAAAA,IAGN;AAAA,IAEAqD,MAAM;AAAA,MACJC,YAAY;AAAA,QACVC,OAAOb;AAAAA,MAAAA;AAAAA,IAEX;AAAA,IAEAnD,OAAO,CACL;AAAA,MACEG,MAAMlM,QAAQkM,QAAQnN;AAAAA,MACtB0H,MAAM0C;AAAAA,MACNnB,OAAOhI,QAAQgI;AAAAA,MACfgI,WAAWxB;AAAAA,MACXxO;AAAAA,MACA8M,gBAAgBtD,QAAQ9G,QAAQ;AAC1B8G,eAAAA,WAAW,WAAiB6F,sBAAsB3M,MAAM,IACxD8G,WAAW,SAAe+F,oBAAoB7M,MAAM,IACjD;AAAA,MACT;AAAA,MACAwK;AAAAA,MACAiB;AAAAA,MACA8B,2BAA2B;AAAA,IAC5B,CAAA;AAAA,EAEL;AACF,CAAC,GChIYC,uBAAuB,wBAEvBC,wBAAwB,yBAExBC,uBAAuB,wBAEvBC,wCAAwC,yCA2BxCC,sBAGTA,CAAC5K,OAAO6K,WAAW;AACrB,UAAQA,OAAOzL,MAAI;AAAA,IACjB,KAAKoL;AACH,aAAOxK,MAAM8K,OAAO3K,WAAW,WAC3BH,QACA;AAAA,QACE,GAAGA;AAAAA,QACH8K,QAAQ;AAAA,UACN,GAAG9K,MAAM8K;AAAAA,UACT3K,QAAQ;AAAA,QAAA;AAAA,MAEZ;AAAA,IACN,KAAKsK;AACH,aAAOzK,MAAM8K,OAAO3K,WAAW,eAC3BH,QACA;AAAA,QACE,GAAGA;AAAAA,QACH8K,QAAQ;AAAA,UACN,GAAG9K,MAAM8K;AAAAA,UACT3K,QAAQ;AAAA,QAAA;AAAA,MAEZ;AAAA,IACN,KAAKuK;AACH,aAAO1K,MAAM8K,OAAO3K,WAAW,cAC3BH,QACA;AAAA,QACE,GAAGA;AAAAA,QACH8K,QAAQ;AAAA,UACN,GAAG9K,MAAM8K;AAAAA,UACT3K,QAAQ;AAAA,QAAA;AAAA,MAEZ;AAAA,IACN,KAAKwK;AACII,aAAAA,4BAA4B/K,OAAO6K,MAAM;AAAA,IAClD;AACS7K,aAAAA;AAAAA,EAAAA;AAEb,GAEM+K,8BAGFA,CAAC/K,OAAO6K,WACN7K,MAAMgL,cAAcC,oBAAoBJ,OAAOK,UAAgBlL,QAC5D;AAAA,EACL,GAAGA;AAAAA,EACHgL,eAAe;AAAA,IACb,GAAGhL,MAAMgL;AAAAA,IACTC,iBAAiBJ,OAAOK;AAAAA,EAAAA;AAE5B,GAGIC,qBAAqBC,SAASC,QAAW,GAAA,EAAK,GAE9CC,qBAAqBC,SAAS,CAAC,WAAW,UAAU,cAAc,WAAW,CAAC,GAE9EC,kBAAkB5Q,OAAO;AAAA,EAC7B6Q,cAAcN;AAAAA,EACdL,QAAQlQ,OAAO;AAAA,IACbuF,QAAQmL;AAAAA,EAAAA,CACT;AAAA,EACDN,eAAepQ,OAAO;AAAA,IAACqQ,iBAAiBI,QAAQ;AAAA,EAAE,CAAA;AACpD,CAAC,GAEKK,6BAA6B;AAAA,EACjCD,cAAc;AAAA,EACdX,QAAQ;AAAA,IACN3K,QAAQ;AAAA,EACV;AAAA,EACA6K,eAAe;AAAA,IACbC,iBAAiB;AAAA,EAAA;AAErB;AAEO,SAASU,wBACd3L,OAC6B;AAC7B,SAAO4L,MAAMJ,iBAAiB;AAAA,IAAC,GAAGE;AAAAA,IAA4B,GAAG1L;AAAAA,EAAAA,CAAM;AACzE;AC5HO,SAAA6L,0BAAA;AACLjI,QAAAA,WAAiB9K,WAAAgT,2BAAsC;AAAC,MAAA,CAEnDlI;AAAQ5K,UAAAA,IAAAA,MACK,0CAA0C;AAGrD4K,SAAAA;AAAQ;ACDV,SAAAmI,sBAAA7S,IAAA;AACL,QAAAyH,wBAAAzH,OAA4B8C,cAA5B9C,IAEA8D,SAAelE,WAAAkT,yBAAoC;AAAC,MAEhDrL,0BAA0B3D;AAAMhE,UAAAA,IAAAA,MAClB,wCAAwC;AAGnDgE,SAAAA;AAAM;"}
|
@@ -138,7 +138,7 @@ const levelValues = {
|
|
138
138
|
for (const item of Object.values(node)) traverse(item);
|
139
139
|
}
|
140
140
|
return traverse(value), ids;
|
141
|
-
}, idRegex = /^[^-][A-Z0-9._-]*$/i, isValidId = (id) => typeof id == "string" && idRegex.test(id), shouldIncludeDocument = (document) => !document._type.startsWith("system.");
|
141
|
+
}, idRegex = /^[^-][A-Z0-9._-]*$/i, isValidId = (id) => typeof id == "string" && idRegex.test(id), shouldIncludeDocument = (document) => !document._type.startsWith("system.") && !document._type.startsWith("sanity.");
|
142
142
|
async function* readerToGenerator(reader) {
|
143
143
|
for (; ; ) {
|
144
144
|
const {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"validateDocuments.js","sources":["../../../../src/_internal/cli/util/extractDocumentsFromNdjsonOrTarball.ts","../../../../src/_internal/cli/util/workerChannels.ts","../../../../src/_internal/cli/threads/validateDocuments.ts"],"sourcesContent":["import path from 'node:path'\nimport readline from 'node:readline'\nimport {Readable, type Writable} from 'node:stream'\nimport zlib from 'node:zlib'\n\nimport {type SanityDocument} from '@sanity/types'\nimport tar from 'tar-stream'\n\nconst HEADER_SIZE = 300\n\n// https://github.com/kevva/is-gzip/blob/13dab7c877787bd5cff9de5482b1736f00df99c6/index.js\nconst isGzip = (buf: Buffer) =>\n buf.length >= 3 && buf[0] === 0x1f && buf[1] === 0x8b && buf[2] === 0x08\n\n// https://github.com/watson/is-deflate/blob/f9e8f0c7814eed715e13e29e97c69acee319686a/index.js\nconst isDeflate = (buf: Buffer) =>\n buf.length >= 2 && buf[0] === 0x78 && (buf[1] === 1 || buf[1] === 0x9c || buf[1] === 0xda)\n\n// https://github.com/kevva/is-tar/blob/d295ffa2002a5d415946fc3d49f024ace8c28bd3/index.js\nconst isTar = (buf: Buffer) =>\n buf.length >= 262 &&\n buf[257] === 0x75 &&\n buf[258] === 0x73 &&\n buf[259] === 0x74 &&\n buf[260] === 0x61 &&\n buf[261] === 0x72\n\nasync function* extract<TReturn>(\n stream: AsyncIterable<Buffer>,\n extractor: Writable & AsyncIterable<TReturn>,\n) {\n // set up a task to drain the input iterable into the extractor asynchronously\n // before this function delegates to the extractor's iterable (containing the\n // result of the extraction)\n const drained = new Promise<void>((resolve, reject) => {\n // setTimeout is used here to ensure draining occurs after delegation\n setTimeout(async () => {\n try {\n for await (const chunk of stream) extractor.write(chunk)\n extractor.end()\n resolve()\n } catch (err) {\n reject(err)\n }\n })\n })\n\n // have this function delegate the results of the extractor\n yield* extractor\n await drained\n extractor.destroy()\n}\n\n/**\n * Given a async iterable of buffers, looks at the header of the file in the\n * first few bytes to see the file type then extracts the contents tries again.\n * If the given iterable of buffers is a tarball then it looks for an ndjson\n * files and returns another iterable of buffers with the contents of the\n * ndjson file\n */\nasync function* maybeExtractNdjson(stream: AsyncIterable<Buffer>): AsyncIterable<Buffer> {\n let buffer = Buffer.alloc(0)\n\n for await (const chunk of stream) {\n buffer = Buffer.concat([buffer, chunk])\n if (buffer.length < HEADER_SIZE) continue\n\n const fileHeader = buffer\n const restOfStream = async function* restOfStream() {\n yield fileHeader\n yield* stream\n }\n\n if (isGzip(fileHeader)) {\n yield* maybeExtractNdjson(extract(restOfStream(), zlib.createGunzip()))\n return\n }\n\n if (isDeflate(fileHeader)) {\n yield* maybeExtractNdjson(extract(restOfStream(), zlib.createDeflate()))\n return\n }\n\n if (isTar(fileHeader)) {\n for await (const entry of extract(restOfStream(), tar.extract())) {\n const filename = path.basename(entry.header.name)\n const extname = path.extname(filename).toLowerCase()\n // ignore hidden and non-ndjson files\n if (extname !== '.ndjson' || filename.startsWith('.')) continue\n\n for await (const ndjsonChunk of entry) yield ndjsonChunk\n return\n }\n }\n\n yield* restOfStream()\n }\n}\n\n/**\n * Takes in an async iterable of buffers from an ndjson file or tarball and\n * returns an async iterable of sanity documents.\n */\nexport async function* extractDocumentsFromNdjsonOrTarball(\n file: AsyncIterable<Buffer>,\n): AsyncIterable<SanityDocument> {\n const lines = readline.createInterface({\n input: Readable.from(maybeExtractNdjson(file)),\n })\n\n for await (const line of lines) {\n const trimmed = line.trim()\n if (trimmed) yield JSON.parse(trimmed) as SanityDocument\n }\n lines.close()\n}\n","import {type MessagePort, type Worker} from 'node:worker_threads'\n\ntype StreamReporter<TPayload = unknown> = {emit: (payload: TPayload) => void; end: () => void}\ntype EventReporter<TPayload = unknown> = (payload: TPayload) => void\ntype EventReceiver<TPayload = unknown> = () => Promise<TPayload>\ntype StreamReceiver<TPayload = unknown> = () => AsyncIterable<TPayload>\n\ntype EventKeys<TWorkerChannel extends WorkerChannel> = {\n [K in keyof TWorkerChannel]: TWorkerChannel[K] extends WorkerChannelEvent<any> ? K : never\n}[keyof TWorkerChannel]\ntype StreamKeys<TWorkerChannel extends WorkerChannel> = {\n [K in keyof TWorkerChannel]: TWorkerChannel[K] extends WorkerChannelStream<any> ? K : never\n}[keyof TWorkerChannel]\n\ntype EventMessage<TPayload = unknown> = {type: 'event'; name: string; payload: TPayload}\ntype StreamEmissionMessage<TPayload = unknown> = {type: 'emission'; name: string; payload: TPayload}\ntype StreamEndMessage = {type: 'end'; name: string}\ntype WorkerChannelMessage = EventMessage | StreamEmissionMessage | StreamEndMessage\n\n/**\n * Represents the definition of a \"worker channel\" to report progress from the\n * worker to the parent. Worker channels can define named events or streams and\n * the worker will report events and streams while the parent will await them.\n * This allows the control flow of the parent to follow the control flow of the\n * worker 1-to-1.\n */\nexport type WorkerChannel<\n TWorkerChannel extends Record<\n string,\n WorkerChannelEvent<unknown> | WorkerChannelStream<unknown>\n > = Record<string, WorkerChannelEvent<unknown> | WorkerChannelStream<unknown>>,\n> = TWorkerChannel\n\nexport type WorkerChannelEvent<TPayload = void> = {type: 'event'; payload: TPayload}\nexport type WorkerChannelStream<TPayload = void> = {type: 'stream'; payload: TPayload}\n\nexport interface WorkerChannelReporter<TWorkerChannel extends WorkerChannel> {\n event: {\n [K in EventKeys<TWorkerChannel>]: TWorkerChannel[K] extends WorkerChannelEvent<infer TPayload>\n ? EventReporter<TPayload>\n : void\n }\n stream: {\n [K in StreamKeys<TWorkerChannel>]: TWorkerChannel[K] extends WorkerChannelStream<infer TPayload>\n ? StreamReporter<TPayload>\n : void\n }\n}\n\nexport interface WorkerChannelReceiver<TWorkerChannel extends WorkerChannel> {\n event: {\n [K in EventKeys<TWorkerChannel>]: TWorkerChannel[K] extends WorkerChannelEvent<infer TPayload>\n ? EventReceiver<TPayload>\n : void\n }\n stream: {\n [K in StreamKeys<TWorkerChannel>]: TWorkerChannel[K] extends WorkerChannelStream<infer TPayload>\n ? StreamReceiver<TPayload>\n : void\n }\n // TODO: good candidate for [Symbol.asyncDispose] when our tooling better supports it\n dispose: () => Promise<number>\n}\n\n/**\n * A simple queue that has two primary methods: `push(message)` and\n * `await next()`. This message queue is used by the \"receiver\" of the worker\n * channel and this class handles buffering incoming messages if the worker is\n * producing faster than the parent as well as returning a promise if there is\n * no message yet in the queue when the parent awaits `next()`.\n */\nclass MessageQueue<T> {\n resolver: ((result: IteratorResult<T>) => void) | null = null\n queue: T[] = []\n\n push(message: T) {\n if (this.resolver) {\n this.resolver({value: message, done: false})\n this.resolver = null\n } else {\n this.queue.push(message)\n }\n }\n\n next(): Promise<IteratorResult<T>> {\n if (this.queue.length) {\n return Promise.resolve({value: this.queue.shift()!, done: false})\n }\n\n return new Promise((resolve) => (this.resolver = resolve))\n }\n\n end() {\n if (this.resolver) {\n this.resolver({value: undefined, done: true})\n }\n }\n}\n\nfunction isWorkerChannelMessage(message: unknown): message is WorkerChannelMessage {\n if (typeof message !== 'object') return false\n if (!message) return false\n if (!('type' in message)) return false\n if (typeof message.type !== 'string') return false\n const types: string[] = ['event', 'emission', 'end'] satisfies WorkerChannelMessage['type'][]\n return types.includes(message.type)\n}\n\n/**\n * Creates a \"worker channel receiver\" that subscribes to incoming messages\n * from the given worker and returns promises for worker channel events and\n * async iterators for worker channel streams.\n */\nexport function createReceiver<TWorkerChannel extends WorkerChannel>(\n worker: Worker,\n): WorkerChannelReceiver<TWorkerChannel> {\n const _events = new Map<string, MessageQueue<EventMessage>>()\n const _streams = new Map<string, MessageQueue<StreamEmissionMessage>>()\n const errors = new MessageQueue<{type: 'error'; error: unknown}>()\n\n const eventQueue = (name: string) => {\n const queue = _events.get(name) ?? new MessageQueue()\n if (!_events.has(name)) _events.set(name, queue)\n return queue\n }\n\n const streamQueue = (name: string) => {\n const queue = _streams.get(name) ?? new MessageQueue()\n if (!_streams.has(name)) _streams.set(name, queue)\n return queue\n }\n\n const handleMessage = (message: unknown) => {\n if (!isWorkerChannelMessage(message)) return\n if (message.type === 'event') eventQueue(message.name).push(message)\n if (message.type === 'emission') streamQueue(message.name).push(message)\n if (message.type === 'end') streamQueue(message.name).end()\n }\n\n const handleError = (error: unknown) => {\n errors.push({type: 'error', error})\n }\n\n worker.addListener('message', handleMessage)\n worker.addListener('error', handleError)\n\n return {\n event: new Proxy({} as WorkerChannelReceiver<TWorkerChannel>['event'], {\n get: (target, name) => {\n if (typeof name !== 'string') return target[name as keyof typeof target]\n\n const eventReceiver: EventReceiver = async () => {\n const {value} = await Promise.race([eventQueue(name).next(), errors.next()])\n if (value.type === 'error') throw value.error\n return value.payload\n }\n\n return eventReceiver\n },\n }),\n stream: new Proxy({} as WorkerChannelReceiver<TWorkerChannel>['stream'], {\n get: (target, prop) => {\n if (typeof prop !== 'string') return target[prop as keyof typeof target]\n const name = prop // alias for better typescript narrowing\n\n async function* streamReceiver() {\n while (true) {\n const {value, done} = await Promise.race([streamQueue(name).next(), errors.next()])\n if (done) return\n if (value.type === 'error') throw value.error\n yield value.payload\n }\n }\n\n return streamReceiver satisfies StreamReceiver\n },\n }),\n dispose: () => {\n worker.removeListener('message', handleMessage)\n worker.removeListener('error', handleError)\n return worker.terminate()\n },\n }\n}\n\n/**\n * Creates a \"worker channel reporter\" that sends messages to the given\n * `parentPort` to be received by a worker channel receiver.\n */\nexport function createReporter<TWorkerChannel extends WorkerChannel>(\n parentPort: MessagePort | null,\n): WorkerChannelReporter<TWorkerChannel> {\n if (!parentPort) {\n throw new Error('parentPart was falsy')\n }\n\n return {\n event: new Proxy({} as WorkerChannelReporter<TWorkerChannel>['event'], {\n get: (target, name) => {\n if (typeof name !== 'string') return target[name as keyof typeof target]\n\n const eventReporter: EventReporter = (payload) => {\n const message: EventMessage = {type: 'event', name, payload}\n parentPort.postMessage(message)\n }\n\n return eventReporter\n },\n }),\n stream: new Proxy({} as WorkerChannelReporter<TWorkerChannel>['stream'], {\n get: (target, name) => {\n if (typeof name !== 'string') return target[name as keyof typeof target]\n\n const streamReporter: StreamReporter = {\n emit: (payload) => {\n const message: StreamEmissionMessage = {type: 'emission', name, payload}\n parentPort.postMessage(message)\n },\n end: () => {\n const message: StreamEndMessage = {type: 'end', name}\n parentPort.postMessage(message)\n },\n }\n\n return streamReporter\n },\n }),\n }\n}\n","import fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport readline from 'node:readline'\nimport {Readable} from 'node:stream'\nimport {isMainThread, parentPort, workerData as _workerData} from 'node:worker_threads'\n\nimport {\n type ClientConfig,\n createClient,\n type SanityClient,\n type SanityDocument,\n} from '@sanity/client'\nimport {isReference, type ValidationContext, type ValidationMarker} from '@sanity/types'\nimport {isRecord, validateDocument} from 'sanity'\n\nimport {extractDocumentsFromNdjsonOrTarball} from '../util/extractDocumentsFromNdjsonOrTarball'\nimport {getStudioWorkspaces} from '../util/getStudioWorkspaces'\nimport {mockBrowserEnvironment} from '../util/mockBrowserEnvironment'\nimport {\n createReporter,\n type WorkerChannel,\n type WorkerChannelEvent,\n type WorkerChannelStream,\n} from '../util/workerChannels'\n\nconst MAX_VALIDATION_CONCURRENCY = 100\nconst DOCUMENT_VALIDATION_TIMEOUT = 30000\nconst REFERENCE_INTEGRITY_BATCH_SIZE = 100\n\ninterface AvailabilityResponse {\n omitted: {id: string; reason: 'existence' | 'permission'}[]\n}\n\n/** @internal */\nexport interface ValidateDocumentsWorkerData {\n workDir: string\n configPath?: string\n workspace?: string\n clientConfig?: Partial<ClientConfig>\n projectId?: string\n dataset?: string\n ndjsonFilePath?: string\n level?: ValidationMarker['level']\n maxCustomValidationConcurrency?: number\n maxFetchConcurrency?: number\n studioHost?: string\n}\n\n/** @internal */\nexport type ValidationWorkerChannel = WorkerChannel<{\n loadedWorkspace: WorkerChannelEvent<{\n name: string\n projectId: string\n dataset: string\n basePath: string\n }>\n loadedDocumentCount: WorkerChannelEvent<{documentCount: number}>\n exportProgress: WorkerChannelStream<{downloadedCount: number; documentCount: number}>\n exportFinished: WorkerChannelEvent<{totalDocumentsToValidate: number}>\n loadedReferenceIntegrity: WorkerChannelEvent\n validation: WorkerChannelStream<{\n validatedCount: number\n documentId: string\n documentType: string\n intentUrl?: string\n revision: string\n level: ValidationMarker['level']\n markers: ValidationMarker[]\n }>\n}>\n\nconst {\n clientConfig,\n workDir,\n workspace: workspaceName,\n configPath,\n dataset,\n ndjsonFilePath,\n projectId,\n level,\n maxCustomValidationConcurrency,\n maxFetchConcurrency,\n studioHost,\n} = _workerData as ValidateDocumentsWorkerData\n\nif (isMainThread || !parentPort) {\n throw new Error('This module must be run as a worker thread')\n}\n\nconst levelValues = {error: 0, warning: 1, info: 2} as const\n\nconst report = createReporter<ValidationWorkerChannel>(parentPort)\n\nconst getReferenceIds = (value: unknown) => {\n const ids = new Set<string>()\n\n function traverse(node: unknown) {\n if (isReference(node)) {\n ids.add(node._ref)\n return\n }\n\n if (typeof node === 'object' && node) {\n // Note: this works for arrays too\n for (const item of Object.values(node)) traverse(item)\n }\n }\n\n traverse(value)\n\n return ids\n}\n\nconst idRegex = /^[^-][A-Z0-9._-]*$/i\n\n// during testing, the `doc` endpoint 502'ed if given an invalid ID\nconst isValidId = (id: unknown) => typeof id === 'string' && idRegex.test(id)\nconst shouldIncludeDocument = (document: SanityDocument) => {\n // Filter out system documents\n return !document._type.startsWith('system.')\n}\n\nasync function* readerToGenerator(reader: ReadableStreamDefaultReader<Uint8Array>) {\n while (true) {\n const {value, done} = await reader.read()\n if (value) yield value\n if (done) return\n }\n}\n\nmain().then(() => process.exit())\n\nasync function loadWorkspace() {\n const workspaces = await getStudioWorkspaces({basePath: workDir, configPath})\n\n if (!workspaces.length) {\n throw new Error(`Configuration did not return any workspaces.`)\n }\n\n let _workspace\n if (workspaceName) {\n _workspace = workspaces.find((w) => w.name === workspaceName)\n if (!_workspace) {\n throw new Error(`Could not find any workspaces with name \\`${workspaceName}\\``)\n }\n } else {\n if (workspaces.length !== 1) {\n throw new Error(\n \"Multiple workspaces found. Please specify which workspace to use with '--workspace'.\",\n )\n }\n _workspace = workspaces[0]\n }\n const workspace = _workspace\n\n const client = createClient({\n ...clientConfig,\n dataset: dataset || workspace.dataset,\n projectId: projectId || workspace.projectId,\n requestTagPrefix: 'sanity.cli.validate',\n }).config({apiVersion: 'v2021-03-25'})\n\n report.event.loadedWorkspace({\n projectId: workspace.projectId,\n dataset: workspace.dataset,\n name: workspace.name,\n basePath: workspace.basePath,\n })\n\n return {workspace, client}\n}\n\nasync function downloadFromExport(client: SanityClient) {\n const exportUrl = new URL(client.getUrl(`/data/export/${client.config().dataset}`, false))\n\n const documentCount = await client.fetch('length(*)')\n report.event.loadedDocumentCount({documentCount})\n\n const {token} = client.config()\n const response = await fetch(exportUrl, {\n headers: new Headers({...(token && {Authorization: `Bearer ${token}`})}),\n })\n\n const reader = response.body?.getReader()\n if (!reader) throw new Error('Could not get reader from response body.')\n\n let downloadedCount = 0\n const referencedIds = new Set<string>()\n const documentIds = new Set<string>()\n const lines = readline.createInterface({input: Readable.from(readerToGenerator(reader))})\n\n // Note: we stream the export to a file and then re-read from that file to\n // make this less memory intensive.\n // this is a similar pattern to the import/export CLI commands\n const slugDate = new Date()\n .toISOString()\n .replace(/[^a-z0-9]/gi, '-')\n .toLowerCase()\n const tempOutputFile = path.join(os.tmpdir(), `sanity-validate-${slugDate}.ndjson`)\n const outputStream = fs.createWriteStream(tempOutputFile)\n\n for await (const line of lines) {\n const document = JSON.parse(line) as SanityDocument\n\n if (shouldIncludeDocument(document)) {\n documentIds.add(document._id)\n for (const referenceId of getReferenceIds(document)) {\n referencedIds.add(referenceId)\n }\n\n outputStream.write(`${line}\\n`)\n }\n\n downloadedCount++\n report.stream.exportProgress.emit({downloadedCount, documentCount})\n }\n\n await new Promise<void>((resolve, reject) =>\n outputStream.close((err) => (err ? reject(err) : resolve())),\n )\n\n report.stream.exportProgress.end()\n report.event.exportFinished({totalDocumentsToValidate: documentIds.size})\n\n const getDocuments = () =>\n extractDocumentsFromNdjsonOrTarball(fs.createReadStream(tempOutputFile))\n\n return {documentIds, referencedIds, getDocuments, cleanup: () => fs.promises.rm(tempOutputFile)}\n}\n\nasync function downloadFromFile(filePath: string) {\n const referencedIds = new Set<string>()\n const documentIds = new Set<string>()\n const getDocuments = () => extractDocumentsFromNdjsonOrTarball(fs.createReadStream(filePath))\n\n for await (const document of getDocuments()) {\n if (shouldIncludeDocument(document)) {\n documentIds.add(document._id)\n for (const referenceId of getReferenceIds(document)) {\n referencedIds.add(referenceId)\n }\n }\n }\n\n report.event.exportFinished({totalDocumentsToValidate: documentIds.size})\n\n return {documentIds, referencedIds, getDocuments, cleanup: undefined}\n}\n\ninterface CheckReferenceExistenceOptions {\n client: SanityClient\n referencedIds: Set<string>\n documentIds: Set<string>\n}\n\nasync function checkReferenceExistence({\n client,\n documentIds,\n referencedIds: _referencedIds,\n}: CheckReferenceExistenceOptions) {\n const existingIds = new Set(documentIds)\n const idsToCheck = Array.from(_referencedIds)\n .filter((id) => !existingIds.has(id) && isValidId(id))\n .sort()\n\n const batches = idsToCheck.reduce<string[][]>(\n (acc, next, index) => {\n const batchIndex = Math.floor(index / REFERENCE_INTEGRITY_BATCH_SIZE)\n const batch = acc[batchIndex]\n batch.push(next)\n return acc\n },\n Array.from<string[]>({\n length: Math.ceil(idsToCheck.length / REFERENCE_INTEGRITY_BATCH_SIZE),\n }).map(() => []),\n )\n\n for (const batch of batches) {\n const {omitted} = await client.request<AvailabilityResponse>({\n uri: client.getDataUrl('doc', batch.join(',')),\n json: true,\n query: {excludeContent: 'true'},\n tag: 'documents-availability',\n })\n\n const omittedIds = omitted.reduce<Record<string, 'existence' | 'permission'>>((acc, next) => {\n acc[next.id] = next.reason\n return acc\n }, {})\n\n for (const id of batch) {\n // unless the document ID is in the `omitted` object explictly due to\n // the reason `'existence'`, then it should exist\n if (omittedIds[id] !== 'existence') {\n existingIds.add(id)\n }\n }\n }\n report.event.loadedReferenceIntegrity()\n\n return {existingIds}\n}\n\nasync function main() {\n // note: this is dynamically imported because this module is ESM only and this\n // file gets compiled to CJS at this time\n const {default: pMap} = await import('p-map')\n\n const cleanupBrowserEnvironment = mockBrowserEnvironment(workDir)\n\n let cleanupDownloadedDocuments: (() => Promise<void>) | undefined\n\n try {\n const {client, workspace} = await loadWorkspace()\n const {documentIds, referencedIds, getDocuments, cleanup} = ndjsonFilePath\n ? await downloadFromFile(ndjsonFilePath)\n : await downloadFromExport(client)\n cleanupDownloadedDocuments = cleanup\n const {existingIds} = await checkReferenceExistence({client, referencedIds, documentIds})\n\n const getClient = <TOptions extends Partial<ClientConfig>>(options: TOptions) =>\n client.withConfig(options)\n\n const getDocumentExists: ValidationContext['getDocumentExists'] = ({id}) =>\n Promise.resolve(existingIds.has(id))\n\n const getLevel = (markers: ValidationMarker[]) => {\n let foundWarning = false\n for (const marker of markers) {\n if (marker.level === 'error') return 'error'\n if (marker.level === 'warning') foundWarning = true\n }\n\n if (foundWarning) return 'warning'\n return 'info'\n }\n\n let validatedCount = 0\n\n const validate = async (document: SanityDocument) => {\n let markers: ValidationMarker[]\n\n try {\n const timeout = Symbol('timeout')\n\n const result = await Promise.race([\n validateDocument({\n document,\n workspace,\n getClient,\n getDocumentExists,\n environment: 'cli',\n maxCustomValidationConcurrency,\n maxFetchConcurrency,\n }),\n new Promise<typeof timeout>((resolve) =>\n setTimeout(() => resolve(timeout), DOCUMENT_VALIDATION_TIMEOUT),\n ),\n ])\n\n if (result === timeout) {\n throw new Error(\n `Document '${document._id}' failed to validate within ${DOCUMENT_VALIDATION_TIMEOUT}ms.`,\n )\n }\n\n markers = result\n // remove deprecated `item` from the marker\n .map(({item, ...marker}) => marker)\n // filter out unwanted levels\n .filter((marker) => {\n const markerValue = levelValues[marker.level]\n const flagLevelValue =\n levelValues[level as keyof typeof levelValues] ?? levelValues.info\n return markerValue <= flagLevelValue\n })\n } catch (err) {\n const errorMessage =\n isRecord(err) && typeof err.message === 'string' ? err.message : 'Unknown error'\n\n const message = `Exception occurred while validating value: ${errorMessage}`\n\n markers = [\n {\n message,\n level: 'error',\n path: [],\n },\n ]\n }\n\n validatedCount++\n\n const intentUrl =\n studioHost &&\n `${studioHost}${path.resolve(\n workspace.basePath,\n `/intent/edit/id=${encodeURIComponent(document._id)};type=${encodeURIComponent(\n document._type,\n )}`,\n )}`\n\n report.stream.validation.emit({\n documentId: document._id,\n documentType: document._type,\n revision: document._rev,\n ...(intentUrl && {intentUrl}),\n markers,\n validatedCount,\n level: getLevel(markers),\n })\n }\n\n await pMap(getDocuments(), validate, {concurrency: MAX_VALIDATION_CONCURRENCY})\n\n report.stream.validation.end()\n } finally {\n await cleanupDownloadedDocuments?.()\n cleanupBrowserEnvironment()\n }\n}\n"],"names":["HEADER_SIZE","isGzip","buf","length","isDeflate","isTar","extract","stream","extractor","drained","Promise","resolve","reject","setTimeout","chunk","write","end","err","destroy","maybeExtractNdjson","buffer","Buffer","alloc","concat","fileHeader","restOfStream","zlib","createGunzip","createDeflate","entry","tar","filename","path","basename","header","name","extname","toLowerCase","startsWith","ndjsonChunk","extractDocumentsFromNdjsonOrTarball","file","lines","readline","createInterface","input","Readable","from","line","trimmed","trim","JSON","parse","close","createReporter","parentPort","Error","event","Proxy","get","target","payload","message","type","postMessage","emit","MAX_VALIDATION_CONCURRENCY","DOCUMENT_VALIDATION_TIMEOUT","REFERENCE_INTEGRITY_BATCH_SIZE","clientConfig","workDir","workspace","workspaceName","configPath","dataset","ndjsonFilePath","projectId","level","maxCustomValidationConcurrency","maxFetchConcurrency","studioHost","_workerData","isMainThread","levelValues","error","warning","info","report","getReferenceIds","value","ids","Set","traverse","node","isReference","add","_ref","item","Object","values","idRegex","isValidId","id","test","shouldIncludeDocument","document","_type","readerToGenerator","reader","done","read","main","then","process","exit","loadWorkspace","workspaces","getStudioWorkspaces","basePath","_workspace","find","w","client","createClient","requestTagPrefix","config","apiVersion","loadedWorkspace","downloadFromExport","exportUrl","URL","getUrl","documentCount","fetch","loadedDocumentCount","token","headers","Headers","Authorization","body","getReader","downloadedCount","referencedIds","documentIds","slugDate","Date","toISOString","replace","tempOutputFile","join","os","tmpdir","outputStream","fs","createWriteStream","_id","referenceId","exportProgress","exportFinished","totalDocumentsToValidate","size","getDocuments","createReadStream","cleanup","promises","rm","downloadFromFile","filePath","undefined","checkReferenceExistence","_referencedIds","existingIds","idsToCheck","Array","filter","has","sort","batches","reduce","acc","next","index","batchIndex","Math","floor","batch","push","ceil","map","omitted","request","uri","getDataUrl","json","query","excludeContent","tag","omittedIds","reason","loadedReferenceIntegrity","default","pMap","cleanupBrowserEnvironment","mockBrowserEnvironment","cleanupDownloadedDocuments","getClient","options","withConfig","getDocumentExists","getLevel","markers","foundWarning","marker","validatedCount","validate","timeout","Symbol","result","race","validateDocument","environment","markerValue","flagLevelValue","isRecord","intentUrl","encodeURIComponent","validation","documentId","documentType","revision","_rev","concurrency"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"validateDocuments.js","sources":["../../../../src/_internal/cli/util/extractDocumentsFromNdjsonOrTarball.ts","../../../../src/_internal/cli/util/workerChannels.ts","../../../../src/_internal/cli/threads/validateDocuments.ts"],"sourcesContent":["import path from 'node:path'\nimport readline from 'node:readline'\nimport {Readable, type Writable} from 'node:stream'\nimport zlib from 'node:zlib'\n\nimport {type SanityDocument} from '@sanity/types'\nimport tar from 'tar-stream'\n\nconst HEADER_SIZE = 300\n\n// https://github.com/kevva/is-gzip/blob/13dab7c877787bd5cff9de5482b1736f00df99c6/index.js\nconst isGzip = (buf: Buffer) =>\n buf.length >= 3 && buf[0] === 0x1f && buf[1] === 0x8b && buf[2] === 0x08\n\n// https://github.com/watson/is-deflate/blob/f9e8f0c7814eed715e13e29e97c69acee319686a/index.js\nconst isDeflate = (buf: Buffer) =>\n buf.length >= 2 && buf[0] === 0x78 && (buf[1] === 1 || buf[1] === 0x9c || buf[1] === 0xda)\n\n// https://github.com/kevva/is-tar/blob/d295ffa2002a5d415946fc3d49f024ace8c28bd3/index.js\nconst isTar = (buf: Buffer) =>\n buf.length >= 262 &&\n buf[257] === 0x75 &&\n buf[258] === 0x73 &&\n buf[259] === 0x74 &&\n buf[260] === 0x61 &&\n buf[261] === 0x72\n\nasync function* extract<TReturn>(\n stream: AsyncIterable<Buffer>,\n extractor: Writable & AsyncIterable<TReturn>,\n) {\n // set up a task to drain the input iterable into the extractor asynchronously\n // before this function delegates to the extractor's iterable (containing the\n // result of the extraction)\n const drained = new Promise<void>((resolve, reject) => {\n // setTimeout is used here to ensure draining occurs after delegation\n setTimeout(async () => {\n try {\n for await (const chunk of stream) extractor.write(chunk)\n extractor.end()\n resolve()\n } catch (err) {\n reject(err)\n }\n })\n })\n\n // have this function delegate the results of the extractor\n yield* extractor\n await drained\n extractor.destroy()\n}\n\n/**\n * Given a async iterable of buffers, looks at the header of the file in the\n * first few bytes to see the file type then extracts the contents tries again.\n * If the given iterable of buffers is a tarball then it looks for an ndjson\n * files and returns another iterable of buffers with the contents of the\n * ndjson file\n */\nasync function* maybeExtractNdjson(stream: AsyncIterable<Buffer>): AsyncIterable<Buffer> {\n let buffer = Buffer.alloc(0)\n\n for await (const chunk of stream) {\n buffer = Buffer.concat([buffer, chunk])\n if (buffer.length < HEADER_SIZE) continue\n\n const fileHeader = buffer\n const restOfStream = async function* restOfStream() {\n yield fileHeader\n yield* stream\n }\n\n if (isGzip(fileHeader)) {\n yield* maybeExtractNdjson(extract(restOfStream(), zlib.createGunzip()))\n return\n }\n\n if (isDeflate(fileHeader)) {\n yield* maybeExtractNdjson(extract(restOfStream(), zlib.createDeflate()))\n return\n }\n\n if (isTar(fileHeader)) {\n for await (const entry of extract(restOfStream(), tar.extract())) {\n const filename = path.basename(entry.header.name)\n const extname = path.extname(filename).toLowerCase()\n // ignore hidden and non-ndjson files\n if (extname !== '.ndjson' || filename.startsWith('.')) continue\n\n for await (const ndjsonChunk of entry) yield ndjsonChunk\n return\n }\n }\n\n yield* restOfStream()\n }\n}\n\n/**\n * Takes in an async iterable of buffers from an ndjson file or tarball and\n * returns an async iterable of sanity documents.\n */\nexport async function* extractDocumentsFromNdjsonOrTarball(\n file: AsyncIterable<Buffer>,\n): AsyncIterable<SanityDocument> {\n const lines = readline.createInterface({\n input: Readable.from(maybeExtractNdjson(file)),\n })\n\n for await (const line of lines) {\n const trimmed = line.trim()\n if (trimmed) yield JSON.parse(trimmed) as SanityDocument\n }\n lines.close()\n}\n","import {type MessagePort, type Worker} from 'node:worker_threads'\n\ntype StreamReporter<TPayload = unknown> = {emit: (payload: TPayload) => void; end: () => void}\ntype EventReporter<TPayload = unknown> = (payload: TPayload) => void\ntype EventReceiver<TPayload = unknown> = () => Promise<TPayload>\ntype StreamReceiver<TPayload = unknown> = () => AsyncIterable<TPayload>\n\ntype EventKeys<TWorkerChannel extends WorkerChannel> = {\n [K in keyof TWorkerChannel]: TWorkerChannel[K] extends WorkerChannelEvent<any> ? K : never\n}[keyof TWorkerChannel]\ntype StreamKeys<TWorkerChannel extends WorkerChannel> = {\n [K in keyof TWorkerChannel]: TWorkerChannel[K] extends WorkerChannelStream<any> ? K : never\n}[keyof TWorkerChannel]\n\ntype EventMessage<TPayload = unknown> = {type: 'event'; name: string; payload: TPayload}\ntype StreamEmissionMessage<TPayload = unknown> = {type: 'emission'; name: string; payload: TPayload}\ntype StreamEndMessage = {type: 'end'; name: string}\ntype WorkerChannelMessage = EventMessage | StreamEmissionMessage | StreamEndMessage\n\n/**\n * Represents the definition of a \"worker channel\" to report progress from the\n * worker to the parent. Worker channels can define named events or streams and\n * the worker will report events and streams while the parent will await them.\n * This allows the control flow of the parent to follow the control flow of the\n * worker 1-to-1.\n */\nexport type WorkerChannel<\n TWorkerChannel extends Record<\n string,\n WorkerChannelEvent<unknown> | WorkerChannelStream<unknown>\n > = Record<string, WorkerChannelEvent<unknown> | WorkerChannelStream<unknown>>,\n> = TWorkerChannel\n\nexport type WorkerChannelEvent<TPayload = void> = {type: 'event'; payload: TPayload}\nexport type WorkerChannelStream<TPayload = void> = {type: 'stream'; payload: TPayload}\n\nexport interface WorkerChannelReporter<TWorkerChannel extends WorkerChannel> {\n event: {\n [K in EventKeys<TWorkerChannel>]: TWorkerChannel[K] extends WorkerChannelEvent<infer TPayload>\n ? EventReporter<TPayload>\n : void\n }\n stream: {\n [K in StreamKeys<TWorkerChannel>]: TWorkerChannel[K] extends WorkerChannelStream<infer TPayload>\n ? StreamReporter<TPayload>\n : void\n }\n}\n\nexport interface WorkerChannelReceiver<TWorkerChannel extends WorkerChannel> {\n event: {\n [K in EventKeys<TWorkerChannel>]: TWorkerChannel[K] extends WorkerChannelEvent<infer TPayload>\n ? EventReceiver<TPayload>\n : void\n }\n stream: {\n [K in StreamKeys<TWorkerChannel>]: TWorkerChannel[K] extends WorkerChannelStream<infer TPayload>\n ? StreamReceiver<TPayload>\n : void\n }\n // TODO: good candidate for [Symbol.asyncDispose] when our tooling better supports it\n dispose: () => Promise<number>\n}\n\n/**\n * A simple queue that has two primary methods: `push(message)` and\n * `await next()`. This message queue is used by the \"receiver\" of the worker\n * channel and this class handles buffering incoming messages if the worker is\n * producing faster than the parent as well as returning a promise if there is\n * no message yet in the queue when the parent awaits `next()`.\n */\nclass MessageQueue<T> {\n resolver: ((result: IteratorResult<T>) => void) | null = null\n queue: T[] = []\n\n push(message: T) {\n if (this.resolver) {\n this.resolver({value: message, done: false})\n this.resolver = null\n } else {\n this.queue.push(message)\n }\n }\n\n next(): Promise<IteratorResult<T>> {\n if (this.queue.length) {\n return Promise.resolve({value: this.queue.shift()!, done: false})\n }\n\n return new Promise((resolve) => (this.resolver = resolve))\n }\n\n end() {\n if (this.resolver) {\n this.resolver({value: undefined, done: true})\n }\n }\n}\n\nfunction isWorkerChannelMessage(message: unknown): message is WorkerChannelMessage {\n if (typeof message !== 'object') return false\n if (!message) return false\n if (!('type' in message)) return false\n if (typeof message.type !== 'string') return false\n const types: string[] = ['event', 'emission', 'end'] satisfies WorkerChannelMessage['type'][]\n return types.includes(message.type)\n}\n\n/**\n * Creates a \"worker channel receiver\" that subscribes to incoming messages\n * from the given worker and returns promises for worker channel events and\n * async iterators for worker channel streams.\n */\nexport function createReceiver<TWorkerChannel extends WorkerChannel>(\n worker: Worker,\n): WorkerChannelReceiver<TWorkerChannel> {\n const _events = new Map<string, MessageQueue<EventMessage>>()\n const _streams = new Map<string, MessageQueue<StreamEmissionMessage>>()\n const errors = new MessageQueue<{type: 'error'; error: unknown}>()\n\n const eventQueue = (name: string) => {\n const queue = _events.get(name) ?? new MessageQueue()\n if (!_events.has(name)) _events.set(name, queue)\n return queue\n }\n\n const streamQueue = (name: string) => {\n const queue = _streams.get(name) ?? new MessageQueue()\n if (!_streams.has(name)) _streams.set(name, queue)\n return queue\n }\n\n const handleMessage = (message: unknown) => {\n if (!isWorkerChannelMessage(message)) return\n if (message.type === 'event') eventQueue(message.name).push(message)\n if (message.type === 'emission') streamQueue(message.name).push(message)\n if (message.type === 'end') streamQueue(message.name).end()\n }\n\n const handleError = (error: unknown) => {\n errors.push({type: 'error', error})\n }\n\n worker.addListener('message', handleMessage)\n worker.addListener('error', handleError)\n\n return {\n event: new Proxy({} as WorkerChannelReceiver<TWorkerChannel>['event'], {\n get: (target, name) => {\n if (typeof name !== 'string') return target[name as keyof typeof target]\n\n const eventReceiver: EventReceiver = async () => {\n const {value} = await Promise.race([eventQueue(name).next(), errors.next()])\n if (value.type === 'error') throw value.error\n return value.payload\n }\n\n return eventReceiver\n },\n }),\n stream: new Proxy({} as WorkerChannelReceiver<TWorkerChannel>['stream'], {\n get: (target, prop) => {\n if (typeof prop !== 'string') return target[prop as keyof typeof target]\n const name = prop // alias for better typescript narrowing\n\n async function* streamReceiver() {\n while (true) {\n const {value, done} = await Promise.race([streamQueue(name).next(), errors.next()])\n if (done) return\n if (value.type === 'error') throw value.error\n yield value.payload\n }\n }\n\n return streamReceiver satisfies StreamReceiver\n },\n }),\n dispose: () => {\n worker.removeListener('message', handleMessage)\n worker.removeListener('error', handleError)\n return worker.terminate()\n },\n }\n}\n\n/**\n * Creates a \"worker channel reporter\" that sends messages to the given\n * `parentPort` to be received by a worker channel receiver.\n */\nexport function createReporter<TWorkerChannel extends WorkerChannel>(\n parentPort: MessagePort | null,\n): WorkerChannelReporter<TWorkerChannel> {\n if (!parentPort) {\n throw new Error('parentPart was falsy')\n }\n\n return {\n event: new Proxy({} as WorkerChannelReporter<TWorkerChannel>['event'], {\n get: (target, name) => {\n if (typeof name !== 'string') return target[name as keyof typeof target]\n\n const eventReporter: EventReporter = (payload) => {\n const message: EventMessage = {type: 'event', name, payload}\n parentPort.postMessage(message)\n }\n\n return eventReporter\n },\n }),\n stream: new Proxy({} as WorkerChannelReporter<TWorkerChannel>['stream'], {\n get: (target, name) => {\n if (typeof name !== 'string') return target[name as keyof typeof target]\n\n const streamReporter: StreamReporter = {\n emit: (payload) => {\n const message: StreamEmissionMessage = {type: 'emission', name, payload}\n parentPort.postMessage(message)\n },\n end: () => {\n const message: StreamEndMessage = {type: 'end', name}\n parentPort.postMessage(message)\n },\n }\n\n return streamReporter\n },\n }),\n }\n}\n","import fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport readline from 'node:readline'\nimport {Readable} from 'node:stream'\nimport {isMainThread, parentPort, workerData as _workerData} from 'node:worker_threads'\n\nimport {\n type ClientConfig,\n createClient,\n type SanityClient,\n type SanityDocument,\n} from '@sanity/client'\nimport {isReference, type ValidationContext, type ValidationMarker} from '@sanity/types'\nimport {isRecord, validateDocument} from 'sanity'\n\nimport {extractDocumentsFromNdjsonOrTarball} from '../util/extractDocumentsFromNdjsonOrTarball'\nimport {getStudioWorkspaces} from '../util/getStudioWorkspaces'\nimport {mockBrowserEnvironment} from '../util/mockBrowserEnvironment'\nimport {\n createReporter,\n type WorkerChannel,\n type WorkerChannelEvent,\n type WorkerChannelStream,\n} from '../util/workerChannels'\n\nconst MAX_VALIDATION_CONCURRENCY = 100\nconst DOCUMENT_VALIDATION_TIMEOUT = 30000\nconst REFERENCE_INTEGRITY_BATCH_SIZE = 100\n\ninterface AvailabilityResponse {\n omitted: {id: string; reason: 'existence' | 'permission'}[]\n}\n\n/** @internal */\nexport interface ValidateDocumentsWorkerData {\n workDir: string\n configPath?: string\n workspace?: string\n clientConfig?: Partial<ClientConfig>\n projectId?: string\n dataset?: string\n ndjsonFilePath?: string\n level?: ValidationMarker['level']\n maxCustomValidationConcurrency?: number\n maxFetchConcurrency?: number\n studioHost?: string\n}\n\n/** @internal */\nexport type ValidationWorkerChannel = WorkerChannel<{\n loadedWorkspace: WorkerChannelEvent<{\n name: string\n projectId: string\n dataset: string\n basePath: string\n }>\n loadedDocumentCount: WorkerChannelEvent<{documentCount: number}>\n exportProgress: WorkerChannelStream<{downloadedCount: number; documentCount: number}>\n exportFinished: WorkerChannelEvent<{totalDocumentsToValidate: number}>\n loadedReferenceIntegrity: WorkerChannelEvent\n validation: WorkerChannelStream<{\n validatedCount: number\n documentId: string\n documentType: string\n intentUrl?: string\n revision: string\n level: ValidationMarker['level']\n markers: ValidationMarker[]\n }>\n}>\n\nconst {\n clientConfig,\n workDir,\n workspace: workspaceName,\n configPath,\n dataset,\n ndjsonFilePath,\n projectId,\n level,\n maxCustomValidationConcurrency,\n maxFetchConcurrency,\n studioHost,\n} = _workerData as ValidateDocumentsWorkerData\n\nif (isMainThread || !parentPort) {\n throw new Error('This module must be run as a worker thread')\n}\n\nconst levelValues = {error: 0, warning: 1, info: 2} as const\n\nconst report = createReporter<ValidationWorkerChannel>(parentPort)\n\nconst getReferenceIds = (value: unknown) => {\n const ids = new Set<string>()\n\n function traverse(node: unknown) {\n if (isReference(node)) {\n ids.add(node._ref)\n return\n }\n\n if (typeof node === 'object' && node) {\n // Note: this works for arrays too\n for (const item of Object.values(node)) traverse(item)\n }\n }\n\n traverse(value)\n\n return ids\n}\n\nconst idRegex = /^[^-][A-Z0-9._-]*$/i\n\n// during testing, the `doc` endpoint 502'ed if given an invalid ID\nconst isValidId = (id: unknown) => typeof id === 'string' && idRegex.test(id)\nconst shouldIncludeDocument = (document: SanityDocument) => {\n // Filter out system documents and sanity documents\n return !document._type.startsWith('system.') && !document._type.startsWith('sanity.')\n}\n\nasync function* readerToGenerator(reader: ReadableStreamDefaultReader<Uint8Array>) {\n while (true) {\n const {value, done} = await reader.read()\n if (value) yield value\n if (done) return\n }\n}\n\nmain().then(() => process.exit())\n\nasync function loadWorkspace() {\n const workspaces = await getStudioWorkspaces({basePath: workDir, configPath})\n\n if (!workspaces.length) {\n throw new Error(`Configuration did not return any workspaces.`)\n }\n\n let _workspace\n if (workspaceName) {\n _workspace = workspaces.find((w) => w.name === workspaceName)\n if (!_workspace) {\n throw new Error(`Could not find any workspaces with name \\`${workspaceName}\\``)\n }\n } else {\n if (workspaces.length !== 1) {\n throw new Error(\n \"Multiple workspaces found. Please specify which workspace to use with '--workspace'.\",\n )\n }\n _workspace = workspaces[0]\n }\n const workspace = _workspace\n\n const client = createClient({\n ...clientConfig,\n dataset: dataset || workspace.dataset,\n projectId: projectId || workspace.projectId,\n requestTagPrefix: 'sanity.cli.validate',\n }).config({apiVersion: 'v2021-03-25'})\n\n report.event.loadedWorkspace({\n projectId: workspace.projectId,\n dataset: workspace.dataset,\n name: workspace.name,\n basePath: workspace.basePath,\n })\n\n return {workspace, client}\n}\n\nasync function downloadFromExport(client: SanityClient) {\n const exportUrl = new URL(client.getUrl(`/data/export/${client.config().dataset}`, false))\n\n const documentCount = await client.fetch('length(*)')\n report.event.loadedDocumentCount({documentCount})\n\n const {token} = client.config()\n const response = await fetch(exportUrl, {\n headers: new Headers({...(token && {Authorization: `Bearer ${token}`})}),\n })\n\n const reader = response.body?.getReader()\n if (!reader) throw new Error('Could not get reader from response body.')\n\n let downloadedCount = 0\n const referencedIds = new Set<string>()\n const documentIds = new Set<string>()\n const lines = readline.createInterface({input: Readable.from(readerToGenerator(reader))})\n\n // Note: we stream the export to a file and then re-read from that file to\n // make this less memory intensive.\n // this is a similar pattern to the import/export CLI commands\n const slugDate = new Date()\n .toISOString()\n .replace(/[^a-z0-9]/gi, '-')\n .toLowerCase()\n const tempOutputFile = path.join(os.tmpdir(), `sanity-validate-${slugDate}.ndjson`)\n const outputStream = fs.createWriteStream(tempOutputFile)\n\n for await (const line of lines) {\n const document = JSON.parse(line) as SanityDocument\n\n if (shouldIncludeDocument(document)) {\n documentIds.add(document._id)\n for (const referenceId of getReferenceIds(document)) {\n referencedIds.add(referenceId)\n }\n\n outputStream.write(`${line}\\n`)\n }\n\n downloadedCount++\n report.stream.exportProgress.emit({downloadedCount, documentCount})\n }\n\n await new Promise<void>((resolve, reject) =>\n outputStream.close((err) => (err ? reject(err) : resolve())),\n )\n\n report.stream.exportProgress.end()\n report.event.exportFinished({totalDocumentsToValidate: documentIds.size})\n\n const getDocuments = () =>\n extractDocumentsFromNdjsonOrTarball(fs.createReadStream(tempOutputFile))\n\n return {documentIds, referencedIds, getDocuments, cleanup: () => fs.promises.rm(tempOutputFile)}\n}\n\nasync function downloadFromFile(filePath: string) {\n const referencedIds = new Set<string>()\n const documentIds = new Set<string>()\n const getDocuments = () => extractDocumentsFromNdjsonOrTarball(fs.createReadStream(filePath))\n\n for await (const document of getDocuments()) {\n if (shouldIncludeDocument(document)) {\n documentIds.add(document._id)\n for (const referenceId of getReferenceIds(document)) {\n referencedIds.add(referenceId)\n }\n }\n }\n\n report.event.exportFinished({totalDocumentsToValidate: documentIds.size})\n\n return {documentIds, referencedIds, getDocuments, cleanup: undefined}\n}\n\ninterface CheckReferenceExistenceOptions {\n client: SanityClient\n referencedIds: Set<string>\n documentIds: Set<string>\n}\n\nasync function checkReferenceExistence({\n client,\n documentIds,\n referencedIds: _referencedIds,\n}: CheckReferenceExistenceOptions) {\n const existingIds = new Set(documentIds)\n const idsToCheck = Array.from(_referencedIds)\n .filter((id) => !existingIds.has(id) && isValidId(id))\n .sort()\n\n const batches = idsToCheck.reduce<string[][]>(\n (acc, next, index) => {\n const batchIndex = Math.floor(index / REFERENCE_INTEGRITY_BATCH_SIZE)\n const batch = acc[batchIndex]\n batch.push(next)\n return acc\n },\n Array.from<string[]>({\n length: Math.ceil(idsToCheck.length / REFERENCE_INTEGRITY_BATCH_SIZE),\n }).map(() => []),\n )\n\n for (const batch of batches) {\n const {omitted} = await client.request<AvailabilityResponse>({\n uri: client.getDataUrl('doc', batch.join(',')),\n json: true,\n query: {excludeContent: 'true'},\n tag: 'documents-availability',\n })\n\n const omittedIds = omitted.reduce<Record<string, 'existence' | 'permission'>>((acc, next) => {\n acc[next.id] = next.reason\n return acc\n }, {})\n\n for (const id of batch) {\n // unless the document ID is in the `omitted` object explictly due to\n // the reason `'existence'`, then it should exist\n if (omittedIds[id] !== 'existence') {\n existingIds.add(id)\n }\n }\n }\n report.event.loadedReferenceIntegrity()\n\n return {existingIds}\n}\n\nasync function main() {\n // note: this is dynamically imported because this module is ESM only and this\n // file gets compiled to CJS at this time\n const {default: pMap} = await import('p-map')\n\n const cleanupBrowserEnvironment = mockBrowserEnvironment(workDir)\n\n let cleanupDownloadedDocuments: (() => Promise<void>) | undefined\n\n try {\n const {client, workspace} = await loadWorkspace()\n const {documentIds, referencedIds, getDocuments, cleanup} = ndjsonFilePath\n ? await downloadFromFile(ndjsonFilePath)\n : await downloadFromExport(client)\n cleanupDownloadedDocuments = cleanup\n const {existingIds} = await checkReferenceExistence({client, referencedIds, documentIds})\n\n const getClient = <TOptions extends Partial<ClientConfig>>(options: TOptions) =>\n client.withConfig(options)\n\n const getDocumentExists: ValidationContext['getDocumentExists'] = ({id}) =>\n Promise.resolve(existingIds.has(id))\n\n const getLevel = (markers: ValidationMarker[]) => {\n let foundWarning = false\n for (const marker of markers) {\n if (marker.level === 'error') return 'error'\n if (marker.level === 'warning') foundWarning = true\n }\n\n if (foundWarning) return 'warning'\n return 'info'\n }\n\n let validatedCount = 0\n\n const validate = async (document: SanityDocument) => {\n let markers: ValidationMarker[]\n\n try {\n const timeout = Symbol('timeout')\n\n const result = await Promise.race([\n validateDocument({\n document,\n workspace,\n getClient,\n getDocumentExists,\n environment: 'cli',\n maxCustomValidationConcurrency,\n maxFetchConcurrency,\n }),\n new Promise<typeof timeout>((resolve) =>\n setTimeout(() => resolve(timeout), DOCUMENT_VALIDATION_TIMEOUT),\n ),\n ])\n\n if (result === timeout) {\n throw new Error(\n `Document '${document._id}' failed to validate within ${DOCUMENT_VALIDATION_TIMEOUT}ms.`,\n )\n }\n\n markers = result\n // remove deprecated `item` from the marker\n .map(({item, ...marker}) => marker)\n // filter out unwanted levels\n .filter((marker) => {\n const markerValue = levelValues[marker.level]\n const flagLevelValue =\n levelValues[level as keyof typeof levelValues] ?? levelValues.info\n return markerValue <= flagLevelValue\n })\n } catch (err) {\n const errorMessage =\n isRecord(err) && typeof err.message === 'string' ? err.message : 'Unknown error'\n\n const message = `Exception occurred while validating value: ${errorMessage}`\n\n markers = [\n {\n message,\n level: 'error',\n path: [],\n },\n ]\n }\n\n validatedCount++\n\n const intentUrl =\n studioHost &&\n `${studioHost}${path.resolve(\n workspace.basePath,\n `/intent/edit/id=${encodeURIComponent(document._id)};type=${encodeURIComponent(\n document._type,\n )}`,\n )}`\n\n report.stream.validation.emit({\n documentId: document._id,\n documentType: document._type,\n revision: document._rev,\n ...(intentUrl && {intentUrl}),\n markers,\n validatedCount,\n level: getLevel(markers),\n })\n }\n\n await pMap(getDocuments(), validate, {concurrency: MAX_VALIDATION_CONCURRENCY})\n\n report.stream.validation.end()\n } finally {\n await cleanupDownloadedDocuments?.()\n cleanupBrowserEnvironment()\n }\n}\n"],"names":["HEADER_SIZE","isGzip","buf","length","isDeflate","isTar","extract","stream","extractor","drained","Promise","resolve","reject","setTimeout","chunk","write","end","err","destroy","maybeExtractNdjson","buffer","Buffer","alloc","concat","fileHeader","restOfStream","zlib","createGunzip","createDeflate","entry","tar","filename","path","basename","header","name","extname","toLowerCase","startsWith","ndjsonChunk","extractDocumentsFromNdjsonOrTarball","file","lines","readline","createInterface","input","Readable","from","line","trimmed","trim","JSON","parse","close","createReporter","parentPort","Error","event","Proxy","get","target","payload","message","type","postMessage","emit","MAX_VALIDATION_CONCURRENCY","DOCUMENT_VALIDATION_TIMEOUT","REFERENCE_INTEGRITY_BATCH_SIZE","clientConfig","workDir","workspace","workspaceName","configPath","dataset","ndjsonFilePath","projectId","level","maxCustomValidationConcurrency","maxFetchConcurrency","studioHost","_workerData","isMainThread","levelValues","error","warning","info","report","getReferenceIds","value","ids","Set","traverse","node","isReference","add","_ref","item","Object","values","idRegex","isValidId","id","test","shouldIncludeDocument","document","_type","readerToGenerator","reader","done","read","main","then","process","exit","loadWorkspace","workspaces","getStudioWorkspaces","basePath","_workspace","find","w","client","createClient","requestTagPrefix","config","apiVersion","loadedWorkspace","downloadFromExport","exportUrl","URL","getUrl","documentCount","fetch","loadedDocumentCount","token","headers","Headers","Authorization","body","getReader","downloadedCount","referencedIds","documentIds","slugDate","Date","toISOString","replace","tempOutputFile","join","os","tmpdir","outputStream","fs","createWriteStream","_id","referenceId","exportProgress","exportFinished","totalDocumentsToValidate","size","getDocuments","createReadStream","cleanup","promises","rm","downloadFromFile","filePath","undefined","checkReferenceExistence","_referencedIds","existingIds","idsToCheck","Array","filter","has","sort","batches","reduce","acc","next","index","batchIndex","Math","floor","batch","push","ceil","map","omitted","request","uri","getDataUrl","json","query","excludeContent","tag","omittedIds","reason","loadedReferenceIntegrity","default","pMap","cleanupBrowserEnvironment","mockBrowserEnvironment","cleanupDownloadedDocuments","getClient","options","withConfig","getDocumentExists","getLevel","markers","foundWarning","marker","validatedCount","validate","timeout","Symbol","result","race","validateDocument","environment","markerValue","flagLevelValue","isRecord","intentUrl","encodeURIComponent","validation","documentId","documentType","revision","_rev","concurrency"],"mappings":"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"}
|