@fade_networker/vono 0.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.
- package/LICENSE +21 -0
- package/README.md +47 -0
- package/dist/client/composables/navigateTo.d.ts +37 -0
- package/dist/client/composables/navigateTo.d.ts.map +1 -0
- package/dist/client/composables/navigateTo.js +56 -0
- package/dist/client/composables/navigateTo.js.map +1 -0
- package/dist/client/composables/useAsyncData.d.ts +35 -0
- package/dist/client/composables/useAsyncData.d.ts.map +1 -0
- package/dist/client/composables/useAsyncData.js +55 -0
- package/dist/client/composables/useAsyncData.js.map +1 -0
- package/dist/client/composables/useCookie.d.ts +33 -0
- package/dist/client/composables/useCookie.d.ts.map +1 -0
- package/dist/client/composables/useCookie.js +61 -0
- package/dist/client/composables/useCookie.js.map +1 -0
- package/dist/client/composables/useFormErrors.d.ts +34 -0
- package/dist/client/composables/useFormErrors.d.ts.map +1 -0
- package/dist/client/composables/useFormErrors.js +59 -0
- package/dist/client/composables/useFormErrors.js.map +1 -0
- package/dist/client/composables/useRouteRules.d.ts +26 -0
- package/dist/client/composables/useRouteRules.d.ts.map +1 -0
- package/dist/client/composables/useRouteRules.js +44 -0
- package/dist/client/composables/useRouteRules.js.map +1 -0
- package/dist/client/composables/useSeo.d.ts +35 -0
- package/dist/client/composables/useSeo.d.ts.map +1 -0
- package/dist/client/composables/useSeo.js +62 -0
- package/dist/client/composables/useSeo.js.map +1 -0
- package/dist/client/composables/useState.d.ts +35 -0
- package/dist/client/composables/useState.d.ts.map +1 -0
- package/dist/client/composables/useState.js +73 -0
- package/dist/client/composables/useState.js.map +1 -0
- package/dist/client/composables/useVonoFetch.d.ts +24 -0
- package/dist/client/composables/useVonoFetch.d.ts.map +1 -0
- package/dist/client/composables/useVonoFetch.js +49 -0
- package/dist/client/composables/useVonoFetch.js.map +1 -0
- package/dist/client/index.d.ts +19 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +20 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/layouts/index.d.ts +12 -0
- package/dist/client/layouts/index.d.ts.map +1 -0
- package/dist/client/layouts/index.js +11 -0
- package/dist/client/layouts/index.js.map +1 -0
- package/dist/client/layouts/resolve-layout.d.ts +23 -0
- package/dist/client/layouts/resolve-layout.d.ts.map +1 -0
- package/dist/client/layouts/resolve-layout.js +31 -0
- package/dist/client/layouts/resolve-layout.js.map +1 -0
- package/dist/client/nuxt-ui/index.d.ts +11 -0
- package/dist/client/nuxt-ui/index.d.ts.map +1 -0
- package/dist/client/nuxt-ui/index.js +11 -0
- package/dist/client/nuxt-ui/index.js.map +1 -0
- package/dist/client/nuxt-ui/setup.d.ts +27 -0
- package/dist/client/nuxt-ui/setup.d.ts.map +1 -0
- package/dist/client/nuxt-ui/setup.js +40 -0
- package/dist/client/nuxt-ui/setup.js.map +1 -0
- package/dist/client/pinia-hydration.d.ts +35 -0
- package/dist/client/pinia-hydration.d.ts.map +1 -0
- package/dist/client/pinia-hydration.js +48 -0
- package/dist/client/pinia-hydration.js.map +1 -0
- package/dist/config/define-config.d.ts +25 -0
- package/dist/config/define-config.d.ts.map +1 -0
- package/dist/config/define-config.js +63 -0
- package/dist/config/define-config.js.map +1 -0
- package/dist/config/env-helpers.d.ts +30 -0
- package/dist/config/env-helpers.d.ts.map +1 -0
- package/dist/config/env-helpers.js +50 -0
- package/dist/config/env-helpers.js.map +1 -0
- package/dist/config/use-config.d.ts +31 -0
- package/dist/config/use-config.d.ts.map +1 -0
- package/dist/config/use-config.js +49 -0
- package/dist/config/use-config.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/module-system/define-module.d.ts +82 -0
- package/dist/module-system/define-module.d.ts.map +1 -0
- package/dist/module-system/define-module.js +37 -0
- package/dist/module-system/define-module.js.map +1 -0
- package/dist/module-system/index.d.ts +14 -0
- package/dist/module-system/index.d.ts.map +1 -0
- package/dist/module-system/index.js +13 -0
- package/dist/module-system/index.js.map +1 -0
- package/dist/module-system/module-registry.d.ts +37 -0
- package/dist/module-system/module-registry.d.ts.map +1 -0
- package/dist/module-system/module-registry.js +68 -0
- package/dist/module-system/module-registry.js.map +1 -0
- package/dist/module-system/vite-integration.d.ts +23 -0
- package/dist/module-system/vite-integration.d.ts.map +1 -0
- package/dist/module-system/vite-integration.js +67 -0
- package/dist/module-system/vite-integration.js.map +1 -0
- package/dist/server/app-template.d.ts +47 -0
- package/dist/server/app-template.d.ts.map +1 -0
- package/dist/server/app-template.js +224 -0
- package/dist/server/app-template.js.map +1 -0
- package/dist/server/auth/gates.d.ts +79 -0
- package/dist/server/auth/gates.d.ts.map +1 -0
- package/dist/server/auth/gates.js +125 -0
- package/dist/server/auth/gates.js.map +1 -0
- package/dist/server/auth/index.d.ts +12 -0
- package/dist/server/auth/index.d.ts.map +1 -0
- package/dist/server/auth/index.js +12 -0
- package/dist/server/auth/index.js.map +1 -0
- package/dist/server/dto/query.dto.d.ts +44 -0
- package/dist/server/dto/query.dto.d.ts.map +1 -0
- package/dist/server/dto/query.dto.js +86 -0
- package/dist/server/dto/query.dto.js.map +1 -0
- package/dist/server/email/define-email.d.ts +41 -0
- package/dist/server/email/define-email.d.ts.map +1 -0
- package/dist/server/email/define-email.js +50 -0
- package/dist/server/email/define-email.js.map +1 -0
- package/dist/server/email/drivers/console.d.ts +16 -0
- package/dist/server/email/drivers/console.d.ts.map +1 -0
- package/dist/server/email/drivers/console.js +22 -0
- package/dist/server/email/drivers/console.js.map +1 -0
- package/dist/server/email/drivers/postmark.d.ts +19 -0
- package/dist/server/email/drivers/postmark.d.ts.map +1 -0
- package/dist/server/email/drivers/postmark.js +39 -0
- package/dist/server/email/drivers/postmark.js.map +1 -0
- package/dist/server/email/drivers/resend.d.ts +19 -0
- package/dist/server/email/drivers/resend.d.ts.map +1 -0
- package/dist/server/email/drivers/resend.js +37 -0
- package/dist/server/email/drivers/resend.js.map +1 -0
- package/dist/server/email/drivers/smtp.d.ts +26 -0
- package/dist/server/email/drivers/smtp.d.ts.map +1 -0
- package/dist/server/email/drivers/smtp.js +37 -0
- package/dist/server/email/drivers/smtp.js.map +1 -0
- package/dist/server/email/send-email.d.ts +42 -0
- package/dist/server/email/send-email.d.ts.map +1 -0
- package/dist/server/email/send-email.js +69 -0
- package/dist/server/email/send-email.js.map +1 -0
- package/dist/server/env-validation/define-env.d.ts +45 -0
- package/dist/server/env-validation/define-env.d.ts.map +1 -0
- package/dist/server/env-validation/define-env.js +41 -0
- package/dist/server/env-validation/define-env.js.map +1 -0
- package/dist/server/env-validation/index.d.ts +13 -0
- package/dist/server/env-validation/index.d.ts.map +1 -0
- package/dist/server/env-validation/index.js +12 -0
- package/dist/server/env-validation/index.js.map +1 -0
- package/dist/server/env-validation/validate-at-startup.d.ts +29 -0
- package/dist/server/env-validation/validate-at-startup.d.ts.map +1 -0
- package/dist/server/env-validation/validate-at-startup.js +61 -0
- package/dist/server/env-validation/validate-at-startup.js.map +1 -0
- package/dist/server/i18n/composables/useI18n.d.ts +39 -0
- package/dist/server/i18n/composables/useI18n.d.ts.map +1 -0
- package/dist/server/i18n/composables/useI18n.js +93 -0
- package/dist/server/i18n/composables/useI18n.js.map +1 -0
- package/dist/server/i18n/detect-locale.d.ts +22 -0
- package/dist/server/i18n/detect-locale.d.ts.map +1 -0
- package/dist/server/i18n/detect-locale.js +42 -0
- package/dist/server/i18n/detect-locale.js.map +1 -0
- package/dist/server/i18n/index.d.ts +14 -0
- package/dist/server/i18n/index.d.ts.map +1 -0
- package/dist/server/i18n/index.js +13 -0
- package/dist/server/i18n/index.js.map +1 -0
- package/dist/server/i18n/translate.d.ts +38 -0
- package/dist/server/i18n/translate.d.ts.map +1 -0
- package/dist/server/i18n/translate.js +83 -0
- package/dist/server/i18n/translate.js.map +1 -0
- package/dist/server/index.d.ts +40 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +36 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/jobs/define-job.d.ts +50 -0
- package/dist/server/jobs/define-job.d.ts.map +1 -0
- package/dist/server/jobs/define-job.js +32 -0
- package/dist/server/jobs/define-job.js.map +1 -0
- package/dist/server/jobs/index.d.ts +13 -0
- package/dist/server/jobs/index.d.ts.map +1 -0
- package/dist/server/jobs/index.js +12 -0
- package/dist/server/jobs/index.js.map +1 -0
- package/dist/server/jobs/runner.d.ts +37 -0
- package/dist/server/jobs/runner.d.ts.map +1 -0
- package/dist/server/jobs/runner.js +75 -0
- package/dist/server/jobs/runner.js.map +1 -0
- package/dist/server/middleware/configProvider.d.ts +26 -0
- package/dist/server/middleware/configProvider.d.ts.map +1 -0
- package/dist/server/middleware/configProvider.js +78 -0
- package/dist/server/middleware/configProvider.js.map +1 -0
- package/dist/server/middleware/dbProvider.d.ts +27 -0
- package/dist/server/middleware/dbProvider.d.ts.map +1 -0
- package/dist/server/middleware/dbProvider.js +66 -0
- package/dist/server/middleware/dbProvider.js.map +1 -0
- package/dist/server/middleware/rateLimiter.d.ts +74 -0
- package/dist/server/middleware/rateLimiter.d.ts.map +1 -0
- package/dist/server/middleware/rateLimiter.js +164 -0
- package/dist/server/middleware/rateLimiter.js.map +1 -0
- package/dist/server/middleware/validator.d.ts +57 -0
- package/dist/server/middleware/validator.d.ts.map +1 -0
- package/dist/server/middleware/validator.js +128 -0
- package/dist/server/middleware/validator.js.map +1 -0
- package/dist/server/openapi/append-tag.d.ts +21 -0
- package/dist/server/openapi/append-tag.d.ts.map +1 -0
- package/dist/server/openapi/append-tag.js +54 -0
- package/dist/server/openapi/append-tag.js.map +1 -0
- package/dist/server/openapi/index.d.ts +13 -0
- package/dist/server/openapi/index.d.ts.map +1 -0
- package/dist/server/openapi/index.js +12 -0
- package/dist/server/openapi/index.js.map +1 -0
- package/dist/server/openapi/spec-template.d.ts +45 -0
- package/dist/server/openapi/spec-template.d.ts.map +1 -0
- package/dist/server/openapi/spec-template.js +132 -0
- package/dist/server/openapi/spec-template.js.map +1 -0
- package/dist/server/renderer.d.ts +62 -0
- package/dist/server/renderer.d.ts.map +1 -0
- package/dist/server/renderer.js +115 -0
- package/dist/server/renderer.js.map +1 -0
- package/dist/server/resolvers/cache-driver.d.ts +22 -0
- package/dist/server/resolvers/cache-driver.d.ts.map +1 -0
- package/dist/server/resolvers/cache-driver.js +29 -0
- package/dist/server/resolvers/cache-driver.js.map +1 -0
- package/dist/server/resolvers/index.d.ts +17 -0
- package/dist/server/resolvers/index.d.ts.map +1 -0
- package/dist/server/resolvers/index.js +14 -0
- package/dist/server/resolvers/index.js.map +1 -0
- package/dist/server/resolvers/queue-driver.d.ts +25 -0
- package/dist/server/resolvers/queue-driver.d.ts.map +1 -0
- package/dist/server/resolvers/queue-driver.js +44 -0
- package/dist/server/resolvers/queue-driver.js.map +1 -0
- package/dist/server/resolvers/storage-driver.d.ts +24 -0
- package/dist/server/resolvers/storage-driver.d.ts.map +1 -0
- package/dist/server/resolvers/storage-driver.js +38 -0
- package/dist/server/resolvers/storage-driver.js.map +1 -0
- package/dist/server/resolvers/validate-compatibility.d.ts +22 -0
- package/dist/server/resolvers/validate-compatibility.d.ts.map +1 -0
- package/dist/server/resolvers/validate-compatibility.js +83 -0
- package/dist/server/resolvers/validate-compatibility.js.map +1 -0
- package/dist/server/resources/base-resource.d.ts +57 -0
- package/dist/server/resources/base-resource.d.ts.map +1 -0
- package/dist/server/resources/base-resource.js +74 -0
- package/dist/server/resources/base-resource.js.map +1 -0
- package/dist/server/route-rules.d.ts +45 -0
- package/dist/server/route-rules.d.ts.map +1 -0
- package/dist/server/route-rules.js +66 -0
- package/dist/server/route-rules.js.map +1 -0
- package/dist/server/seo.d.ts +58 -0
- package/dist/server/seo.d.ts.map +1 -0
- package/dist/server/seo.js +85 -0
- package/dist/server/seo.js.map +1 -0
- package/dist/server/storage/drivers/bunny.d.ts +33 -0
- package/dist/server/storage/drivers/bunny.d.ts.map +1 -0
- package/dist/server/storage/drivers/bunny.js +70 -0
- package/dist/server/storage/drivers/bunny.js.map +1 -0
- package/dist/server/storage/drivers/cloudinary.d.ts +30 -0
- package/dist/server/storage/drivers/cloudinary.d.ts.map +1 -0
- package/dist/server/storage/drivers/cloudinary.js +86 -0
- package/dist/server/storage/drivers/cloudinary.js.map +1 -0
- package/dist/server/storage/drivers/local.d.ts +28 -0
- package/dist/server/storage/drivers/local.d.ts.map +1 -0
- package/dist/server/storage/drivers/local.js +57 -0
- package/dist/server/storage/drivers/local.js.map +1 -0
- package/dist/server/storage/drivers/r2.d.ts +32 -0
- package/dist/server/storage/drivers/r2.d.ts.map +1 -0
- package/dist/server/storage/drivers/r2.js +70 -0
- package/dist/server/storage/drivers/r2.js.map +1 -0
- package/dist/server/storage/drivers/s3.d.ts +29 -0
- package/dist/server/storage/drivers/s3.d.ts.map +1 -0
- package/dist/server/storage/drivers/s3.js +68 -0
- package/dist/server/storage/drivers/s3.js.map +1 -0
- package/dist/server/storage/index.d.ts +17 -0
- package/dist/server/storage/index.d.ts.map +1 -0
- package/dist/server/storage/index.js +16 -0
- package/dist/server/storage/index.js.map +1 -0
- package/dist/server/storage/types.d.ts +70 -0
- package/dist/server/storage/types.d.ts.map +1 -0
- package/dist/server/storage/types.js +11 -0
- package/dist/server/storage/types.js.map +1 -0
- package/dist/server/storage/use-storage.d.ts +54 -0
- package/dist/server/storage/use-storage.d.ts.map +1 -0
- package/dist/server/storage/use-storage.js +150 -0
- package/dist/server/storage/use-storage.js.map +1 -0
- package/dist/server/stream-renderer.d.ts +49 -0
- package/dist/server/stream-renderer.d.ts.map +1 -0
- package/dist/server/stream-renderer.js +89 -0
- package/dist/server/stream-renderer.js.map +1 -0
- package/dist/server/templates/health.routes.d.ts +22 -0
- package/dist/server/templates/health.routes.d.ts.map +1 -0
- package/dist/server/templates/health.routes.js +28 -0
- package/dist/server/templates/health.routes.js.map +1 -0
- package/dist/server/utils/storage-url.d.ts +36 -0
- package/dist/server/utils/storage-url.d.ts.map +1 -0
- package/dist/server/utils/storage-url.js +53 -0
- package/dist/server/utils/storage-url.js.map +1 -0
- package/dist/shared/utils/autoRoutes.d.ts +22 -0
- package/dist/shared/utils/autoRoutes.d.ts.map +1 -0
- package/dist/shared/utils/autoRoutes.js +29 -0
- package/dist/shared/utils/autoRoutes.js.map +1 -0
- package/dist/shared/utils/id.d.ts +25 -0
- package/dist/shared/utils/id.d.ts.map +1 -0
- package/dist/shared/utils/id.js +29 -0
- package/dist/shared/utils/id.js.map +1 -0
- package/dist/shared/utils/logger.d.ts +33 -0
- package/dist/shared/utils/logger.d.ts.map +1 -0
- package/dist/shared/utils/logger.js +65 -0
- package/dist/shared/utils/logger.js.map +1 -0
- package/dist/shared/utils/mappers.d.ts +23 -0
- package/dist/shared/utils/mappers.d.ts.map +1 -0
- package/dist/shared/utils/mappers.js +37 -0
- package/dist/shared/utils/mappers.js.map +1 -0
- package/dist/shared/utils/pagination.d.ts +26 -0
- package/dist/shared/utils/pagination.d.ts.map +1 -0
- package/dist/shared/utils/pagination.js +28 -0
- package/dist/shared/utils/pagination.js.map +1 -0
- package/dist/shared/utils/response.d.ts +38 -0
- package/dist/shared/utils/response.d.ts.map +1 -0
- package/dist/shared/utils/response.js +46 -0
- package/dist/shared/utils/response.js.map +1 -0
- package/dist/shared/utils/softDeletes.d.ts +90 -0
- package/dist/shared/utils/softDeletes.d.ts.map +1 -0
- package/dist/shared/utils/softDeletes.js +72 -0
- package/dist/shared/utils/softDeletes.js.map +1 -0
- package/dist/types/index.d.ts +191 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/vite/index.d.ts +30 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +218 -0
- package/dist/vite/index.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ──────────────────────────────────────────────────────────────────
|
|
3
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
4
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
5
|
+
* 🐙 GitHub: oyenet1
|
|
6
|
+
* 📅 Created Date: 2026-04-05
|
|
7
|
+
* 🔄 Updated Date: 2026-04-05
|
|
8
|
+
* ──────────────────────────────────────────────────────────────────
|
|
9
|
+
*/
|
|
10
|
+
import type { StorageDriver, UploadOptions, UploadResult } from '../types.js';
|
|
11
|
+
export interface CloudinaryConfig {
|
|
12
|
+
cloudName: string;
|
|
13
|
+
apiKey: string;
|
|
14
|
+
apiSecret: string;
|
|
15
|
+
/** Upload preset (optional) */
|
|
16
|
+
uploadPreset?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Cloudinary image CDN driver.
|
|
20
|
+
* Uses the Cloudinary Upload API (no SDK — pure fetch).
|
|
21
|
+
*/
|
|
22
|
+
export declare class CloudinaryDriver implements StorageDriver {
|
|
23
|
+
private readonly config;
|
|
24
|
+
constructor(config: CloudinaryConfig);
|
|
25
|
+
upload(file: File, options?: UploadOptions): Promise<UploadResult>;
|
|
26
|
+
delete(key: string): Promise<void>;
|
|
27
|
+
url(key: string): string;
|
|
28
|
+
private _sign;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=cloudinary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudinary.d.ts","sourceRoot":"","sources":["../../../../src/server/storage/drivers/cloudinary.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAID;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,aAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,gBAAgB;IAE/C,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA0ClE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BxC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;YAIV,KAAK;CAYpB"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ──────────────────────────────────────────────────────────────────
|
|
3
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
4
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
5
|
+
* 🐙 GitHub: oyenet1
|
|
6
|
+
* 📅 Created Date: 2026-04-05
|
|
7
|
+
* 🔄 Updated Date: 2026-04-05
|
|
8
|
+
* ──────────────────────────────────────────────────────────────────
|
|
9
|
+
*/
|
|
10
|
+
import { Logger } from '../../../shared/utils/logger.js';
|
|
11
|
+
// ─── CloudinaryDriver ─────────────────────────────────────────────────────────
|
|
12
|
+
/**
|
|
13
|
+
* Cloudinary image CDN driver.
|
|
14
|
+
* Uses the Cloudinary Upload API (no SDK — pure fetch).
|
|
15
|
+
*/
|
|
16
|
+
export class CloudinaryDriver {
|
|
17
|
+
config;
|
|
18
|
+
constructor(config) {
|
|
19
|
+
this.config = config;
|
|
20
|
+
}
|
|
21
|
+
async upload(file, options) {
|
|
22
|
+
const url = `https://api.cloudinary.com/v1_1/${this.config.cloudName}/auto/upload`;
|
|
23
|
+
const formData = new FormData();
|
|
24
|
+
formData.append('file', file);
|
|
25
|
+
formData.append('api_key', this.config.apiKey);
|
|
26
|
+
if (options?.key) {
|
|
27
|
+
formData.append('public_id', options.key.replace(/\.[^.]+$/, ''));
|
|
28
|
+
}
|
|
29
|
+
if (this.config.uploadPreset) {
|
|
30
|
+
formData.append('upload_preset', this.config.uploadPreset);
|
|
31
|
+
}
|
|
32
|
+
// Generate signature for authenticated upload
|
|
33
|
+
const timestamp = Math.floor(Date.now() / 1000).toString();
|
|
34
|
+
formData.append('timestamp', timestamp);
|
|
35
|
+
const signature = await this._sign({ timestamp, public_id: options?.key });
|
|
36
|
+
formData.append('signature', signature);
|
|
37
|
+
const res = await fetch(url, { method: 'POST', body: formData });
|
|
38
|
+
if (!res.ok) {
|
|
39
|
+
const body = await res.text();
|
|
40
|
+
Logger.error('[storage:cloudinary] Upload failed', { status: res.status, body });
|
|
41
|
+
throw new Error(`Cloudinary upload error: ${res.status}`);
|
|
42
|
+
}
|
|
43
|
+
const data = await res.json();
|
|
44
|
+
Logger.info('[storage:cloudinary] File uploaded', { publicId: data.public_id });
|
|
45
|
+
return {
|
|
46
|
+
key: data.public_id,
|
|
47
|
+
url: data.secure_url,
|
|
48
|
+
size: data.bytes,
|
|
49
|
+
contentType: options?.contentType ?? `image/${data.format}`,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
async delete(key) {
|
|
53
|
+
const timestamp = Math.floor(Date.now() / 1000).toString();
|
|
54
|
+
const signature = await this._sign({ public_id: key, timestamp });
|
|
55
|
+
const res = await fetch(`https://api.cloudinary.com/v1_1/${this.config.cloudName}/image/destroy`, {
|
|
56
|
+
method: 'POST',
|
|
57
|
+
headers: { 'Content-Type': 'application/json' },
|
|
58
|
+
body: JSON.stringify({
|
|
59
|
+
public_id: key,
|
|
60
|
+
api_key: this.config.apiKey,
|
|
61
|
+
timestamp,
|
|
62
|
+
signature,
|
|
63
|
+
}),
|
|
64
|
+
});
|
|
65
|
+
if (!res.ok) {
|
|
66
|
+
Logger.error('[storage:cloudinary] Delete failed', { key, status: res.status });
|
|
67
|
+
throw new Error(`Cloudinary delete error: ${res.status}`);
|
|
68
|
+
}
|
|
69
|
+
Logger.info('[storage:cloudinary] File deleted', { key });
|
|
70
|
+
}
|
|
71
|
+
url(key) {
|
|
72
|
+
return `https://res.cloudinary.com/${this.config.cloudName}/image/upload/${key}`;
|
|
73
|
+
}
|
|
74
|
+
async _sign(params) {
|
|
75
|
+
// Build sorted param string (exclude api_key, file, resource_type, cloud_name)
|
|
76
|
+
const sorted = Object.entries(params)
|
|
77
|
+
.filter(([, v]) => v !== undefined)
|
|
78
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
79
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
80
|
+
.join('&');
|
|
81
|
+
const toSign = `${sorted}${this.config.apiSecret}`;
|
|
82
|
+
const buffer = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(toSign));
|
|
83
|
+
return Array.from(new Uint8Array(buffer)).map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=cloudinary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudinary.js","sourceRoot":"","sources":["../../../../src/server/storage/drivers/cloudinary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ──────────────────────────────────────────────────────────────────
|
|
3
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
4
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
5
|
+
* 🐙 GitHub: oyenet1
|
|
6
|
+
* 📅 Created Date: 2026-04-05
|
|
7
|
+
* 🔄 Updated Date: 2026-04-05
|
|
8
|
+
* ──────────────────────────────────────────────────────────────────
|
|
9
|
+
*/
|
|
10
|
+
import type { StorageDriver, UploadOptions, UploadResult } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Local storage driver — saves files to `./storage/uploads/`.
|
|
13
|
+
* Files are served at `/uploads/<key>`.
|
|
14
|
+
*
|
|
15
|
+
* For development and single-server deployments only.
|
|
16
|
+
*/
|
|
17
|
+
export declare class LocalDriver implements StorageDriver {
|
|
18
|
+
private readonly uploadDir;
|
|
19
|
+
private readonly baseUrl;
|
|
20
|
+
constructor(options?: {
|
|
21
|
+
uploadDir?: string;
|
|
22
|
+
baseUrl?: string;
|
|
23
|
+
});
|
|
24
|
+
upload(file: File, options?: UploadOptions): Promise<UploadResult>;
|
|
25
|
+
delete(key: string): Promise<void>;
|
|
26
|
+
url(key: string): string;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../../src/server/storage/drivers/local.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI7E;;;;;GAKG;AACH,qBAAa,WAAY,YAAW,aAAa;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;gBAEpB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAKxD,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAsBlE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAIzB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ──────────────────────────────────────────────────────────────────
|
|
3
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
4
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
5
|
+
* 🐙 GitHub: oyenet1
|
|
6
|
+
* 📅 Created Date: 2026-04-05
|
|
7
|
+
* 🔄 Updated Date: 2026-04-05
|
|
8
|
+
* ──────────────────────────────────────────────────────────────────
|
|
9
|
+
*/
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { mkdirSync, writeFileSync, unlinkSync, existsSync } from 'node:fs';
|
|
12
|
+
import { generateId } from '../../../shared/utils/id.js';
|
|
13
|
+
import { Logger } from '../../../shared/utils/logger.js';
|
|
14
|
+
// ─── LocalDriver ─────────────────────────────────────────────────────────────
|
|
15
|
+
/**
|
|
16
|
+
* Local storage driver — saves files to `./storage/uploads/`.
|
|
17
|
+
* Files are served at `/uploads/<key>`.
|
|
18
|
+
*
|
|
19
|
+
* For development and single-server deployments only.
|
|
20
|
+
*/
|
|
21
|
+
export class LocalDriver {
|
|
22
|
+
uploadDir;
|
|
23
|
+
baseUrl;
|
|
24
|
+
constructor(options) {
|
|
25
|
+
this.uploadDir = options?.uploadDir ?? join(process.cwd(), 'storage', 'uploads');
|
|
26
|
+
this.baseUrl = options?.baseUrl ?? '/uploads';
|
|
27
|
+
}
|
|
28
|
+
async upload(file, options) {
|
|
29
|
+
const ext = file.name.split('.').pop() ?? 'bin';
|
|
30
|
+
const key = options?.key ?? `${generateId()}.${ext}`;
|
|
31
|
+
const filePath = join(this.uploadDir, key);
|
|
32
|
+
// Ensure directory exists
|
|
33
|
+
const dir = filePath.substring(0, filePath.lastIndexOf('/'));
|
|
34
|
+
mkdirSync(dir, { recursive: true });
|
|
35
|
+
const buffer = await file.arrayBuffer();
|
|
36
|
+
writeFileSync(filePath, Buffer.from(buffer));
|
|
37
|
+
Logger.info('[storage:local] File uploaded', { key, size: file.size });
|
|
38
|
+
return {
|
|
39
|
+
key,
|
|
40
|
+
url: this.url(key),
|
|
41
|
+
size: file.size,
|
|
42
|
+
contentType: options?.contentType ?? file.type,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
async delete(key) {
|
|
46
|
+
const filePath = join(this.uploadDir, key);
|
|
47
|
+
if (existsSync(filePath)) {
|
|
48
|
+
unlinkSync(filePath);
|
|
49
|
+
Logger.info('[storage:local] File deleted', { key });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
url(key) {
|
|
53
|
+
const normalised = key.startsWith('/') ? key.slice(1) : key;
|
|
54
|
+
return `${this.baseUrl}/${normalised}`;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../../../src/server/storage/drivers/local.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAA;AAGxD,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IACL,SAAS,CAAQ;IACjB,OAAO,CAAQ;IAEhC,YAAY,OAAkD;QAC5D,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;QAChF,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,UAAU,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAU,EAAE,OAAuB;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAAA;QAC/C,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,GAAG,UAAU,EAAE,IAAI,GAAG,EAAE,CAAA;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;QAE1C,0BAA0B;QAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAA;QAC5D,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAEnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;QACvC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAE5C,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QAEtE,OAAO;YACL,GAAG;YACH,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAClB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,IAAI;SAC/C,CAAA;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;QAC1C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,QAAQ,CAAC,CAAA;YACpB,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;QACtD,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAW;QACb,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QAC3D,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,UAAU,EAAE,CAAA;IACxC,CAAC;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ──────────────────────────────────────────────────────────────────
|
|
3
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
4
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
5
|
+
* 🐙 GitHub: oyenet1
|
|
6
|
+
* 📅 Created Date: 2026-04-05
|
|
7
|
+
* 🔄 Updated Date: 2026-04-05
|
|
8
|
+
* ──────────────────────────────────────────────────────────────────
|
|
9
|
+
*/
|
|
10
|
+
import type { StorageDriver, UploadOptions, UploadResult } from '../types.js';
|
|
11
|
+
export interface R2Config {
|
|
12
|
+
accountId: string;
|
|
13
|
+
accessKeyId: string;
|
|
14
|
+
secretAccessKey: string;
|
|
15
|
+
bucketName: string;
|
|
16
|
+
/** Public CDN base URL (e.g. https://pub-xxx.r2.dev) */
|
|
17
|
+
baseUrl: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Cloudflare R2 storage driver — uses the S3-compatible API.
|
|
21
|
+
*
|
|
22
|
+
* Requires `@aws-sdk/client-s3` for the S3-compatible upload.
|
|
23
|
+
* R2 endpoint: `https://<accountId>.r2.cloudflarestorage.com`
|
|
24
|
+
*/
|
|
25
|
+
export declare class R2Driver implements StorageDriver {
|
|
26
|
+
private readonly config;
|
|
27
|
+
constructor(config: R2Config);
|
|
28
|
+
upload(file: File, options?: UploadOptions): Promise<UploadResult>;
|
|
29
|
+
delete(key: string): Promise<void>;
|
|
30
|
+
url(key: string): string;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=r2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"r2.d.ts","sourceRoot":"","sources":["../../../../src/server/storage/drivers/r2.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE7E,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAA;CAChB;AAID;;;;;GAKG;AACH,qBAAa,QAAS,YAAW,aAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,QAAQ;IAEvC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAkClE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBxC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAKzB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ──────────────────────────────────────────────────────────────────
|
|
3
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
4
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
5
|
+
* 🐙 GitHub: oyenet1
|
|
6
|
+
* 📅 Created Date: 2026-04-05
|
|
7
|
+
* 🔄 Updated Date: 2026-04-05
|
|
8
|
+
* ──────────────────────────────────────────────────────────────────
|
|
9
|
+
*/
|
|
10
|
+
import { generateId } from '../../../shared/utils/id.js';
|
|
11
|
+
import { Logger } from '../../../shared/utils/logger.js';
|
|
12
|
+
// ─── R2Driver ────────────────────────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* Cloudflare R2 storage driver — uses the S3-compatible API.
|
|
15
|
+
*
|
|
16
|
+
* Requires `@aws-sdk/client-s3` for the S3-compatible upload.
|
|
17
|
+
* R2 endpoint: `https://<accountId>.r2.cloudflarestorage.com`
|
|
18
|
+
*/
|
|
19
|
+
export class R2Driver {
|
|
20
|
+
config;
|
|
21
|
+
constructor(config) {
|
|
22
|
+
this.config = config;
|
|
23
|
+
}
|
|
24
|
+
async upload(file, options) {
|
|
25
|
+
const { S3Client, PutObjectCommand } = await import('@aws-sdk/client-s3').catch(() => {
|
|
26
|
+
throw new Error('[storage:r2] @aws-sdk/client-s3 is not installed. Run: bun add @aws-sdk/client-s3');
|
|
27
|
+
});
|
|
28
|
+
const ext = file.name.split('.').pop() ?? 'bin';
|
|
29
|
+
const key = options?.key ?? `${generateId()}.${ext}`;
|
|
30
|
+
const contentType = options?.contentType ?? file.type;
|
|
31
|
+
const client = new S3Client({
|
|
32
|
+
region: 'auto',
|
|
33
|
+
endpoint: `https://${this.config.accountId}.r2.cloudflarestorage.com`,
|
|
34
|
+
credentials: {
|
|
35
|
+
accessKeyId: this.config.accessKeyId,
|
|
36
|
+
secretAccessKey: this.config.secretAccessKey,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
const buffer = await file.arrayBuffer();
|
|
40
|
+
await client.send(new PutObjectCommand({
|
|
41
|
+
Bucket: this.config.bucketName,
|
|
42
|
+
Key: key,
|
|
43
|
+
Body: Buffer.from(buffer),
|
|
44
|
+
ContentType: contentType,
|
|
45
|
+
}));
|
|
46
|
+
Logger.info('[storage:r2] File uploaded', { key, size: file.size });
|
|
47
|
+
return { key, url: this.url(key), size: file.size, contentType };
|
|
48
|
+
}
|
|
49
|
+
async delete(key) {
|
|
50
|
+
const { S3Client, DeleteObjectCommand } = await import('@aws-sdk/client-s3').catch(() => {
|
|
51
|
+
throw new Error('[storage:r2] @aws-sdk/client-s3 is not installed.');
|
|
52
|
+
});
|
|
53
|
+
const client = new S3Client({
|
|
54
|
+
region: 'auto',
|
|
55
|
+
endpoint: `https://${this.config.accountId}.r2.cloudflarestorage.com`,
|
|
56
|
+
credentials: {
|
|
57
|
+
accessKeyId: this.config.accessKeyId,
|
|
58
|
+
secretAccessKey: this.config.secretAccessKey,
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
await client.send(new DeleteObjectCommand({ Bucket: this.config.bucketName, Key: key }));
|
|
62
|
+
Logger.info('[storage:r2] File deleted', { key });
|
|
63
|
+
}
|
|
64
|
+
url(key) {
|
|
65
|
+
const base = this.config.baseUrl.endsWith('/') ? this.config.baseUrl.slice(0, -1) : this.config.baseUrl;
|
|
66
|
+
const normalised = key.startsWith('/') ? key.slice(1) : key;
|
|
67
|
+
return `${base}/${normalised}`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=r2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"r2.js","sourceRoot":"","sources":["../../../../src/server/storage/drivers/r2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ──────────────────────────────────────────────────────────────────
|
|
3
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
4
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
5
|
+
* 🐙 GitHub: oyenet1
|
|
6
|
+
* 📅 Created Date: 2026-04-05
|
|
7
|
+
* 🔄 Updated Date: 2026-04-05
|
|
8
|
+
* ──────────────────────────────────────────────────────────────────
|
|
9
|
+
*/
|
|
10
|
+
import type { StorageDriver, UploadOptions, UploadResult } from '../types.js';
|
|
11
|
+
export interface S3Config {
|
|
12
|
+
bucket: string;
|
|
13
|
+
region: string;
|
|
14
|
+
accessKeyId: string;
|
|
15
|
+
secretAccessKey: string;
|
|
16
|
+
/** Public base URL (e.g. https://my-bucket.s3.amazonaws.com) */
|
|
17
|
+
baseUrl?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* AWS S3 storage driver using `@aws-sdk/client-s3`.
|
|
21
|
+
*/
|
|
22
|
+
export declare class S3Driver implements StorageDriver {
|
|
23
|
+
private readonly config;
|
|
24
|
+
constructor(config: S3Config);
|
|
25
|
+
upload(file: File, options?: UploadOptions): Promise<UploadResult>;
|
|
26
|
+
delete(key: string): Promise<void>;
|
|
27
|
+
url(key: string): string;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=s3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3.d.ts","sourceRoot":"","sources":["../../../../src/server/storage/drivers/s3.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE7E,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAID;;GAEG;AACH,qBAAa,QAAS,YAAW,aAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,QAAQ;IAEvC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAiClE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAOzB"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ──────────────────────────────────────────────────────────────────
|
|
3
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
4
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
5
|
+
* 🐙 GitHub: oyenet1
|
|
6
|
+
* 📅 Created Date: 2026-04-05
|
|
7
|
+
* 🔄 Updated Date: 2026-04-05
|
|
8
|
+
* ──────────────────────────────────────────────────────────────────
|
|
9
|
+
*/
|
|
10
|
+
import { generateId } from '../../../shared/utils/id.js';
|
|
11
|
+
import { Logger } from '../../../shared/utils/logger.js';
|
|
12
|
+
// ─── S3Driver ────────────────────────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* AWS S3 storage driver using `@aws-sdk/client-s3`.
|
|
15
|
+
*/
|
|
16
|
+
export class S3Driver {
|
|
17
|
+
config;
|
|
18
|
+
constructor(config) {
|
|
19
|
+
this.config = config;
|
|
20
|
+
}
|
|
21
|
+
async upload(file, options) {
|
|
22
|
+
const { S3Client, PutObjectCommand } = await import('@aws-sdk/client-s3').catch(() => {
|
|
23
|
+
throw new Error('[storage:s3] @aws-sdk/client-s3 is not installed. Run: bun add @aws-sdk/client-s3');
|
|
24
|
+
});
|
|
25
|
+
const ext = file.name.split('.').pop() ?? 'bin';
|
|
26
|
+
const key = options?.key ?? `${generateId()}.${ext}`;
|
|
27
|
+
const contentType = options?.contentType ?? file.type;
|
|
28
|
+
const client = new S3Client({
|
|
29
|
+
region: this.config.region,
|
|
30
|
+
credentials: {
|
|
31
|
+
accessKeyId: this.config.accessKeyId,
|
|
32
|
+
secretAccessKey: this.config.secretAccessKey,
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
const buffer = await file.arrayBuffer();
|
|
36
|
+
await client.send(new PutObjectCommand({
|
|
37
|
+
Bucket: this.config.bucket,
|
|
38
|
+
Key: key,
|
|
39
|
+
Body: Buffer.from(buffer),
|
|
40
|
+
ContentType: contentType,
|
|
41
|
+
ACL: options?.public !== false ? 'public-read' : 'private',
|
|
42
|
+
}));
|
|
43
|
+
Logger.info('[storage:s3] File uploaded', { key, size: file.size });
|
|
44
|
+
return { key, url: this.url(key), size: file.size, contentType };
|
|
45
|
+
}
|
|
46
|
+
async delete(key) {
|
|
47
|
+
const { S3Client, DeleteObjectCommand } = await import('@aws-sdk/client-s3').catch(() => {
|
|
48
|
+
throw new Error('[storage:s3] @aws-sdk/client-s3 is not installed.');
|
|
49
|
+
});
|
|
50
|
+
const client = new S3Client({
|
|
51
|
+
region: this.config.region,
|
|
52
|
+
credentials: {
|
|
53
|
+
accessKeyId: this.config.accessKeyId,
|
|
54
|
+
secretAccessKey: this.config.secretAccessKey,
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
await client.send(new DeleteObjectCommand({ Bucket: this.config.bucket, Key: key }));
|
|
58
|
+
Logger.info('[storage:s3] File deleted', { key });
|
|
59
|
+
}
|
|
60
|
+
url(key) {
|
|
61
|
+
const base = this.config.baseUrl
|
|
62
|
+
? (this.config.baseUrl.endsWith('/') ? this.config.baseUrl.slice(0, -1) : this.config.baseUrl)
|
|
63
|
+
: `https://${this.config.bucket}.s3.${this.config.region}.amazonaws.com`;
|
|
64
|
+
const normalised = key.startsWith('/') ? key.slice(1) : key;
|
|
65
|
+
return `${base}/${normalised}`;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=s3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3.js","sourceRoot":"","sources":["../../../../src/server/storage/drivers/s3.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ──────────────────────────────────────────────────────────────────
|
|
3
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
4
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
5
|
+
* 🐙 GitHub: oyenet1
|
|
6
|
+
* 📅 Created Date: 2026-04-05
|
|
7
|
+
* 🔄 Updated Date: 2026-04-05
|
|
8
|
+
* ──────────────────────────────────────────────────────────────────
|
|
9
|
+
*/
|
|
10
|
+
export { useStorage } from './use-storage.js';
|
|
11
|
+
export type { StorageDriver, StorageConfig, UploadOptions, UploadResult } from './types.js';
|
|
12
|
+
export { LocalDriver } from './drivers/local.js';
|
|
13
|
+
export { R2Driver } from './drivers/r2.js';
|
|
14
|
+
export { S3Driver } from './drivers/s3.js';
|
|
15
|
+
export { CloudinaryDriver } from './drivers/cloudinary.js';
|
|
16
|
+
export { BunnyDriver } from './drivers/bunny.js';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/storage/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ──────────────────────────────────────────────────────────────────
|
|
3
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
4
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
5
|
+
* 🐙 GitHub: oyenet1
|
|
6
|
+
* 📅 Created Date: 2026-04-05
|
|
7
|
+
* 🔄 Updated Date: 2026-04-05
|
|
8
|
+
* ──────────────────────────────────────────────────────────────────
|
|
9
|
+
*/
|
|
10
|
+
export { useStorage } from './use-storage.js';
|
|
11
|
+
export { LocalDriver } from './drivers/local.js';
|
|
12
|
+
export { R2Driver } from './drivers/r2.js';
|
|
13
|
+
export { S3Driver } from './drivers/s3.js';
|
|
14
|
+
export { CloudinaryDriver } from './drivers/cloudinary.js';
|
|
15
|
+
export { BunnyDriver } from './drivers/bunny.js';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/storage/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ──────────────────────────────────────────────────────────────────
|
|
3
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
4
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
5
|
+
* 🐙 GitHub: oyenet1
|
|
6
|
+
* 📅 Created Date: 2026-04-05
|
|
7
|
+
* 🔄 Updated Date: 2026-04-05
|
|
8
|
+
* ──────────────────────────────────────────────────────────────────
|
|
9
|
+
*/
|
|
10
|
+
export interface UploadOptions {
|
|
11
|
+
/** Target key / path in the storage bucket */
|
|
12
|
+
key?: string;
|
|
13
|
+
/** MIME type override */
|
|
14
|
+
contentType?: string;
|
|
15
|
+
/** Whether the file should be publicly accessible */
|
|
16
|
+
public?: boolean;
|
|
17
|
+
/** Additional metadata */
|
|
18
|
+
metadata?: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
export interface UploadResult {
|
|
21
|
+
/** Storage key (path) of the uploaded file */
|
|
22
|
+
key: string;
|
|
23
|
+
/** Public URL of the uploaded file */
|
|
24
|
+
url: string;
|
|
25
|
+
/** File size in bytes */
|
|
26
|
+
size: number;
|
|
27
|
+
/** MIME type */
|
|
28
|
+
contentType: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* StorageDriver — interface that all storage drivers must implement.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* const storage = useStorage(c)
|
|
36
|
+
* const result = await storage.upload(file, { key: 'avatars/user-123.jpg' })
|
|
37
|
+
* const url = storage.url('avatars/user-123.jpg')
|
|
38
|
+
* await storage.delete('avatars/user-123.jpg')
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export interface StorageDriver {
|
|
42
|
+
/**
|
|
43
|
+
* Upload a file to storage.
|
|
44
|
+
* @param file - File object from multipart form data
|
|
45
|
+
* @param options - Optional upload configuration
|
|
46
|
+
*/
|
|
47
|
+
upload(file: File, options?: UploadOptions): Promise<UploadResult>;
|
|
48
|
+
/**
|
|
49
|
+
* Delete a file from storage by key.
|
|
50
|
+
* @param key - Storage key / path
|
|
51
|
+
*/
|
|
52
|
+
delete(key: string): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Get the public URL for a stored file.
|
|
55
|
+
* @param key - Storage key / path
|
|
56
|
+
*/
|
|
57
|
+
url(key: string): string;
|
|
58
|
+
}
|
|
59
|
+
export interface StorageConfig {
|
|
60
|
+
driver: 'local' | 'r2' | 's3' | 'cloudinary' | 'bunny';
|
|
61
|
+
/** Max file size in bytes (default: 10MB) */
|
|
62
|
+
maxSize?: number;
|
|
63
|
+
/** Allowed MIME types (default: all) */
|
|
64
|
+
allowedMimeTypes?: string[];
|
|
65
|
+
/** Base URL for CDN drivers */
|
|
66
|
+
baseUrl?: string;
|
|
67
|
+
/** Local upload directory (default: ./storage/uploads) */
|
|
68
|
+
uploadDir?: string;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/server/storage/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qDAAqD;IACrD,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAA;IACX,sCAAsC;IACtC,GAAG,EAAE,MAAM,CAAA;IACX,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB;AAID;;;;;;;;;;GAUG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IAElE;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAElC;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CACzB;AAID,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,YAAY,GAAG,OAAO,CAAA;IACtD,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ──────────────────────────────────────────────────────────────────
|
|
3
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
4
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
5
|
+
* 🐙 GitHub: oyenet1
|
|
6
|
+
* 📅 Created Date: 2026-04-05
|
|
7
|
+
* 🔄 Updated Date: 2026-04-05
|
|
8
|
+
* ──────────────────────────────────────────────────────────────────
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/server/storage/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|