@harryy/react-file-browser 0.0.0
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/LICENSE +21 -0
- package/README.md +247 -0
- package/dist/adapters/cloud-adapter-base.d.ts +27 -0
- package/dist/adapters/cloud-adapter-base.d.ts.map +1 -0
- package/dist/adapters/in-memory/in-memory-file-browser-adapter.d.ts +53 -0
- package/dist/adapters/in-memory/in-memory-file-browser-adapter.d.ts.map +1 -0
- package/dist/adapters/in-memory/index.d.ts +2 -0
- package/dist/adapters/in-memory/index.d.ts.map +1 -0
- package/dist/adapters/in-memory/index.js +270 -0
- package/dist/adapters/in-memory/index.js.map +1 -0
- package/dist/adapters/r2/index.d.ts +7 -0
- package/dist/adapters/r2/index.d.ts.map +1 -0
- package/dist/adapters/r2/index.js +11 -0
- package/dist/adapters/r2/index.js.map +1 -0
- package/dist/adapters/s3/index.d.ts +7 -0
- package/dist/adapters/s3/index.d.ts.map +1 -0
- package/dist/adapters/s3/index.js +11 -0
- package/dist/adapters/s3/index.js.map +1 -0
- package/dist/adapters/s3-compatible-adapter.d.ts +50 -0
- package/dist/adapters/s3-compatible-adapter.d.ts.map +1 -0
- package/dist/adapters/supabase/index.d.ts +7 -0
- package/dist/adapters/supabase/index.d.ts.map +1 -0
- package/dist/adapters/supabase/index.js +216 -0
- package/dist/adapters/supabase/index.js.map +1 -0
- package/dist/adapters/supabase/supabase-file-browser-adapter.d.ts +88 -0
- package/dist/adapters/supabase/supabase-file-browser-adapter.d.ts.map +1 -0
- package/dist/chunks/browser-4lIkMGbo.js +436 -0
- package/dist/chunks/browser-4lIkMGbo.js.map +1 -0
- package/dist/chunks/cloud-adapter-base-CBUoZYLS.js +39 -0
- package/dist/chunks/cloud-adapter-base-CBUoZYLS.js.map +1 -0
- package/dist/chunks/path-CPm7s9NF.js +52 -0
- package/dist/chunks/path-CPm7s9NF.js.map +1 -0
- package/dist/chunks/s3-compatible-adapter-D9agsn9e.js +317 -0
- package/dist/chunks/s3-compatible-adapter-D9agsn9e.js.map +1 -0
- package/dist/components/file-browser.d.ts +28 -0
- package/dist/components/file-browser.d.ts.map +1 -0
- package/dist/core/path.d.ts +9 -0
- package/dist/core/path.d.ts.map +1 -0
- package/dist/core/types.d.ts +84 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/upload-drop.d.ts +7 -0
- package/dist/core/upload-drop.d.ts.map +1 -0
- package/dist/core/use-file-browser.d.ts +78 -0
- package/dist/core/use-file-browser.d.ts.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3212 -0
- package/dist/index.js.map +1 -0
- package/dist/theme/index.d.ts +25 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +28 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/transfers/file-browser-provider.d.ts +13 -0
- package/dist/transfers/file-browser-provider.d.ts.map +1 -0
- package/dist/transfers/transfer-manager.d.ts +118 -0
- package/dist/transfers/transfer-manager.d.ts.map +1 -0
- package/package.json +137 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/adapters/in-memory/in-memory-file-browser-adapter.ts"],"sourcesContent":["import { zipSync } from 'fflate'\nimport type { Zippable } from 'fflate'\nimport { FileBrowserAdapterError } from '../../core/types'\nimport type {\n\tFileBrowserAdapter,\n\tFileBrowserListOptions,\n\tFileBrowserListResult,\n\tFileBrowserUploadOptions,\n\tFileNode\n} from '../../core/types'\nimport {\n\tROOT_PATH,\n\tgetFileBrowserBasename,\n\tgetFileBrowserDirname,\n\tisFileBrowserDescendantOrSelf,\n\tjoinFileBrowserPath,\n\tnormalizeFileBrowserPath,\n\treplaceFileBrowserPathPrefix\n} from '../../core/path'\n\nexport type InMemoryFileBrowserCapability =\n\t| 'createFolder'\n\t| 'rename'\n\t| 'move'\n\t| 'copy'\n\t| 'stat'\n\t| 'exists'\n\t| 'bulkDownloadUrl'\n\t| 'multipart'\n\nexport type InMemoryFileBrowserAdapterOptions = {\n\tcapabilities?: Partial<Record<InMemoryFileBrowserCapability, boolean>>\n\tmultipartPartSize?: number\n\tpageSize?: number\n\tnow?: () => Date\n}\n\ntype InMemoryEntry = FileNode & {\n\tblob?: Blob\n}\n\ntype InMemoryMultipartUpload = {\n\tpath: string\n\tsize: number\n\tpartSize: number\n\tparts: Map<number, { blob: Blob; etag: string }>\n}\n\nconst DEFAULT_CAPABILITIES: Record<InMemoryFileBrowserCapability, boolean> = {\n\tcreateFolder: true,\n\trename: true,\n\tmove: true,\n\tcopy: true,\n\tstat: true,\n\texists: true,\n\tbulkDownloadUrl: true,\n\tmultipart: false\n}\n\nexport class InMemoryFileBrowserAdapter implements FileBrowserAdapter {\n\treadonly createFolder?: NonNullable<FileBrowserAdapter['createFolder']>\n\treadonly rename?: NonNullable<FileBrowserAdapter['rename']>\n\treadonly move?: NonNullable<FileBrowserAdapter['move']>\n\treadonly copy?: NonNullable<FileBrowserAdapter['copy']>\n\treadonly stat?: NonNullable<FileBrowserAdapter['stat']>\n\treadonly exists?: NonNullable<FileBrowserAdapter['exists']>\n\treadonly bulkDownloadUrl?: NonNullable<FileBrowserAdapter['bulkDownloadUrl']>\n\treadonly createMultipartUpload?: NonNullable<FileBrowserAdapter['createMultipartUpload']>\n\treadonly uploadPart?: NonNullable<FileBrowserAdapter['uploadPart']>\n\treadonly completeMultipartUpload?: NonNullable<FileBrowserAdapter['completeMultipartUpload']>\n\treadonly abortMultipartUpload?: NonNullable<FileBrowserAdapter['abortMultipartUpload']>\n\n\tprivate readonly entries = new Map<string, InMemoryEntry>()\n\tprivate readonly multipartUploads = new Map<string, InMemoryMultipartUpload>()\n\tprivate readonly multipartPartSize: number\n\tprivate readonly pageSize?: number\n\tprivate readonly now: () => Date\n\tprivate etagSequence = 0\n\tprivate multipartSequence = 0\n\n\tconstructor(options: InMemoryFileBrowserAdapterOptions = {}) {\n\t\tconst capabilities = {\n\t\t\t...DEFAULT_CAPABILITIES,\n\t\t\t...options.capabilities\n\t\t}\n\n\t\tthis.pageSize = options.pageSize\n\t\tthis.multipartPartSize = Math.max(1, options.multipartPartSize ?? 5 * 1024 * 1024)\n\t\tthis.now = options.now ?? (() => new Date())\n\t\tthis.entries.set(ROOT_PATH, {\n\t\t\tpath: ROOT_PATH,\n\t\t\tname: '',\n\t\t\tkind: 'folder',\n\t\t\tmodifiedAt: this.timestamp()\n\t\t})\n\n\t\tif (capabilities.createFolder) {\n\t\t\tthis.createFolder = this.createFolderEntry.bind(this)\n\t\t}\n\n\t\tif (capabilities.rename) {\n\t\t\tthis.rename = this.renameEntry.bind(this)\n\t\t}\n\n\t\tif (capabilities.move) {\n\t\t\tthis.move = this.moveEntries.bind(this)\n\t\t}\n\n\t\tif (capabilities.copy) {\n\t\t\tthis.copy = this.copyEntries.bind(this)\n\t\t}\n\n\t\tif (capabilities.stat) {\n\t\t\tthis.stat = this.statEntry.bind(this)\n\t\t}\n\n\t\tif (capabilities.exists) {\n\t\t\tthis.exists = this.existsEntries.bind(this)\n\t\t}\n\n\t\tif (capabilities.bulkDownloadUrl) {\n\t\t\tthis.bulkDownloadUrl = this.createBulkDownloadUrl.bind(this)\n\t\t}\n\n\t\tif (capabilities.multipart) {\n\t\t\tthis.createMultipartUpload = this.createMultipartUploadEntry.bind(this)\n\t\t\tthis.uploadPart = this.uploadMultipartPart.bind(this)\n\t\t\tthis.completeMultipartUpload = this.completeMultipartUploadEntry.bind(this)\n\t\t\tthis.abortMultipartUpload = this.abortMultipartUploadEntry.bind(this)\n\t\t}\n\t}\n\n\tlist(path: string, opts: FileBrowserListOptions = {}): Promise<FileBrowserListResult> {\n\t\tthrowIfAborted(opts.signal)\n\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\tconst folder = this.getEntry(normalized)\n\n\t\tif (folder.kind !== 'folder') {\n\t\t\tthrow new FileBrowserAdapterError('invalid_path', `Cannot list a file path: ${normalized}`)\n\t\t}\n\n\t\tconst allItems = Array.from(this.entries.values())\n\t\t\t.filter((entry) => entry.path !== ROOT_PATH)\n\t\t\t.filter((entry) => getFileBrowserDirname(entry.path) === normalized)\n\t\t\t.sort(compareEntries)\n\t\t\t.map(cloneNode)\n\n\t\tif (!this.pageSize) {\n\t\t\treturn Promise.resolve({ items: allItems })\n\t\t}\n\n\t\tconst start = opts.cursor ? Number.parseInt(opts.cursor, 10) : 0\n\t\tconst safeStart = Number.isFinite(start) && start > 0 ? start : 0\n\t\tconst items = allItems.slice(safeStart, safeStart + this.pageSize)\n\t\tconst next = safeStart + items.length\n\n\t\treturn Promise.resolve({\n\t\t\titems,\n\t\t\tcursor: next < allItems.length ? String(next) : undefined\n\t\t})\n\t}\n\n\tprivate createFolderEntry(path: string): Promise<FileNode> {\n\t\tconst normalized = normalizeFileBrowserPath(path)\n\n\t\tif (normalized === ROOT_PATH) {\n\t\t\treturn Promise.resolve(cloneNode(this.getEntry(ROOT_PATH)))\n\t\t}\n\n\t\tif (this.entries.has(normalized)) {\n\t\t\tthrow new FileBrowserAdapterError('conflict', `A file browser entry already exists at ${normalized}`)\n\t\t}\n\n\t\tthis.assertFolderExists(getFileBrowserDirname(normalized))\n\n\t\tconst entry: InMemoryEntry = {\n\t\t\tpath: normalized,\n\t\t\tname: getFileBrowserBasename(normalized),\n\t\t\tkind: 'folder',\n\t\t\tmodifiedAt: this.timestamp(),\n\t\t\tetag: this.nextEtag()\n\t\t}\n\n\t\tthis.entries.set(normalized, entry)\n\t\treturn Promise.resolve(cloneNode(entry))\n\t}\n\n\tdelete(paths: string[]): Promise<void> {\n\t\tfor (const path of paths.map(normalizeFileBrowserPath)) {\n\t\t\tif (path === ROOT_PATH) {\n\t\t\t\tthrow new FileBrowserAdapterError('invalid_path', 'Cannot delete the root folder')\n\t\t\t}\n\n\t\t\tthis.getEntry(path)\n\n\t\t\tfor (const candidate of Array.from(this.entries.keys())) {\n\t\t\t\tif (isFileBrowserDescendantOrSelf(path, candidate)) {\n\t\t\t\t\tthis.entries.delete(candidate)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn Promise.resolve()\n\t}\n\n\tsignedUrl(path: string): Promise<string> {\n\t\tconst entry = this.getEntry(path)\n\n\t\tif (entry.kind !== 'file' || !entry.blob) {\n\t\t\tthrow new FileBrowserAdapterError('invalid_path', `Cannot create a signed URL for a folder: ${entry.path}`)\n\t\t}\n\n\t\treturn Promise.resolve(URL.createObjectURL(entry.blob))\n\t}\n\n\tupload(path: string, file: File, opts: FileBrowserUploadOptions = {}): Promise<FileNode> {\n\t\tthrowIfAborted(opts.signal)\n\t\tlet normalized = normalizeFileBrowserPath(path)\n\t\tthis.assertFolderExists(getFileBrowserDirname(normalized))\n\n\t\tif (this.entries.has(normalized) && opts.onConflict !== 'replace') {\n\t\t\tif (opts.onConflict === 'keep-both') {\n\t\t\t\tnormalized = this.nextAvailablePath(normalized)\n\t\t\t} else {\n\t\t\t\tthrow new FileBrowserAdapterError('conflict', `A file browser entry already exists at ${normalized}`)\n\t\t\t}\n\t\t}\n\n\t\topts.onProgress?.(0, file.size)\n\t\tthrowIfAborted(opts.signal)\n\n\t\tconst entry: InMemoryEntry = {\n\t\t\tpath: normalized,\n\t\t\tname: getFileBrowserBasename(normalized) || file.name,\n\t\t\tkind: 'file',\n\t\t\tsize: file.size,\n\t\t\tmimeType: file.type || undefined,\n\t\t\tmodifiedAt: this.timestamp(),\n\t\t\tetag: this.nextEtag(),\n\t\t\tblob: file\n\t\t}\n\n\t\tthis.entries.set(normalized, entry)\n\t\topts.onProgress?.(file.size, file.size)\n\n\t\treturn Promise.resolve(cloneNode(entry))\n\t}\n\n\tprivate nextAvailablePath(path: string): string {\n\t\tconst dir = getFileBrowserDirname(path)\n\t\tconst basename = getFileBrowserBasename(path)\n\t\tconst dotIndex = basename.lastIndexOf('.')\n\t\tconst hasExtension = dotIndex > 0\n\t\tconst stem = hasExtension ? basename.slice(0, dotIndex) : basename\n\t\tconst extension = hasExtension ? basename.slice(dotIndex) : ''\n\n\t\tfor (let index = 1; index < Number.MAX_SAFE_INTEGER; index += 1) {\n\t\t\tconst candidate = joinFileBrowserPath(dir, `${stem} (${index})${extension}`)\n\t\t\tif (!this.entries.has(candidate)) {\n\t\t\t\treturn candidate\n\t\t\t}\n\t\t}\n\n\t\tthrow new FileBrowserAdapterError('conflict', `Could not allocate a unique file browser path for ${path}`)\n\t}\n\n\tprivate renameEntry(path: string, newName: string): Promise<FileNode> {\n\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\tconst entry = this.getEntry(normalized)\n\t\tconst trimmedName = newName.trim()\n\n\t\tif (!trimmedName || trimmedName.includes('/') || trimmedName.includes('\\\\')) {\n\t\t\tthrow new FileBrowserAdapterError('invalid_path', `Invalid file browser name: ${newName}`)\n\t\t}\n\n\t\tconst updated: InMemoryEntry = {\n\t\t\t...entry,\n\t\t\tname: trimmedName,\n\t\t\tmodifiedAt: this.timestamp(),\n\t\t\tetag: this.nextEtag()\n\t\t}\n\n\t\tthis.entries.set(normalized, updated)\n\t\treturn Promise.resolve(cloneNode(updated))\n\t}\n\n\tprivate async moveEntries(from: string[], toDir: string): Promise<void> {\n\t\tawait this.copyEntries(from, toDir)\n\n\t\tfor (const path of from) {\n\t\t\tawait this.delete([path])\n\t\t}\n\t}\n\n\tprivate copyEntries(from: string[], toDir: string): Promise<void> {\n\t\tconst normalizedToDir = normalizeFileBrowserPath(toDir)\n\t\tthis.assertFolderExists(normalizedToDir)\n\n\t\tconst copies = new Map<string, InMemoryEntry>()\n\n\t\tfor (const sourcePath of from.map(normalizeFileBrowserPath)) {\n\t\t\tconst source = this.getEntry(sourcePath)\n\t\t\tconst destinationRoot = joinFileBrowserPath(normalizedToDir, getFileBrowserBasename(source.path))\n\n\t\t\tfor (const entry of this.collectTree(source.path)) {\n\t\t\t\tconst destinationPath = replaceFileBrowserPathPrefix(entry.path, source.path, destinationRoot)\n\n\t\t\t\tif (this.entries.has(destinationPath) || copies.has(destinationPath)) {\n\t\t\t\t\tthrow new FileBrowserAdapterError('conflict', `A file browser entry already exists at ${destinationPath}`)\n\t\t\t\t}\n\n\t\t\t\tcopies.set(destinationPath, {\n\t\t\t\t\t...entry,\n\t\t\t\t\tpath: destinationPath,\n\t\t\t\t\tname: entry.path === source.path ? getFileBrowserBasename(destinationPath) : entry.name,\n\t\t\t\t\tmodifiedAt: this.timestamp(),\n\t\t\t\t\tetag: this.nextEtag()\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tfor (const [path, entry] of copies) {\n\t\t\tthis.entries.set(path, entry)\n\t\t}\n\n\t\treturn Promise.resolve()\n\t}\n\n\tprivate statEntry(path: string): Promise<FileNode> {\n\t\treturn Promise.resolve(cloneNode(this.getEntry(path)))\n\t}\n\n\tprivate existsEntries(paths: string[]): Promise<Record<string, boolean>> {\n\t\treturn Promise.resolve(\n\t\t\tObject.fromEntries(\n\t\t\t\tpaths.map((path) => {\n\t\t\t\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\t\t\t\treturn [normalized, this.entries.has(normalized)]\n\t\t\t\t})\n\t\t\t)\n\t\t)\n\t}\n\n\tprivate async createBulkDownloadUrl(paths: string[]): Promise<{ url: string; expiresAt: string }> {\n\t\tconst zippable: Zippable = {}\n\n\t\tfor (const path of paths) {\n\t\t\tthis.getEntry(path)\n\t\t\tconst tree = this.collectTree(path)\n\t\t\tfor (const entry of tree) {\n\t\t\t\tif (entry.kind === 'folder' || !entry.blob) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tzippable[toArchivePath(entry.path)] = new Uint8Array(await entry.blob.arrayBuffer())\n\t\t\t}\n\t\t}\n\n\t\tconst archive = new Blob([zipSync(zippable)], {\n\t\t\ttype: 'application/zip'\n\t\t})\n\n\t\treturn {\n\t\t\turl: URL.createObjectURL(archive),\n\t\t\texpiresAt: new Date(this.now().getTime() + 4 * 60 * 60 * 1000).toISOString()\n\t\t}\n\t}\n\n\tprivate createMultipartUploadEntry(path: string, size: number): Promise<{ uploadId: string; partSize: number }> {\n\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\tthis.assertFolderExists(getFileBrowserDirname(normalized))\n\n\t\tconst existing = this.entries.get(normalized)\n\t\tif (existing?.kind === 'folder') {\n\t\t\tthrow new FileBrowserAdapterError('conflict', `A file browser entry already exists at ${normalized}`)\n\t\t}\n\n\t\tthis.multipartSequence += 1\n\t\tconst uploadId = `memory-multipart-${this.multipartSequence}`\n\t\tthis.multipartUploads.set(uploadId, {\n\t\t\tpath: normalized,\n\t\t\tsize,\n\t\t\tpartSize: this.multipartPartSize,\n\t\t\tparts: new Map()\n\t\t})\n\n\t\treturn Promise.resolve({ uploadId, partSize: this.multipartPartSize })\n\t}\n\n\tprivate uploadMultipartPart({\n\t\tchunk,\n\t\tonProgress,\n\t\tpartNumber,\n\t\tsignal,\n\t\tuploadId\n\t}: Parameters<NonNullable<FileBrowserAdapter['uploadPart']>>[0]): Promise<{\n\t\tetag: string\n\t}> {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tthrowIfAborted(signal)\n\t\t\tconst upload = this.getMultipartUpload(uploadId)\n\t\t\tconst etag = `memory-part-${partNumber}`\n\t\t\tupload.parts.set(partNumber, { blob: chunk, etag })\n\t\t\tonProgress?.(chunk.size)\n\t\t\tthrowIfAborted(signal)\n\n\t\t\treturn { etag }\n\t\t})\n\t}\n\n\tprivate completeMultipartUploadEntry({\n\t\tparts,\n\t\tuploadId\n\t}: Parameters<NonNullable<FileBrowserAdapter['completeMultipartUpload']>>[0]): Promise<FileNode> {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tconst upload = this.getMultipartUpload(uploadId)\n\t\t\tconst blobs: Blob[] = []\n\n\t\t\tfor (const part of parts.sort((left, right) => left.partNumber - right.partNumber)) {\n\t\t\t\tconst uploaded = upload.parts.get(part.partNumber)\n\t\t\t\tif (!uploaded || uploaded.etag !== part.etag) {\n\t\t\t\t\tthrow new FileBrowserAdapterError('not_found', `No uploaded part ${part.partNumber} exists for ${uploadId}`)\n\t\t\t\t}\n\t\t\t\tblobs.push(uploaded.blob)\n\t\t\t}\n\n\t\t\tconst blob = new Blob(blobs)\n\t\t\tif (blob.size !== upload.size) {\n\t\t\t\tthrow new FileBrowserAdapterError('invalid_path', `Multipart upload ${uploadId} size mismatch`)\n\t\t\t}\n\n\t\t\tconst entry: InMemoryEntry = {\n\t\t\t\tpath: upload.path,\n\t\t\t\tname: getFileBrowserBasename(upload.path),\n\t\t\t\tkind: 'file',\n\t\t\t\tsize: blob.size,\n\t\t\t\tmodifiedAt: this.timestamp(),\n\t\t\t\tetag: this.nextEtag(),\n\t\t\t\tblob\n\t\t\t}\n\t\t\tthis.entries.set(upload.path, entry)\n\t\t\tthis.multipartUploads.delete(uploadId)\n\n\t\t\treturn cloneNode(entry)\n\t\t})\n\t}\n\n\tprivate abortMultipartUploadEntry(uploadId: string): Promise<void> {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tthis.getMultipartUpload(uploadId)\n\t\t\tthis.multipartUploads.delete(uploadId)\n\t\t})\n\t}\n\n\tprivate getMultipartUpload(uploadId: string): InMemoryMultipartUpload {\n\t\tconst upload = this.multipartUploads.get(uploadId)\n\t\tif (!upload) {\n\t\t\tthrow new FileBrowserAdapterError('not_found', `No multipart upload exists for ${uploadId}`)\n\t\t}\n\t\treturn upload\n\t}\n\n\tprivate collectTree(path: string): InMemoryEntry[] {\n\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\treturn Array.from(this.entries.values())\n\t\t\t.filter((entry) => isFileBrowserDescendantOrSelf(normalized, entry.path))\n\t\t\t.sort((left, right) => left.path.localeCompare(right.path))\n\t}\n\n\tprivate assertFolderExists(path: string): void {\n\t\tconst entry = this.getEntry(path)\n\n\t\tif (entry.kind !== 'folder') {\n\t\t\tthrow new FileBrowserAdapterError('invalid_path', `Expected a folder at ${entry.path}`)\n\t\t}\n\t}\n\n\tprivate getEntry(path: string): InMemoryEntry {\n\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\tconst entry = this.entries.get(normalized)\n\n\t\tif (!entry) {\n\t\t\tthrow new FileBrowserAdapterError('not_found', `No file browser entry exists at ${normalized}`)\n\t\t}\n\n\t\treturn entry\n\t}\n\n\tprivate timestamp(): string {\n\t\treturn this.now().toISOString()\n\t}\n\n\tprivate nextEtag(): string {\n\t\tthis.etagSequence += 1\n\t\treturn `memory-${this.etagSequence}`\n\t}\n}\n\nexport function createInMemoryFileBrowserAdapter(\n\toptions?: InMemoryFileBrowserAdapterOptions\n): InMemoryFileBrowserAdapter {\n\treturn new InMemoryFileBrowserAdapter(options)\n}\n\nfunction cloneNode(entry: InMemoryEntry): FileNode {\n\tconst node: FileNode = {\n\t\tpath: entry.path,\n\t\tname: entry.name,\n\t\tkind: entry.kind\n\t}\n\n\tif (entry.size !== undefined) {\n\t\tnode.size = entry.size\n\t}\n\n\tif (entry.mimeType !== undefined) {\n\t\tnode.mimeType = entry.mimeType\n\t}\n\n\tif (entry.modifiedAt !== undefined) {\n\t\tnode.modifiedAt = entry.modifiedAt\n\t}\n\n\tif (entry.etag !== undefined) {\n\t\tnode.etag = entry.etag\n\t}\n\n\tif (entry.thumbnailUrl !== undefined) {\n\t\tnode.thumbnailUrl = entry.thumbnailUrl\n\t}\n\n\treturn node\n}\n\nfunction compareEntries(left: InMemoryEntry, right: InMemoryEntry): number {\n\tif (left.kind !== right.kind) {\n\t\treturn left.kind === 'folder' ? -1 : 1\n\t}\n\n\treturn left.name.localeCompare(right.name, undefined, {\n\t\tnumeric: true,\n\t\tsensitivity: 'base'\n\t})\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n\tif (signal?.aborted) {\n\t\tthrow new FileBrowserAdapterError('aborted', 'Operation was aborted')\n\t}\n}\n\nfunction toArchivePath(path: string): string {\n\treturn path.replace(/^\\/+/, '') || 'download'\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { S3CompatibleFileBrowserAdapter } from '../s3-compatible-adapter';
|
|
2
|
+
import type { S3CompatibleFileBrowserAdapterOptions } from '../s3-compatible-adapter';
|
|
3
|
+
export type R2FileBrowserAdapterOptions = S3CompatibleFileBrowserAdapterOptions;
|
|
4
|
+
export declare class R2FileBrowserAdapter extends S3CompatibleFileBrowserAdapter {
|
|
5
|
+
constructor(options?: R2FileBrowserAdapterOptions);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/r2/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAA;AACzE,OAAO,KAAK,EAAE,qCAAqC,EAAE,MAAM,0BAA0B,CAAA;AAErF,MAAM,MAAM,2BAA2B,GAAG,qCAAqC,CAAA;AAE/E,qBAAa,oBAAqB,SAAQ,8BAA8B;gBAC3D,OAAO,CAAC,EAAE,2BAA2B;CAGjD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { t as e } from "../../chunks/s3-compatible-adapter-D9agsn9e.js";
|
|
2
|
+
//#region src/adapters/r2/index.ts
|
|
3
|
+
var t = class extends e {
|
|
4
|
+
constructor(e) {
|
|
5
|
+
super("R2", e);
|
|
6
|
+
}
|
|
7
|
+
};
|
|
8
|
+
//#endregion
|
|
9
|
+
export { t as R2FileBrowserAdapter };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/adapters/r2/index.ts"],"sourcesContent":["import { S3CompatibleFileBrowserAdapter } from '../s3-compatible-adapter'\nimport type { S3CompatibleFileBrowserAdapterOptions } from '../s3-compatible-adapter'\n\nexport type R2FileBrowserAdapterOptions = S3CompatibleFileBrowserAdapterOptions\n\nexport class R2FileBrowserAdapter extends S3CompatibleFileBrowserAdapter {\n\tconstructor(options?: R2FileBrowserAdapterOptions) {\n\t\tsuper('R2', options)\n\t}\n}\n"],"mappings":";;AAKA,IAAa,IAAb,cAA0C,EAA+B;CACxE,YAAY,GAAuC;EAClD,MAAM,MAAM,CAAO;CACpB;AACD"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { S3CompatibleFileBrowserAdapter } from '../s3-compatible-adapter';
|
|
2
|
+
import type { S3CompatibleFileBrowserAdapterOptions } from '../s3-compatible-adapter';
|
|
3
|
+
export type S3FileBrowserAdapterOptions = S3CompatibleFileBrowserAdapterOptions;
|
|
4
|
+
export declare class S3FileBrowserAdapter extends S3CompatibleFileBrowserAdapter {
|
|
5
|
+
constructor(options?: S3FileBrowserAdapterOptions);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/s3/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAA;AACzE,OAAO,KAAK,EAAE,qCAAqC,EAAE,MAAM,0BAA0B,CAAA;AAErF,MAAM,MAAM,2BAA2B,GAAG,qCAAqC,CAAA;AAE/E,qBAAa,oBAAqB,SAAQ,8BAA8B;gBAC3D,OAAO,CAAC,EAAE,2BAA2B;CAGjD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { t as e } from "../../chunks/s3-compatible-adapter-D9agsn9e.js";
|
|
2
|
+
//#region src/adapters/s3/index.ts
|
|
3
|
+
var t = class extends e {
|
|
4
|
+
constructor(e) {
|
|
5
|
+
super("S3", e);
|
|
6
|
+
}
|
|
7
|
+
};
|
|
8
|
+
//#endregion
|
|
9
|
+
export { t as S3FileBrowserAdapter };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/adapters/s3/index.ts"],"sourcesContent":["import { S3CompatibleFileBrowserAdapter } from '../s3-compatible-adapter'\nimport type { S3CompatibleFileBrowserAdapterOptions } from '../s3-compatible-adapter'\n\nexport type S3FileBrowserAdapterOptions = S3CompatibleFileBrowserAdapterOptions\n\nexport class S3FileBrowserAdapter extends S3CompatibleFileBrowserAdapter {\n\tconstructor(options?: S3FileBrowserAdapterOptions) {\n\t\tsuper('S3', options)\n\t}\n}\n"],"mappings":";;AAKA,IAAa,IAAb,cAA0C,EAA+B;CACxE,YAAY,GAAuC;EAClD,MAAM,MAAM,CAAO;CACpB;AACD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { FileBrowserAdapter, FileBrowserListOptions, FileBrowserListResult, FileBrowserUploadOptions, FileNode } from '../core/types';
|
|
2
|
+
import type { CloudAdapterName, CloudFileBrowserAdapterOptions } from './cloud-adapter-base';
|
|
3
|
+
export type S3CompatibleClient = {
|
|
4
|
+
send(command: object): Promise<unknown>;
|
|
5
|
+
};
|
|
6
|
+
export type S3CompatibleFileBrowserAdapterOptions = CloudFileBrowserAdapterOptions & {
|
|
7
|
+
bucket?: string;
|
|
8
|
+
client?: S3CompatibleClient;
|
|
9
|
+
multipartPartSize?: number;
|
|
10
|
+
prefix?: string;
|
|
11
|
+
signedUrlExpiresIn?: number;
|
|
12
|
+
};
|
|
13
|
+
export declare class S3CompatibleFileBrowserAdapter implements FileBrowserAdapter {
|
|
14
|
+
createFolder?: NonNullable<FileBrowserAdapter['createFolder']>;
|
|
15
|
+
rename?: NonNullable<FileBrowserAdapter['rename']>;
|
|
16
|
+
move?: NonNullable<FileBrowserAdapter['move']>;
|
|
17
|
+
copy?: NonNullable<FileBrowserAdapter['copy']>;
|
|
18
|
+
stat?: NonNullable<FileBrowserAdapter['stat']>;
|
|
19
|
+
exists?: NonNullable<FileBrowserAdapter['exists']>;
|
|
20
|
+
createMultipartUpload?: NonNullable<FileBrowserAdapter['createMultipartUpload']>;
|
|
21
|
+
uploadPart?: NonNullable<FileBrowserAdapter['uploadPart']>;
|
|
22
|
+
completeMultipartUpload?: NonNullable<FileBrowserAdapter['completeMultipartUpload']>;
|
|
23
|
+
abortMultipartUpload?: NonNullable<FileBrowserAdapter['abortMultipartUpload']>;
|
|
24
|
+
bulkDownloadUrl?: NonNullable<FileBrowserAdapter['bulkDownloadUrl']>;
|
|
25
|
+
private readonly delegate?;
|
|
26
|
+
private readonly multipartSessions;
|
|
27
|
+
private readonly sdk?;
|
|
28
|
+
constructor(adapterName: CloudAdapterName, options?: S3CompatibleFileBrowserAdapterOptions);
|
|
29
|
+
list(path: string, opts?: FileBrowserListOptions): Promise<FileBrowserListResult>;
|
|
30
|
+
private createFolderEntry;
|
|
31
|
+
delete(paths: string[]): Promise<void>;
|
|
32
|
+
signedUrl(path: string): Promise<string>;
|
|
33
|
+
upload(path: string, file: File, opts?: FileBrowserUploadOptions): Promise<FileNode>;
|
|
34
|
+
private statEntry;
|
|
35
|
+
private existsEntries;
|
|
36
|
+
private copyEntries;
|
|
37
|
+
private createMultipartUploadEntry;
|
|
38
|
+
private uploadMultipartPart;
|
|
39
|
+
private completeMultipartUploadEntry;
|
|
40
|
+
private abortMultipartUploadEntry;
|
|
41
|
+
private resolveKeysForPath;
|
|
42
|
+
private objectExists;
|
|
43
|
+
private resolveUploadPath;
|
|
44
|
+
private getMultipartSession;
|
|
45
|
+
private pathToKey;
|
|
46
|
+
private pathToPrefix;
|
|
47
|
+
private keyToPath;
|
|
48
|
+
private send;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=s3-compatible-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3-compatible-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/s3-compatible-adapter.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACX,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,QAAQ,EAER,MAAM,eAAe,CAAA;AAGtB,OAAO,KAAK,EAAE,gBAAgB,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAA;AAE5F,MAAM,MAAM,kBAAkB,GAAG;IAChC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,qCAAqC,GAAG,8BAA8B,GAAG;IACpF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA;AAkDD,qBAAa,8BAA+B,YAAW,kBAAkB;IACxE,YAAY,CAAC,EAAE,WAAW,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAA;IAC9D,MAAM,CAAC,EAAE,WAAW,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAA;IAClD,IAAI,CAAC,EAAE,WAAW,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAA;IAC9C,IAAI,CAAC,EAAE,WAAW,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAA;IAC9C,IAAI,CAAC,EAAE,WAAW,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAA;IAC9C,MAAM,CAAC,EAAE,WAAW,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAA;IAClD,qBAAqB,CAAC,EAAE,WAAW,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,CAAC,CAAA;IAChF,UAAU,CAAC,EAAE,WAAW,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAA;IAC1D,uBAAuB,CAAC,EAAE,WAAW,CAAC,kBAAkB,CAAC,yBAAyB,CAAC,CAAC,CAAA;IACpF,oBAAoB,CAAC,EAAE,WAAW,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAA;IAC9E,eAAe,CAAC,EAAE,WAAW,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAA;IAEpE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAoC;IAC9D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAwC;IAC1E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAa;gBAEtB,WAAW,EAAE,gBAAgB,EAAE,OAAO,GAAE,qCAA0C;IAkCxF,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,sBAA2B,GAAG,OAAO,CAAC,qBAAqB,CAAC;YAuD7E,iBAAiB;IAwBzB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BtC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAexC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAE,wBAA6B,GAAG,OAAO,CAAC,QAAQ,CAAC;YA8BhF,SAAS;YA4CT,aAAa;YAmBb,WAAW;YAuBX,0BAA0B;YA0B1B,mBAAmB;YA8BnB,4BAA4B;YA+B5B,yBAAyB;YAYzB,kBAAkB;YA8BlB,YAAY;YAiBZ,iBAAiB;IAwB/B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,SAAS;YAaH,IAAI;CAOlB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SupabaseStorageFileBrowserAdapter } from './supabase-file-browser-adapter';
|
|
2
|
+
import type { SupabaseFileBrowserAdapterOptions } from './supabase-file-browser-adapter';
|
|
3
|
+
export type { SupabaseFileBrowserAdapterOptions };
|
|
4
|
+
export declare class SupabaseFileBrowserAdapter extends SupabaseStorageFileBrowserAdapter {
|
|
5
|
+
constructor(options?: SupabaseFileBrowserAdapterOptions);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/supabase/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAE,MAAM,iCAAiC,CAAA;AACnF,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,iCAAiC,CAAA;AAExF,YAAY,EAAE,iCAAiC,EAAE,CAAA;AAEjD,qBAAa,0BAA2B,SAAQ,iCAAiC;gBACpE,OAAO,CAAC,EAAE,iCAAiC;CAGvD"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { a as e, c as t, n, o as r, r as i } from "../../chunks/path-CPm7s9NF.js";
|
|
2
|
+
import { t as a } from "../../chunks/cloud-adapter-base-CBUoZYLS.js";
|
|
3
|
+
//#region src/adapters/supabase/supabase-file-browser-adapter.ts
|
|
4
|
+
var o = 100, s = 3600, c = ".emptyFolderPlaceholder", l = class {
|
|
5
|
+
createFolder;
|
|
6
|
+
rename;
|
|
7
|
+
move;
|
|
8
|
+
copy;
|
|
9
|
+
stat;
|
|
10
|
+
exists;
|
|
11
|
+
createMultipartUpload;
|
|
12
|
+
uploadPart;
|
|
13
|
+
completeMultipartUpload;
|
|
14
|
+
abortMultipartUpload;
|
|
15
|
+
bulkDownloadUrl;
|
|
16
|
+
delegate;
|
|
17
|
+
sdk;
|
|
18
|
+
constructor(e = {}) {
|
|
19
|
+
if (!e.client || !e.bucket) {
|
|
20
|
+
this.delegate = new a("Supabase", e), this.createFolder = this.delegate.createFolder?.bind(this.delegate), this.rename = this.delegate.rename?.bind(this.delegate), this.move = this.delegate.move?.bind(this.delegate), this.copy = this.delegate.copy?.bind(this.delegate), this.stat = this.delegate.stat?.bind(this.delegate), this.exists = this.delegate.exists?.bind(this.delegate), this.createMultipartUpload = this.delegate.createMultipartUpload?.bind(this.delegate), this.uploadPart = this.delegate.uploadPart?.bind(this.delegate), this.completeMultipartUpload = this.delegate.completeMultipartUpload?.bind(this.delegate), this.abortMultipartUpload = this.delegate.abortMultipartUpload?.bind(this.delegate), this.bulkDownloadUrl = this.delegate.bulkDownloadUrl?.bind(this.delegate);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
this.sdk = {
|
|
24
|
+
bucket: e.client.storage.from(e.bucket),
|
|
25
|
+
pageSize: Math.max(1, e.pageSize ?? o),
|
|
26
|
+
prefix: u(e.prefix),
|
|
27
|
+
signedUrlExpiresIn: e.signedUrlExpiresIn ?? s
|
|
28
|
+
}, this.createFolder = this.createFolderEntry.bind(this), this.copy = this.copyEntries.bind(this), this.stat = this.statEntry.bind(this), this.exists = this.existsEntries.bind(this);
|
|
29
|
+
}
|
|
30
|
+
async list(e, t = {}) {
|
|
31
|
+
if (!this.sdk) return this.delegate.list(e, t);
|
|
32
|
+
h(t.signal);
|
|
33
|
+
let n = d(t.cursor), r = await this.unwrap(this.sdk.bucket.list(this.pathToKey(e), {
|
|
34
|
+
limit: this.sdk.pageSize,
|
|
35
|
+
offset: n,
|
|
36
|
+
sortBy: {
|
|
37
|
+
column: "name",
|
|
38
|
+
order: "asc"
|
|
39
|
+
}
|
|
40
|
+
})), i = r.filter((e) => e.name !== c).map((t) => this.entryToNode(e, t)).sort(p);
|
|
41
|
+
return {
|
|
42
|
+
cursor: r.length === this.sdk.pageSize ? String(n + r.length) : void 0,
|
|
43
|
+
items: i
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
async createFolderEntry(e) {
|
|
47
|
+
let i = this.sdk;
|
|
48
|
+
if (!i) throw new t("not_supported", "Supabase adapter method createFolder requires a host-backed implementation.");
|
|
49
|
+
let a = r(e);
|
|
50
|
+
return await this.unwrap(i.bucket.upload(`${this.pathToKey(a)}/${c}`, "", {
|
|
51
|
+
contentType: "application/x-directory",
|
|
52
|
+
upsert: !1
|
|
53
|
+
})), {
|
|
54
|
+
kind: "folder",
|
|
55
|
+
name: n(a),
|
|
56
|
+
path: a
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async delete(e) {
|
|
60
|
+
if (!this.sdk) return this.delegate.delete(e);
|
|
61
|
+
if (!this.sdk.bucket.remove) throw new t("not_supported", "Supabase storage remove is not available on this client.");
|
|
62
|
+
let n = /* @__PURE__ */ new Set();
|
|
63
|
+
for (let t of e) for (let e of await this.resolveKeysForPath(t)) n.add(e);
|
|
64
|
+
n.size > 0 && await this.unwrap(this.sdk.bucket.remove(Array.from(n)));
|
|
65
|
+
}
|
|
66
|
+
async signedUrl(e) {
|
|
67
|
+
return this.sdk ? (await this.unwrap(this.sdk.bucket.createSignedUrl(this.pathToKey(e), this.sdk.signedUrlExpiresIn))).signedUrl : this.delegate.signedUrl(e);
|
|
68
|
+
}
|
|
69
|
+
async upload(e, t, r = {}) {
|
|
70
|
+
if (!this.sdk) return this.delegate.upload(e, t, r);
|
|
71
|
+
h(r.signal);
|
|
72
|
+
let i = await this.resolveUploadPath(e, r.onConflict);
|
|
73
|
+
return r.onProgress?.(0, t.size), h(r.signal), await this.unwrap(this.sdk.bucket.upload(this.pathToKey(i), t, {
|
|
74
|
+
contentType: t.type || void 0,
|
|
75
|
+
upsert: r.onConflict === "replace"
|
|
76
|
+
})), r.onProgress?.(t.size, t.size), {
|
|
77
|
+
kind: "file",
|
|
78
|
+
mimeType: t.type || void 0,
|
|
79
|
+
name: n(i) || t.name,
|
|
80
|
+
path: i,
|
|
81
|
+
size: t.size
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
async statEntry(e) {
|
|
85
|
+
let a = r(e), o = this.pathToKey(i(a)), s = n(a), c = (await this.unwrap(this.sdk.bucket.list(o, {
|
|
86
|
+
limit: this.sdk.pageSize,
|
|
87
|
+
offset: 0,
|
|
88
|
+
sortBy: {
|
|
89
|
+
column: "name",
|
|
90
|
+
order: "asc"
|
|
91
|
+
}
|
|
92
|
+
}))).find((e) => e.name === s);
|
|
93
|
+
if (!c) throw new t("not_found", `No Supabase storage entry exists at ${a}`);
|
|
94
|
+
return this.entryToNode(i(a), c);
|
|
95
|
+
}
|
|
96
|
+
async existsEntries(e) {
|
|
97
|
+
let t = {};
|
|
98
|
+
return await Promise.all(e.map(async (e) => {
|
|
99
|
+
let n = r(e);
|
|
100
|
+
try {
|
|
101
|
+
await this.statEntry(n), t[n] = !0;
|
|
102
|
+
} catch (e) {
|
|
103
|
+
if (!g(e)) throw e;
|
|
104
|
+
t[n] = !1;
|
|
105
|
+
}
|
|
106
|
+
})), t;
|
|
107
|
+
}
|
|
108
|
+
async copyEntries(i, a) {
|
|
109
|
+
if (!this.sdk.bucket.copy) throw new t("not_supported", "Supabase storage copy is not available on this client.");
|
|
110
|
+
for (let t of i) {
|
|
111
|
+
let i = r(t), o = `${this.pathToKey(i)}/`, s = this.pathToKey(e(a, n(i))), c = await this.resolveKeysForPath(i);
|
|
112
|
+
for (let e of c) {
|
|
113
|
+
let t = e.startsWith(o) ? e.slice(o.length) : n(r(e)), i = t ? `${s}/${t}` : s;
|
|
114
|
+
await this.unwrap(this.sdk.bucket.copy(e, i));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async resolveKeysForPath(e) {
|
|
119
|
+
let t = r(e), n = /* @__PURE__ */ new Set();
|
|
120
|
+
return await this.keyExists(t) && n.add(this.pathToKey(t)), await this.collectFolderKeys(this.pathToKey(t), n), Array.from(n);
|
|
121
|
+
}
|
|
122
|
+
async collectFolderKeys(e, t) {
|
|
123
|
+
let n = await this.unwrap(this.sdk.bucket.list(e, {
|
|
124
|
+
limit: this.sdk.pageSize,
|
|
125
|
+
offset: 0,
|
|
126
|
+
sortBy: {
|
|
127
|
+
column: "name",
|
|
128
|
+
order: "asc"
|
|
129
|
+
}
|
|
130
|
+
}));
|
|
131
|
+
for (let r of n) {
|
|
132
|
+
let n = e ? `${e}/${r.name}` : r.name;
|
|
133
|
+
f(r) ? await this.collectFolderKeys(n, t) : t.add(n);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async keyExists(e) {
|
|
137
|
+
try {
|
|
138
|
+
return await this.statEntry(e), !0;
|
|
139
|
+
} catch (e) {
|
|
140
|
+
if (g(e)) return !1;
|
|
141
|
+
throw e;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async resolveUploadPath(e, n) {
|
|
145
|
+
let i = r(e);
|
|
146
|
+
if (n === "replace" || !await this.keyExists(i)) return i;
|
|
147
|
+
if (n !== "keep-both") throw new t("conflict", `A file browser entry already exists at ${i}`);
|
|
148
|
+
for (let t = 1; t < 2 ** 53 - 1; t += 1) if (i = m(e, t), !await this.keyExists(i)) return i;
|
|
149
|
+
throw new t("conflict", `Could not allocate a unique file browser path for ${e}`);
|
|
150
|
+
}
|
|
151
|
+
entryToNode(t, n) {
|
|
152
|
+
let r = e(t, n.name);
|
|
153
|
+
return f(n) ? {
|
|
154
|
+
kind: "folder",
|
|
155
|
+
modifiedAt: n.updated_at ?? void 0,
|
|
156
|
+
name: n.name,
|
|
157
|
+
path: r
|
|
158
|
+
} : {
|
|
159
|
+
kind: "file",
|
|
160
|
+
mimeType: n.metadata?.mimetype,
|
|
161
|
+
modifiedAt: n.updated_at ?? void 0,
|
|
162
|
+
name: n.name,
|
|
163
|
+
path: r,
|
|
164
|
+
size: n.metadata?.size
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
pathToKey(e) {
|
|
168
|
+
let t = r(e), n = t === "/" ? "" : t.slice(1);
|
|
169
|
+
return this.sdk.prefix && n ? `${this.sdk.prefix}/${n}` : this.sdk.prefix || n;
|
|
170
|
+
}
|
|
171
|
+
async unwrap(e) {
|
|
172
|
+
let { data: n, error: r } = await e;
|
|
173
|
+
if (r) throw _(r);
|
|
174
|
+
if (n === null) throw new t("not_found", "Supabase storage returned no data.");
|
|
175
|
+
return n;
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
function u(e) {
|
|
179
|
+
return (e ?? "").trim().replace(/^\/+|\/+$/g, "");
|
|
180
|
+
}
|
|
181
|
+
function d(e) {
|
|
182
|
+
if (!e) return 0;
|
|
183
|
+
let t = Number.parseInt(e, 10);
|
|
184
|
+
return Number.isFinite(t) && t > 0 ? t : 0;
|
|
185
|
+
}
|
|
186
|
+
function f(e) {
|
|
187
|
+
return e.id === null || !e.metadata;
|
|
188
|
+
}
|
|
189
|
+
function p(e, t) {
|
|
190
|
+
return e.kind === t.kind ? e.name.localeCompare(t.name) : e.kind === "folder" ? -1 : 1;
|
|
191
|
+
}
|
|
192
|
+
function m(e, t) {
|
|
193
|
+
let i = r(e), a = n(i), o = a.lastIndexOf("."), s = o > 0, c = s ? a.slice(0, o) : a, l = s ? a.slice(o) : "";
|
|
194
|
+
return r(`${i.slice(0, Math.max(1, i.lastIndexOf("/")))}/${c} (${t})${l}`);
|
|
195
|
+
}
|
|
196
|
+
function h(e) {
|
|
197
|
+
if (e?.aborted) throw new t("aborted", "The operation was aborted.");
|
|
198
|
+
}
|
|
199
|
+
function g(e) {
|
|
200
|
+
return e instanceof t && e.code === "not_found";
|
|
201
|
+
}
|
|
202
|
+
function _(e) {
|
|
203
|
+
let n = typeof e.statusCode == "string" ? Number.parseInt(e.statusCode, 10) : e.statusCode;
|
|
204
|
+
return n === 403 || e.name === "AccessDenied" ? new t("access_denied", e.message ?? "Access denied by Supabase storage.", { cause: e }) : n === 404 || e.name === "NotFound" ? new t("not_found", e.message ?? "Supabase storage object was not found.", { cause: e }) : n === 409 || e.name === "Conflict" ? new t("conflict", e.message ?? "Supabase storage object already exists.", { cause: e }) : new t("not_supported", e.message ?? "Supabase storage request failed.", { cause: e });
|
|
205
|
+
}
|
|
206
|
+
//#endregion
|
|
207
|
+
//#region src/adapters/supabase/index.ts
|
|
208
|
+
var v = class extends l {
|
|
209
|
+
constructor(e) {
|
|
210
|
+
super(e);
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
//#endregion
|
|
214
|
+
export { v as SupabaseFileBrowserAdapter };
|
|
215
|
+
|
|
216
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/adapters/supabase/supabase-file-browser-adapter.ts","../../../src/adapters/supabase/index.ts"],"sourcesContent":["import { FileBrowserAdapterError } from '../../core/types'\nimport type {\n\tFileBrowserAdapter,\n\tFileBrowserListOptions,\n\tFileBrowserListResult,\n\tFileBrowserUploadOptions,\n\tFileNode\n} from '../../core/types'\nimport {\n\tgetFileBrowserBasename,\n\tgetFileBrowserDirname,\n\tjoinFileBrowserPath,\n\tnormalizeFileBrowserPath\n} from '../../core/path'\nimport { UnsupportedCloudFileBrowserAdapter } from '../cloud-adapter-base'\nimport type { CloudFileBrowserAdapterOptions } from '../cloud-adapter-base'\n\nexport type SupabaseStorageBucket = {\n\tcopy?: (fromPath: string, toPath: string) => Promise<SupabaseResult<{ path?: string }>>\n\tcreateSignedUrl: (path: string, expiresIn: number) => Promise<SupabaseResult<{ signedUrl: string }>>\n\tlist: (\n\t\tpath: string,\n\t\toptions?: {\n\t\t\tlimit?: number\n\t\t\toffset?: number\n\t\t\tsortBy?: { column: string; order: 'asc' | 'desc' }\n\t\t}\n\t) => Promise<SupabaseResult<SupabaseListEntry[]>>\n\tremove?: (paths: string[]) => Promise<SupabaseResult<unknown>>\n\tupload: (\n\t\tpath: string,\n\t\tfile: Blob | File | string,\n\t\toptions?: {\n\t\t\tcontentType?: string\n\t\t\tupsert?: boolean\n\t\t}\n\t) => Promise<SupabaseResult<{ path?: string }>>\n}\n\nexport type SupabaseClientLike = {\n\tstorage: {\n\t\tfrom(bucket: string): SupabaseStorageBucket\n\t}\n}\n\nexport type SupabaseFileBrowserAdapterOptions = CloudFileBrowserAdapterOptions & {\n\tbucket?: string\n\tclient?: SupabaseClientLike\n\tpageSize?: number\n\tprefix?: string\n\tsignedUrlExpiresIn?: number\n}\n\ntype SupabaseResult<T> = {\n\tdata: T | null\n\terror: SupabaseErrorLike | null\n}\n\ntype SupabaseErrorLike = {\n\tmessage?: string\n\tname?: string\n\tstatusCode?: number | string\n}\n\ntype SupabaseListEntry = {\n\tid?: string | null\n\tmetadata?: {\n\t\tmimetype?: string\n\t\tsize?: number\n\t} | null\n\tname: string\n\tupdated_at?: string | null\n}\n\ntype SupabaseSdkConfig = {\n\tbucket: SupabaseStorageBucket\n\tpageSize: number\n\tprefix: string\n\tsignedUrlExpiresIn: number\n}\n\nconst DEFAULT_PAGE_SIZE = 100\nconst DEFAULT_SIGNED_URL_EXPIRES_IN = 60 * 60\nconst EMPTY_FOLDER_MARKER = '.emptyFolderPlaceholder'\n\nexport class SupabaseStorageFileBrowserAdapter implements FileBrowserAdapter {\n\tcreateFolder?: NonNullable<FileBrowserAdapter['createFolder']>\n\trename?: NonNullable<FileBrowserAdapter['rename']>\n\tmove?: NonNullable<FileBrowserAdapter['move']>\n\tcopy?: NonNullable<FileBrowserAdapter['copy']>\n\tstat?: NonNullable<FileBrowserAdapter['stat']>\n\texists?: NonNullable<FileBrowserAdapter['exists']>\n\tcreateMultipartUpload?: NonNullable<FileBrowserAdapter['createMultipartUpload']>\n\tuploadPart?: NonNullable<FileBrowserAdapter['uploadPart']>\n\tcompleteMultipartUpload?: NonNullable<FileBrowserAdapter['completeMultipartUpload']>\n\tabortMultipartUpload?: NonNullable<FileBrowserAdapter['abortMultipartUpload']>\n\tbulkDownloadUrl?: NonNullable<FileBrowserAdapter['bulkDownloadUrl']>\n\n\tprivate readonly delegate?: UnsupportedCloudFileBrowserAdapter\n\tprivate readonly sdk?: SupabaseSdkConfig\n\n\tconstructor(options: SupabaseFileBrowserAdapterOptions = {}) {\n\t\tif (!options.client || !options.bucket) {\n\t\t\tthis.delegate = new UnsupportedCloudFileBrowserAdapter('Supabase', options)\n\t\t\tthis.createFolder = this.delegate.createFolder?.bind(this.delegate)\n\t\t\tthis.rename = this.delegate.rename?.bind(this.delegate)\n\t\t\tthis.move = this.delegate.move?.bind(this.delegate)\n\t\t\tthis.copy = this.delegate.copy?.bind(this.delegate)\n\t\t\tthis.stat = this.delegate.stat?.bind(this.delegate)\n\t\t\tthis.exists = this.delegate.exists?.bind(this.delegate)\n\t\t\tthis.createMultipartUpload = this.delegate.createMultipartUpload?.bind(this.delegate)\n\t\t\tthis.uploadPart = this.delegate.uploadPart?.bind(this.delegate)\n\t\t\tthis.completeMultipartUpload = this.delegate.completeMultipartUpload?.bind(this.delegate)\n\t\t\tthis.abortMultipartUpload = this.delegate.abortMultipartUpload?.bind(this.delegate)\n\t\t\tthis.bulkDownloadUrl = this.delegate.bulkDownloadUrl?.bind(this.delegate)\n\t\t\treturn\n\t\t}\n\n\t\tthis.sdk = {\n\t\t\tbucket: options.client.storage.from(options.bucket),\n\t\t\tpageSize: Math.max(1, options.pageSize ?? DEFAULT_PAGE_SIZE),\n\t\t\tprefix: normalizeObjectPrefix(options.prefix),\n\t\t\tsignedUrlExpiresIn: options.signedUrlExpiresIn ?? DEFAULT_SIGNED_URL_EXPIRES_IN\n\t\t}\n\t\tthis.createFolder = this.createFolderEntry.bind(this)\n\t\tthis.copy = this.copyEntries.bind(this)\n\t\tthis.stat = this.statEntry.bind(this)\n\t\tthis.exists = this.existsEntries.bind(this)\n\t}\n\n\tasync list(path: string, opts: FileBrowserListOptions = {}): Promise<FileBrowserListResult> {\n\t\tif (!this.sdk) {\n\t\t\treturn this.delegate!.list(path, opts)\n\t\t}\n\t\tthrowIfAborted(opts.signal)\n\t\tconst offset = parseCursor(opts.cursor)\n\t\tconst data = await this.unwrap(\n\t\t\tthis.sdk.bucket.list(this.pathToKey(path), {\n\t\t\t\tlimit: this.sdk.pageSize,\n\t\t\t\toffset,\n\t\t\t\tsortBy: { column: 'name', order: 'asc' }\n\t\t\t})\n\t\t)\n\n\t\tconst items = data\n\t\t\t.filter((entry) => entry.name !== EMPTY_FOLDER_MARKER)\n\t\t\t.map((entry) => this.entryToNode(path, entry))\n\t\t\t.sort(compareNodes)\n\n\t\treturn {\n\t\t\tcursor: data.length === this.sdk.pageSize ? String(offset + data.length) : undefined,\n\t\t\titems\n\t\t}\n\t}\n\n\tprivate async createFolderEntry(path: string): Promise<FileNode> {\n\t\tconst sdk = this.sdk\n\t\tif (!sdk) {\n\t\t\tthrow new FileBrowserAdapterError(\n\t\t\t\t'not_supported',\n\t\t\t\t'Supabase adapter method createFolder requires a host-backed implementation.'\n\t\t\t)\n\t\t}\n\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\tawait this.unwrap(\n\t\t\tsdk.bucket.upload(`${this.pathToKey(normalized)}/${EMPTY_FOLDER_MARKER}`, '', {\n\t\t\t\tcontentType: 'application/x-directory',\n\t\t\t\tupsert: false\n\t\t\t})\n\t\t)\n\t\treturn {\n\t\t\tkind: 'folder',\n\t\t\tname: getFileBrowserBasename(normalized),\n\t\t\tpath: normalized\n\t\t}\n\t}\n\n\tasync delete(paths: string[]): Promise<void> {\n\t\tif (!this.sdk) {\n\t\t\treturn this.delegate!.delete(paths)\n\t\t}\n\t\tif (!this.sdk.bucket.remove) {\n\t\t\tthrow new FileBrowserAdapterError('not_supported', 'Supabase storage remove is not available on this client.')\n\t\t}\n\n\t\tconst keys = new Set<string>()\n\t\tfor (const path of paths) {\n\t\t\tfor (const key of await this.resolveKeysForPath(path)) {\n\t\t\t\tkeys.add(key)\n\t\t\t}\n\t\t}\n\n\t\tif (keys.size > 0) {\n\t\t\tawait this.unwrap(this.sdk.bucket.remove(Array.from(keys)))\n\t\t}\n\t}\n\n\tasync signedUrl(path: string): Promise<string> {\n\t\tif (!this.sdk) {\n\t\t\treturn this.delegate!.signedUrl(path)\n\t\t}\n\n\t\tconst data = await this.unwrap(this.sdk.bucket.createSignedUrl(this.pathToKey(path), this.sdk.signedUrlExpiresIn))\n\t\treturn data.signedUrl\n\t}\n\n\tasync upload(path: string, file: File, opts: FileBrowserUploadOptions = {}): Promise<FileNode> {\n\t\tif (!this.sdk) {\n\t\t\treturn this.delegate!.upload(path, file, opts)\n\t\t}\n\t\tthrowIfAborted(opts.signal)\n\t\tconst normalized = await this.resolveUploadPath(path, opts.onConflict)\n\t\topts.onProgress?.(0, file.size)\n\t\tthrowIfAborted(opts.signal)\n\n\t\tawait this.unwrap(\n\t\t\tthis.sdk.bucket.upload(this.pathToKey(normalized), file, {\n\t\t\t\tcontentType: file.type || undefined,\n\t\t\t\tupsert: opts.onConflict === 'replace'\n\t\t\t})\n\t\t)\n\t\topts.onProgress?.(file.size, file.size)\n\n\t\treturn {\n\t\t\tkind: 'file',\n\t\t\tmimeType: file.type || undefined,\n\t\t\tname: getFileBrowserBasename(normalized) || file.name,\n\t\t\tpath: normalized,\n\t\t\tsize: file.size\n\t\t}\n\t}\n\n\tprivate async statEntry(path: string): Promise<FileNode> {\n\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\tconst parentKey = this.pathToKey(getFileBrowserDirname(normalized))\n\t\tconst basename = getFileBrowserBasename(normalized)\n\t\tconst entries = await this.unwrap(\n\t\t\tthis.sdk!.bucket.list(parentKey, {\n\t\t\t\tlimit: this.sdk!.pageSize,\n\t\t\t\toffset: 0,\n\t\t\t\tsortBy: { column: 'name', order: 'asc' }\n\t\t\t})\n\t\t)\n\t\tconst entry = entries.find((item) => item.name === basename)\n\t\tif (!entry) {\n\t\t\tthrow new FileBrowserAdapterError('not_found', `No Supabase storage entry exists at ${normalized}`)\n\t\t}\n\t\treturn this.entryToNode(getFileBrowserDirname(normalized), entry)\n\t}\n\n\tprivate async existsEntries(paths: string[]): Promise<Record<string, boolean>> {\n\t\tconst result: Record<string, boolean> = {}\n\t\tawait Promise.all(\n\t\t\tpaths.map(async (path) => {\n\t\t\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\t\t\ttry {\n\t\t\t\t\tawait this.statEntry(normalized)\n\t\t\t\t\tresult[normalized] = true\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!isAdapterNotFound(error)) {\n\t\t\t\t\t\tthrow error\n\t\t\t\t\t}\n\t\t\t\t\tresult[normalized] = false\n\t\t\t\t}\n\t\t\t})\n\t\t)\n\t\treturn result\n\t}\n\n\tprivate async copyEntries(from: string[], toDir: string): Promise<void> {\n\t\tif (!this.sdk!.bucket.copy) {\n\t\t\tthrow new FileBrowserAdapterError('not_supported', 'Supabase storage copy is not available on this client.')\n\t\t}\n\n\t\tfor (const sourcePath of from) {\n\t\t\tconst normalizedSource = normalizeFileBrowserPath(sourcePath)\n\t\t\tconst sourceBase = `${this.pathToKey(normalizedSource)}/`\n\t\t\tconst destinationBase = this.pathToKey(joinFileBrowserPath(toDir, getFileBrowserBasename(normalizedSource)))\n\t\t\tconst sourceKeys = await this.resolveKeysForPath(normalizedSource)\n\n\t\t\tfor (const sourceKey of sourceKeys) {\n\t\t\t\tconst suffix = sourceKey.startsWith(sourceBase)\n\t\t\t\t\t? sourceKey.slice(sourceBase.length)\n\t\t\t\t\t: getFileBrowserBasename(normalizeFileBrowserPath(sourceKey))\n\t\t\t\tconst destinationKey = suffix ? `${destinationBase}/${suffix}` : destinationBase\n\t\t\t\tawait this.unwrap(this.sdk!.bucket.copy(sourceKey, destinationKey))\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async resolveKeysForPath(path: string): Promise<string[]> {\n\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\tconst keys = new Set<string>()\n\n\t\tif (await this.keyExists(normalized)) {\n\t\t\tkeys.add(this.pathToKey(normalized))\n\t\t}\n\n\t\tawait this.collectFolderKeys(this.pathToKey(normalized), keys)\n\t\treturn Array.from(keys)\n\t}\n\n\tprivate async collectFolderKeys(folderKey: string, keys: Set<string>): Promise<void> {\n\t\tconst entries = await this.unwrap(\n\t\t\tthis.sdk!.bucket.list(folderKey, {\n\t\t\t\tlimit: this.sdk!.pageSize,\n\t\t\t\toffset: 0,\n\t\t\t\tsortBy: { column: 'name', order: 'asc' }\n\t\t\t})\n\t\t)\n\n\t\tfor (const entry of entries) {\n\t\t\tconst key = folderKey ? `${folderKey}/${entry.name}` : entry.name\n\t\t\tif (isSupabaseFolder(entry)) {\n\t\t\t\tawait this.collectFolderKeys(key, keys)\n\t\t\t} else {\n\t\t\t\tkeys.add(key)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async keyExists(path: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait this.statEntry(path)\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tif (isAdapterNotFound(error)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tprivate async resolveUploadPath(path: string, onConflict: FileBrowserUploadOptions['onConflict']): Promise<string> {\n\t\tlet normalized = normalizeFileBrowserPath(path)\n\t\tif (onConflict === 'replace') {\n\t\t\treturn normalized\n\t\t}\n\t\tif (!(await this.keyExists(normalized))) {\n\t\t\treturn normalized\n\t\t}\n\t\tif (onConflict !== 'keep-both') {\n\t\t\tthrow new FileBrowserAdapterError('conflict', `A file browser entry already exists at ${normalized}`)\n\t\t}\n\t\tfor (let index = 1; index < Number.MAX_SAFE_INTEGER; index += 1) {\n\t\t\tnormalized = addCopySuffix(path, index)\n\t\t\tif (!(await this.keyExists(normalized))) {\n\t\t\t\treturn normalized\n\t\t\t}\n\t\t}\n\t\tthrow new FileBrowserAdapterError('conflict', `Could not allocate a unique file browser path for ${path}`)\n\t}\n\n\tprivate entryToNode(parentPath: string, entry: SupabaseListEntry): FileNode {\n\t\tconst path = joinFileBrowserPath(parentPath, entry.name)\n\t\tif (isSupabaseFolder(entry)) {\n\t\t\treturn {\n\t\t\t\tkind: 'folder',\n\t\t\t\tmodifiedAt: entry.updated_at ?? undefined,\n\t\t\t\tname: entry.name,\n\t\t\t\tpath\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tkind: 'file',\n\t\t\tmimeType: entry.metadata?.mimetype,\n\t\t\tmodifiedAt: entry.updated_at ?? undefined,\n\t\t\tname: entry.name,\n\t\t\tpath,\n\t\t\tsize: entry.metadata?.size\n\t\t}\n\t}\n\n\tprivate pathToKey(path: string): string {\n\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\tconst relative = normalized === '/' ? '' : normalized.slice(1)\n\t\tif (this.sdk!.prefix && relative) {\n\t\t\treturn `${this.sdk!.prefix}/${relative}`\n\t\t}\n\t\treturn this.sdk!.prefix || relative\n\t}\n\n\tprivate async unwrap<T>(result: Promise<SupabaseResult<T>>): Promise<T> {\n\t\tconst { data, error } = await result\n\t\tif (error) {\n\t\t\tthrow toSupabaseAdapterError(error)\n\t\t}\n\t\tif (data === null) {\n\t\t\tthrow new FileBrowserAdapterError('not_found', 'Supabase storage returned no data.')\n\t\t}\n\t\treturn data\n\t}\n}\n\nfunction normalizeObjectPrefix(prefix: string | undefined): string {\n\treturn (prefix ?? '').trim().replace(/^\\/+|\\/+$/g, '')\n}\n\nfunction parseCursor(cursor: string | undefined): number {\n\tif (!cursor) {\n\t\treturn 0\n\t}\n\tconst parsed = Number.parseInt(cursor, 10)\n\treturn Number.isFinite(parsed) && parsed > 0 ? parsed : 0\n}\n\nfunction isSupabaseFolder(entry: SupabaseListEntry): boolean {\n\treturn entry.id === null || !entry.metadata\n}\n\nfunction compareNodes(left: FileNode, right: FileNode): number {\n\tif (left.kind !== right.kind) {\n\t\treturn left.kind === 'folder' ? -1 : 1\n\t}\n\treturn left.name.localeCompare(right.name)\n}\n\nfunction addCopySuffix(path: string, index: number): string {\n\tconst normalized = normalizeFileBrowserPath(path)\n\tconst basename = getFileBrowserBasename(normalized)\n\tconst dotIndex = basename.lastIndexOf('.')\n\tconst hasExtension = dotIndex > 0\n\tconst stem = hasExtension ? basename.slice(0, dotIndex) : basename\n\tconst extension = hasExtension ? basename.slice(dotIndex) : ''\n\tconst dir = normalized.slice(0, Math.max(1, normalized.lastIndexOf('/')))\n\treturn normalizeFileBrowserPath(`${dir}/${stem} (${index})${extension}`)\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n\tif (signal?.aborted) {\n\t\tthrow new FileBrowserAdapterError('aborted', 'The operation was aborted.')\n\t}\n}\n\nfunction isAdapterNotFound(error: unknown): boolean {\n\treturn error instanceof FileBrowserAdapterError && error.code === 'not_found'\n}\n\nfunction toSupabaseAdapterError(error: SupabaseErrorLike): FileBrowserAdapterError {\n\tconst status = typeof error.statusCode === 'string' ? Number.parseInt(error.statusCode, 10) : error.statusCode\n\tif (status === 403 || error.name === 'AccessDenied') {\n\t\treturn new FileBrowserAdapterError('access_denied', error.message ?? 'Access denied by Supabase storage.', {\n\t\t\tcause: error\n\t\t})\n\t}\n\tif (status === 404 || error.name === 'NotFound') {\n\t\treturn new FileBrowserAdapterError('not_found', error.message ?? 'Supabase storage object was not found.', {\n\t\t\tcause: error\n\t\t})\n\t}\n\tif (status === 409 || error.name === 'Conflict') {\n\t\treturn new FileBrowserAdapterError('conflict', error.message ?? 'Supabase storage object already exists.', {\n\t\t\tcause: error\n\t\t})\n\t}\n\treturn new FileBrowserAdapterError('not_supported', error.message ?? 'Supabase storage request failed.', {\n\t\tcause: error\n\t})\n}\n","import { SupabaseStorageFileBrowserAdapter } from './supabase-file-browser-adapter'\nimport type { SupabaseFileBrowserAdapterOptions } from './supabase-file-browser-adapter'\n\nexport type { SupabaseFileBrowserAdapterOptions }\n\nexport class SupabaseFileBrowserAdapter extends SupabaseStorageFileBrowserAdapter {\n\tconstructor(options?: SupabaseFileBrowserAdapterOptions) {\n\t\tsuper(options)\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { FileBrowserAdapter, FileBrowserListOptions, FileBrowserListResult, FileBrowserUploadOptions, FileNode } from '../../core/types';
|
|
2
|
+
import type { CloudFileBrowserAdapterOptions } from '../cloud-adapter-base';
|
|
3
|
+
export type SupabaseStorageBucket = {
|
|
4
|
+
copy?: (fromPath: string, toPath: string) => Promise<SupabaseResult<{
|
|
5
|
+
path?: string;
|
|
6
|
+
}>>;
|
|
7
|
+
createSignedUrl: (path: string, expiresIn: number) => Promise<SupabaseResult<{
|
|
8
|
+
signedUrl: string;
|
|
9
|
+
}>>;
|
|
10
|
+
list: (path: string, options?: {
|
|
11
|
+
limit?: number;
|
|
12
|
+
offset?: number;
|
|
13
|
+
sortBy?: {
|
|
14
|
+
column: string;
|
|
15
|
+
order: 'asc' | 'desc';
|
|
16
|
+
};
|
|
17
|
+
}) => Promise<SupabaseResult<SupabaseListEntry[]>>;
|
|
18
|
+
remove?: (paths: string[]) => Promise<SupabaseResult<unknown>>;
|
|
19
|
+
upload: (path: string, file: Blob | File | string, options?: {
|
|
20
|
+
contentType?: string;
|
|
21
|
+
upsert?: boolean;
|
|
22
|
+
}) => Promise<SupabaseResult<{
|
|
23
|
+
path?: string;
|
|
24
|
+
}>>;
|
|
25
|
+
};
|
|
26
|
+
export type SupabaseClientLike = {
|
|
27
|
+
storage: {
|
|
28
|
+
from(bucket: string): SupabaseStorageBucket;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
export type SupabaseFileBrowserAdapterOptions = CloudFileBrowserAdapterOptions & {
|
|
32
|
+
bucket?: string;
|
|
33
|
+
client?: SupabaseClientLike;
|
|
34
|
+
pageSize?: number;
|
|
35
|
+
prefix?: string;
|
|
36
|
+
signedUrlExpiresIn?: number;
|
|
37
|
+
};
|
|
38
|
+
type SupabaseResult<T> = {
|
|
39
|
+
data: T | null;
|
|
40
|
+
error: SupabaseErrorLike | null;
|
|
41
|
+
};
|
|
42
|
+
type SupabaseErrorLike = {
|
|
43
|
+
message?: string;
|
|
44
|
+
name?: string;
|
|
45
|
+
statusCode?: number | string;
|
|
46
|
+
};
|
|
47
|
+
type SupabaseListEntry = {
|
|
48
|
+
id?: string | null;
|
|
49
|
+
metadata?: {
|
|
50
|
+
mimetype?: string;
|
|
51
|
+
size?: number;
|
|
52
|
+
} | null;
|
|
53
|
+
name: string;
|
|
54
|
+
updated_at?: string | null;
|
|
55
|
+
};
|
|
56
|
+
export declare class SupabaseStorageFileBrowserAdapter implements FileBrowserAdapter {
|
|
57
|
+
createFolder?: NonNullable<FileBrowserAdapter['createFolder']>;
|
|
58
|
+
rename?: NonNullable<FileBrowserAdapter['rename']>;
|
|
59
|
+
move?: NonNullable<FileBrowserAdapter['move']>;
|
|
60
|
+
copy?: NonNullable<FileBrowserAdapter['copy']>;
|
|
61
|
+
stat?: NonNullable<FileBrowserAdapter['stat']>;
|
|
62
|
+
exists?: NonNullable<FileBrowserAdapter['exists']>;
|
|
63
|
+
createMultipartUpload?: NonNullable<FileBrowserAdapter['createMultipartUpload']>;
|
|
64
|
+
uploadPart?: NonNullable<FileBrowserAdapter['uploadPart']>;
|
|
65
|
+
completeMultipartUpload?: NonNullable<FileBrowserAdapter['completeMultipartUpload']>;
|
|
66
|
+
abortMultipartUpload?: NonNullable<FileBrowserAdapter['abortMultipartUpload']>;
|
|
67
|
+
bulkDownloadUrl?: NonNullable<FileBrowserAdapter['bulkDownloadUrl']>;
|
|
68
|
+
private readonly delegate?;
|
|
69
|
+
private readonly sdk?;
|
|
70
|
+
constructor(options?: SupabaseFileBrowserAdapterOptions);
|
|
71
|
+
list(path: string, opts?: FileBrowserListOptions): Promise<FileBrowserListResult>;
|
|
72
|
+
private createFolderEntry;
|
|
73
|
+
delete(paths: string[]): Promise<void>;
|
|
74
|
+
signedUrl(path: string): Promise<string>;
|
|
75
|
+
upload(path: string, file: File, opts?: FileBrowserUploadOptions): Promise<FileNode>;
|
|
76
|
+
private statEntry;
|
|
77
|
+
private existsEntries;
|
|
78
|
+
private copyEntries;
|
|
79
|
+
private resolveKeysForPath;
|
|
80
|
+
private collectFolderKeys;
|
|
81
|
+
private keyExists;
|
|
82
|
+
private resolveUploadPath;
|
|
83
|
+
private entryToNode;
|
|
84
|
+
private pathToKey;
|
|
85
|
+
private unwrap;
|
|
86
|
+
}
|
|
87
|
+
export {};
|
|
88
|
+
//# sourceMappingURL=supabase-file-browser-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase-file-browser-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/supabase/supabase-file-browser-adapter.ts"],"names":[],"mappings":"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"}
|