Files
drive/packages/convex/model/filesystem.ts

76 lines
1.8 KiB
TypeScript
Raw Normal View History

2025-09-28 15:45:49 +00:00
import { v } from "convex/values"
import type { Doc, Id } from "../_generated/dataModel"
export enum FileType {
File = "File",
Directory = "Directory",
}
2025-09-28 15:45:49 +00:00
export type Directory = {
kind: FileType.Directory
doc: Doc<"directories">
}
export type File = {
kind: FileType.File
doc: Doc<"files">
}
export type FileSystemItem = Directory | File
export type DirectoryPathComponent = {
handle: DirectoryHandle
name: string
}
export type FilePathComponent = {
handle: FileHandle
name: string
}
export type PathComponent = FilePathComponent | DirectoryPathComponent
export type FilePath = [...DirectoryPathComponent[], PathComponent]
export type ReverseFilePath = [PathComponent, ...DirectoryPathComponent[]]
export type DirectoryHandle = {
2025-09-28 15:45:49 +00:00
kind: FileType.Directory
id: Id<"directories">
}
2025-09-28 15:45:49 +00:00
export type FileHandle = {
kind: FileType.File
id: Id<"files">
}
2025-09-28 15:45:49 +00:00
export type FileSystemHandle = DirectoryHandle | FileHandle
2025-09-28 15:45:49 +00:00
export function newFileSystemHandle(item: FileSystemItem): FileSystemHandle {
console.log("item", item)
switch (item.kind) {
case FileType.File:
return { kind: item.kind, id: item.doc._id }
case FileType.Directory:
return { kind: item.kind, id: item.doc._id }
}
}
2025-09-26 22:20:30 +00:00
export function isSameHandle(
handle1: FileSystemHandle,
handle2: FileSystemHandle,
): boolean {
return handle1.kind === handle2.kind && handle1.id === handle2.id
}
2025-09-28 15:45:49 +00:00
export function newDirectoryHandle(id: Id<"directories">): DirectoryHandle {
return { kind: FileType.Directory, id }
}
export function newFileHandle(id: Id<"files">): FileHandle {
return { kind: FileType.File, id }
}
export const VDirectoryHandle = v.object({
kind: v.literal(FileType.Directory),
id: v.id("directories"),
})
export const VFileHandle = v.object({
kind: v.literal(FileType.File),
id: v.id("files"),
})
export const VFileSystemHandle = v.union(VFileHandle, VDirectoryHandle)