/** * `@wrnexus/uploader` — config-driven file uploads + serving. * * Declare stores in `wrnexus.config.ts`: * * storage: { * default: "public", * stores: { * public: { driver: "local", dir: "uploads/public", access: "public", * maxBytes: 10_000_000, accept: ["image/*", ".pdf"] }, * docs: { driver: "s3", access: "private", bucket: "…", region: "auto", * endpoint: "https://…r2.cloudflarestorage.com", * accessKeyId: process.env.S3_KEY!, secretAccessKey: process.env.S3_SECRET! }, * }, * } * * Upload from an API route, and drop a drag-and-drop widget on a page: * * // app/api/upload.ts * export const POST = handleUpload({ store: "public" }); * * *
* * Public files serve themselves (local → framework route, S3 → bucket URL). * Private files serve through a route you gate with your auth middleware: * * // app/api/files/[key].ts * export const GET = serveFromStore("docs"); */ export { upload, handleUpload, serveFromStore, serveStoredFile, storedUrl, UploadError, UPLOADS_PREFIX, } from "./upload.ts"; export type { UploadedFile, UploadOptions } from "./upload.ts"; export { configureStorage, getStore, hasStorage, storeNames } from "./client.ts"; export type { Store } from "./client.ts"; export { UPLOAD_RUNTIME, UPLOAD_JS_HREF } from "./runtime.ts"; export { localDriver } from "./adapters/local.ts"; export { s3Driver } from "./adapters/s3.ts"; export { signS3, sha256Hex, encodeKey } from "./sigv4.ts"; export { accepts, contentTypeOf, extForType, extOf } from "./mime.ts"; export type { StorageConfig, StoreConfig, LocalStoreConfig, S3StoreConfig, StorageDriver, StoredObject, StoreAccess, PutMeta, } from "./driver.ts";