@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,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
|
+
import type { ZodSchema } from 'zod';
|
|
11
|
+
export interface DefineEnvOptions<T> {
|
|
12
|
+
/**
|
|
13
|
+
* Optional cross-field validation function.
|
|
14
|
+
* Return true to pass, or a string error message to fail.
|
|
15
|
+
*/
|
|
16
|
+
refine?: (env: T) => boolean | string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* defineEnv — wraps Zod validation for environment variables.
|
|
20
|
+
*
|
|
21
|
+
* Validates `process.env` against the provided schema at call time.
|
|
22
|
+
* On failure: prints a formatted error listing each failing variable
|
|
23
|
+
* with its Zod message, then calls `process.exit(1)`.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* // src/env.ts
|
|
28
|
+
* import { defineEnv } from 'vono/server'
|
|
29
|
+
* import { z } from 'zod'
|
|
30
|
+
*
|
|
31
|
+
* export const env = defineEnv(
|
|
32
|
+
* z.object({
|
|
33
|
+
* DATABASE_URL: z.string().url(),
|
|
34
|
+
* JWT_SECRET: z.string().min(32),
|
|
35
|
+
* PORT: z.coerce.number().default(4000),
|
|
36
|
+
* }),
|
|
37
|
+
* {
|
|
38
|
+
* refine: (e) =>
|
|
39
|
+
* e.JWT_SECRET !== 'change-me' || 'JWT_SECRET must not be the default value',
|
|
40
|
+
* },
|
|
41
|
+
* )
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function defineEnv<T>(schema: ZodSchema<T>, options?: DefineEnvOptions<T>): T;
|
|
45
|
+
//# sourceMappingURL=define-env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-env.d.ts","sourceRoot":"","sources":["../../../src/server/env-validation/define-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AAKpC,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,MAAM,CAAA;CACtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC5B,CAAC,CAGH"}
|
|
@@ -0,0 +1,41 @@
|
|
|
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 { validateEnvAtStartup } from './validate-at-startup.js';
|
|
11
|
+
/**
|
|
12
|
+
* defineEnv — wraps Zod validation for environment variables.
|
|
13
|
+
*
|
|
14
|
+
* Validates `process.env` against the provided schema at call time.
|
|
15
|
+
* On failure: prints a formatted error listing each failing variable
|
|
16
|
+
* with its Zod message, then calls `process.exit(1)`.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* // src/env.ts
|
|
21
|
+
* import { defineEnv } from 'vono/server'
|
|
22
|
+
* import { z } from 'zod'
|
|
23
|
+
*
|
|
24
|
+
* export const env = defineEnv(
|
|
25
|
+
* z.object({
|
|
26
|
+
* DATABASE_URL: z.string().url(),
|
|
27
|
+
* JWT_SECRET: z.string().min(32),
|
|
28
|
+
* PORT: z.coerce.number().default(4000),
|
|
29
|
+
* }),
|
|
30
|
+
* {
|
|
31
|
+
* refine: (e) =>
|
|
32
|
+
* e.JWT_SECRET !== 'change-me' || 'JWT_SECRET must not be the default value',
|
|
33
|
+
* },
|
|
34
|
+
* )
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export function defineEnv(schema, options) {
|
|
38
|
+
const rawEnv = typeof process !== 'undefined' ? process.env : {};
|
|
39
|
+
return validateEnvAtStartup(schema, rawEnv, options?.refine);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=define-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-env.js","sourceRoot":"","sources":["../../../src/server/env-validation/define-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAY/D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,SAAS,CACvB,MAAoB,EACpB,OAA6B;IAE7B,MAAM,MAAM,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAChE,OAAO,oBAAoB,CAAC,MAAM,EAAE,MAAgC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;AACxF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
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 { defineEnv } from './define-env.js';
|
|
11
|
+
export { validateEnvAtStartup } from './validate-at-startup.js';
|
|
12
|
+
export type { DefineEnvOptions } from './define-env.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/env-validation/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAC/D,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
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 { defineEnv } from './define-env.js';
|
|
11
|
+
export { validateEnvAtStartup } from './validate-at-startup.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/env-validation/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA"}
|
|
@@ -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 { ZodSchema } from 'zod';
|
|
11
|
+
/**
|
|
12
|
+
* validateEnvAtStartup — validates env vars before accepting requests.
|
|
13
|
+
*
|
|
14
|
+
* On failure: prints a formatted error message and calls process.exit(1).
|
|
15
|
+
* On success: returns the typed, validated config object.
|
|
16
|
+
*
|
|
17
|
+
* Error format:
|
|
18
|
+
* ```
|
|
19
|
+
* [vono] Missing/invalid env vars:
|
|
20
|
+
* ❌ DATABASE_URL: Invalid url
|
|
21
|
+
* ❌ JWT_SECRET: String must contain at least 32 character(s)
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @param schema — Zod schema to validate against
|
|
25
|
+
* @param env — raw environment variables map
|
|
26
|
+
* @param refine — optional cross-field validation function
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateEnvAtStartup<T>(schema: ZodSchema<T>, env: Record<string, string | undefined>, refine?: (env: T) => boolean | string): T;
|
|
29
|
+
//# sourceMappingURL=validate-at-startup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-at-startup.d.ts","sourceRoot":"","sources":["../../../src/server/env-validation/validate-at-startup.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,KAAK,CAAA;AAI9C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,MAAM,GACpC,CAAC,CA2BH"}
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
// ─── validateEnvAtStartup ────────────────────────────────────────────
|
|
11
|
+
/**
|
|
12
|
+
* validateEnvAtStartup — validates env vars before accepting requests.
|
|
13
|
+
*
|
|
14
|
+
* On failure: prints a formatted error message and calls process.exit(1).
|
|
15
|
+
* On success: returns the typed, validated config object.
|
|
16
|
+
*
|
|
17
|
+
* Error format:
|
|
18
|
+
* ```
|
|
19
|
+
* [vono] Missing/invalid env vars:
|
|
20
|
+
* ❌ DATABASE_URL: Invalid url
|
|
21
|
+
* ❌ JWT_SECRET: String must contain at least 32 character(s)
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @param schema — Zod schema to validate against
|
|
25
|
+
* @param env — raw environment variables map
|
|
26
|
+
* @param refine — optional cross-field validation function
|
|
27
|
+
*/
|
|
28
|
+
export function validateEnvAtStartup(schema, env, refine) {
|
|
29
|
+
const result = schema.safeParse(env);
|
|
30
|
+
if (!result.success) {
|
|
31
|
+
const errors = formatZodErrors(result.error);
|
|
32
|
+
const message = `[vono] Missing/invalid env vars:\n${errors}`;
|
|
33
|
+
process.stderr.write(message + '\n');
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
// Cross-field validation
|
|
37
|
+
if (refine) {
|
|
38
|
+
const refineResult = refine(result.data);
|
|
39
|
+
if (refineResult !== true) {
|
|
40
|
+
const message = typeof refineResult === 'string'
|
|
41
|
+
? `[vono] Env validation failed:\n ❌ ${refineResult}`
|
|
42
|
+
: `[vono] Env validation failed: refine() returned false`;
|
|
43
|
+
process.stderr.write(message + '\n');
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return result.data;
|
|
48
|
+
}
|
|
49
|
+
// ─── Helpers ─────────────────────────────────────────────────────────
|
|
50
|
+
/**
|
|
51
|
+
* Format Zod errors into the standard Vono error format.
|
|
52
|
+
*/
|
|
53
|
+
function formatZodErrors(error) {
|
|
54
|
+
const lines = [];
|
|
55
|
+
for (const issue of error.issues) {
|
|
56
|
+
const key = issue.path.join('.') || '_root';
|
|
57
|
+
lines.push(` ❌ ${key}: ${issue.message}`);
|
|
58
|
+
}
|
|
59
|
+
return lines.join('\n');
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=validate-at-startup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-at-startup.js","sourceRoot":"","sources":["../../../src/server/env-validation/validate-at-startup.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,wEAAwE;AAExE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAoB,EACpB,GAAuC,EACvC,MAAqC;IAErC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAEpC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC5C,MAAM,OAAO,GAAG,qCAAqC,MAAM,EAAE,CAAA;QAE7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;QACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,yBAAyB;IACzB,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAExC,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,OAAO,GACX,OAAO,YAAY,KAAK,QAAQ;gBAC9B,CAAC,CAAC,sCAAsC,YAAY,EAAE;gBACtD,CAAC,CAAC,uDAAuD,CAAA;YAE7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAA;AACpB,CAAC;AAED,wEAAwE;AAExE;;GAEG;AACH,SAAS,eAAe,CAAC,KAAe;IACtC,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAA;QAC3C,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;IAC5C,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
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 { ref, computed } from 'vue';
|
|
11
|
+
export interface UseI18nReturn {
|
|
12
|
+
/** Translate a key with optional interpolation params */
|
|
13
|
+
t: (key: string, params?: Record<string, string>) => string;
|
|
14
|
+
/** Reactive current locale */
|
|
15
|
+
locale: ReturnType<typeof ref<string>>;
|
|
16
|
+
/** Set the active locale */
|
|
17
|
+
setLocale: (newLocale: string) => void;
|
|
18
|
+
/** All available locale codes */
|
|
19
|
+
availableLocales: ReturnType<typeof computed<string[]>>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Client-side i18n composable.
|
|
23
|
+
*
|
|
24
|
+
* Usage:
|
|
25
|
+
* ```vue
|
|
26
|
+
* <script setup>
|
|
27
|
+
* const { t, locale, setLocale } = useI18n()
|
|
28
|
+
* </script>
|
|
29
|
+
* <template>
|
|
30
|
+
* <p>{{ t('greeting', { name: 'Alice' }) }}</p>
|
|
31
|
+
* </template>
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function useI18n(): UseI18nReturn;
|
|
35
|
+
/**
|
|
36
|
+
* Seed initial translations (called during SSR hydration).
|
|
37
|
+
*/
|
|
38
|
+
export declare function seedTranslations(locale: string, dict: Record<string, string>, available?: string[]): void;
|
|
39
|
+
//# sourceMappingURL=useI18n.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useI18n.d.ts","sourceRoot":"","sources":["../../../../src/server/i18n/composables/useI18n.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAA;AAInC,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAA;IAC3D,8BAA8B;IAC9B,MAAM,EAAE,UAAU,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;IACtC,4BAA4B;IAC5B,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,iCAAiC;IACjC,gBAAgB,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;CACxD;AAeD;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,IAAI,aAAa,CAsDvC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,SAAS,GAAE,MAAM,EAAO,GACvB,IAAI,CAQN"}
|
|
@@ -0,0 +1,93 @@
|
|
|
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 { ref, computed } from 'vue';
|
|
11
|
+
// ─── Shared reactive state ───────────────────────────────────────────
|
|
12
|
+
const currentLocale = ref(typeof window !== 'undefined'
|
|
13
|
+
? (document.documentElement.lang || 'en')
|
|
14
|
+
: 'en');
|
|
15
|
+
const translations = ref({});
|
|
16
|
+
const _availableLocales = ref([]);
|
|
17
|
+
// ─── useI18n ─────────────────────────────────────────────────────────
|
|
18
|
+
/**
|
|
19
|
+
* Client-side i18n composable.
|
|
20
|
+
*
|
|
21
|
+
* Usage:
|
|
22
|
+
* ```vue
|
|
23
|
+
* <script setup>
|
|
24
|
+
* const { t, locale, setLocale } = useI18n()
|
|
25
|
+
* </script>
|
|
26
|
+
* <template>
|
|
27
|
+
* <p>{{ t('greeting', { name: 'Alice' }) }}</p>
|
|
28
|
+
* </template>
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export function useI18n() {
|
|
32
|
+
/**
|
|
33
|
+
* Translate a key for the current locale.
|
|
34
|
+
* Falls back to the key itself if not found.
|
|
35
|
+
*/
|
|
36
|
+
function t(key, params) {
|
|
37
|
+
const dict = translations.value[currentLocale.value] ?? {};
|
|
38
|
+
let value = dict[key] ?? key;
|
|
39
|
+
if (params) {
|
|
40
|
+
for (const [k, v] of Object.entries(params)) {
|
|
41
|
+
value = value.replaceAll(`{{${k}}}`, v);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Switch the active locale and optionally load its translations.
|
|
48
|
+
*/
|
|
49
|
+
async function setLocale(newLocale) {
|
|
50
|
+
currentLocale.value = newLocale;
|
|
51
|
+
// Update <html lang="..."> for accessibility
|
|
52
|
+
if (typeof document !== 'undefined') {
|
|
53
|
+
document.documentElement.lang = newLocale;
|
|
54
|
+
}
|
|
55
|
+
// Lazy-load translations if not already cached
|
|
56
|
+
if (!translations.value[newLocale]) {
|
|
57
|
+
try {
|
|
58
|
+
const mod = await import(/* @vite-ignore */ `/locales/${newLocale}.json`);
|
|
59
|
+
translations.value = {
|
|
60
|
+
...translations.value,
|
|
61
|
+
[newLocale]: mod.default ?? mod,
|
|
62
|
+
};
|
|
63
|
+
if (!_availableLocales.value.includes(newLocale)) {
|
|
64
|
+
_availableLocales.value = [..._availableLocales.value, newLocale];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Translation file not found — silently continue
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const availableLocales = computed(() => _availableLocales.value);
|
|
73
|
+
return {
|
|
74
|
+
t,
|
|
75
|
+
locale: currentLocale,
|
|
76
|
+
setLocale,
|
|
77
|
+
availableLocales,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Seed initial translations (called during SSR hydration).
|
|
82
|
+
*/
|
|
83
|
+
export function seedTranslations(locale, dict, available = []) {
|
|
84
|
+
currentLocale.value = locale;
|
|
85
|
+
translations.value = { ...translations.value, [locale]: dict };
|
|
86
|
+
if (available.length) {
|
|
87
|
+
_availableLocales.value = available;
|
|
88
|
+
}
|
|
89
|
+
else if (!_availableLocales.value.includes(locale)) {
|
|
90
|
+
_availableLocales.value = [..._availableLocales.value, locale];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=useI18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useI18n.js","sourceRoot":"","sources":["../../../../src/server/i18n/composables/useI18n.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
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 { Context } from 'hono';
|
|
11
|
+
/**
|
|
12
|
+
* detectLocale — resolves the current locale from the request.
|
|
13
|
+
*
|
|
14
|
+
* Strategies:
|
|
15
|
+
* 'prefix' — reads the first path segment, e.g. /en/about → 'en'
|
|
16
|
+
* 'cookie' — reads the `locale` cookie
|
|
17
|
+
* 'header' — parses the Accept-Language header (first tag only)
|
|
18
|
+
*
|
|
19
|
+
* Falls back to `defaultLocale` when nothing is found.
|
|
20
|
+
*/
|
|
21
|
+
export declare function detectLocale(c: Context, strategy: 'prefix' | 'cookie' | 'header', defaultLocale: string): string;
|
|
22
|
+
//# sourceMappingURL=detect-locale.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-locale.d.ts","sourceRoot":"","sources":["../../../src/server/i18n/detect-locale.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,CAAC,EAAE,OAAO,EACV,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EACxC,aAAa,EAAE,MAAM,GACpB,MAAM,CAwBR"}
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
* detectLocale — resolves the current locale from the request.
|
|
12
|
+
*
|
|
13
|
+
* Strategies:
|
|
14
|
+
* 'prefix' — reads the first path segment, e.g. /en/about → 'en'
|
|
15
|
+
* 'cookie' — reads the `locale` cookie
|
|
16
|
+
* 'header' — parses the Accept-Language header (first tag only)
|
|
17
|
+
*
|
|
18
|
+
* Falls back to `defaultLocale` when nothing is found.
|
|
19
|
+
*/
|
|
20
|
+
export function detectLocale(c, strategy, defaultLocale) {
|
|
21
|
+
switch (strategy) {
|
|
22
|
+
case 'prefix': {
|
|
23
|
+
const path = new URL(c.req.url).pathname;
|
|
24
|
+
const segment = path.split('/').filter(Boolean)[0];
|
|
25
|
+
return segment ?? defaultLocale;
|
|
26
|
+
}
|
|
27
|
+
case 'cookie': {
|
|
28
|
+
const cookie = c.req.header('cookie') ?? '';
|
|
29
|
+
const match = cookie.match(/(?:^|;\s*)locale=([^;]+)/);
|
|
30
|
+
return match?.[1] ?? defaultLocale;
|
|
31
|
+
}
|
|
32
|
+
case 'header': {
|
|
33
|
+
const acceptLanguage = c.req.header('accept-language') ?? '';
|
|
34
|
+
// e.g. "en-US,en;q=0.9,fr;q=0.8" → "en"
|
|
35
|
+
const first = acceptLanguage.split(',')[0]?.split(';')[0]?.split('-')[0]?.trim();
|
|
36
|
+
return first || defaultLocale;
|
|
37
|
+
}
|
|
38
|
+
default:
|
|
39
|
+
return defaultLocale;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=detect-locale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-locale.js","sourceRoot":"","sources":["../../../src/server/i18n/detect-locale.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAC1B,CAAU,EACV,QAAwC,EACxC,aAAqB;IAErB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAA;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;YAClD,OAAO,OAAO,IAAI,aAAa,CAAA;QACjC,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;YAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;YACtD,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,aAAa,CAAA;QACpC,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,cAAc,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAA;YAC5D,wCAAwC;YACxC,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;YAChF,OAAO,KAAK,IAAI,aAAa,CAAA;QAC/B,CAAC;QAED;YACE,OAAO,aAAa,CAAA;IACxB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
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 { detectLocale } from './detect-locale.js';
|
|
11
|
+
export { loadTranslations, t, getLocale, setLocale } from './translate.js';
|
|
12
|
+
export { useI18n, seedTranslations } from './composables/useI18n.js';
|
|
13
|
+
export type { UseI18nReturn } from './composables/useI18n.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/i18n/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1E,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AACpE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
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 { detectLocale } from './detect-locale.js';
|
|
11
|
+
export { loadTranslations, t, getLocale, setLocale } from './translate.js';
|
|
12
|
+
export { useI18n, seedTranslations } from './composables/useI18n.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/i18n/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1E,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
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 { Context } from 'hono';
|
|
11
|
+
/**
|
|
12
|
+
* Lazy-loads `src/locales/<locale>.json` from disk.
|
|
13
|
+
* Results are cached in memory after the first load.
|
|
14
|
+
*
|
|
15
|
+
* @param locale — locale code, e.g. 'en', 'fr'
|
|
16
|
+
* @param localesDir — absolute path to the locales directory
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadTranslations(locale: string, localesDir: string): Record<string, string>;
|
|
19
|
+
/**
|
|
20
|
+
* Translate a key for the given locale.
|
|
21
|
+
* Supports `{{param}}` interpolation.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* t('en', 'greeting', { name: 'Alice' })
|
|
25
|
+
* // "Hello, Alice!" (if en.json has { "greeting": "Hello, {{name}}!" })
|
|
26
|
+
*/
|
|
27
|
+
export declare function t(locale: string, key: string, params?: Record<string, string>): string;
|
|
28
|
+
/**
|
|
29
|
+
* Gets the current locale stored on the Hono context.
|
|
30
|
+
* Set by `detectLocale` + `c.set(LOCALE_KEY, locale)` in middleware.
|
|
31
|
+
*/
|
|
32
|
+
export declare function getLocale(c: Context): string;
|
|
33
|
+
/**
|
|
34
|
+
* Sets the current locale on the Hono context.
|
|
35
|
+
* Call this in your i18n middleware after detecting the locale.
|
|
36
|
+
*/
|
|
37
|
+
export declare function setLocale(c: Context, locale: string): void;
|
|
38
|
+
//# sourceMappingURL=translate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translate.d.ts","sourceRoot":"","sources":["../../../src/server/i18n/translate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAanC;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyBxB;AAID;;;;;;;GAOG;AACH,wBAAgB,CAAC,CACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,CAWR;AAID;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAE5C;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAE1D"}
|
|
@@ -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
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { Logger } from '../../shared/utils/logger.js';
|
|
13
|
+
// ─── In-memory translation cache ────────────────────────────────────
|
|
14
|
+
const translationCache = new Map();
|
|
15
|
+
// ─── Locale context key ──────────────────────────────────────────────
|
|
16
|
+
const LOCALE_KEY = '__vono_locale__';
|
|
17
|
+
// ─── loadTranslations ────────────────────────────────────────────────
|
|
18
|
+
/**
|
|
19
|
+
* Lazy-loads `src/locales/<locale>.json` from disk.
|
|
20
|
+
* Results are cached in memory after the first load.
|
|
21
|
+
*
|
|
22
|
+
* @param locale — locale code, e.g. 'en', 'fr'
|
|
23
|
+
* @param localesDir — absolute path to the locales directory
|
|
24
|
+
*/
|
|
25
|
+
export function loadTranslations(locale, localesDir) {
|
|
26
|
+
if (translationCache.has(locale)) {
|
|
27
|
+
return translationCache.get(locale);
|
|
28
|
+
}
|
|
29
|
+
const filePath = join(localesDir, `${locale}.json`);
|
|
30
|
+
if (!existsSync(filePath)) {
|
|
31
|
+
Logger.warn(`[i18n] Translation file not found: ${filePath}`);
|
|
32
|
+
translationCache.set(locale, {});
|
|
33
|
+
return {};
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const raw = readFileSync(filePath, 'utf8');
|
|
37
|
+
const translations = JSON.parse(raw);
|
|
38
|
+
translationCache.set(locale, translations);
|
|
39
|
+
return translations;
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
Logger.error(`[i18n] Failed to parse translation file: ${filePath}`, {
|
|
43
|
+
error: String(err),
|
|
44
|
+
});
|
|
45
|
+
translationCache.set(locale, {});
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// ─── t ───────────────────────────────────────────────────────────────
|
|
50
|
+
/**
|
|
51
|
+
* Translate a key for the given locale.
|
|
52
|
+
* Supports `{{param}}` interpolation.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* t('en', 'greeting', { name: 'Alice' })
|
|
56
|
+
* // "Hello, Alice!" (if en.json has { "greeting": "Hello, {{name}}!" })
|
|
57
|
+
*/
|
|
58
|
+
export function t(locale, key, params) {
|
|
59
|
+
const translations = translationCache.get(locale) ?? {};
|
|
60
|
+
let value = translations[key] ?? key;
|
|
61
|
+
if (params) {
|
|
62
|
+
for (const [k, v] of Object.entries(params)) {
|
|
63
|
+
value = value.replaceAll(`{{${k}}}`, v);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return value;
|
|
67
|
+
}
|
|
68
|
+
// ─── getLocale ───────────────────────────────────────────────────────
|
|
69
|
+
/**
|
|
70
|
+
* Gets the current locale stored on the Hono context.
|
|
71
|
+
* Set by `detectLocale` + `c.set(LOCALE_KEY, locale)` in middleware.
|
|
72
|
+
*/
|
|
73
|
+
export function getLocale(c) {
|
|
74
|
+
return c.get(LOCALE_KEY) ?? 'en';
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Sets the current locale on the Hono context.
|
|
78
|
+
* Call this in your i18n middleware after detecting the locale.
|
|
79
|
+
*/
|
|
80
|
+
export function setLocale(c, locale) {
|
|
81
|
+
c.set(LOCALE_KEY, locale);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=translate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translate.js","sourceRoot":"","sources":["../../../src/server/i18n/translate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AAErD,uEAAuE;AAEvE,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAkC,CAAA;AAElE,wEAAwE;AAExE,MAAM,UAAU,GAAG,iBAAiB,CAAA;AAEpC,wEAAwE;AAExE;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,UAAkB;IAElB,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAE,CAAA;IACtC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,OAAO,CAAC,CAAA;IAEnD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAA;QAC7D,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAChC,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2B,CAAA;QAC9D,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;QAC1C,OAAO,YAAY,CAAA;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,4CAA4C,QAAQ,EAAE,EAAE;YACnE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;SACnB,CAAC,CAAA;QACF,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAChC,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,wEAAwE;AAExE;;;;;;;GAOG;AACH,MAAM,UAAU,CAAC,CACf,MAAc,EACd,GAAW,EACX,MAA+B;IAE/B,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;IACvD,IAAI,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,CAAA;IAEpC,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,wEAAwE;AAExE;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,CAAU;IAClC,OAAQ,CAAC,CAAC,GAAG,CAAC,UAAoB,CAAwB,IAAI,IAAI,CAAA;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,CAAU,EAAE,MAAc;IAClD,CAAC,CAAC,GAAG,CAAC,UAAoB,EAAE,MAAM,CAAC,CAAA;AACrC,CAAC"}
|