@portaidentity/server 1.7.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/CHANGELOG.md +11 -0
- package/LICENSE +21 -0
- package/README.md +33 -0
- package/dist/applications/cache.d.ts +64 -0
- package/dist/applications/cache.d.ts.map +1 -0
- package/dist/applications/cache.js +161 -0
- package/dist/applications/cache.js.map +1 -0
- package/dist/applications/errors.d.ts +25 -0
- package/dist/applications/errors.d.ts.map +1 -0
- package/dist/applications/errors.js +31 -0
- package/dist/applications/errors.js.map +1 -0
- package/dist/applications/index.d.ts +17 -0
- package/dist/applications/index.d.ts.map +1 -0
- package/dist/applications/index.js +19 -0
- package/dist/applications/index.js.map +1 -0
- package/dist/applications/repository.d.ts +184 -0
- package/dist/applications/repository.d.ts.map +1 -0
- package/dist/applications/repository.js +367 -0
- package/dist/applications/repository.js.map +1 -0
- package/dist/applications/service.d.ts +160 -0
- package/dist/applications/service.d.ts.map +1 -0
- package/dist/applications/service.js +388 -0
- package/dist/applications/service.js.map +1 -0
- package/dist/applications/slugs.d.ts +61 -0
- package/dist/applications/slugs.d.ts.map +1 -0
- package/dist/applications/slugs.js +115 -0
- package/dist/applications/slugs.js.map +1 -0
- package/dist/applications/types.d.ts +129 -0
- package/dist/applications/types.d.ts.map +1 -0
- package/dist/applications/types.js +62 -0
- package/dist/applications/types.js.map +1 -0
- package/dist/auth/csrf.d.ts +71 -0
- package/dist/auth/csrf.d.ts.map +1 -0
- package/dist/auth/csrf.js +112 -0
- package/dist/auth/csrf.js.map +1 -0
- package/dist/auth/email-renderer.d.ts +37 -0
- package/dist/auth/email-renderer.d.ts.map +1 -0
- package/dist/auth/email-renderer.js +116 -0
- package/dist/auth/email-renderer.js.map +1 -0
- package/dist/auth/email-service.d.ts +154 -0
- package/dist/auth/email-service.d.ts.map +1 -0
- package/dist/auth/email-service.js +415 -0
- package/dist/auth/email-service.js.map +1 -0
- package/dist/auth/email-transport.d.ts +65 -0
- package/dist/auth/email-transport.d.ts.map +1 -0
- package/dist/auth/email-transport.js +82 -0
- package/dist/auth/email-transport.js.map +1 -0
- package/dist/auth/i18n.d.ts +81 -0
- package/dist/auth/i18n.d.ts.map +1 -0
- package/dist/auth/i18n.js +395 -0
- package/dist/auth/i18n.js.map +1 -0
- package/dist/auth/index.d.ts +28 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +31 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/interaction-authority.d.ts +39 -0
- package/dist/auth/interaction-authority.d.ts.map +1 -0
- package/dist/auth/interaction-authority.js +30 -0
- package/dist/auth/interaction-authority.js.map +1 -0
- package/dist/auth/magic-link-session.d.ts +81 -0
- package/dist/auth/magic-link-session.d.ts.map +1 -0
- package/dist/auth/magic-link-session.js +183 -0
- package/dist/auth/magic-link-session.js.map +1 -0
- package/dist/auth/rate-limiter.d.ts +143 -0
- package/dist/auth/rate-limiter.d.ts.map +1 -0
- package/dist/auth/rate-limiter.js +220 -0
- package/dist/auth/rate-limiter.js.map +1 -0
- package/dist/auth/recovery-crypto.d.ts +34 -0
- package/dist/auth/recovery-crypto.d.ts.map +1 -0
- package/dist/auth/recovery-crypto.js +103 -0
- package/dist/auth/recovery-crypto.js.map +1 -0
- package/dist/auth/recovery-job-processor.d.ts +24 -0
- package/dist/auth/recovery-job-processor.d.ts.map +1 -0
- package/dist/auth/recovery-job-processor.js +123 -0
- package/dist/auth/recovery-job-processor.js.map +1 -0
- package/dist/auth/recovery-job-repository.d.ts +219 -0
- package/dist/auth/recovery-job-repository.d.ts.map +1 -0
- package/dist/auth/recovery-job-repository.js +340 -0
- package/dist/auth/recovery-job-repository.js.map +1 -0
- package/dist/auth/recovery-service.d.ts +27 -0
- package/dist/auth/recovery-service.d.ts.map +1 -0
- package/dist/auth/recovery-service.js +53 -0
- package/dist/auth/recovery-service.js.map +1 -0
- package/dist/auth/recovery-worker.d.ts +158 -0
- package/dist/auth/recovery-worker.d.ts.map +1 -0
- package/dist/auth/recovery-worker.js +306 -0
- package/dist/auth/recovery-worker.js.map +1 -0
- package/dist/auth/template-engine.d.ts +134 -0
- package/dist/auth/template-engine.d.ts.map +1 -0
- package/dist/auth/template-engine.js +225 -0
- package/dist/auth/template-engine.js.map +1 -0
- package/dist/auth/token-repository.d.ts +238 -0
- package/dist/auth/token-repository.d.ts.map +1 -0
- package/dist/auth/token-repository.js +475 -0
- package/dist/auth/token-repository.js.map +1 -0
- package/dist/auth/tokens.d.ts +45 -0
- package/dist/auth/tokens.d.ts.map +1 -0
- package/dist/auth/tokens.js +51 -0
- package/dist/auth/tokens.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +55 -0
- package/dist/cli/bootstrap.d.ts.map +1 -0
- package/dist/cli/bootstrap.js +90 -0
- package/dist/cli/bootstrap.js.map +1 -0
- package/dist/cli/commands/health.d.ts +20 -0
- package/dist/cli/commands/health.d.ts.map +1 -0
- package/dist/cli/commands/health.js +80 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/init.d.ts +48 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +349 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +19 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +88 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/seed.d.ts +19 -0
- package/dist/cli/commands/seed.d.ts.map +1 -0
- package/dist/cli/commands/seed.js +71 -0
- package/dist/cli/commands/seed.js.map +1 -0
- package/dist/cli/commands/user-2fa.d.ts +29 -0
- package/dist/cli/commands/user-2fa.d.ts.map +1 -0
- package/dist/cli/commands/user-2fa.js +113 -0
- package/dist/cli/commands/user-2fa.js.map +1 -0
- package/dist/cli/error-handler.d.ts +31 -0
- package/dist/cli/error-handler.d.ts.map +1 -0
- package/dist/cli/error-handler.js +65 -0
- package/dist/cli/error-handler.js.map +1 -0
- package/dist/cli/index.d.ts +48 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +99 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +94 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +124 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/prompt.d.ts +48 -0
- package/dist/cli/prompt.d.ts.map +1 -0
- package/dist/cli/prompt.js +96 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/clients/cache.d.ts +63 -0
- package/dist/clients/cache.d.ts.map +1 -0
- package/dist/clients/cache.js +160 -0
- package/dist/clients/cache.js.map +1 -0
- package/dist/clients/crypto.d.ts +69 -0
- package/dist/clients/crypto.d.ts.map +1 -0
- package/dist/clients/crypto.js +83 -0
- package/dist/clients/crypto.js.map +1 -0
- package/dist/clients/errors.d.ts +27 -0
- package/dist/clients/errors.d.ts.map +1 -0
- package/dist/clients/errors.js +33 -0
- package/dist/clients/errors.js.map +1 -0
- package/dist/clients/index.d.ts +19 -0
- package/dist/clients/index.d.ts.map +1 -0
- package/dist/clients/index.js +23 -0
- package/dist/clients/index.js.map +1 -0
- package/dist/clients/repository.d.ts +161 -0
- package/dist/clients/repository.d.ts.map +1 -0
- package/dist/clients/repository.js +318 -0
- package/dist/clients/repository.js.map +1 -0
- package/dist/clients/resolve-login-methods.d.ts +74 -0
- package/dist/clients/resolve-login-methods.d.ts.map +1 -0
- package/dist/clients/resolve-login-methods.js +68 -0
- package/dist/clients/resolve-login-methods.js.map +1 -0
- package/dist/clients/secret-repository.d.ts +109 -0
- package/dist/clients/secret-repository.d.ts.map +1 -0
- package/dist/clients/secret-repository.js +166 -0
- package/dist/clients/secret-repository.js.map +1 -0
- package/dist/clients/secret-service.d.ts +87 -0
- package/dist/clients/secret-service.d.ts.map +1 -0
- package/dist/clients/secret-service.js +204 -0
- package/dist/clients/secret-service.js.map +1 -0
- package/dist/clients/service.d.ts +158 -0
- package/dist/clients/service.d.ts.map +1 -0
- package/dist/clients/service.js +523 -0
- package/dist/clients/service.js.map +1 -0
- package/dist/clients/types.d.ts +214 -0
- package/dist/clients/types.d.ts.map +1 -0
- package/dist/clients/types.js +77 -0
- package/dist/clients/types.js.map +1 -0
- package/dist/clients/validators.d.ts +87 -0
- package/dist/clients/validators.d.ts.map +1 -0
- package/dist/clients/validators.js +164 -0
- package/dist/clients/validators.js.map +1 -0
- package/dist/config/index.d.ts +23 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +52 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +35 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +167 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/custom-claims/cache.d.ts +48 -0
- package/dist/custom-claims/cache.d.ts.map +1 -0
- package/dist/custom-claims/cache.js +122 -0
- package/dist/custom-claims/cache.js.map +1 -0
- package/dist/custom-claims/errors.d.ts +25 -0
- package/dist/custom-claims/errors.d.ts.map +1 -0
- package/dist/custom-claims/errors.js +31 -0
- package/dist/custom-claims/errors.js.map +1 -0
- package/dist/custom-claims/index.d.ts +14 -0
- package/dist/custom-claims/index.d.ts.map +1 -0
- package/dist/custom-claims/index.js +17 -0
- package/dist/custom-claims/index.js.map +1 -0
- package/dist/custom-claims/repository.d.ts +147 -0
- package/dist/custom-claims/repository.d.ts.map +1 -0
- package/dist/custom-claims/repository.js +338 -0
- package/dist/custom-claims/repository.js.map +1 -0
- package/dist/custom-claims/service.d.ts +129 -0
- package/dist/custom-claims/service.d.ts.map +1 -0
- package/dist/custom-claims/service.js +296 -0
- package/dist/custom-claims/service.js.map +1 -0
- package/dist/custom-claims/types.d.ts +132 -0
- package/dist/custom-claims/types.d.ts.map +1 -0
- package/dist/custom-claims/types.js +61 -0
- package/dist/custom-claims/types.js.map +1 -0
- package/dist/custom-claims/validators.d.ts +61 -0
- package/dist/custom-claims/validators.d.ts.map +1 -0
- package/dist/custom-claims/validators.js +136 -0
- package/dist/custom-claims/validators.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/admin-permissions.d.ts +147 -0
- package/dist/lib/admin-permissions.d.ts.map +1 -0
- package/dist/lib/admin-permissions.js +261 -0
- package/dist/lib/admin-permissions.js.map +1 -0
- package/dist/lib/audit-log.d.ts +45 -0
- package/dist/lib/audit-log.d.ts.map +1 -0
- package/dist/lib/audit-log.js +79 -0
- package/dist/lib/audit-log.js.map +1 -0
- package/dist/lib/branding-assets.d.ts +47 -0
- package/dist/lib/branding-assets.d.ts.map +1 -0
- package/dist/lib/branding-assets.js +93 -0
- package/dist/lib/branding-assets.js.map +1 -0
- package/dist/lib/bulk-operations.d.ts +54 -0
- package/dist/lib/bulk-operations.d.ts.map +1 -0
- package/dist/lib/bulk-operations.js +201 -0
- package/dist/lib/bulk-operations.js.map +1 -0
- package/dist/lib/cursor.d.ts +110 -0
- package/dist/lib/cursor.d.ts.map +1 -0
- package/dist/lib/cursor.js +115 -0
- package/dist/lib/cursor.js.map +1 -0
- package/dist/lib/data-export.d.ts +67 -0
- package/dist/lib/data-export.d.ts.map +1 -0
- package/dist/lib/data-export.js +272 -0
- package/dist/lib/data-export.js.map +1 -0
- package/dist/lib/data-import-plan.d.ts +50 -0
- package/dist/lib/data-import-plan.d.ts.map +1 -0
- package/dist/lib/data-import-plan.js +235 -0
- package/dist/lib/data-import-plan.js.map +1 -0
- package/dist/lib/data-import.d.ts +276 -0
- package/dist/lib/data-import.d.ts.map +1 -0
- package/dist/lib/data-import.js +1694 -0
- package/dist/lib/data-import.js.map +1 -0
- package/dist/lib/database.d.ts +22 -0
- package/dist/lib/database.d.ts.map +1 -0
- package/dist/lib/database.js +103 -0
- package/dist/lib/database.js.map +1 -0
- package/dist/lib/entity-history.d.ts +52 -0
- package/dist/lib/entity-history.d.ts.map +1 -0
- package/dist/lib/entity-history.js +121 -0
- package/dist/lib/entity-history.js.map +1 -0
- package/dist/lib/etag.d.ts +92 -0
- package/dist/lib/etag.d.ts.map +1 -0
- package/dist/lib/etag.js +155 -0
- package/dist/lib/etag.js.map +1 -0
- package/dist/lib/image-validator.d.ts +44 -0
- package/dist/lib/image-validator.d.ts.map +1 -0
- package/dist/lib/image-validator.js +204 -0
- package/dist/lib/image-validator.js.map +1 -0
- package/dist/lib/logger.d.ts +15 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +84 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/migrator.d.ts +14 -0
- package/dist/lib/migrator.d.ts.map +1 -0
- package/dist/lib/migrator.js +34 -0
- package/dist/lib/migrator.js.map +1 -0
- package/dist/lib/redis.d.ts +5 -0
- package/dist/lib/redis.d.ts.map +1 -0
- package/dist/lib/redis.js +29 -0
- package/dist/lib/redis.js.map +1 -0
- package/dist/lib/runtime-paths.d.ts +38 -0
- package/dist/lib/runtime-paths.d.ts.map +1 -0
- package/dist/lib/runtime-paths.js +50 -0
- package/dist/lib/runtime-paths.js.map +1 -0
- package/dist/lib/session-tracking.d.ts +81 -0
- package/dist/lib/session-tracking.d.ts.map +1 -0
- package/dist/lib/session-tracking.js +145 -0
- package/dist/lib/session-tracking.js.map +1 -0
- package/dist/lib/signing-key-crypto.d.ts +53 -0
- package/dist/lib/signing-key-crypto.d.ts.map +1 -0
- package/dist/lib/signing-key-crypto.js +108 -0
- package/dist/lib/signing-key-crypto.js.map +1 -0
- package/dist/lib/signing-keys.d.ts +141 -0
- package/dist/lib/signing-keys.d.ts.map +1 -0
- package/dist/lib/signing-keys.js +206 -0
- package/dist/lib/signing-keys.js.map +1 -0
- package/dist/lib/stats.d.ts +83 -0
- package/dist/lib/stats.d.ts.map +1 -0
- package/dist/lib/stats.js +187 -0
- package/dist/lib/stats.js.map +1 -0
- package/dist/lib/super-admin-protection.d.ts +69 -0
- package/dist/lib/super-admin-protection.d.ts.map +1 -0
- package/dist/lib/super-admin-protection.js +102 -0
- package/dist/lib/super-admin-protection.js.map +1 -0
- package/dist/lib/system-config.d.ts +79 -0
- package/dist/lib/system-config.d.ts.map +1 -0
- package/dist/lib/system-config.js +159 -0
- package/dist/lib/system-config.js.map +1 -0
- package/dist/middleware/admin-auth.d.ts +100 -0
- package/dist/middleware/admin-auth.d.ts.map +1 -0
- package/dist/middleware/admin-auth.js +241 -0
- package/dist/middleware/admin-auth.js.map +1 -0
- package/dist/middleware/admin-cors.d.ts +41 -0
- package/dist/middleware/admin-cors.d.ts.map +1 -0
- package/dist/middleware/admin-cors.js +83 -0
- package/dist/middleware/admin-cors.js.map +1 -0
- package/dist/middleware/admin-mutation-audit.d.ts +9 -0
- package/dist/middleware/admin-mutation-audit.d.ts.map +1 -0
- package/dist/middleware/admin-mutation-audit.js +76 -0
- package/dist/middleware/admin-mutation-audit.js.map +1 -0
- package/dist/middleware/admin-rate-limiter.d.ts +56 -0
- package/dist/middleware/admin-rate-limiter.d.ts.map +1 -0
- package/dist/middleware/admin-rate-limiter.js +97 -0
- package/dist/middleware/admin-rate-limiter.js.map +1 -0
- package/dist/middleware/client-secret-hash.d.ts +34 -0
- package/dist/middleware/client-secret-hash.d.ts.map +1 -0
- package/dist/middleware/client-secret-hash.js +74 -0
- package/dist/middleware/client-secret-hash.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +3 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +93 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/health.d.ts +3 -0
- package/dist/middleware/health.d.ts.map +1 -0
- package/dist/middleware/health.js +35 -0
- package/dist/middleware/health.js.map +1 -0
- package/dist/middleware/metrics.d.ts +40 -0
- package/dist/middleware/metrics.d.ts.map +1 -0
- package/dist/middleware/metrics.js +75 -0
- package/dist/middleware/metrics.js.map +1 -0
- package/dist/middleware/oidc-client-tenant.d.ts +37 -0
- package/dist/middleware/oidc-client-tenant.d.ts.map +1 -0
- package/dist/middleware/oidc-client-tenant.js +156 -0
- package/dist/middleware/oidc-client-tenant.js.map +1 -0
- package/dist/middleware/oidc-cors.d.ts +33 -0
- package/dist/middleware/oidc-cors.d.ts.map +1 -0
- package/dist/middleware/oidc-cors.js +68 -0
- package/dist/middleware/oidc-cors.js.map +1 -0
- package/dist/middleware/oidc-preflight-cors.d.ts +54 -0
- package/dist/middleware/oidc-preflight-cors.d.ts.map +1 -0
- package/dist/middleware/oidc-preflight-cors.js +267 -0
- package/dist/middleware/oidc-preflight-cors.js.map +1 -0
- package/dist/middleware/prompt-login-reset.d.ts +103 -0
- package/dist/middleware/prompt-login-reset.d.ts.map +1 -0
- package/dist/middleware/prompt-login-reset.js +204 -0
- package/dist/middleware/prompt-login-reset.js.map +1 -0
- package/dist/middleware/ready.d.ts +23 -0
- package/dist/middleware/ready.d.ts.map +1 -0
- package/dist/middleware/ready.js +60 -0
- package/dist/middleware/ready.js.map +1 -0
- package/dist/middleware/request-logger.d.ts +27 -0
- package/dist/middleware/request-logger.d.ts.map +1 -0
- package/dist/middleware/request-logger.js +46 -0
- package/dist/middleware/request-logger.js.map +1 -0
- package/dist/middleware/require-permission.d.ts +28 -0
- package/dist/middleware/require-permission.d.ts.map +1 -0
- package/dist/middleware/require-permission.js +63 -0
- package/dist/middleware/require-permission.js.map +1 -0
- package/dist/middleware/require-user-organization.d.ts +18 -0
- package/dist/middleware/require-user-organization.d.ts.map +1 -0
- package/dist/middleware/require-user-organization.js +53 -0
- package/dist/middleware/require-user-organization.js.map +1 -0
- package/dist/middleware/root-page.d.ts +62 -0
- package/dist/middleware/root-page.d.ts.map +1 -0
- package/dist/middleware/root-page.js +134 -0
- package/dist/middleware/root-page.js.map +1 -0
- package/dist/middleware/security-headers.d.ts +98 -0
- package/dist/middleware/security-headers.d.ts.map +1 -0
- package/dist/middleware/security-headers.js +159 -0
- package/dist/middleware/security-headers.js.map +1 -0
- package/dist/middleware/tenant-resolver.d.ts +37 -0
- package/dist/middleware/tenant-resolver.d.ts.map +1 -0
- package/dist/middleware/tenant-resolver.js +71 -0
- package/dist/middleware/tenant-resolver.js.map +1 -0
- package/dist/middleware/token-rate-limiter.d.ts +89 -0
- package/dist/middleware/token-rate-limiter.d.ts.map +1 -0
- package/dist/middleware/token-rate-limiter.js +189 -0
- package/dist/middleware/token-rate-limiter.js.map +1 -0
- package/dist/oidc/account-finder.d.ts +52 -0
- package/dist/oidc/account-finder.d.ts.map +1 -0
- package/dist/oidc/account-finder.js +134 -0
- package/dist/oidc/account-finder.js.map +1 -0
- package/dist/oidc/adapter-factory.d.ts +90 -0
- package/dist/oidc/adapter-factory.d.ts.map +1 -0
- package/dist/oidc/adapter-factory.js +165 -0
- package/dist/oidc/adapter-factory.js.map +1 -0
- package/dist/oidc/configuration.d.ts +155 -0
- package/dist/oidc/configuration.d.ts.map +1 -0
- package/dist/oidc/configuration.js +531 -0
- package/dist/oidc/configuration.js.map +1 -0
- package/dist/oidc/postgres-adapter.d.ts +159 -0
- package/dist/oidc/postgres-adapter.d.ts.map +1 -0
- package/dist/oidc/postgres-adapter.js +222 -0
- package/dist/oidc/postgres-adapter.js.map +1 -0
- package/dist/oidc/protocol-security-observer.d.ts +38 -0
- package/dist/oidc/protocol-security-observer.d.ts.map +1 -0
- package/dist/oidc/protocol-security-observer.js +93 -0
- package/dist/oidc/protocol-security-observer.js.map +1 -0
- package/dist/oidc/provider.d.ts +37 -0
- package/dist/oidc/provider.d.ts.map +1 -0
- package/dist/oidc/provider.js +71 -0
- package/dist/oidc/provider.js.map +1 -0
- package/dist/oidc/redis-adapter.d.ts +140 -0
- package/dist/oidc/redis-adapter.d.ts.map +1 -0
- package/dist/oidc/redis-adapter.js +344 -0
- package/dist/oidc/redis-adapter.js.map +1 -0
- package/dist/organizations/cache.d.ts +60 -0
- package/dist/organizations/cache.d.ts.map +1 -0
- package/dist/organizations/cache.js +157 -0
- package/dist/organizations/cache.js.map +1 -0
- package/dist/organizations/errors.d.ts +25 -0
- package/dist/organizations/errors.d.ts.map +1 -0
- package/dist/organizations/errors.js +31 -0
- package/dist/organizations/errors.js.map +1 -0
- package/dist/organizations/index.d.ts +15 -0
- package/dist/organizations/index.d.ts.map +1 -0
- package/dist/organizations/index.js +15 -0
- package/dist/organizations/index.js.map +1 -0
- package/dist/organizations/repository.d.ts +183 -0
- package/dist/organizations/repository.d.ts.map +1 -0
- package/dist/organizations/repository.js +354 -0
- package/dist/organizations/repository.js.map +1 -0
- package/dist/organizations/service.d.ts +168 -0
- package/dist/organizations/service.d.ts.map +1 -0
- package/dist/organizations/service.js +511 -0
- package/dist/organizations/service.js.map +1 -0
- package/dist/organizations/slugs.d.ts +57 -0
- package/dist/organizations/slugs.d.ts.map +1 -0
- package/dist/organizations/slugs.js +130 -0
- package/dist/organizations/slugs.js.map +1 -0
- package/dist/organizations/types.d.ts +146 -0
- package/dist/organizations/types.d.ts.map +1 -0
- package/dist/organizations/types.js +49 -0
- package/dist/organizations/types.js.map +1 -0
- package/dist/rbac/cache.d.ts +110 -0
- package/dist/rbac/cache.d.ts.map +1 -0
- package/dist/rbac/cache.js +271 -0
- package/dist/rbac/cache.js.map +1 -0
- package/dist/rbac/errors.d.ts +34 -0
- package/dist/rbac/errors.d.ts.map +1 -0
- package/dist/rbac/errors.js +43 -0
- package/dist/rbac/errors.js.map +1 -0
- package/dist/rbac/index.d.ts +17 -0
- package/dist/rbac/index.d.ts.map +1 -0
- package/dist/rbac/index.js +21 -0
- package/dist/rbac/index.js.map +1 -0
- package/dist/rbac/mapping-repository.d.ts +121 -0
- package/dist/rbac/mapping-repository.d.ts.map +1 -0
- package/dist/rbac/mapping-repository.js +224 -0
- package/dist/rbac/mapping-repository.js.map +1 -0
- package/dist/rbac/permission-repository.d.ts +100 -0
- package/dist/rbac/permission-repository.d.ts.map +1 -0
- package/dist/rbac/permission-repository.js +190 -0
- package/dist/rbac/permission-repository.js.map +1 -0
- package/dist/rbac/permission-service.d.ts +85 -0
- package/dist/rbac/permission-service.d.ts.map +1 -0
- package/dist/rbac/permission-service.js +179 -0
- package/dist/rbac/permission-service.js.map +1 -0
- package/dist/rbac/role-repository.d.ts +104 -0
- package/dist/rbac/role-repository.d.ts.map +1 -0
- package/dist/rbac/role-repository.js +202 -0
- package/dist/rbac/role-repository.js.map +1 -0
- package/dist/rbac/role-service.d.ts +111 -0
- package/dist/rbac/role-service.d.ts.map +1 -0
- package/dist/rbac/role-service.js +256 -0
- package/dist/rbac/role-service.js.map +1 -0
- package/dist/rbac/slugs.d.ts +116 -0
- package/dist/rbac/slugs.d.ts.map +1 -0
- package/dist/rbac/slugs.js +178 -0
- package/dist/rbac/slugs.js.map +1 -0
- package/dist/rbac/types.d.ts +187 -0
- package/dist/rbac/types.d.ts.map +1 -0
- package/dist/rbac/types.js +75 -0
- package/dist/rbac/types.js.map +1 -0
- package/dist/rbac/user-role-service.d.ts +101 -0
- package/dist/rbac/user-role-service.d.ts.map +1 -0
- package/dist/rbac/user-role-service.js +166 -0
- package/dist/rbac/user-role-service.js.map +1 -0
- package/dist/routes/applications.d.ts +40 -0
- package/dist/routes/applications.d.ts.map +1 -0
- package/dist/routes/applications.js +284 -0
- package/dist/routes/applications.js.map +1 -0
- package/dist/routes/audit.d.ts +31 -0
- package/dist/routes/audit.d.ts.map +1 -0
- package/dist/routes/audit.js +140 -0
- package/dist/routes/audit.js.map +1 -0
- package/dist/routes/branding.d.ts +17 -0
- package/dist/routes/branding.d.ts.map +1 -0
- package/dist/routes/branding.js +104 -0
- package/dist/routes/branding.js.map +1 -0
- package/dist/routes/bulk.d.ts +37 -0
- package/dist/routes/bulk.d.ts.map +1 -0
- package/dist/routes/bulk.js +94 -0
- package/dist/routes/bulk.js.map +1 -0
- package/dist/routes/clients.d.ts +44 -0
- package/dist/routes/clients.d.ts.map +1 -0
- package/dist/routes/clients.js +353 -0
- package/dist/routes/clients.js.map +1 -0
- package/dist/routes/config.d.ts +35 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +115 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/custom-claims.d.ts +38 -0
- package/dist/routes/custom-claims.d.ts.map +1 -0
- package/dist/routes/custom-claims.js +208 -0
- package/dist/routes/custom-claims.js.map +1 -0
- package/dist/routes/exports.d.ts +21 -0
- package/dist/routes/exports.d.ts.map +1 -0
- package/dist/routes/exports.js +98 -0
- package/dist/routes/exports.js.map +1 -0
- package/dist/routes/imports.d.ts +18 -0
- package/dist/routes/imports.d.ts.map +1 -0
- package/dist/routes/imports.js +72 -0
- package/dist/routes/imports.js.map +1 -0
- package/dist/routes/interactions.d.ts +111 -0
- package/dist/routes/interactions.d.ts.map +1 -0
- package/dist/routes/interactions.js +1074 -0
- package/dist/routes/interactions.js.map +1 -0
- package/dist/routes/invitation.d.ts +31 -0
- package/dist/routes/invitation.d.ts.map +1 -0
- package/dist/routes/invitation.js +342 -0
- package/dist/routes/invitation.js.map +1 -0
- package/dist/routes/keys.d.ts +28 -0
- package/dist/routes/keys.d.ts.map +1 -0
- package/dist/routes/keys.js +91 -0
- package/dist/routes/keys.js.map +1 -0
- package/dist/routes/magic-link.d.ts +43 -0
- package/dist/routes/magic-link.d.ts.map +1 -0
- package/dist/routes/magic-link.js +264 -0
- package/dist/routes/magic-link.js.map +1 -0
- package/dist/routes/organizations.d.ts +38 -0
- package/dist/routes/organizations.d.ts.map +1 -0
- package/dist/routes/organizations.js +347 -0
- package/dist/routes/organizations.js.map +1 -0
- package/dist/routes/password-reset.d.ts +65 -0
- package/dist/routes/password-reset.d.ts.map +1 -0
- package/dist/routes/password-reset.js +493 -0
- package/dist/routes/password-reset.js.map +1 -0
- package/dist/routes/permissions.d.ts +33 -0
- package/dist/routes/permissions.d.ts.map +1 -0
- package/dist/routes/permissions.js +166 -0
- package/dist/routes/permissions.js.map +1 -0
- package/dist/routes/roles.d.ts +37 -0
- package/dist/routes/roles.d.ts.map +1 -0
- package/dist/routes/roles.js +222 -0
- package/dist/routes/roles.js.map +1 -0
- package/dist/routes/sessions.d.ts +37 -0
- package/dist/routes/sessions.d.ts.map +1 -0
- package/dist/routes/sessions.js +121 -0
- package/dist/routes/sessions.js.map +1 -0
- package/dist/routes/stats.d.ts +28 -0
- package/dist/routes/stats.d.ts.map +1 -0
- package/dist/routes/stats.js +65 -0
- package/dist/routes/stats.js.map +1 -0
- package/dist/routes/two-factor-admin.d.ts +54 -0
- package/dist/routes/two-factor-admin.d.ts.map +1 -0
- package/dist/routes/two-factor-admin.js +344 -0
- package/dist/routes/two-factor-admin.js.map +1 -0
- package/dist/routes/two-factor.d.ts +31 -0
- package/dist/routes/two-factor.d.ts.map +1 -0
- package/dist/routes/two-factor.js +595 -0
- package/dist/routes/two-factor.js.map +1 -0
- package/dist/routes/user-roles.d.ts +33 -0
- package/dist/routes/user-roles.d.ts.map +1 -0
- package/dist/routes/user-roles.js +129 -0
- package/dist/routes/user-roles.js.map +1 -0
- package/dist/routes/users.d.ts +61 -0
- package/dist/routes/users.d.ts.map +1 -0
- package/dist/routes/users.js +868 -0
- package/dist/routes/users.js.map +1 -0
- package/dist/security/decision-context.d.ts +52 -0
- package/dist/security/decision-context.d.ts.map +1 -0
- package/dist/security/decision-context.js +150 -0
- package/dist/security/decision-context.js.map +1 -0
- package/dist/security/decision-event.d.ts +128 -0
- package/dist/security/decision-event.d.ts.map +1 -0
- package/dist/security/decision-event.js +225 -0
- package/dist/security/decision-event.js.map +1 -0
- package/dist/security/transport-decision.d.ts +6 -0
- package/dist/security/transport-decision.d.ts.map +1 -0
- package/dist/security/transport-decision.js +37 -0
- package/dist/security/transport-decision.js.map +1 -0
- package/dist/server.d.ts +50 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +491 -0
- package/dist/server.js.map +1 -0
- package/dist/two-factor/cache.d.ts +47 -0
- package/dist/two-factor/cache.d.ts.map +1 -0
- package/dist/two-factor/cache.js +122 -0
- package/dist/two-factor/cache.js.map +1 -0
- package/dist/two-factor/crypto.d.ts +41 -0
- package/dist/two-factor/crypto.d.ts.map +1 -0
- package/dist/two-factor/crypto.js +94 -0
- package/dist/two-factor/crypto.js.map +1 -0
- package/dist/two-factor/errors.d.ts +82 -0
- package/dist/two-factor/errors.d.ts.map +1 -0
- package/dist/two-factor/errors.js +112 -0
- package/dist/two-factor/errors.js.map +1 -0
- package/dist/two-factor/index.d.ts +18 -0
- package/dist/two-factor/index.d.ts.map +1 -0
- package/dist/two-factor/index.js +25 -0
- package/dist/two-factor/index.js.map +1 -0
- package/dist/two-factor/otp.d.ts +43 -0
- package/dist/two-factor/otp.d.ts.map +1 -0
- package/dist/two-factor/otp.js +57 -0
- package/dist/two-factor/otp.js.map +1 -0
- package/dist/two-factor/recovery.d.ts +45 -0
- package/dist/two-factor/recovery.d.ts.map +1 -0
- package/dist/two-factor/recovery.js +104 -0
- package/dist/two-factor/recovery.js.map +1 -0
- package/dist/two-factor/repository.d.ts +156 -0
- package/dist/two-factor/repository.d.ts.map +1 -0
- package/dist/two-factor/repository.js +251 -0
- package/dist/two-factor/repository.js.map +1 -0
- package/dist/two-factor/service.d.ts +232 -0
- package/dist/two-factor/service.d.ts.map +1 -0
- package/dist/two-factor/service.js +599 -0
- package/dist/two-factor/service.js.map +1 -0
- package/dist/two-factor/totp.d.ts +57 -0
- package/dist/two-factor/totp.d.ts.map +1 -0
- package/dist/two-factor/totp.js +96 -0
- package/dist/two-factor/totp.js.map +1 -0
- package/dist/two-factor/types.d.ts +152 -0
- package/dist/two-factor/types.d.ts.map +1 -0
- package/dist/two-factor/types.js +64 -0
- package/dist/two-factor/types.js.map +1 -0
- package/dist/users/cache.d.ts +49 -0
- package/dist/users/cache.d.ts.map +1 -0
- package/dist/users/cache.js +140 -0
- package/dist/users/cache.js.map +1 -0
- package/dist/users/claims.d.ts +67 -0
- package/dist/users/claims.d.ts.map +1 -0
- package/dist/users/claims.js +104 -0
- package/dist/users/claims.js.map +1 -0
- package/dist/users/errors.d.ts +25 -0
- package/dist/users/errors.d.ts.map +1 -0
- package/dist/users/errors.js +31 -0
- package/dist/users/errors.js.map +1 -0
- package/dist/users/gdpr.d.ts +110 -0
- package/dist/users/gdpr.d.ts.map +1 -0
- package/dist/users/gdpr.js +211 -0
- package/dist/users/gdpr.js.map +1 -0
- package/dist/users/index.d.ts +20 -0
- package/dist/users/index.d.ts.map +1 -0
- package/dist/users/index.js +19 -0
- package/dist/users/index.js.map +1 -0
- package/dist/users/password.d.ts +85 -0
- package/dist/users/password.d.ts.map +1 -0
- package/dist/users/password.js +138 -0
- package/dist/users/password.js.map +1 -0
- package/dist/users/repository.d.ts +263 -0
- package/dist/users/repository.d.ts.map +1 -0
- package/dist/users/repository.js +499 -0
- package/dist/users/repository.js.map +1 -0
- package/dist/users/service.d.ts +299 -0
- package/dist/users/service.d.ts.map +1 -0
- package/dist/users/service.js +698 -0
- package/dist/users/service.js.map +1 -0
- package/dist/users/types.d.ts +220 -0
- package/dist/users/types.d.ts.map +1 -0
- package/dist/users/types.js +77 -0
- package/dist/users/types.js.map +1 -0
- package/locales/default/en/common.json +10 -0
- package/locales/default/en/consent.json +13 -0
- package/locales/default/en/emails.json +17 -0
- package/locales/default/en/errors.json +21 -0
- package/locales/default/en/forgot-password.json +11 -0
- package/locales/default/en/invitation.json +18 -0
- package/locales/default/en/login.json +17 -0
- package/locales/default/en/logout.json +9 -0
- package/locales/default/en/magic-link.json +12 -0
- package/locales/default/en/reset-password.json +16 -0
- package/locales/default/en/two-factor.json +29 -0
- package/migrations/.gitkeep +0 -0
- package/migrations/001_extensions.sql +22 -0
- package/migrations/002_organizations.sql +43 -0
- package/migrations/003_applications.sql +50 -0
- package/migrations/004_clients.sql +74 -0
- package/migrations/005_users.sql +119 -0
- package/migrations/006_roles_permissions.sql +80 -0
- package/migrations/007_custom_claims.sql +55 -0
- package/migrations/008_config.sql +51 -0
- package/migrations/009_audit_log.sql +31 -0
- package/migrations/010_oidc_adapter.sql +34 -0
- package/migrations/011_seed.sql +53 -0
- package/migrations/012_two_factor.sql +88 -0
- package/migrations/013_client_secret_sha256.sql +22 -0
- package/migrations/014_login_methods.sql +34 -0
- package/migrations/015_signing_key_encryption.sql +20 -0
- package/migrations/016_failed_login_count.sql +27 -0
- package/migrations/017_audit_retention.sql +11 -0
- package/migrations/018_admin_api_enhancements.sql +78 -0
- package/migrations/019_invitation_details.sql +27 -0
- package/migrations/020_two_factor_admin_permission.sql +108 -0
- package/migrations/021_auth_recovery_jobs.sql +74 -0
- package/migrations/022_recovery_artifact_ownership.sql +25 -0
- package/migrations/023_magic_link_authority.sql +39 -0
- package/package.json +106 -0
- package/templates/default/emails/invitation.hbs +39 -0
- package/templates/default/emails/invitation.txt.hbs +18 -0
- package/templates/default/emails/magic-link.hbs +30 -0
- package/templates/default/emails/magic-link.txt.hbs +11 -0
- package/templates/default/emails/otp-code.hbs +31 -0
- package/templates/default/emails/otp-code.txt.hbs +15 -0
- package/templates/default/emails/password-changed.hbs +24 -0
- package/templates/default/emails/password-changed.txt.hbs +7 -0
- package/templates/default/emails/password-reset.hbs +30 -0
- package/templates/default/emails/password-reset.txt.hbs +11 -0
- package/templates/default/emails/welcome.hbs +25 -0
- package/templates/default/emails/welcome.txt.hbs +9 -0
- package/templates/default/layouts/main.hbs +49 -0
- package/templates/default/pages/accept-invite.hbs +25 -0
- package/templates/default/pages/consent.hbs +27 -0
- package/templates/default/pages/error.hbs +15 -0
- package/templates/default/pages/forgot-password.hbs +21 -0
- package/templates/default/pages/invite-expired.hbs +6 -0
- package/templates/default/pages/invite-success.hbs +9 -0
- package/templates/default/pages/login.hbs +108 -0
- package/templates/default/pages/logout-success.hbs +5 -0
- package/templates/default/pages/logout.hbs +24 -0
- package/templates/default/pages/magic-link-sent.hbs +10 -0
- package/templates/default/pages/magic-link-success.hbs +17 -0
- package/templates/default/pages/reset-password.hbs +20 -0
- package/templates/default/pages/reset-success.hbs +9 -0
- package/templates/default/pages/two-factor-setup.hbs +65 -0
- package/templates/default/pages/two-factor-verify.hbs +77 -0
- package/templates/default/partials/flash-messages.hbs +10 -0
- package/templates/default/partials/footer.hbs +4 -0
- package/templates/default/partials/header.hbs +8 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pluggable email transport abstraction.
|
|
3
|
+
*
|
|
4
|
+
* Defines a transport interface and provides a default SMTP implementation
|
|
5
|
+
* using Nodemailer. The interface allows swapping transports for testing
|
|
6
|
+
* (mock transport) or future providers (SES, SendGrid, etc.).
|
|
7
|
+
*
|
|
8
|
+
* SMTP configuration is read from the app config (`config.smtp.*`).
|
|
9
|
+
* Auth is only applied when `smtp.user` is provided — MailHog in dev
|
|
10
|
+
* doesn't need authentication.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* const transport = createSmtpTransport();
|
|
14
|
+
* const result = await transport.send({
|
|
15
|
+
* to: 'user@example.com',
|
|
16
|
+
* subject: 'Welcome',
|
|
17
|
+
* html: '<h1>Hello</h1>',
|
|
18
|
+
* text: 'Hello',
|
|
19
|
+
* });
|
|
20
|
+
*/
|
|
21
|
+
import nodemailer from 'nodemailer';
|
|
22
|
+
import { config } from '../config/index.js';
|
|
23
|
+
import { logger } from '../lib/logger.js';
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// SMTP Transport
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
/**
|
|
28
|
+
* Create an SMTP email transport using Nodemailer.
|
|
29
|
+
*
|
|
30
|
+
* Reads SMTP configuration from the app config:
|
|
31
|
+
* - `config.smtp.host` — SMTP server hostname
|
|
32
|
+
* - `config.smtp.port` — SMTP port (465 = TLS, 587 = STARTTLS, 1025 = MailHog)
|
|
33
|
+
* - `config.smtp.user` — Username (optional, omit for MailHog)
|
|
34
|
+
* - `config.smtp.pass` — Password (optional)
|
|
35
|
+
* - `config.smtp.from` — Default sender address
|
|
36
|
+
*
|
|
37
|
+
* @returns EmailTransport implementation backed by Nodemailer SMTP
|
|
38
|
+
*/
|
|
39
|
+
export function createSmtpTransport() {
|
|
40
|
+
// Build Nodemailer transport options from config
|
|
41
|
+
const transportOptions = {
|
|
42
|
+
host: config.smtp.host,
|
|
43
|
+
port: config.smtp.port,
|
|
44
|
+
// Port 465 uses implicit TLS; other ports use STARTTLS or plain
|
|
45
|
+
secure: config.smtp.port === 465,
|
|
46
|
+
};
|
|
47
|
+
// Only add auth when credentials are provided (MailHog doesn't need auth)
|
|
48
|
+
if (config.smtp.user) {
|
|
49
|
+
transportOptions.auth = {
|
|
50
|
+
user: config.smtp.user,
|
|
51
|
+
pass: config.smtp.pass ?? '',
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const transporter = nodemailer.createTransport(transportOptions);
|
|
55
|
+
return {
|
|
56
|
+
/**
|
|
57
|
+
* Send an email via SMTP.
|
|
58
|
+
*
|
|
59
|
+
* @param options - Email send options
|
|
60
|
+
* @returns Result with messageId and accepted/rejected addresses
|
|
61
|
+
*/
|
|
62
|
+
async send(options) {
|
|
63
|
+
const from = options.from ?? config.smtp.from;
|
|
64
|
+
logger.debug({ event: 'smtp_send_started' }, 'Sending email via SMTP');
|
|
65
|
+
const info = await transporter.sendMail({
|
|
66
|
+
from,
|
|
67
|
+
to: options.to,
|
|
68
|
+
subject: options.subject,
|
|
69
|
+
html: options.html,
|
|
70
|
+
text: options.text,
|
|
71
|
+
replyTo: options.replyTo,
|
|
72
|
+
...(options.messageId ? { messageId: options.messageId } : {}),
|
|
73
|
+
});
|
|
74
|
+
return {
|
|
75
|
+
messageId: info.messageId,
|
|
76
|
+
accepted: Array.isArray(info.accepted) ? info.accepted.map(String) : [],
|
|
77
|
+
rejected: Array.isArray(info.rejected) ? info.rejected.map(String) : [],
|
|
78
|
+
};
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=email-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-transport.js","sourceRoot":"","sources":["../../src/auth/email-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAwC1C,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB;IACjC,iDAAiD;IACjD,MAAM,gBAAgB,GAKlB;QACF,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;QACtB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;QACtB,gEAAgE;QAChE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG;KACjC,CAAC;IAEF,0EAA0E;IAC1E,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACrB,gBAAgB,CAAC,IAAI,GAAG;YACtB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;YACtB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE;SAC7B,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAgB,UAAU,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAE9E,OAAO;QACL;;;;;WAKG;QACH,KAAK,CAAC,IAAI,CAAC,OAAyB;YAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YAE9C,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,wBAAwB,CAAC,CAAC;YAEvE,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC;gBACtC,IAAI;gBACJ,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/D,CAAC,CAAC;YAEH,OAAO;gBACL,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;gBACvE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;aACxE,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internationalization (i18n) system for auth workflow pages.
|
|
3
|
+
*
|
|
4
|
+
* Uses i18next with filesystem backend to load translations from disk.
|
|
5
|
+
* Supports per-organization translation overrides:
|
|
6
|
+
* 1. Default translations: locales/default/{locale}/{namespace}.json
|
|
7
|
+
* 2. Org overrides: locales/{orgSlug}/{locale}/{namespace}.json
|
|
8
|
+
*
|
|
9
|
+
* The locale resolution chain prioritizes:
|
|
10
|
+
* 1. ui_locales from OIDC authorization request
|
|
11
|
+
* 2. Accept-Language header
|
|
12
|
+
* 3. Organization defaultLocale
|
|
13
|
+
* 4. Global default_locale from system_config
|
|
14
|
+
* 5. Hardcoded fallback: 'en'
|
|
15
|
+
*
|
|
16
|
+
* Also registers a Handlebars {{t}} helper for template translations.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* await initI18n();
|
|
20
|
+
* registerHandlebarsI18nHelper();
|
|
21
|
+
* const t = getTranslationFunction('en');
|
|
22
|
+
* t('login.title'); // => "Sign in to your account"
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Initialize i18next with the filesystem backend.
|
|
26
|
+
*
|
|
27
|
+
* Loads translations from locales/default/{locale}/{namespace}.json.
|
|
28
|
+
* Must be called once at application startup before any translation
|
|
29
|
+
* functions are used.
|
|
30
|
+
*
|
|
31
|
+
* @throws Error if i18next initialization fails (fatal startup error)
|
|
32
|
+
*/
|
|
33
|
+
export declare function initI18n(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Resolve the best locale for a request.
|
|
36
|
+
*
|
|
37
|
+
* Resolution chain (first non-empty match wins):
|
|
38
|
+
* 1. ui_locales from OIDC authorization request (space-separated list)
|
|
39
|
+
* 2. Accept-Language header (first language tag)
|
|
40
|
+
* 3. Organization defaultLocale
|
|
41
|
+
* 4. Global default_locale from system_config table
|
|
42
|
+
* 5. Hardcoded fallback: 'en'
|
|
43
|
+
*
|
|
44
|
+
* Only returns locales that i18next has loaded (verified via hasResourceBundle).
|
|
45
|
+
*
|
|
46
|
+
* @param uiLocales - Space-separated locale list from OIDC params (e.g., 'nl en')
|
|
47
|
+
* @param acceptLanguage - Accept-Language header value (e.g., 'en-US,en;q=0.9')
|
|
48
|
+
* @param orgDefaultLocale - Organization's default locale setting
|
|
49
|
+
* @returns Resolved locale string (e.g., 'en')
|
|
50
|
+
*/
|
|
51
|
+
export declare function resolveLocale(uiLocales: string | undefined, acceptLanguage: string | undefined, orgDefaultLocale: string): Promise<string>;
|
|
52
|
+
/**
|
|
53
|
+
* Get a translation function for a specific locale with optional org overrides.
|
|
54
|
+
*
|
|
55
|
+
* Returns a function that looks up translation keys across all namespaces.
|
|
56
|
+
* If an orgSlug is provided, org-specific translations are merged on top
|
|
57
|
+
* of the defaults (overriding matching keys).
|
|
58
|
+
*
|
|
59
|
+
* The returned function uses namespace:key syntax internally but accepts
|
|
60
|
+
* plain keys that auto-resolve by checking each namespace.
|
|
61
|
+
*
|
|
62
|
+
* @param locale - Target locale (e.g., 'en')
|
|
63
|
+
* @param orgSlug - Optional org slug for translation overrides
|
|
64
|
+
* @returns Translation function: (key, options?) => translated string
|
|
65
|
+
*/
|
|
66
|
+
export declare function getTranslationFunction(locale: string, orgSlug?: string): (key: string, options?: Record<string, unknown>) => string;
|
|
67
|
+
/**
|
|
68
|
+
* Register the {{t}} Handlebars helper for template translations.
|
|
69
|
+
*
|
|
70
|
+
* Must be called after i18next is initialized. The helper reads the
|
|
71
|
+
* translation function from the template context's `t` property.
|
|
72
|
+
*
|
|
73
|
+
* Usage in templates:
|
|
74
|
+
* {{t "login.title"}}
|
|
75
|
+
* {{t "common.welcome" name="Alice"}}
|
|
76
|
+
*
|
|
77
|
+
* The helper extracts the `t` function from the current Handlebars context
|
|
78
|
+
* and passes hash arguments as interpolation options.
|
|
79
|
+
*/
|
|
80
|
+
export declare function registerHandlebarsI18nHelper(): void;
|
|
81
|
+
//# sourceMappingURL=i18n.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/auth/i18n.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AA2CH;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAyB9C;AA8DD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,CAwCjB;AAmDD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAmG5D;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CA+BnD"}
|
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internationalization (i18n) system for auth workflow pages.
|
|
3
|
+
*
|
|
4
|
+
* Uses i18next with filesystem backend to load translations from disk.
|
|
5
|
+
* Supports per-organization translation overrides:
|
|
6
|
+
* 1. Default translations: locales/default/{locale}/{namespace}.json
|
|
7
|
+
* 2. Org overrides: locales/{orgSlug}/{locale}/{namespace}.json
|
|
8
|
+
*
|
|
9
|
+
* The locale resolution chain prioritizes:
|
|
10
|
+
* 1. ui_locales from OIDC authorization request
|
|
11
|
+
* 2. Accept-Language header
|
|
12
|
+
* 3. Organization defaultLocale
|
|
13
|
+
* 4. Global default_locale from system_config
|
|
14
|
+
* 5. Hardcoded fallback: 'en'
|
|
15
|
+
*
|
|
16
|
+
* Also registers a Handlebars {{t}} helper for template translations.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* await initI18n();
|
|
20
|
+
* registerHandlebarsI18nHelper();
|
|
21
|
+
* const t = getTranslationFunction('en');
|
|
22
|
+
* t('login.title'); // => "Sign in to your account"
|
|
23
|
+
*/
|
|
24
|
+
import i18next from 'i18next';
|
|
25
|
+
import FsBackend from 'i18next-fs-backend';
|
|
26
|
+
import fs from 'node:fs/promises';
|
|
27
|
+
import path from 'node:path';
|
|
28
|
+
import Handlebars from 'handlebars';
|
|
29
|
+
import { getSystemConfigString } from '../lib/system-config.js';
|
|
30
|
+
import { logger } from '../lib/logger.js';
|
|
31
|
+
import { getLocalesDirectory } from '../lib/runtime-paths.js';
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Constants
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
/** Absolute directory containing locale files shipped with the server package. */
|
|
36
|
+
const LOCALES_DIR = getLocalesDirectory();
|
|
37
|
+
/**
|
|
38
|
+
* All translation namespaces loaded by default.
|
|
39
|
+
* Each maps to a JSON file: locales/{locale}/{namespace}.json
|
|
40
|
+
*/
|
|
41
|
+
const NAMESPACES = [
|
|
42
|
+
'common',
|
|
43
|
+
'login',
|
|
44
|
+
'consent',
|
|
45
|
+
'forgot-password',
|
|
46
|
+
'reset-password',
|
|
47
|
+
'magic-link',
|
|
48
|
+
'invitation',
|
|
49
|
+
'logout',
|
|
50
|
+
'errors',
|
|
51
|
+
'emails',
|
|
52
|
+
'two-factor',
|
|
53
|
+
];
|
|
54
|
+
/** Hardcoded fallback locale when all resolution steps fail */
|
|
55
|
+
const FALLBACK_LOCALE = 'en';
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// i18next initialization
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
/**
|
|
60
|
+
* Initialize i18next with the filesystem backend.
|
|
61
|
+
*
|
|
62
|
+
* Loads translations from locales/default/{locale}/{namespace}.json.
|
|
63
|
+
* Must be called once at application startup before any translation
|
|
64
|
+
* functions are used.
|
|
65
|
+
*
|
|
66
|
+
* @throws Error if i18next initialization fails (fatal startup error)
|
|
67
|
+
*/
|
|
68
|
+
export async function initI18n() {
|
|
69
|
+
await i18next.use(FsBackend).init({
|
|
70
|
+
// Default fallback language
|
|
71
|
+
fallbackLng: FALLBACK_LOCALE,
|
|
72
|
+
// Namespaces to load
|
|
73
|
+
ns: [...NAMESPACES],
|
|
74
|
+
defaultNS: 'common',
|
|
75
|
+
// Filesystem backend configuration
|
|
76
|
+
backend: {
|
|
77
|
+
loadPath: path.join(LOCALES_DIR, 'default', '{{lng}}', '{{ns}}.json'),
|
|
78
|
+
},
|
|
79
|
+
// Disable key-based fallback (return key as-is if missing)
|
|
80
|
+
returnNull: false,
|
|
81
|
+
// Interpolation uses {{variable}} by default — same as Handlebars,
|
|
82
|
+
// but i18next escapes by default which is safe for HTML contexts
|
|
83
|
+
interpolation: {
|
|
84
|
+
escapeValue: false,
|
|
85
|
+
},
|
|
86
|
+
// Don't try to detect language from environment
|
|
87
|
+
detection: undefined,
|
|
88
|
+
// Preload English locale at startup
|
|
89
|
+
preload: [FALLBACK_LOCALE],
|
|
90
|
+
});
|
|
91
|
+
logger.info({ localesDir: LOCALES_DIR }, 'i18n initialized');
|
|
92
|
+
}
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
// Org-specific override loading
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
/**
|
|
97
|
+
* Load org-specific translation overrides for a namespace.
|
|
98
|
+
*
|
|
99
|
+
* Checks for locales/{orgSlug}/{locale}/{namespace}.json and returns
|
|
100
|
+
* the parsed JSON if found, or null if no override exists.
|
|
101
|
+
*
|
|
102
|
+
* @param orgSlug - Organization slug for override lookup
|
|
103
|
+
* @param locale - Target locale (e.g., 'en')
|
|
104
|
+
* @param namespace - Translation namespace (e.g., 'login')
|
|
105
|
+
* @returns Parsed override translations, or null if none exist
|
|
106
|
+
*/
|
|
107
|
+
async function loadOrgOverrides(orgSlug, locale, namespace) {
|
|
108
|
+
const overridePath = path.join(LOCALES_DIR, orgSlug, locale, `${namespace}.json`);
|
|
109
|
+
try {
|
|
110
|
+
const content = await fs.readFile(overridePath, 'utf-8');
|
|
111
|
+
return JSON.parse(content);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// No override file — this is normal, not an error
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Deep-merge org overrides into a flat key-value map.
|
|
120
|
+
*
|
|
121
|
+
* Flattens nested objects into dot-notation keys for i18next lookup.
|
|
122
|
+
* For example: { login: { title: "Custom" } } => { "login.title": "Custom" }
|
|
123
|
+
*
|
|
124
|
+
* @param obj - Nested object to flatten
|
|
125
|
+
* @param prefix - Current key prefix (for recursion)
|
|
126
|
+
* @returns Flat key-value map
|
|
127
|
+
*/
|
|
128
|
+
function flattenOverrides(obj, prefix = '') {
|
|
129
|
+
const result = {};
|
|
130
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
131
|
+
const fullKey = prefix ? `${prefix}.${key}` : key;
|
|
132
|
+
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
133
|
+
Object.assign(result, flattenOverrides(value, fullKey));
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
result[fullKey] = String(value);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
// Locale resolution
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
/**
|
|
145
|
+
* Resolve the best locale for a request.
|
|
146
|
+
*
|
|
147
|
+
* Resolution chain (first non-empty match wins):
|
|
148
|
+
* 1. ui_locales from OIDC authorization request (space-separated list)
|
|
149
|
+
* 2. Accept-Language header (first language tag)
|
|
150
|
+
* 3. Organization defaultLocale
|
|
151
|
+
* 4. Global default_locale from system_config table
|
|
152
|
+
* 5. Hardcoded fallback: 'en'
|
|
153
|
+
*
|
|
154
|
+
* Only returns locales that i18next has loaded (verified via hasResourceBundle).
|
|
155
|
+
*
|
|
156
|
+
* @param uiLocales - Space-separated locale list from OIDC params (e.g., 'nl en')
|
|
157
|
+
* @param acceptLanguage - Accept-Language header value (e.g., 'en-US,en;q=0.9')
|
|
158
|
+
* @param orgDefaultLocale - Organization's default locale setting
|
|
159
|
+
* @returns Resolved locale string (e.g., 'en')
|
|
160
|
+
*/
|
|
161
|
+
export async function resolveLocale(uiLocales, acceptLanguage, orgDefaultLocale) {
|
|
162
|
+
// Step 1: Try ui_locales from OIDC authorization request
|
|
163
|
+
if (uiLocales) {
|
|
164
|
+
const candidates = uiLocales.split(/\s+/).filter(Boolean);
|
|
165
|
+
for (const candidate of candidates) {
|
|
166
|
+
const normalized = normalizeLocale(candidate);
|
|
167
|
+
if (isLocaleAvailable(normalized)) {
|
|
168
|
+
return normalized;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Step 2: Try Accept-Language header
|
|
173
|
+
if (acceptLanguage) {
|
|
174
|
+
const parsed = parseAcceptLanguage(acceptLanguage);
|
|
175
|
+
for (const candidate of parsed) {
|
|
176
|
+
const normalized = normalizeLocale(candidate);
|
|
177
|
+
if (isLocaleAvailable(normalized)) {
|
|
178
|
+
return normalized;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Step 3: Try organization default locale
|
|
183
|
+
if (orgDefaultLocale) {
|
|
184
|
+
const normalized = normalizeLocale(orgDefaultLocale);
|
|
185
|
+
if (isLocaleAvailable(normalized)) {
|
|
186
|
+
return normalized;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Step 4: Try global default_locale from system_config
|
|
190
|
+
const globalDefault = await getSystemConfigString('default_locale', FALLBACK_LOCALE);
|
|
191
|
+
const normalized = normalizeLocale(globalDefault);
|
|
192
|
+
if (isLocaleAvailable(normalized)) {
|
|
193
|
+
return normalized;
|
|
194
|
+
}
|
|
195
|
+
// Step 5: Hardcoded fallback
|
|
196
|
+
return FALLBACK_LOCALE;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Normalize a locale string to its base language code.
|
|
200
|
+
* Strips region/variant suffixes: 'en-US' → 'en', 'nl-NL' → 'nl'.
|
|
201
|
+
*
|
|
202
|
+
* @param locale - Raw locale string
|
|
203
|
+
* @returns Lowercase base language code
|
|
204
|
+
*/
|
|
205
|
+
function normalizeLocale(locale) {
|
|
206
|
+
return locale.toLowerCase().split(/[-_]/)[0];
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Check if a locale has loaded translations in i18next.
|
|
210
|
+
*
|
|
211
|
+
* @param locale - Locale to check
|
|
212
|
+
* @returns true if translations exist for this locale
|
|
213
|
+
*/
|
|
214
|
+
function isLocaleAvailable(locale) {
|
|
215
|
+
// Check if at least the 'common' namespace has been loaded
|
|
216
|
+
return i18next.hasResourceBundle(locale, 'common');
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Parse an Accept-Language header into ordered language codes.
|
|
220
|
+
*
|
|
221
|
+
* Handles quality values (q=) and returns languages sorted by preference.
|
|
222
|
+
* Example: 'en-US,en;q=0.9,nl;q=0.8' → ['en-US', 'en', 'nl']
|
|
223
|
+
*
|
|
224
|
+
* @param header - Accept-Language header value
|
|
225
|
+
* @returns Array of language codes, highest quality first
|
|
226
|
+
*/
|
|
227
|
+
function parseAcceptLanguage(header) {
|
|
228
|
+
return header
|
|
229
|
+
.split(',')
|
|
230
|
+
.map((part) => {
|
|
231
|
+
const [lang, ...params] = part.trim().split(';');
|
|
232
|
+
const qParam = params.find((p) => p.trim().startsWith('q='));
|
|
233
|
+
const q = qParam ? parseFloat(qParam.trim().slice(2)) : 1.0;
|
|
234
|
+
return { lang: lang.trim(), q };
|
|
235
|
+
})
|
|
236
|
+
.sort((a, b) => b.q - a.q)
|
|
237
|
+
.map((entry) => entry.lang)
|
|
238
|
+
.filter(Boolean);
|
|
239
|
+
}
|
|
240
|
+
// ---------------------------------------------------------------------------
|
|
241
|
+
// Translation function
|
|
242
|
+
// ---------------------------------------------------------------------------
|
|
243
|
+
/**
|
|
244
|
+
* Get a translation function for a specific locale with optional org overrides.
|
|
245
|
+
*
|
|
246
|
+
* Returns a function that looks up translation keys across all namespaces.
|
|
247
|
+
* If an orgSlug is provided, org-specific translations are merged on top
|
|
248
|
+
* of the defaults (overriding matching keys).
|
|
249
|
+
*
|
|
250
|
+
* The returned function uses namespace:key syntax internally but accepts
|
|
251
|
+
* plain keys that auto-resolve by checking each namespace.
|
|
252
|
+
*
|
|
253
|
+
* @param locale - Target locale (e.g., 'en')
|
|
254
|
+
* @param orgSlug - Optional org slug for translation overrides
|
|
255
|
+
* @returns Translation function: (key, options?) => translated string
|
|
256
|
+
*/
|
|
257
|
+
export function getTranslationFunction(locale, orgSlug) {
|
|
258
|
+
// Cache for org overrides loaded during this function's lifetime
|
|
259
|
+
const orgOverrideCache = new Map();
|
|
260
|
+
let orgOverridesLoaded = false;
|
|
261
|
+
/**
|
|
262
|
+
* Lazily load all org overrides for the given locale.
|
|
263
|
+
* Only runs once per translation function instance.
|
|
264
|
+
*/
|
|
265
|
+
async function ensureOrgOverrides() {
|
|
266
|
+
if (orgOverridesLoaded || !orgSlug)
|
|
267
|
+
return;
|
|
268
|
+
orgOverridesLoaded = true;
|
|
269
|
+
for (const ns of NAMESPACES) {
|
|
270
|
+
const overrides = await loadOrgOverrides(orgSlug, locale, ns);
|
|
271
|
+
if (overrides) {
|
|
272
|
+
orgOverrideCache.set(ns, flattenOverrides(overrides));
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// Pre-load org overrides eagerly (fire-and-forget — they'll be ready by first use)
|
|
277
|
+
if (orgSlug) {
|
|
278
|
+
ensureOrgOverrides().catch((error) => {
|
|
279
|
+
logger.warn({ error, orgSlug, locale }, 'Failed to load org translation overrides');
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Translation function that resolves keys across namespaces.
|
|
284
|
+
*
|
|
285
|
+
* Key resolution:
|
|
286
|
+
* 1. Check org overrides (if loaded)
|
|
287
|
+
* 2. Use i18next standard lookup with namespace detection
|
|
288
|
+
* 3. Fall back to key itself if no translation found
|
|
289
|
+
*/
|
|
290
|
+
return (key, options) => {
|
|
291
|
+
// Determine namespace and key parts
|
|
292
|
+
const colonIndex = key.indexOf(':');
|
|
293
|
+
let ns;
|
|
294
|
+
let lookupKey;
|
|
295
|
+
if (colonIndex > -1) {
|
|
296
|
+
// Explicit namespace: "login:title"
|
|
297
|
+
ns = key.substring(0, colonIndex);
|
|
298
|
+
lookupKey = key.substring(colonIndex + 1);
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
// Dot-notation: "login.title" — first segment is the namespace
|
|
302
|
+
const dotIndex = key.indexOf('.');
|
|
303
|
+
if (dotIndex > -1) {
|
|
304
|
+
const possibleNs = key.substring(0, dotIndex);
|
|
305
|
+
if (NAMESPACES.includes(possibleNs)) {
|
|
306
|
+
ns = possibleNs;
|
|
307
|
+
lookupKey = key.substring(dotIndex + 1);
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
lookupKey = key;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
lookupKey = key;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
// Check org overrides first
|
|
318
|
+
if (ns && orgOverrideCache.has(ns)) {
|
|
319
|
+
const overrides = orgOverrideCache.get(ns);
|
|
320
|
+
if (lookupKey in overrides) {
|
|
321
|
+
let result = overrides[lookupKey];
|
|
322
|
+
// Apply simple interpolation for org overrides
|
|
323
|
+
if (options) {
|
|
324
|
+
for (const [varKey, varValue] of Object.entries(options)) {
|
|
325
|
+
result = result.replace(new RegExp(`\\{\\{${varKey}\\}\\}`, 'g'), String(varValue));
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return result;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
// Use i18next for standard lookup
|
|
332
|
+
const i18nKey = ns ? `${ns}:${lookupKey}` : lookupKey;
|
|
333
|
+
const translated = i18next.t(i18nKey, {
|
|
334
|
+
lng: locale,
|
|
335
|
+
...(options ?? {}),
|
|
336
|
+
});
|
|
337
|
+
let result = typeof translated === 'string' ? translated : key;
|
|
338
|
+
// Fallback interpolation: if i18next did not replace {{variable}} placeholders
|
|
339
|
+
// (e.g., due to version-specific behavior or caching), perform manual replacement.
|
|
340
|
+
// This mirrors the org-override interpolation logic above.
|
|
341
|
+
if (options && result.includes('{{')) {
|
|
342
|
+
for (const [varKey, varValue] of Object.entries(options)) {
|
|
343
|
+
if (varValue !== undefined) {
|
|
344
|
+
result = result.replace(new RegExp(`\\{\\{${varKey}\\}\\}`, 'g'), String(varValue));
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return result;
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
// ---------------------------------------------------------------------------
|
|
352
|
+
// Handlebars i18n helper
|
|
353
|
+
// ---------------------------------------------------------------------------
|
|
354
|
+
/**
|
|
355
|
+
* Register the {{t}} Handlebars helper for template translations.
|
|
356
|
+
*
|
|
357
|
+
* Must be called after i18next is initialized. The helper reads the
|
|
358
|
+
* translation function from the template context's `t` property.
|
|
359
|
+
*
|
|
360
|
+
* Usage in templates:
|
|
361
|
+
* {{t "login.title"}}
|
|
362
|
+
* {{t "common.welcome" name="Alice"}}
|
|
363
|
+
*
|
|
364
|
+
* The helper extracts the `t` function from the current Handlebars context
|
|
365
|
+
* and passes hash arguments as interpolation options.
|
|
366
|
+
*/
|
|
367
|
+
export function registerHandlebarsI18nHelper() {
|
|
368
|
+
Handlebars.registerHelper('t', function (key, options) {
|
|
369
|
+
// The translation function is passed in the template context.
|
|
370
|
+
// Inside {{#each}} blocks, `this` is the current item (e.g., a string),
|
|
371
|
+
// so we fall back to the root context to find the `t` function.
|
|
372
|
+
const t = (this.t ?? options?.data?.root?.t);
|
|
373
|
+
if (!t) {
|
|
374
|
+
// No translation function available — return the key as fallback
|
|
375
|
+
logger.warn({ key }, 'Handlebars {{t}} helper called without translation function in context');
|
|
376
|
+
return key;
|
|
377
|
+
}
|
|
378
|
+
// Pass Handlebars hash arguments as interpolation options
|
|
379
|
+
// e.g., {{t "common.welcome" name="Alice"}} → t("common.welcome", { name: "Alice" })
|
|
380
|
+
const hashOptions = options?.hash ?? {};
|
|
381
|
+
// Resolve undefined hash values from the root context.
|
|
382
|
+
// Handlebars may pass `undefined` for hash values like `maskedEmail=maskedEmail`
|
|
383
|
+
// if the identifier resolution fails in certain scope contexts. Fall back to
|
|
384
|
+
// the root data context to ensure interpolation variables are available.
|
|
385
|
+
const root = (options?.data?.root ?? this);
|
|
386
|
+
for (const [hashKey, hashValue] of Object.entries(hashOptions)) {
|
|
387
|
+
if (hashValue === undefined && root[hashKey] !== undefined) {
|
|
388
|
+
hashOptions[hashKey] = root[hashKey];
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
return t(key, hashOptions);
|
|
392
|
+
});
|
|
393
|
+
logger.debug('Handlebars {{t}} i18n helper registered');
|
|
394
|
+
}
|
|
395
|
+
//# sourceMappingURL=i18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/auth/i18n.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth module barrel export.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports all public APIs from the auth module for convenient importing.
|
|
5
|
+
* Consumers should import from this barrel rather than reaching into
|
|
6
|
+
* individual files (respects module boundary convention).
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* import { generateToken, hashToken, generateCsrfToken } from './auth/index.js';
|
|
10
|
+
*/
|
|
11
|
+
export { generateToken, hashToken } from './tokens.js';
|
|
12
|
+
export type { GeneratedToken } from './tokens.js';
|
|
13
|
+
export { insertToken, insertInvitationToken, findValidToken, findValidInvitationToken, markTokenUsed, deleteExpiredTokens, invalidateUserTokens, } from './token-repository.js';
|
|
14
|
+
export type { TokenTable, GenericInsertTokenTable, TokenRecord, InvitationTokenRecord, } from './token-repository.js';
|
|
15
|
+
export { generateCsrfToken, verifyCsrfToken, setCsrfCookie, getCsrfFromCookie } from './csrf.js';
|
|
16
|
+
export { checkRateLimit, checkRateLimitStrict, resetRateLimit, buildLoginRateLimitKey, buildMagicLinkRateLimitKey, buildMagicLinkCallbackRateLimitKey, buildPasswordResetRateLimitKey, loadLoginRateLimitConfig, loadMagicLinkRateLimitConfig, loadPasswordResetRateLimitConfig, } from './rate-limiter.js';
|
|
17
|
+
export type { RateLimitResult, RateLimitConfig } from './rate-limiter.js';
|
|
18
|
+
export { createSmtpTransport } from './email-transport.js';
|
|
19
|
+
export type { EmailTransport, SendEmailOptions, EmailResult } from './email-transport.js';
|
|
20
|
+
export { renderEmail } from './email-renderer.js';
|
|
21
|
+
export { sendMagicLinkEmail, sendPasswordResetEmail, sendInvitationEmail, renderInvitationEmail, sendWelcomeEmail, sendPasswordChangedEmail, setEmailTransport, } from './email-service.js';
|
|
22
|
+
export type { EmailUser, EmailOrganization, InvitationEmailOptions } from './email-service.js';
|
|
23
|
+
export { initI18n, resolveLocale, getTranslationFunction, registerHandlebarsI18nHelper, } from './i18n.js';
|
|
24
|
+
export { initTemplateEngine, renderPage } from './template-engine.js';
|
|
25
|
+
export type { TemplateContext } from './template-engine.js';
|
|
26
|
+
export { createMagicLinkSession, consumeMagicLinkSession, hasMagicLinkSession, clearMagicLinkSessionCookie, } from './magic-link-session.js';
|
|
27
|
+
export type { MagicLinkSessionData } from './magic-link-session.js';
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,cAAc,EACd,wBAAwB,EACxB,aAAa,EACb,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,UAAU,EACV,uBAAuB,EACvB,WAAW,EACX,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGjG,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,sBAAsB,EACtB,0BAA0B,EAC1B,kCAAkC,EAClC,8BAA8B,EAC9B,wBAAwB,EACxB,4BAA4B,EAC5B,gCAAgC,GACjC,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAG1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAG1F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAG/F,OAAO,EACL,QAAQ,EACR,aAAa,EACb,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth module barrel export.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports all public APIs from the auth module for convenient importing.
|
|
5
|
+
* Consumers should import from this barrel rather than reaching into
|
|
6
|
+
* individual files (respects module boundary convention).
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* import { generateToken, hashToken, generateCsrfToken } from './auth/index.js';
|
|
10
|
+
*/
|
|
11
|
+
// Token generation and hashing
|
|
12
|
+
export { generateToken, hashToken } from './tokens.js';
|
|
13
|
+
// Token repository (PostgreSQL CRUD for all 3 token tables)
|
|
14
|
+
export { insertToken, insertInvitationToken, findValidToken, findValidInvitationToken, markTokenUsed, deleteExpiredTokens, invalidateUserTokens, } from './token-repository.js';
|
|
15
|
+
// CSRF protection
|
|
16
|
+
export { generateCsrfToken, verifyCsrfToken, setCsrfCookie, getCsrfFromCookie } from './csrf.js';
|
|
17
|
+
// Rate limiting
|
|
18
|
+
export { checkRateLimit, checkRateLimitStrict, resetRateLimit, buildLoginRateLimitKey, buildMagicLinkRateLimitKey, buildMagicLinkCallbackRateLimitKey, buildPasswordResetRateLimitKey, loadLoginRateLimitConfig, loadMagicLinkRateLimitConfig, loadPasswordResetRateLimitConfig, } from './rate-limiter.js';
|
|
19
|
+
// Email transport
|
|
20
|
+
export { createSmtpTransport } from './email-transport.js';
|
|
21
|
+
// Email renderer
|
|
22
|
+
export { renderEmail } from './email-renderer.js';
|
|
23
|
+
// Email service
|
|
24
|
+
export { sendMagicLinkEmail, sendPasswordResetEmail, sendInvitationEmail, renderInvitationEmail, sendWelcomeEmail, sendPasswordChangedEmail, setEmailTransport, } from './email-service.js';
|
|
25
|
+
// i18n
|
|
26
|
+
export { initI18n, resolveLocale, getTranslationFunction, registerHandlebarsI18nHelper, } from './i18n.js';
|
|
27
|
+
// Template engine
|
|
28
|
+
export { initTemplateEngine, renderPage } from './template-engine.js';
|
|
29
|
+
// Magic link session (cross-browser flow)
|
|
30
|
+
export { createMagicLinkSession, consumeMagicLinkSession, hasMagicLinkSession, clearMagicLinkSessionCookie, } from './magic-link-session.js';
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,+BAA+B;AAC/B,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGvD,4DAA4D;AAC5D,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,cAAc,EACd,wBAAwB,EACxB,aAAa,EACb,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAQ/B,kBAAkB;AAClB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEjG,gBAAgB;AAChB,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,sBAAsB,EACtB,0BAA0B,EAC1B,kCAAkC,EAClC,8BAA8B,EAC9B,wBAAwB,EACxB,4BAA4B,EAC5B,gCAAgC,GACjC,MAAM,mBAAmB,CAAC;AAG3B,kBAAkB;AAClB,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3D,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,gBAAgB;AAChB,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAG5B,OAAO;AACP,OAAO,EACL,QAAQ,EACR,aAAa,EACb,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,WAAW,CAAC;AAEnB,kBAAkB;AAClB,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGtE,0CAA0C;AAC1C,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC"}
|