63 lines
1.9 KiB
TypeScript
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";
|