import type { DiskName } from './types/filesystem'; import type { PutResult } from './types'; import type { StorageManager } from './facade'; export declare function putUploadedFile(manager: StorageManager, file: UploadedFileLike, opts: PutFileOptions): Promise; /** * Optional metadata fields shared by every uploaded-file shape we * accept. The `name` / `mimeType` aliases are present so the router's * `UploadedFile` class (which uses the class-style names) flows * through alongside the direct-parse shape (which uses the * snake-style `originalName` / `mimetype`). */ declare interface UploadedFileMetadata { originalName?: string name?: string mimetype?: string mimeType?: string } export declare interface PutFileOptions { disk?: DiskName dir?: string filename?: FilenameStrategy preserveExtension?: boolean overwrite?: boolean transform?: (input: Uint8Array | Buffer | ArrayBuffer) => Promise } /** * Minimal structural shape for an uploaded file accepted by * `Storage.put(file, opts)`. Modeled as a discriminated union so the * type-checker rejects `Storage.put({})` and similar empty-object * mistakes (stacksjs/stacks#1873 S-13). At least one of `buffer`, * `bytes()`, or `arrayBuffer()` must be present — that's the runtime * contract `readBytes()` enforces with a throw, and now the * structural contract the type system enforces at compile time. * * Two callsites land here in practice (stacksjs/stacks#1856): * * 1. **Direct multipart parse** (the original router shape, before * bun-router wrapped each entry in an `UploadedFile` class). * `{ originalName, mimetype, buffer }` — synchronous. * 2. **Router's `UploadedFile` class** (current shape from * `req.file(key)` / `req.files`). Exposes `name`, `mimeType`, and * an async `bytes()` / `arrayBuffer()` accessor instead of a * `buffer` property — Bun's `File` is lazy by design. */ export type UploadedFileLike = UploadedFileMetadata & ( | { buffer: ArrayBuffer | Uint8Array | Buffer, bytes?: () => Promise, arrayBuffer?: () => Promise } | { bytes: () => Promise, buffer?: ArrayBuffer | Uint8Array | Buffer, arrayBuffer?: () => Promise } | { arrayBuffer: () => Promise, buffer?: ArrayBuffer | Uint8Array | Buffer, bytes?: () => Promise } ); /** Built-in filename strategies for `Storage.put(file, { filename })`. */ export type FilenameStrategy = | 'uuid' | 'hash' | 'original' | ((file: UploadedFileLike) => string);