@tutti-os/workspace-file-reference 0.0.13 → 0.0.15
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/dist/chunk-HRC2MZ5H.js +393 -0
- package/dist/chunk-HRC2MZ5H.js.map +1 -0
- package/dist/{chunk-LS7P3J6Z.js → chunk-KSK6PILG.js} +661 -14
- package/dist/chunk-KSK6PILG.js.map +1 -0
- package/dist/contracts/index.d.ts +167 -1
- package/dist/core/index.d.ts +152 -2
- package/dist/core/index.js +37 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +37 -1
- package/dist/react/index.d.ts +134 -2
- package/dist/react/index.js +6 -2
- package/dist/referenceSourceAggregator-B8ATnJOZ.d.ts +47 -0
- package/dist/ui/index.d.ts +42 -3
- package/dist/ui/index.js +1507 -94
- package/dist/ui/index.js.map +1 -1
- package/package.json +6 -5
- package/dist/chunk-LS7P3J6Z.js.map +0 -1
- package/dist/chunk-PAR2R2G5.js +0 -23
- package/dist/chunk-PAR2R2G5.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/internal/reference/WorkspaceFileReferencePickerState.ts","../src/react/internal/reference/useWorkspaceFileReferencePickerView.ts","../src/react/internal/reference/WorkspaceFileReferencePickerController.ts"],"sourcesContent":["import type {\n WorkspaceFileReference,\n WorkspaceFileReferencePrefetchReason,\n WorkspaceFileReferencePrefetchState,\n WorkspaceFileReferenceTreeSnapshot\n} from \"../../../contracts/index.ts\";\n\nexport const workspaceFileReferenceDefaultExpandedDepth = 4;\n\nexport interface WorkspaceFileReferenceDirectoryState {\n displayPath: string;\n entries: WorkspaceFileReference[];\n loaded: boolean;\n loading: boolean;\n prefetchReason?: WorkspaceFileReferencePrefetchReason | null;\n prefetchState?: WorkspaceFileReferencePrefetchState | null;\n}\n\nexport function normalizeDirectoryPath(path: string): string {\n if (!path || path === \"/\") {\n return \"/\";\n }\n return path.replace(/\\/+$/, \"\") || \"/\";\n}\n\nexport function collectVisibleTreeEntries(\n entries: readonly WorkspaceFileReference[],\n directoryStateByPath: Record<string, WorkspaceFileReferenceDirectoryState>,\n expandedFolderPaths: Record<string, boolean>\n): WorkspaceFileReference[] {\n const collected: WorkspaceFileReference[] = [];\n\n for (const entry of entries) {\n collected.push(entry);\n if (entry.kind !== \"folder\") {\n continue;\n }\n const folderKey = normalizeDirectoryPath(entry.path);\n if (!expandedFolderPaths[folderKey]) {\n continue;\n }\n const childEntries = directoryStateByPath[folderKey]?.entries ?? [];\n if (childEntries.length === 0) {\n continue;\n }\n collected.push(\n ...collectVisibleTreeEntries(\n childEntries,\n directoryStateByPath,\n expandedFolderPaths\n )\n );\n }\n\n return collected;\n}\n\nexport function mergeExpandedFolderPaths(\n current: Record<string, boolean>,\n prefetched: Record<string, boolean>\n): Record<string, boolean> {\n return {\n ...prefetched,\n ...current\n };\n}\n\nexport function mergePrefetchedDirectoryState(\n current: Record<string, WorkspaceFileReferenceDirectoryState>,\n prefetched: Record<string, WorkspaceFileReferenceDirectoryState>\n): Record<string, WorkspaceFileReferenceDirectoryState> {\n return {\n ...current,\n ...prefetched\n };\n}\n\nexport function createWorkspaceFileReferenceDirectoryStateFromSnapshot(\n snapshot: WorkspaceFileReferenceTreeSnapshot\n): Record<string, WorkspaceFileReferenceDirectoryState> {\n const stateByPath: Record<string, WorkspaceFileReferenceDirectoryState> = {};\n addReferenceDirectoryStateFromSnapshot(stateByPath, snapshot.directory);\n return stateByPath;\n}\n\nfunction addReferenceDirectoryStateFromSnapshot(\n stateByPath: Record<string, WorkspaceFileReferenceDirectoryState>,\n directory: WorkspaceFileReferenceTreeSnapshot[\"directory\"]\n) {\n const normalizedPath = normalizeDirectoryPath(directory.directoryPath);\n stateByPath[normalizedPath] = {\n displayPath: directory.directoryPath,\n entries: directory.entries.map((entry) => ({\n displayName: entry.displayName,\n kind: entry.kind,\n path: entry.path\n })),\n loaded: true,\n loading: false,\n prefetchReason: directory.prefetchReason,\n prefetchState: directory.prefetchState\n };\n\n for (const entry of directory.entries) {\n if (entry.kind !== \"folder\") {\n continue;\n }\n const folderKey = normalizeDirectoryPath(entry.path);\n if (entry.prefetchedDirectory) {\n addReferenceDirectoryStateFromSnapshot(\n stateByPath,\n entry.prefetchedDirectory\n );\n continue;\n }\n if (entry.prefetchState) {\n stateByPath[folderKey] = {\n displayPath: entry.path,\n entries: [],\n loaded: false,\n loading: false,\n prefetchReason: entry.prefetchReason,\n prefetchState: entry.prefetchState\n };\n }\n }\n}\n\nexport async function prefetchReferenceTree(input: {\n listDirectory: (path: string) => Promise<{\n displayPath: string;\n entries: WorkspaceFileReference[];\n normalizedPath: string;\n } | null>;\n maxDepth: number;\n path: string;\n depth?: number;\n}): Promise<{\n directoryStateByPath: Record<string, WorkspaceFileReferenceDirectoryState>;\n expandedFolderPaths: Record<string, boolean>;\n}> {\n const { depth = 1, listDirectory, maxDepth, path } = input;\n const listing = await listDirectory(path);\n if (!listing) {\n return {\n directoryStateByPath: {},\n expandedFolderPaths: {}\n };\n }\n\n const directoryStateByPath: Record<\n string,\n WorkspaceFileReferenceDirectoryState\n > = {\n [listing.normalizedPath]: {\n displayPath: listing.displayPath,\n entries: listing.entries,\n loaded: true,\n loading: false\n }\n };\n const expandedFolderPaths: Record<string, boolean> = {\n [listing.normalizedPath]: true\n };\n\n if (depth >= maxDepth) {\n return {\n directoryStateByPath,\n expandedFolderPaths\n };\n }\n\n for (const entry of listing.entries) {\n if (entry.kind !== \"folder\") {\n continue;\n }\n try {\n const childTree = await prefetchReferenceTree({\n depth: depth + 1,\n listDirectory,\n maxDepth,\n path: entry.path\n });\n Object.assign(directoryStateByPath, childTree.directoryStateByPath);\n Object.assign(expandedFolderPaths, childTree.expandedFolderPaths);\n } catch {\n // Skip unreadable branches so one protected folder does not blank the whole tree.\n }\n }\n\n return {\n directoryStateByPath,\n expandedFolderPaths\n };\n}\n","import {\n useCallback,\n useEffect,\n useEffectEvent,\n useMemo,\n useState\n} from \"react\";\nimport { useSnapshot } from \"valtio\";\nimport type {\n WorkspaceFileReferenceAdapter,\n WorkspaceFileReference\n} from \"../../../contracts/index.ts\";\nimport { uniqueWorkspaceFileReferences } from \"../../../core/index.ts\";\nimport {\n collectVisibleTreeEntries,\n normalizeDirectoryPath\n} from \"./WorkspaceFileReferencePickerState.ts\";\nimport {\n createWorkspaceFileReferencePickerController,\n type WorkspaceFileReferencePreviewState\n} from \"./WorkspaceFileReferencePickerController.ts\";\n\nexport type { WorkspaceFileReferencePreviewState };\n\nexport interface UseWorkspaceFileReferencePickerViewInput {\n fileAdapter?: WorkspaceFileReferenceAdapter;\n initialPath?: string | null;\n onClose: () => void;\n onConfirm: (refs: WorkspaceFileReference[]) => void;\n open: boolean;\n workspaceId: string;\n}\n\nexport function useWorkspaceFileReferencePickerView({\n fileAdapter,\n initialPath,\n onClose,\n onConfirm,\n open,\n workspaceId\n}: UseWorkspaceFileReferencePickerViewInput) {\n const readPickerSnapshot = useSnapshot as <T extends object>(store: T) => T;\n const trimmedInitialPath = initialPath?.trim() ?? \"\";\n const initialDirectoryPath = trimmedInitialPath\n ? normalizeDirectoryPath(trimmedInitialPath)\n : null;\n const [focusedPath, setFocusedPath] = useState<string | null>(null);\n const [selectedRefs, setSelectedRefs] = useState<WorkspaceFileReference[]>(\n []\n );\n\n const pickerController = useMemo(\n () =>\n createWorkspaceFileReferencePickerController({\n fileAdapter,\n workspaceId\n }),\n [fileAdapter, workspaceId]\n );\n const pickerSnapshot = readPickerSnapshot(pickerController.store);\n const {\n browseRootPath,\n directoryStateByPath,\n expandedFolderPaths,\n isBrowseLoading,\n isSearchLoading,\n mode,\n previewState,\n searchEntries,\n searchQuery\n } = pickerSnapshot;\n const isLoading = mode === \"search\" ? isSearchLoading : isBrowseLoading;\n\n const finalizeRequestedReferences = useEffectEvent(\n (refs: WorkspaceFileReference[]) => {\n onConfirm(uniqueWorkspaceFileReferences(refs));\n onClose();\n }\n );\n\n const setSearchQuery = useCallback(\n (query: string) => {\n pickerController.setSearchQuery(query);\n },\n [pickerController]\n );\n\n useEffect(() => {\n if (!open) {\n return;\n }\n\n pickerController.reset();\n pickerController.open();\n setFocusedPath(null);\n setSelectedRefs([]);\n return () => {\n pickerController.close();\n };\n }, [initialDirectoryPath, open, pickerController]);\n\n useEffect(() => {\n if (!open || mode !== \"browse\") {\n return;\n }\n pickerController.loadBrowseRoot();\n }, [mode, open, pickerController]);\n\n useEffect(() => {\n if (!open || !fileAdapter || mode !== \"browse\") {\n return;\n }\n if (\n fileAdapter.listDirectory ||\n fileAdapter.loadReferenceTree ||\n !fileAdapter.requestReferences\n ) {\n return;\n }\n let canceled = false;\n void fileAdapter.requestReferences({ workspaceId }).then((refs) => {\n if (!canceled) {\n finalizeRequestedReferences(refs);\n }\n });\n return () => {\n canceled = true;\n };\n }, [fileAdapter, finalizeRequestedReferences, mode, open, workspaceId]);\n\n useEffect(() => {\n if (\n !open ||\n mode !== \"browse\" ||\n pickerSnapshot.initialPathRevealed ||\n !initialDirectoryPath ||\n !browseRootPath\n ) {\n return;\n }\n\n let canceled = false;\n const reveal = async () => {\n const focusedInitialPath =\n await pickerController.revealInitialPath(initialDirectoryPath);\n if (!canceled && focusedInitialPath) {\n setFocusedPath(focusedInitialPath);\n }\n };\n\n void reveal();\n return () => {\n canceled = true;\n };\n }, [\n browseRootPath,\n initialDirectoryPath,\n mode,\n open,\n pickerController,\n pickerSnapshot.initialPathRevealed\n ]);\n\n const browseRootEntries = useMemo(\n () =>\n browseRootPath\n ? (directoryStateByPath[normalizeDirectoryPath(browseRootPath)]\n ?.entries ?? [])\n : [],\n [browseRootPath, directoryStateByPath]\n );\n\n const visibleEntries = useMemo(\n () =>\n mode === \"search\"\n ? searchEntries\n : collectVisibleTreeEntries(\n browseRootEntries,\n directoryStateByPath,\n expandedFolderPaths\n ),\n [\n browseRootEntries,\n directoryStateByPath,\n expandedFolderPaths,\n mode,\n searchEntries\n ]\n );\n\n useEffect(() => {\n if (!open) {\n return;\n }\n setFocusedPath((current) => {\n if (current && visibleEntries.some((entry) => entry.path === current)) {\n return current;\n }\n return visibleEntries[0]?.path ?? null;\n });\n }, [open, visibleEntries]);\n\n const focusedEntry =\n visibleEntries.find((entry) => entry.path === focusedPath) ??\n selectedRefs.find((entry) => entry.path === focusedPath) ??\n null;\n\n useEffect(() => {\n pickerController.setPreviewReference(open ? focusedEntry : null);\n }, [focusedEntry, open, pickerController]);\n\n const toggleRef = (ref: WorkspaceFileReference) => {\n setSelectedRefs((current) => {\n const existing = current.some((item) => item.path === ref.path);\n return existing\n ? current.filter((item) => item.path !== ref.path)\n : uniqueWorkspaceFileReferences([...current, ref]);\n });\n };\n\n const toggleFolder = (entry: WorkspaceFileReference) => {\n pickerController.toggleFolder(entry);\n };\n\n return {\n browseRootEntries,\n directoryStateByPath,\n expandedFolderPaths,\n focusedEntry,\n focusedPath,\n isLoading,\n mode,\n previewState,\n searchQuery,\n selectedRefs,\n visibleEntries,\n setFocusedPath,\n setSearchQuery,\n toggleFolder,\n toggleRef\n };\n}\n","import { proxy } from \"valtio/vanilla\";\nimport {\n createWorkspaceFilePreviewLoadedState,\n resolveWorkspaceFilePreviewReadiness\n} from \"@tutti-os/workspace-file-preview\";\nimport type {\n WorkspaceFilePreviewActivationTarget,\n WorkspaceFilePreviewReadonlyReason\n} from \"@tutti-os/workspace-file-preview\";\nimport type {\n WorkspaceFileReference,\n WorkspaceFileReferenceAdapter,\n WorkspaceFileReferencePreview\n} from \"../../../contracts/index.ts\";\nimport { uniqueWorkspaceFileReferences } from \"../../../core/index.ts\";\nimport {\n createWorkspaceFileReferenceDirectoryStateFromSnapshot,\n normalizeDirectoryPath,\n type WorkspaceFileReferenceDirectoryState\n} from \"./WorkspaceFileReferencePickerState.ts\";\n\nexport type WorkspaceFileReferencePickerMode = \"browse\" | \"search\";\n\nexport type WorkspaceFileReferencePreviewState =\n | { status: \"directory\"; reference: WorkspaceFileReference }\n | { status: \"empty\" }\n | { status: \"error\"; reference: WorkspaceFileReference }\n | { status: \"image\"; objectUrl: string; reference: WorkspaceFileReference }\n | { status: \"loading\"; reference: WorkspaceFileReference }\n | {\n maxSizeBytes?: number;\n reason: WorkspaceFilePreviewReadonlyReason;\n reference: WorkspaceFileReference;\n status: \"readonly\";\n }\n | { status: \"text\"; content: string; reference: WorkspaceFileReference }\n | { status: \"unsupported\"; reference: WorkspaceFileReference }\n | { status: \"unavailable\"; reference: WorkspaceFileReference };\n\nexport interface WorkspaceFileReferencePickerControllerSnapshot {\n browseError: Error | null;\n browseRootPath: string | null;\n directoryStateByPath: Record<string, WorkspaceFileReferenceDirectoryState>;\n expandedFolderPaths: Record<string, boolean>;\n initialPathRevealed: boolean;\n isBrowseLoading: boolean;\n isSearchLoading: boolean;\n mode: WorkspaceFileReferencePickerMode;\n previewState: WorkspaceFileReferencePreviewState;\n searchEntries: WorkspaceFileReference[];\n searchError: Error | null;\n searchQuery: string;\n}\n\nexport interface CreateWorkspaceFileReferencePickerControllerInput {\n fileAdapter?: WorkspaceFileReferenceAdapter;\n searchDebounceMs?: number;\n workspaceId: string;\n}\n\nexport interface WorkspaceFileReferencePickerController {\n close(): void;\n getSnapshot(): WorkspaceFileReferencePickerControllerSnapshot;\n loadBrowseRoot(): void;\n open(): void;\n reset(): void;\n revealInitialPath(initialDirectoryPath: string): Promise<string | null>;\n setPreviewReference(reference: WorkspaceFileReference | null): void;\n setSearchQuery(query: string): void;\n readonly store: WorkspaceFileReferencePickerControllerSnapshot;\n toggleFolder(entry: WorkspaceFileReference): void;\n}\n\nconst defaultDirectoryPath = \"/\";\nconst defaultSearchDebounceMs = 180;\n\nexport function createWorkspaceFileReferencePickerController(\n input: CreateWorkspaceFileReferencePickerControllerInput\n): WorkspaceFileReferencePickerController {\n const searchDebounceMs = input.searchDebounceMs ?? defaultSearchDebounceMs;\n let browseSequence = 0;\n let previewObjectUrl: string | null = null;\n let previewSequence = 0;\n let retained = false;\n let searchAbortController: AbortController | null = null;\n let searchSequence = 0;\n let searchTimer: ReturnType<typeof setTimeout> | null = null;\n let snapshot: WorkspaceFileReferencePickerControllerSnapshot = {\n browseError: null,\n browseRootPath: null,\n directoryStateByPath: {},\n expandedFolderPaths: {},\n initialPathRevealed: false,\n isBrowseLoading: false,\n isSearchLoading: false,\n mode: \"browse\",\n previewState: { status: \"empty\" },\n searchEntries: [],\n searchError: null,\n searchQuery: \"\"\n };\n const store = proxy(snapshot);\n\n const setSnapshot = (\n update:\n | Partial<WorkspaceFileReferencePickerControllerSnapshot>\n | ((\n current: WorkspaceFileReferencePickerControllerSnapshot\n ) => WorkspaceFileReferencePickerControllerSnapshot)\n ) => {\n const next =\n typeof update === \"function\"\n ? update(snapshot)\n : { ...snapshot, ...update };\n if (next === snapshot) {\n return;\n }\n snapshot = next;\n Object.assign(store, next);\n };\n\n const loadDirectoryListing = async (path?: string | null) => {\n if (!input.fileAdapter?.listDirectory) {\n return null;\n }\n const listing = await input.fileAdapter.listDirectory({\n path: path ?? undefined,\n workspaceId: input.workspaceId\n });\n const displayPath =\n listing.directoryPath || listing.rootPath || path || defaultDirectoryPath;\n const normalizedPath = normalizeDirectoryPath(displayPath);\n\n return {\n displayPath,\n entries: uniqueWorkspaceFileReferences(listing.entries),\n normalizedPath\n };\n };\n\n const resolveMode = (query: string) =>\n query.trim().length > 0 && input.fileAdapter?.searchReferences\n ? \"search\"\n : \"browse\";\n\n const clearSearchTimer = () => {\n if (searchTimer === null) {\n return;\n }\n clearTimeout(searchTimer);\n searchTimer = null;\n };\n\n const cancelCurrentSearch = () => {\n clearSearchTimer();\n searchSequence += 1;\n searchAbortController?.abort();\n searchAbortController = null;\n };\n\n const cancelCurrentBrowse = () => {\n browseSequence += 1;\n };\n\n const cancelCurrentPreview = () => {\n previewSequence += 1;\n if (!previewObjectUrl) {\n return;\n }\n URL.revokeObjectURL(previewObjectUrl);\n previewObjectUrl = null;\n };\n\n const clearSearchResults = () => {\n cancelCurrentSearch();\n setSnapshot({\n isSearchLoading: false,\n searchEntries: [],\n searchError: null\n });\n };\n\n const runSearch = async (query: string) => {\n if (!retained || !input.fileAdapter?.searchReferences) {\n return;\n }\n\n const sequence = ++searchSequence;\n searchAbortController?.abort();\n const abortController = new AbortController();\n searchAbortController = abortController;\n setSnapshot({\n isSearchLoading: true,\n searchError: null\n });\n\n try {\n const refs = await input.fileAdapter.searchReferences({\n query,\n signal: abortController.signal,\n workspaceId: input.workspaceId\n });\n if (!retained || sequence !== searchSequence) {\n return;\n }\n setSnapshot({\n isSearchLoading: false,\n searchEntries: uniqueWorkspaceFileReferences(refs),\n searchError: null\n });\n } catch (error) {\n if (isAbortError(error) || sequence !== searchSequence || !retained) {\n return;\n }\n setSnapshot({\n isSearchLoading: false,\n searchEntries: [],\n searchError: normalizeControllerError(\n error,\n \"Workspace file reference search failed\"\n )\n });\n } finally {\n if (sequence === searchSequence) {\n searchAbortController = null;\n }\n }\n };\n\n const scheduleSearch = () => {\n clearSearchTimer();\n const query = snapshot.searchQuery.trim();\n if (!retained || !input.fileAdapter?.searchReferences || !query) {\n clearSearchResults();\n return;\n }\n\n if (searchDebounceMs <= 0) {\n void runSearch(query);\n return;\n }\n\n searchTimer = setTimeout(() => {\n searchTimer = null;\n void runSearch(query);\n }, searchDebounceMs);\n };\n\n const loadBrowseRoot = async () => {\n if (\n !retained ||\n snapshot.mode !== \"browse\" ||\n !(\n input.fileAdapter?.listDirectory || input.fileAdapter?.loadReferenceTree\n )\n ) {\n return;\n }\n const activeBrowseRootPath = snapshot.browseRootPath;\n const normalizedRoot = activeBrowseRootPath\n ? normalizeDirectoryPath(activeBrowseRootPath)\n : null;\n if (\n normalizedRoot &&\n snapshot.directoryStateByPath[normalizedRoot]?.loaded\n ) {\n return;\n }\n\n const sequence = ++browseSequence;\n setSnapshot({\n browseError: null,\n isBrowseLoading: true\n });\n\n try {\n if (input.fileAdapter.loadReferenceTree) {\n const treeSnapshot = await input.fileAdapter.loadReferenceTree({\n path: activeBrowseRootPath ?? undefined,\n prefetchBudgetMs: 500,\n prefetchDepth: 4,\n workspaceId: input.workspaceId\n });\n if (!retained || sequence !== browseSequence) {\n return;\n }\n setSnapshot({\n browseRootPath: normalizeDirectoryPath(\n treeSnapshot.directory.directoryPath\n ),\n directoryStateByPath:\n createWorkspaceFileReferenceDirectoryStateFromSnapshot(\n treeSnapshot\n ),\n isBrowseLoading: false\n });\n return;\n }\n\n const listing = await loadDirectoryListing(activeBrowseRootPath);\n if (!retained || sequence !== browseSequence || !listing) {\n return;\n }\n setSnapshot((current) => ({\n ...current,\n browseRootPath: listing.normalizedPath,\n directoryStateByPath: {\n ...current.directoryStateByPath,\n [listing.normalizedPath]: {\n displayPath: listing.displayPath,\n entries: listing.entries,\n loaded: true,\n loading: false\n }\n },\n isBrowseLoading: false\n }));\n } catch (error) {\n if (!retained || sequence !== browseSequence) {\n return;\n }\n setSnapshot({\n browseError: normalizeControllerError(\n error,\n \"Workspace file reference browse failed\"\n ),\n isBrowseLoading: false\n });\n }\n };\n\n const loadFolderChildren = async (folder: WorkspaceFileReference) => {\n const folderKey = normalizeDirectoryPath(folder.path);\n if (\n !retained ||\n snapshot.directoryStateByPath[folderKey]?.loaded ||\n snapshot.directoryStateByPath[folderKey]?.loading\n ) {\n return;\n }\n\n const sequence = ++browseSequence;\n setSnapshot((current) => ({\n ...current,\n directoryStateByPath: {\n ...current.directoryStateByPath,\n [folderKey]: {\n displayPath: folder.path,\n entries: current.directoryStateByPath[folderKey]?.entries ?? [],\n loaded: current.directoryStateByPath[folderKey]?.loaded ?? false,\n loading: true\n }\n }\n }));\n\n try {\n const listing = await loadDirectoryListing(folderKey);\n if (!retained || sequence !== browseSequence || !listing) {\n return;\n }\n setSnapshot((current) => ({\n ...current,\n directoryStateByPath: {\n ...current.directoryStateByPath,\n [folderKey]: {\n displayPath: listing.displayPath,\n entries: listing.entries,\n loaded: true,\n loading: false\n }\n }\n }));\n } catch {\n if (!retained || sequence !== browseSequence) {\n return;\n }\n setSnapshot((current) => ({\n ...current,\n directoryStateByPath: {\n ...current.directoryStateByPath,\n [folderKey]: {\n displayPath:\n current.directoryStateByPath[folderKey]?.displayPath ??\n folder.path,\n entries: current.directoryStateByPath[folderKey]?.entries ?? [],\n loaded: current.directoryStateByPath[folderKey]?.loaded ?? false,\n loading: false\n }\n }\n }));\n }\n };\n\n const loadReferencePreview = async (\n reference: WorkspaceFileReference,\n target: WorkspaceFilePreviewActivationTarget,\n sequence: number\n ) => {\n try {\n const preview = await input.fileAdapter?.readReferencePreview?.({\n reference,\n workspaceId: input.workspaceId\n });\n if (!retained || sequence !== previewSequence) {\n return;\n }\n if (!preview) {\n setSnapshot({\n previewState: { reference, status: \"unsupported\" }\n });\n return;\n }\n\n const nextState = createReferencePreviewState(reference, target, preview);\n if (!retained || sequence !== previewSequence) {\n if (nextState.status === \"image\") {\n URL.revokeObjectURL(nextState.objectUrl);\n }\n return;\n }\n if (nextState.status === \"image\") {\n previewObjectUrl = nextState.objectUrl;\n }\n setSnapshot({\n previewState: nextState\n });\n } catch {\n if (!retained || sequence !== previewSequence) {\n return;\n }\n setSnapshot({\n previewState: { reference, status: \"error\" }\n });\n }\n };\n\n const setPreviewReference = (reference: WorkspaceFileReference | null) => {\n cancelCurrentPreview();\n if (!retained || !reference) {\n setSnapshot({\n previewState: { status: \"empty\" }\n });\n return;\n }\n\n const readiness = resolveWorkspaceFilePreviewReadiness(reference);\n if (readiness.status === \"directory\") {\n setSnapshot({\n previewState: { reference, status: \"directory\" }\n });\n return;\n }\n if (readiness.status === \"unsupported\") {\n setSnapshot({\n previewState: { reference, status: \"unsupported\" }\n });\n return;\n }\n if (readiness.status === \"readonly\") {\n setSnapshot({\n previewState: {\n maxSizeBytes: readiness.maxSizeBytes,\n reason: readiness.reason,\n reference,\n status: \"readonly\"\n }\n });\n return;\n }\n\n if (!input.fileAdapter?.readReferencePreview) {\n setSnapshot({\n previewState: { reference, status: \"unavailable\" }\n });\n return;\n }\n\n const sequence = ++previewSequence;\n setSnapshot({\n previewState: { reference, status: \"loading\" }\n });\n void loadReferencePreview(reference, readiness.target, sequence);\n };\n\n return {\n close() {\n retained = false;\n cancelCurrentBrowse();\n cancelCurrentPreview();\n cancelCurrentSearch();\n setSnapshot({\n isBrowseLoading: false,\n isSearchLoading: false,\n previewState: { status: \"empty\" }\n });\n },\n getSnapshot() {\n return snapshot;\n },\n loadBrowseRoot() {\n void loadBrowseRoot();\n },\n open() {\n if (retained) {\n return;\n }\n retained = true;\n if (snapshot.mode === \"search\") {\n scheduleSearch();\n return;\n }\n void loadBrowseRoot();\n },\n async revealInitialPath(initialDirectoryPath) {\n if (\n !retained ||\n snapshot.mode !== \"browse\" ||\n snapshot.initialPathRevealed ||\n !snapshot.browseRootPath\n ) {\n return null;\n }\n\n const rootPath = normalizeDirectoryPath(snapshot.browseRootPath);\n if (!isPathInsideOrEqual(initialDirectoryPath, rootPath)) {\n setSnapshot({\n initialPathRevealed: true\n });\n return null;\n }\n\n const sequence = ++browseSequence;\n const loadedDirectories: Record<\n string,\n WorkspaceFileReferenceDirectoryState\n > = {};\n const expandedDirectories: Record<string, boolean> = {};\n const directoryState = (path: string) =>\n loadedDirectories[path] ?? snapshot.directoryStateByPath[path];\n\n const directoryPaths = directoryChainBetween(\n rootPath,\n initialDirectoryPath\n );\n for (const directoryPath of directoryPaths) {\n expandedDirectories[directoryPath] = true;\n }\n\n const listings = await Promise.all(\n directoryPaths\n .filter((directoryPath) => !directoryState(directoryPath)?.loaded)\n .map(async (directoryPath) => {\n try {\n return await loadDirectoryListing(directoryPath);\n } catch {\n return null;\n }\n })\n );\n\n for (const listing of listings) {\n if (!listing) {\n continue;\n }\n loadedDirectories[listing.normalizedPath] = {\n displayPath: listing.displayPath,\n entries: listing.entries,\n loaded: true,\n loading: false\n };\n }\n\n if (!retained || sequence !== browseSequence) {\n return null;\n }\n setSnapshot((current) => ({\n ...current,\n directoryStateByPath: {\n ...current.directoryStateByPath,\n ...loadedDirectories\n },\n expandedFolderPaths: {\n ...current.expandedFolderPaths,\n ...expandedDirectories\n },\n initialPathRevealed: true\n }));\n return initialDirectoryPath;\n },\n reset() {\n cancelCurrentBrowse();\n cancelCurrentPreview();\n cancelCurrentSearch();\n setSnapshot({\n browseError: null,\n browseRootPath: null,\n directoryStateByPath: {},\n expandedFolderPaths: {},\n initialPathRevealed: false,\n isBrowseLoading: false,\n isSearchLoading: false,\n mode: \"browse\",\n previewState: { status: \"empty\" },\n searchEntries: [],\n searchError: null,\n searchQuery: \"\"\n });\n },\n setPreviewReference(reference) {\n setPreviewReference(reference);\n },\n setSearchQuery(query) {\n if (query === snapshot.searchQuery) {\n return;\n }\n const nextMode = resolveMode(query);\n setSnapshot({\n mode: nextMode,\n searchQuery: query,\n ...(nextMode === \"browse\" ? { isSearchLoading: false } : {})\n });\n if (nextMode === \"search\") {\n cancelCurrentBrowse();\n scheduleSearch();\n return;\n }\n clearSearchResults();\n void loadBrowseRoot();\n },\n get store() {\n return store;\n },\n toggleFolder(entry) {\n const folderKey = normalizeDirectoryPath(entry.path);\n const childState = snapshot.directoryStateByPath[folderKey];\n const nextExpanded = !(snapshot.expandedFolderPaths[folderKey] ?? false);\n\n setSnapshot((current) => ({\n ...current,\n expandedFolderPaths: {\n ...current.expandedFolderPaths,\n [folderKey]: nextExpanded\n }\n }));\n if (nextExpanded && !childState?.loaded && !childState?.loading) {\n void loadFolderChildren(entry);\n }\n }\n };\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nfunction normalizeControllerError(\n error: unknown,\n fallbackMessage: string\n): Error {\n return error instanceof Error ? error : new Error(fallbackMessage);\n}\n\nfunction createReferencePreviewState(\n reference: WorkspaceFileReference,\n target: WorkspaceFilePreviewActivationTarget,\n preview: WorkspaceFileReferencePreview\n): WorkspaceFileReferencePreviewState {\n const loadedState = createWorkspaceFilePreviewLoadedState({\n bytes: preview.bytes,\n contentType: preview.contentType,\n entry: reference,\n target: {\n ...target,\n fileKind: preview.kind\n }\n });\n\n if (loadedState.status === \"image\") {\n return {\n objectUrl: URL.createObjectURL(\n new Blob([loadedState.bytes], {\n type: loadedState.contentType\n })\n ),\n reference,\n status: \"image\"\n };\n }\n\n if (loadedState.status === \"text\") {\n return {\n content: loadedState.content,\n reference,\n status: \"text\"\n };\n }\n\n return {\n maxSizeBytes: loadedState.maxSizeBytes,\n reason: loadedState.reason,\n reference,\n status: \"readonly\"\n };\n}\n\nfunction isPathInsideOrEqual(path: string, root: string): boolean {\n const normalizedPath = normalizeDirectoryPath(path);\n const normalizedRoot = normalizeDirectoryPath(root);\n if (normalizedRoot === \"/\") {\n return normalizedPath.startsWith(\"/\");\n }\n return (\n normalizedPath === normalizedRoot ||\n normalizedPath.startsWith(`${normalizedRoot}/`)\n );\n}\n\nfunction directoryChainBetween(root: string, target: string): string[] {\n const normalizedRoot = normalizeDirectoryPath(root);\n let current = normalizeDirectoryPath(target);\n const chain: string[] = [];\n\n while (current && current !== normalizedRoot) {\n chain.unshift(current);\n const parent = dirnameDirectoryPath(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n return chain;\n}\n\nfunction dirnameDirectoryPath(path: string): string {\n const normalized = normalizeDirectoryPath(path);\n if (normalized === \"/\") {\n return \"/\";\n }\n const index = normalized.lastIndexOf(\"/\");\n if (index <= 0) {\n return \"/\";\n }\n return normalized.slice(0, index);\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-PAR2R2G5.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
// src/core/index.ts
|
|
2
|
-
function uniqueWorkspaceFileReferences(refs) {
|
|
3
|
-
const unique = /* @__PURE__ */ new Map();
|
|
4
|
-
for (const ref of refs) {
|
|
5
|
-
const normalizedPath = ref.path.trim();
|
|
6
|
-
if (!normalizedPath || unique.has(normalizedPath)) {
|
|
7
|
-
continue;
|
|
8
|
-
}
|
|
9
|
-
unique.set(normalizedPath, {
|
|
10
|
-
displayName: ref.displayName?.trim() || void 0,
|
|
11
|
-
kind: ref.kind === "folder" ? "folder" : "file",
|
|
12
|
-
path: normalizedPath,
|
|
13
|
-
...ref.mtimeMs === void 0 ? {} : { mtimeMs: ref.mtimeMs },
|
|
14
|
-
...ref.sizeBytes === void 0 ? {} : { sizeBytes: ref.sizeBytes }
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
return [...unique.values()];
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export {
|
|
21
|
-
uniqueWorkspaceFileReferences
|
|
22
|
-
};
|
|
23
|
-
//# sourceMappingURL=chunk-PAR2R2G5.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/index.ts"],"sourcesContent":["import type { WorkspaceFileReference } from \"../contracts/index.ts\";\n\nexport function uniqueWorkspaceFileReferences(\n refs: readonly WorkspaceFileReference[]\n): WorkspaceFileReference[] {\n const unique = new Map<string, WorkspaceFileReference>();\n for (const ref of refs) {\n const normalizedPath = ref.path.trim();\n if (!normalizedPath || unique.has(normalizedPath)) {\n continue;\n }\n unique.set(normalizedPath, {\n displayName: ref.displayName?.trim() || undefined,\n kind: ref.kind === \"folder\" ? \"folder\" : \"file\",\n path: normalizedPath,\n ...(ref.mtimeMs === undefined ? {} : { mtimeMs: ref.mtimeMs }),\n ...(ref.sizeBytes === undefined ? {} : { sizeBytes: ref.sizeBytes })\n });\n }\n return [...unique.values()];\n}\n"],"mappings":";AAEO,SAAS,8BACd,MAC0B;AAC1B,QAAM,SAAS,oBAAI,IAAoC;AACvD,aAAW,OAAO,MAAM;AACtB,UAAM,iBAAiB,IAAI,KAAK,KAAK;AACrC,QAAI,CAAC,kBAAkB,OAAO,IAAI,cAAc,GAAG;AACjD;AAAA,IACF;AACA,WAAO,IAAI,gBAAgB;AAAA,MACzB,aAAa,IAAI,aAAa,KAAK,KAAK;AAAA,MACxC,MAAM,IAAI,SAAS,WAAW,WAAW;AAAA,MACzC,MAAM;AAAA,MACN,GAAI,IAAI,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,IAAI,QAAQ;AAAA,MAC5D,GAAI,IAAI,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,IAAI,UAAU;AAAA,IACpE,CAAC;AAAA,EACH;AACA,SAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAC5B;","names":[]}
|