@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,83 @@
|
|
|
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
|
+
const INCOMPATIBLE = [
|
|
11
|
+
{
|
|
12
|
+
runtime: ['cloudflare-workers', 'cloudflare-pages'],
|
|
13
|
+
driver: 'bullmq',
|
|
14
|
+
driverType: 'queue',
|
|
15
|
+
reason: 'BullMQ requires Redis and Node.js APIs not available on Cloudflare Workers. ' +
|
|
16
|
+
'Use cloudflare-queues instead.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
runtime: ['cloudflare-workers', 'cloudflare-pages'],
|
|
20
|
+
driver: 'sqs',
|
|
21
|
+
driverType: 'queue',
|
|
22
|
+
reason: 'AWS SQS SDK is not compatible with Cloudflare Workers. ' +
|
|
23
|
+
'Use cloudflare-queues instead.',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
runtime: ['cloudflare-workers', 'cloudflare-pages'],
|
|
27
|
+
driver: 's3',
|
|
28
|
+
driverType: 'storage',
|
|
29
|
+
reason: 'AWS S3 SDK requires Node.js APIs not available on Cloudflare Workers. ' +
|
|
30
|
+
'Use R2 instead.',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
runtime: ['cloudflare-workers', 'cloudflare-pages'],
|
|
34
|
+
driver: 'local',
|
|
35
|
+
driverType: 'storage',
|
|
36
|
+
reason: 'Local filesystem storage is not available on Cloudflare Workers. ' +
|
|
37
|
+
'Use R2 instead.',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
runtime: ['vercel', 'netlify', 'deno', 'fastly'],
|
|
41
|
+
driver: 'bullmq',
|
|
42
|
+
driverType: 'queue',
|
|
43
|
+
reason: 'BullMQ requires a persistent Redis connection which is not available on serverless runtimes. ' +
|
|
44
|
+
'Use Upstash QStash instead.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
runtime: ['vercel', 'netlify', 'deno', 'fastly'],
|
|
48
|
+
driver: 'local',
|
|
49
|
+
driverType: 'storage',
|
|
50
|
+
reason: 'Local filesystem storage is ephemeral on serverless runtimes. ' +
|
|
51
|
+
'Use S3 or another cloud storage driver.',
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
// ─── validateDriverCompatibility ────────────────────────────────────
|
|
55
|
+
/**
|
|
56
|
+
* validateDriverCompatibility — throws a descriptive error for
|
|
57
|
+
* incompatible driver/runtime combinations.
|
|
58
|
+
*
|
|
59
|
+
* Call this at startup before accepting requests.
|
|
60
|
+
*
|
|
61
|
+
* @throws Error with a human-readable message listing all conflicts
|
|
62
|
+
*/
|
|
63
|
+
export function validateDriverCompatibility(runtime, queueDriver, storageDriver, cacheDriver) {
|
|
64
|
+
const errors = [];
|
|
65
|
+
for (const rule of INCOMPATIBLE) {
|
|
66
|
+
if (!rule.runtime.includes(runtime))
|
|
67
|
+
continue;
|
|
68
|
+
const driverValue = rule.driverType === 'queue'
|
|
69
|
+
? queueDriver
|
|
70
|
+
: rule.driverType === 'storage'
|
|
71
|
+
? storageDriver
|
|
72
|
+
: cacheDriver;
|
|
73
|
+
if (driverValue === rule.driver) {
|
|
74
|
+
errors.push(` ❌ [${rule.driverType}] "${rule.driver}" is incompatible with runtime "${runtime}":\n` +
|
|
75
|
+
` ${rule.reason}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (errors.length > 0) {
|
|
79
|
+
throw new Error(`[vono] Driver compatibility errors detected:\n\n${errors.join('\n\n')}\n\n` +
|
|
80
|
+
`Fix these in your vono.config.ts before starting the server.`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=validate-compatibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-compatibility.js","sourceRoot":"","sources":["../../../src/server/resolvers/validate-compatibility.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,MAAM,YAAY,GAA0B;IAC1C;QACE,OAAO,EAAE,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;QACnD,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,OAAO;QACnB,MAAM,EACJ,8EAA8E;YAC9E,gCAAgC;KACnC;IACD;QACE,OAAO,EAAE,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;QACnD,MAAM,EAAE,KAAK;QACb,UAAU,EAAE,OAAO;QACnB,MAAM,EACJ,yDAAyD;YACzD,gCAAgC;KACnC;IACD;QACE,OAAO,EAAE,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;QACnD,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,SAAS;QACrB,MAAM,EACJ,wEAAwE;YACxE,iBAAiB;KACpB;IACD;QACE,OAAO,EAAE,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;QACnD,MAAM,EAAE,OAAO;QACf,UAAU,EAAE,SAAS;QACrB,MAAM,EACJ,mEAAmE;YACnE,iBAAiB;KACpB;IACD;QACE,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC;QAChD,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,OAAO;QACnB,MAAM,EACJ,+FAA+F;YAC/F,6BAA6B;KAChC;IACD;QACE,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC;QAChD,MAAM,EAAE,OAAO;QACf,UAAU,EAAE,SAAS;QACrB,MAAM,EACJ,gEAAgE;YAChE,yCAAyC;KAC5C;CACF,CAAA;AAED,uEAAuE;AAEvE;;;;;;;GAOG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAe,EACf,WAAwB,EACxB,aAA4B,EAC5B,WAAwB;IAExB,MAAM,MAAM,GAAa,EAAE,CAAA;IAE3B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAQ;QAE7C,MAAM,WAAW,GACf,IAAI,CAAC,UAAU,KAAK,OAAO;YACzB,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS;gBAC7B,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,WAAW,CAAA;QAEnB,IAAI,WAAW,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CACT,QAAQ,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,MAAM,mCAAmC,OAAO,MAAM;gBACtF,QAAQ,IAAI,CAAC,MAAM,EAAE,CACxB,CAAA;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,mDAAmD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1E,8DAA8D,CACjE,CAAA;IACH,CAAC;AACH,CAAC"}
|
|
@@ -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 { type PaginationMeta } from '../../shared/utils/pagination.js';
|
|
11
|
+
export interface ResourceCollection<T = Record<string, unknown>> {
|
|
12
|
+
items: T[];
|
|
13
|
+
meta: PaginationMeta;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* BaseResource — abstract base class for API resource transformers.
|
|
17
|
+
*
|
|
18
|
+
* Extend this class to define how a model is serialized for API responses.
|
|
19
|
+
* Override `transform(item)` to customize field mapping.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* export class UserResource extends BaseResource {
|
|
24
|
+
* static transform(item: Record<string, unknown>) {
|
|
25
|
+
* return { id: item.id, email: item.email, name: item.username }
|
|
26
|
+
* }
|
|
27
|
+
* }
|
|
28
|
+
*
|
|
29
|
+
* return c.json(success('Users', UserResource.toCollection(users, total, page, limit)))
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare abstract class BaseResource {
|
|
33
|
+
/**
|
|
34
|
+
* Override in subclasses to customize field mapping.
|
|
35
|
+
* By default returns the item with snake_case → camelCase conversion.
|
|
36
|
+
*/
|
|
37
|
+
protected static transform(item: Record<string, unknown>): Record<string, unknown>;
|
|
38
|
+
/**
|
|
39
|
+
* `toResource(item, fields?)` — transforms a single item.
|
|
40
|
+
*
|
|
41
|
+
* @param item - Raw DB row or plain object
|
|
42
|
+
* @param fields - Optional allowlist of field names to include in the output
|
|
43
|
+
*/
|
|
44
|
+
static toResource(item: Record<string, unknown>, fields?: string[]): Record<string, unknown>;
|
|
45
|
+
/**
|
|
46
|
+
* `toCollection(items, total, page, limit)` — transforms an array of items
|
|
47
|
+
* and wraps them with standard pagination metadata.
|
|
48
|
+
*
|
|
49
|
+
* @param items - Array of raw DB rows
|
|
50
|
+
* @param total - Total count across all pages
|
|
51
|
+
* @param page - Current page (1-indexed)
|
|
52
|
+
* @param limit - Items per page
|
|
53
|
+
* @param fields - Optional field allowlist applied to each item
|
|
54
|
+
*/
|
|
55
|
+
static toCollection(items: Record<string, unknown>[], total: number, page: number, limit: number, fields?: string[]): ResourceCollection;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=base-resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-resource.d.ts","sourceRoot":"","sources":["../../../src/server/resources/base-resource.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAK3F,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC7D,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,IAAI,EAAE,cAAc,CAAA;CACrB;AAID;;;;;;;;;;;;;;;;GAgBG;AACH,8BAAsB,YAAY;IAChC;;;OAGG;IACH,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIlF;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,CAAC,EAAE,MAAM,EAAE,GAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAgB1B;;;;;;;;;OASG;IACH,MAAM,CAAC,YAAY,CACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAChC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EAAE,GAChB,kBAAkB;CAMtB"}
|
|
@@ -0,0 +1,74 @@
|
|
|
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 { buildPaginationMeta } from '../../shared/utils/pagination.js';
|
|
11
|
+
import { toCamel } from '../../shared/utils/mappers.js';
|
|
12
|
+
// ─── BaseResource ─────────────────────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* BaseResource — abstract base class for API resource transformers.
|
|
15
|
+
*
|
|
16
|
+
* Extend this class to define how a model is serialized for API responses.
|
|
17
|
+
* Override `transform(item)` to customize field mapping.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* export class UserResource extends BaseResource {
|
|
22
|
+
* static transform(item: Record<string, unknown>) {
|
|
23
|
+
* return { id: item.id, email: item.email, name: item.username }
|
|
24
|
+
* }
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* return c.json(success('Users', UserResource.toCollection(users, total, page, limit)))
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export class BaseResource {
|
|
31
|
+
/**
|
|
32
|
+
* Override in subclasses to customize field mapping.
|
|
33
|
+
* By default returns the item with snake_case → camelCase conversion.
|
|
34
|
+
*/
|
|
35
|
+
static transform(item) {
|
|
36
|
+
return toCamel(item);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* `toResource(item, fields?)` — transforms a single item.
|
|
40
|
+
*
|
|
41
|
+
* @param item - Raw DB row or plain object
|
|
42
|
+
* @param fields - Optional allowlist of field names to include in the output
|
|
43
|
+
*/
|
|
44
|
+
static toResource(item, fields) {
|
|
45
|
+
const transformed = this.transform(item);
|
|
46
|
+
if (!fields || fields.length === 0) {
|
|
47
|
+
return transformed;
|
|
48
|
+
}
|
|
49
|
+
// Apply field selection — only include requested fields
|
|
50
|
+
return fields.reduce((acc, field) => {
|
|
51
|
+
if (Object.prototype.hasOwnProperty.call(transformed, field)) {
|
|
52
|
+
acc[field] = transformed[field];
|
|
53
|
+
}
|
|
54
|
+
return acc;
|
|
55
|
+
}, {});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* `toCollection(items, total, page, limit)` — transforms an array of items
|
|
59
|
+
* and wraps them with standard pagination metadata.
|
|
60
|
+
*
|
|
61
|
+
* @param items - Array of raw DB rows
|
|
62
|
+
* @param total - Total count across all pages
|
|
63
|
+
* @param page - Current page (1-indexed)
|
|
64
|
+
* @param limit - Items per page
|
|
65
|
+
* @param fields - Optional field allowlist applied to each item
|
|
66
|
+
*/
|
|
67
|
+
static toCollection(items, total, page, limit, fields) {
|
|
68
|
+
return {
|
|
69
|
+
items: items.map((item) => this.toResource(item, fields)),
|
|
70
|
+
meta: buildPaginationMeta(page, limit, total),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=base-resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-resource.js","sourceRoot":"","sources":["../../../src/server/resources/base-resource.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,mBAAmB,EAAuB,MAAM,kCAAkC,CAAA;AAC3F,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAA;AASvD,iFAAiF;AAEjF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAgB,YAAY;IAChC;;;OAGG;IACO,MAAM,CAAC,SAAS,CAAC,IAA6B;QACtD,OAAO,OAAO,CAAC,IAAI,CAA4B,CAAA;IACjD,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CACf,IAA6B,EAC7B,MAAiB;QAEjB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAExC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,WAAW,CAAA;QACpB,CAAC;QAED,wDAAwD;QACxD,OAAO,MAAM,CAAC,MAAM,CAA0B,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC3D,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;YACjC,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC,EAAE,EAAE,CAAC,CAAA;IACR,CAAC;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,YAAY,CACjB,KAAgC,EAChC,KAAa,EACb,IAAY,EACZ,KAAa,EACb,MAAiB;QAEjB,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACzD,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;SAC9C,CAAA;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
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 type RenderMode = 'ssr' | 'spa' | 'prerender';
|
|
11
|
+
export interface RouteRule {
|
|
12
|
+
/** How this route renders */
|
|
13
|
+
mode: RenderMode;
|
|
14
|
+
/** Cache-Control max-age in seconds. Only for SSR/prerender. */
|
|
15
|
+
cache?: number;
|
|
16
|
+
/** Stale-while-revalidate: serve stale while revalidating in background */
|
|
17
|
+
swr?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export type RouteRules = Record<string, RouteRule>;
|
|
20
|
+
/** Default rule returned when no pattern matches — SSR by default */
|
|
21
|
+
export declare const defaultRule: RouteRule;
|
|
22
|
+
/**
|
|
23
|
+
* Match a URL path against a single pattern.
|
|
24
|
+
*
|
|
25
|
+
* Supports:
|
|
26
|
+
* - Exact match: '/about' matches '/about' only
|
|
27
|
+
* - Wildcard suffix: '/blog/**' matches '/blog', '/blog/post', '/blog/2024/foo'
|
|
28
|
+
*/
|
|
29
|
+
export declare function matchPattern(pattern: string, path: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Resolve the route rule for a given URL path.
|
|
32
|
+
*
|
|
33
|
+
* Patterns are matched top-to-bottom — first match wins.
|
|
34
|
+
* Returns defaultRule if no pattern matches.
|
|
35
|
+
*
|
|
36
|
+
* Property 9: returns defaultRule for unmatched paths
|
|
37
|
+
* Property 10: first-match semantics
|
|
38
|
+
*/
|
|
39
|
+
export declare function resolveRouteRule(path: string, routeRules: RouteRules): RouteRule;
|
|
40
|
+
/**
|
|
41
|
+
* Default route rules for a new Vono project.
|
|
42
|
+
* Public pages → SSR, app pages → SPA.
|
|
43
|
+
*/
|
|
44
|
+
export declare const defaultRouteRules: RouteRules;
|
|
45
|
+
//# sourceMappingURL=route-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-rules.d.ts","sourceRoot":"","sources":["../../src/server/route-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,WAAW,CAAA;AAEpD,MAAM,WAAW,SAAS;IACxB,6BAA6B;IAC7B,IAAI,EAAE,UAAU,CAAA;IAChB,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2EAA2E;IAC3E,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AAElD,qEAAqE;AACrE,eAAO,MAAM,WAAW,EAAE,SAA2B,CAAA;AAErD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAWnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,UAAU,GACrB,SAAS,CAKX;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAgB/B,CAAA"}
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
/** Default rule returned when no pattern matches — SSR by default */
|
|
11
|
+
export const defaultRule = { mode: 'ssr' };
|
|
12
|
+
/**
|
|
13
|
+
* Match a URL path against a single pattern.
|
|
14
|
+
*
|
|
15
|
+
* Supports:
|
|
16
|
+
* - Exact match: '/about' matches '/about' only
|
|
17
|
+
* - Wildcard suffix: '/blog/**' matches '/blog', '/blog/post', '/blog/2024/foo'
|
|
18
|
+
*/
|
|
19
|
+
export function matchPattern(pattern, path) {
|
|
20
|
+
// Exact match
|
|
21
|
+
if (pattern === path)
|
|
22
|
+
return true;
|
|
23
|
+
// Wildcard: '/blog/**' matches '/blog/anything'
|
|
24
|
+
if (pattern.endsWith('/**')) {
|
|
25
|
+
const prefix = pattern.slice(0, -3); // strip '/**'
|
|
26
|
+
return path === prefix || path.startsWith(prefix + '/');
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Resolve the route rule for a given URL path.
|
|
32
|
+
*
|
|
33
|
+
* Patterns are matched top-to-bottom — first match wins.
|
|
34
|
+
* Returns defaultRule if no pattern matches.
|
|
35
|
+
*
|
|
36
|
+
* Property 9: returns defaultRule for unmatched paths
|
|
37
|
+
* Property 10: first-match semantics
|
|
38
|
+
*/
|
|
39
|
+
export function resolveRouteRule(path, routeRules) {
|
|
40
|
+
for (const [pattern, rule] of Object.entries(routeRules)) {
|
|
41
|
+
if (matchPattern(pattern, path))
|
|
42
|
+
return rule;
|
|
43
|
+
}
|
|
44
|
+
return defaultRule;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Default route rules for a new Vono project.
|
|
48
|
+
* Public pages → SSR, app pages → SPA.
|
|
49
|
+
*/
|
|
50
|
+
export const defaultRouteRules = {
|
|
51
|
+
// Public pages: SSR for SEO
|
|
52
|
+
'/': { mode: 'ssr', cache: 3600 },
|
|
53
|
+
'/about': { mode: 'ssr', cache: 86400 },
|
|
54
|
+
'/pricing': { mode: 'ssr', cache: 3600 },
|
|
55
|
+
'/blog': { mode: 'ssr', cache: 600, swr: true },
|
|
56
|
+
'/blog/**': { mode: 'ssr', cache: 1800, swr: true },
|
|
57
|
+
'/contact': { mode: 'ssr', cache: 86400 },
|
|
58
|
+
'/terms': { mode: 'ssr', cache: 86400 },
|
|
59
|
+
'/privacy': { mode: 'ssr', cache: 86400 },
|
|
60
|
+
// App pages: SPA only (behind auth, no SEO needed)
|
|
61
|
+
'/dashboard/**': { mode: 'spa' },
|
|
62
|
+
'/admin/**': { mode: 'spa' },
|
|
63
|
+
'/settings/**': { mode: 'spa' },
|
|
64
|
+
'/onboarding/**': { mode: 'spa' },
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=route-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-rules.js","sourceRoot":"","sources":["../../src/server/route-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,qEAAqE;AACrE,MAAM,CAAC,MAAM,WAAW,GAAc,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AAErD;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,IAAY;IACxD,cAAc;IACd,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAEjC,gDAAgD;IAChD,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA,CAAC,cAAc;QAClD,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,CAAA;IACzD,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,UAAsB;IAEtB,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACzD,IAAI,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;IAC9C,CAAC;IACD,OAAO,WAAW,CAAA;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAe;IAC3C,4BAA4B;IAC5B,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;IACjC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;IACvC,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;IACxC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE;IAC/C,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;IACnD,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;IACzC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;IACvC,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;IAEzC,mDAAmD;IACnD,eAAe,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;IAChC,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;IAC5B,cAAc,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;IAC/B,gBAAgB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;CAClC,CAAA"}
|
|
@@ -0,0 +1,58 @@
|
|
|
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
|
+
/**
|
|
11
|
+
* Cache-Control header value for hashed static assets.
|
|
12
|
+
* Use on `/assets/*` routes in production.
|
|
13
|
+
*/
|
|
14
|
+
export declare const IMMUTABLE_CACHE_HEADER = "public, max-age=31536000, immutable";
|
|
15
|
+
export interface RobotsConfig {
|
|
16
|
+
/** Base URL of the site, used to build the Sitemap reference */
|
|
17
|
+
siteUrl: string;
|
|
18
|
+
/** Additional paths to disallow beyond the defaults */
|
|
19
|
+
extraDisallow?: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* buildRobotsTxt — generates robots.txt content.
|
|
23
|
+
*
|
|
24
|
+
* Blocks: /dashboard, /admin, /settings, /api
|
|
25
|
+
* Includes a Sitemap reference pointing to <siteUrl>/sitemap.xml
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* app.get('/robots.txt', (c) =>
|
|
29
|
+
* c.text(buildRobotsTxt({ siteUrl: 'https://example.com' }))
|
|
30
|
+
* )
|
|
31
|
+
*/
|
|
32
|
+
export declare function buildRobotsTxt(config: RobotsConfig): string;
|
|
33
|
+
export interface SitemapPage {
|
|
34
|
+
/** Absolute URL of the page */
|
|
35
|
+
loc: string;
|
|
36
|
+
/** ISO 8601 date string, e.g. '2026-04-05' */
|
|
37
|
+
lastmod?: string;
|
|
38
|
+
/** 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never' */
|
|
39
|
+
changefreq?: string;
|
|
40
|
+
/** Priority between 0.0 and 1.0 */
|
|
41
|
+
priority?: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* buildSitemapXml — generates a valid XML sitemap.
|
|
45
|
+
*
|
|
46
|
+
* @param baseUrl — base URL of the site (no trailing slash)
|
|
47
|
+
* @param pages — list of page descriptors; if empty, only the root is included
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* app.get('/sitemap.xml', (c) =>
|
|
51
|
+
* c.text(buildSitemapXml('https://example.com', [
|
|
52
|
+
* { loc: '/about' },
|
|
53
|
+
* { loc: '/blog', changefreq: 'weekly', priority: 0.8 },
|
|
54
|
+
* ]), 200, { 'Content-Type': 'application/xml' })
|
|
55
|
+
* )
|
|
56
|
+
*/
|
|
57
|
+
export declare function buildSitemapXml(baseUrl: string, pages: SitemapPage[]): string;
|
|
58
|
+
//# sourceMappingURL=seo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo.d.ts","sourceRoot":"","sources":["../../src/server/seo.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;GAGG;AACH,eAAO,MAAM,sBAAsB,wCAAwC,CAAA;AAI3E,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAA;IACf,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CACzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAY3D;AAID,MAAM,WAAW,WAAW;IAC1B,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAyB7E"}
|
|
@@ -0,0 +1,85 @@
|
|
|
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
|
+
// ─── Cache header constant ───────────────────────────────────────────
|
|
11
|
+
/**
|
|
12
|
+
* Cache-Control header value for hashed static assets.
|
|
13
|
+
* Use on `/assets/*` routes in production.
|
|
14
|
+
*/
|
|
15
|
+
export const IMMUTABLE_CACHE_HEADER = 'public, max-age=31536000, immutable';
|
|
16
|
+
/**
|
|
17
|
+
* buildRobotsTxt — generates robots.txt content.
|
|
18
|
+
*
|
|
19
|
+
* Blocks: /dashboard, /admin, /settings, /api
|
|
20
|
+
* Includes a Sitemap reference pointing to <siteUrl>/sitemap.xml
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* app.get('/robots.txt', (c) =>
|
|
24
|
+
* c.text(buildRobotsTxt({ siteUrl: 'https://example.com' }))
|
|
25
|
+
* )
|
|
26
|
+
*/
|
|
27
|
+
export function buildRobotsTxt(config) {
|
|
28
|
+
const defaultDisallow = ['/dashboard', '/admin', '/settings', '/api'];
|
|
29
|
+
const allDisallow = [...defaultDisallow, ...(config.extraDisallow ?? [])];
|
|
30
|
+
const lines = [
|
|
31
|
+
'User-agent: *',
|
|
32
|
+
...allDisallow.map((path) => `Disallow: ${path}`),
|
|
33
|
+
'',
|
|
34
|
+
`Sitemap: ${config.siteUrl}/sitemap.xml`,
|
|
35
|
+
];
|
|
36
|
+
return lines.join('\n');
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* buildSitemapXml — generates a valid XML sitemap.
|
|
40
|
+
*
|
|
41
|
+
* @param baseUrl — base URL of the site (no trailing slash)
|
|
42
|
+
* @param pages — list of page descriptors; if empty, only the root is included
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* app.get('/sitemap.xml', (c) =>
|
|
46
|
+
* c.text(buildSitemapXml('https://example.com', [
|
|
47
|
+
* { loc: '/about' },
|
|
48
|
+
* { loc: '/blog', changefreq: 'weekly', priority: 0.8 },
|
|
49
|
+
* ]), 200, { 'Content-Type': 'application/xml' })
|
|
50
|
+
* )
|
|
51
|
+
*/
|
|
52
|
+
export function buildSitemapXml(baseUrl, pages) {
|
|
53
|
+
const base = baseUrl.replace(/\/$/, '');
|
|
54
|
+
// Always include the root
|
|
55
|
+
const allPages = pages.length > 0 ? pages : [{ loc: '/' }];
|
|
56
|
+
const urlEntries = allPages
|
|
57
|
+
.map((page) => {
|
|
58
|
+
const loc = page.loc.startsWith('http') ? page.loc : `${base}${page.loc}`;
|
|
59
|
+
const parts = [` <loc>${escapeXml(loc)}</loc>`];
|
|
60
|
+
if (page.lastmod)
|
|
61
|
+
parts.push(` <lastmod>${page.lastmod}</lastmod>`);
|
|
62
|
+
if (page.changefreq)
|
|
63
|
+
parts.push(` <changefreq>${page.changefreq}</changefreq>`);
|
|
64
|
+
if (page.priority !== undefined)
|
|
65
|
+
parts.push(` <priority>${page.priority.toFixed(1)}</priority>`);
|
|
66
|
+
return ` <url>\n${parts.join('\n')}\n </url>`;
|
|
67
|
+
})
|
|
68
|
+
.join('\n');
|
|
69
|
+
return [
|
|
70
|
+
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
71
|
+
'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',
|
|
72
|
+
urlEntries,
|
|
73
|
+
'</urlset>',
|
|
74
|
+
].join('\n');
|
|
75
|
+
}
|
|
76
|
+
// ─── Helpers ─────────────────────────────────────────────────────────
|
|
77
|
+
function escapeXml(str) {
|
|
78
|
+
return str
|
|
79
|
+
.replace(/&/g, '&')
|
|
80
|
+
.replace(/</g, '<')
|
|
81
|
+
.replace(/>/g, '>')
|
|
82
|
+
.replace(/"/g, '"')
|
|
83
|
+
.replace(/'/g, ''');
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=seo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo.js","sourceRoot":"","sources":["../../src/server/seo.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,wEAAwE;AAExE;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,qCAAqC,CAAA;AAW3E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,MAAM,eAAe,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;IACrE,MAAM,WAAW,GAAG,CAAC,GAAG,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAA;IAEzE,MAAM,KAAK,GAAG;QACZ,eAAe;QACf,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC;QACjD,EAAE;QACF,YAAY,MAAM,CAAC,OAAO,cAAc;KACzC,CAAA;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAeD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,KAAoB;IACnE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAEvC,0BAA0B;IAC1B,MAAM,QAAQ,GAAkB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;IAEzE,MAAM,UAAU,GAAG,QAAQ;SACxB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACzE,MAAM,KAAK,GAAG,CAAC,YAAY,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAElD,IAAI,IAAI,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,YAAY,CAAC,CAAA;QACtE,IAAI,IAAI,CAAC,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,UAAU,eAAe,CAAC,CAAA;QAClF,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAA;QAEnG,OAAO,YAAY,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAA;IACjD,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,OAAO;QACL,wCAAwC;QACxC,8DAA8D;QAC9D,UAAU;QACV,WAAW;KACZ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,wEAAwE;AAExE,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAC5B,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
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 BunnyConfig {
|
|
12
|
+
storageZone: string;
|
|
13
|
+
accessKey: string;
|
|
14
|
+
/** CDN pull zone URL (e.g. https://myzone.b-cdn.net) */
|
|
15
|
+
cdnUrl: string;
|
|
16
|
+
/** Storage region (default: de) */
|
|
17
|
+
region?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Bunny.net CDN storage driver.
|
|
21
|
+
* Uses the Bunny Storage REST API — no SDK, pure fetch.
|
|
22
|
+
*
|
|
23
|
+
* Docs: https://docs.bunny.net/reference/storage-api
|
|
24
|
+
*/
|
|
25
|
+
export declare class BunnyDriver implements StorageDriver {
|
|
26
|
+
private readonly config;
|
|
27
|
+
private readonly storageEndpoint;
|
|
28
|
+
constructor(config: BunnyConfig);
|
|
29
|
+
upload(file: File, options?: UploadOptions): Promise<UploadResult>;
|
|
30
|
+
delete(key: string): Promise<void>;
|
|
31
|
+
url(key: string): string;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=bunny.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bunny.d.ts","sourceRoot":"","sources":["../../../../src/server/storage/drivers/bunny.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE7E,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAA;IACd,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAID;;;;;GAKG;AACH,qBAAa,WAAY,YAAW,aAAa;IAGnC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;gBAEX,MAAM,EAAE,WAAW;IAQ1C,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BlE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxC,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
|
+
// ─── BunnyDriver ─────────────────────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* Bunny.net CDN storage driver.
|
|
15
|
+
* Uses the Bunny Storage REST API — no SDK, pure fetch.
|
|
16
|
+
*
|
|
17
|
+
* Docs: https://docs.bunny.net/reference/storage-api
|
|
18
|
+
*/
|
|
19
|
+
export class BunnyDriver {
|
|
20
|
+
config;
|
|
21
|
+
storageEndpoint;
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.config = config;
|
|
24
|
+
const region = config.region ?? 'de';
|
|
25
|
+
// Main region uses storage.bunnycdn.com; others use <region>.storage.bunnycdn.com
|
|
26
|
+
this.storageEndpoint = region === 'de'
|
|
27
|
+
? 'https://storage.bunnycdn.com'
|
|
28
|
+
: `https://${region}.storage.bunnycdn.com`;
|
|
29
|
+
}
|
|
30
|
+
async upload(file, options) {
|
|
31
|
+
const ext = file.name.split('.').pop() ?? 'bin';
|
|
32
|
+
const key = options?.key ?? `${generateId()}.${ext}`;
|
|
33
|
+
const contentType = options?.contentType ?? file.type;
|
|
34
|
+
const uploadUrl = `${this.storageEndpoint}/${this.config.storageZone}/${key}`;
|
|
35
|
+
const buffer = await file.arrayBuffer();
|
|
36
|
+
const res = await fetch(uploadUrl, {
|
|
37
|
+
method: 'PUT',
|
|
38
|
+
headers: {
|
|
39
|
+
AccessKey: this.config.accessKey,
|
|
40
|
+
'Content-Type': contentType,
|
|
41
|
+
},
|
|
42
|
+
body: buffer,
|
|
43
|
+
});
|
|
44
|
+
if (!res.ok) {
|
|
45
|
+
const body = await res.text();
|
|
46
|
+
Logger.error('[storage:bunny] Upload failed', { status: res.status, body });
|
|
47
|
+
throw new Error(`Bunny.net upload error: ${res.status}`);
|
|
48
|
+
}
|
|
49
|
+
Logger.info('[storage:bunny] File uploaded', { key, size: file.size });
|
|
50
|
+
return { key, url: this.url(key), size: file.size, contentType };
|
|
51
|
+
}
|
|
52
|
+
async delete(key) {
|
|
53
|
+
const deleteUrl = `${this.storageEndpoint}/${this.config.storageZone}/${key}`;
|
|
54
|
+
const res = await fetch(deleteUrl, {
|
|
55
|
+
method: 'DELETE',
|
|
56
|
+
headers: { AccessKey: this.config.accessKey },
|
|
57
|
+
});
|
|
58
|
+
if (!res.ok) {
|
|
59
|
+
Logger.error('[storage:bunny] Delete failed', { key, status: res.status });
|
|
60
|
+
throw new Error(`Bunny.net delete error: ${res.status}`);
|
|
61
|
+
}
|
|
62
|
+
Logger.info('[storage:bunny] File deleted', { key });
|
|
63
|
+
}
|
|
64
|
+
url(key) {
|
|
65
|
+
const base = this.config.cdnUrl.endsWith('/') ? this.config.cdnUrl.slice(0, -1) : this.config.cdnUrl;
|
|
66
|
+
const normalised = key.startsWith('/') ? key.slice(1) : key;
|
|
67
|
+
return `${base}/${normalised}`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=bunny.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bunny.js","sourceRoot":"","sources":["../../../../src/server/storage/drivers/bunny.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAA;AAYxD,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IAGO;IAFZ,eAAe,CAAQ;IAExC,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;QAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI,CAAA;QACpC,kFAAkF;QAClF,IAAI,CAAC,eAAe,GAAG,MAAM,KAAK,IAAI;YACpC,CAAC,CAAC,8BAA8B;YAChC,CAAC,CAAC,WAAW,MAAM,uBAAuB,CAAA;IAC9C,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,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,IAAI,CAAA;QAErD,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,GAAG,EAAE,CAAA;QAC7E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;QAEvC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YACjC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;gBAChC,cAAc,EAAE,WAAW;aAC5B;YACD,IAAI,EAAE,MAAM;SACb,CAAC,CAAA;QAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;YAC7B,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;YAC3E,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;QAC1D,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QAEtE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,CAAA;IAClE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,GAAG,EAAE,CAAA;QAE7E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YACjC,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;SAC9C,CAAC,CAAA;QAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;YAC1E,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;QAC1D,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;IACtD,CAAC;IAED,GAAG,CAAC,GAAW;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QACpG,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,IAAI,UAAU,EAAE,CAAA;IAChC,CAAC;CACF"}
|