Files
WRNexusJS/packages/uploader/src/index.ts
T
2026-07-12 15:55:18 +05:30

63 lines
1.9 KiB
TypeScript

/**
* `@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" });
*
* <!-- any page -->
* <div data-uploader="public" data-endpoint="/api/upload" data-accept="image/*"></div>
*
* 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";