@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,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI bootstrap — direct-DB execution mode for infrastructure commands.
|
|
3
|
+
*
|
|
4
|
+
* Provides `withBootstrap()` for commands that need direct database/Redis
|
|
5
|
+
* access (init, migrate, seed, health --direct, user 2fa --direct).
|
|
6
|
+
*
|
|
7
|
+
* These commands run before or without the HTTP server, so they connect
|
|
8
|
+
* directly to PostgreSQL + Redis. The HTTP-based admin commands have been
|
|
9
|
+
* extracted to the standalone `@portaidentity/cli` package.
|
|
10
|
+
*
|
|
11
|
+
* Uses dynamic imports so that the config module (which validates env vars
|
|
12
|
+
* at load time) isn't triggered until bootstrap() is called. This allows
|
|
13
|
+
* CLI flag overrides (--database-url, --redis-url) to set process.env
|
|
14
|
+
* BEFORE config parses, making the overrides effective.
|
|
15
|
+
*
|
|
16
|
+
* @module cli/bootstrap
|
|
17
|
+
*/
|
|
18
|
+
import 'dotenv/config';
|
|
19
|
+
/**
|
|
20
|
+
* Bootstrap the CLI environment: load dotenv, connect DB + Redis.
|
|
21
|
+
*
|
|
22
|
+
* CLI flags (--database-url, --redis-url) override env vars if provided.
|
|
23
|
+
* The overrides are applied to process.env BEFORE the config module loads,
|
|
24
|
+
* so they propagate through to connectDatabase() and connectRedis().
|
|
25
|
+
*
|
|
26
|
+
* @param argv - Parsed CLI global options from yargs
|
|
27
|
+
*/
|
|
28
|
+
export async function bootstrap(argv) {
|
|
29
|
+
// CLI is a run-and-exit tool — suppress infrastructure logs (Database connected,
|
|
30
|
+
// Redis connected, etc.) that clutter both table and JSON output.
|
|
31
|
+
// Use --verbose to opt in to full diagnostic logging for debugging.
|
|
32
|
+
// Uses 'fatal' (quietest valid level) since the config schema doesn't allow 'silent'.
|
|
33
|
+
if (!argv.verbose) {
|
|
34
|
+
process.env.LOG_LEVEL = 'fatal';
|
|
35
|
+
}
|
|
36
|
+
// Override env vars BEFORE config module loads (via dynamic imports below).
|
|
37
|
+
// This ensures the config schema parses the CLI-provided URLs instead of .env values.
|
|
38
|
+
if (argv['database-url']) {
|
|
39
|
+
process.env.DATABASE_URL = argv['database-url'];
|
|
40
|
+
}
|
|
41
|
+
if (argv['redis-url']) {
|
|
42
|
+
process.env.REDIS_URL = argv['redis-url'];
|
|
43
|
+
}
|
|
44
|
+
// Dynamic imports ensure config/index.ts loads AFTER env var overrides are set.
|
|
45
|
+
// Static imports would trigger config validation at module-load time, before
|
|
46
|
+
// yargs has parsed argv, making CLI flag overrides ineffective.
|
|
47
|
+
const { connectDatabase } = await import('../lib/database.js');
|
|
48
|
+
const { connectRedis } = await import('../lib/redis.js');
|
|
49
|
+
await connectDatabase();
|
|
50
|
+
await connectRedis();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Clean shutdown: disconnect Redis then DB.
|
|
54
|
+
*
|
|
55
|
+
* Redis is disconnected first because some operations may flush
|
|
56
|
+
* cache entries to the database during shutdown.
|
|
57
|
+
*/
|
|
58
|
+
export async function shutdown() {
|
|
59
|
+
const { disconnectRedis } = await import('../lib/redis.js');
|
|
60
|
+
const { disconnectDatabase } = await import('../lib/database.js');
|
|
61
|
+
await disconnectRedis();
|
|
62
|
+
await disconnectDatabase();
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Convenience wrapper: bootstrap → run command → shutdown.
|
|
66
|
+
*
|
|
67
|
+
* Ensures cleanup happens even if the command throws an error.
|
|
68
|
+
* This is the recommended way for command handlers to use bootstrap:
|
|
69
|
+
*
|
|
70
|
+
* ```typescript
|
|
71
|
+
* await withBootstrap(argv, async () => {
|
|
72
|
+
* const orgs = await listOrganizations(pool);
|
|
73
|
+
* printTable(headers, rows);
|
|
74
|
+
* });
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* @param argv - Parsed CLI global options from yargs
|
|
78
|
+
* @param fn - The command handler function to execute
|
|
79
|
+
* @returns The return value of the command handler
|
|
80
|
+
*/
|
|
81
|
+
export async function withBootstrap(argv, fn) {
|
|
82
|
+
await bootstrap(argv);
|
|
83
|
+
try {
|
|
84
|
+
return await fn();
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
await shutdown();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/cli/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,eAAe,CAAC;AAGvB;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAmB;IACjD,iFAAiF;IACjF,kEAAkE;IAClE,oEAAoE;IACpE,sFAAsF;IACtF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC;IAClC,CAAC;IAED,4EAA4E;IAC5E,sFAAsF;IACtF,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5C,CAAC;IAED,gFAAgF;IAChF,6EAA6E;IAC7E,gEAAgE;IAChE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC/D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEzD,MAAM,eAAe,EAAE,CAAC;IACxB,MAAM,YAAY,EAAE,CAAC;AACvB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC5D,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAElE,MAAM,eAAe,EAAE,CAAC;IACxB,MAAM,kBAAkB,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAmB,EACnB,EAAoB;IAEpB,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,MAAM,QAAQ,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI health check command — direct-DB mode only.
|
|
3
|
+
*
|
|
4
|
+
* Tests database and Redis connectivity directly by connecting
|
|
5
|
+
* to PostgreSQL and Redis via the bootstrap module.
|
|
6
|
+
*
|
|
7
|
+
* HTTP-based health checks are available in the standalone
|
|
8
|
+
* `@portaidentity/cli` package.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* porta health check # Table output with ✅/❌ per service
|
|
12
|
+
* porta health check --json # JSON output: { database: "ok"|"error", redis: "ok"|"error" }
|
|
13
|
+
*
|
|
14
|
+
* @module cli/commands/health
|
|
15
|
+
*/
|
|
16
|
+
import type { CommandModule } from 'yargs';
|
|
17
|
+
import type { GlobalOptions } from '../index.js';
|
|
18
|
+
/** The health command module — registered at the top level of the CLI */
|
|
19
|
+
export declare const healthCommand: CommandModule<GlobalOptions, GlobalOptions>;
|
|
20
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/health.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAwCjD,yEAAyE;AACzE,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,aAAa,EAAE,aAAa,CA0CrE,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI health check command — direct-DB mode only.
|
|
3
|
+
*
|
|
4
|
+
* Tests database and Redis connectivity directly by connecting
|
|
5
|
+
* to PostgreSQL and Redis via the bootstrap module.
|
|
6
|
+
*
|
|
7
|
+
* HTTP-based health checks are available in the standalone
|
|
8
|
+
* `@portaidentity/cli` package.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* porta health check # Table output with ✅/❌ per service
|
|
12
|
+
* porta health check --json # JSON output: { database: "ok"|"error", redis: "ok"|"error" }
|
|
13
|
+
*
|
|
14
|
+
* @module cli/commands/health
|
|
15
|
+
*/
|
|
16
|
+
import { withBootstrap } from '../bootstrap.js';
|
|
17
|
+
import { withErrorHandling } from '../error-handler.js';
|
|
18
|
+
import { printTable, success, error as errorMsg, outputResult } from '../output.js';
|
|
19
|
+
/**
|
|
20
|
+
* Check database connectivity directly.
|
|
21
|
+
*/
|
|
22
|
+
async function checkDatabase() {
|
|
23
|
+
try {
|
|
24
|
+
const { getPool } = await import('../../lib/database.js');
|
|
25
|
+
await getPool().query('SELECT 1');
|
|
26
|
+
return { service: 'database', status: 'ok' };
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
30
|
+
return { service: 'database', status: 'error', message };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check Redis connectivity directly.
|
|
35
|
+
*/
|
|
36
|
+
async function checkRedis() {
|
|
37
|
+
try {
|
|
38
|
+
const { getRedis } = await import('../../lib/redis.js');
|
|
39
|
+
await getRedis().ping();
|
|
40
|
+
return { service: 'redis', status: 'ok' };
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
44
|
+
return { service: 'redis', status: 'error', message };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** The health command module — registered at the top level of the CLI */
|
|
48
|
+
export const healthCommand = {
|
|
49
|
+
command: 'health',
|
|
50
|
+
describe: 'Check system health (direct DB + Redis)',
|
|
51
|
+
builder: (yargs) => {
|
|
52
|
+
return yargs.command('check', 'Test database and Redis connectivity', (y) => y, async (argv) => {
|
|
53
|
+
const args = argv;
|
|
54
|
+
await withErrorHandling(async () => {
|
|
55
|
+
let results = [];
|
|
56
|
+
await withBootstrap(args, async () => {
|
|
57
|
+
results = await Promise.all([checkDatabase(), checkRedis()]);
|
|
58
|
+
});
|
|
59
|
+
outputResult(args.json, () => {
|
|
60
|
+
const rows = results.map((r) => [
|
|
61
|
+
r.service,
|
|
62
|
+
r.status === 'ok' ? '✅ ok' : `❌ ${r.message ?? 'error'}`,
|
|
63
|
+
]);
|
|
64
|
+
printTable(['Service', 'Status'], rows);
|
|
65
|
+
const allOk = results.every((r) => r.status === 'ok');
|
|
66
|
+
if (allOk) {
|
|
67
|
+
success('All services healthy');
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
errorMsg('Some services are unhealthy');
|
|
71
|
+
}
|
|
72
|
+
}, Object.fromEntries(results.map((r) => [r.service, r.status])));
|
|
73
|
+
}, args.verbose);
|
|
74
|
+
}).demandCommand(1, 'Specify a health subcommand: check');
|
|
75
|
+
},
|
|
76
|
+
handler: () => {
|
|
77
|
+
// No-op — subcommands handle execution
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/cli/commands/health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI init command — bootstrap Porta admin infrastructure.
|
|
3
|
+
*
|
|
4
|
+
* Solves the chicken-and-egg problem: you need an OIDC client to authenticate
|
|
5
|
+
* the CLI, but you need the CLI to create clients. `porta init` is a one-time,
|
|
6
|
+
* direct-DB bootstrap command that creates everything needed for subsequent
|
|
7
|
+
* OIDC-based authentication.
|
|
8
|
+
*
|
|
9
|
+
* Created entities:
|
|
10
|
+
* 1. "Porta Admin" application (slug: porta-admin)
|
|
11
|
+
* 2. Granular admin permissions (42 resource:action permissions)
|
|
12
|
+
* 3. Five admin roles with permission sets (super-admin, org-admin, etc.)
|
|
13
|
+
* 4. "Porta Admin CLI" public client (Auth Code + PKCE)
|
|
14
|
+
* 5. First admin user (interactive prompts or flags)
|
|
15
|
+
* 7. Super-admin role assigned to the user
|
|
16
|
+
* 8. Super-admin user ID stored in system_config
|
|
17
|
+
*
|
|
18
|
+
* Prerequisites:
|
|
19
|
+
* - Database migrations have been run (`porta migrate up`)
|
|
20
|
+
* - Super-admin organization exists (created by migration 011_seed.sql)
|
|
21
|
+
*
|
|
22
|
+
* Usage:
|
|
23
|
+
* porta init # Interactive — prompts for user details
|
|
24
|
+
* porta init --email admin@example.com # Non-interactive with flags
|
|
25
|
+
* --given-name Admin --family-name User --password 'Secret123!'
|
|
26
|
+
* porta init --force # Skip "already initialized" check
|
|
27
|
+
*
|
|
28
|
+
* @module cli/commands/init
|
|
29
|
+
*/
|
|
30
|
+
import type { CommandModule } from 'yargs';
|
|
31
|
+
import type { GlobalOptions } from '../index.js';
|
|
32
|
+
/** Options specific to the init command (extends global CLI options) */
|
|
33
|
+
interface InitOptions extends GlobalOptions {
|
|
34
|
+
email?: string;
|
|
35
|
+
'given-name'?: string;
|
|
36
|
+
'family-name'?: string;
|
|
37
|
+
password?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The init command module — registered at the top level of the CLI.
|
|
41
|
+
*
|
|
42
|
+
* Bootstraps all admin infrastructure entities in a single direct-DB
|
|
43
|
+
* operation. This is the only way to create the initial admin setup
|
|
44
|
+
* since the admin API requires authentication that doesn't exist yet.
|
|
45
|
+
*/
|
|
46
|
+
export declare const initCommand: CommandModule<GlobalOptions, InitOptions>;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAgBjD,wEAAwE;AACxE,UAAU,WAAY,SAAQ,aAAa;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA8JD;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,aAAa,CAAC,aAAa,EAAE,WAAW,CA4QjE,CAAC"}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI init command — bootstrap Porta admin infrastructure.
|
|
3
|
+
*
|
|
4
|
+
* Solves the chicken-and-egg problem: you need an OIDC client to authenticate
|
|
5
|
+
* the CLI, but you need the CLI to create clients. `porta init` is a one-time,
|
|
6
|
+
* direct-DB bootstrap command that creates everything needed for subsequent
|
|
7
|
+
* OIDC-based authentication.
|
|
8
|
+
*
|
|
9
|
+
* Created entities:
|
|
10
|
+
* 1. "Porta Admin" application (slug: porta-admin)
|
|
11
|
+
* 2. Granular admin permissions (42 resource:action permissions)
|
|
12
|
+
* 3. Five admin roles with permission sets (super-admin, org-admin, etc.)
|
|
13
|
+
* 4. "Porta Admin CLI" public client (Auth Code + PKCE)
|
|
14
|
+
* 5. First admin user (interactive prompts or flags)
|
|
15
|
+
* 7. Super-admin role assigned to the user
|
|
16
|
+
* 8. Super-admin user ID stored in system_config
|
|
17
|
+
*
|
|
18
|
+
* Prerequisites:
|
|
19
|
+
* - Database migrations have been run (`porta migrate up`)
|
|
20
|
+
* - Super-admin organization exists (created by migration 011_seed.sql)
|
|
21
|
+
*
|
|
22
|
+
* Usage:
|
|
23
|
+
* porta init # Interactive — prompts for user details
|
|
24
|
+
* porta init --email admin@example.com # Non-interactive with flags
|
|
25
|
+
* --given-name Admin --family-name User --password 'Secret123!'
|
|
26
|
+
* porta init --force # Skip "already initialized" check
|
|
27
|
+
*
|
|
28
|
+
* @module cli/commands/init
|
|
29
|
+
*/
|
|
30
|
+
import { withBootstrap } from '../bootstrap.js';
|
|
31
|
+
import { withErrorHandling } from '../error-handler.js';
|
|
32
|
+
import { success, warn } from '../output.js';
|
|
33
|
+
import { confirm, promptInput, promptPassword } from '../prompt.js';
|
|
34
|
+
import { ALL_ADMIN_PERMISSIONS, ADMIN_ROLE_DEFINITIONS, ALL_ADMIN_ROLES, } from '../../lib/admin-permissions.js';
|
|
35
|
+
import { SUPER_ADMIN_USER_ID_KEY } from '../../lib/super-admin-protection.js';
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Helpers
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
/**
|
|
40
|
+
* Build a human-readable permission name from a resource:action slug.
|
|
41
|
+
* Capitalizes the resource and action parts for display.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* buildPermissionName('org:create') → 'Organization Create'
|
|
45
|
+
* buildPermissionName('session:revoke') → 'Session Revoke'
|
|
46
|
+
*
|
|
47
|
+
* @param slug - Permission slug in resource:action format
|
|
48
|
+
* @returns Human-readable permission name
|
|
49
|
+
*/
|
|
50
|
+
function buildPermissionName(slug) {
|
|
51
|
+
const [resource, action] = slug.split(':');
|
|
52
|
+
const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
|
|
53
|
+
return `${capitalize(resource)} ${capitalize(action)}`;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Build a description for a permission from its slug.
|
|
57
|
+
*
|
|
58
|
+
* @param slug - Permission slug in resource:action format
|
|
59
|
+
* @returns Permission description
|
|
60
|
+
*/
|
|
61
|
+
function buildPermissionDescription(slug) {
|
|
62
|
+
const [resource, action] = slug.split(':');
|
|
63
|
+
return `Permission to ${action} ${resource} resources`;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Pad a string to a fixed width for aligned box output.
|
|
67
|
+
* Truncates with ellipsis if the string exceeds the target length.
|
|
68
|
+
*
|
|
69
|
+
* @param str - The string to pad
|
|
70
|
+
* @param length - Target width in characters
|
|
71
|
+
* @returns Padded or truncated string
|
|
72
|
+
*/
|
|
73
|
+
function padRight(str, length) {
|
|
74
|
+
if (str.length > length) {
|
|
75
|
+
return str.substring(0, length - 1) + '…';
|
|
76
|
+
}
|
|
77
|
+
return str + ' '.repeat(length - str.length);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Collect admin user details from interactive prompts or CLI flags.
|
|
81
|
+
*
|
|
82
|
+
* When all four flags (--email, --given-name, --family-name, --password)
|
|
83
|
+
* are provided, prompts are skipped entirely (non-interactive mode).
|
|
84
|
+
* Otherwise, missing fields are collected via interactive prompts.
|
|
85
|
+
* Password input uses hidden echo for security.
|
|
86
|
+
*
|
|
87
|
+
* @param argv - Parsed CLI options
|
|
88
|
+
* @returns Object with email, givenName, familyName, password
|
|
89
|
+
* @throws Error if required fields are empty or passwords don't match
|
|
90
|
+
*/
|
|
91
|
+
async function collectAdminUserDetails(argv) {
|
|
92
|
+
// Collect each field from flags or prompts
|
|
93
|
+
const email = argv.email ?? (await promptInput('Admin email: '));
|
|
94
|
+
const givenName = argv['given-name'] ?? (await promptInput('First name: '));
|
|
95
|
+
const familyName = argv['family-name'] ?? (await promptInput('Last name: '));
|
|
96
|
+
let password;
|
|
97
|
+
if (argv.password) {
|
|
98
|
+
// Password provided via flag — use directly (non-interactive mode)
|
|
99
|
+
password = argv.password;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// Interactive password entry with confirmation
|
|
103
|
+
password = await promptPassword('Password: ');
|
|
104
|
+
const confirmPw = await promptPassword('Confirm password: ');
|
|
105
|
+
if (password !== confirmPw) {
|
|
106
|
+
throw new Error('Passwords do not match');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Validate all required fields are present
|
|
110
|
+
if (!email || !givenName || !familyName || !password) {
|
|
111
|
+
throw new Error('All fields are required: email, given-name, family-name, password');
|
|
112
|
+
}
|
|
113
|
+
return { email, givenName, familyName, password };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Print the success summary box after initialization completes.
|
|
117
|
+
*
|
|
118
|
+
* Displays all created entities and next-step instructions in an
|
|
119
|
+
* aligned bordered box format.
|
|
120
|
+
*/
|
|
121
|
+
function printSuccessBox(orgName, orgSlug, appSlug, cliClientId, adminEmail, roleSlug, roleCount, permissionCount) {
|
|
122
|
+
const w = 43; // Content width inside the box
|
|
123
|
+
console.log('');
|
|
124
|
+
console.log('╔══════════════════════════════════════════════════════════════╗');
|
|
125
|
+
console.log('║ Porta Initialized ║');
|
|
126
|
+
console.log('╠══════════════════════════════════════════════════════════════╣');
|
|
127
|
+
console.log(`║ Organization: ${padRight(`${orgName} (${orgSlug})`, w)}║`);
|
|
128
|
+
console.log(`║ Application: ${padRight(`Porta Admin (${appSlug})`, w)}║`);
|
|
129
|
+
console.log(`║ Client ID: ${padRight(cliClientId, w)}║`);
|
|
130
|
+
console.log(`║ Admin User: ${padRight(adminEmail, w)}║`);
|
|
131
|
+
console.log(`║ Admin Role: ${padRight(`${roleSlug} (${permissionCount} permissions)`, w)}║`);
|
|
132
|
+
console.log(`║ Admin Roles: ${padRight(`${roleCount} roles seeded`, w)}║`);
|
|
133
|
+
console.log('╠══════════════════════════════════════════════════════════════╣');
|
|
134
|
+
console.log('║ Next steps: ║');
|
|
135
|
+
console.log('║ 1. Start the server: yarn dev ║');
|
|
136
|
+
console.log('║ 2. Authenticate: porta login ║');
|
|
137
|
+
console.log('║ 3. Launch admin GUI: porta gui ║');
|
|
138
|
+
console.log('╚══════════════════════════════════════════════════════════════╝');
|
|
139
|
+
}
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
// Command definition
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
/**
|
|
144
|
+
* The init command module — registered at the top level of the CLI.
|
|
145
|
+
*
|
|
146
|
+
* Bootstraps all admin infrastructure entities in a single direct-DB
|
|
147
|
+
* operation. This is the only way to create the initial admin setup
|
|
148
|
+
* since the admin API requires authentication that doesn't exist yet.
|
|
149
|
+
*/
|
|
150
|
+
export const initCommand = {
|
|
151
|
+
command: 'init',
|
|
152
|
+
describe: 'Initialize Porta — create admin application, client, and first admin user',
|
|
153
|
+
builder: (yargs) => yargs
|
|
154
|
+
.option('email', {
|
|
155
|
+
type: 'string',
|
|
156
|
+
describe: 'Admin user email address',
|
|
157
|
+
})
|
|
158
|
+
.option('given-name', {
|
|
159
|
+
type: 'string',
|
|
160
|
+
describe: 'Admin user first name',
|
|
161
|
+
})
|
|
162
|
+
.option('family-name', {
|
|
163
|
+
type: 'string',
|
|
164
|
+
describe: 'Admin user last name',
|
|
165
|
+
})
|
|
166
|
+
.option('password', {
|
|
167
|
+
type: 'string',
|
|
168
|
+
describe: 'Admin user password (must meet NIST SP 800-63B requirements)',
|
|
169
|
+
}),
|
|
170
|
+
handler: async (argv) => {
|
|
171
|
+
await withErrorHandling(async () => {
|
|
172
|
+
await withBootstrap(argv, async () => {
|
|
173
|
+
// Dynamic imports — loaded after bootstrap connects DB + Redis.
|
|
174
|
+
// This ensures config is parsed with any CLI flag overrides.
|
|
175
|
+
const { findSuperAdminOrganization } = await import('../../organizations/repository.js');
|
|
176
|
+
const { getApplicationBySlug, createApplication } = await import('../../applications/index.js');
|
|
177
|
+
const { createClient } = await import('../../clients/index.js');
|
|
178
|
+
const { createUser, reactivateUser, markEmailVerified, } = await import('../../users/index.js');
|
|
179
|
+
const { createRole, createPermission, assignPermissionsToRole, assignRolesToUser, } = await import('../../rbac/index.js');
|
|
180
|
+
const { ensureSigningKeys } = await import('../../lib/signing-keys.js');
|
|
181
|
+
const { getPool } = await import('../../lib/database.js');
|
|
182
|
+
console.log('Initializing Porta...\n');
|
|
183
|
+
// -----------------------------------------------------------------
|
|
184
|
+
// Step 1: Verify super-admin org exists (created by migration seed)
|
|
185
|
+
// -----------------------------------------------------------------
|
|
186
|
+
const superAdminOrg = await findSuperAdminOrganization();
|
|
187
|
+
if (!superAdminOrg) {
|
|
188
|
+
throw new Error('Super-admin organization not found. Run "porta migrate up" first.');
|
|
189
|
+
}
|
|
190
|
+
// -----------------------------------------------------------------
|
|
191
|
+
// Step 2: Safety guard — refuse if already initialized
|
|
192
|
+
// -----------------------------------------------------------------
|
|
193
|
+
const existingApp = await getApplicationBySlug('porta-admin');
|
|
194
|
+
if (existingApp && !argv.force) {
|
|
195
|
+
throw new Error('System already initialized. Use --force to re-initialize.');
|
|
196
|
+
}
|
|
197
|
+
if (existingApp && argv.force) {
|
|
198
|
+
// Re-initialization with --force: confirm the destructive action.
|
|
199
|
+
// Full re-init (drop + recreate) is not yet supported — advise
|
|
200
|
+
// the user to reset the database instead.
|
|
201
|
+
const confirmed = await confirm('Re-initialization is not yet supported. Reset the database and re-run migrations instead. Cancel?', false);
|
|
202
|
+
if (confirmed) {
|
|
203
|
+
warn('Init cancelled — reset the database first.');
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
warn('Init cancelled.');
|
|
207
|
+
}
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
// -----------------------------------------------------------------
|
|
211
|
+
// Step 3: Ensure signing keys exist in the database
|
|
212
|
+
// -----------------------------------------------------------------
|
|
213
|
+
await ensureSigningKeys();
|
|
214
|
+
console.log(' ✅ Signing keys verified');
|
|
215
|
+
// -----------------------------------------------------------------
|
|
216
|
+
// Step 4: Create the admin application
|
|
217
|
+
// -----------------------------------------------------------------
|
|
218
|
+
const adminApp = await createApplication({
|
|
219
|
+
name: 'Porta Admin',
|
|
220
|
+
slug: 'porta-admin',
|
|
221
|
+
description: 'Porta administration application — manages the admin API and CLI authentication',
|
|
222
|
+
});
|
|
223
|
+
console.log(` ✅ Application created: ${adminApp.name} (${adminApp.slug})`);
|
|
224
|
+
// -----------------------------------------------------------------
|
|
225
|
+
// Step 5: Create granular admin permissions (resource:action format)
|
|
226
|
+
// -----------------------------------------------------------------
|
|
227
|
+
// Each permission maps to a specific admin API operation.
|
|
228
|
+
// Permission slugs come from the centralized admin-permissions module.
|
|
229
|
+
const permissionIdMap = new Map(); // slug → permission ID
|
|
230
|
+
for (const permSlug of ALL_ADMIN_PERMISSIONS) {
|
|
231
|
+
const permission = await createPermission({
|
|
232
|
+
applicationId: adminApp.id,
|
|
233
|
+
slug: permSlug,
|
|
234
|
+
name: buildPermissionName(permSlug),
|
|
235
|
+
description: buildPermissionDescription(permSlug),
|
|
236
|
+
});
|
|
237
|
+
permissionIdMap.set(permSlug, permission.id);
|
|
238
|
+
}
|
|
239
|
+
console.log(` ✅ ${permissionIdMap.size} granular permissions created`);
|
|
240
|
+
// -----------------------------------------------------------------
|
|
241
|
+
// Step 6: Create all 5 admin roles and assign permissions
|
|
242
|
+
// -----------------------------------------------------------------
|
|
243
|
+
// Each role gets a specific set of permissions as defined in
|
|
244
|
+
// ADMIN_ROLE_DEFINITIONS. The super-admin role gets all permissions.
|
|
245
|
+
const createdRoles = new Map(); // slug → role ID
|
|
246
|
+
for (const roleDef of ALL_ADMIN_ROLES) {
|
|
247
|
+
const role = await createRole({
|
|
248
|
+
applicationId: adminApp.id,
|
|
249
|
+
name: roleDef.name,
|
|
250
|
+
slug: roleDef.slug,
|
|
251
|
+
description: roleDef.description,
|
|
252
|
+
});
|
|
253
|
+
createdRoles.set(roleDef.slug, role.id);
|
|
254
|
+
// Resolve permission IDs for this role's permission set
|
|
255
|
+
const rolePermissionIds = roleDef.permissions
|
|
256
|
+
.map((permSlug) => permissionIdMap.get(permSlug))
|
|
257
|
+
.filter((id) => id !== undefined);
|
|
258
|
+
if (rolePermissionIds.length > 0) {
|
|
259
|
+
await assignPermissionsToRole(role.id, rolePermissionIds);
|
|
260
|
+
}
|
|
261
|
+
console.log(` ✅ Role: ${role.name} (${role.slug}) — ${rolePermissionIds.length} permissions`);
|
|
262
|
+
}
|
|
263
|
+
// -----------------------------------------------------------------
|
|
264
|
+
// Step 7: Create the admin CLI client (public, Auth Code + PKCE)
|
|
265
|
+
// -----------------------------------------------------------------
|
|
266
|
+
// The client is public (no secret) because CLI tools cannot safely
|
|
267
|
+
// store secrets. PKCE provides security for the authorization code
|
|
268
|
+
// exchange. The redirect URIs use loopback addresses — per RFC 8252
|
|
269
|
+
// §7.3, node-oidc-provider allows flexible port matching for native
|
|
270
|
+
// app clients using loopback redirect URIs.
|
|
271
|
+
const { client: adminClient } = await createClient({
|
|
272
|
+
organizationId: superAdminOrg.id,
|
|
273
|
+
applicationId: adminApp.id,
|
|
274
|
+
clientName: 'Porta Admin CLI',
|
|
275
|
+
clientType: 'public',
|
|
276
|
+
applicationType: 'native',
|
|
277
|
+
redirectUris: [
|
|
278
|
+
'http://127.0.0.1/callback',
|
|
279
|
+
'http://localhost/callback',
|
|
280
|
+
'http://127.0.0.1/auth/callback',
|
|
281
|
+
],
|
|
282
|
+
postLogoutRedirectUris: [
|
|
283
|
+
'http://127.0.0.1',
|
|
284
|
+
],
|
|
285
|
+
grantTypes: ['authorization_code', 'refresh_token'],
|
|
286
|
+
scope: 'openid profile email offline_access',
|
|
287
|
+
requirePkce: true,
|
|
288
|
+
});
|
|
289
|
+
console.log(` ✅ Client created: ${adminClient.clientName} (${adminClient.clientId})`);
|
|
290
|
+
// -----------------------------------------------------------------
|
|
291
|
+
// Step 8: Collect admin user details (interactive or from flags)
|
|
292
|
+
// -----------------------------------------------------------------
|
|
293
|
+
const userDetails = await collectAdminUserDetails(argv);
|
|
294
|
+
// -----------------------------------------------------------------
|
|
295
|
+
// Step 9: Create the admin user in the super-admin organization
|
|
296
|
+
// -----------------------------------------------------------------
|
|
297
|
+
const adminUser = await createUser({
|
|
298
|
+
organizationId: superAdminOrg.id,
|
|
299
|
+
email: userDetails.email,
|
|
300
|
+
givenName: userDetails.givenName,
|
|
301
|
+
familyName: userDetails.familyName,
|
|
302
|
+
password: userDetails.password,
|
|
303
|
+
});
|
|
304
|
+
console.log(` ✅ User created: ${adminUser.email}`);
|
|
305
|
+
// -----------------------------------------------------------------
|
|
306
|
+
// Step 10: Activate user (if not already active)
|
|
307
|
+
// -----------------------------------------------------------------
|
|
308
|
+
if (adminUser.status !== 'active') {
|
|
309
|
+
await reactivateUser(adminUser.id);
|
|
310
|
+
}
|
|
311
|
+
console.log(' ✅ User activated');
|
|
312
|
+
// -----------------------------------------------------------------
|
|
313
|
+
// Step 11: Mark email as verified (admin doesn't need email flow)
|
|
314
|
+
// -----------------------------------------------------------------
|
|
315
|
+
await markEmailVerified(adminUser.id);
|
|
316
|
+
console.log(' ✅ Email marked as verified');
|
|
317
|
+
// -----------------------------------------------------------------
|
|
318
|
+
// Step 12: Assign super-admin role to the new user
|
|
319
|
+
// -----------------------------------------------------------------
|
|
320
|
+
const superAdminRoleId = createdRoles.get(ADMIN_ROLE_DEFINITIONS.SUPER_ADMIN.slug);
|
|
321
|
+
if (!superAdminRoleId) {
|
|
322
|
+
throw new Error('Super-admin role was not created — init is broken');
|
|
323
|
+
}
|
|
324
|
+
await assignRolesToUser(adminUser.id, [superAdminRoleId]);
|
|
325
|
+
console.log(` ✅ Role "${ADMIN_ROLE_DEFINITIONS.SUPER_ADMIN.slug}" assigned to user`);
|
|
326
|
+
// -----------------------------------------------------------------
|
|
327
|
+
// Step 13: Store super-admin user ID in system_config
|
|
328
|
+
// -----------------------------------------------------------------
|
|
329
|
+
// This enables the super-admin protection module to identify
|
|
330
|
+
// the bootstrap user and prevent destructive operations on them.
|
|
331
|
+
const pool = getPool();
|
|
332
|
+
await pool.query(`INSERT INTO system_config (key, value, value_type, description, is_sensitive)
|
|
333
|
+
VALUES ($1, to_jsonb($2::text), 'string', $3, FALSE)
|
|
334
|
+
ON CONFLICT (key) DO UPDATE SET value = to_jsonb($2::text), updated_at = NOW()`, [
|
|
335
|
+
SUPER_ADMIN_USER_ID_KEY,
|
|
336
|
+
adminUser.id,
|
|
337
|
+
'User ID of the super-admin user created during porta init',
|
|
338
|
+
]);
|
|
339
|
+
console.log(' ✅ Super-admin user ID stored in system config');
|
|
340
|
+
// -----------------------------------------------------------------
|
|
341
|
+
// Step 14: Print the success summary
|
|
342
|
+
// -----------------------------------------------------------------
|
|
343
|
+
printSuccessBox(superAdminOrg.name, superAdminOrg.slug, adminApp.slug, adminClient.clientId, userDetails.email, ADMIN_ROLE_DEFINITIONS.SUPER_ADMIN.slug, createdRoles.size, permissionIdMap.size);
|
|
344
|
+
success('Porta initialization complete!');
|
|
345
|
+
});
|
|
346
|
+
}, argv.verbose);
|
|
347
|
+
},
|
|
348
|
+
};
|
|
349
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI migration commands.
|
|
3
|
+
*
|
|
4
|
+
* Manages database schema migrations using the existing migrator module
|
|
5
|
+
* (node-pg-migrate). Provides up, down, and status subcommands.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* porta migrate up # Apply all pending migrations
|
|
9
|
+
* porta migrate down # Rollback last migration
|
|
10
|
+
* porta migrate down --count 3 # Rollback last 3 migrations
|
|
11
|
+
* porta migrate status # Show migration status
|
|
12
|
+
*
|
|
13
|
+
* @module cli/commands/migrate
|
|
14
|
+
*/
|
|
15
|
+
import type { CommandModule } from 'yargs';
|
|
16
|
+
import type { GlobalOptions } from '../index.js';
|
|
17
|
+
/** The migrate command module — registered at the top level of the CLI */
|
|
18
|
+
export declare const migrateCommand: CommandModule<GlobalOptions, GlobalOptions>;
|
|
19
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAUjD,0EAA0E;AAC1E,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC,aAAa,EAAE,aAAa,CAkGtE,CAAC"}
|