@harryy/react-file-browser 1.0.0 → 1.1.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.
Files changed (37) hide show
  1. package/README.md +91 -5
  2. package/dist/adapters/cloud-adapter-base.d.ts +17 -17
  3. package/dist/adapters/cloud-adapter-base.d.ts.map +1 -1
  4. package/dist/adapters/in-memory/in-memory-file-browser-adapter.d.ts +18 -17
  5. package/dist/adapters/in-memory/in-memory-file-browser-adapter.d.ts.map +1 -1
  6. package/dist/adapters/in-memory/index.js +10 -2
  7. package/dist/adapters/in-memory/index.js.map +1 -1
  8. package/dist/adapters/r2/index.d.ts +3 -3
  9. package/dist/adapters/r2/index.d.ts.map +1 -1
  10. package/dist/adapters/r2/index.js.map +1 -1
  11. package/dist/adapters/s3/index.d.ts +3 -3
  12. package/dist/adapters/s3/index.d.ts.map +1 -1
  13. package/dist/adapters/s3/index.js.map +1 -1
  14. package/dist/adapters/s3-compatible-adapter.d.ts +16 -16
  15. package/dist/adapters/s3-compatible-adapter.d.ts.map +1 -1
  16. package/dist/adapters/supabase/index.d.ts +2 -2
  17. package/dist/adapters/supabase/index.d.ts.map +1 -1
  18. package/dist/adapters/supabase/index.js.map +1 -1
  19. package/dist/adapters/supabase/supabase-file-browser-adapter.d.ts +16 -16
  20. package/dist/adapters/supabase/supabase-file-browser-adapter.d.ts.map +1 -1
  21. package/dist/chunks/cloud-adapter-base-CBUoZYLS.js.map +1 -1
  22. package/dist/chunks/path-CPm7s9NF.js.map +1 -1
  23. package/dist/chunks/s3-compatible-adapter-D9agsn9e.js.map +1 -1
  24. package/dist/components/file-browser.d.ts +24 -4
  25. package/dist/components/file-browser.d.ts.map +1 -1
  26. package/dist/core/types.d.ts +12 -10
  27. package/dist/core/types.d.ts.map +1 -1
  28. package/dist/core/use-file-browser.d.ts +25 -13
  29. package/dist/core/use-file-browser.d.ts.map +1 -1
  30. package/dist/index.d.ts +1 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +1238 -1058
  33. package/dist/index.js.map +1 -1
  34. package/dist/transfers/file-browser-provider.d.ts.map +1 -1
  35. package/dist/transfers/transfer-manager.d.ts +7 -3
  36. package/dist/transfers/transfer-manager.d.ts.map +1 -1
  37. package/package.json +1 -1
@@ -1 +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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"}
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<TMetadata = unknown> = CloudFileBrowserAdapterOptions<TMetadata> & {\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<TMetadata = unknown> implements FileBrowserAdapter<TMetadata> {\n\tcreateFolder?: NonNullable<FileBrowserAdapter<TMetadata>['createFolder']>\n\trename?: NonNullable<FileBrowserAdapter<TMetadata>['rename']>\n\tmove?: NonNullable<FileBrowserAdapter<TMetadata>['move']>\n\tcopy?: NonNullable<FileBrowserAdapter<TMetadata>['copy']>\n\tstat?: NonNullable<FileBrowserAdapter<TMetadata>['stat']>\n\texists?: NonNullable<FileBrowserAdapter<TMetadata>['exists']>\n\tcreateMultipartUpload?: NonNullable<FileBrowserAdapter<TMetadata>['createMultipartUpload']>\n\tuploadPart?: NonNullable<FileBrowserAdapter<TMetadata>['uploadPart']>\n\tcompleteMultipartUpload?: NonNullable<FileBrowserAdapter<TMetadata>['completeMultipartUpload']>\n\tabortMultipartUpload?: NonNullable<FileBrowserAdapter<TMetadata>['abortMultipartUpload']>\n\tbulkDownloadUrl?: NonNullable<FileBrowserAdapter<TMetadata>['bulkDownloadUrl']>\n\n\tprivate readonly delegate?: UnsupportedCloudFileBrowserAdapter<TMetadata>\n\tprivate readonly sdk?: SupabaseSdkConfig\n\n\tconstructor(options: SupabaseFileBrowserAdapterOptions<TMetadata> = {}) {\n\t\tif (!options.client || !options.bucket) {\n\t\t\tthis.delegate = new UnsupportedCloudFileBrowserAdapter<TMetadata>('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<TMetadata>> {\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<TMetadata>> {\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<TMetadata>> {\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<TMetadata>> {\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<TMetadata> {\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<TMetadata = unknown> extends SupabaseStorageFileBrowserAdapter<TMetadata> {\n\tconstructor(options?: SupabaseFileBrowserAdapterOptions<TMetadata>) {\n\t\tsuper(options)\n\t}\n}\n"],"mappings":"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"}
@@ -28,7 +28,7 @@ export type SupabaseClientLike = {
28
28
  from(bucket: string): SupabaseStorageBucket;
29
29
  };
30
30
  };
31
- export type SupabaseFileBrowserAdapterOptions = CloudFileBrowserAdapterOptions & {
31
+ export type SupabaseFileBrowserAdapterOptions<TMetadata = unknown> = CloudFileBrowserAdapterOptions<TMetadata> & {
32
32
  bucket?: string;
33
33
  client?: SupabaseClientLike;
34
34
  pageSize?: number;
@@ -53,26 +53,26 @@ type SupabaseListEntry = {
53
53
  name: string;
54
54
  updated_at?: string | null;
55
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']>;
56
+ export declare class SupabaseStorageFileBrowserAdapter<TMetadata = unknown> implements FileBrowserAdapter<TMetadata> {
57
+ createFolder?: NonNullable<FileBrowserAdapter<TMetadata>['createFolder']>;
58
+ rename?: NonNullable<FileBrowserAdapter<TMetadata>['rename']>;
59
+ move?: NonNullable<FileBrowserAdapter<TMetadata>['move']>;
60
+ copy?: NonNullable<FileBrowserAdapter<TMetadata>['copy']>;
61
+ stat?: NonNullable<FileBrowserAdapter<TMetadata>['stat']>;
62
+ exists?: NonNullable<FileBrowserAdapter<TMetadata>['exists']>;
63
+ createMultipartUpload?: NonNullable<FileBrowserAdapter<TMetadata>['createMultipartUpload']>;
64
+ uploadPart?: NonNullable<FileBrowserAdapter<TMetadata>['uploadPart']>;
65
+ completeMultipartUpload?: NonNullable<FileBrowserAdapter<TMetadata>['completeMultipartUpload']>;
66
+ abortMultipartUpload?: NonNullable<FileBrowserAdapter<TMetadata>['abortMultipartUpload']>;
67
+ bulkDownloadUrl?: NonNullable<FileBrowserAdapter<TMetadata>['bulkDownloadUrl']>;
68
68
  private readonly delegate?;
69
69
  private readonly sdk?;
70
- constructor(options?: SupabaseFileBrowserAdapterOptions);
71
- list(path: string, opts?: FileBrowserListOptions): Promise<FileBrowserListResult>;
70
+ constructor(options?: SupabaseFileBrowserAdapterOptions<TMetadata>);
71
+ list(path: string, opts?: FileBrowserListOptions): Promise<FileBrowserListResult<TMetadata>>;
72
72
  private createFolderEntry;
73
73
  delete(paths: string[]): Promise<void>;
74
74
  signedUrl(path: string): Promise<string>;
75
- upload(path: string, file: File, opts?: FileBrowserUploadOptions): Promise<FileNode>;
75
+ upload(path: string, file: File, opts?: FileBrowserUploadOptions): Promise<FileNode<TMetadata>>;
76
76
  private statEntry;
77
77
  private existsEntries;
78
78
  private copyEntries;
@@ -1 +1 @@
1
- {"version":3,"file":"supabase-file-browser-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/supabase/supabase-file-browser-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,QAAQ,EACR,MAAM,kBAAkB,CAAA;AAQzB,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAA;AAE3E,MAAM,MAAM,qBAAqB,GAAG;IACnC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;IACvF,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;IACpG,IAAI,EAAE,CACL,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,MAAM,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAA;SAAE,CAAA;KAClD,KACG,OAAO,CAAC,cAAc,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAA;IACjD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;IAC9D,MAAM,EAAE,CACP,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EAC1B,OAAO,CAAC,EAAE;QACT,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,MAAM,CAAC,EAAE,OAAO,CAAA;KAChB,KACG,OAAO,CAAC,cAAc,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;CAC/C,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAChC,OAAO,EAAE;QACR,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB,CAAA;KAC3C,CAAA;CACD,CAAA;AAED,MAAM,MAAM,iCAAiC,GAAG,8BAA8B,GAAG;IAChF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,KAAK,cAAc,CAAC,CAAC,IAAI;IACxB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IACd,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAA;CAC/B,CAAA;AAED,KAAK,iBAAiB,GAAG;IACxB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAC5B,CAAA;AAED,KAAK,iBAAiB,GAAG;IACxB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,QAAQ,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,IAAI,CAAC,EAAE,MAAM,CAAA;KACb,GAAG,IAAI,CAAA;IACR,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B,CAAA;AAaD,qBAAa,iCAAkC,YAAW,kBAAkB;IAC3E,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,GAAG,CAAC,CAAmB;gBAE5B,OAAO,GAAE,iCAAsC;IA6BrD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,sBAA2B,GAAG,OAAO,CAAC,qBAAqB,CAAC;YAyB7E,iBAAiB;IAsBzB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBtC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASxC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAE,wBAA6B,GAAG,OAAO,CAAC,QAAQ,CAAC;YA0BhF,SAAS;YAkBT,aAAa;YAmBb,WAAW;YAqBX,kBAAkB;YAYlB,iBAAiB;YAmBjB,SAAS;YAYT,iBAAiB;IAoB/B,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,SAAS;YASH,MAAM;CAUpB"}
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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-adapter-base-CBUoZYLS.js","names":[],"sources":["../../src/adapters/cloud-adapter-base.ts"],"sourcesContent":["import { FileBrowserAdapterError } from '../core/types'\nimport type {\n\tFileBrowserAdapter,\n\tFileBrowserListOptions,\n\tFileBrowserListResult,\n\tFileBrowserUploadOptions,\n\tFileNode\n} from '../core/types'\n\nexport type CloudAdapterName = 'S3' | 'R2' | 'Supabase'\n\nexport type CloudFileBrowserAdapterOptions = {\n\timplementation?: FileBrowserAdapter\n}\n\nexport class UnsupportedCloudFileBrowserAdapter implements FileBrowserAdapter {\n\treadonly rename?: NonNullable<FileBrowserAdapter['rename']>\n\treadonly createFolder?: NonNullable<FileBrowserAdapter['createFolder']>\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 createMultipartUpload?: NonNullable<FileBrowserAdapter['createMultipartUpload']>\n\treadonly uploadPart?: NonNullable<FileBrowserAdapter['uploadPart']>\n\treadonly completeMultipartUpload?: NonNullable<FileBrowserAdapter['completeMultipartUpload']>\n\treadonly abortMultipartUpload?: NonNullable<FileBrowserAdapter['abortMultipartUpload']>\n\treadonly bulkDownloadUrl?: NonNullable<FileBrowserAdapter['bulkDownloadUrl']>\n\n\tprivate readonly implementation?: FileBrowserAdapter\n\n\tconstructor(\n\t\tprivate readonly adapterName: CloudAdapterName,\n\t\toptions: CloudFileBrowserAdapterOptions = {}\n\t) {\n\t\tthis.implementation = options.implementation\n\n\t\tif (this.implementation?.rename) {\n\t\t\tthis.rename = this.implementation.rename.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.createFolder) {\n\t\t\tthis.createFolder = this.implementation.createFolder.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.move) {\n\t\t\tthis.move = this.implementation.move.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.copy) {\n\t\t\tthis.copy = this.implementation.copy.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.stat) {\n\t\t\tthis.stat = this.implementation.stat.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.exists) {\n\t\t\tthis.exists = this.implementation.exists.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.createMultipartUpload) {\n\t\t\tthis.createMultipartUpload = this.implementation.createMultipartUpload.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.uploadPart) {\n\t\t\tthis.uploadPart = this.implementation.uploadPart.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.completeMultipartUpload) {\n\t\t\tthis.completeMultipartUpload = this.implementation.completeMultipartUpload.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.abortMultipartUpload) {\n\t\t\tthis.abortMultipartUpload = this.implementation.abortMultipartUpload.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.bulkDownloadUrl) {\n\t\t\tthis.bulkDownloadUrl = this.implementation.bulkDownloadUrl.bind(this.implementation)\n\t\t}\n\t}\n\n\tlist(path: string, opts?: FileBrowserListOptions): Promise<FileBrowserListResult> {\n\t\tif (this.implementation) {\n\t\t\treturn this.implementation.list(path, opts)\n\t\t}\n\t\tvoid path\n\t\tvoid opts\n\t\treturn Promise.reject(this.error('list'))\n\t}\n\n\tdelete(paths: string[]): Promise<void> {\n\t\tif (this.implementation) {\n\t\t\treturn this.implementation.delete(paths)\n\t\t}\n\t\tvoid paths\n\t\treturn Promise.reject(this.error('delete'))\n\t}\n\n\tsignedUrl(path: string): Promise<string> {\n\t\tif (this.implementation) {\n\t\t\treturn this.implementation.signedUrl(path)\n\t\t}\n\t\tvoid path\n\t\treturn Promise.reject(this.error('signedUrl'))\n\t}\n\n\tupload(path: string, file: File, opts?: FileBrowserUploadOptions): Promise<FileNode> {\n\t\tif (this.implementation) {\n\t\t\treturn this.implementation.upload(path, file, opts)\n\t\t}\n\t\tvoid path\n\t\tvoid file\n\t\tvoid opts\n\t\treturn Promise.reject(this.error('upload'))\n\t}\n\n\tprivate error(method: string): FileBrowserAdapterError {\n\t\treturn new FileBrowserAdapterError(\n\t\t\t'not_supported',\n\t\t\t`${this.adapterName} adapter method ${method} requires a host-backed implementation.`\n\t\t)\n\t}\n}\n"],"mappings":";;AAeA,IAAa,IAAb,MAA8E;CAgB3D;CAflB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CAEA,YACC,GACA,IAA0C,CAAC,GAC1C;EAiCD,AAnCiB,KAAA,cAAA,GAGjB,KAAK,iBAAiB,EAAQ,gBAE1B,KAAK,gBAAgB,WACxB,KAAK,SAAS,KAAK,eAAe,OAAO,KAAK,KAAK,cAAc,IAE9D,KAAK,gBAAgB,iBACxB,KAAK,eAAe,KAAK,eAAe,aAAa,KAAK,KAAK,cAAc,IAE1E,KAAK,gBAAgB,SACxB,KAAK,OAAO,KAAK,eAAe,KAAK,KAAK,KAAK,cAAc,IAE1D,KAAK,gBAAgB,SACxB,KAAK,OAAO,KAAK,eAAe,KAAK,KAAK,KAAK,cAAc,IAE1D,KAAK,gBAAgB,SACxB,KAAK,OAAO,KAAK,eAAe,KAAK,KAAK,KAAK,cAAc,IAE1D,KAAK,gBAAgB,WACxB,KAAK,SAAS,KAAK,eAAe,OAAO,KAAK,KAAK,cAAc,IAE9D,KAAK,gBAAgB,0BACxB,KAAK,wBAAwB,KAAK,eAAe,sBAAsB,KAAK,KAAK,cAAc,IAE5F,KAAK,gBAAgB,eACxB,KAAK,aAAa,KAAK,eAAe,WAAW,KAAK,KAAK,cAAc,IAEtE,KAAK,gBAAgB,4BACxB,KAAK,0BAA0B,KAAK,eAAe,wBAAwB,KAAK,KAAK,cAAc,IAEhG,KAAK,gBAAgB,yBACxB,KAAK,uBAAuB,KAAK,eAAe,qBAAqB,KAAK,KAAK,cAAc,IAE1F,KAAK,gBAAgB,oBACxB,KAAK,kBAAkB,KAAK,eAAe,gBAAgB,KAAK,KAAK,cAAc;CAErF;CAEA,KAAK,GAAc,GAA+D;EAMjF,OALI,KAAK,iBACD,KAAK,eAAe,KAAK,GAAM,CAAI,IAIpC,QAAQ,OAAO,KAAK,MAAM,MAAM,CAAC;CACzC;CAEA,OAAO,GAAgC;EAKtC,OAJI,KAAK,iBACD,KAAK,eAAe,OAAO,CAAK,IAGjC,QAAQ,OAAO,KAAK,MAAM,QAAQ,CAAC;CAC3C;CAEA,UAAU,GAA+B;EAKxC,OAJI,KAAK,iBACD,KAAK,eAAe,UAAU,CAAI,IAGnC,QAAQ,OAAO,KAAK,MAAM,WAAW,CAAC;CAC9C;CAEA,OAAO,GAAc,GAAY,GAAoD;EAOpF,OANI,KAAK,iBACD,KAAK,eAAe,OAAO,GAAM,GAAM,CAAI,IAK5C,QAAQ,OAAO,KAAK,MAAM,QAAQ,CAAC;CAC3C;CAEA,MAAc,GAAyC;EACtD,OAAO,IAAI,EACV,iBACA,GAAG,KAAK,YAAY,kBAAkB,EAAO,wCAC9C;CACD;AACD"}
1
+ {"version":3,"file":"cloud-adapter-base-CBUoZYLS.js","names":[],"sources":["../../src/adapters/cloud-adapter-base.ts"],"sourcesContent":["import { FileBrowserAdapterError } from '../core/types'\nimport type {\n\tFileBrowserAdapter,\n\tFileBrowserListOptions,\n\tFileBrowserListResult,\n\tFileBrowserUploadOptions,\n\tFileNode\n} from '../core/types'\n\nexport type CloudAdapterName = 'S3' | 'R2' | 'Supabase'\n\nexport type CloudFileBrowserAdapterOptions<TMetadata = unknown> = {\n\timplementation?: FileBrowserAdapter<TMetadata>\n}\n\nexport class UnsupportedCloudFileBrowserAdapter<TMetadata = unknown> implements FileBrowserAdapter<TMetadata> {\n\treadonly rename?: NonNullable<FileBrowserAdapter<TMetadata>['rename']>\n\treadonly createFolder?: NonNullable<FileBrowserAdapter<TMetadata>['createFolder']>\n\treadonly move?: NonNullable<FileBrowserAdapter<TMetadata>['move']>\n\treadonly copy?: NonNullable<FileBrowserAdapter<TMetadata>['copy']>\n\treadonly stat?: NonNullable<FileBrowserAdapter<TMetadata>['stat']>\n\treadonly exists?: NonNullable<FileBrowserAdapter<TMetadata>['exists']>\n\treadonly createMultipartUpload?: NonNullable<FileBrowserAdapter<TMetadata>['createMultipartUpload']>\n\treadonly uploadPart?: NonNullable<FileBrowserAdapter<TMetadata>['uploadPart']>\n\treadonly completeMultipartUpload?: NonNullable<FileBrowserAdapter<TMetadata>['completeMultipartUpload']>\n\treadonly abortMultipartUpload?: NonNullable<FileBrowserAdapter<TMetadata>['abortMultipartUpload']>\n\treadonly bulkDownloadUrl?: NonNullable<FileBrowserAdapter<TMetadata>['bulkDownloadUrl']>\n\n\tprivate readonly implementation?: FileBrowserAdapter<TMetadata>\n\n\tconstructor(\n\t\tprivate readonly adapterName: CloudAdapterName,\n\t\toptions: CloudFileBrowserAdapterOptions<TMetadata> = {}\n\t) {\n\t\tthis.implementation = options.implementation\n\n\t\tif (this.implementation?.rename) {\n\t\t\tthis.rename = this.implementation.rename.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.createFolder) {\n\t\t\tthis.createFolder = this.implementation.createFolder.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.move) {\n\t\t\tthis.move = this.implementation.move.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.copy) {\n\t\t\tthis.copy = this.implementation.copy.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.stat) {\n\t\t\tthis.stat = this.implementation.stat.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.exists) {\n\t\t\tthis.exists = this.implementation.exists.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.createMultipartUpload) {\n\t\t\tthis.createMultipartUpload = this.implementation.createMultipartUpload.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.uploadPart) {\n\t\t\tthis.uploadPart = this.implementation.uploadPart.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.completeMultipartUpload) {\n\t\t\tthis.completeMultipartUpload = this.implementation.completeMultipartUpload.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.abortMultipartUpload) {\n\t\t\tthis.abortMultipartUpload = this.implementation.abortMultipartUpload.bind(this.implementation)\n\t\t}\n\t\tif (this.implementation?.bulkDownloadUrl) {\n\t\t\tthis.bulkDownloadUrl = this.implementation.bulkDownloadUrl.bind(this.implementation)\n\t\t}\n\t}\n\n\tlist(path: string, opts?: FileBrowserListOptions): Promise<FileBrowserListResult<TMetadata>> {\n\t\tif (this.implementation) {\n\t\t\treturn this.implementation.list(path, opts)\n\t\t}\n\t\tvoid path\n\t\tvoid opts\n\t\treturn Promise.reject(this.error('list'))\n\t}\n\n\tdelete(paths: string[]): Promise<void> {\n\t\tif (this.implementation) {\n\t\t\treturn this.implementation.delete(paths)\n\t\t}\n\t\tvoid paths\n\t\treturn Promise.reject(this.error('delete'))\n\t}\n\n\tsignedUrl(path: string): Promise<string> {\n\t\tif (this.implementation) {\n\t\t\treturn this.implementation.signedUrl(path)\n\t\t}\n\t\tvoid path\n\t\treturn Promise.reject(this.error('signedUrl'))\n\t}\n\n\tupload(path: string, file: File, opts?: FileBrowserUploadOptions): Promise<FileNode<TMetadata>> {\n\t\tif (this.implementation) {\n\t\t\treturn this.implementation.upload(path, file, opts)\n\t\t}\n\t\tvoid path\n\t\tvoid file\n\t\tvoid opts\n\t\treturn Promise.reject(this.error('upload'))\n\t}\n\n\tprivate error(method: string): FileBrowserAdapterError {\n\t\treturn new FileBrowserAdapterError(\n\t\t\t'not_supported',\n\t\t\t`${this.adapterName} adapter method ${method} requires a host-backed implementation.`\n\t\t)\n\t}\n}\n"],"mappings":";;AAeA,IAAa,IAAb,MAA8G;CAgB3F;CAflB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CAEA,YACC,GACA,IAAqD,CAAC,GACrD;EAiCD,AAnCiB,KAAA,cAAA,GAGjB,KAAK,iBAAiB,EAAQ,gBAE1B,KAAK,gBAAgB,WACxB,KAAK,SAAS,KAAK,eAAe,OAAO,KAAK,KAAK,cAAc,IAE9D,KAAK,gBAAgB,iBACxB,KAAK,eAAe,KAAK,eAAe,aAAa,KAAK,KAAK,cAAc,IAE1E,KAAK,gBAAgB,SACxB,KAAK,OAAO,KAAK,eAAe,KAAK,KAAK,KAAK,cAAc,IAE1D,KAAK,gBAAgB,SACxB,KAAK,OAAO,KAAK,eAAe,KAAK,KAAK,KAAK,cAAc,IAE1D,KAAK,gBAAgB,SACxB,KAAK,OAAO,KAAK,eAAe,KAAK,KAAK,KAAK,cAAc,IAE1D,KAAK,gBAAgB,WACxB,KAAK,SAAS,KAAK,eAAe,OAAO,KAAK,KAAK,cAAc,IAE9D,KAAK,gBAAgB,0BACxB,KAAK,wBAAwB,KAAK,eAAe,sBAAsB,KAAK,KAAK,cAAc,IAE5F,KAAK,gBAAgB,eACxB,KAAK,aAAa,KAAK,eAAe,WAAW,KAAK,KAAK,cAAc,IAEtE,KAAK,gBAAgB,4BACxB,KAAK,0BAA0B,KAAK,eAAe,wBAAwB,KAAK,KAAK,cAAc,IAEhG,KAAK,gBAAgB,yBACxB,KAAK,uBAAuB,KAAK,eAAe,qBAAqB,KAAK,KAAK,cAAc,IAE1F,KAAK,gBAAgB,oBACxB,KAAK,kBAAkB,KAAK,eAAe,gBAAgB,KAAK,KAAK,cAAc;CAErF;CAEA,KAAK,GAAc,GAA0E;EAM5F,OALI,KAAK,iBACD,KAAK,eAAe,KAAK,GAAM,CAAI,IAIpC,QAAQ,OAAO,KAAK,MAAM,MAAM,CAAC;CACzC;CAEA,OAAO,GAAgC;EAKtC,OAJI,KAAK,iBACD,KAAK,eAAe,OAAO,CAAK,IAGjC,QAAQ,OAAO,KAAK,MAAM,QAAQ,CAAC;CAC3C;CAEA,UAAU,GAA+B;EAKxC,OAJI,KAAK,iBACD,KAAK,eAAe,UAAU,CAAI,IAGnC,QAAQ,OAAO,KAAK,MAAM,WAAW,CAAC;CAC9C;CAEA,OAAO,GAAc,GAAY,GAA+D;EAO/F,OANI,KAAK,iBACD,KAAK,eAAe,OAAO,GAAM,GAAM,CAAI,IAK5C,QAAQ,OAAO,KAAK,MAAM,QAAQ,CAAC;CAC3C;CAEA,MAAc,GAAyC;EACtD,OAAO,IAAI,EACV,iBACA,GAAG,KAAK,YAAY,kBAAkB,EAAO,wCAC9C;CACD;AACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"path-CPm7s9NF.js","names":[],"sources":["../../src/core/types.ts","../../src/core/path.ts"],"sourcesContent":["export type FileNodeKind = 'file' | 'folder'\n\nexport type FileNode = {\n\tpath: string\n\tname: string\n\tkind: FileNodeKind\n\tsize?: number\n\tmimeType?: string\n\tmodifiedAt?: string\n\tetag?: string\n\tthumbnailUrl?: string\n}\n\nexport type FileBrowserListOptions = {\n\tcursor?: string\n\tsignal?: AbortSignal\n}\n\nexport type FileBrowserListResult = {\n\titems: FileNode[]\n\tcursor?: string\n}\n\nexport type FileBrowserUploadOptions = {\n\tonProgress?: (loaded: number, total: number) => void\n\tonConflict?: 'replace' | 'keep-both'\n\tsignal?: AbortSignal\n}\n\nexport type MultipartUploadPart = {\n\tpartNumber: number\n\tetag: string\n}\n\nexport type FileBrowserAdapter = {\n\tlist(path: string, opts?: FileBrowserListOptions): Promise<FileBrowserListResult>\n\tcreateFolder?(path: string): Promise<FileNode>\n\tdelete(paths: string[]): Promise<void>\n\tsignedUrl(path: string): Promise<string>\n\tupload(path: string, file: File, opts?: FileBrowserUploadOptions): Promise<FileNode>\n\n\trename?(path: string, newName: string): Promise<FileNode>\n\tmove?(from: string[], toDir: string): Promise<void>\n\tcopy?(from: string[], toDir: string): Promise<void>\n\tstat?(path: string): Promise<FileNode>\n\texists?(paths: string[]): Promise<Record<string, boolean>>\n\n\tcreateMultipartUpload?(path: string, size: number): Promise<{ uploadId: string; partSize: number }>\n\tuploadPart?(args: {\n\t\tuploadId: string\n\t\tpartNumber: number\n\t\tchunk: Blob\n\t\tsignal?: AbortSignal\n\t\tonProgress?: (loaded: number) => void\n\t}): Promise<{ etag: string }>\n\tcompleteMultipartUpload?(args: { uploadId: string; parts: MultipartUploadPart[] }): Promise<FileNode>\n\tabortMultipartUpload?(uploadId: string): Promise<void>\n\n\tbulkDownloadUrl?(paths: string[]): Promise<{ url: string; expiresAt: string }>\n}\n\nexport class FileBrowserAdapterError extends Error {\n\treadonly code: 'access_denied' | 'aborted' | 'conflict' | 'invalid_path' | 'not_found' | 'not_supported'\n\n\tconstructor(code: FileBrowserAdapterError['code'], message: string, options?: ErrorOptions) {\n\t\tsuper(message, options)\n\t\tthis.name = 'FileBrowserAdapterError'\n\t\tthis.code = code\n\t}\n}\n\nexport type FileBrowserBulkAction = 'delete' | 'move' | 'copy'\n\nexport type FileBrowserBulkActionFailure = {\n\tpath: string\n\tmessage: string\n}\n\nexport class FileBrowserBulkActionError extends Error {\n\treadonly action: FileBrowserBulkAction\n\treadonly succeededPaths: string[]\n\treadonly failures: FileBrowserBulkActionFailure[]\n\treadonly totalCount: number\n\n\tconstructor(\n\t\taction: FileBrowserBulkAction,\n\t\toptions: {\n\t\t\tsucceededPaths: string[]\n\t\t\tfailures: FileBrowserBulkActionFailure[]\n\t\t\ttotalCount: number\n\t\t\tmessage?: string\n\t\t}\n\t) {\n\t\tsuper(options.message ?? `${options.succeededPaths.length} of ${options.totalCount} ${action} operations completed`)\n\t\tthis.name = 'FileBrowserBulkActionError'\n\t\tthis.action = action\n\t\tthis.succeededPaths = options.succeededPaths\n\t\tthis.failures = options.failures\n\t\tthis.totalCount = options.totalCount\n\t}\n}\n","import { FileBrowserAdapterError } from './types'\n\nexport const ROOT_PATH = '/'\n\nexport function normalizeFileBrowserPath(path: string): string {\n\tconst trimmed = path.trim()\n\n\tif (!trimmed || trimmed === ROOT_PATH) {\n\t\treturn ROOT_PATH\n\t}\n\n\tconst normalized = `/${trimmed}`.replace(/\\\\/g, '/').replace(/\\/+/g, '/').replace(/\\/$/, '')\n\n\treturn normalized === '' ? ROOT_PATH : normalized\n}\n\nexport function getFileBrowserBasename(path: string): string {\n\tconst normalized = normalizeFileBrowserPath(path)\n\n\tif (normalized === ROOT_PATH) {\n\t\treturn ''\n\t}\n\n\treturn normalized.slice(normalized.lastIndexOf('/') + 1)\n}\n\nexport function getFileBrowserDirname(path: string): string {\n\tconst normalized = normalizeFileBrowserPath(path)\n\n\tif (normalized === ROOT_PATH) {\n\t\treturn ROOT_PATH\n\t}\n\n\tconst index = normalized.lastIndexOf('/')\n\treturn index <= 0 ? ROOT_PATH : normalized.slice(0, index)\n}\n\nexport function joinFileBrowserPath(dir: string, name: string): string {\n\tassertValidFileBrowserName(name)\n\tconst normalizedDir = normalizeFileBrowserPath(dir)\n\treturn normalizeFileBrowserPath(normalizedDir === ROOT_PATH ? `/${name}` : `${normalizedDir}/${name}`)\n}\n\nexport function assertValidFileBrowserName(name: string): void {\n\tconst trimmed = name.trim()\n\n\tif (!trimmed || trimmed.includes('/') || trimmed.includes('\\\\')) {\n\t\tthrow new FileBrowserAdapterError('invalid_path', `Invalid file browser name: ${name}`)\n\t}\n}\n\nexport function isFileBrowserDescendantOrSelf(parentPath: string, candidatePath: string): boolean {\n\tconst parent = normalizeFileBrowserPath(parentPath)\n\tconst candidate = normalizeFileBrowserPath(candidatePath)\n\n\tif (parent === ROOT_PATH) {\n\t\treturn true\n\t}\n\n\treturn candidate === parent || candidate.startsWith(`${parent}/`)\n}\n\nexport function replaceFileBrowserPathPrefix(path: string, fromPrefix: string, toPrefix: string): string {\n\tconst normalizedPath = normalizeFileBrowserPath(path)\n\tconst normalizedFrom = normalizeFileBrowserPath(fromPrefix)\n\tconst normalizedTo = normalizeFileBrowserPath(toPrefix)\n\n\tif (normalizedPath === normalizedFrom) {\n\t\treturn normalizedTo\n\t}\n\n\tif (!normalizedPath.startsWith(`${normalizedFrom}/`)) {\n\t\treturn normalizedPath\n\t}\n\n\treturn normalizeFileBrowserPath(`${normalizedTo}${normalizedPath.slice(normalizedFrom.length)}`)\n}\n"],"mappings":";AA6DA,IAAa,IAAb,cAA6C,MAAM;CAClD;CAEA,YAAY,GAAuC,GAAiB,GAAwB;EAG3F,AAFA,MAAM,GAAS,CAAO,GACtB,KAAK,OAAO,2BACZ,KAAK,OAAO;CACb;AACD,GASa,IAAb,cAAgD,MAAM;CACrD;CACA;CACA;CACA;CAEA,YACC,GACA,GAMC;EAMD,AALA,MAAM,EAAQ,WAAW,GAAG,EAAQ,eAAe,OAAO,MAAM,EAAQ,WAAW,GAAG,EAAO,sBAAsB,GACnH,KAAK,OAAO,8BACZ,KAAK,SAAS,GACd,KAAK,iBAAiB,EAAQ,gBAC9B,KAAK,WAAW,EAAQ,UACxB,KAAK,aAAa,EAAQ;CAC3B;AACD,GClGa,IAAY;AAEzB,SAAgB,EAAyB,GAAsB;CAC9D,IAAM,IAAU,EAAK,KAAK;CAE1B,IAAI,CAAC,KAAW,MAAA,KACf,OAAA;CAGD,IAAM,IAAa,IAAI,IAAU,QAAQ,OAAO,GAAG,CAAC,CAAC,QAAQ,QAAQ,GAAG,CAAC,CAAC,QAAQ,OAAO,EAAE;CAE3F,OAAO,MAAe,KAAA,MAAiB;AACxC;AAEA,SAAgB,EAAuB,GAAsB;CAC5D,IAAM,IAAa,EAAyB,CAAI;CAMhD,OAJI,MAAA,MACI,KAGD,EAAW,MAAM,EAAW,YAAY,GAAG,IAAI,CAAC;AACxD;AAEA,SAAgB,EAAsB,GAAsB;CAC3D,IAAM,IAAa,EAAyB,CAAI;CAEhD,IAAI,MAAA,KACH,OAAA;CAGD,IAAM,IAAQ,EAAW,YAAY,GAAG;CACxC,OAAO,KAAS,IAAA,MAAgB,EAAW,MAAM,GAAG,CAAK;AAC1D;AAEA,SAAgB,EAAoB,GAAa,GAAsB;CACtE,EAA2B,CAAI;CAC/B,IAAM,IAAgB,EAAyB,CAAG;CAClD,OAAO,EAAyB,MAAA,MAA8B,IAAI,MAAS,GAAG,EAAc,GAAG,GAAM;AACtG;AAEA,SAAgB,EAA2B,GAAoB;CAC9D,IAAM,IAAU,EAAK,KAAK;CAE1B,IAAI,CAAC,KAAW,EAAQ,SAAS,GAAG,KAAK,EAAQ,SAAS,IAAI,GAC7D,MAAM,IAAI,EAAwB,gBAAgB,8BAA8B,GAAM;AAExF;AAEA,SAAgB,EAA8B,GAAoB,GAAgC;CACjG,IAAM,IAAS,EAAyB,CAAU,GAC5C,IAAY,EAAyB,CAAa;CAMxD,OAJI,MAAA,MACI,KAGD,MAAc,KAAU,EAAU,WAAW,GAAG,EAAO,EAAE;AACjE;AAEA,SAAgB,EAA6B,GAAc,GAAoB,GAA0B;CACxG,IAAM,IAAiB,EAAyB,CAAI,GAC9C,IAAiB,EAAyB,CAAU,GACpD,IAAe,EAAyB,CAAQ;CAUtD,OARI,MAAmB,IACf,IAGH,EAAe,WAAW,GAAG,EAAe,EAAE,IAI5C,EAAyB,GAAG,IAAe,EAAe,MAAM,EAAe,MAAM,GAAG,IAHvF;AAIT"}
1
+ {"version":3,"file":"path-CPm7s9NF.js","names":[],"sources":["../../src/core/types.ts","../../src/core/path.ts"],"sourcesContent":["export type FileNodeKind = 'file' | 'folder'\n\nexport type FileNode<TMetadata = unknown> = {\n\tid?: string\n\tpath: string\n\tname: string\n\tkind: FileNodeKind\n\tsize?: number\n\tmimeType?: string\n\tmodifiedAt?: string\n\tetag?: string\n\tthumbnailUrl?: string\n\tmetadata?: TMetadata\n}\n\nexport type FileBrowserListOptions = {\n\tcursor?: string\n\tsignal?: AbortSignal\n}\n\nexport type FileBrowserListResult<TMetadata = unknown> = {\n\titems: FileNode<TMetadata>[]\n\tcursor?: string\n}\n\nexport type FileBrowserUploadOptions = {\n\tonProgress?: (loaded: number, total: number) => void\n\tonConflict?: 'replace' | 'keep-both'\n\tsignal?: AbortSignal\n}\n\nexport type MultipartUploadPart = {\n\tpartNumber: number\n\tetag: string\n}\n\nexport type FileBrowserAdapter<TMetadata = unknown> = {\n\tlist(path: string, opts?: FileBrowserListOptions): Promise<FileBrowserListResult<TMetadata>>\n\tcreateFolder?(path: string): Promise<FileNode<TMetadata>>\n\tdelete(paths: string[]): Promise<void>\n\tsignedUrl(path: string): Promise<string>\n\tupload(path: string, file: File, opts?: FileBrowserUploadOptions): Promise<FileNode<TMetadata>>\n\n\trename?(path: string, newName: string): Promise<FileNode<TMetadata>>\n\tmove?(from: string[], toDir: string): Promise<void>\n\tcopy?(from: string[], toDir: string): Promise<void>\n\tstat?(path: string): Promise<FileNode<TMetadata>>\n\texists?(paths: string[]): Promise<Record<string, boolean>>\n\n\tcreateMultipartUpload?(path: string, size: number): Promise<{ uploadId: string; partSize: number }>\n\tuploadPart?(args: {\n\t\tuploadId: string\n\t\tpartNumber: number\n\t\tchunk: Blob\n\t\tsignal?: AbortSignal\n\t\tonProgress?: (loaded: number) => void\n\t}): Promise<{ etag: string }>\n\tcompleteMultipartUpload?(args: { uploadId: string; parts: MultipartUploadPart[] }): Promise<FileNode<TMetadata>>\n\tabortMultipartUpload?(uploadId: string): Promise<void>\n\n\tbulkDownloadUrl?(paths: string[]): Promise<{ url: string; expiresAt: string }>\n}\n\nexport class FileBrowserAdapterError extends Error {\n\treadonly code: 'access_denied' | 'aborted' | 'conflict' | 'invalid_path' | 'not_found' | 'not_supported'\n\n\tconstructor(code: FileBrowserAdapterError['code'], message: string, options?: ErrorOptions) {\n\t\tsuper(message, options)\n\t\tthis.name = 'FileBrowserAdapterError'\n\t\tthis.code = code\n\t}\n}\n\nexport type FileBrowserBulkAction = 'delete' | 'move' | 'copy'\n\nexport type FileBrowserBulkActionFailure = {\n\tpath: string\n\tmessage: string\n}\n\nexport class FileBrowserBulkActionError extends Error {\n\treadonly action: FileBrowserBulkAction\n\treadonly succeededPaths: string[]\n\treadonly failures: FileBrowserBulkActionFailure[]\n\treadonly totalCount: number\n\n\tconstructor(\n\t\taction: FileBrowserBulkAction,\n\t\toptions: {\n\t\t\tsucceededPaths: string[]\n\t\t\tfailures: FileBrowserBulkActionFailure[]\n\t\t\ttotalCount: number\n\t\t\tmessage?: string\n\t\t}\n\t) {\n\t\tsuper(options.message ?? `${options.succeededPaths.length} of ${options.totalCount} ${action} operations completed`)\n\t\tthis.name = 'FileBrowserBulkActionError'\n\t\tthis.action = action\n\t\tthis.succeededPaths = options.succeededPaths\n\t\tthis.failures = options.failures\n\t\tthis.totalCount = options.totalCount\n\t}\n}\n","import { FileBrowserAdapterError } from './types'\n\nexport const ROOT_PATH = '/'\n\nexport function normalizeFileBrowserPath(path: string): string {\n\tconst trimmed = path.trim()\n\n\tif (!trimmed || trimmed === ROOT_PATH) {\n\t\treturn ROOT_PATH\n\t}\n\n\tconst normalized = `/${trimmed}`.replace(/\\\\/g, '/').replace(/\\/+/g, '/').replace(/\\/$/, '')\n\n\treturn normalized === '' ? ROOT_PATH : normalized\n}\n\nexport function getFileBrowserBasename(path: string): string {\n\tconst normalized = normalizeFileBrowserPath(path)\n\n\tif (normalized === ROOT_PATH) {\n\t\treturn ''\n\t}\n\n\treturn normalized.slice(normalized.lastIndexOf('/') + 1)\n}\n\nexport function getFileBrowserDirname(path: string): string {\n\tconst normalized = normalizeFileBrowserPath(path)\n\n\tif (normalized === ROOT_PATH) {\n\t\treturn ROOT_PATH\n\t}\n\n\tconst index = normalized.lastIndexOf('/')\n\treturn index <= 0 ? ROOT_PATH : normalized.slice(0, index)\n}\n\nexport function joinFileBrowserPath(dir: string, name: string): string {\n\tassertValidFileBrowserName(name)\n\tconst normalizedDir = normalizeFileBrowserPath(dir)\n\treturn normalizeFileBrowserPath(normalizedDir === ROOT_PATH ? `/${name}` : `${normalizedDir}/${name}`)\n}\n\nexport function assertValidFileBrowserName(name: string): void {\n\tconst trimmed = name.trim()\n\n\tif (!trimmed || trimmed.includes('/') || trimmed.includes('\\\\')) {\n\t\tthrow new FileBrowserAdapterError('invalid_path', `Invalid file browser name: ${name}`)\n\t}\n}\n\nexport function isFileBrowserDescendantOrSelf(parentPath: string, candidatePath: string): boolean {\n\tconst parent = normalizeFileBrowserPath(parentPath)\n\tconst candidate = normalizeFileBrowserPath(candidatePath)\n\n\tif (parent === ROOT_PATH) {\n\t\treturn true\n\t}\n\n\treturn candidate === parent || candidate.startsWith(`${parent}/`)\n}\n\nexport function replaceFileBrowserPathPrefix(path: string, fromPrefix: string, toPrefix: string): string {\n\tconst normalizedPath = normalizeFileBrowserPath(path)\n\tconst normalizedFrom = normalizeFileBrowserPath(fromPrefix)\n\tconst normalizedTo = normalizeFileBrowserPath(toPrefix)\n\n\tif (normalizedPath === normalizedFrom) {\n\t\treturn normalizedTo\n\t}\n\n\tif (!normalizedPath.startsWith(`${normalizedFrom}/`)) {\n\t\treturn normalizedPath\n\t}\n\n\treturn normalizeFileBrowserPath(`${normalizedTo}${normalizedPath.slice(normalizedFrom.length)}`)\n}\n"],"mappings":";AA+DA,IAAa,IAAb,cAA6C,MAAM;CAClD;CAEA,YAAY,GAAuC,GAAiB,GAAwB;EAG3F,AAFA,MAAM,GAAS,CAAO,GACtB,KAAK,OAAO,2BACZ,KAAK,OAAO;CACb;AACD,GASa,IAAb,cAAgD,MAAM;CACrD;CACA;CACA;CACA;CAEA,YACC,GACA,GAMC;EAMD,AALA,MAAM,EAAQ,WAAW,GAAG,EAAQ,eAAe,OAAO,MAAM,EAAQ,WAAW,GAAG,EAAO,sBAAsB,GACnH,KAAK,OAAO,8BACZ,KAAK,SAAS,GACd,KAAK,iBAAiB,EAAQ,gBAC9B,KAAK,WAAW,EAAQ,UACxB,KAAK,aAAa,EAAQ;CAC3B;AACD,GCpGa,IAAY;AAEzB,SAAgB,EAAyB,GAAsB;CAC9D,IAAM,IAAU,EAAK,KAAK;CAE1B,IAAI,CAAC,KAAW,MAAA,KACf,OAAA;CAGD,IAAM,IAAa,IAAI,IAAU,QAAQ,OAAO,GAAG,CAAC,CAAC,QAAQ,QAAQ,GAAG,CAAC,CAAC,QAAQ,OAAO,EAAE;CAE3F,OAAO,MAAe,KAAA,MAAiB;AACxC;AAEA,SAAgB,EAAuB,GAAsB;CAC5D,IAAM,IAAa,EAAyB,CAAI;CAMhD,OAJI,MAAA,MACI,KAGD,EAAW,MAAM,EAAW,YAAY,GAAG,IAAI,CAAC;AACxD;AAEA,SAAgB,EAAsB,GAAsB;CAC3D,IAAM,IAAa,EAAyB,CAAI;CAEhD,IAAI,MAAA,KACH,OAAA;CAGD,IAAM,IAAQ,EAAW,YAAY,GAAG;CACxC,OAAO,KAAS,IAAA,MAAgB,EAAW,MAAM,GAAG,CAAK;AAC1D;AAEA,SAAgB,EAAoB,GAAa,GAAsB;CACtE,EAA2B,CAAI;CAC/B,IAAM,IAAgB,EAAyB,CAAG;CAClD,OAAO,EAAyB,MAAA,MAA8B,IAAI,MAAS,GAAG,EAAc,GAAG,GAAM;AACtG;AAEA,SAAgB,EAA2B,GAAoB;CAC9D,IAAM,IAAU,EAAK,KAAK;CAE1B,IAAI,CAAC,KAAW,EAAQ,SAAS,GAAG,KAAK,EAAQ,SAAS,IAAI,GAC7D,MAAM,IAAI,EAAwB,gBAAgB,8BAA8B,GAAM;AAExF;AAEA,SAAgB,EAA8B,GAAoB,GAAgC;CACjG,IAAM,IAAS,EAAyB,CAAU,GAC5C,IAAY,EAAyB,CAAa;CAMxD,OAJI,MAAA,MACI,KAGD,MAAc,KAAU,EAAU,WAAW,GAAG,EAAO,EAAE;AACjE;AAEA,SAAgB,EAA6B,GAAc,GAAoB,GAA0B;CACxG,IAAM,IAAiB,EAAyB,CAAI,GAC9C,IAAiB,EAAyB,CAAU,GACpD,IAAe,EAAyB,CAAQ;CAUtD,OARI,MAAmB,IACf,IAGH,EAAe,WAAW,GAAG,EAAe,EAAE,IAI5C,EAAyB,GAAG,IAAe,EAAe,MAAM,EAAe,MAAM,GAAG,IAHvF;AAIT"}
@@ -1 +1 @@
1
- {"version":3,"file":"s3-compatible-adapter-D9agsn9e.js","names":[],"sources":["../../src/adapters/s3-compatible-adapter.ts"],"sourcesContent":["import {\n\tAbortMultipartUploadCommand,\n\tCompleteMultipartUploadCommand,\n\tCopyObjectCommand,\n\tCreateMultipartUploadCommand,\n\tDeleteObjectsCommand,\n\tGetObjectCommand,\n\tHeadObjectCommand,\n\tListObjectsV2Command,\n\tPutObjectCommand,\n\tUploadPartCommand\n} from '@aws-sdk/client-s3'\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner'\nimport { FileBrowserAdapterError } from '../core/types'\nimport type {\n\tFileBrowserAdapter,\n\tFileBrowserListOptions,\n\tFileBrowserListResult,\n\tFileBrowserUploadOptions,\n\tFileNode,\n\tMultipartUploadPart\n} from '../core/types'\nimport { getFileBrowserBasename, joinFileBrowserPath, normalizeFileBrowserPath } from '../core/path'\nimport { UnsupportedCloudFileBrowserAdapter } from './cloud-adapter-base'\nimport type { CloudAdapterName, CloudFileBrowserAdapterOptions } from './cloud-adapter-base'\n\nexport type S3CompatibleClient = {\n\tsend(command: object): Promise<unknown>\n}\n\nexport type S3CompatibleFileBrowserAdapterOptions = CloudFileBrowserAdapterOptions & {\n\tbucket?: string\n\tclient?: S3CompatibleClient\n\tmultipartPartSize?: number\n\tprefix?: string\n\tsignedUrlExpiresIn?: number\n}\n\ntype S3SdkConfig = {\n\tbucket: string\n\tclient: S3CompatibleClient\n\tmultipartPartSize: number\n\tprefix: string\n\tsignedUrlExpiresIn: number\n}\n\ntype S3ListResponse = {\n\tCommonPrefixes?: Array<{ Prefix?: string }>\n\tContents?: Array<{\n\t\tContentType?: string\n\t\tETag?: string\n\t\tKey?: string\n\t\tLastModified?: Date\n\t\tSize?: number\n\t}>\n\tNextContinuationToken?: string\n}\n\ntype S3HeadResponse = {\n\tContentLength?: number\n\tContentType?: string\n\tETag?: string\n\tLastModified?: Date\n}\n\ntype S3PutResponse = {\n\tETag?: string\n}\n\ntype S3MultipartCreateResponse = {\n\tUploadId?: string\n}\n\ntype S3UploadPartResponse = {\n\tETag?: string\n}\n\ntype S3MultipartSession = {\n\tkey: string\n\tpath: string\n\tsize: number\n}\n\nconst DEFAULT_SIGNED_URL_EXPIRES_IN = 60 * 60\nconst DEFAULT_MULTIPART_PART_SIZE = 8 * 1024 * 1024\n\nexport class S3CompatibleFileBrowserAdapter 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 multipartSessions = new Map<string, S3MultipartSession>()\n\tprivate readonly sdk?: S3SdkConfig\n\n\tconstructor(adapterName: CloudAdapterName, options: S3CompatibleFileBrowserAdapterOptions = {}) {\n\t\tif (!options.client || !options.bucket) {\n\t\t\tthis.delegate = new UnsupportedCloudFileBrowserAdapter(adapterName, 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.bucket,\n\t\t\tclient: options.client,\n\t\t\tmultipartPartSize: Math.max(1, options.multipartPartSize ?? DEFAULT_MULTIPART_PART_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\tthis.createMultipartUpload = this.createMultipartUploadEntry.bind(this)\n\t\tthis.uploadPart = this.uploadMultipartPart.bind(this)\n\t\tthis.completeMultipartUpload = this.completeMultipartUploadEntry.bind(this)\n\t\tthis.abortMultipartUpload = this.abortMultipartUploadEntry.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\n\t\tthrowIfAborted(opts.signal)\n\t\tconst response = await this.send<S3ListResponse>(\n\t\t\tnew ListObjectsV2Command({\n\t\t\t\tBucket: this.sdk.bucket,\n\t\t\t\tContinuationToken: opts.cursor,\n\t\t\t\tDelimiter: '/',\n\t\t\t\tPrefix: this.pathToPrefix(path)\n\t\t\t})\n\t\t)\n\t\tconst folderItems =\n\t\t\tresponse.CommonPrefixes?.flatMap((entry) => {\n\t\t\t\tif (!entry.Prefix) {\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\tkind: 'folder' as const,\n\t\t\t\t\t\tname: getFileBrowserBasename(this.keyToPath(entry.Prefix, true)),\n\t\t\t\t\t\tpath: this.keyToPath(entry.Prefix, true)\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}) ?? []\n\t\tconst fileItems =\n\t\t\tresponse.Contents?.flatMap((entry) => {\n\t\t\t\tif (!entry.Key || entry.Key.endsWith('/')) {\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t\tconst path = this.keyToPath(entry.Key)\n\t\t\t\tif (path === normalizeFileBrowserPath(path)) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tetag: cleanEtag(entry.ETag),\n\t\t\t\t\t\t\tkind: 'file' as const,\n\t\t\t\t\t\t\tmimeType: entry.ContentType,\n\t\t\t\t\t\t\tmodifiedAt: entry.LastModified?.toISOString(),\n\t\t\t\t\t\t\tname: getFileBrowserBasename(path),\n\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\tsize: entry.Size\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\treturn []\n\t\t\t}) ?? []\n\n\t\treturn {\n\t\t\tcursor: response.NextContinuationToken,\n\t\t\titems: [...folderItems, ...fileItems].sort(compareNodes)\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'S3 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.send<S3PutResponse>(\n\t\t\tnew PutObjectCommand({\n\t\t\t\tBody: '',\n\t\t\t\tBucket: sdk.bucket,\n\t\t\t\tContentType: 'application/x-directory',\n\t\t\t\tKey: this.pathToPrefix(normalized)\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\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\tfor (const chunk of chunkArray(Array.from(keys), 1000)) {\n\t\t\tif (chunk.length === 0) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tawait this.send<unknown>(\n\t\t\t\tnew DeleteObjectsCommand({\n\t\t\t\t\tBucket: this.sdk.bucket,\n\t\t\t\t\tDelete: {\n\t\t\t\t\t\tObjects: chunk.map((key) => ({ Key: key })),\n\t\t\t\t\t\tQuiet: true\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t)\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\treturn getSignedUrl(\n\t\t\tthis.sdk.client as never,\n\t\t\tnew GetObjectCommand({\n\t\t\t\tBucket: this.sdk.bucket,\n\t\t\t\tKey: this.pathToKey(path)\n\t\t\t}),\n\t\t\t{ expiresIn: this.sdk.signedUrlExpiresIn }\n\t\t)\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\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\tconst response = await this.send<S3PutResponse>(\n\t\t\tnew PutObjectCommand({\n\t\t\t\tBody: file,\n\t\t\t\tBucket: this.sdk.bucket,\n\t\t\t\tContentType: file.type || undefined,\n\t\t\t\tKey: this.pathToKey(normalized)\n\t\t\t})\n\t\t)\n\t\topts.onProgress?.(file.size, file.size)\n\n\t\treturn {\n\t\t\tetag: cleanEtag(response.ETag),\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 key = this.pathToKey(normalized)\n\n\t\ttry {\n\t\t\tconst response = await this.send<S3HeadResponse>(\n\t\t\t\tnew HeadObjectCommand({\n\t\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\t\tKey: key\n\t\t\t\t})\n\t\t\t)\n\t\t\treturn {\n\t\t\t\tetag: cleanEtag(response.ETag),\n\t\t\t\tkind: 'file',\n\t\t\t\tmimeType: response.ContentType,\n\t\t\t\tmodifiedAt: response.LastModified?.toISOString(),\n\t\t\t\tname: getFileBrowserBasename(normalized),\n\t\t\t\tpath: normalized,\n\t\t\t\tsize: response.ContentLength\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (!isAdapterNotFound(error)) {\n\t\t\t\tthrow error\n\t\t\t}\n\t\t}\n\n\t\tconst response = await this.send<S3ListResponse>(\n\t\t\tnew ListObjectsV2Command({\n\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\tMaxKeys: 1,\n\t\t\t\tPrefix: this.pathToPrefix(normalized)\n\t\t\t})\n\t\t)\n\t\tif ((response.Contents?.length ?? 0) > 0) {\n\t\t\treturn {\n\t\t\t\tkind: 'folder',\n\t\t\t\tname: getFileBrowserBasename(normalized),\n\t\t\t\tpath: normalized\n\t\t\t}\n\t\t}\n\n\t\tthrow new FileBrowserAdapterError('not_found', `No file browser entry exists at ${normalized}`)\n\t}\n\n\tprivate async existsEntries(paths: string[]): Promise<Record<string, boolean>> {\n\t\tconst entries: 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\tentries[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\tentries[normalized] = false\n\t\t\t\t}\n\t\t\t})\n\t\t)\n\t\treturn entries\n\t}\n\n\tprivate async copyEntries(from: string[], toDir: string): Promise<void> {\n\t\tfor (const sourcePath of from) {\n\t\t\tconst normalizedSource = normalizeFileBrowserPath(sourcePath)\n\t\t\tconst sourceBase = this.pathToPrefix(normalizedSource)\n\t\t\tconst destinationBase = this.pathToKey(joinFileBrowserPath(toDir, getFileBrowserBasename(normalizedSource)))\n\t\t\tconst keys = await this.resolveKeysForPath(normalizedSource)\n\n\t\t\tfor (const sourceKey of keys) {\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(this.keyToPath(sourceKey))\n\t\t\t\tconst destinationKey = suffix ? `${destinationBase}/${suffix}` : destinationBase\n\t\t\t\tawait this.send<unknown>(\n\t\t\t\t\tnew CopyObjectCommand({\n\t\t\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\t\t\tCopySource: encodeCopySource(this.sdk!.bucket, sourceKey),\n\t\t\t\t\t\tKey: destinationKey\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async createMultipartUploadEntry(\n\t\tpath: string,\n\t\tsize: number\n\t): Promise<{ uploadId: string; partSize: number }> {\n\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\tconst key = this.pathToKey(normalized)\n\t\tconst response = await this.send<S3MultipartCreateResponse>(\n\t\t\tnew CreateMultipartUploadCommand({\n\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\tKey: key\n\t\t\t})\n\t\t)\n\t\tif (!response.UploadId) {\n\t\t\tthrow new FileBrowserAdapterError('not_supported', 'S3-compatible multipart upload did not return an upload id.')\n\t\t}\n\t\tthis.multipartSessions.set(response.UploadId, {\n\t\t\tkey,\n\t\t\tpath: normalized,\n\t\t\tsize\n\t\t})\n\t\treturn {\n\t\t\tpartSize: this.sdk!.multipartPartSize,\n\t\t\tuploadId: response.UploadId\n\t\t}\n\t}\n\n\tprivate async uploadMultipartPart({\n\t\tchunk,\n\t\tonProgress,\n\t\tpartNumber,\n\t\tsignal,\n\t\tuploadId\n\t}: {\n\t\tuploadId: string\n\t\tpartNumber: number\n\t\tchunk: Blob\n\t\tsignal?: AbortSignal\n\t\tonProgress?: (loaded: number) => void\n\t}): Promise<{ etag: string }> {\n\t\tthrowIfAborted(signal)\n\t\tconst session = this.getMultipartSession(uploadId)\n\t\tconst response = await this.send<S3UploadPartResponse>(\n\t\t\tnew UploadPartCommand({\n\t\t\t\tBody: chunk,\n\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\tKey: session.key,\n\t\t\t\tPartNumber: partNumber,\n\t\t\t\tUploadId: uploadId\n\t\t\t})\n\t\t)\n\t\tonProgress?.(chunk.size)\n\t\treturn {\n\t\t\tetag: cleanEtag(response.ETag) ?? `part-${partNumber}`\n\t\t}\n\t}\n\n\tprivate async completeMultipartUploadEntry({\n\t\tparts,\n\t\tuploadId\n\t}: {\n\t\tuploadId: string\n\t\tparts: MultipartUploadPart[]\n\t}): Promise<FileNode> {\n\t\tconst session = this.getMultipartSession(uploadId)\n\t\tconst response = await this.send<S3PutResponse>(\n\t\t\tnew CompleteMultipartUploadCommand({\n\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\tKey: session.key,\n\t\t\t\tMultipartUpload: {\n\t\t\t\t\tParts: parts.map((part) => ({\n\t\t\t\t\t\tETag: part.etag,\n\t\t\t\t\t\tPartNumber: part.partNumber\n\t\t\t\t\t}))\n\t\t\t\t},\n\t\t\t\tUploadId: uploadId\n\t\t\t})\n\t\t)\n\t\tthis.multipartSessions.delete(uploadId)\n\t\treturn {\n\t\t\tetag: cleanEtag(response.ETag),\n\t\t\tkind: 'file',\n\t\t\tname: getFileBrowserBasename(session.path),\n\t\t\tpath: session.path,\n\t\t\tsize: session.size\n\t\t}\n\t}\n\n\tprivate async abortMultipartUploadEntry(uploadId: string): Promise<void> {\n\t\tconst session = this.getMultipartSession(uploadId)\n\t\tawait this.send<unknown>(\n\t\t\tnew AbortMultipartUploadCommand({\n\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\tKey: session.key,\n\t\t\t\tUploadId: uploadId\n\t\t\t})\n\t\t)\n\t\tthis.multipartSessions.delete(uploadId)\n\t}\n\n\tprivate async resolveKeysForPath(path: string): Promise<string[]> {\n\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\tconst exactKey = this.pathToKey(normalized)\n\t\tconst keys = new Set<string>()\n\n\t\tif (await this.objectExists(exactKey)) {\n\t\t\tkeys.add(exactKey)\n\t\t}\n\n\t\tconst folderPrefix = this.pathToPrefix(normalized)\n\t\tlet cursor: string | undefined\n\t\tdo {\n\t\t\tconst response = await this.send<S3ListResponse>(\n\t\t\t\tnew ListObjectsV2Command({\n\t\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\t\tContinuationToken: cursor,\n\t\t\t\t\tPrefix: folderPrefix\n\t\t\t\t})\n\t\t\t)\n\t\t\tfor (const entry of response.Contents ?? []) {\n\t\t\t\tif (entry.Key) {\n\t\t\t\t\tkeys.add(entry.Key)\n\t\t\t\t}\n\t\t\t}\n\t\t\tcursor = response.NextContinuationToken\n\t\t} while (cursor)\n\n\t\treturn Array.from(keys)\n\t}\n\n\tprivate async objectExists(key: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait this.send<S3HeadResponse>(\n\t\t\t\tnew HeadObjectCommand({\n\t\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\t\tKey: key\n\t\t\t\t})\n\t\t\t)\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\n\t\tif (!(await this.objectExists(this.pathToKey(normalized)))) {\n\t\t\treturn normalized\n\t\t}\n\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\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.objectExists(this.pathToKey(normalized)))) {\n\t\t\t\treturn normalized\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 getMultipartSession(uploadId: string): S3MultipartSession {\n\t\tconst session = this.multipartSessions.get(uploadId)\n\t\tif (!session) {\n\t\t\tthrow new FileBrowserAdapterError('not_found', `No multipart upload session exists for ${uploadId}`)\n\t\t}\n\t\treturn session\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 pathToPrefix(path: string): string {\n\t\tconst key = this.pathToKey(path)\n\t\treturn key ? `${key.replace(/\\/$/, '')}/` : ''\n\t}\n\n\tprivate keyToPath(key: string, folder = false): string {\n\t\tlet relative = key\n\t\tif (this.sdk!.prefix && relative === this.sdk!.prefix) {\n\t\t\trelative = ''\n\t\t} else if (this.sdk!.prefix && relative.startsWith(`${this.sdk!.prefix}/`)) {\n\t\t\trelative = relative.slice(this.sdk!.prefix.length + 1)\n\t\t}\n\t\tif (folder) {\n\t\t\trelative = relative.replace(/\\/$/, '')\n\t\t}\n\t\treturn normalizeFileBrowserPath(`/${relative}`)\n\t}\n\n\tprivate async send<T>(command: object): Promise<T> {\n\t\ttry {\n\t\t\treturn (await this.sdk!.client.send(command)) as T\n\t\t} catch (error) {\n\t\t\tthrow toS3AdapterError(error)\n\t\t}\n\t}\n}\n\nfunction normalizeObjectPrefix(prefix: string | undefined): string {\n\treturn (prefix ?? '').trim().replace(/^\\/+|\\/+$/g, '')\n}\n\nfunction cleanEtag(etag: string | undefined): string | undefined {\n\treturn etag?.replace(/^\"|\"$/g, '')\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 encodeCopySource(bucket: string, key: string): string {\n\treturn `${bucket}/${encodeURIComponent(key).replace(/%2F/g, '/')}`\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 chunkArray<T>(items: T[], size: number): T[][] {\n\tconst chunks: T[][] = []\n\tfor (let index = 0; index < items.length; index += size) {\n\t\tchunks.push(items.slice(index, index + size))\n\t}\n\treturn chunks\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 toS3AdapterError(error: unknown): FileBrowserAdapterError {\n\tif (error instanceof FileBrowserAdapterError) {\n\t\treturn error\n\t}\n\n\tconst candidate = error as {\n\t\t$metadata?: { httpStatusCode?: number }\n\t\tmessage?: string\n\t\tname?: string\n\t}\n\tconst status = candidate.$metadata?.httpStatusCode\n\tif (candidate.name === 'AbortError') {\n\t\treturn new FileBrowserAdapterError('aborted', 'The operation was aborted.', {\n\t\t\tcause: error\n\t\t})\n\t}\n\tif (status === 403 || candidate.name === 'AccessDenied') {\n\t\treturn new FileBrowserAdapterError('access_denied', candidate.message ?? 'Access denied by the object store.', {\n\t\t\tcause: error\n\t\t})\n\t}\n\tif (status === 404 || candidate.name === 'NotFound' || candidate.name === 'NoSuchKey') {\n\t\treturn new FileBrowserAdapterError('not_found', candidate.message ?? 'The object does not exist.', { cause: error })\n\t}\n\treturn new FileBrowserAdapterError('not_supported', candidate.message ?? 'The object store request failed.', {\n\t\tcause: error\n\t})\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"s3-compatible-adapter-D9agsn9e.js","names":[],"sources":["../../src/adapters/s3-compatible-adapter.ts"],"sourcesContent":["import {\n\tAbortMultipartUploadCommand,\n\tCompleteMultipartUploadCommand,\n\tCopyObjectCommand,\n\tCreateMultipartUploadCommand,\n\tDeleteObjectsCommand,\n\tGetObjectCommand,\n\tHeadObjectCommand,\n\tListObjectsV2Command,\n\tPutObjectCommand,\n\tUploadPartCommand\n} from '@aws-sdk/client-s3'\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner'\nimport { FileBrowserAdapterError } from '../core/types'\nimport type {\n\tFileBrowserAdapter,\n\tFileBrowserListOptions,\n\tFileBrowserListResult,\n\tFileBrowserUploadOptions,\n\tFileNode,\n\tMultipartUploadPart\n} from '../core/types'\nimport { getFileBrowserBasename, joinFileBrowserPath, normalizeFileBrowserPath } from '../core/path'\nimport { UnsupportedCloudFileBrowserAdapter } from './cloud-adapter-base'\nimport type { CloudAdapterName, CloudFileBrowserAdapterOptions } from './cloud-adapter-base'\n\nexport type S3CompatibleClient = {\n\tsend(command: object): Promise<unknown>\n}\n\nexport type S3CompatibleFileBrowserAdapterOptions<TMetadata = unknown> = CloudFileBrowserAdapterOptions<TMetadata> & {\n\tbucket?: string\n\tclient?: S3CompatibleClient\n\tmultipartPartSize?: number\n\tprefix?: string\n\tsignedUrlExpiresIn?: number\n}\n\ntype S3SdkConfig = {\n\tbucket: string\n\tclient: S3CompatibleClient\n\tmultipartPartSize: number\n\tprefix: string\n\tsignedUrlExpiresIn: number\n}\n\ntype S3ListResponse = {\n\tCommonPrefixes?: Array<{ Prefix?: string }>\n\tContents?: Array<{\n\t\tContentType?: string\n\t\tETag?: string\n\t\tKey?: string\n\t\tLastModified?: Date\n\t\tSize?: number\n\t}>\n\tNextContinuationToken?: string\n}\n\ntype S3HeadResponse = {\n\tContentLength?: number\n\tContentType?: string\n\tETag?: string\n\tLastModified?: Date\n}\n\ntype S3PutResponse = {\n\tETag?: string\n}\n\ntype S3MultipartCreateResponse = {\n\tUploadId?: string\n}\n\ntype S3UploadPartResponse = {\n\tETag?: string\n}\n\ntype S3MultipartSession = {\n\tkey: string\n\tpath: string\n\tsize: number\n}\n\nconst DEFAULT_SIGNED_URL_EXPIRES_IN = 60 * 60\nconst DEFAULT_MULTIPART_PART_SIZE = 8 * 1024 * 1024\n\nexport class S3CompatibleFileBrowserAdapter<TMetadata = unknown> implements FileBrowserAdapter<TMetadata> {\n\tcreateFolder?: NonNullable<FileBrowserAdapter<TMetadata>['createFolder']>\n\trename?: NonNullable<FileBrowserAdapter<TMetadata>['rename']>\n\tmove?: NonNullable<FileBrowserAdapter<TMetadata>['move']>\n\tcopy?: NonNullable<FileBrowserAdapter<TMetadata>['copy']>\n\tstat?: NonNullable<FileBrowserAdapter<TMetadata>['stat']>\n\texists?: NonNullable<FileBrowserAdapter<TMetadata>['exists']>\n\tcreateMultipartUpload?: NonNullable<FileBrowserAdapter<TMetadata>['createMultipartUpload']>\n\tuploadPart?: NonNullable<FileBrowserAdapter<TMetadata>['uploadPart']>\n\tcompleteMultipartUpload?: NonNullable<FileBrowserAdapter<TMetadata>['completeMultipartUpload']>\n\tabortMultipartUpload?: NonNullable<FileBrowserAdapter<TMetadata>['abortMultipartUpload']>\n\tbulkDownloadUrl?: NonNullable<FileBrowserAdapter<TMetadata>['bulkDownloadUrl']>\n\n\tprivate readonly delegate?: UnsupportedCloudFileBrowserAdapter<TMetadata>\n\tprivate readonly multipartSessions = new Map<string, S3MultipartSession>()\n\tprivate readonly sdk?: S3SdkConfig\n\n\tconstructor(adapterName: CloudAdapterName, options: S3CompatibleFileBrowserAdapterOptions<TMetadata> = {}) {\n\t\tif (!options.client || !options.bucket) {\n\t\t\tthis.delegate = new UnsupportedCloudFileBrowserAdapter<TMetadata>(adapterName, 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.bucket,\n\t\t\tclient: options.client,\n\t\t\tmultipartPartSize: Math.max(1, options.multipartPartSize ?? DEFAULT_MULTIPART_PART_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\tthis.createMultipartUpload = this.createMultipartUploadEntry.bind(this)\n\t\tthis.uploadPart = this.uploadMultipartPart.bind(this)\n\t\tthis.completeMultipartUpload = this.completeMultipartUploadEntry.bind(this)\n\t\tthis.abortMultipartUpload = this.abortMultipartUploadEntry.bind(this)\n\t}\n\n\tasync list(path: string, opts: FileBrowserListOptions = {}): Promise<FileBrowserListResult<TMetadata>> {\n\t\tif (!this.sdk) {\n\t\t\treturn this.delegate!.list(path, opts)\n\t\t}\n\n\t\tthrowIfAborted(opts.signal)\n\t\tconst response = await this.send<S3ListResponse>(\n\t\t\tnew ListObjectsV2Command({\n\t\t\t\tBucket: this.sdk.bucket,\n\t\t\t\tContinuationToken: opts.cursor,\n\t\t\t\tDelimiter: '/',\n\t\t\t\tPrefix: this.pathToPrefix(path)\n\t\t\t})\n\t\t)\n\t\tconst folderItems =\n\t\t\tresponse.CommonPrefixes?.flatMap((entry) => {\n\t\t\t\tif (!entry.Prefix) {\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\tkind: 'folder' as const,\n\t\t\t\t\t\tname: getFileBrowserBasename(this.keyToPath(entry.Prefix, true)),\n\t\t\t\t\t\tpath: this.keyToPath(entry.Prefix, true)\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}) ?? []\n\t\tconst fileItems =\n\t\t\tresponse.Contents?.flatMap((entry) => {\n\t\t\t\tif (!entry.Key || entry.Key.endsWith('/')) {\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t\tconst path = this.keyToPath(entry.Key)\n\t\t\t\tif (path === normalizeFileBrowserPath(path)) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tetag: cleanEtag(entry.ETag),\n\t\t\t\t\t\t\tkind: 'file' as const,\n\t\t\t\t\t\t\tmimeType: entry.ContentType,\n\t\t\t\t\t\t\tmodifiedAt: entry.LastModified?.toISOString(),\n\t\t\t\t\t\t\tname: getFileBrowserBasename(path),\n\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\tsize: entry.Size\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\treturn []\n\t\t\t}) ?? []\n\n\t\treturn {\n\t\t\tcursor: response.NextContinuationToken,\n\t\t\titems: [...folderItems, ...fileItems].sort(compareNodes)\n\t\t}\n\t}\n\n\tprivate async createFolderEntry(path: string): Promise<FileNode<TMetadata>> {\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'S3 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.send<S3PutResponse>(\n\t\t\tnew PutObjectCommand({\n\t\t\t\tBody: '',\n\t\t\t\tBucket: sdk.bucket,\n\t\t\t\tContentType: 'application/x-directory',\n\t\t\t\tKey: this.pathToPrefix(normalized)\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\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\tfor (const chunk of chunkArray(Array.from(keys), 1000)) {\n\t\t\tif (chunk.length === 0) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tawait this.send<unknown>(\n\t\t\t\tnew DeleteObjectsCommand({\n\t\t\t\t\tBucket: this.sdk.bucket,\n\t\t\t\t\tDelete: {\n\t\t\t\t\t\tObjects: chunk.map((key) => ({ Key: key })),\n\t\t\t\t\t\tQuiet: true\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t)\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\treturn getSignedUrl(\n\t\t\tthis.sdk.client as never,\n\t\t\tnew GetObjectCommand({\n\t\t\t\tBucket: this.sdk.bucket,\n\t\t\t\tKey: this.pathToKey(path)\n\t\t\t}),\n\t\t\t{ expiresIn: this.sdk.signedUrlExpiresIn }\n\t\t)\n\t}\n\n\tasync upload(path: string, file: File, opts: FileBrowserUploadOptions = {}): Promise<FileNode<TMetadata>> {\n\t\tif (!this.sdk) {\n\t\t\treturn this.delegate!.upload(path, file, opts)\n\t\t}\n\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\tconst response = await this.send<S3PutResponse>(\n\t\t\tnew PutObjectCommand({\n\t\t\t\tBody: file,\n\t\t\t\tBucket: this.sdk.bucket,\n\t\t\t\tContentType: file.type || undefined,\n\t\t\t\tKey: this.pathToKey(normalized)\n\t\t\t})\n\t\t)\n\t\topts.onProgress?.(file.size, file.size)\n\n\t\treturn {\n\t\t\tetag: cleanEtag(response.ETag),\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<TMetadata>> {\n\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\tconst key = this.pathToKey(normalized)\n\n\t\ttry {\n\t\t\tconst response = await this.send<S3HeadResponse>(\n\t\t\t\tnew HeadObjectCommand({\n\t\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\t\tKey: key\n\t\t\t\t})\n\t\t\t)\n\t\t\treturn {\n\t\t\t\tetag: cleanEtag(response.ETag),\n\t\t\t\tkind: 'file',\n\t\t\t\tmimeType: response.ContentType,\n\t\t\t\tmodifiedAt: response.LastModified?.toISOString(),\n\t\t\t\tname: getFileBrowserBasename(normalized),\n\t\t\t\tpath: normalized,\n\t\t\t\tsize: response.ContentLength\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (!isAdapterNotFound(error)) {\n\t\t\t\tthrow error\n\t\t\t}\n\t\t}\n\n\t\tconst response = await this.send<S3ListResponse>(\n\t\t\tnew ListObjectsV2Command({\n\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\tMaxKeys: 1,\n\t\t\t\tPrefix: this.pathToPrefix(normalized)\n\t\t\t})\n\t\t)\n\t\tif ((response.Contents?.length ?? 0) > 0) {\n\t\t\treturn {\n\t\t\t\tkind: 'folder',\n\t\t\t\tname: getFileBrowserBasename(normalized),\n\t\t\t\tpath: normalized\n\t\t\t}\n\t\t}\n\n\t\tthrow new FileBrowserAdapterError('not_found', `No file browser entry exists at ${normalized}`)\n\t}\n\n\tprivate async existsEntries(paths: string[]): Promise<Record<string, boolean>> {\n\t\tconst entries: 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\tentries[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\tentries[normalized] = false\n\t\t\t\t}\n\t\t\t})\n\t\t)\n\t\treturn entries\n\t}\n\n\tprivate async copyEntries(from: string[], toDir: string): Promise<void> {\n\t\tfor (const sourcePath of from) {\n\t\t\tconst normalizedSource = normalizeFileBrowserPath(sourcePath)\n\t\t\tconst sourceBase = this.pathToPrefix(normalizedSource)\n\t\t\tconst destinationBase = this.pathToKey(joinFileBrowserPath(toDir, getFileBrowserBasename(normalizedSource)))\n\t\t\tconst keys = await this.resolveKeysForPath(normalizedSource)\n\n\t\t\tfor (const sourceKey of keys) {\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(this.keyToPath(sourceKey))\n\t\t\t\tconst destinationKey = suffix ? `${destinationBase}/${suffix}` : destinationBase\n\t\t\t\tawait this.send<unknown>(\n\t\t\t\t\tnew CopyObjectCommand({\n\t\t\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\t\t\tCopySource: encodeCopySource(this.sdk!.bucket, sourceKey),\n\t\t\t\t\t\tKey: destinationKey\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async createMultipartUploadEntry(\n\t\tpath: string,\n\t\tsize: number\n\t): Promise<{ uploadId: string; partSize: number }> {\n\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\tconst key = this.pathToKey(normalized)\n\t\tconst response = await this.send<S3MultipartCreateResponse>(\n\t\t\tnew CreateMultipartUploadCommand({\n\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\tKey: key\n\t\t\t})\n\t\t)\n\t\tif (!response.UploadId) {\n\t\t\tthrow new FileBrowserAdapterError('not_supported', 'S3-compatible multipart upload did not return an upload id.')\n\t\t}\n\t\tthis.multipartSessions.set(response.UploadId, {\n\t\t\tkey,\n\t\t\tpath: normalized,\n\t\t\tsize\n\t\t})\n\t\treturn {\n\t\t\tpartSize: this.sdk!.multipartPartSize,\n\t\t\tuploadId: response.UploadId\n\t\t}\n\t}\n\n\tprivate async uploadMultipartPart({\n\t\tchunk,\n\t\tonProgress,\n\t\tpartNumber,\n\t\tsignal,\n\t\tuploadId\n\t}: {\n\t\tuploadId: string\n\t\tpartNumber: number\n\t\tchunk: Blob\n\t\tsignal?: AbortSignal\n\t\tonProgress?: (loaded: number) => void\n\t}): Promise<{ etag: string }> {\n\t\tthrowIfAborted(signal)\n\t\tconst session = this.getMultipartSession(uploadId)\n\t\tconst response = await this.send<S3UploadPartResponse>(\n\t\t\tnew UploadPartCommand({\n\t\t\t\tBody: chunk,\n\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\tKey: session.key,\n\t\t\t\tPartNumber: partNumber,\n\t\t\t\tUploadId: uploadId\n\t\t\t})\n\t\t)\n\t\tonProgress?.(chunk.size)\n\t\treturn {\n\t\t\tetag: cleanEtag(response.ETag) ?? `part-${partNumber}`\n\t\t}\n\t}\n\n\tprivate async completeMultipartUploadEntry({\n\t\tparts,\n\t\tuploadId\n\t}: {\n\t\tuploadId: string\n\t\tparts: MultipartUploadPart[]\n\t}): Promise<FileNode<TMetadata>> {\n\t\tconst session = this.getMultipartSession(uploadId)\n\t\tconst response = await this.send<S3PutResponse>(\n\t\t\tnew CompleteMultipartUploadCommand({\n\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\tKey: session.key,\n\t\t\t\tMultipartUpload: {\n\t\t\t\t\tParts: parts.map((part) => ({\n\t\t\t\t\t\tETag: part.etag,\n\t\t\t\t\t\tPartNumber: part.partNumber\n\t\t\t\t\t}))\n\t\t\t\t},\n\t\t\t\tUploadId: uploadId\n\t\t\t})\n\t\t)\n\t\tthis.multipartSessions.delete(uploadId)\n\t\treturn {\n\t\t\tetag: cleanEtag(response.ETag),\n\t\t\tkind: 'file',\n\t\t\tname: getFileBrowserBasename(session.path),\n\t\t\tpath: session.path,\n\t\t\tsize: session.size\n\t\t}\n\t}\n\n\tprivate async abortMultipartUploadEntry(uploadId: string): Promise<void> {\n\t\tconst session = this.getMultipartSession(uploadId)\n\t\tawait this.send<unknown>(\n\t\t\tnew AbortMultipartUploadCommand({\n\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\tKey: session.key,\n\t\t\t\tUploadId: uploadId\n\t\t\t})\n\t\t)\n\t\tthis.multipartSessions.delete(uploadId)\n\t}\n\n\tprivate async resolveKeysForPath(path: string): Promise<string[]> {\n\t\tconst normalized = normalizeFileBrowserPath(path)\n\t\tconst exactKey = this.pathToKey(normalized)\n\t\tconst keys = new Set<string>()\n\n\t\tif (await this.objectExists(exactKey)) {\n\t\t\tkeys.add(exactKey)\n\t\t}\n\n\t\tconst folderPrefix = this.pathToPrefix(normalized)\n\t\tlet cursor: string | undefined\n\t\tdo {\n\t\t\tconst response = await this.send<S3ListResponse>(\n\t\t\t\tnew ListObjectsV2Command({\n\t\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\t\tContinuationToken: cursor,\n\t\t\t\t\tPrefix: folderPrefix\n\t\t\t\t})\n\t\t\t)\n\t\t\tfor (const entry of response.Contents ?? []) {\n\t\t\t\tif (entry.Key) {\n\t\t\t\t\tkeys.add(entry.Key)\n\t\t\t\t}\n\t\t\t}\n\t\t\tcursor = response.NextContinuationToken\n\t\t} while (cursor)\n\n\t\treturn Array.from(keys)\n\t}\n\n\tprivate async objectExists(key: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait this.send<S3HeadResponse>(\n\t\t\t\tnew HeadObjectCommand({\n\t\t\t\t\tBucket: this.sdk!.bucket,\n\t\t\t\t\tKey: key\n\t\t\t\t})\n\t\t\t)\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\n\t\tif (!(await this.objectExists(this.pathToKey(normalized)))) {\n\t\t\treturn normalized\n\t\t}\n\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\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.objectExists(this.pathToKey(normalized)))) {\n\t\t\t\treturn normalized\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 getMultipartSession(uploadId: string): S3MultipartSession {\n\t\tconst session = this.multipartSessions.get(uploadId)\n\t\tif (!session) {\n\t\t\tthrow new FileBrowserAdapterError('not_found', `No multipart upload session exists for ${uploadId}`)\n\t\t}\n\t\treturn session\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 pathToPrefix(path: string): string {\n\t\tconst key = this.pathToKey(path)\n\t\treturn key ? `${key.replace(/\\/$/, '')}/` : ''\n\t}\n\n\tprivate keyToPath(key: string, folder = false): string {\n\t\tlet relative = key\n\t\tif (this.sdk!.prefix && relative === this.sdk!.prefix) {\n\t\t\trelative = ''\n\t\t} else if (this.sdk!.prefix && relative.startsWith(`${this.sdk!.prefix}/`)) {\n\t\t\trelative = relative.slice(this.sdk!.prefix.length + 1)\n\t\t}\n\t\tif (folder) {\n\t\t\trelative = relative.replace(/\\/$/, '')\n\t\t}\n\t\treturn normalizeFileBrowserPath(`/${relative}`)\n\t}\n\n\tprivate async send<T>(command: object): Promise<T> {\n\t\ttry {\n\t\t\treturn (await this.sdk!.client.send(command)) as T\n\t\t} catch (error) {\n\t\t\tthrow toS3AdapterError(error)\n\t\t}\n\t}\n}\n\nfunction normalizeObjectPrefix(prefix: string | undefined): string {\n\treturn (prefix ?? '').trim().replace(/^\\/+|\\/+$/g, '')\n}\n\nfunction cleanEtag(etag: string | undefined): string | undefined {\n\treturn etag?.replace(/^\"|\"$/g, '')\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 encodeCopySource(bucket: string, key: string): string {\n\treturn `${bucket}/${encodeURIComponent(key).replace(/%2F/g, '/')}`\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 chunkArray<T>(items: T[], size: number): T[][] {\n\tconst chunks: T[][] = []\n\tfor (let index = 0; index < items.length; index += size) {\n\t\tchunks.push(items.slice(index, index + size))\n\t}\n\treturn chunks\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 toS3AdapterError(error: unknown): FileBrowserAdapterError {\n\tif (error instanceof FileBrowserAdapterError) {\n\t\treturn error\n\t}\n\n\tconst candidate = error as {\n\t\t$metadata?: { httpStatusCode?: number }\n\t\tmessage?: string\n\t\tname?: string\n\t}\n\tconst status = candidate.$metadata?.httpStatusCode\n\tif (candidate.name === 'AbortError') {\n\t\treturn new FileBrowserAdapterError('aborted', 'The operation was aborted.', {\n\t\t\tcause: error\n\t\t})\n\t}\n\tif (status === 403 || candidate.name === 'AccessDenied') {\n\t\treturn new FileBrowserAdapterError('access_denied', candidate.message ?? 'Access denied by the object store.', {\n\t\t\tcause: error\n\t\t})\n\t}\n\tif (status === 404 || candidate.name === 'NotFound' || candidate.name === 'NoSuchKey') {\n\t\treturn new FileBrowserAdapterError('not_found', candidate.message ?? 'The object does not exist.', { cause: error })\n\t}\n\treturn new FileBrowserAdapterError('not_supported', candidate.message ?? 'The object store request failed.', {\n\t\tcause: error\n\t})\n}\n"],"mappings":"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"}
@@ -1,17 +1,37 @@
1
+ import type { ReactNode } from 'react';
1
2
  import type { FileBrowserDensity } from '../theme';
2
- import type { FileBrowserAdapter } from '../core/types';
3
+ import type { FileBrowserPathChangeContext, FileBrowserUploadConflictResolution, FileBrowserView } from '../core/use-file-browser';
4
+ import type { FileBrowserAdapter, FileNode } from '../core/types';
3
5
  import type { FileBrowserUploadCandidate } from '../core/upload-drop';
4
- export type FileBrowserProps = {
5
- adapter: FileBrowserAdapter;
6
+ export type FileBrowserProps<TMetadata = unknown> = {
7
+ adapter: FileBrowserAdapter<TMetadata>;
8
+ className?: string;
9
+ emptyState?: {
10
+ title: ReactNode;
11
+ description?: ReactNode;
12
+ };
6
13
  initialPath?: string;
14
+ path?: string;
15
+ onPathChange?: (path: string, context: FileBrowserPathChangeContext<TMetadata>) => void;
16
+ rootLabel?: string;
17
+ searchQuery?: string;
18
+ initialSearchQuery?: string;
19
+ onSearchQueryChange?: (query: string) => void;
7
20
  density?: FileBrowserDensity;
8
21
  readOnly?: boolean;
9
22
  showDetailsPanel?: boolean;
10
23
  uploadPolicy?: FileBrowserUploadPolicy;
24
+ uploadConflictResolutions?: readonly FileBrowserUploadConflictResolution[];
25
+ allowClientZipFallback?: boolean;
26
+ renderItemMeta?: (item: FileNode<TMetadata>, context: {
27
+ view: FileBrowserView;
28
+ }) => ReactNode;
29
+ renderDetailsContent?: (item: FileNode<TMetadata>, defaultContent: ReactNode) => ReactNode;
11
30
  warnZipSizeBytes?: number;
12
31
  };
13
32
  export type FileBrowserUploadPolicy = {
14
33
  allowedMimeTypes?: string[];
34
+ maxFilesPerBatch?: number;
15
35
  maxFileSizeBytes?: number;
16
36
  remainingQuotaBytes?: number;
17
37
  validate?: (candidate: FileBrowserUploadCandidate, context: {
@@ -24,5 +44,5 @@ export type FileBrowserUploadRejection = {
24
44
  relativePath: string;
25
45
  reasons: string[];
26
46
  };
27
- export declare function FileBrowser({ adapter, initialPath, density, readOnly, showDetailsPanel, uploadPolicy, warnZipSizeBytes }: FileBrowserProps): import("react").JSX.Element;
47
+ export declare function FileBrowser<TMetadata = unknown>({ adapter, className, emptyState, initialPath, path, onPathChange, rootLabel, searchQuery, initialSearchQuery, onSearchQueryChange, density, readOnly, showDetailsPanel, uploadPolicy, uploadConflictResolutions, allowClientZipFallback, renderItemMeta, renderDetailsContent, warnZipSizeBytes }: FileBrowserProps<TMetadata>): import("react").JSX.Element;
28
48
  //# sourceMappingURL=file-browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-browser.d.ts","sourceRoot":"","sources":["../../src/components/file-browser.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAKlD,OAAO,KAAK,EAAE,kBAAkB,EAAY,MAAM,eAAe,CAAA;AAEjE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAIrE,MAAM,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,kBAAkB,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,kBAAkB,CAAA;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,YAAY,CAAC,EAAE,uBAAuB,CAAA;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACrC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,EAAE,CACV,SAAS,EAAE,0BAA0B,EACrC,OAAO,EAAE;QACR,aAAa,EAAE,MAAM,CAAA;QACrB,WAAW,EAAE,MAAM,CAAA;KACnB,KACG,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,CAAA;CACzC,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG;IACxC,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,EAAE,CAAA;CACjB,CAAA;AAgFD,wBAAgB,WAAW,CAAC,EAC3B,OAAO,EACP,WAAiB,EACjB,OAAuB,EACvB,QAAgB,EAChB,gBAAuB,EACvB,YAAY,EACZ,gBAAgB,EAChB,EAAE,gBAAgB,+BAy0ClB"}
1
+ {"version":3,"file":"file-browser.d.ts","sourceRoot":"","sources":["../../src/components/file-browser.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export type FileNodeKind = 'file' | 'folder';
2
- export type FileNode = {
2
+ export type FileNode<TMetadata = unknown> = {
3
+ id?: string;
3
4
  path: string;
4
5
  name: string;
5
6
  kind: FileNodeKind;
@@ -8,13 +9,14 @@ export type FileNode = {
8
9
  modifiedAt?: string;
9
10
  etag?: string;
10
11
  thumbnailUrl?: string;
12
+ metadata?: TMetadata;
11
13
  };
12
14
  export type FileBrowserListOptions = {
13
15
  cursor?: string;
14
16
  signal?: AbortSignal;
15
17
  };
16
- export type FileBrowserListResult = {
17
- items: FileNode[];
18
+ export type FileBrowserListResult<TMetadata = unknown> = {
19
+ items: FileNode<TMetadata>[];
18
20
  cursor?: string;
19
21
  };
20
22
  export type FileBrowserUploadOptions = {
@@ -26,16 +28,16 @@ export type MultipartUploadPart = {
26
28
  partNumber: number;
27
29
  etag: string;
28
30
  };
29
- export type FileBrowserAdapter = {
30
- list(path: string, opts?: FileBrowserListOptions): Promise<FileBrowserListResult>;
31
- createFolder?(path: string): Promise<FileNode>;
31
+ export type FileBrowserAdapter<TMetadata = unknown> = {
32
+ list(path: string, opts?: FileBrowserListOptions): Promise<FileBrowserListResult<TMetadata>>;
33
+ createFolder?(path: string): Promise<FileNode<TMetadata>>;
32
34
  delete(paths: string[]): Promise<void>;
33
35
  signedUrl(path: string): Promise<string>;
34
- upload(path: string, file: File, opts?: FileBrowserUploadOptions): Promise<FileNode>;
35
- rename?(path: string, newName: string): Promise<FileNode>;
36
+ upload(path: string, file: File, opts?: FileBrowserUploadOptions): Promise<FileNode<TMetadata>>;
37
+ rename?(path: string, newName: string): Promise<FileNode<TMetadata>>;
36
38
  move?(from: string[], toDir: string): Promise<void>;
37
39
  copy?(from: string[], toDir: string): Promise<void>;
38
- stat?(path: string): Promise<FileNode>;
40
+ stat?(path: string): Promise<FileNode<TMetadata>>;
39
41
  exists?(paths: string[]): Promise<Record<string, boolean>>;
40
42
  createMultipartUpload?(path: string, size: number): Promise<{
41
43
  uploadId: string;
@@ -53,7 +55,7 @@ export type FileBrowserAdapter = {
53
55
  completeMultipartUpload?(args: {
54
56
  uploadId: string;
55
57
  parts: MultipartUploadPart[];
56
- }): Promise<FileNode>;
58
+ }): Promise<FileNode<TMetadata>>;
57
59
  abortMultipartUpload?(uploadId: string): Promise<void>;
58
60
  bulkDownloadUrl?(paths: string[]): Promise<{
59
61
  url: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}